diff --git a/go.mod b/go.mod index 66892ca..bdfc3a2 100644 --- a/go.mod +++ b/go.mod @@ -46,12 +46,13 @@ require ( github.com/yuin/goldmark v1.4.3 // master github.com/yuin/goldmark-emoji v1.0.2-0.20210607094911-0487583eca38 - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 - golang.org/x/net v0.0.0-20211105192438-b53810dc28af + golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa + golang.org/x/net v0.0.0-20211108170745-6635138e15ea golang.org/x/sync v0.0.0-20210220032951-036812b2e83c gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b tailscale.com v1.16.2 - willnorris.com/go/microformats v1.1.1 + // main + willnorris.com/go/microformats v1.1.2-0.20210827044458-ff2a6ae41971 ) require ( @@ -101,7 +102,7 @@ require ( go4.org/intern v0.0.0-20210108033219-3eb7198706b2 // indirect go4.org/mem v0.0.0-20201119185036-c04c5a6ff174 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 // indirect - golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 // indirect + golang.org/x/sys v0.0.0-20211109065445-02f5c0300f6e // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 // indirect golang.zx2c4.com/wireguard v0.0.0-20210905140043-2ef39d47540c // indirect diff --git a/go.sum b/go.sum index 98ce002..3cc5aee 100644 --- a/go.sum +++ b/go.sum @@ -500,8 +500,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa h1:idItI2DDfCokpg0N51B2VtiLdJ4vAuXC9fnCb2gACo4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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= @@ -587,8 +587,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211105192438-b53810dc28af h1:SMeNJG/vclJ5wyBBd4xupMsSJIHTd1coW9g7q6KOjmY= -golang.org/x/net v0.0.0-20211105192438-b53810dc28af/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211108170745-6635138e15ea h1:FosBMXtOc8Tp9Hbo4ltl1WJSrTVewZU8MPnTPY2HdH8= +golang.org/x/net v0.0.0-20211108170745-6635138e15ea/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -687,8 +687,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 h1:G2DDmludOQZoWbpCr7OKDxnl478ZBGMcOhrv+ooX/Q4= -golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211109065445-02f5c0300f6e h1:i6Vklmyu+fZMFYpum+sR4ZWABGW7MyIxfJZXYvcnbns= +golang.org/x/sys v0.0.0-20211109065445-02f5c0300f6e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= @@ -935,5 +935,5 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= software.sslmate.com/src/go-pkcs12 v0.0.0-20180114231543-2291e8f0f237 h1:iAEkCBPbRaflBgZ7o9gjVUuWuvWeV4sytFWg9o+Pj2k= tailscale.com v1.16.2 h1:4zm8is0imruZM5y40tZ0WeOgto7/RoHwA/+TJhuC2A4= tailscale.com v1.16.2/go.mod h1:+dISSbd6iiY6F6/dRGQRgshjYXMkhMzVvRd9En8RLfQ= -willnorris.com/go/microformats v1.1.1 h1:h5tk2luq6KBIRcwMGdksxdeea4GGuWrRFie5460OAbo= -willnorris.com/go/microformats v1.1.1/go.mod h1:kvVnWrkkEscVAIITCEoiTX66Hcyg59C7q0E49mb9TJ0= +willnorris.com/go/microformats v1.1.2-0.20210827044458-ff2a6ae41971 h1:b4juh5znIpBA1KnzHMP0UB4Cs+3/0b0XfchkWE81FXw= +willnorris.com/go/microformats v1.1.2-0.20210827044458-ff2a6ae41971/go.mod h1:kvVnWrkkEscVAIITCEoiTX66Hcyg59C7q0E49mb9TJ0= diff --git a/http.go b/http.go index d375676..ec5e505 100644 --- a/http.go +++ b/http.go @@ -190,9 +190,6 @@ func (a *goBlog) buildRouter() (http.Handler, error) { // Captcha r.Handle("/captcha/*", captcha.Server(500, 250)) - // Short paths - r.With(a.privateModeHandler, cacheLoggedIn, a.cacheMiddleware).Get("/s/{id:[0-9a-fA-F]+}", a.redirectToLongPath) - // Blogs for blog, blogConfig := range a.cfg.Blogs { r.Group(a.blogRouter(blog, blogConfig)) @@ -225,19 +222,27 @@ func (a *goBlog) servePostsAliasesRedirects() http.HandlerFunc { // Check if post or alias path := r.URL.Path row, err := a.db.queryRow(` - select 'post', status from posts where path = @path + -- normal posts + select 'post', status, 200 from posts where path = @path union all - select 'alias', path from post_parameters where parameter = 'aliases' and value = @path + -- short paths + select 'alias', path, 301 from shortpath where printf('/s/`+"%"+`x', id) = @path union all - select 'deleted', '' from deleted where path = @path + -- post aliases + select 'alias', path, 302 from post_parameters where parameter = 'aliases' and value = @path + union all + -- deleted posts + select 'deleted', '', 401 from deleted where path = @path + -- just select the first result limit 1 `, sql.Named("path", path)) if err != nil { a.serveError(w, r, err.Error(), http.StatusInternalServerError) return } - var postAliasType, value string - err = row.Scan(&postAliasType, &value) + var pathType, value string + var status int + err = row.Scan(&pathType, &value, &status) if err != nil { if !errors.Is(err, sql.ErrNoRows) { // Error @@ -247,7 +252,7 @@ func (a *goBlog) servePostsAliasesRedirects() http.HandlerFunc { // No result, continue... } else { // Found post or alias - switch postAliasType { + switch pathType { case "post": // Is post, check status switch postStatus(value) { @@ -261,7 +266,7 @@ func (a *goBlog) servePostsAliasesRedirects() http.HandlerFunc { case "alias": // Is alias, redirect alicePrivate.Append(cacheLoggedIn, a.cacheMiddleware).ThenFunc(func(w http.ResponseWriter, r *http.Request) { - http.Redirect(w, r, value, http.StatusFound) + http.Redirect(w, r, value, status) }).ServeHTTP(w, r) return case "deleted": diff --git a/shortPath.go b/shortPath.go index c88185e..5e07f57 100644 --- a/shortPath.go +++ b/shortPath.go @@ -4,10 +4,6 @@ import ( "database/sql" "errors" "fmt" - "net/http" - "strconv" - - "github.com/go-chi/chi/v5" ) func (db *database) shortenPath(p string) (string, error) { @@ -53,23 +49,3 @@ func (db *database) getShortPathID(p string) (id int) { db.spc.Store(p, id) return id } - -func (a *goBlog) redirectToLongPath(rw http.ResponseWriter, r *http.Request) { - id, err := strconv.ParseInt(chi.URLParam(r, "id"), 16, 64) - if err != nil { - a.serve404(rw, r) - return - } - row, err := a.db.queryRow("select path from shortpath where id = @id", sql.Named("id", id)) - if err != nil { - a.serve404(rw, r) - return - } - var path string - err = row.Scan(&path) - if err != nil { - a.serve404(rw, r) - return - } - http.Redirect(rw, r, path, http.StatusMovedPermanently) -}