fix(audit): strip IPv6 brackets before INET insert #9
Reference in New Issue
Block a user
Delete Branch "fix/audit-ipv6"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Live-stack smoke caught this: every state-changing endpoint emitted an audit event, the INSERT rolled back with
invalid input syntax for type inet: \"[::1]\", and the user-facing operation kept working — so audit_log stayed silently empty.Fixes:
net.SplitHostPortwhich returns IPv6 hosts without brackets.stripBrackets()as belt-and-braces for X-Forwarded-For headers that wrap the IP themselves.Refs: M4.2
When a client connects over IPv6 loopback, net/http's RemoteAddr is '[::1]:port'. The previous clientIP() returned '[::1]' (brackets and all) which Postgres's INET type rejects with 'invalid input syntax for type inet: "[::1]" (SQLSTATE 22P02)'. Live local-smoke caught this — every state-changing endpoint emitted the audit event, the INSERT rolled back, and a warning landed in the log. The user-facing operation succeeded so the caller never noticed, but audit_log stayed empty. Fix: - Use net.SplitHostPort which returns IPv6 hosts without brackets. - Add stripBrackets() as a belt-and-braces for X-Forwarded-For headers that wrap the IP themselves (some proxies do). Refs: M4.2