From f1d82d3e9a6c41d06ca4369e839db90ab21093eb Mon Sep 17 00:00:00 2001 From: scanash00 Date: Sun, 25 Jan 2026 00:26:52 -0900 Subject: [PATCH] Implement a privacy logger --- backend/cmd/server/main.go | 3 +- backend/internal/middleware/logger.go | 46 +++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 backend/internal/middleware/logger.go diff --git a/backend/cmd/server/main.go b/backend/cmd/server/main.go index f513fdc..ee3034f 100644 --- a/backend/cmd/server/main.go +++ b/backend/cmd/server/main.go @@ -19,6 +19,7 @@ import ( "margin.at/internal/api" "margin.at/internal/db" "margin.at/internal/firehose" + internalMiddleware "margin.at/internal/middleware" "margin.at/internal/oauth" "margin.at/internal/sync" ) @@ -55,7 +56,7 @@ func main() { r := chi.NewRouter() - r.Use(middleware.Logger) + r.Use(internalMiddleware.PrivacyLogger) r.Use(middleware.Recoverer) r.Use(middleware.RequestID) r.Use(middleware.RealIP) diff --git a/backend/internal/middleware/logger.go b/backend/internal/middleware/logger.go new file mode 100644 index 0000000..6717ea9 --- /dev/null +++ b/backend/internal/middleware/logger.go @@ -0,0 +1,46 @@ +package middleware + +import ( + "log" + "net/http" + "net/url" + "time" + + "github.com/go-chi/chi/v5/middleware" +) + +func PrivacyLogger(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) + t1 := time.Now() + + defer func() { + safeURL := redactURL(r.URL) + + log.Printf("[%d] %s %s %s", + ww.Status(), + r.Method, + safeURL, + time.Since(t1), + ) + }() + + next.ServeHTTP(ww, r) + }) +} + +func redactURL(u *url.URL) string { + redacted := *u + q := redacted.Query() + + sensitiveKeys := []string{"source", "url", "target", "parent", "root", "uri"} + + for _, key := range sensitiveKeys { + if q.Has(key) { + q.Set(key, "[REDACTED]") + } + } + + redacted.RawQuery = q.Encode() + return redacted.String() +} -- 2.51.2