sender check: the sender map read and looked up as Postfix does it
Postfix 3.7.11 takes the owners of the first key mail_addr_find() finds -
the address, then without its extension, then @domain, each tried only
when the one before is absent (src/global/mail_addr_find.c,
mail_addr_find_opt()) - and compares the login with them by
strcasecmp_utf8() (src/smtpd/smtpd_check.c,
reject_auth_sender_login_mismatch()). The check accepted a From: address
when any of the three keys named the application: an application holding
@domain could write an address listed for another application of the
domain, which Postfix refuses it in the envelope, and have it signed
(assumptions B-PS1).
The table is now read as dict_thash_open() reads it: continuation lines,
owners split on commas and blanks (B-PS4), the key ending at the first
blank outside quotes, keys folded; a key given twice makes Postfix refuse
the whole table (no DICT_FLAG_DUP_* flag), and the check then defers too.
The writer folds keys, so two cases of one address cannot be two lines.
e2e on the stand (2026-10-14, make e2e, exit 0): the wildcard application
is refused billing@ - listed for app-list - in From: (550 5.7.1), and in
the envelope by Postfix at RCPT ("553 5.7.1 <billing@...>: Sender address
rejected: not owned by user"). go vet and go test ./... pass on the
server (23 packages).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+10
-4
@@ -242,10 +242,16 @@ server itself.
|
||||
its domain may write any address of that domain, and one with a list only
|
||||
the listed ones; everything else is refused - another registered domain,
|
||||
the server's name, a domain the server knows nothing of. One table for
|
||||
both senders and one lookup: the address, the address without its
|
||||
`+extension` (`recipient_delimiter`, which `build/postfix-config.sh` sets
|
||||
for that reason), then the domain. Postfix compares logins without regard
|
||||
to case and the check as written, which is how the panel writes them.
|
||||
both senders, read as Postfix reads a texthash table and looked up as
|
||||
Postfix looks it up: the address, the address without its `+extension`
|
||||
(`recipient_delimiter`, which `build/postfix-config.sh` sets for that
|
||||
reason), then `@domain` - and the **first of these keys in the table
|
||||
decides**, its owners alone: an address listed for one application is not
|
||||
open to another that holds the whole domain. Logins are compared without
|
||||
regard to case, as Postfix compares them (Postfix 3.7.11,
|
||||
`src/smtpd/smtpd_check.c`, `reject_auth_sender_login_mismatch()`, over
|
||||
`src/global/mail_addr_find.c`, `mail_addr_find_opt()`). A key written
|
||||
twice makes Postfix refuse the whole table, and the check defers then too.
|
||||
- **How the header is read.** Exactly one `From:` field (none, or more than
|
||||
one, is refused), parsed as an address list that must hold exactly one
|
||||
address. Then a cruder second look at the raw value: OpenDKIM finds the
|
||||
|
||||
Reference in New Issue
Block a user