Follows the design commit before it (owner's words quoted there). The lists' tables are Value, Kind, Matched and Remove. The kind tag opens the entry's sheet: note, day added, how often it decided a message in the days the log keeps, and the last match. Matches are read off the journal on each view, nothing is stored (inbound.Lists.Usage, store.ListSpamListHits). A row counts for an entry when the list decided the message - a rejected row whose reply is the deny rule's message, an accepted row whose verdict carries the allow rule's symbol for that kind - and the entry fits the row's sender or client address the way rspamd matches it: an address whole, a domain as the sender's domain, a network containing the client (an IPv4-mapped address as IPv4). A failure to count shows the lists with "never" and logs why. For that the journal milter keeps the lists' own symbols ahead of its six-symbol cap: rspamd writes symbols heaviest first, so an allow entry's -100 came last and was cut behind any six others. The plan gains "Filter list usage": what counting from the journal implies, and - the owner asked for it in writing - the conditions under which a counter kept with each entry becomes worth a migration (the journal cut by its row cap and not by age; a short retention; counts that must outlive the journal; a slow page). multimap.conf says which of its texts SelfPost reads back. Tests: Usage over every kind on both lists and the rows that are nobody's; the milter's symbol order; the store query; the page and its sheets; a handler test from journal rows to the numbers on the page. Seen: the fixture page with a sheet open, headless Edge at 1360 px - the same as the accepted drawing. Checked on the test server, uncommitted tree: go vet ./... ok, go test ./... ok (22 packages), make e2e ok. Not seen in a real run: a count above zero. It needs an entry added in the panel, which I cannot sign in to, and then mail that the list decides; in particular the deny rule's message arriving in mail.log as the reply of a milter-reject line is what the trial with rspamc showed, not yet what Postfix logged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
2.1 KiB
Plaintext
64 lines
2.1 KiB
Plaintext
# Mounted into the sidecar as /etc/rspamd/local.d/multimap.conf.
|
|
#
|
|
# The allow and deny lists kept in the panel (Inbound > Filter lists). SelfPost
|
|
# writes them as six files under data/antispam/, which the fragment mounts at
|
|
# /etc/rspamd/selfpost; rspamd rereads a file when it changes, no restart.
|
|
#
|
|
# Deny wins over allow, whichever entries match. A denied sender is refused
|
|
# before anything else is looked at (a prefilter). An allowed one is not
|
|
# accepted outright - rspamd would then let whichever of the two rules ran
|
|
# first decide - but given a weight no spam score outweighs, which a refusal
|
|
# by the deny list still overrides.
|
|
#
|
|
# A domain entry is that domain, not its subdomains.
|
|
#
|
|
# SelfPost counts how often an entry decided a message by what these rules
|
|
# leave behind: the deny message below and the names of the allow symbols.
|
|
# Change either and Inbound > Filter lists shows "never" for every entry.
|
|
|
|
SELFPOST_DENY_IP {
|
|
type = "ip";
|
|
map = "/etc/rspamd/selfpost/deny_ip.map";
|
|
prefilter = true;
|
|
action = "reject";
|
|
message = "Refused by this server's deny list";
|
|
description = "Client address on the deny list";
|
|
}
|
|
SELFPOST_DENY_FROM {
|
|
type = "from";
|
|
map = "/etc/rspamd/selfpost/deny_from.map";
|
|
prefilter = true;
|
|
action = "reject";
|
|
message = "Refused by this server's deny list";
|
|
description = "Sender address on the deny list";
|
|
}
|
|
SELFPOST_DENY_DOMAIN {
|
|
type = "from";
|
|
filter = "email:domain";
|
|
map = "/etc/rspamd/selfpost/deny_domain.map";
|
|
prefilter = true;
|
|
action = "reject";
|
|
message = "Refused by this server's deny list";
|
|
description = "Sender domain on the deny list";
|
|
}
|
|
|
|
SELFPOST_ALLOW_IP {
|
|
type = "ip";
|
|
map = "/etc/rspamd/selfpost/allow_ip.map";
|
|
score = -100.0;
|
|
description = "Client address on the allow list";
|
|
}
|
|
SELFPOST_ALLOW_FROM {
|
|
type = "from";
|
|
map = "/etc/rspamd/selfpost/allow_from.map";
|
|
score = -100.0;
|
|
description = "Sender address on the allow list";
|
|
}
|
|
SELFPOST_ALLOW_DOMAIN {
|
|
type = "from";
|
|
filter = "email:domain";
|
|
map = "/etc/rspamd/selfpost/allow_domain.map";
|
|
score = -100.0;
|
|
description = "Sender domain on the allow list";
|
|
}
|