audit 4: a deleted domain says so, the Outbound log filters by status and day
test / test (push) Canceled after 0s

L17: past DeleteDomain both rebuilds run, their errors joined under
domain.ErrDeletedIncomplete; the key is removed only when OpenDKIM's tables
were rebuilt (they may still name it otherwise); the domain list says the
domain is deleted and that Reload configuration finishes it, not "internal
error". Tests in domain (the tables failing, the sender map failing) and
handlers.

The Outbound log's status and day filters (owner, 2026-10-13; the mockup
first, 80e3979): view.OutLogFilter carried by the poll, the pages, the rows'
links and the message's way back; SendLogFilter.Status, Since, Until (whole
UTC days, as the Inbound log's); rejected is the three refusals together; a
status not in the list is no narrowing. Tests: the filters through the
handler, the poll and the way back; the day boundaries in store.

The plan's milter-socket step is ticked: done in 2.5.2 (98e09fe).

Tested on the test server: go vet + go test of 25 packages, make e2e (all
pass, 642 s) on this tree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mix
2026-10-15 11:34:24 +03:00
co-authored by Claude Opus 5.5
parent 80e3979748
commit 2b8e0c086d
15 changed files with 378 additions and 52 deletions
+24 -3
View File
@@ -1237,9 +1237,14 @@ command whose leftover is the owner's alone.
`HandleReload` covers what the restore's Resync covers, the filter lists
and the DMARC maps included, and a failed step is an error flash on
Health naming it.
- [ ] `domain.Service.Delete`: say the domain is deleted when a later step fails,
- [x] `domain.Service.Delete`: say the domain is deleted when a later step fails,
and run `apps.Resync()` anyway. — **Opus**
- [ ] **A status filter and a day filter in the Outbound log** (owner, 2026-10-13, from the
*Done 2026-10-15:* past `DeleteDomain` both rebuilds run and the errors
join under `domain.ErrDeletedIncomplete`; the key is removed only when
the tables were rebuilt (they may still name it otherwise). The domain
list says "Domain X deleted, but …; run Reload configuration" (500) -
which since the step above rewrites everything.
- [x] **A status filter and a day filter in the Outbound log** (owner, 2026-10-13, from the
Not done list of from-header-binding). The mockup `out-log` has drawn a
third list since the redesign and the built log never had it; the Inbound
log has its counterpart built (domain, decision, day). One list: *Any
@@ -1251,7 +1256,16 @@ command whose leftover is the owner's alone.
commit). And a filter by day, as the Inbound log has it (owner, the same
day): the same control, drawn in the mockup first. Both filters survive
paging and the rows' polling. - **Sonnet**
- [ ] **Milter sockets: "Listening" is asked of the socket** (owner,
*Done 2026-10-15:* `design:` commit (the list corrected, the two dates),
then `view.OutLogFilter` (domain, app, status, from, to) carried by the
poll, the pages, the rows' links and the message's way back;
`SendLogFilter.Status`, `Since`, `Until` (whole UTC days, as the
Inbound log's). A status not in the list is no narrowing. Plans: a
domain user's filtered page still goes by `idx_send_log_domain_id`; the
global role's status-only count walks the table (a page view or a 5 s
poll while the log is open on a status - tens of thousands of rows at
the retention limit, milliseconds), accepted.
- [x] **Milter sockets: "Listening" is asked of the socket** (owner,
2026-10-13, from the Not done list of from-header-binding).
`health.CheckSocket` ([socket.go](../internal/health/socket.go)) stats the
file and writes "Listening"; a process that died and left its socket
@@ -1262,6 +1276,13 @@ command whose leftover is the owner's alone.
byte ends the sender check (security.md § Accepted risks: the milter
library panics on an empty packet) - if it does, that is fixed first, in
this step. A test with a socket file nobody listens on. - **Opus**
*Done in 2.5.2 (stage 2c, `98e09fe`), ticked here 2026-10-15:*
`health.CheckSocket` dials and closes; a refused connection says nobody
answers, a refused permission is Unknown; a connection closed without a
byte ends a milter session quietly on both sides (libmilter's
`mi_rd_cmd`, go-milter v0.4.1 `HandleMilterCommands` on `io.EOF` - the
comment on CheckSocket cites them). The socket nobody listens on is
`milter_test.go`.
- [ ] **The `cards` layout takes its phone order from the box's number**
(owner, 2026-10-13, from the Not done list of from-header-binding). The
order on a phone is written in `panel.css` for four boxes to a stack