@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,127 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.middleware.requireContentType — MIME-confusion refusal.
|
|
6
|
+
*
|
|
7
|
+
* Drives the RFC 9110 §15.5.16 415 gate: body-bearing verbs whose
|
|
8
|
+
* Content-Type is off the allowlist are refused with an Accept header;
|
|
9
|
+
* idempotent verbs bypass; parameters (charset) are ignored on the
|
|
10
|
+
* bare type; the methods override + onDeny hook + create-time
|
|
11
|
+
* validation are exercised.
|
|
12
|
+
*
|
|
13
|
+
* Run standalone: `node test/layer-0-primitives/middleware-require-content-type.test.js`
|
|
14
|
+
* Or via smoke: `node test/smoke.js`
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
var helpers = require("../helpers");
|
|
18
|
+
var b = helpers.b;
|
|
19
|
+
var check = helpers.check;
|
|
20
|
+
|
|
21
|
+
function _drive(mw, method, contentType) {
|
|
22
|
+
var headers = contentType ? { "content-type": contentType } : {};
|
|
23
|
+
var req = { method: method, url: "/api/echo", headers: headers };
|
|
24
|
+
var res = b.testing.mockRes();
|
|
25
|
+
var nextCalled = false;
|
|
26
|
+
mw(req, res, function () { nextCalled = true; });
|
|
27
|
+
var cap = res._captured();
|
|
28
|
+
cap.nextCalled = nextCalled;
|
|
29
|
+
return cap;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function testAllowedTypePasses() {
|
|
33
|
+
var mw = b.middleware.requireContentType(["application/json"]);
|
|
34
|
+
var cap = _drive(mw, "POST", "application/json");
|
|
35
|
+
check("requireContentType: allowed Content-Type passes through", cap.nextCalled === true);
|
|
36
|
+
check("requireContentType: allowed request writes no refusal", cap.status === null);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function testCharsetParameterIgnored() {
|
|
40
|
+
var mw = b.middleware.requireContentType(["application/json"]);
|
|
41
|
+
var cap = _drive(mw, "POST", "application/json; charset=utf-8");
|
|
42
|
+
check("requireContentType: charset parameter ignored on the bare type",
|
|
43
|
+
cap.nextCalled === true);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function testWrongTypeRefused() {
|
|
47
|
+
var mw = b.middleware.requireContentType(["application/json"]);
|
|
48
|
+
var cap = _drive(mw, "POST", "application/x-www-form-urlencoded");
|
|
49
|
+
check("requireContentType: off-allowlist type refused with 415", cap.status === 415);
|
|
50
|
+
check("requireContentType: refusal does not delegate", cap.nextCalled === false);
|
|
51
|
+
check("requireContentType: 415 advertises the accepted types via Accept",
|
|
52
|
+
cap.headers["accept"] === "application/json");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function testAbsentTypeRefused() {
|
|
56
|
+
var mw = b.middleware.requireContentType(["application/json"]);
|
|
57
|
+
var cap = _drive(mw, "PUT", null);
|
|
58
|
+
check("requireContentType: absent Content-Type on a body verb refused with 415",
|
|
59
|
+
cap.status === 415 && cap.nextCalled === false);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function testIdempotentVerbsBypass() {
|
|
63
|
+
var mw = b.middleware.requireContentType(["application/json"]);
|
|
64
|
+
var get = _drive(mw, "GET", null);
|
|
65
|
+
check("requireContentType: GET bypasses the check", get.nextCalled === true);
|
|
66
|
+
var del = _drive(mw, "DELETE", "text/plain");
|
|
67
|
+
check("requireContentType: DELETE bypasses by default (no body verb)",
|
|
68
|
+
del.nextCalled === true);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function testMethodsOverride() {
|
|
72
|
+
// Operators enforcing content-type on a rare DELETE-with-body shape.
|
|
73
|
+
var mw = b.middleware.requireContentType(["application/json"], { methods: ["DELETE"] });
|
|
74
|
+
var refused = _drive(mw, "DELETE", "text/plain");
|
|
75
|
+
check("requireContentType: methods override enforces on DELETE", refused.status === 415);
|
|
76
|
+
var passed = _drive(mw, "POST", "text/plain");
|
|
77
|
+
check("requireContentType: methods override removes the default POST enforcement",
|
|
78
|
+
passed.nextCalled === true);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function testOnDenyHookOwnsRefusal() {
|
|
82
|
+
var seen = null;
|
|
83
|
+
var mw = b.middleware.requireContentType(["application/json"], {
|
|
84
|
+
onDeny: function (req, res, info) {
|
|
85
|
+
seen = info;
|
|
86
|
+
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
87
|
+
res.end("bad-type");
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
var cap = _drive(mw, "POST", "text/xml");
|
|
91
|
+
check("requireContentType: onDeny hook owns the refusal",
|
|
92
|
+
cap.status === 400 && cap.body === "bad-type");
|
|
93
|
+
check("requireContentType: onDeny info carries the offending + accepted types",
|
|
94
|
+
seen && seen.contentType === "text/xml" && seen.accepted.indexOf("application/json") !== -1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function testCreateValidationThrows() {
|
|
98
|
+
function code(fn) {
|
|
99
|
+
try { fn(); return null; } catch (e) { return e.code || e.message; }
|
|
100
|
+
}
|
|
101
|
+
check("requireContentType: empty allowlist throws",
|
|
102
|
+
/no-allowlist/.test(code(function () { b.middleware.requireContentType([]); })));
|
|
103
|
+
check("requireContentType: non-array allowlist throws",
|
|
104
|
+
/no-allowlist/.test(code(function () { b.middleware.requireContentType("application/json"); })));
|
|
105
|
+
check("requireContentType: non-string entry throws",
|
|
106
|
+
/no-allowlist/.test(code(function () { b.middleware.requireContentType([42]); })));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function run() {
|
|
110
|
+
testAllowedTypePasses();
|
|
111
|
+
testCharsetParameterIgnored();
|
|
112
|
+
testWrongTypeRefused();
|
|
113
|
+
testAbsentTypeRefused();
|
|
114
|
+
testIdempotentVerbsBypass();
|
|
115
|
+
testMethodsOverride();
|
|
116
|
+
testOnDenyHookOwnsRefusal();
|
|
117
|
+
testCreateValidationThrows();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
module.exports = { run: run };
|
|
121
|
+
|
|
122
|
+
if (require.main === module) {
|
|
123
|
+
Promise.resolve().then(run).then(
|
|
124
|
+
function () { console.log("OK — " + helpers.getChecks() + " checks passed"); },
|
|
125
|
+
function (e) { console.error("FAIL:", e && e.message); process.exit(1); }
|
|
126
|
+
);
|
|
127
|
+
}
|
|
@@ -273,6 +273,20 @@ async function run() {
|
|
|
273
273
|
check("HEAD: deferred upload advertises Upload-Defer-Length:1",
|
|
274
274
|
defHead.status === 200 && defHead.headers["upload-defer-length"] === "1");
|
|
275
275
|
|
|
276
|
+
// creation-with-upload: the RFC 7231 media type is case-insensitive and may
|
|
277
|
+
// carry parameters. An exact-string compare skipped the append path for a
|
|
278
|
+
// compliant `Application/Offset+Octet-Stream` (or `...; charset` variant),
|
|
279
|
+
// creating the upload but silently ignoring the body. Both variants must
|
|
280
|
+
// append in the same request (Upload-Offset advances to the body length).
|
|
281
|
+
var cwUpper = await _drive(tus, _sreq("POST", "/uploads",
|
|
282
|
+
{ "tus-resumable": VER, "upload-length": "5", "content-type": "Application/Offset+Octet-Stream" }, "hello"));
|
|
283
|
+
check("POST creation-with-upload: mixed-case Content-Type appends the body",
|
|
284
|
+
cwUpper.status === 201 && cwUpper.headers["upload-offset"] === "5");
|
|
285
|
+
var cwParam = await _drive(tus, _sreq("POST", "/uploads",
|
|
286
|
+
{ "tus-resumable": VER, "upload-length": "5", "content-type": "application/offset+octet-stream; charset=binary" }, "world"));
|
|
287
|
+
check("POST creation-with-upload: Content-Type with a parameter appends the body",
|
|
288
|
+
cwParam.status === 201 && cwParam.headers["upload-offset"] === "5");
|
|
289
|
+
|
|
276
290
|
// ---------------------------------------------------------------
|
|
277
291
|
// F. HEAD refusals
|
|
278
292
|
// ---------------------------------------------------------------
|
|
@@ -390,6 +404,37 @@ async function run() {
|
|
|
390
404
|
var postRes = await _drive(tus, _req("POST", "/uploads/abcdef", { "tus-resumable": VER }));
|
|
391
405
|
check("405: POST on resource → Allow includes DELETE",
|
|
392
406
|
postRes.status === 405 && /DELETE/.test(postRes.headers.allow));
|
|
407
|
+
|
|
408
|
+
// ---------------------------------------------------------------
|
|
409
|
+
// J. tusUpload.close — graceful-shutdown resource release
|
|
410
|
+
// ---------------------------------------------------------------
|
|
411
|
+
// The close helper is a public primitive (advertised in the
|
|
412
|
+
// @primitive block) that operators call on shutdown; it must be
|
|
413
|
+
// reachable on the b.middleware.tusUpload surface, invoke a wired
|
|
414
|
+
// `.close` hook, and tolerate values that don't expose one.
|
|
415
|
+
check("tusUpload.close: exposed on the b.middleware.tusUpload surface",
|
|
416
|
+
typeof b.middleware.tusUpload.close === "function");
|
|
417
|
+
|
|
418
|
+
var hookCalls = 0;
|
|
419
|
+
b.middleware.tusUpload.close({ close: function () { hookCalls += 1; } });
|
|
420
|
+
check("tusUpload.close: invokes a wired close hook once", hookCalls === 1);
|
|
421
|
+
|
|
422
|
+
// A real middleware instance (no `.close` method today) — the helper
|
|
423
|
+
// is a tolerant no-op, not a throw.
|
|
424
|
+
var closableTus = _mkTus();
|
|
425
|
+
var threwOnRealMw = false;
|
|
426
|
+
try { b.middleware.tusUpload.close(closableTus); } catch (_e) { threwOnRealMw = true; }
|
|
427
|
+
check("tusUpload.close: tolerant no-op on a middleware without a close hook",
|
|
428
|
+
threwOnRealMw === false);
|
|
429
|
+
|
|
430
|
+
var threwOnNullish = false;
|
|
431
|
+
try {
|
|
432
|
+
b.middleware.tusUpload.close(null);
|
|
433
|
+
b.middleware.tusUpload.close(undefined);
|
|
434
|
+
b.middleware.tusUpload.close(function () {});
|
|
435
|
+
} catch (_e) { threwOnNullish = true; }
|
|
436
|
+
check("tusUpload.close: tolerant of null / undefined / bare function",
|
|
437
|
+
threwOnNullish === false);
|
|
393
438
|
}
|
|
394
439
|
|
|
395
440
|
module.exports = { run: run };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.middleware.webAppManifest — W3C Web App Manifest server.
|
|
6
|
+
*
|
|
7
|
+
* Drives the served-path, the optional /manifest.json alias, the
|
|
8
|
+
* method gate, and the create-time validation of the W3C-required
|
|
9
|
+
* fields (name / start_url / icons) plus the field allowlist.
|
|
10
|
+
*
|
|
11
|
+
* Run standalone: `node test/layer-0-primitives/middleware-web-app-manifest.test.js`
|
|
12
|
+
* Or via smoke: `node test/smoke.js`
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
var helpers = require("../helpers");
|
|
16
|
+
var b = helpers.b;
|
|
17
|
+
var check = helpers.check;
|
|
18
|
+
var _mockReq = helpers._mockReq;
|
|
19
|
+
var _mockRes = helpers._mockRes;
|
|
20
|
+
|
|
21
|
+
var BASE = {
|
|
22
|
+
name: "Example App",
|
|
23
|
+
start_url: "/",
|
|
24
|
+
display: "standalone",
|
|
25
|
+
icons: [
|
|
26
|
+
{ src: "/icons/192.png", sizes: "192x192", type: "image/png" },
|
|
27
|
+
{ src: "/icons/512.png", sizes: "512x512", type: "image/png" },
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
function _drive(mw, method, url) {
|
|
32
|
+
var res = _mockRes();
|
|
33
|
+
var nextCalled = false;
|
|
34
|
+
mw(_mockReq({ method: method, url: url }), res, function () { nextCalled = true; });
|
|
35
|
+
var cap = res._captured();
|
|
36
|
+
cap.nextCalled = nextCalled;
|
|
37
|
+
return cap;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function testServesWebmanifest() {
|
|
41
|
+
var mw = b.middleware.webAppManifest(BASE);
|
|
42
|
+
var cap = _drive(mw, "GET", "/manifest.webmanifest");
|
|
43
|
+
check("webAppManifest: served with HTTP 200", cap.status === 200);
|
|
44
|
+
check("webAppManifest: Content-Type is application/manifest+json",
|
|
45
|
+
cap.headers["content-type"] === "application/manifest+json");
|
|
46
|
+
check("webAppManifest: nosniff header present",
|
|
47
|
+
cap.headers["x-content-type-options"] === "nosniff");
|
|
48
|
+
var parsed = JSON.parse(cap.body);
|
|
49
|
+
check("webAppManifest: body carries the manifest fields",
|
|
50
|
+
parsed.name === "Example App" && parsed.start_url === "/" && parsed.icons.length === 2);
|
|
51
|
+
check("webAppManifest: internal opts (audit) are not leaked into the body",
|
|
52
|
+
parsed.audit === undefined && parsed.alsoAtJsonPath === undefined);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function testJsonAliasOptIn() {
|
|
56
|
+
var without = b.middleware.webAppManifest(BASE);
|
|
57
|
+
var capOff = _drive(without, "GET", "/manifest.json");
|
|
58
|
+
check("webAppManifest: /manifest.json NOT served by default", capOff.nextCalled === true);
|
|
59
|
+
|
|
60
|
+
var withAlias = b.middleware.webAppManifest(Object.assign({ alsoAtJsonPath: true }, BASE));
|
|
61
|
+
var capOn = _drive(withAlias, "GET", "/manifest.json");
|
|
62
|
+
check("webAppManifest: /manifest.json served when alsoAtJsonPath:true", capOn.status === 200);
|
|
63
|
+
// The canonical path still serves regardless.
|
|
64
|
+
var capCanonical = _drive(withAlias, "GET", "/manifest.webmanifest");
|
|
65
|
+
check("webAppManifest: canonical path still served alongside the alias",
|
|
66
|
+
capCanonical.status === 200);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function testNonMatchingPathPassesThrough() {
|
|
70
|
+
var mw = b.middleware.webAppManifest(BASE);
|
|
71
|
+
var cap = _drive(mw, "GET", "/index.html");
|
|
72
|
+
check("webAppManifest: unrelated path delegates via next()", cap.nextCalled === true);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function testHeadServesNoBody() {
|
|
76
|
+
var mw = b.middleware.webAppManifest(BASE);
|
|
77
|
+
var cap = _drive(mw, "HEAD", "/manifest.webmanifest");
|
|
78
|
+
check("webAppManifest: HEAD returns 200 with no body",
|
|
79
|
+
cap.status === 200 && cap.body === "");
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function testMethodGate() {
|
|
83
|
+
var mw = b.middleware.webAppManifest(BASE);
|
|
84
|
+
var cap = _drive(mw, "POST", "/manifest.webmanifest");
|
|
85
|
+
check("webAppManifest: POST refused with 405", cap.status === 405);
|
|
86
|
+
check("webAppManifest: 405 advertises Allow: GET, HEAD",
|
|
87
|
+
cap.headers["allow"] === "GET, HEAD");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function testCreateValidationThrows() {
|
|
91
|
+
function code(fn) {
|
|
92
|
+
try { fn(); return null; } catch (e) { return e.code || e.message; }
|
|
93
|
+
}
|
|
94
|
+
check("webAppManifest: missing name throws",
|
|
95
|
+
/no-name/.test(code(function () {
|
|
96
|
+
b.middleware.webAppManifest({ start_url: "/", icons: BASE.icons });
|
|
97
|
+
})));
|
|
98
|
+
check("webAppManifest: missing start_url throws",
|
|
99
|
+
/no-start-url/.test(code(function () {
|
|
100
|
+
b.middleware.webAppManifest({ name: "X", icons: BASE.icons });
|
|
101
|
+
})));
|
|
102
|
+
check("webAppManifest: missing icons throws",
|
|
103
|
+
/no-icons/.test(code(function () {
|
|
104
|
+
b.middleware.webAppManifest({ name: "X", start_url: "/" });
|
|
105
|
+
})));
|
|
106
|
+
check("webAppManifest: empty icons array throws",
|
|
107
|
+
/no-icons/.test(code(function () {
|
|
108
|
+
b.middleware.webAppManifest({ name: "X", start_url: "/", icons: [] });
|
|
109
|
+
})));
|
|
110
|
+
check("webAppManifest: field outside the W3C allowlist throws (typo surfacing)",
|
|
111
|
+
code(function () {
|
|
112
|
+
b.middleware.webAppManifest(Object.assign({ nam: "typo" }, BASE));
|
|
113
|
+
}) !== null);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function run() {
|
|
117
|
+
testServesWebmanifest();
|
|
118
|
+
testJsonAliasOptIn();
|
|
119
|
+
testNonMatchingPathPassesThrough();
|
|
120
|
+
testHeadServesNoBody();
|
|
121
|
+
testMethodGate();
|
|
122
|
+
testCreateValidationThrows();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
module.exports = { run: run };
|
|
126
|
+
|
|
127
|
+
if (require.main === module) {
|
|
128
|
+
Promise.resolve().then(run).then(
|
|
129
|
+
function () { console.log("OK — " + helpers.getChecks() + " checks passed"); },
|
|
130
|
+
function (e) { console.error("FAIL:", e && e.message); process.exit(1); }
|
|
131
|
+
);
|
|
132
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.mtlsCa.generateCrl must tolerate a registry that holds fingerprint-only
|
|
6
|
+
* revocations.
|
|
7
|
+
*
|
|
8
|
+
* revoke({ fingerprint }) is a first-class revocation mode — it is the value
|
|
9
|
+
* the require-mtls gate pins on, and generateClientCert surfaces a fingerprint
|
|
10
|
+
* for exactly this use. Such an entry carries no certificate serial number. A
|
|
11
|
+
* standard X.509 CRL (RFC 5280 §5.1) is keyed by serial, so a fingerprint-only
|
|
12
|
+
* entry cannot be represented in the CRL and must be projected out.
|
|
13
|
+
*
|
|
14
|
+
* Before the fix, generateCrl handed the null serial straight to the CRL
|
|
15
|
+
* encoder, which threw ("Cannot read properties of null"). That broke CRL
|
|
16
|
+
* generation for the WHOLE registry — including the serial-keyed certs that
|
|
17
|
+
* CAN be published — so a single (correct) fingerprint-based revocation stalled
|
|
18
|
+
* the entire published-revocation path: a fail-open for every OTHER revoked
|
|
19
|
+
* cert whose serial should have appeared in a fresh CRL.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
var helpers = require("../helpers");
|
|
23
|
+
var b = helpers.b;
|
|
24
|
+
var check = helpers.check;
|
|
25
|
+
var fs = require("fs");
|
|
26
|
+
var os = require("os");
|
|
27
|
+
var path = require("path");
|
|
28
|
+
var pki = require("../../lib/vendor/pki.cjs");
|
|
29
|
+
|
|
30
|
+
function _normHex(s) { return String(s || "").replace(/^0x/i, "").replace(/[:\-\s]/g, "").toLowerCase(); }
|
|
31
|
+
|
|
32
|
+
function _crlSerials(crlPem) {
|
|
33
|
+
var crl = new pki.x509.X509Crl(crlPem);
|
|
34
|
+
return (crl.entries || []).map(function (e) { return _normHex(e.serialNumber); });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function run() {
|
|
38
|
+
// ---- Scenario 1: a serial-revoked cert AND a fingerprint-only revocation
|
|
39
|
+
// coexist. The CRL must still publish the serial-revoked cert. ----
|
|
40
|
+
var dir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-mtls-crl-fp-"));
|
|
41
|
+
var ca = b.mtlsCa.create({ dataDir: dir, caKeySealedMode: "disabled", generation: 1 });
|
|
42
|
+
|
|
43
|
+
var a = await ca.generateClientCert({ cn: "serial-revoked" });
|
|
44
|
+
var bCert = await ca.generateClientCert({ cn: "fingerprint-revoked" });
|
|
45
|
+
|
|
46
|
+
ca.revoke(a.serialNumber, { reason: "superseded" }); // serial-keyed
|
|
47
|
+
ca.revoke({ fingerprint: bCert.fingerprint, reason: "keyCompromise" }); // fingerprint-only (null serial)
|
|
48
|
+
|
|
49
|
+
// RED before the fix: this throws inside the CRL encoder on the null serial.
|
|
50
|
+
var res = await ca.generateCrl();
|
|
51
|
+
|
|
52
|
+
check("generateCrl succeeds with a mixed serial + fingerprint-only registry",
|
|
53
|
+
res && typeof res.crlPem === "string" && res.crlPem.indexOf("BEGIN CRL") !== -1);
|
|
54
|
+
check("generateCrl entryCount counts only the serial-bearing (CRL-able) revocations",
|
|
55
|
+
res.entryCount === 1);
|
|
56
|
+
check("generateCrl surfaces the count of fingerprint-only revocations it could not represent",
|
|
57
|
+
res.fingerprintOnlyOmitted === 1);
|
|
58
|
+
|
|
59
|
+
var serials = _crlSerials(res.crlPem);
|
|
60
|
+
check("the serial-revoked cert IS published in the CRL (not lost to the null-serial crash)",
|
|
61
|
+
serials.indexOf(_normHex(a.serialNumber)) !== -1);
|
|
62
|
+
check("the CRL carries exactly the one serial-keyed entry",
|
|
63
|
+
serials.length === 1);
|
|
64
|
+
|
|
65
|
+
// ---- Scenario 2: a registry with ONLY fingerprint-only revocations still
|
|
66
|
+
// produces a valid (empty) CRL rather than throwing. ----
|
|
67
|
+
var dir2 = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-mtls-crl-fponly-"));
|
|
68
|
+
var ca2 = b.mtlsCa.create({ dataDir: dir2, caKeySealedMode: "disabled" });
|
|
69
|
+
var c = await ca2.generateClientCert({ cn: "only-fp" });
|
|
70
|
+
ca2.revoke({ fingerprint: c.fingerprint });
|
|
71
|
+
|
|
72
|
+
var res2 = await ca2.generateCrl();
|
|
73
|
+
check("generateCrl with only fingerprint-only revocations produces a valid CRL",
|
|
74
|
+
res2 && typeof res2.crlPem === "string" && res2.crlPem.indexOf("BEGIN CRL") !== -1);
|
|
75
|
+
check("that CRL has zero serial entries", _crlSerials(res2.crlPem).length === 0);
|
|
76
|
+
check("entryCount is 0 and fingerprintOnlyOmitted is 1",
|
|
77
|
+
res2.entryCount === 0 && res2.fingerprintOnlyOmitted === 1);
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
81
|
+
fs.rmSync(dir2, { recursive: true, force: true });
|
|
82
|
+
} catch (_e) { /* best-effort */ }
|
|
83
|
+
|
|
84
|
+
console.log("OK — mtls-ca CRL fingerprint-only tolerance (" + helpers.getChecks() + " checks)");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
module.exports = { run: run };
|
|
88
|
+
|
|
89
|
+
if (require.main === module) {
|
|
90
|
+
run().then(function () { process.exit(0); })
|
|
91
|
+
.catch(function (err) { process.exitCode = 1; throw err; });
|
|
92
|
+
}
|
|
@@ -258,6 +258,69 @@ async function testServeStaleOnUpstreamFailure() {
|
|
|
258
258
|
check("serve-stale marks fromCache=true", r2.fromCache === true);
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
+
async function testServeStaleDoesNotBypassValidate() {
|
|
262
|
+
// The `validate: true` gate (RFC 4035 §3.2.3 AD bit) must hold on the
|
|
263
|
+
// serve-stale path too: a stale entry that was cached AD=0 must be
|
|
264
|
+
// REFUSED for a validating caller, not returned as a silent success.
|
|
265
|
+
// Otherwise an attacker who can force an upstream outage downgrades a
|
|
266
|
+
// DNSSEC-strict lookup (DANE TLSA / DS) to unauthenticated stale data.
|
|
267
|
+
var callCount = 0;
|
|
268
|
+
var transport = {
|
|
269
|
+
lookup: function (name, qtype) {
|
|
270
|
+
callCount += 1;
|
|
271
|
+
if (callCount === 1) {
|
|
272
|
+
return Promise.resolve(_aRecordResponse("example.com", "192.0.2.1", 1, false)); // AD=0
|
|
273
|
+
}
|
|
274
|
+
return Promise.reject(new Error("upstream-down"));
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
var r = b.network.dns.resolver.create({
|
|
278
|
+
transport: transport,
|
|
279
|
+
minTtlMs: 1,
|
|
280
|
+
maxTtlMs: 20,
|
|
281
|
+
serveStale: 60000,
|
|
282
|
+
});
|
|
283
|
+
await r.queryA("example.com"); // warm cache (no validate), AD=0
|
|
284
|
+
await helpers.passiveObserve(80, "dns-resolver: cache TTL elapsed for stale-validate test");
|
|
285
|
+
|
|
286
|
+
var threw = null;
|
|
287
|
+
var got = null;
|
|
288
|
+
try { got = await r.queryA("example.com", { validate: true }); }
|
|
289
|
+
catch (e) { threw = e; }
|
|
290
|
+
check("stale-serve does not bypass validate (AD=0 refused)",
|
|
291
|
+
threw && threw.code === "resolver/validate-failed");
|
|
292
|
+
check("stale-serve never returns an unvalidated response to a validating caller",
|
|
293
|
+
got === null);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
async function testServeStaleValidateAcceptsAdOne() {
|
|
297
|
+
// Complement: a stale entry that WAS AD=1 stays acceptable to a
|
|
298
|
+
// validating caller — the gate refuses AD=0, not serve-stale itself.
|
|
299
|
+
var callCount = 0;
|
|
300
|
+
var transport = {
|
|
301
|
+
lookup: function (name, qtype) {
|
|
302
|
+
callCount += 1;
|
|
303
|
+
if (callCount === 1) {
|
|
304
|
+
return Promise.resolve(_aRecordResponse("example.com", "192.0.2.1", 1, true)); // AD=1
|
|
305
|
+
}
|
|
306
|
+
return Promise.reject(new Error("upstream-down"));
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
var r = b.network.dns.resolver.create({
|
|
310
|
+
transport: transport,
|
|
311
|
+
minTtlMs: 1,
|
|
312
|
+
maxTtlMs: 20,
|
|
313
|
+
serveStale: 60000,
|
|
314
|
+
});
|
|
315
|
+
await r.queryA("example.com", { validate: true }); // warm cache, AD=1
|
|
316
|
+
await helpers.passiveObserve(80, "dns-resolver: cache TTL elapsed for stale-validate-ad1 test");
|
|
317
|
+
|
|
318
|
+
var got = await r.queryA("example.com", { validate: true });
|
|
319
|
+
check("stale-serve AD=1 accepted by validating caller", got.rrs[0].decoded === "192.0.2.1");
|
|
320
|
+
check("stale-serve AD=1 marks stale=true", got.stale === true);
|
|
321
|
+
check("stale-serve AD=1 keeps validated=true", got.validated === true);
|
|
322
|
+
}
|
|
323
|
+
|
|
261
324
|
async function testServeStaleDisabled() {
|
|
262
325
|
// With serveStale: false, upstream failure throws even with cache.
|
|
263
326
|
var callCount = 0;
|
|
@@ -381,6 +444,8 @@ async function run() {
|
|
|
381
444
|
await testFollowsCnameChain();
|
|
382
445
|
await testCnameChainCap();
|
|
383
446
|
await testServeStaleOnUpstreamFailure();
|
|
447
|
+
await testServeStaleDoesNotBypassValidate();
|
|
448
|
+
await testServeStaleValidateAcceptsAdOne();
|
|
384
449
|
await testServeStaleDisabled();
|
|
385
450
|
await testNxdomainRefused();
|
|
386
451
|
await testBadInput();
|