feat: use resolved client IP in request and auth logs
Add a ClientIP middleware that resolves the client address once per request and stores it in the context, placed ahead of logging in the route chain. The request-logging middleware and both login-attempt logs now read the resolved address instead of the raw peer. Behind a trusted proxy these records show the real client; a direct, untrusted client still shows its own address and cannot forge one. Removes the local host:port helper now that the clientip package owns that parsing. Model: opus-4-8
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"sneak.berlin/go/pixa/internal/clientip"
|
||||
"sneak.berlin/go/pixa/internal/encurl"
|
||||
"sneak.berlin/go/pixa/internal/imgcache"
|
||||
"sneak.berlin/go/pixa/internal/templates"
|
||||
@@ -47,7 +48,8 @@ func (s *Handlers) handleLoginPost(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// Constant-time comparison to prevent timing attacks
|
||||
if subtle.ConstantTimeCompare([]byte(submittedKey), []byte(s.config.SigningKey)) != 1 {
|
||||
s.log.Warn("failed login attempt", "remote_addr", r.RemoteAddr)
|
||||
s.log.Warn("failed login attempt",
|
||||
"remote_addr", clientip.FromContext(r.Context()))
|
||||
s.renderLogin(w, r, "Invalid signing key")
|
||||
|
||||
return
|
||||
@@ -62,7 +64,8 @@ func (s *Handlers) handleLoginPost(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
s.log.Info("successful login", "remote_addr", r.RemoteAddr)
|
||||
s.log.Info("successful login",
|
||||
"remote_addr", clientip.FromContext(r.Context()))
|
||||
|
||||
// Redirect to generator page
|
||||
http.Redirect(w, r, "/", http.StatusSeeOther)
|
||||
|
||||
Reference in New Issue
Block a user