docs(email-ingress): operator guide + threat-model integration tests (LC-77) #199
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/lc-77-docs"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Closer PR for the LC-77 v1 scope. With this merged, the email-ingress feature ships with an operator-facing deployment guide and a dedicated threat-model integration test suite that anchors the named invariants from the parent brainstorm.
What changed
docs/email-ingress.md(new): operator deployment guide. Covers what the feature is (and isn't), the threat model in operator terms, the load-bearing header-precedence requirement (Delivered-To/X-Original-To/To/Cc), step-by-step setup, the full failure-log taxonomy as a diagnostic table, limits, the "Not supported (deferred)" section naming the four scoped-out followup tickets, plus privacy + security notes. ~250 lines. Designed so an operator hittingreason=address_no_matchin the server logs can diagnose without reading code.tests/email_ingress_threat_model.rs(new): 8 dedicated tests that pin the named threat-model lines from the parent brainstorm in one place so the security review can find them. Each test docstring quotes the invariant it anchors. The same surfaces are covered piecemeal inemail_ingress_process.rsandemail_ingress_attachments.rs; this file consolidates the load-bearing assertions.README.md: one-line mention of email ingress under Integrations with a link to the operator docs.CLAUDE.md: new "Email ingress (LC-77)" section pointing at the operator docs + naming the spawn gate + the named link-filter-skip decision.Threat-model tests anchored in this PR
forged_from_still_posts_as_inbox_actorraw_html_never_appears_in_stored_body<script/onerror=/<img/</scriptever reaches the stored body.unknown_secret_silent_drop_no_message_rowloop_headers_drop_consistentlyauto_submitted_no_does_not_drop_but_anything_else_doesrevoked_inbox_post_revoke_silent_drop_no_message_rowtoken_at_wrong_domain_fails_to_resolveaddress_no_match_drop_detail_carries_tried_addressesPlan position after this merge
Followups (not in scope)
Four tickets to file after this PR merges, all already named in
docs/email-ingress.md's "Not supported (deferred)" section:settings.dbto the same VAPID-sealed pattern this PR's IMAP password uses.Test plan
email_ingress_threat_model.rspass.--features standaloneand--no-default-features --features saas.cargo clippy --tests -- -D warningsclean.cargo fmt --checkclean.email_ingress::resolve::HEADER_ORDERactually checks, the failure-log table matches theDropReasonenum field-for-field, the limits table matches the constants inparse.rs+poll.rs+attachments.rs.