You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three small follow-ups from the PR #303 second-pass review (security-reviewer
+ code-reviewer flagged each as low-priority but worth doing for symmetry):
1. validate-before-sign in webhooks.deliver() — mirror WebhookSender ordering.
The pinned-transport build (which runs SSRF + port validation) now runs
BEFORE body assembly + HMAC computation. A buyer-supplied 127.0.0.1 URL
raises SSRFValidationError before get_adcp_signed_headers_for_webhook is
called, so the HMAC-over-buyer-body never sits in process memory waiting
for the rejection (anything that snapshots locals on exception cannot
capture an HMAC that wasn't computed). Matches the
WebhookSender._send_bytes pattern shipped in PR #297.
Regression test test_owned_client_rejects_hostile_url_before_hmac_signing
patches get_adcp_signed_headers_for_webhook with a MagicMock and asserts
it's never called.
2. HMAC-SHA256 SSRF coverage — the existing
test_owned_client_rejects_loopback_destination only exercised the Bearer
auth path. Both auth paths route through the same SSRF guard but the
tests should cover both for parity. Added
test_owned_client_rejects_loopback_destination_hmac_path.
3. .gitignore — exclude .claude/scheduled_tasks.lock (Conductor harness
runtime state).
Plus migration-guide section #4 covering the signing-prep behavior changes
landing in 4.1: SSRF guards on WebhookSender + deliver(), and the
covers_content_digest default flip from "required" to "either" (per AdCP
3.0 spec). Lists the opt-out kwargs adopters who relied on the prior
defaults need to add.
Tests: 2284 passing locally (2 new). Pre-commit clean.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments