diff options
| author | Danilo M. <danix@danix.xyz> | 2026-09-09 09:47:51 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-09-09 09:47:51 +0200 |
| commit | 745473b0edecc16915f761b15e58b23bc5bd69b9 (patch) | |
| tree | 08565af9a952603047f45e8082fb0d990e996e70 /LICENSE | |
| parent | 7fbd109ed8e00ca1184015ba50c30ee92cce1ad8 (diff) | |
| download | abusectl-745473b0edecc16915f761b15e58b23bc5bd69b9.tar.gz abusectl-745473b0edecc16915f761b15e58b23bc5bd69b9.zip | |
fix: keep ":" literal so an IPv6 query is not over-encoded
6d5822b quoted the interpolated component with safe="", which encoded the
colons of every IPv6 address: 2001:db8::1 went on the wire as
2001%3Adb8%3A%3A1.
RFC 9082 specifies the IPv6 object path segment as the address in its text
form, and RFC 3986 pchar permits ":" in a segment, so the colon must stay
literal. The failure mode was the bad one for this tool: a registry that
does not normalise before matching answers 404, which reads here as "this
netblock publishes no abuse desk" rather than "we asked the wrong
question", losing the abuse contact silently on exactly the IPv6 hops the
tool exists to report.
safe=":" keeps everything the original commit was for. "/" is still
encoded, so the traversal containment is unchanged, and "%" is still
encoded, so a scope id stays contained.
The regression got through because the happy-path guard used an IPv4
address only. The new test asserts a documentation-range IPv6 address
round-trips into the URL unencoded.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wrfqr2xqQfhtXCscU7zrdz
Diffstat (limited to 'LICENSE')
0 files changed, 0 insertions, 0 deletions
