@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* Live OpenID Federation 1.0 trust-chain round-trip over loopback HTTP.
|
|
6
|
+
*
|
|
7
|
+
* Unlike the layer-0 unit test (which drives buildTrustChain against an
|
|
8
|
+
* in-memory fetcher), this harness stands up THREE real loopback
|
|
9
|
+
* entity-statement servers — anchor -> intermediate -> leaf — each
|
|
10
|
+
* serving its own `/.well-known/openid-federation` self-configuration
|
|
11
|
+
* plus a superior-signed subordinate statement from its
|
|
12
|
+
* `federation_fetch_endpoint`. buildTrustChain / resolveLeaf are driven
|
|
13
|
+
* with a fetcher that performs a genuine `b.httpClient` GET against those
|
|
14
|
+
* servers, so the whole fetch + top-down verification path runs over the
|
|
15
|
+
* wire.
|
|
16
|
+
*
|
|
17
|
+
* It asserts the two provenance / policy properties fixed in v0.16.22 /
|
|
18
|
+
* v0.16.23:
|
|
19
|
+
*
|
|
20
|
+
* - buildTrustChain REJECTS a leaf whose entity configuration is signed
|
|
21
|
+
* by a key the superior does NOT attest (an attacker who controls the
|
|
22
|
+
* leaf's .well-known endpoint but not its federation-attested key).
|
|
23
|
+
* The honest superior's subordinate statement pins the leaf's real
|
|
24
|
+
* keys; the forged self-config must fail the top-down re-verify with
|
|
25
|
+
* bad-signature (v0.16.22 — config bound to superior-attested keys).
|
|
26
|
+
*
|
|
27
|
+
* - applyMetadataPolicy REFUSES a subordinate that tries to escape a
|
|
28
|
+
* superior's constraint through a DIFFERENT operator: a leaf-ward
|
|
29
|
+
* `value` against an anchor `one_of`, and a leaf-ward `add` past an
|
|
30
|
+
* anchor `subset_of` (v0.16.23 — cross-operator policy merge).
|
|
31
|
+
*
|
|
32
|
+
* No docker services are required; this file runs in-process.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
var helpers = require("../helpers");
|
|
36
|
+
var b = helpers.b;
|
|
37
|
+
var check = helpers.check;
|
|
38
|
+
var nodeCrypto = require("node:crypto");
|
|
39
|
+
var nodeHttp = require("node:http");
|
|
40
|
+
|
|
41
|
+
// ---- entity-statement minting (in-process keys) --------------------------
|
|
42
|
+
// Mirrors test/layer-0-primitives/openid-federation.test.js so the wire
|
|
43
|
+
// statements are byte-identical to the unit-test fixtures, just served over
|
|
44
|
+
// real HTTP instead of an in-memory map.
|
|
45
|
+
|
|
46
|
+
function _b64url(buf) { return Buffer.from(buf).toString("base64url"); }
|
|
47
|
+
|
|
48
|
+
function _ecEntity(kid) {
|
|
49
|
+
var kp = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "P-256" });
|
|
50
|
+
var jwk = kp.publicKey.export({ format: "jwk" });
|
|
51
|
+
jwk.kid = kid;
|
|
52
|
+
return { priv: kp.privateKey, jwk: jwk, jwks: { keys: [jwk] } };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function _mint(priv, kid, claims) {
|
|
56
|
+
var header = { typ: "entity-statement+jwt", alg: "ES256", kid: kid };
|
|
57
|
+
var input = _b64url(JSON.stringify(header)) + "." + _b64url(JSON.stringify(claims));
|
|
58
|
+
var sig = nodeCrypto.sign("sha256", Buffer.from(input, "ascii"), { key: priv, dsaEncoding: "ieee-p1363" });
|
|
59
|
+
return input + "." + _b64url(sig);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
var _NOW = Math.floor(Date.now() / 1000); // allow:raw-byte-literal — seconds-per-ms
|
|
63
|
+
function _cfg(id, entity, extra) {
|
|
64
|
+
var c = { iss: id, sub: id, iat: _NOW, exp: _NOW + 3600, jwks: entity.jwks }; // allow:raw-byte-literal — 1h validity
|
|
65
|
+
if (extra) Object.keys(extra).forEach(function (k) { c[k] = extra[k]; });
|
|
66
|
+
return c;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ---- loopback servers ----------------------------------------------------
|
|
70
|
+
// One server per federation entity (each entity_id is an origin, so distinct
|
|
71
|
+
// ports are required). Every server reads the JWT it should return from the
|
|
72
|
+
// shared, per-scenario `served` map so a test can swap the served config /
|
|
73
|
+
// subordinate statement without rebinding ports.
|
|
74
|
+
|
|
75
|
+
var served = {
|
|
76
|
+
leaf: { config: null, subBySub: {} },
|
|
77
|
+
inter: { config: null, subBySub: {} },
|
|
78
|
+
anchor: { config: null, subBySub: {} },
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
function _mkServer(which) {
|
|
82
|
+
return nodeHttp.createServer(function (req, res) {
|
|
83
|
+
var u = req.url || "";
|
|
84
|
+
if (u.indexOf("/.well-known/openid-federation") === 0) {
|
|
85
|
+
var cfg = served[which].config;
|
|
86
|
+
if (!cfg) { res.writeHead(404); return res.end(); }
|
|
87
|
+
res.writeHead(200, { "Content-Type": "application/entity-statement+jwt" });
|
|
88
|
+
return res.end(cfg);
|
|
89
|
+
}
|
|
90
|
+
if (u.indexOf("/fetch") === 0) {
|
|
91
|
+
var sub = new URL(u, "http://127.0.0.1").searchParams.get("sub");
|
|
92
|
+
var stmt = sub && served[which].subBySub[sub];
|
|
93
|
+
if (!stmt) { res.writeHead(404); return res.end(); }
|
|
94
|
+
res.writeHead(200, { "Content-Type": "application/entity-statement+jwt" });
|
|
95
|
+
return res.end(stmt);
|
|
96
|
+
}
|
|
97
|
+
res.writeHead(404);
|
|
98
|
+
res.end();
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// A real HTTP fetcher — buildTrustChain's default subordinate fetcher calls it
|
|
103
|
+
// for both the .well-known discovery and the federation_fetch_endpoint pull, so
|
|
104
|
+
// the entire fetch path exercises the wire. Non-2xx surfaces as a throw (the
|
|
105
|
+
// framework http client rejects 4xx in buffer mode), which the chain builder
|
|
106
|
+
// treats as a failed hint.
|
|
107
|
+
function _loopbackFetcher(url) {
|
|
108
|
+
return b.httpClient.request({
|
|
109
|
+
method: "GET",
|
|
110
|
+
url: url,
|
|
111
|
+
allowedProtocols: b.safeUrl.ALLOW_HTTP_ALL,
|
|
112
|
+
allowInternal: true,
|
|
113
|
+
}).then(function (res) { return res.body.toString("utf8"); });
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function run() {
|
|
117
|
+
// Keys: leaf (honest), evil (an attacker key sharing the leaf's kid so a
|
|
118
|
+
// forged config forces a signature check, not a kid mismatch), intermediate,
|
|
119
|
+
// anchor. Generated once and reused across scenarios.
|
|
120
|
+
var leaf = _ecEntity("leaf-k");
|
|
121
|
+
var evil = _ecEntity("leaf-k");
|
|
122
|
+
var inter = _ecEntity("inter-k");
|
|
123
|
+
var anchor = _ecEntity("anchor-k");
|
|
124
|
+
|
|
125
|
+
var leafSrv = _mkServer("leaf");
|
|
126
|
+
var interSrv = _mkServer("inter");
|
|
127
|
+
var anchorSrv = _mkServer("anchor");
|
|
128
|
+
var leafId, interId, anchorId, anchors;
|
|
129
|
+
try {
|
|
130
|
+
var leafPort = await helpers.listenOnRandomPort(leafSrv);
|
|
131
|
+
var interPort = await helpers.listenOnRandomPort(interSrv);
|
|
132
|
+
var anchorPort = await helpers.listenOnRandomPort(anchorSrv);
|
|
133
|
+
leafId = "http://127.0.0.1:" + leafPort;
|
|
134
|
+
interId = "http://127.0.0.1:" + interPort;
|
|
135
|
+
anchorId = "http://127.0.0.1:" + anchorPort;
|
|
136
|
+
anchors = {}; anchors[anchorId] = anchor.jwks;
|
|
137
|
+
|
|
138
|
+
// Populate the three servers for one scenario. `opts`:
|
|
139
|
+
// forgeLeaf — sign the leaf self-config with `evil` (same kid) while
|
|
140
|
+
// the intermediate still pins the leaf's REAL keys.
|
|
141
|
+
// leafMetadata — the leaf's declared metadata (default a bare RP).
|
|
142
|
+
// anchorPolicy — metadata_policy the anchor signs onto the intermediate.
|
|
143
|
+
// interPolicy — metadata_policy the intermediate signs onto the leaf.
|
|
144
|
+
function _install(opts) {
|
|
145
|
+
opts = opts || {};
|
|
146
|
+
var leafSigner = opts.forgeLeaf ? evil : leaf;
|
|
147
|
+
served.leaf.config = _mint(leafSigner.priv, "leaf-k", _cfg(leafId, leafSigner, {
|
|
148
|
+
authority_hints: [interId],
|
|
149
|
+
metadata: opts.leafMetadata || { openid_relying_party: { client_name: "RP" } },
|
|
150
|
+
}));
|
|
151
|
+
served.inter.config = _mint(inter.priv, "inter-k", _cfg(interId, inter, {
|
|
152
|
+
authority_hints: [anchorId],
|
|
153
|
+
federation_fetch_endpoint: interId + "/fetch",
|
|
154
|
+
}));
|
|
155
|
+
served.anchor.config = _mint(anchor.priv, "anchor-k", _cfg(anchorId, anchor, {
|
|
156
|
+
federation_fetch_endpoint: anchorId + "/fetch",
|
|
157
|
+
}));
|
|
158
|
+
// Intermediate-signed subordinate ABOUT the leaf — pins the leaf's REAL
|
|
159
|
+
// keys (+ optional policy). This is what the top-down verify trusts.
|
|
160
|
+
var subLeaf = { iss: interId, sub: leafId, iat: _NOW, exp: _NOW + 3600, jwks: leaf.jwks }; // allow:raw-byte-literal — 1h validity
|
|
161
|
+
if (opts.interPolicy) subLeaf.metadata_policy = opts.interPolicy;
|
|
162
|
+
served.inter.subBySub[leafId] = _mint(inter.priv, "inter-k", subLeaf);
|
|
163
|
+
// Anchor-signed subordinate ABOUT the intermediate — pins the
|
|
164
|
+
// intermediate's REAL keys (+ optional policy).
|
|
165
|
+
var subInter = { iss: anchorId, sub: interId, iat: _NOW, exp: _NOW + 3600, jwks: inter.jwks }; // allow:raw-byte-literal — 1h validity
|
|
166
|
+
if (opts.anchorPolicy) subInter.metadata_policy = opts.anchorPolicy;
|
|
167
|
+
served.anchor.subBySub[interId] = _mint(anchor.priv, "anchor-k", subInter);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ---- 1) Happy leaf -> intermediate -> anchor chain over real HTTP ----
|
|
171
|
+
_install({});
|
|
172
|
+
var chain = await b.auth.openidFederation.buildTrustChain({
|
|
173
|
+
leafEntityId: leafId, trustAnchors: anchors, fetcher: _loopbackFetcher,
|
|
174
|
+
});
|
|
175
|
+
check("buildTrustChain: 3-node leaf+intermediate+anchor over loopback",
|
|
176
|
+
chain.length === 3 && chain[0].role === "leaf" &&
|
|
177
|
+
chain[1].role === "intermediate" && chain[2].role === "trust_anchor");
|
|
178
|
+
var resolved = await b.auth.openidFederation.resolveLeaf({
|
|
179
|
+
leafEntityId: leafId, trustAnchors: anchors, kind: "openid_relying_party",
|
|
180
|
+
fetcher: _loopbackFetcher,
|
|
181
|
+
});
|
|
182
|
+
check("resolveLeaf: effective metadata + anchor resolved over loopback",
|
|
183
|
+
resolved.trustAnchor === anchorId && resolved.effectiveMetadata.client_name === "RP");
|
|
184
|
+
|
|
185
|
+
// ---- 2) Leaf config signed by a NON-attested key is refused ----------
|
|
186
|
+
// The attacker controls the leaf's .well-known endpoint (serves a config
|
|
187
|
+
// signed by `evil`, carrying attacker metadata) but not the leaf's
|
|
188
|
+
// federation-attested key; the intermediate's subordinate pins the leaf's
|
|
189
|
+
// REAL keys. The top-down re-verify must reject with bad-signature.
|
|
190
|
+
_install({ forgeLeaf: true, leafMetadata: { openid_relying_party: { client_name: "ATTACKER", redirect_uris: ["http://127.0.0.1:1/evil"] } } });
|
|
191
|
+
var forgedThrew = null;
|
|
192
|
+
try {
|
|
193
|
+
await b.auth.openidFederation.buildTrustChain({
|
|
194
|
+
leafEntityId: leafId, trustAnchors: anchors, fetcher: _loopbackFetcher,
|
|
195
|
+
});
|
|
196
|
+
} catch (e) { forgedThrew = e; }
|
|
197
|
+
check("buildTrustChain: leaf config signed by non-attested key refused (bad-signature)",
|
|
198
|
+
!!forgedThrew && /auth-openid-federation\/bad-signature/.test(forgedThrew.code || ""));
|
|
199
|
+
var forgedResolveThrew = null;
|
|
200
|
+
try {
|
|
201
|
+
await b.auth.openidFederation.resolveLeaf({
|
|
202
|
+
leafEntityId: leafId, trustAnchors: anchors, kind: "openid_relying_party",
|
|
203
|
+
fetcher: _loopbackFetcher,
|
|
204
|
+
});
|
|
205
|
+
} catch (e) { forgedResolveThrew = e; }
|
|
206
|
+
check("resolveLeaf: forged leaf metadata never resolved (config unbound to pinned keys)",
|
|
207
|
+
!!forgedResolveThrew && /auth-openid-federation\/bad-signature/.test(forgedResolveThrew.code || ""));
|
|
208
|
+
|
|
209
|
+
// ---- 3) Cross-operator downgrade: leaf-ward `value` vs anchor `one_of` -
|
|
210
|
+
// The anchor pins token_endpoint_auth_method one_of ['private_key_jwt'];
|
|
211
|
+
// the intermediate tries to substitute value 'none' (removing client auth).
|
|
212
|
+
// The merged policy must refuse the final value, not silently downgrade.
|
|
213
|
+
_install({
|
|
214
|
+
anchorPolicy: { openid_relying_party: { token_endpoint_auth_method: { one_of: ["private_key_jwt"] } } },
|
|
215
|
+
interPolicy: { openid_relying_party: { token_endpoint_auth_method: { value: "none" } } },
|
|
216
|
+
});
|
|
217
|
+
var oneOfChain = await b.auth.openidFederation.buildTrustChain({
|
|
218
|
+
leafEntityId: leafId, trustAnchors: anchors, fetcher: _loopbackFetcher,
|
|
219
|
+
});
|
|
220
|
+
var oneOfThrew = null;
|
|
221
|
+
try {
|
|
222
|
+
b.auth.openidFederation.applyMetadataPolicy(
|
|
223
|
+
oneOfChain[0].claims.metadata.openid_relying_party, oneOfChain, "openid_relying_party");
|
|
224
|
+
} catch (e) { oneOfThrew = e; }
|
|
225
|
+
check("applyMetadataPolicy: subordinate `value` cannot override a superior `one_of` (policy-one-of-failed)",
|
|
226
|
+
!!oneOfThrew && /auth-openid-federation\/policy-one-of-failed/.test(oneOfThrew.code || ""));
|
|
227
|
+
|
|
228
|
+
// ---- 4) Cross-operator downgrade: leaf-ward `add` past anchor `subset_of`
|
|
229
|
+
// The anchor pins scope subset_of ['read']; the intermediate adds 'write'.
|
|
230
|
+
// The merged policy must refuse the widened value.
|
|
231
|
+
_install({
|
|
232
|
+
leafMetadata: { openid_relying_party: { scope: ["read"] } },
|
|
233
|
+
anchorPolicy: { openid_relying_party: { scope: { subset_of: ["read"] } } },
|
|
234
|
+
interPolicy: { openid_relying_party: { scope: { add: ["write"] } } },
|
|
235
|
+
});
|
|
236
|
+
var subsetChain = await b.auth.openidFederation.buildTrustChain({
|
|
237
|
+
leafEntityId: leafId, trustAnchors: anchors, fetcher: _loopbackFetcher,
|
|
238
|
+
});
|
|
239
|
+
var subsetThrew = null;
|
|
240
|
+
try {
|
|
241
|
+
b.auth.openidFederation.applyMetadataPolicy(
|
|
242
|
+
subsetChain[0].claims.metadata.openid_relying_party, subsetChain, "openid_relying_party");
|
|
243
|
+
} catch (e) { subsetThrew = e; }
|
|
244
|
+
check("applyMetadataPolicy: subordinate `add` cannot widen past a superior `subset_of` (policy-subset-of-failed)",
|
|
245
|
+
!!subsetThrew && /auth-openid-federation\/policy-subset-of-failed/.test(subsetThrew.code || ""));
|
|
246
|
+
|
|
247
|
+
// ---- 5) A consistent narrowing still resolves (guards a false-refuse) --
|
|
248
|
+
// The intermediate `add` stays WITHIN the anchor's subset_of — a legitimate
|
|
249
|
+
// narrowing that must pass, proving the refusals above are not blanket.
|
|
250
|
+
_install({
|
|
251
|
+
leafMetadata: { openid_relying_party: { scope: ["read"] } },
|
|
252
|
+
anchorPolicy: { openid_relying_party: { scope: { subset_of: ["read", "write"] } } },
|
|
253
|
+
interPolicy: { openid_relying_party: { scope: { add: ["write"] } } },
|
|
254
|
+
});
|
|
255
|
+
var okChain = await b.auth.openidFederation.buildTrustChain({
|
|
256
|
+
leafEntityId: leafId, trustAnchors: anchors, fetcher: _loopbackFetcher,
|
|
257
|
+
});
|
|
258
|
+
var okEffective = b.auth.openidFederation.applyMetadataPolicy(
|
|
259
|
+
okChain[0].claims.metadata.openid_relying_party, okChain, "openid_relying_party");
|
|
260
|
+
check("applyMetadataPolicy: consistent narrowing (add within subset_of) still resolves",
|
|
261
|
+
okEffective.scope.indexOf("read") !== -1 && okEffective.scope.indexOf("write") !== -1);
|
|
262
|
+
} finally {
|
|
263
|
+
leafSrv.close();
|
|
264
|
+
interSrv.close();
|
|
265
|
+
anchorSrv.close();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
module.exports = { run: run };
|
|
270
|
+
if (require.main === module) {
|
|
271
|
+
run().then(
|
|
272
|
+
function () { console.log("[openid-federation-chain] OK"); },
|
|
273
|
+
function (e) { console.error("[openid-federation-chain] FAIL:", e.stack || e); process.exit(1); }
|
|
274
|
+
);
|
|
275
|
+
}
|
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
* - the retry claim TRANSACTION (mark-then-reselect) + the BIGINT `attempts`
|
|
16
16
|
* column coercing back through frameworkSchema for the count comparison.
|
|
17
17
|
* - maxAttempts -> dead-letter and dlq.replay on real Postgres.
|
|
18
|
+
* - the per-attempt SSRF-rebind re-check: a transient resolver fault keeps
|
|
19
|
+
* the delivery pending on the backoff curve (never dead-letters, including
|
|
20
|
+
* under the row-locked retry claim), while a genuine private-IP rebind
|
|
21
|
+
* dead-letters on the first attempt.
|
|
18
22
|
*
|
|
19
23
|
* Delivery HTTP is a stubbed transport (no network); the storage path is real.
|
|
20
24
|
*
|
|
@@ -267,6 +271,98 @@ async function run() {
|
|
|
267
271
|
check("dlq.replay delivers on Postgres", replay.ok === true);
|
|
268
272
|
var dlqAfter = await wd.dlq.list();
|
|
269
273
|
check("DLQ empty after replay on Postgres", dlqAfter.length === 0);
|
|
274
|
+
|
|
275
|
+
// ---- per-attempt SSRF-rebind re-check: resolver fault vs genuine refusal ----
|
|
276
|
+
// The dispatcher re-validates every destination before EVERY attempt
|
|
277
|
+
// (DNS-rebinding defense). Two failure classes must diverge on real
|
|
278
|
+
// Postgres rows:
|
|
279
|
+
// - a TRANSIENT resolver fault (an EAI_AGAIN blip) during the re-check
|
|
280
|
+
// keeps the delivery pending on the backoff curve — never dead-lettered,
|
|
281
|
+
// including when the row was claimed via FOR UPDATE SKIP LOCKED;
|
|
282
|
+
// - a genuine SSRF refusal (the host now resolves to a private IP) is
|
|
283
|
+
// permanent and dead-letters on the first attempt.
|
|
284
|
+
var resolverMode = "public";
|
|
285
|
+
var dnsLookup = function (host) {
|
|
286
|
+
void host;
|
|
287
|
+
if (resolverMode === "fault") {
|
|
288
|
+
var blip = new Error("getaddrinfo EAI_AGAIN hooks.dns-blip.example");
|
|
289
|
+
blip.code = "EAI_AGAIN";
|
|
290
|
+
return Promise.reject(blip);
|
|
291
|
+
}
|
|
292
|
+
if (resolverMode === "rebind") {
|
|
293
|
+
return Promise.resolve([{ address: "10.0.0.5", family: 4 }]);
|
|
294
|
+
}
|
|
295
|
+
return Promise.resolve([{ address: "1.1.1.1", family: 4 }]);
|
|
296
|
+
};
|
|
297
|
+
var dnsTransport = _stubTransport();
|
|
298
|
+
var wd2 = b.webhook.dispatcher({
|
|
299
|
+
externalDb: xdb, httpRequest: dnsTransport, maxAttempts: 3,
|
|
300
|
+
retryBackoff: { initialMs: 1000, maxMs: 5000, factor: 2 }, now: clock,
|
|
301
|
+
dnsLookup: dnsLookup,
|
|
302
|
+
});
|
|
303
|
+
await wd2.registerEndpoint({
|
|
304
|
+
endpointId: "ep_pg_dns", url: "https://hooks.dns-blip.example/h",
|
|
305
|
+
eventTypes: ["dns.check"], secret: "whsec_pg_dns_secret",
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// Inline first attempt: the pre-attempt re-check hits the resolver blip.
|
|
309
|
+
resolverMode = "fault";
|
|
310
|
+
var dnsRes = await wd2.dispatch("dns.check", { id: "inv_pg_dns_1" });
|
|
311
|
+
check("transient resolver fault during re-check: not delivered",
|
|
312
|
+
dnsRes.delivered === 0 && dnsRes.failed === 1);
|
|
313
|
+
check("transient resolver fault during re-check: NOT marked dead",
|
|
314
|
+
dnsRes.deliveries.length === 1 && dnsRes.deliveries[0].dead !== true);
|
|
315
|
+
check("transient resolver fault during re-check: POST never fired",
|
|
316
|
+
dnsTransport.calls.length === 0);
|
|
317
|
+
var dnsDeliveryId = dnsRes.deliveries[0].deliveryId;
|
|
318
|
+
var dnsRowState = _psql("SELECT status || ':' || attempts FROM " + DELIVERIES_TABLE +
|
|
319
|
+
" WHERE delivery_id = '" + dnsDeliveryId + "';").trim();
|
|
320
|
+
check("transient resolver fault: row stays PENDING in Postgres (attempts 1)",
|
|
321
|
+
dnsRowState === "pending:1");
|
|
322
|
+
var dlqAfterFault = await wd2.dlq.list();
|
|
323
|
+
check("transient resolver fault: NOT moved to the DLQ", dlqAfterFault.length === 0);
|
|
324
|
+
|
|
325
|
+
// Retry claim (FOR UPDATE SKIP LOCKED on real Postgres) with the resolver
|
|
326
|
+
// still faulting: the claimed delivery must go BACK to pending, not dead.
|
|
327
|
+
now += 10000;
|
|
328
|
+
var faultRetry = await wd2.processRetries();
|
|
329
|
+
check("claimed retry under resolver fault: attempted without dead-lettering",
|
|
330
|
+
faultRetry.attempted === 1 && faultRetry.dead === 0 && faultRetry.delivered === 0);
|
|
331
|
+
var dnsRowState2 = _psql("SELECT status || ':' || attempts FROM " + DELIVERIES_TABLE +
|
|
332
|
+
" WHERE delivery_id = '" + dnsDeliveryId + "';").trim();
|
|
333
|
+
check("claimed retry under resolver fault: row remains PENDING (attempts 2)",
|
|
334
|
+
dnsRowState2 === "pending:2");
|
|
335
|
+
|
|
336
|
+
// Resolver heals: the still-pending delivery completes on the next poll.
|
|
337
|
+
resolverMode = "public";
|
|
338
|
+
now += 10000;
|
|
339
|
+
var healedRetry = await wd2.processRetries();
|
|
340
|
+
check("resolver heals: pending delivery completes",
|
|
341
|
+
healedRetry.delivered === 1 && healedRetry.dead === 0);
|
|
342
|
+
check("resolver heals: POST fired exactly once", dnsTransport.calls.length === 1);
|
|
343
|
+
|
|
344
|
+
// Genuine SSRF refusal: the host rebinds to a private IP after
|
|
345
|
+
// registration — the per-attempt re-check MUST dead-letter immediately.
|
|
346
|
+
await wd2.registerEndpoint({
|
|
347
|
+
endpointId: "ep_pg_rebind", url: "https://hooks.rebind.example/h",
|
|
348
|
+
eventTypes: ["rebind.check"], secret: "whsec_pg_rebind_secret",
|
|
349
|
+
});
|
|
350
|
+
resolverMode = "rebind";
|
|
351
|
+
var ssrfRes = await wd2.dispatch("rebind.check", { id: "inv_pg_rebind_1" });
|
|
352
|
+
check("SSRF rebind refusal: dispatch marks the delivery dead",
|
|
353
|
+
ssrfRes.delivered === 0 && ssrfRes.deliveries[0].dead === true);
|
|
354
|
+
check("SSRF rebind refusal: POST never fired for the refused delivery",
|
|
355
|
+
dnsTransport.calls.length === 1);
|
|
356
|
+
var ssrfDeliveryId = ssrfRes.deliveries[0].deliveryId;
|
|
357
|
+
var ssrfRowState = _psql("SELECT status || ':' || attempts FROM " + DELIVERIES_TABLE +
|
|
358
|
+
" WHERE delivery_id = '" + ssrfDeliveryId + "';").trim();
|
|
359
|
+
check("SSRF rebind refusal: row dead-lettered in Postgres on the FIRST attempt",
|
|
360
|
+
ssrfRowState === "dead:1");
|
|
361
|
+
var dlqSsrf = await wd2.dlq.list();
|
|
362
|
+
check("SSRF rebind refusal: DLQ holds the refused delivery",
|
|
363
|
+
dlqSsrf.length === 1 && dlqSsrf[0].deliveryId === ssrfDeliveryId);
|
|
364
|
+
check("SSRF rebind refusal: last_error names the private-range refusal",
|
|
365
|
+
/private/.test(dlqSsrf[0].lastError || ""));
|
|
270
366
|
} finally {
|
|
271
367
|
try { await driver.close(client); } catch (_e) {}
|
|
272
368
|
try { helpers.teardownVaultOnly(tmpDir); } catch (_e) {}
|