diff options
| author | Ryan Cao <70191398+ryanccn@users.noreply.github.com> | 2025-04-18 04:06:37 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-18 00:06:37 -0400 |
| commit | f844dba3dcfc0c51bcc72bfe9707ceec0c09b7ed (patch) | |
| tree | dda8006379d358741d0d679c860cb0627b3b6090 /lib | |
| parent | 736c3ade0944532690098c4f8a7fab0d92420a09 (diff) | |
| download | anubis-f844dba3dcfc0c51bcc72bfe9707ceec0c09b7ed.tar.xz anubis-f844dba3dcfc0c51bcc72bfe9707ceec0c09b7ed.zip | |
perf: embed challenge data in HTML (#279)
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/anubis.go | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/lib/anubis.go b/lib/anubis.go index 6fd18a5..353fe63 100644 --- a/lib/anubis.go +++ b/lib/anubis.go @@ -263,21 +263,21 @@ func (s *Server) MaybeReverseProxy(w http.ResponseWriter, r *http.Request) { if err != nil { lg.Debug("cookie not found", "path", r.URL.Path) s.ClearCookie(w) - s.RenderIndex(w, r) + s.RenderIndex(w, r, cr, rule) return } if err := ckie.Valid(); err != nil { lg.Debug("cookie is invalid", "err", err) s.ClearCookie(w) - s.RenderIndex(w, r) + s.RenderIndex(w, r, cr, rule) return } if time.Now().After(ckie.Expires) && !ckie.Expires.IsZero() { lg.Debug("cookie expired", "path", r.URL.Path) s.ClearCookie(w) - s.RenderIndex(w, r) + s.RenderIndex(w, r, cr, rule) return } @@ -288,7 +288,7 @@ func (s *Server) MaybeReverseProxy(w http.ResponseWriter, r *http.Request) { if err != nil || !token.Valid { lg.Debug("invalid token", "path", r.URL.Path, "err", err) s.ClearCookie(w) - s.RenderIndex(w, r) + s.RenderIndex(w, r, cr, rule) return } @@ -303,7 +303,7 @@ func (s *Server) MaybeReverseProxy(w http.ResponseWriter, r *http.Request) { if !ok { lg.Debug("invalid token claims type", "path", r.URL.Path) s.ClearCookie(w) - s.RenderIndex(w, r) + s.RenderIndex(w, r, cr, rule) return } challenge := s.challengeFor(r, rule.Challenge.Difficulty) @@ -311,7 +311,7 @@ func (s *Server) MaybeReverseProxy(w http.ResponseWriter, r *http.Request) { if claims["challenge"] != challenge { lg.Debug("invalid challenge", "path", r.URL.Path) s.ClearCookie(w) - s.RenderIndex(w, r) + s.RenderIndex(w, r, cr, rule) return } @@ -328,7 +328,7 @@ func (s *Server) MaybeReverseProxy(w http.ResponseWriter, r *http.Request) { lg.Debug("invalid response", "path", r.URL.Path) failedValidations.Inc() s.ClearCookie(w) - s.RenderIndex(w, r) + s.RenderIndex(w, r, cr, rule) return } @@ -337,21 +337,36 @@ func (s *Server) MaybeReverseProxy(w http.ResponseWriter, r *http.Request) { s.next.ServeHTTP(w, r) } -func (s *Server) RenderIndex(w http.ResponseWriter, r *http.Request) { +func (s *Server) RenderIndex(w http.ResponseWriter, r *http.Request, cr CheckResult, rule *policy.Bot) { + lg := slog.With( + "user_agent", r.UserAgent(), + "accept_language", r.Header.Get("Accept-Language"), + "priority", r.Header.Get("Priority"), + "x-forwarded-for", + r.Header.Get("X-Forwarded-For"), + "x-real-ip", r.Header.Get("X-Real-Ip"), + ) + + challenge := s.challengeFor(r, rule.Challenge.Difficulty) + var ogTags map[string]string = nil if s.opts.OGPassthrough { var err error ogTags, err = s.OGTags.GetOGTags(r.URL) if err != nil { - slog.Error("failed to get OG tags", "err", err) + lg.Error("failed to get OG tags", "err", err) ogTags = nil } } - handler := internal.NoStoreCache( - templ.Handler( - web.BaseWithOGTags("Making sure you're not a bot!", web.Index(), ogTags), - ), - ) + + component, err := web.BaseWithChallengeAndOGTags("Making sure you're not a bot!", web.Index(), challenge, rule.Challenge, ogTags) + if err != nil { + lg.Error("render failed", "err", err) + templ.Handler(web.Base("Oh noes!", web.ErrorPage("Other internal server error (contact the admin)", s.opts.WebmasterEmail)), templ.WithStatus(http.StatusInternalServerError)).ServeHTTP(w, r) + return + } + + handler := internal.NoStoreCache(templ.Handler(component)) handler.ServeHTTP(w, r) } |
