Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
031fe1ac5e
|
|||
|
df040b2004
|
|||
|
9049ab043e
|
@@ -39,10 +39,10 @@ steps:
|
|||||||
- name: Build Release
|
- name: Build Release
|
||||||
commands:
|
commands:
|
||||||
- cd debian
|
- cd debian
|
||||||
|
- make tag
|
||||||
- make build
|
- make build
|
||||||
- make copy
|
- make copy
|
||||||
- make deploy
|
- make deploy
|
||||||
- make tag
|
|
||||||
trigger:
|
trigger:
|
||||||
event:
|
event:
|
||||||
- promote
|
- promote
|
||||||
|
|||||||
13
Makefile
13
Makefile
@@ -3,8 +3,12 @@ DOCS_ASSET=src/docs/bindata.go
|
|||||||
|
|
||||||
SOURCE=$(wildcard cmd/paste/*.go) $(filter-out src/routes/bindata.go, $(wildcard src/routes/*.go))
|
SOURCE=$(wildcard cmd/paste/*.go) $(filter-out src/routes/bindata.go, $(wildcard src/routes/*.go))
|
||||||
BINARY=paste
|
BINARY=paste
|
||||||
|
PKG=./cmd/paste
|
||||||
|
|
||||||
VERSION:=$(shell debian/inc_version.sh -p $(shell git describe --tags `git rev-list --tags --max-count=1`))
|
VERSION=$(shell git describe --tags `git rev-list --tags --max-count=1`|cut -b2-)
|
||||||
|
VERSION_PAT=$(shell debian/inc_version.sh -p $(VERSION))
|
||||||
|
VERSION_MIN=$(shell debian/inc_version.sh -m $(VERSION))
|
||||||
|
VERSION_MAJ=$(shell debian/inc_version.sh -M $(VERSION))
|
||||||
DATE:=$(shell date -u +%FT%TZ)
|
DATE:=$(shell date -u +%FT%TZ)
|
||||||
|
|
||||||
define DUMMY_BINDATA
|
define DUMMY_BINDATA
|
||||||
@@ -26,8 +30,10 @@ fmt:
|
|||||||
test: $(ROUTE_ASSET) $(DOCS_ASSET)
|
test: $(ROUTE_ASSET) $(DOCS_ASSET)
|
||||||
go test ./...
|
go test ./...
|
||||||
go vet ./...
|
go vet ./...
|
||||||
run: $(BINARY)
|
run:
|
||||||
./$(BINARY) -vv serve
|
go run \
|
||||||
|
-ldflags "-X main.AppVersion=$(VERSION_PAT) -X main.AppBuild=$(DATE)" \
|
||||||
|
$(PKG) -vv serve
|
||||||
|
|
||||||
$(BINARY): $(SOURCE) $(ROUTE_ASSET) $(DOCS_ASSET)
|
$(BINARY): $(SOURCE) $(ROUTE_ASSET) $(DOCS_ASSET)
|
||||||
go build -v \
|
go build -v \
|
||||||
@@ -48,6 +54,7 @@ $(DOCS_ASSET):
|
|||||||
echo "$$DUMMY_BINDATA" > src/docs/bindata.go
|
echo "$$DUMMY_BINDATA" > src/docs/bindata.go
|
||||||
go generate "sour.is/x/paste/cmd/paste"
|
go generate "sour.is/x/paste/cmd/paste"
|
||||||
go generate "sour.is/x/paste/src/docs"
|
go generate "sour.is/x/paste/src/docs"
|
||||||
|
|
||||||
deploy: $(SOURCE) $(ROUTE_ASSET)
|
deploy: $(SOURCE) $(ROUTE_ASSET)
|
||||||
cd debian && make
|
cd debian && make
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,8 @@ store = "data/artifact"
|
|||||||
[module.image]
|
[module.image]
|
||||||
store = "data/image"
|
store = "data/image"
|
||||||
|
|
||||||
|
[module.short]
|
||||||
|
store = "data/meta.db"
|
||||||
`
|
`
|
||||||
|
|
||||||
var args map[string]interface{}
|
var args map[string]interface{}
|
||||||
|
|||||||
4
debian/Makefile
vendored
4
debian/Makefile
vendored
@@ -25,8 +25,8 @@ build:
|
|||||||
export BUILD="BUILD/$(NAME)_$(VERSION)"; \
|
export BUILD="BUILD/$(NAME)_$(VERSION)"; \
|
||||||
env GOOS=linux GOARCH=amd64 go build -v -o $${BUILD}/opt/sour.is/bin/paste \
|
env GOOS=linux GOARCH=amd64 go build -v -o $${BUILD}/opt/sour.is/bin/paste \
|
||||||
-ldflags "-X main.AppVersion=$(VERSION) -X main.AppBuild=$(DATE)"\
|
-ldflags "-X main.AppVersion=$(VERSION) -X main.AppBuild=$(DATE)"\
|
||||||
sour.is/x/paste/cmd/paste; \
|
sour.is/x/paste/cmd/paste && \
|
||||||
dpkg -b $${BUILD};
|
dpkg -b $${BUILD}
|
||||||
|
|
||||||
copy:
|
copy:
|
||||||
export BUILD="BUILD/$(NAME)_$(VERSION)"; \
|
export BUILD="BUILD/$(NAME)_$(VERSION)"; \
|
||||||
|
|||||||
6
go.mod
6
go.mod
@@ -5,16 +5,20 @@ go 1.14
|
|||||||
require (
|
require (
|
||||||
github.com/99designs/gqlgen v0.12.2
|
github.com/99designs/gqlgen v0.12.2
|
||||||
github.com/andybalholm/brotli v1.0.0
|
github.com/andybalholm/brotli v1.0.0
|
||||||
|
github.com/coreos/bbolt v1.3.2
|
||||||
github.com/docopt/docopt.go v0.0.0-20180111231733-ee0de3bc6815
|
github.com/docopt/docopt.go v0.0.0-20180111231733-ee0de3bc6815
|
||||||
github.com/go-swagger/go-swagger v0.25.0
|
github.com/go-swagger/go-swagger v0.25.0
|
||||||
github.com/golang/gddo v0.0.0-20200831202555-721e228c7686 // indirect
|
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/gorilla/mux v1.8.0
|
||||||
github.com/h2non/filetype v1.1.0
|
github.com/h2non/filetype v1.1.0
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible
|
|
||||||
github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96
|
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/sour-is/go-assetfs v1.0.0
|
||||||
github.com/spf13/viper v1.7.1
|
github.com/spf13/viper v1.7.1
|
||||||
|
github.com/tv42/zbase32 v0.0.0-20190604154422-aacc64a8f915
|
||||||
github.com/vektah/dataloaden v0.3.0
|
github.com/vektah/dataloaden v0.3.0
|
||||||
|
go.etcd.io/bbolt v1.3.5 // indirect
|
||||||
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a
|
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a
|
||||||
sour.is/x/toolbox v0.12.17
|
sour.is/x/toolbox v0.12.17
|
||||||
)
|
)
|
||||||
|
|||||||
12
go.sum
12
go.sum
@@ -58,6 +58,7 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
|
|||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/cgilling/dbstats v0.0.0-20150427045024-c9db8cf218e6/go.mod h1:fsf3+k/VvGOE9sF2B9d6PBcZOzQIlDJhn2LhBqF/4VY=
|
github.com/cgilling/dbstats v0.0.0-20150427045024-c9db8cf218e6/go.mod h1:fsf3+k/VvGOE9sF2B9d6PBcZOzQIlDJhn2LhBqF/4VY=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
|
github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
@@ -221,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/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.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/golang/snappy v0.0.1/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 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/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
@@ -432,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 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
|
||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
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/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 h1:84Fd12qIAdZUOKjYIgsA1J27fcQF/JiSgiflz+2hqEA=
|
||||||
github.com/sour-is/go-assetfs v1.0.0/go.mod h1:y4ShXMTRymi5OMvwbtfT3sxcRE72sx1ycYymT46JbRE=
|
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=
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
@@ -481,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/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 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=
|
||||||
github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=
|
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/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 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
@@ -504,6 +511,8 @@ github.com/yosssi/gmq v0.0.1 h1:GhlDVaAQoi3Mvjul/qJXXGfL4JBeE0GQwbWp3eIsja8=
|
|||||||
github.com/yosssi/gmq v0.0.1/go.mod h1:mReykazh0U1JabvuWh1PEbzzJftqOQWsjr0Lwg5jL1Y=
|
github.com/yosssi/gmq v0.0.1/go.mod h1:mReykazh0U1JabvuWh1PEbzzJftqOQWsjr0Lwg5jL1Y=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
|
go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0=
|
||||||
|
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
||||||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
||||||
go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
|
go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
|
||||||
@@ -515,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/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/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
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-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-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
@@ -528,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-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-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-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/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-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
@@ -610,6 +621,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a h1:i47hUS795cOydZI4AwJQCKXOr4BvxzvikwDoDtHhP2Y=
|
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a h1:i47hUS795cOydZI4AwJQCKXOr4BvxzvikwDoDtHhP2Y=
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ import (
|
|||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"sour.is/x/toolbox/httpsrv"
|
"sour.is/x/toolbox/httpsrv"
|
||||||
"sour.is/x/toolbox/log"
|
"sour.is/x/toolbox/log"
|
||||||
|
|
||||||
|
"github.com/gomarkdown/markdown"
|
||||||
|
"github.com/gomarkdown/markdown/html"
|
||||||
|
"github.com/gomarkdown/markdown/parser"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -78,7 +82,7 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
f, err := os.Open(fname)
|
f, err := os.Open(fname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
@@ -107,7 +111,7 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tr := tar.NewReader(rdr)
|
tr := tar.NewReader(rdr)
|
||||||
if path == "..." {
|
if path == "@" {
|
||||||
var paths []string
|
var paths []string
|
||||||
for {
|
for {
|
||||||
hdr, err := tr.Next()
|
hdr, err := tr.Next()
|
||||||
@@ -115,7 +119,7 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
|
|||||||
break // End of archive
|
break // End of archive
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
paths = append(paths, hdr.Name)
|
paths = append(paths, hdr.Name)
|
||||||
}
|
}
|
||||||
@@ -130,9 +134,37 @@ func (a *Artifact) get(w http.ResponseWriter, r *http.Request) {
|
|||||||
break // End of archive
|
break // End of archive
|
||||||
}
|
}
|
||||||
if err != nil {
|
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 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)
|
pr := NewPreviewReader(tr)
|
||||||
|
|
||||||
mime, err := ReadMIME(pr, hdr.Name)
|
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)
|
w.Header().Set("Content-Type", mime)
|
||||||
|
|
||||||
if _, err := io.Copy(w, pr.Drain()); err != nil {
|
if _, err := io.Copy(w, pr.Drain()); err != nil {
|
||||||
log.Fatal(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package routes
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"sour.is/x/toolbox/log"
|
"sour.is/x/toolbox/log"
|
||||||
@@ -46,9 +47,10 @@ type drainReader struct {
|
|||||||
buf *bytes.Buffer
|
buf *bytes.Buffer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ io.Seeker = (*drainReader)(nil)
|
||||||
|
|
||||||
func (dr *drainReader) Read(p []byte) (n int, err error) {
|
func (dr *drainReader) Read(p []byte) (n int, err error) {
|
||||||
i := 0
|
i := 0
|
||||||
// log.Debugs("drainReader:", "buf", dr.buf.Len(), "p", len(p))
|
|
||||||
if dr.buf.Len() > 0 {
|
if dr.buf.Len() > 0 {
|
||||||
i, err = dr.buf.Read(p)
|
i, err = dr.buf.Read(p)
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
@@ -70,3 +72,14 @@ func (dr *drainReader) Read(p []byte) (n int, err error) {
|
|||||||
|
|
||||||
return ri + i, err
|
return ri + i, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Seek attempt if the underlying reader supports it.
|
||||||
|
func (dr *drainReader) Seek(offset int64, whence int) (int64, error) {
|
||||||
|
if dr.buf.Len() > 0 {
|
||||||
|
return 0, fmt.Errorf("unable to seek")
|
||||||
|
}
|
||||||
|
if r, ok := dr.r.(io.Seeker); ok {
|
||||||
|
return r.Seek(offset, whence)
|
||||||
|
}
|
||||||
|
return 0, fmt.Errorf("unable to seek")
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,58 +1,72 @@
|
|||||||
package routes
|
package routes
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/sha1"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/mail"
|
||||||
"net/url"
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
"time"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/coreos/bbolt"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/patrickmn/go-cache"
|
"github.com/sour-is/crypto/openpgp"
|
||||||
|
"github.com/tv42/zbase32"
|
||||||
|
|
||||||
"sour.is/x/toolbox/httpsrv"
|
"sour.is/x/toolbox/httpsrv"
|
||||||
|
"sour.is/x/toolbox/log"
|
||||||
"sour.is/x/toolbox/uuid"
|
"sour.is/x/toolbox/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
s := NewShortManager(365 * 24 * time.Hour)
|
s := &shortDB{}
|
||||||
|
httpsrv.RegisterModule("short", s.config)
|
||||||
|
|
||||||
httpsrv.HttpRegister("short", httpsrv.HttpRoutes{
|
httpsrv.HttpRegister("short", httpsrv.HttpRoutes{
|
||||||
{Name: "getShort", Method: "GET", Pattern: "/s/{id}", HandlerFunc: s.getShort},
|
{Name: "getShort", Method: "GET", Pattern: "/s/{id}", HandlerFunc: s.getShort},
|
||||||
{Name: "putShort", Method: "PUT", Pattern: "/s/{id}", HandlerFunc: s.putShort},
|
{Name: "putShort", Method: "PUT", Pattern: "/s/{id}", HandlerFunc: s.putShort},
|
||||||
|
{Name: "getIdentity", Method: "GET", Pattern: "/id/{id}", HandlerFunc: s.getIdentity},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type shortManager struct {
|
type shortDB struct {
|
||||||
defaultExpire time.Duration
|
path string
|
||||||
db *cache.Cache
|
bucket string
|
||||||
}
|
}
|
||||||
|
|
||||||
type shortURL struct {
|
func (s *shortDB) config(config map[string]string) {
|
||||||
ID string
|
s.bucket = "shortURL"
|
||||||
URL string
|
if config["bucket"] != "" {
|
||||||
Secret string
|
s.bucket = config["bucket"]
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewShortManager(defaultExpire time.Duration) *shortManager {
|
s.path = "data/meta.db"
|
||||||
return &shortManager{
|
if config["store"] != "" {
|
||||||
defaultExpire: defaultExpire,
|
s.path = config["store"]
|
||||||
db: cache.New(defaultExpire, defaultExpire/10),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *shortManager) GetURL(id string) *shortURL {
|
db, err := bbolt.Open(s.path, 0666, nil)
|
||||||
if u, ok := s.db.Get(id); ok {
|
if err != nil {
|
||||||
if url, ok := u.(*shortURL); ok {
|
log.Fatalf("ShortURL: failed to open db at [%s]", s.path)
|
||||||
return url
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
db.Update(func(tx *bbolt.Tx) error {
|
||||||
|
_, err := tx.CreateBucketIfNotExists([]byte(s.bucket))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("ShortURL: create bucket: %s", err)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
})
|
||||||
func (s *shortManager) PutURL(id string, url *shortURL) {
|
|
||||||
s.db.SetDefault(id, url)
|
log.Noticef("ShortURL: opened db at [%s] bucket [%s]", s.path, s.bucket)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *shortManager) getShort(w http.ResponseWriter, r *http.Request) {
|
func (s *shortDB) getShort(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
|
|
||||||
id := vars["id"]
|
id := vars["id"]
|
||||||
@@ -67,7 +81,7 @@ func (s *shortManager) getShort(w http.ResponseWriter, r *http.Request) {
|
|||||||
w.WriteHeader(http.StatusFound)
|
w.WriteHeader(http.StatusFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *shortManager) putShort(w http.ResponseWriter, r *http.Request) {
|
func (s *shortDB) putShort(w http.ResponseWriter, r *http.Request) {
|
||||||
defer r.Body.Close()
|
defer r.Body.Close()
|
||||||
|
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
@@ -107,6 +121,12 @@ func (s *shortManager) putShort(w http.ResponseWriter, r *http.Request) {
|
|||||||
httpsrv.WriteObject(w, 200, short)
|
httpsrv.WriteObject(w, 200, short)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type shortURL struct {
|
||||||
|
ID string
|
||||||
|
URL string
|
||||||
|
Secret string
|
||||||
|
}
|
||||||
|
|
||||||
func newshort(id, secret, u string) *shortURL {
|
func newshort(id, secret, u string) *shortURL {
|
||||||
m, err := regexp.MatchString("[a-z-]{1,64}", id)
|
m, err := regexp.MatchString("[a-z-]{1,64}", id)
|
||||||
if id == "" || !m || err != nil {
|
if id == "" || !m || err != nil {
|
||||||
@@ -118,3 +138,162 @@ func newshort(id, secret, u string) *shortURL {
|
|||||||
}
|
}
|
||||||
return &shortURL{ID: id, Secret: secret, URL: u}
|
return &shortURL{ID: id, Secret: secret, URL: u}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *shortURL) Bytes() []byte {
|
||||||
|
if s == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var w bytes.Buffer
|
||||||
|
json.NewEncoder(&w).Encode(*s)
|
||||||
|
return w.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
func URLFromBytes(b []byte) *shortURL {
|
||||||
|
if len(b) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var s shortURL
|
||||||
|
json.Unmarshal(b, &s)
|
||||||
|
|
||||||
|
log.Debug(s)
|
||||||
|
return &s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *shortDB) GetURL(id string) *shortURL {
|
||||||
|
db, err := bbolt.Open(s.path, 0666, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("ShortURL: failed to open db at [%s]", s.path)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
var url *shortURL
|
||||||
|
|
||||||
|
err = db.View(func(tx *bbolt.Tx) error {
|
||||||
|
b := tx.Bucket([]byte(s.bucket))
|
||||||
|
v := b.Get([]byte(id))
|
||||||
|
|
||||||
|
url = URLFromBytes(v)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("ShortURL: failed to open db at [%s]", s.path)
|
||||||
|
}
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
func (s *shortDB) PutURL(id string, url *shortURL) {
|
||||||
|
db, err := bbolt.Open(s.path, 0666, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("ShortURL: failed to open db at [%s]", s.path)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
err = db.Update(func(tx *bbolt.Tx) error {
|
||||||
|
b := tx.Bucket([]byte(s.bucket))
|
||||||
|
return b.Put([]byte(id), url.Bytes())
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user