test / test (push) Has been cancelled
Found running the new checkPort25ConfigCombinations on selfpost.mixfed.ru: it compared against raw, unnormalized master.cf text. postconf -F "*/*/chroot=n" (unconditional, runs after our smtp/inet edits) rewraps the whole file using master.cf's own line-continuation convention, splitting a single -o value across lines and re-flowing what were separate -o lines into one paragraph. Valid Postfix syntax -- postfix check passes -- but plain substring matching against the raw text broke on it. parseSMTPInetOptions now joins continuation lines into one token stream and reconstructs each "-o param=value" assignment before comparing, verified against a real captured stanza in port25_config_check_test.go. Full make e2e (13 scenarios plus the two new parser unit tests) is green on the server. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
63 lines
2.5 KiB
Go
63 lines
2.5 KiB
Go
package e2e
|
|
|
|
import "testing"
|
|
|
|
// realMasterCfSample is captured verbatim (via `cat -A`) from a container
|
|
// generated with INBOUND_RELAY_ENABLE=false DMARC_REPORTS_ENABLE=true: after
|
|
// the unconditional `postconf -F "*/*/chroot=n"` rewraps the file, the
|
|
// smtp/inet stanza's options are spread across several continuation lines
|
|
// that split values mid-token and re-flow what were originally separate
|
|
// "-o " lines into one paragraph. Confirms parseSMTPInetOptions reconstructs
|
|
// the logical options from that rather than a plain single-option-per-line
|
|
// master.cf.
|
|
const realMasterCfSample = `smtp inet n - n - - smtpd
|
|
-o smtpd_milters=
|
|
-o smtpd_recipient_restrictions=check_recipient_access
|
|
texthash:/data/postfix/dmarc_recipients,reject -o smtpd_sasl_auth_enable=no
|
|
-o smtpd_tls_auth_only=no -o smtpd_sender_login_maps= -o
|
|
smtpd_sender_restrictions= -o smtpd_client_restrictions= -o
|
|
smtpd_relay_restrictions=reject_unauth_destination -o
|
|
smtpd_client_message_rate_limit=20 -o message_size_limit=5242880
|
|
pickup unix n - n 60 1 pickup
|
|
`
|
|
|
|
func TestParseSMTPInetOptionsAcrossContinuationLines(t *testing.T) {
|
|
stanza := smtpInetStanza(realMasterCfSample)
|
|
opts := parseSMTPInetOptions(stanza)
|
|
|
|
want := map[string]string{
|
|
"smtpd_milters": "",
|
|
"smtpd_recipient_restrictions": "check_recipient_access texthash:/data/postfix/dmarc_recipients,reject",
|
|
"smtpd_sasl_auth_enable": "no",
|
|
"smtpd_tls_auth_only": "no",
|
|
"smtpd_sender_login_maps": "",
|
|
"smtpd_sender_restrictions": "",
|
|
"smtpd_client_restrictions": "",
|
|
"smtpd_relay_restrictions": "reject_unauth_destination",
|
|
"smtpd_client_message_rate_limit": "20",
|
|
"message_size_limit": "5242880",
|
|
}
|
|
for param, wantVal := range want {
|
|
if got, ok := opts[param]; !ok || got != wantVal {
|
|
t.Errorf("opts[%q] = %q (present=%v), want %q", param, got, ok, wantVal)
|
|
}
|
|
}
|
|
if len(opts) != len(want) {
|
|
t.Errorf("parsed %d options, want %d: %+v", len(opts), len(want), opts)
|
|
}
|
|
}
|
|
|
|
func TestSMTPInetStanzaSkipsDeliveryAgent(t *testing.T) {
|
|
master := "smtp unix - - n - - smtp\n" +
|
|
"# -o smtp_helo_timeout=5\n" +
|
|
realMasterCfSample
|
|
stanza := smtpInetStanza(master)
|
|
if stanza == "" {
|
|
t.Fatal("no smtp/inet stanza found")
|
|
}
|
|
opts := parseSMTPInetOptions(stanza)
|
|
if v, ok := opts["smtpd_milters"]; !ok || v != "" {
|
|
t.Fatalf("picked up the wrong \"smtp\" service: opts = %+v", opts)
|
|
}
|
|
}
|