From 2842ff6220f788ea50b4a58ea0f275cf8dd78729 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Else Date: Fri, 16 Apr 2021 20:00:38 +0200 Subject: [PATCH] Small things --- database.go | 15 +++++---------- go.mod | 7 ++++--- go.sum | 15 ++++++++------- utils.go | 12 +++--------- webmentionVerification.go | 12 ++++-------- 5 files changed, 24 insertions(+), 37 deletions(-) diff --git a/database.go b/database.go index e9ef7d4..abce096 100644 --- a/database.go +++ b/database.go @@ -11,10 +11,9 @@ import ( ) var ( - appDb *sql.DB - appDbWriteMutex = &sync.Mutex{} - dbStatementCache = map[string]*sql.Stmt{} - dbStatementCacheMutex = &sync.RWMutex{} + appDb *sql.DB + appDbWriteMutex = &sync.Mutex{} + dbStatementCache = map[string]*sql.Stmt{} ) func initDatabase() (err error) { @@ -50,11 +49,11 @@ func dumpDb() { f, err := os.Create(appConfig.Db.DumpFile) if err != nil { log.Println("Error while dump db:", err.Error()) + return } startWritingToDb() defer finishWritingToDb() - err = sqlite3dump.DumpDB(appDb, f) - if err != nil { + if err = sqlite3dump.DumpDB(appDb, f); err != nil { log.Println("Error while dump db:", err.Error()) } } @@ -78,9 +77,7 @@ func vacuumDb() { func prepareAppDbStatement(query string) (*sql.Stmt, error) { stmt, err, _ := cacheGroup.Do(query, func() (interface{}, error) { - dbStatementCacheMutex.RLock() stmt, ok := dbStatementCache[query] - dbStatementCacheMutex.RUnlock() if ok && stmt != nil { return stmt, nil } @@ -88,9 +85,7 @@ func prepareAppDbStatement(query string) (*sql.Stmt, error) { if err != nil { return nil, err } - dbStatementCacheMutex.Lock() dbStatementCache[query] = stmt - dbStatementCacheMutex.Unlock() return stmt, nil }) if err != nil { diff --git a/go.mod b/go.mod index c26f4e6..e866efd 100644 --- a/go.mod +++ b/go.mod @@ -48,6 +48,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.7.1 github.com/tdewolff/minify/v2 v2.9.16 + github.com/tdewolff/parse/v2 v2.5.15 // indirect github.com/thoas/go-funk v0.8.0 github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 github.com/vcraescu/go-paginator v1.0.1-0.20201114172518-2cfc59fe05c2 @@ -55,12 +56,12 @@ require ( github.com/yuin/goldmark-emoji v1.0.1 go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.16.0 // indirect - golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect + golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc // indirect golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect golang.org/x/mod v0.4.1 // indirect - golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1 + golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0 // indirect + golang.org/x/sys v0.0.0-20210415045647-66c3f260301c // indirect golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.62.0 // indirect diff --git a/go.sum b/go.sum index 0ad097d..aeae919 100644 --- a/go.sum +++ b/go.sum @@ -326,8 +326,9 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tdewolff/minify/v2 v2.9.16 h1:2Pv8pFRX/ZfjTRYX2xzcuNrkEJqU5TfriNJJYOeN3rI= github.com/tdewolff/minify/v2 v2.9.16/go.mod h1:cjMkr4ZgFjqxXAQ1kR9Fm4l1046mmONd2g6yMzGuN/w= -github.com/tdewolff/parse/v2 v2.5.14 h1:ftdD54vkOeLZ7VkEZxp+wZrYZyyPi43GGon5GwBTRUI= github.com/tdewolff/parse/v2 v2.5.14/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho= +github.com/tdewolff/parse/v2 v2.5.15 h1:hYZKJZ0KfHMGhN3+hER4R9gQM/umJThkeeyJNtsO86o= +github.com/tdewolff/parse/v2 v2.5.15/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho= github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4= github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/thoas/go-funk v0.8.0 h1:JP9tKSvnpFVclYgDM0Is7FD9M4fhPvqA0s0BsXmzSRQ= @@ -368,8 +369,8 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U 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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc h1:+q90ECDSAQirdykUN6sPEiBXBsp8Csjcca8Oy7bgLTA= +golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -416,8 +417,8 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1 h1:4qWs8cYYH6PoEFy4dfhDFgoMGkwAcETd+MmPdCPMzUc= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d h1:BgJvlyh+UqCUaPlscHJ+PN8GcpfrFdr7NHjd1JL0+Gs= +golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -453,8 +454,8 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0 h1:g9s1Ppvvun/fI+BptTMj909BBIcGrzQ32k9FNlcevOE= -golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210415045647-66c3f260301c h1:6L+uOeS3OQt/f4eFHXZcTxeZrGCuz+CLElgEBjbcTA4= +golang.org/x/sys v0.0.0-20210415045647-66c3f260301c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/utils.go b/utils.go index 20b58d7..912c75c 100644 --- a/utils.go +++ b/utils.go @@ -2,15 +2,14 @@ package main import ( "io" - "math/rand" "net/http" "net/url" "sort" "strings" - "time" "github.com/PuerkitoBio/goquery" "github.com/araddon/dateparse" + "github.com/thoas/go-funk" ) type requestContextKey string @@ -37,12 +36,7 @@ func sortedStrings(s []string) []string { const randomLetters = "abcdefghijklmnopqrstuvwxyz" func generateRandomString(chars int) string { - rand.Seed(time.Now().UnixNano()) - var b strings.Builder - for i := 0; i < chars; i++ { - b.WriteByte(randomLetters[rand.Intn(len(randomLetters))]) - } - return b.String() + return funk.RandomString(chars, []rune(randomLetters)) } func isAllowedHost(r *http.Request, hosts ...string) bool { @@ -86,7 +80,7 @@ func allLinksFromHTML(r io.Reader, baseURL string) ([]string, error) { } }) links, err = resolveURLReferences(baseURL, links...) - return links, err + return funk.UniqString(links), err } func resolveURLReferences(base string, refs ...string) ([]string, error) { diff --git a/webmentionVerification.go b/webmentionVerification.go index 6f38473..39fd8ea 100644 --- a/webmentionVerification.go +++ b/webmentionVerification.go @@ -14,6 +14,7 @@ import ( "github.com/PuerkitoBio/goquery" "github.com/joncrlsn/dque" + "github.com/thoas/go-funk" "willnorris.com/go/microformats" ) @@ -117,14 +118,9 @@ func (m *mention) verifyReader(body io.Reader) error { if err != nil { return err } - hasLink := false - for _, link := range links { - if unescapedPath(link) == unescapedPath(m.Target) { - hasLink = true - break - } - } - if !hasLink { + if _, hasLink := funk.FindString(links, func(s string) bool { + return unescapedPath(s) == unescapedPath(m.Target) + }); !hasLink { return errors.New("target not found in source") } // Set title