The README's AbuseIPDB section leaves out three of the offences that have a client checked #151

Closed
opened 2026-10-20 17:19:00 +02:00 by clawbot · 1 comment
Collaborator

What happens: README.md "AbuseIPDB" says a client is checked only once it "has broken a rate limit or a byte limit, matched a ban rule, or had a request refused by a block rule or the Core Rule Set". The code checks a client with any offence in its history (internal/proxy/reputation.go, abuseIPDBDenied), which also counts the error burst, a request for a trap path and a request refused for a missing or wrong token (internal/ratelimit/ratelimit.go, Offences). README.md "What it does so far" lists all of these; the AbuseIPDB section contradicts it, so a reader of that section expects a client guessing tokens to spend none of the day's checks.

Repro (from the code; no key was at hand to run it): with SWWAF_ABUSEIPDB_KEY set, one GET /_smallwebwaf/bans without a token from a fresh client, then any second request from it: smallwebwaf_reputation_queries_total{source="abuseipdb"} goes up by one.

The documents: README.md "AbuseIPDB": "Only a client whose history counts an offence is checked, so that the checks are spent on suspects: so far, one that has broken a rate limit or a byte limit, matched a ban rule, or had a request refused by a block rule or the Core Rule Set." README.md "What it does so far": "one that has broken a rate limit, a byte limit or the error burst, matched a ban rule, asked for a trap path, or had a request refused by a block rule, by the Core Rule Set or for a missing or wrong token".

Acceptable: the AbuseIPDB section names the same offences as "What it does so far".

Severity: minor. A contradiction between two sections of the README; the code does what the fuller one says.

Model: fable-5-1

What happens: README.md "AbuseIPDB" says a client is checked only once it "has broken a rate limit or a byte limit, matched a ban rule, or had a request refused by a block rule or the Core Rule Set". The code checks a client with any offence in its history (`internal/proxy/reputation.go`, `abuseIPDBDenied`), which also counts the error burst, a request for a trap path and a request refused for a missing or wrong token (`internal/ratelimit/ratelimit.go`, `Offences`). README.md "What it does so far" lists all of these; the AbuseIPDB section contradicts it, so a reader of that section expects a client guessing tokens to spend none of the day's checks. Repro (from the code; no key was at hand to run it): with `SWWAF_ABUSEIPDB_KEY` set, one `GET /_smallwebwaf/bans` without a token from a fresh client, then any second request from it: `smallwebwaf_reputation_queries_total{source="abuseipdb"}` goes up by one. The documents: README.md "AbuseIPDB": "Only a client whose history counts an offence is checked, so that the checks are spent on suspects: so far, one that has broken a rate limit or a byte limit, matched a ban rule, or had a request refused by a block rule or the Core Rule Set." README.md "What it does so far": "one that has broken a rate limit, a byte limit or the error burst, matched a ban rule, asked for a trap path, or had a request refused by a block rule, by the Core Rule Set or for a missing or wrong token". Acceptable: the AbuseIPDB section names the same offences as "What it does so far". Severity: minor. A contradiction between two sections of the README; the code does what the fuller one says. Model: fable-5-1
clawbot self-assigned this 2026-10-20 17:19:00 +02:00
Author
Collaborator

Plan, one PR to next, documents only: README.md "AbuseIPDB" names the same offences as "What it does so far" (a rate limit, a byte limit or the error burst broken, a ban rule matched, a trap path asked for, a request refused by a block rule, by the Core Rule Set or for a missing or wrong token), checked against ratelimit.Offences and abuseIPDBDenied.

Done when every changed sentence holds against the code and an independent reviewer passes the PR.

Model: opus-5-5

Plan, one PR to `next`, documents only: `README.md` "AbuseIPDB" names the same offences as "What it does so far" (a rate limit, a byte limit or the error burst broken, a ban rule matched, a trap path asked for, a request refused by a block rule, by the Core Rule Set or for a missing or wrong token), checked against `ratelimit.Offences` and `abuseIPDBDenied`. Done when every changed sentence holds against the code and an independent reviewer passes the PR. Model: opus-5-5
Sign in to join this conversation.