Commit Graph
3 Commits
Author SHA1 Message Date
james.maesandClaude Opus 5.5 7510392166 feat(revalidation): sign hooks with core WebhookSigner and the safe HTTP client
Replace the hand-rolled HMAC in RevalidationHookRunner with core
WebhookSigner (Standard Webhooks) from QQQ 4.1.0-RC.5, and send through
core SafeHttpClient.

New cdn_revalidation_hook fields:
- signatureFormat: STANDARD_WEBHOOKS (the default for new rows) or LEGACY,
  which keeps X-Revalidate-Signature byte-for-byte. A null format, as on
  existing rows, stays LEGACY.
- allowPlainHttp and internalAllowlist: explicit exceptions to the SSRF
  policy.

Closes #15 (architecture review QRun-IO/qqq#1150, finding F11).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:33:36 -05:00
james.maesandClaude Opus 5.5 0b7658b505 chore: adopt the QRun qbit repository standard
Add the standard repository files (CircleCI qqq-orb pipeline where
missing, .editorconfig, .gitattributes, CODEOWNERS, Dependabot, community
pointer files, CHANGELOG, CLAUDE.md/AGENTS.md, docs/DESIGN.md), make the
Maven wrapper executable, and add the README Build/License sections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 14:43:32 -05:00
james.maesandClaude Opus 5.5 ae2a9237d4 feat(cloudfront): CloudFront adapter (invalidations, test connection, edge stats, drift)
- CloudFrontCdnProvider: PATHS/ALL batches -> CreateInvalidation with the
  batch caller reference as CallerReference (idempotent), IN_PROGRESS with
  the invalidation id; checkPurge -> GetInvalidation. TAG/HOST batches are
  refused. Throttling, TooManyInvalidationsInProgress, 429/5xx and network
  failures are retryable; AccessDenied, InvalidArgument, NoSuchDistribution
  and other 4xx are permanent. No SDK-level retries.
- testConnection: GetDistributionConfig + ListInvalidations(MaxItems=1) to
  prove IAM scope, optional GetDistribution for domain/status, reports
  whether X-Origin-Verify is configured without reading out its value.
- importStats: CloudWatch GetMetricData (AWS/CloudFront, DistributionId +
  Region=Global, daily) into the new spi CdnEdgeStat.
- readConfig + CloudFrontDriftCheck.compare against the tofu
  expected_config output (docs/cloudfront-expected-config.md).
- Credentials: env vars <secretRef>_ACCESS_KEY_ID / _SECRET_ACCESS_KEY.
- Tests use a JDK HttpServer stub (WireMock cannot start: the QQQ BOM pins
  Jetty 12) with hand-built fixtures; CloudWatch (RPC v2 CBOR) is mocked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 14:22:00 -05:00