diff --git a/cmd/mi/main.go b/cmd/mi/main.go index a41aa1c..9f96c81 100644 --- a/cmd/mi/main.go +++ b/cmd/mi/main.go @@ -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) diff --git a/cmd/mi/mastodon.go b/cmd/mi/mastodon.go index c60f409..c17ff67 100644 --- a/cmd/mi/mastodon.go +++ b/cmd/mi/mastodon.go @@ -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 { diff --git a/cmd/mi/middleware.go b/cmd/mi/middleware.go new file mode 100644 index 0000000..b2293ec --- /dev/null +++ b/cmd/mi/middleware.go @@ -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) +} diff --git a/cmd/mi/patreon.go b/cmd/mi/patreon.go index 6145dc0..3f0e836 100644 --- a/cmd/mi/patreon.go +++ b/cmd/mi/patreon.go @@ -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, diff --git a/cmd/mi/reddit.go b/cmd/mi/reddit.go index 1410936..fb7747d 100644 --- a/cmd/mi/reddit.go +++ b/cmd/mi/reddit.go @@ -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", diff --git a/cmd/mi/twitter.go b/cmd/mi/twitter.go index 0ad518d..6979446 100644 --- a/cmd/mi/twitter.go +++ b/cmd/mi/twitter.go @@ -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) diff --git a/go.mod b/go.mod index 2093b5c..3390207 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index 26a3ec2..29e2749 100644 --- a/go.sum +++ b/go.sum @@ -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=