Problem/Motivation
Operator export, history erasure and hard-bounce recovery already write a local postmark_operator_audit row (action, hashed subject, uid, optional target). Sites that already run audit_chain have no tamper-evident copy of those actions.
Webhook intake is high-frequency and must not be written to the chain.
Proposed resolution
Optional File Gate-style dual-write from the operator audit service:
- Composer
suggestfordrupal/audit_chain. No hard dependency on Key or Encrypt. - Inject
@?audit_chain.logger. When the service is absent, keep current local-only behaviour. - Channel
postmark_webhooks. Operations match the local action codes:export_requested,erase_history_batch,recover_hard. - Metadata is the hashed subject, uid and optional target. Never a mailbox, never free text, never secrets.
- Call
log(), notlogKeyed(). Fail open: a chain write error is logged and does not undo the local row or the operator action. - Keep
postmark_operator_auditas the local store. Retention still does not delete those rows.
Remaining tasks
- Implement the soft adapter and tests.
- Document the optional enable path.
User interface changes
None.
API changes
No change to SuppressionPolicyInterface. The operator audit service remains internal.
Data model changes
None in this module. Chain rows are written only when audit_chain is installed.
Comments
Comment #2
jmcerdaImplementation is ready on 1.x: optional File Gate-style dual-write from the operator audit service, fail open, local table kept, no mailbox in chain metadata. Status stays Active until that lands on 1.x.
Comment #5
jmcerdaFixed on 1.x at
f3ffe6c31033986692828d58efc0f025a782a426. Operator export, erasure and hard-bounce recovery dual-write to audit_chain when that module is installed (channelpostmark_webhooks, hashed subject, uid and optional target). Chain write failure is logged and does not undo the local row. Webhook intake is not written to the chain.Comment #10
jmcerda1.1.0 is published.
composer require 'drupal/postmark_webhooks:^1.0'The project page now documents the optional audit_chain dual-write (fail-open, no mailbox, webhook intake is not chained). There is no new update hook. Sites on 1.0.1 need a cache rebuild only.