2 Commits

Author SHA1 Message Date
Xuu
031fe1ac5e initial work on openpgp key 2020-10-17 10:32:03 -06:00
Xuu
df040b2004 change to index handling and initial markdown support 2020-10-01 11:30:29 -06:00
6 changed files with 158 additions and 8 deletions

View File

@@ -30,7 +30,7 @@ fmt:
test: $(ROUTE_ASSET) $(DOCS_ASSET)
go test ./...
go vet ./...
run: $(BINARY)
run:
go run \
-ldflags "-X main.AppVersion=$(VERSION_PAT) -X main.AppBuild=$(DATE)" \
$(PKG) -vv serve

4
debian/Makefile vendored
View File

@@ -25,8 +25,8 @@ build:
export BUILD="BUILD/$(NAME)_$(VERSION)"; \
env GOOS=linux GOARCH=amd64 go build -v -o $${BUILD}/opt/sour.is/bin/paste \
-ldflags "-X main.AppVersion=$(VERSION) -X main.AppBuild=$(DATE)"\
sour.is/x/paste/cmd/paste; \
dpkg -b $${BUILD};
sour.is/x/paste/cmd/paste && \
dpkg -b $${BUILD}
copy:
export BUILD="BUILD/$(NAME)_$(VERSION)"; \

3
go.mod
View File

@@ -9,11 +9,14 @@ require (
github.com/docopt/docopt.go v0.0.0-20180111231733-ee0de3bc6815
github.com/go-swagger/go-swagger v0.25.0
github.com/golang/gddo v0.0.0-20200831202555-721e228c7686 // indirect
github.com/gomarkdown/markdown v0.0.0-20200824053859-8c8b3816f167
github.com/gorilla/mux v1.8.0
github.com/h2non/filetype v1.1.0
github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96
github.com/sour-is/crypto v0.0.0-20201016232853-f42a24ba5a81
github.com/sour-is/go-assetfs v1.0.0
github.com/spf13/viper v1.7.1
github.com/tv42/zbase32 v0.0.0-20190604154422-aacc64a8f915
github.com/vektah/dataloaden v0.3.0
go.etcd.io/bbolt v1.3.5 // indirect
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a

8
go.sum
View File

@@ -222,6 +222,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomarkdown/markdown v0.0.0-20200824053859-8c8b3816f167 h1:LP/6EfrZ/LyCc+SXvANDrIJ4sP9u2NAtqyv6QknetNQ=
github.com/gomarkdown/markdown v0.0.0-20200824053859-8c8b3816f167/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -433,6 +435,8 @@ github.com/smartystreets/goconvey v0.0.0-20170602164621-9e8dc3f972df/go.mod h1:X
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/sour-is/crypto v0.0.0-20201016232853-f42a24ba5a81 h1:7LadZJfye3tq1Dr5c46uy1ign6mQr2bAOlCJeAXpB1A=
github.com/sour-is/crypto v0.0.0-20201016232853-f42a24ba5a81/go.mod h1:7/Of5cnNodFyJ6PH2C3STkdCRvqbhj9yA3BhQ/E62wA=
github.com/sour-is/go-assetfs v1.0.0 h1:84Fd12qIAdZUOKjYIgsA1J27fcQF/JiSgiflz+2hqEA=
github.com/sour-is/go-assetfs v1.0.0/go.mod h1:y4ShXMTRymi5OMvwbtfT3sxcRE72sx1ycYymT46JbRE=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -482,6 +486,8 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=
github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=
github.com/tv42/zbase32 v0.0.0-20190604154422-aacc64a8f915 h1:vX9DBbEHmrebYnVthUTzMO6Zc1vvConJdD2s0uvXrfw=
github.com/tv42/zbase32 v0.0.0-20190604154422-aacc64a8f915/go.mod h1:Y5DJgF9Eou+hSWetC39Mns8E0PU7DykCLNWiYeOINrE=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
@@ -518,6 +524,7 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -531,6 +538,7 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg=
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=

View File

@@ -15,6 +15,10 @@ import (
"github.com/gorilla/mux"
"sour.is/x/toolbox/httpsrv"
"sour.is/x/toolbox/log"
"github.com/gomarkdown/markdown"
"github.com/gomarkdown/markdown/html"
"github.com/gomarkdown/markdown/parser"
)
func init() {
@@ -78,7 +82,7 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
f, err := os.Open(fname)
if err != nil {
log.Fatal(err)
log.Error(err)
}
defer f.Close()
@@ -107,7 +111,7 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
}
tr := tar.NewReader(rdr)
if path == "..." {
if path == "@" {
var paths []string
for {
hdr, err := tr.Next()
@@ -115,7 +119,7 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
break // End of archive
}
if err != nil {
log.Fatal(err)
log.Error(err)
}
paths = append(paths, hdr.Name)
}
@@ -130,9 +134,37 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
break // End of archive
}
if err != nil {
log.Fatal(err)
log.Error(err)
}
if path == "~" && hdr.Name == "index.html" {
path = hdr.Name
}
if path == "~" && hdr.Name == "index.md" {
path = hdr.Name
}
if hdr.Name == path {
if strings.HasSuffix(hdr.Name, ".md") {
md, err := ioutil.ReadAll(tr)
if err != nil {
httpsrv.WriteError(w, http.StatusInternalServerError, err.Error())
return
}
w.Header().Set("Content-Type", "text/html")
extensions := parser.CommonExtensions | parser.AutoHeadingIDs
p := parser.NewWithExtensions(extensions)
htmlFlags := html.CommonFlags | html.HrefTargetBlank
opts := html.RendererOptions{Flags: htmlFlags}
renderer := html.NewRenderer(opts)
b := markdown.ToHTML(md, p, renderer)
w.Write(b)
w.WriteHeader(http.StatusOK)
return
}
pr := NewPreviewReader(tr)
mime, err := ReadMIME(pr, hdr.Name)
@@ -143,7 +175,7 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", mime)
if _, err := io.Copy(w, pr.Drain()); err != nil {
log.Fatal(err)
log.Error(err)
}
w.WriteHeader(http.StatusOK)
return

View File

@@ -2,13 +2,21 @@ package routes
import (
"bytes"
"crypto/sha1"
"encoding/json"
"fmt"
"io"
"net/http"
"net/mail"
"net/url"
"regexp"
"strings"
"github.com/coreos/bbolt"
"github.com/gorilla/mux"
"github.com/sour-is/crypto/openpgp"
"github.com/tv42/zbase32"
"sour.is/x/toolbox/httpsrv"
"sour.is/x/toolbox/log"
"sour.is/x/toolbox/uuid"
@@ -21,6 +29,7 @@ func init() {
httpsrv.HttpRegister("short", httpsrv.HttpRoutes{
{Name: "getShort", Method: "GET", Pattern: "/s/{id}", HandlerFunc: s.getShort},
{Name: "putShort", Method: "PUT", Pattern: "/s/{id}", HandlerFunc: s.putShort},
{Name: "getIdentity", Method: "GET", Pattern: "/id/{id}", HandlerFunc: s.getIdentity},
})
}
@@ -190,3 +199,101 @@ func (s *shortDB) PutURL(id string, url *shortURL) {
log.Errorf("ShortURL: failed to write db at [%s]", s.path)
}
}
func (s *shortDB) getIdentity(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]
useArmored := false
addr := ""
if isFingerprint(id) {
addr = "https://keys.openpgp.org/vks/v1/by-fingerprint/" + strings.ToUpper(id)
useArmored = true
} else if email, err := mail.ParseAddress(id); err == nil {
addr = getWKDPubKeyAddr(email)
useArmored = false
} else {
httpsrv.WriteError(w, 400, err.Error())
return
}
resp, err := http.Get(addr)
if err != nil {
print(err)
}
defer resp.Body.Close()
if resp.Header.Get("Content-Type") == "application/pgp-keys" {
useArmored = true
}
log.Infos("getIdentity", "id", id, "useArmored", useArmored, "status", resp.Status, "addr", addr)
var lis openpgp.EntityList
if useArmored {
lis, err = openpgp.ReadArmoredKeyRing(resp.Body)
} else {
lis, err = openpgp.ReadKeyRing(resp.Body)
}
if err != nil {
fmt.Println(err)
httpsrv.WriteError(w, 400, "bad decode")
return
}
for _, entity := range lis {
entityString(w, entity)
}
}
func isFingerprint(s string) bool {
for _, r := range s {
switch r {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F':
default:
return false
}
}
return true
}
func entityString(out io.Writer, e *openpgp.Entity) {
if e == nil {
return
}
if e.Identities != nil {
fmt.Fprintln(out, "Identities:")
for name, identity := range e.Identities {
fmt.Fprintf(out, " %s:\n", name)
identityString(out, identity)
fmt.Fprintln(out)
}
}
}
func identityString(out io.Writer, i *openpgp.Identity) {
if i == nil || i.SelfSignature == nil {
return
}
fmt.Fprintf(out, "name: %s\n", i.Name)
for key, valueList := range i.SelfSignature.NotationData {
for _, value := range valueList {
fmt.Fprintln(out, " ", key, value)
}
}
}
func getWKDPubKeyAddr(email *mail.Address) string {
parts := strings.SplitN(email.Address, "@", 2)
hash := sha1.Sum([]byte(parts[0]))
lp := zbase32.EncodeToString(hash[:])
return fmt.Sprintf("https://%s/.well-known/openpgpkey/hu/%s", parts[1], lp)
}