From cca247c25b5c607da302571fc0a3ecdfb3b522d9 Mon Sep 17 00:00:00 2001 From: Jason Cameron Date: Thu, 14 May 2026 01:33:27 -0400 Subject: [PATCH] refactor(web): pass render URL state explicitly Signed-off-by: Jason Cameron --- lib/anubis.go | 20 +++----- lib/anubis_test.go | 2 +- lib/challenge/interface.go | 11 ++-- lib/challenge/metarefresh/metarefresh.go | 5 +- lib/challenge/metarefresh/metarefresh.templ | 6 +-- .../metarefresh/metarefresh_templ.go | 10 ++-- lib/challenge/preact/preact.go | 5 +- lib/challenge/preact/preact.templ | 6 +-- lib/challenge/preact/preact_templ.go | 8 +-- lib/challenge/proofofwork/proofofwork.go | 2 +- lib/challenge/proofofwork/proofofwork.templ | 8 +-- .../proofofwork/proofofwork_templ.go | 14 +++--- lib/config.go | 6 +-- lib/http.go | 47 ++++++++--------- web/index.go | 50 +++++++++++++++++-- web/index.templ | 26 +++++----- web/index_templ.go | 36 ++++++------- web/index_test.go | 2 +- 18 files changed, 145 insertions(+), 119 deletions(-) diff --git a/lib/anubis.go b/lib/anubis.go index d3d3325d..3b8c0606 100644 --- a/lib/anubis.go +++ b/lib/anubis.go @@ -13,7 +13,6 @@ import ( "net/url" "strconv" "strings" - "sync" "time" "github.com/golang-jwt/jwt/v5" @@ -34,6 +33,7 @@ import ( "github.com/TecharoHQ/anubis/lib/policy" "github.com/TecharoHQ/anubis/lib/policy/checker" "github.com/TecharoHQ/anubis/lib/store" + "github.com/TecharoHQ/anubis/web" iptoasnv1 "github.com/TecharoHQ/thoth-proto/gen/techaro/thoth/iptoasn/v1" // challenge implementations @@ -126,8 +126,6 @@ func (s *Server) getRequestLogger(r *http.Request) (*slog.Logger, *http.Request) return lg, r } -var anubisBasePrefixMu sync.Mutex - func (s *Server) configuredBasePrefix() string { if s.basePrefix != "" { return s.basePrefix @@ -157,17 +155,11 @@ func (s *Server) cookiePath() string { return basePrefix + "/" } -func (s *Server) withAnubisBasePrefix(fn func()) { - anubisBasePrefixMu.Lock() - defer anubisBasePrefixMu.Unlock() - - oldBasePrefix := anubis.BasePrefix - anubis.BasePrefix = s.configuredBasePrefix() - defer func() { - anubis.BasePrefix = oldBasePrefix - }() - - fn() +func (s *Server) renderOptions() web.Options { + return web.Options{ + BasePrefix: s.configuredBasePrefix(), + PublicURL: s.configuredPublicURL(), + } } func (s *Server) getTokenKeyfunc() jwt.Keyfunc { diff --git a/lib/anubis_test.go b/lib/anubis_test.go index 8c97696a..d513aab3 100644 --- a/lib/anubis_test.go +++ b/lib/anubis_test.go @@ -721,7 +721,7 @@ func TestRenderIndexUsesServerBasePrefixNotPackageGlobal(t *testing.T) { t.Fatalf("challenge body used package global base prefix: %q", body.String()) } if anubis.BasePrefix != "/global" { - t.Fatalf("rendering should restore anubis.BasePrefix, got %q", anubis.BasePrefix) + t.Fatalf("rendering should leave anubis.BasePrefix alone, got %q", anubis.BasePrefix) } } diff --git a/lib/challenge/interface.go b/lib/challenge/interface.go index e6d64fd2..4cce31b0 100644 --- a/lib/challenge/interface.go +++ b/lib/challenge/interface.go @@ -44,11 +44,12 @@ func Methods() []string { } type IssueInput struct { - Impressum *config.Impressum - Rule *policy.Bot - Challenge *Challenge - OGTags map[string]string - Store store.Interface + BasePrefix string + Impressum *config.Impressum + Rule *policy.Bot + Challenge *Challenge + OGTags map[string]string + Store store.Interface } func (in *IssueInput) Valid() error { diff --git a/lib/challenge/metarefresh/metarefresh.go b/lib/challenge/metarefresh/metarefresh.go index cb8dbf8c..f274b35c 100644 --- a/lib/challenge/metarefresh/metarefresh.go +++ b/lib/challenge/metarefresh/metarefresh.go @@ -7,7 +7,6 @@ import ( "net/http" "time" - "github.com/TecharoHQ/anubis" "github.com/TecharoHQ/anubis/lib/challenge" "github.com/TecharoHQ/anubis/lib/localization" "github.com/a-h/templ" @@ -28,7 +27,7 @@ func (i *Impl) Issue(w http.ResponseWriter, r *http.Request, lg *slog.Logger, in return nil, err } - u, err := r.URL.Parse(anubis.BasePrefix + "/.within.website/x/cmd/anubis/api/pass-challenge") + u, err := r.URL.Parse(in.BasePrefix + "/.within.website/x/cmd/anubis/api/pass-challenge") if err != nil { return nil, fmt.Errorf("can't render page: %w", err) } @@ -47,7 +46,7 @@ func (i *Impl) Issue(w http.ResponseWriter, r *http.Request, lg *slog.Logger, in loc := localization.GetLocalizer(r) - result := page(u.String(), in.Rule.Challenge.Difficulty, showMeta, loc) + result := page(in.BasePrefix, u.String(), in.Rule.Challenge.Difficulty, showMeta, loc) return result, nil } diff --git a/lib/challenge/metarefresh/metarefresh.templ b/lib/challenge/metarefresh/metarefresh.templ index c074f596..d10dcac6 100644 --- a/lib/challenge/metarefresh/metarefresh.templ +++ b/lib/challenge/metarefresh/metarefresh.templ @@ -7,10 +7,10 @@ import ( "github.com/TecharoHQ/anubis/lib/localization" ) -templ page(redir string, difficulty int, showMeta bool, loc *localization.SimpleLocalizer) { +templ page(basePrefix, redir string, difficulty int, showMeta bool, loc *localization.SimpleLocalizer) {
- { loc.T("loading") }

{ loc.T("connection_security") }

if showMeta { diff --git a/lib/challenge/metarefresh/metarefresh_templ.go b/lib/challenge/metarefresh/metarefresh_templ.go index 59de7dd3..f5a2cdf5 100644 --- a/lib/challenge/metarefresh/metarefresh_templ.go +++ b/lib/challenge/metarefresh/metarefresh_templ.go @@ -15,7 +15,7 @@ import ( "github.com/TecharoHQ/anubis/lib/localization" ) -func page(redir string, difficulty int, showMeta bool, loc *localization.SimpleLocalizer) templ.Component { +func page(basePrefix, redir string, difficulty int, showMeta bool, loc *localization.SimpleLocalizer) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -41,9 +41,9 @@ func page(redir string, difficulty int, showMeta bool, loc *localization.SimpleL return templ_7745c5c3_Err } var templ_7745c5c3_Var2 string - templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(anubis.BasePrefix + "/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" + anubis.Version) + templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(basePrefix + "/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" + anubis.Version) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `metarefresh.templ`, Line: 12, Col: 165} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `metarefresh.templ`, Line: 12, Col: 158} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) if templ_7745c5c3_Err != nil { @@ -54,9 +54,9 @@ func page(redir string, difficulty int, showMeta bool, loc *localization.SimpleL return templ_7745c5c3_Err } var templ_7745c5c3_Var3 string - templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(anubis.BasePrefix + "/.within.website/x/cmd/anubis/static/img/happy.webp?cacheBuster=" + anubis.Version) + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(basePrefix + "/.within.website/x/cmd/anubis/static/img/happy.webp?cacheBuster=" + anubis.Version) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `metarefresh.templ`, Line: 13, Col: 174} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `metarefresh.templ`, Line: 13, Col: 167} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { diff --git a/lib/challenge/preact/preact.go b/lib/challenge/preact/preact.go index e39cd4d8..c959349b 100644 --- a/lib/challenge/preact/preact.go +++ b/lib/challenge/preact/preact.go @@ -10,7 +10,6 @@ import ( "net/http" "time" - "github.com/TecharoHQ/anubis" "github.com/TecharoHQ/anubis/internal" "github.com/TecharoHQ/anubis/lib/challenge" "github.com/TecharoHQ/anubis/lib/localization" @@ -43,7 +42,7 @@ func (i *impl) Issue(w http.ResponseWriter, r *http.Request, lg *slog.Logger, in return nil, err } - u, err := r.URL.Parse(anubis.BasePrefix + "/.within.website/x/cmd/anubis/api/pass-challenge") + u, err := r.URL.Parse(in.BasePrefix + "/.within.website/x/cmd/anubis/api/pass-challenge") if err != nil { return nil, fmt.Errorf("can't render page: %w", err) } @@ -55,7 +54,7 @@ func (i *impl) Issue(w http.ResponseWriter, r *http.Request, lg *slog.Logger, in loc := localization.GetLocalizer(r) - result := page(u.String(), in.Challenge.RandomData, in.Rule.Challenge.Difficulty, loc) + result := page(in.BasePrefix, u.String(), in.Challenge.RandomData, in.Rule.Challenge.Difficulty, loc) return result, nil } diff --git a/lib/challenge/preact/preact.templ b/lib/challenge/preact/preact.templ index ee2cb986..20bdd32d 100644 --- a/lib/challenge/preact/preact.templ +++ b/lib/challenge/preact/preact.templ @@ -5,10 +5,10 @@ import ( "github.com/TecharoHQ/anubis/lib/localization" ) -templ page(redir, challenge string, difficulty int, loc *localization.SimpleLocalizer) { +templ page(basePrefix, redir, challenge string, difficulty int, loc *localization.SimpleLocalizer) {
- { loc.T("loading") }

{ loc.T("connection_security") }

@@ -18,7 +18,7 @@ templ page(redir, challenge string, difficulty int, loc *localization.SimpleLoca "difficulty": difficulty, "connection_security_message": loc.T("connection_security"), "loading_message": loc.T("loading"), - "pensive_url": anubis.BasePrefix + "/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" + anubis.Version, + "pensive_url": basePrefix + "/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" + anubis.Version, }) @templ.ComponentFunc(renderAppJS)