add POSSE

This commit is contained in:
Cadey Ratio 2020-01-11 14:11:30 -05:00
parent c2b7e8e5a8
commit 66c1b5c8cd
8 changed files with 172 additions and 25 deletions

View File

@ -3,6 +3,8 @@ package main
import (
"context"
"flag"
"fmt"
"net/http"
"net/url"
"os"
"os/signal"
@ -12,22 +14,10 @@ import (
_ "github.com/joho/godotenv/autoload"
r "gopkg.in/rethinkdb/rethinkdb-go.v6"
"within.website/ln"
"within.website/ln/ex"
)
var (
// Twitter
twitterAPIKey = flag.String("twitter-api-key", "", "Twitter API key")
twitterAPISecret = flag.String("twitter-api-secret", "", "Twitter API secret")
twitterConsumerToken = flag.String("twitter-consumer-token", "", "Twitter consumer Token")
twitterConsumerSecret = flag.String("twitter-consumer-secret", "", "Twitter consumer Secret")
// Mastodon
mastodonInstance = flag.String("mastodon-instance", "", "Mastodon instance to connect to")
mastodonAppID = flag.String("mastodon-app-id", "", "Mastodon app ID")
mastodonAppSecret = flag.String("mastodon-app-secret", "", "Mastodon app secret")
mastodonToken = flag.String("mastodon-token", "", "Mastodon API token")
mastodonAccount = flag.String("mastodon-account", "", "Mastodon account")
/*
// Gitea
giteaInstance = flag.String("gitea-instance", "", "Gitea instance to use")
@ -37,21 +27,9 @@ var (
githubToken = flag.String("github-token", "", "Github API token")
*/
// Reddit
redditAppID = flag.String("reddit-app-id", "", "Reddit app ID")
redditAppSecret = flag.String("reddit-app-secret", "", "Reddit app Secret")
redditUsername = flag.String("reddit-username", "", "Reddit username")
redditPassword = flag.String("reddit-password", "", "Reddit password")
// RethinkDB
rethinkDBURL = flag.String("rethinkdb-url", "rethinkdb2://admin@127.0.0.1:28015/mi", "RethinkDB URL")
// Patreon
patreonClientID = flag.String("patreon-client-id", "", "Patreon client ID")
patreonClientSecret = flag.String("patreon-client-secret", "", "Patreon client secret")
patreonAccessToken = flag.String("patreon-access-token", "", "Patreon access token")
patreonRefreshToken = flag.String("patreon-refresh-token", "", "Patreon refresh token")
// Blog
blogURL = flag.String("blog-url", "https://christine.website/blog.json", "JSONFeed to monitor for new posts")
@ -103,6 +81,19 @@ func main() {
ln.FatalErr(ctx, err)
}
mux := http.NewServeMux()
pm, err := MakeMiddleware(*pasetoPublicKey, *pasetoPrivateKey, mux)
if err != nil {
ln.FatalErr(ctx, err)
}
tok, err := pm.CreateToken(nil, time.Now().AddDate(2, 0, 0))
if err != nil {
ln.FatalErr(ctx, err)
}
fmt.Printf("token: %s\n", tok)
mi := &Mi{
session: session,
mastodonClient: mastodonClient,
@ -124,6 +115,13 @@ func main() {
go mi.StreamReddit(ctx)
go mi.StreamMastodonToTwitter(ctx)
h := &http.Server{
Addr: ":" + *port,
Handler: ex.HTTPLog(pm),
}
go func() { ln.FatalErr(ctx, h.ListenAndServe()) }()
<-ctx.Done()
ln.Log(ctx, ln.Info("cleaning up"))
time.Sleep(500 * time.Millisecond)

View File

@ -3,6 +3,7 @@ package main
import (
"context"
"encoding/json"
"flag"
"github.com/McKael/madon"
"github.com/jaytaylor/html2text"
@ -11,6 +12,15 @@ import (
"within.website/ln/opname"
)
var (
// Mastodon
mastodonInstance = flag.String("mastodon-instance", "", "Mastodon instance to connect to")
mastodonAppID = flag.String("mastodon-app-id", "", "Mastodon app ID")
mastodonAppSecret = flag.String("mastodon-app-secret", "", "Mastodon app secret")
mastodonToken = flag.String("mastodon-token", "", "Mastodon API token")
mastodonAccount = flag.String("mastodon-account", "", "Mastodon account")
)
func makeMastodon() (*madon.Client, error) {
c, err := madon.RestoreApp("mi", *mastodonInstance, *mastodonAppID, *mastodonAppSecret, &madon.UserToken{AccessToken: *mastodonToken})
if err != nil {

80
cmd/mi/middleware.go Normal file
View File

@ -0,0 +1,80 @@
package main
import (
"encoding/hex"
"flag"
"net/http"
"time"
"github.com/google/uuid"
"github.com/o1egl/paseto/v2"
"golang.org/x/crypto/ed25519"
"within.website/ln"
)
var (
// Paseto
pasetoPublicKey = flag.String("paseto-public-key", "", "Paseto public key (see tools/paseto-key-gen.go)")
pasetoPrivateKey = flag.String("paseto-private-key", "", "Paseto private key")
)
type PasetoMiddleware struct {
next http.Handler
pubKey ed25519.PublicKey
privKey ed25519.PrivateKey
v2 paseto.V2
}
func MakeMiddleware(pub, priv string, next http.Handler) (*PasetoMiddleware, error) {
var result PasetoMiddleware
result.next = next
publicKey, err := hex.DecodeString(pub)
if err != nil {
return nil, err
}
result.pubKey = ed25519.PublicKey(publicKey)
privateKey, err := hex.DecodeString(priv)
if err != nil {
return nil, err
}
result.privKey = ed25519.PrivateKey(privateKey)
return &result, nil
}
func (pm PasetoMiddleware) CreateToken(data [][2]string, expiration time.Time) (string, error) {
claims := paseto.JSONToken{
Expiration: expiration,
Jti: uuid.New().String(),
Subject: "Within",
IssuedAt: time.Now(),
}
for _, datum := range data {
claims.Set(datum[0], datum[1])
}
tok, err := pm.v2.Sign(pm.privKey, claims, nil)
if err != nil {
return "", err
}
return tok, nil
}
func (pm PasetoMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
tok := r.Header.Get("Authorization")
var newJsonToken paseto.JSONToken
var newFooter string
err := pm.v2.Verify(tok, pm.pubKey, &newJsonToken, &newFooter)
if err != nil {
ln.Error(r.Context(), err)
http.Error(w, "Not allowed", http.StatusForbidden)
return
}
pm.next.ServeHTTP(w, r)
}

View File

@ -2,12 +2,21 @@ package main
import (
"context"
"flag"
"time"
"golang.org/x/oauth2"
"gopkg.in/mxpv/patreon-go.v1"
)
var (
// Patreon
patreonClientID = flag.String("patreon-client-id", "", "Patreon client ID")
patreonClientSecret = flag.String("patreon-client-secret", "", "Patreon client secret")
patreonAccessToken = flag.String("patreon-access-token", "", "Patreon access token")
patreonRefreshToken = flag.String("patreon-refresh-token", "", "Patreon refresh token")
)
func makePatreon() (*patreon.Client, error) {
config := oauth2.Config{
ClientID: *patreonClientID,

View File

@ -2,6 +2,7 @@ package main
import (
"context"
"flag"
"runtime"
"strings"
@ -11,6 +12,14 @@ import (
"within.website/ln"
)
var (
// Reddit
redditAppID = flag.String("reddit-app-id", "", "Reddit app ID")
redditAppSecret = flag.String("reddit-app-secret", "", "Reddit app Secret")
redditUsername = flag.String("reddit-username", "", "Reddit username")
redditPassword = flag.String("reddit-password", "", "Reddit password")
)
func makeReddit() (reddit.Bot, error) {
cfg := reddit.BotConfig{
Agent: "mi:life_logging_bot:0.0.1 by /u/shadowh511",

View File

@ -1,10 +1,20 @@
package main
import (
"flag"
"github.com/dghubble/go-twitter/twitter"
"github.com/dghubble/oauth1"
)
var (
// Twitter
twitterAPIKey = flag.String("twitter-api-key", "", "Twitter API key")
twitterAPISecret = flag.String("twitter-api-secret", "", "Twitter API secret")
twitterConsumerToken = flag.String("twitter-consumer-token", "", "Twitter consumer Token")
twitterConsumerSecret = flag.String("twitter-consumer-secret", "", "Twitter consumer Secret")
)
func makeTwitter() (*twitter.Client, error) {
config := oauth1.NewConfig(*twitterConsumerToken, *twitterConsumerSecret)
token := oauth1.NewToken(*twitterAPIKey, *twitterAPISecret)

4
go.mod
View File

@ -11,14 +11,18 @@ require (
github.com/facebookgo/flagenv v0.0.0-20160425205200-fcd59fca7456
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect
github.com/google/uuid v1.1.1
github.com/gorilla/websocket v1.4.1 // indirect
github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43
github.com/joho/godotenv v1.3.0
github.com/kr/pretty v0.1.0
github.com/o1egl/paseto v1.0.0
github.com/o1egl/paseto/v2 v2.0.0-20191203150002-5f81bc3bcb3e
github.com/olekukonko/tablewriter v0.0.4 // indirect
github.com/sendgrid/rest v2.4.1+incompatible // indirect
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
github.com/turnage/graw v0.0.0-20191224200831-a592320d5bc9
golang.org/x/crypto v0.0.0-20200109152110-61a87790db17
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
gopkg.in/mxpv/patreon-go.v1 v1.0.0-20171031001022-1d2f253ac700
gopkg.in/rethinkdb/rethinkdb-go.v6 v6.0.0

27
go.sum
View File

@ -1,6 +1,12 @@
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/McKael/madon v2.3.0+incompatible h1:xMUA+Fy4saDV+8tN3MMnwJUoYWC//5Fy8LeOqJsRNIM=
github.com/McKael/madon v2.3.0+incompatible/go.mod h1:+issnvJjN1rpjAHZwXRB/x30uHh/NoQR7QaojJK/lSI=
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb h1:6Z/wqhPFZ7y5ksCEV/V5MXOazLaeu/EW97CU5rz8NWk=
github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU=
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw=
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us=
github.com/cenkalti/backoff v2.0.0+incompatible h1:5IIPUHhlnUZbcHQsQou5k1Tn58nJkeJL9U+ig5CHJbY=
github.com/cenkalti/backoff v2.0.0+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY=
@ -30,6 +36,8 @@ github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
@ -49,6 +57,10 @@ github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+tw
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0=
github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU=
github.com/o1egl/paseto/v2 v2.0.0-20191203150002-5f81bc3bcb3e h1:jZPhKNKN4N1il2zV1z3OS6vOAAYjUpS+pK5RQTSSdC0=
github.com/o1egl/paseto/v2 v2.0.0-20191203150002-5f81bc3bcb3e/go.mod h1:0ldCNnSWZBHLmf1rpRCmIjlfTeLh7c2teiM7LYTGO1c=
github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8=
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
@ -70,20 +82,27 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/turnage/graw v0.0.0-20191224200831-a592320d5bc9 h1:hGzA+rD6+ZhT23x6lG6Pk6tG3gI95gvNu0X5MzwoYkQ=
github.com/turnage/graw v0.0.0-20191224200831-a592320d5bc9/go.mod h1:aAkq4I/q1izZSSwHvzhDn9NA+eGxgTSuibwP3MZRlQY=
github.com/turnage/redditproto v0.0.0-20151223012412-afedf1b6eddb h1:qR56NGRvs2hTUbkn6QF8bEJzxPIoMw3Np3UigBeJO5A=
github.com/turnage/redditproto v0.0.0-20151223012412-afedf1b6eddb/go.mod h1:GyqJdEoZSNoxKDb7Z2Lu/bX63jtFukwpaTP9ZIS5Ei0=
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac h1:7d7lG9fHOLdL6jZPtnV4LpI41SbohIJ1Atq7U991dMg=
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191108234033-bd318be0434a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200109152110-61a87790db17 h1:nVJ3guKA9qdkEQ3TUdXI9QSINo2CUPM/cySEvw2w8I0=
golang.org/x/crypto v0.0.0-20200109152110-61a87790db17/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -92,10 +111,16 @@ golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180828065106-d99a578cf41b h1:cmOZLU2i7CLArKNViO+ZCQ47wqYFyKEIpbGWp+b6Uoc=
golang.org/x/sys v0.0.0-20180828065106-d99a578cf41b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fatih/pool.v2 v2.0.0 h1:xIFeWtxifuQJGk/IEPKsTduEKcKvPmhoiVDGpC40nKg=
@ -104,5 +129,7 @@ gopkg.in/mxpv/patreon-go.v1 v1.0.0-20171031001022-1d2f253ac700 h1:ymnLBRNALxuok6
gopkg.in/mxpv/patreon-go.v1 v1.0.0-20171031001022-1d2f253ac700/go.mod h1:IZaw6NfbSsGszLfPbo9LLlxLIx17eMHWe4cxpM8wUMk=
gopkg.in/rethinkdb/rethinkdb-go.v6 v6.0.0 h1:x+tVYhL4QUktgB8Dvspq0ZmnPYMO/5tYEvhX5KBm47M=
gopkg.in/rethinkdb/rethinkdb-go.v6 v6.0.0/go.mod h1:Z9NgaOLdqIZS9v3EFLP/S0VdloWSW+2zEN6dllUSCVQ=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
within.website/ln v0.7.0 h1:cZUc53cZF/+hWuEAv1VbqlYJ5czuPFHKfH0hLKmlIUA=
within.website/ln v0.7.0/go.mod h1:ifURKqsCJekcsdUE+hyCdcuhQqQ+9v9DfA++ZqYxZFE=