@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
|
@@ -23,6 +23,16 @@
|
|
|
23
23
|
* - b.auth.saml.sp.create + buildAuthnRequest (HTTP-Redirect form
|
|
24
24
|
* against the IdP's SAML endpoint)
|
|
25
25
|
* - b.auth.saml.sp.metadata XML emit
|
|
26
|
+
* - b.auth.oauth.deviceAuthorization + pollDeviceCode (RFC 8628
|
|
27
|
+
* device grant — the poll survives the authorization_pending HTTP
|
|
28
|
+
* 400 rather than aborting on the first poll; provisions a
|
|
29
|
+
* device-grant client via the admin API)
|
|
30
|
+
* - b.auth.saml.sp.verifyResponse over a Keycloak-ENCRYPTED
|
|
31
|
+
* assertion (SAML 2.0 §2.5). Keycloak 26.0.8 emits aes128-cbc +
|
|
32
|
+
* rsa-oaep-mgf1p(SHA-1), which the framework refuses by design, so
|
|
33
|
+
* the assertion is the fail-closed refusal; the AES-GCM +
|
|
34
|
+
* RSA-OAEP-SHA256 positive-decrypt branch takes effect on Keycloak
|
|
35
|
+
* >= 26.2 (see the stage comment).
|
|
26
36
|
*
|
|
27
37
|
* Deferred (open-conditions noted):
|
|
28
38
|
* - CIBA (Keycloak 26 supports it but requires extra realm-import
|
|
@@ -30,16 +40,21 @@
|
|
|
30
40
|
* `attributes.cibaBackchannelTokenDeliveryMode`).
|
|
31
41
|
* - OID4VCI / OID4VP (preview-only in Keycloak; re-open when the
|
|
32
42
|
* `oid4vc-issuer` SPI ships in the base image).
|
|
33
|
-
* - OpenID Federation 1.0
|
|
34
|
-
*
|
|
35
|
-
*
|
|
43
|
+
* - OpenID Federation 1.0 has no native Keycloak provider; the
|
|
44
|
+
* trust-chain / metadata-policy path is covered in-process by
|
|
45
|
+
* test/integration/openid-federation-chain.test.js (three loopback
|
|
46
|
+
* entity-statement servers) rather than against Keycloak.
|
|
36
47
|
*/
|
|
37
48
|
|
|
38
49
|
var helpers = require("../helpers");
|
|
39
50
|
var check = helpers.check;
|
|
40
51
|
var services = require("../helpers/services");
|
|
41
52
|
var b = require("../../");
|
|
42
|
-
var nodeCrypto
|
|
53
|
+
var nodeCrypto = require("node:crypto");
|
|
54
|
+
var nodeChildProcess = require("node:child_process");
|
|
55
|
+
var nodeFs = require("node:fs");
|
|
56
|
+
var nodeOs = require("node:os");
|
|
57
|
+
var nodePath = require("node:path");
|
|
43
58
|
|
|
44
59
|
var KEYCLOAK_BASE = "http://127.0.0.1:18080";
|
|
45
60
|
var REALM = "blamejs-test";
|
|
@@ -190,6 +205,196 @@ async function _signLogoutToken(signingKid, sub, sid, jti) {
|
|
|
190
205
|
return signingInput + "." + sig.toString("base64url");
|
|
191
206
|
}
|
|
192
207
|
|
|
208
|
+
// ---- Keycloak Admin REST helpers ----
|
|
209
|
+
// The realm is imported once at container start; the device-grant and
|
|
210
|
+
// encrypted-SAML stages need two client shapes the base import doesn't carry
|
|
211
|
+
// (a device-grant client without a forced PKCE challenge, and a SAML SP with
|
|
212
|
+
// assertion encryption on). They're applied idempotently via the admin API so
|
|
213
|
+
// the test is robust against both the already-running container and a fresh
|
|
214
|
+
// `compose up`; the realm JSON carries the same shapes for a cold start.
|
|
215
|
+
var KC_ADMIN_USER = "admin";
|
|
216
|
+
var KC_ADMIN_PASS = "blamejs-test-admin";
|
|
217
|
+
var DEVICE_CLIENT_ID = "blamejs-device-oidc";
|
|
218
|
+
var DEVICE_SECRET = "blamejs-test-device-secret";
|
|
219
|
+
var SP_ENC_ENTITY_ID = "https://sp-enc.blamejs-test.example";
|
|
220
|
+
|
|
221
|
+
async function _adminToken() {
|
|
222
|
+
var body = new URLSearchParams();
|
|
223
|
+
body.set("grant_type", "password");
|
|
224
|
+
body.set("client_id", "admin-cli");
|
|
225
|
+
body.set("username", KC_ADMIN_USER);
|
|
226
|
+
body.set("password", KC_ADMIN_PASS);
|
|
227
|
+
var res = await b.httpClient.request({
|
|
228
|
+
method: "POST",
|
|
229
|
+
url: KEYCLOAK_BASE + "/realms/master/protocol/openid-connect/token",
|
|
230
|
+
allowedProtocols: b.safeUrl.ALLOW_HTTP_ALL,
|
|
231
|
+
allowInternal: true,
|
|
232
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
233
|
+
body: body.toString(),
|
|
234
|
+
});
|
|
235
|
+
if (res.statusCode !== 200) {
|
|
236
|
+
throw new Error("admin token grant failed: " + res.statusCode + " " + (res.body && res.body.toString().slice(0, 200)));
|
|
237
|
+
}
|
|
238
|
+
return JSON.parse(res.body.toString("utf8")).access_token;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
async function _kcAdmin(method, subPath, tok, jsonBody) {
|
|
242
|
+
var req = {
|
|
243
|
+
method: method,
|
|
244
|
+
url: KEYCLOAK_BASE + "/admin/realms/" + REALM + subPath,
|
|
245
|
+
allowedProtocols: b.safeUrl.ALLOW_HTTP_ALL,
|
|
246
|
+
allowInternal: true,
|
|
247
|
+
responseMode: "always-resolve",
|
|
248
|
+
headers: { Authorization: "Bearer " + tok },
|
|
249
|
+
};
|
|
250
|
+
if (jsonBody !== undefined) {
|
|
251
|
+
req.headers["Content-Type"] = "application/json";
|
|
252
|
+
req.body = JSON.stringify(jsonBody);
|
|
253
|
+
}
|
|
254
|
+
var res = await b.httpClient.request(req);
|
|
255
|
+
var json = null;
|
|
256
|
+
if (res.body && res.body.length) {
|
|
257
|
+
try { json = JSON.parse(res.body.toString("utf8")); } catch (_e) { json = null; }
|
|
258
|
+
}
|
|
259
|
+
return { statusCode: res.statusCode, json: json };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Create-or-update a confidential OIDC client with the device grant enabled and
|
|
263
|
+
// no forced PKCE challenge (b.auth.oauth.deviceAuthorization sends no
|
|
264
|
+
// code_challenge, and the base blamejs-rp-oidc client forces S256).
|
|
265
|
+
async function _ensureDeviceClient(tok) {
|
|
266
|
+
var rep = {
|
|
267
|
+
clientId: DEVICE_CLIENT_ID,
|
|
268
|
+
name: "blamejs OIDC device-grant (integration test)",
|
|
269
|
+
enabled: true,
|
|
270
|
+
protocol: "openid-connect",
|
|
271
|
+
publicClient: false,
|
|
272
|
+
secret: DEVICE_SECRET,
|
|
273
|
+
standardFlowEnabled: false,
|
|
274
|
+
directAccessGrantsEnabled: false,
|
|
275
|
+
serviceAccountsEnabled: false,
|
|
276
|
+
attributes: {
|
|
277
|
+
"oauth2.device.authorization.grant.enabled": "true",
|
|
278
|
+
"pkce.code.challenge.method": "",
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
var listed = await _kcAdmin("GET", "/clients?clientId=" + encodeURIComponent(DEVICE_CLIENT_ID), tok);
|
|
282
|
+
if (Array.isArray(listed.json) && listed.json.length > 0) {
|
|
283
|
+
var existing = listed.json[0];
|
|
284
|
+
var merged = Object.assign({}, existing, rep, {
|
|
285
|
+
id: existing.id,
|
|
286
|
+
attributes: Object.assign({}, existing.attributes, rep.attributes),
|
|
287
|
+
});
|
|
288
|
+
await _kcAdmin("PUT", "/clients/" + existing.id, tok, merged);
|
|
289
|
+
} else {
|
|
290
|
+
await _kcAdmin("POST", "/clients", tok, rep);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Generate an ephemeral SP RSA keypair + self-signed cert at runtime so no
|
|
295
|
+
// private key is committed. Keycloak encrypts the assertion CEK to the cert's
|
|
296
|
+
// RSA public key; the SP decrypts with the private key. Uses openssl (dev
|
|
297
|
+
// tooling — the integration runner already shells to docker); returns null when
|
|
298
|
+
// openssl is unavailable so the stage skips cleanly.
|
|
299
|
+
function _generateSpEncryptionKeypair() {
|
|
300
|
+
var dir = nodeFs.mkdtempSync(nodePath.join(nodeOs.tmpdir(), "blamejs-saml-sp-enc-"));
|
|
301
|
+
var keyPath = nodePath.join(dir, "sp-key.pem");
|
|
302
|
+
var certPath = nodePath.join(dir, "sp-cert.pem");
|
|
303
|
+
try {
|
|
304
|
+
var r = nodeChildProcess.spawnSync("openssl", [
|
|
305
|
+
"req", "-x509", "-newkey", "rsa:2048", "-keyout", keyPath, "-out", certPath,
|
|
306
|
+
"-days", "3650", "-nodes", "-subj", "/CN=sp-enc.blamejs-test.example", "-sha256",
|
|
307
|
+
], { stdio: "ignore" });
|
|
308
|
+
if (!r || r.status !== 0 || !nodeFs.existsSync(certPath) || !nodeFs.existsSync(keyPath)) return null;
|
|
309
|
+
var keyPem = nodeFs.readFileSync(keyPath, "utf8");
|
|
310
|
+
var certPem = nodeFs.readFileSync(certPath, "utf8");
|
|
311
|
+
var certDerB64 = new nodeCrypto.X509Certificate(certPem).raw.toString("base64");
|
|
312
|
+
return { keyPem: keyPem, certDerB64: certDerB64 };
|
|
313
|
+
} catch (_e) {
|
|
314
|
+
return null;
|
|
315
|
+
} finally {
|
|
316
|
+
try { nodeFs.rmSync(dir, { recursive: true, force: true }); } catch (_e2) {}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Create-or-update a SAML SP client with assertion encryption enabled, keyed to
|
|
321
|
+
// the supplied SP certificate. The algorithm attributes request AES-GCM +
|
|
322
|
+
// RSA-OAEP-SHA256 (what the framework decrypts); Keycloak < 26.2 ignores them
|
|
323
|
+
// and emits its aes128-cbc + rsa-oaep-mgf1p(SHA-1) defaults, which the framework
|
|
324
|
+
// refuses by design.
|
|
325
|
+
async function _ensureSamlEncClient(tok, certDerB64) {
|
|
326
|
+
var attrs = {
|
|
327
|
+
"saml.assertion.signature": "true",
|
|
328
|
+
"saml.server.signature": "false",
|
|
329
|
+
"saml.signature.algorithm": "RSA_SHA256",
|
|
330
|
+
"saml.client.signature": "false",
|
|
331
|
+
"saml.encrypt": "true",
|
|
332
|
+
"saml.encryption.certificate": certDerB64,
|
|
333
|
+
"saml.encryption.algorithm": "AES_256_GCM",
|
|
334
|
+
"saml.encryption.keyAlgorithm": "RSA-OAEP",
|
|
335
|
+
"saml.encryption.digestMethod": "SHA-256",
|
|
336
|
+
"saml.encryption.maskGenerationFunction": "MGF1-SHA256",
|
|
337
|
+
"saml.force.post.binding": "true",
|
|
338
|
+
"saml_assertion_consumer_url_post": SP_ACS_URL,
|
|
339
|
+
"saml_name_id_format": "username",
|
|
340
|
+
"saml.authnstatement": "true",
|
|
341
|
+
};
|
|
342
|
+
var rep = {
|
|
343
|
+
clientId: SP_ENC_ENTITY_ID,
|
|
344
|
+
name: "blamejs SAML SP encrypted (integration test)",
|
|
345
|
+
enabled: true,
|
|
346
|
+
protocol: "saml",
|
|
347
|
+
publicClient: true,
|
|
348
|
+
redirectUris: [SP_ACS_URL],
|
|
349
|
+
frontchannelLogout: false,
|
|
350
|
+
attributes: attrs,
|
|
351
|
+
defaultClientScopes: ["role_list"],
|
|
352
|
+
};
|
|
353
|
+
var listed = await _kcAdmin("GET", "/clients?clientId=" + encodeURIComponent(SP_ENC_ENTITY_ID), tok);
|
|
354
|
+
if (Array.isArray(listed.json) && listed.json.length > 0) {
|
|
355
|
+
var existing = listed.json[0];
|
|
356
|
+
var merged = Object.assign({}, existing, rep, {
|
|
357
|
+
id: existing.id,
|
|
358
|
+
attributes: Object.assign({}, existing.attributes, attrs),
|
|
359
|
+
});
|
|
360
|
+
await _kcAdmin("PUT", "/clients/" + existing.id, tok, merged);
|
|
361
|
+
} else {
|
|
362
|
+
await _kcAdmin("POST", "/clients", tok, rep);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Drive Keycloak's login form for a SAML AuthnRequest redirect URL and return
|
|
367
|
+
// the base64 SAMLResponse from the auto-submit form (or null). Mirrors the
|
|
368
|
+
// cookie-jar + form-post steps of the plaintext SAML round-trip so the
|
|
369
|
+
// encrypted stage reuses the same login mechanics.
|
|
370
|
+
async function _driveSamlLoginCapture(authnRedirectUrl) {
|
|
371
|
+
var jar = _newCookieJar();
|
|
372
|
+
var loginPage = await _httpReq("GET", authnRedirectUrl, jar);
|
|
373
|
+
if (loginPage.statusCode !== 200) return null;
|
|
374
|
+
var actionMatch = /action="(http:\/\/[^"]+\/login-actions\/authenticate[^"]+)"/.exec(loginPage.body.toString("utf8"));
|
|
375
|
+
if (!actionMatch) return null;
|
|
376
|
+
var loginBody = new URLSearchParams();
|
|
377
|
+
loginBody.set("username", TEST_USERNAME);
|
|
378
|
+
loginBody.set("password", TEST_PASSWORD);
|
|
379
|
+
loginBody.set("credentialId", "");
|
|
380
|
+
var loginPost = await _httpReq("POST", actionMatch[1].replace(/&/g, "&"), jar, {
|
|
381
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
382
|
+
body: loginBody.toString(),
|
|
383
|
+
redirect: false,
|
|
384
|
+
});
|
|
385
|
+
var responseHtml;
|
|
386
|
+
if (loginPost.statusCode === 200) {
|
|
387
|
+
responseHtml = loginPost.body.toString("utf8");
|
|
388
|
+
} else if (loginPost.statusCode === 302 || loginPost.statusCode === 303) {
|
|
389
|
+
var follow = await _httpReq("GET", loginPost.headers.location || loginPost.headers.Location, jar);
|
|
390
|
+
responseHtml = follow.body.toString("utf8");
|
|
391
|
+
} else {
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
var m = /name="SAMLResponse"\s+value="([^"]+)"/.exec(responseHtml);
|
|
395
|
+
return m ? m[1] : null;
|
|
396
|
+
}
|
|
397
|
+
|
|
193
398
|
async function run() {
|
|
194
399
|
// ---- service readiness ----
|
|
195
400
|
var keycloak = await services.requireService("keycloak");
|
|
@@ -600,10 +805,113 @@ async function run() {
|
|
|
600
805
|
check("DCR: deferred (AS doesn't advertise registration_endpoint)", true);
|
|
601
806
|
}
|
|
602
807
|
|
|
808
|
+
// ---- OAuth Device Authorization Grant (RFC 8628) — the poll survives an
|
|
809
|
+
// authorization_pending HTTP 400 ----
|
|
810
|
+
// RFC 8628 §3.5 / RFC 6749 §5.2 deliver `authorization_pending` as an HTTP
|
|
811
|
+
// 400 whose body carries the OAuth `error`. Before v0.16.5 the token poll ran
|
|
812
|
+
// in the http client's buffering mode, which rejected the 400 before the
|
|
813
|
+
// pending handler read the body, so the grant aborted on the FIRST poll
|
|
814
|
+
// (almost always authorization_pending, since the user hasn't approved yet).
|
|
815
|
+
// Drive the grant against Keycloak's real device endpoint and assert the poll
|
|
816
|
+
// keeps going across the pending 400s to a deterministic device-poll-timeout —
|
|
817
|
+
// not the HTTP_ERROR abort the buffered path threw.
|
|
818
|
+
var adminTok = await _adminToken();
|
|
819
|
+
await _ensureDeviceClient(adminTok);
|
|
820
|
+
var deviceOauth = b.auth.oauth.create({
|
|
821
|
+
issuer: ISSUER,
|
|
822
|
+
clientId: DEVICE_CLIENT_ID,
|
|
823
|
+
clientSecret: DEVICE_SECRET,
|
|
824
|
+
redirectUri: REDIRECT_URI,
|
|
825
|
+
isOidc: true,
|
|
826
|
+
allowHttp: true,
|
|
827
|
+
allowInternal: true,
|
|
828
|
+
});
|
|
829
|
+
var devAuth = await deviceOauth.deviceAuthorization();
|
|
830
|
+
check("deviceAuthorization: device_code + user_code + verification_uri returned",
|
|
831
|
+
typeof devAuth.device_code === "string" && typeof devAuth.user_code === "string" &&
|
|
832
|
+
typeof devAuth.verification_uri === "string");
|
|
833
|
+
// The user never approves, so every poll returns authorization_pending (400).
|
|
834
|
+
// maxWaitMs spans at least two 5s poll intervals — reaching device-poll-timeout
|
|
835
|
+
// proves the loop survived the pending 400s rather than aborting on the first
|
|
836
|
+
// (which is what a reverted buffer-mode poll would do, throwing HTTP_ERROR).
|
|
837
|
+
var devThrew = null;
|
|
838
|
+
try {
|
|
839
|
+
await deviceOauth.pollDeviceCode(devAuth.device_code, { interval: devAuth.interval, maxWaitMs: 6000 });
|
|
840
|
+
} catch (e) { devThrew = e; }
|
|
841
|
+
check("pollDeviceCode: survives authorization_pending 400 and reaches device-poll-timeout",
|
|
842
|
+
!!devThrew && devThrew.code === "auth-oauth/device-poll-timeout");
|
|
843
|
+
|
|
844
|
+
// ---- SAML EncryptedAssertion decrypt interop (SAML 2.0 §2.5) ----
|
|
845
|
+
// Enable assertion encryption on a dedicated SP client, drive the login, and
|
|
846
|
+
// hand the Keycloak-encrypted SAMLResponse to verifyResponse with the SP
|
|
847
|
+
// private key. Keycloak 26.0.8 emits aes128-cbc content + rsa-oaep-mgf1p
|
|
848
|
+
// (SHA-1) key transport — both refused by the framework by design (XMLEnc CBC
|
|
849
|
+
// padding-oracle; SHA-1 OAEP), so against that output the assertion is that
|
|
850
|
+
// the framework fails CLOSED (no auth bypass). On a Keycloak that emits
|
|
851
|
+
// AES-GCM + RSA-OAEP-SHA256 (26.2+, where the encryption algorithm attributes
|
|
852
|
+
// take effect), the GCM branch asserts nameId/issuer/audience decrypt. The SP
|
|
853
|
+
// keypair is generated at runtime so no private key is committed.
|
|
854
|
+
var spEnc = _generateSpEncryptionKeypair();
|
|
855
|
+
if (!spEnc) {
|
|
856
|
+
check("SAML EncryptedAssertion: skipped — openssl unavailable for runtime SP cert (see file header)", true);
|
|
857
|
+
} else {
|
|
858
|
+
await _ensureSamlEncClient(adminTok, spEnc.certDerB64);
|
|
859
|
+
var spEncHandle = b.auth.saml.sp.create({
|
|
860
|
+
entityId: SP_ENC_ENTITY_ID,
|
|
861
|
+
assertionConsumerServiceUrl: SP_ACS_URL,
|
|
862
|
+
idpEntityId: ISSUER,
|
|
863
|
+
idpSsoUrl: IDP_SSO_URL,
|
|
864
|
+
idpCertPem: idpSigningCertPem,
|
|
865
|
+
});
|
|
866
|
+
var arEnc = spEncHandle.buildAuthnRequest();
|
|
867
|
+
var encRespB64 = await _driveSamlLoginCapture(arEnc.redirectUrl);
|
|
868
|
+
check("SAML EncryptedAssertion: login round-trip captured a SAMLResponse",
|
|
869
|
+
typeof encRespB64 === "string" && encRespB64.length > 0);
|
|
870
|
+
if (encRespB64) {
|
|
871
|
+
var encXml = Buffer.from(encRespB64, "base64").toString("utf8");
|
|
872
|
+
check("SAML EncryptedAssertion: Keycloak returned an <EncryptedAssertion>",
|
|
873
|
+
encXml.indexOf("EncryptedAssertion") !== -1);
|
|
874
|
+
var contentAlgMatch = /EncryptedData\b[\s\S]*?EncryptionMethod Algorithm="([^"]+)"/.exec(encXml);
|
|
875
|
+
var keyAlgMatch = /EncryptedKey\b[\s\S]*?EncryptionMethod Algorithm="([^"]+)"/.exec(encXml);
|
|
876
|
+
var contentAlg = contentAlgMatch ? contentAlgMatch[1] : "";
|
|
877
|
+
var keyAlg = keyAlgMatch ? keyAlgMatch[1] : "";
|
|
878
|
+
var gcmContent = /aes(?:128|192|256)-gcm/.test(contentAlg);
|
|
879
|
+
var sha256Oaep = /xmlenc(?:11)?#sha(?:256|384|512)/.test(encXml);
|
|
880
|
+
if (gcmContent && sha256Oaep) {
|
|
881
|
+
// Keycloak >= 26.2 path: the framework decrypts the assertion.
|
|
882
|
+
var encInfo = spEncHandle.verifyResponse(encRespB64, {
|
|
883
|
+
spPrivateKeyPem: spEnc.keyPem,
|
|
884
|
+
expectedInResponseTo: arEnc.id,
|
|
885
|
+
});
|
|
886
|
+
check("SAML EncryptedAssertion: decrypted nameId is alice",
|
|
887
|
+
encInfo && (encInfo.nameId === TEST_USERNAME || encInfo.nameId === "alice@example.com"));
|
|
888
|
+
check("SAML EncryptedAssertion: decrypted issuer matches IdP entityID",
|
|
889
|
+
encInfo && encInfo.issuer === ISSUER);
|
|
890
|
+
check("SAML EncryptedAssertion: decrypted audience matches SP entityID",
|
|
891
|
+
encInfo && encInfo.audience === SP_ENC_ENTITY_ID);
|
|
892
|
+
} else {
|
|
893
|
+
// Keycloak 26.0.8 path: aes128-cbc + rsa-oaep-mgf1p(SHA-1). The framework
|
|
894
|
+
// refuses both by design; assert the fail-closed refusal against the real
|
|
895
|
+
// IdP output. Positive decrypt is pending a Keycloak >= 26.2 image.
|
|
896
|
+
var encThrew = null;
|
|
897
|
+
try {
|
|
898
|
+
spEncHandle.verifyResponse(encRespB64, {
|
|
899
|
+
spPrivateKeyPem: spEnc.keyPem,
|
|
900
|
+
expectedInResponseTo: arEnc.id,
|
|
901
|
+
});
|
|
902
|
+
} catch (e) { encThrew = e; }
|
|
903
|
+
check("SAML EncryptedAssertion: framework fails closed on Keycloak 26.0.8 weak-crypto envelope (" +
|
|
904
|
+
contentAlg + " / " + keyAlg + ")",
|
|
905
|
+
!!encThrew &&
|
|
906
|
+
/^auth-saml\/encrypted-(weak-oaep-digest|unsupported-content-alg|unsupported-key-alg)$/.test(encThrew.code || ""));
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
|
|
603
911
|
// ---- Federation primitives — deferred, document the open conditions ----
|
|
604
912
|
check("OID4VCI: deferred (Keycloak oid4vc-issuer SPI is preview-only)", true);
|
|
605
913
|
check("OID4VP: deferred (no wallet harness in the test stack)", true);
|
|
606
|
-
check("OpenID Federation:
|
|
914
|
+
check("OpenID Federation: covered by openid-federation-chain.test.js (loopback trust-chain, no Keycloak provider)", true);
|
|
607
915
|
check("OIDC Native SSO: deferred (Keycloak's device_secret support is preview-only)", true);
|
|
608
916
|
}
|
|
609
917
|
|
|
@@ -11,6 +11,12 @@
|
|
|
11
11
|
* Covers both signature algorithms the framework supports: rsa-sha256
|
|
12
12
|
* (RFC 6376) and ed25519-sha256 (RFC 8463). PQC DKIM is forward-looking
|
|
13
13
|
* — the framework's dkim docstring carries that intent already.
|
|
14
|
+
*
|
|
15
|
+
* The simple/simple canonicalization stage goes further than header
|
|
16
|
+
* presence: it fetches the RAW captured source back out of mailpit and
|
|
17
|
+
* cryptographically verifies the signature over the bytes that actually
|
|
18
|
+
* traversed the SMTP wire — simple canonicalization tolerates zero byte
|
|
19
|
+
* drift, so any framing change between sign and capture fails it.
|
|
14
20
|
*/
|
|
15
21
|
var fs = require("node:fs");
|
|
16
22
|
var http = require("node:http");
|
|
@@ -109,6 +115,77 @@ async function _runWithAlgorithm(algorithm, privateKey, label) {
|
|
|
109
115
|
/b=[A-Za-z0-9+/=\s]+/.test(raw));
|
|
110
116
|
}
|
|
111
117
|
|
|
118
|
+
// Sign with simple/simple canonicalization, deliver through the live SMTP
|
|
119
|
+
// transport, then VERIFY the signature on the raw bytes mailpit captured.
|
|
120
|
+
// Simple canonicalization signs the headers and body verbatim (RFC 6376
|
|
121
|
+
// sections 3.4.1 and 3.4.3), so this only passes when the exact signed
|
|
122
|
+
// bytes survive smtpTransport framing, the SMTP hop, and mailpit capture.
|
|
123
|
+
async function _runSimpleCanonWireVerify() {
|
|
124
|
+
await _httpDelete("http://127.0.0.1:8025/api/v1/messages");
|
|
125
|
+
|
|
126
|
+
var caPem = fs.readFileSync(process.env.BLAMEJS_TEST_CA_PATH, "utf8");
|
|
127
|
+
var kp = crypto.generateKeyPairSync("rsa", {
|
|
128
|
+
modulusLength: 2048,
|
|
129
|
+
privateKeyEncoding: { type: "pkcs8", format: "pem" },
|
|
130
|
+
publicKeyEncoding: { type: "spki", format: "pem" },
|
|
131
|
+
});
|
|
132
|
+
var signer = b.mail.dkim.create({
|
|
133
|
+
domain: "example.com",
|
|
134
|
+
selector: "test",
|
|
135
|
+
privateKey: kp.privateKey,
|
|
136
|
+
canonicalization: "simple/simple",
|
|
137
|
+
headersToSign: ["From", "To", "Subject", "Date"],
|
|
138
|
+
});
|
|
139
|
+
var transport = b.mail.transports.smtp({
|
|
140
|
+
host: "localhost",
|
|
141
|
+
port: 1025,
|
|
142
|
+
ehloName: "blamejs-test",
|
|
143
|
+
timeoutMs: 5000,
|
|
144
|
+
ca: caPem,
|
|
145
|
+
dkimSigner: signer,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
await transport.send({
|
|
149
|
+
from: "test@example.com",
|
|
150
|
+
to: ["dkim-simple@blamejs.local"],
|
|
151
|
+
subject: "dkim-simple-simple-" + Date.now(),
|
|
152
|
+
text: "Simple-canon wire-interop body line one.\r\nLine two.",
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
var listing = await _httpJson("http://127.0.0.1:8025/api/v1/messages");
|
|
156
|
+
check("[simple/simple] mailpit captured the dkim-signed message",
|
|
157
|
+
listing.messages.length === 1);
|
|
158
|
+
var captured = listing.messages[0];
|
|
159
|
+
var raw = await new Promise(function (resolve, reject) {
|
|
160
|
+
http.get("http://127.0.0.1:8025/api/v1/message/" + captured.ID + "/raw", function (res) {
|
|
161
|
+
var chunks = [];
|
|
162
|
+
res.on("data", function (c) { chunks.push(c); });
|
|
163
|
+
res.on("end", function () { resolve(Buffer.concat(chunks).toString("utf8")); });
|
|
164
|
+
}).once("error", reject);
|
|
165
|
+
});
|
|
166
|
+
check("[simple/simple] captured signature declares c=simple/simple",
|
|
167
|
+
/c=simple\/simple/.test(raw));
|
|
168
|
+
|
|
169
|
+
var pubB64 = kp.publicKey.replace(/-----[A-Z ]+-----/g, "").replace(/\s+/g, "");
|
|
170
|
+
var dnsLookup = async function () { return [["v=DKIM1; k=rsa; p=" + pubB64]]; };
|
|
171
|
+
b.mail.dkim._resetDkimKeyCacheForTest();
|
|
172
|
+
var rv = await b.mail.dkim.verify(raw, { dnsLookup: dnsLookup });
|
|
173
|
+
check("[simple/simple] wire-captured message verifies: result pass",
|
|
174
|
+
Array.isArray(rv) && rv.length === 1 && rv[0].result === "pass");
|
|
175
|
+
check("[simple/simple] wire verify reports zero errors",
|
|
176
|
+
rv[0] && Array.isArray(rv[0].errors) && rv[0].errors.length === 0);
|
|
177
|
+
|
|
178
|
+
// Control: the pass above is cryptographic, not vacuous — one flipped
|
|
179
|
+
// body byte in the captured source must flip the verdict to fail.
|
|
180
|
+
var tampered = raw.replace("wire-interop body line one", "wire-interop body line 0ne");
|
|
181
|
+
check("[simple/simple] tamper control mutated the captured body",
|
|
182
|
+
tampered !== raw);
|
|
183
|
+
b.mail.dkim._resetDkimKeyCacheForTest();
|
|
184
|
+
var rvTampered = await b.mail.dkim.verify(tampered, { dnsLookup: dnsLookup });
|
|
185
|
+
check("[simple/simple] tampered wire body fails verification",
|
|
186
|
+
rvTampered[0] && rvTampered[0].result === "fail");
|
|
187
|
+
}
|
|
188
|
+
|
|
112
189
|
async function run() {
|
|
113
190
|
var svc = await services.requireService("mailpit");
|
|
114
191
|
if (!svc.ok) throw new Error("mailpit unreachable: " + svc.reason);
|
|
@@ -128,6 +205,9 @@ async function run() {
|
|
|
128
205
|
});
|
|
129
206
|
await _runWithAlgorithm("ed25519-sha256", ed.privateKey, "ed25519");
|
|
130
207
|
|
|
208
|
+
// ---- simple/simple canonicalization verified on the wire bytes ----
|
|
209
|
+
await _runSimpleCanonWireVerify();
|
|
210
|
+
|
|
131
211
|
// ---- bad algorithm rejected at signer build time ----
|
|
132
212
|
var threw = null;
|
|
133
213
|
try {
|