diff --git a/docs/plans/panel-dkim-signing.md b/docs/plans/panel-dkim-signing.md index a21e64a..fdc923a 100644 --- a/docs/plans/panel-dkim-signing.md +++ b/docs/plans/panel-dkim-signing.md @@ -126,27 +126,35 @@ Decided here (technical, the owner may overrule): ## Stages -### Stage 1 - the signer, beside OpenDKIM (no release) +### Stage 1 - the signer, beside OpenDKIM (no release) - done `14de9a0` -- [ ] `internal/milter/sign.go`: the session (Connect, MailFrom with +- [x] `internal/milter/sign.go`: the session (Connect, MailFrom with `{auth_authen}`, Header, Headers, BodyChunk, Body), `OptHeaderLeadingSpace`, `InsertHeader(0, "DKIM-Signature", ...)` (the server's `Actions` gain add-header), the key read per message from the key file (a small cache keyed by path and mtime), the selector from the store as `Record` reads it. -- [ ] Unit tests: sign and verify with go-msgauth; folded and tab-led +- [x] Unit tests: sign and verify with go-msgauth; folded and tab-led headers; a header absent and present twice; an empty body; a body without a final newline; a login with no domain and a missing key file answer tempfail; the server's socket never signs with a domain's key. -- [ ] `cmd/panel`: the role, its two sockets (`listenMilter`, group +- [x] `cmd/panel`: the role, its two sockets (`listenMilter`, group selfpost, 0660), the wrapper waits for them. -- [ ] `build/postfix-config.sh`: `smtpd_milters` = sender, sign, OpenDKIM, +- [x] `build/postfix-config.sh`: `smtpd_milters` = sender, sign, OpenDKIM, journal (OpenDKIM kept for the cross-check); `non_smtpd_milters` = sign-local, OpenDKIM; `disable_mime_output_conversion=yes`. -- [ ] e2e: dkimpy in the stand; every positive send and the notification +- [x] e2e: dkimpy in the stand; every positive send and the notification verified by dkimpy against the panel's signature; the panel's and OpenDKIM's `bh=`/`h=` compared. +*Done (2026-10-15, `14de9a0`):* e2e exit 0 on the server; on an +application's message and on a notification the panel's and OpenDKIM's +signatures agree on `h=`, `bh=`, `c=`, `s=`, `a=` and dkimpy verifies both. +Two findings while writing it: a folded header reaches a milter +` +`-separated (the signer rebuilds CRLF), and go-milter calls no Abort on a +dropped connection (a one-hour watchdog closes the signer). + ### Stage 2 - OpenDKIM removed (no release) - [ ] Chain: OpenDKIM out of both milter lists. diff --git a/docs/roadmap.md b/docs/roadmap.md index 3e7f354..12c0e33 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -44,7 +44,7 @@ in `git log` and [CHANGELOG.md](../CHANGELOG.md). | own-mta-builds | Analysis: build Postfix and OpenDKIM ourselves, patched, instead of Debian's packages | analysed 2026-10-15: no own builds; three rows proposed instead | — | [own-mta-builds-2026-10-15.md](own-mta-builds-2026-10-15.md) | | port25-bare-newline | The inbound relay's port 25 refuses bare newlines in DATA (`smtpd_forbid_bare_newline=normalize`) | shipped `2.6.1` | — | — | | base-trixie | The image's base from Debian bookworm (LTS since 2026-07-12) to trixie: Postfix 3.10 with the 2026 security batches | shipped `2.7.0` | — | — | -| panel-dkim-signing | DKIM signing in the panel's own milter; OpenDKIM, the syslog relay and the parser port removed | agreed (2026-10-15; plan agreed, next) | 0/14 | [plans/panel-dkim-signing.md](plans/panel-dkim-signing.md) | +| panel-dkim-signing | DKIM signing in the panel's own milter; OpenDKIM, the syslog relay and the parser port removed | agreed (2026-10-15; stage 1 done) | 5/14 | [plans/panel-dkim-signing.md](plans/panel-dkim-signing.md) | | phone-desktop-mode | A phone browser in "desktop site" mode gets the phone navigation | agreed (2026-10-13: after stages 1 and 2 of audit-2026-10-12) | — | — | | from-header-binding | Hold a message's `From:` header against the application that sends it | shipped `2.4.0` | 9/9 | [plans/from-header-binding.md](plans/from-header-binding.md) | | panel-redesign | Panel redesign (accepted mockups, design contract) | shipped `2.0.0` | 27/27 | [plans/panel-redesign.md](plans/panel-redesign.md) |