@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
|
@@ -133,10 +133,18 @@ var CORE_CAPABILITIES = Object.freeze({
|
|
|
133
133
|
function validate(rawBody, opts) {
|
|
134
134
|
opts = opts || {};
|
|
135
135
|
var profileName = typeof opts.profile === "string" ? opts.profile : DEFAULT_PROFILE;
|
|
136
|
-
|
|
136
|
+
// hasOwnProperty on both lookups: opts.profile / opts.posture are caller
|
|
137
|
+
// input, and a bare bracket read resolves an inherited Object.prototype
|
|
138
|
+
// key (constructor / __proto__ / toString / ...) to a truthy value —
|
|
139
|
+
// PROFILES["constructor"] is the Object function, so `if (!caps)` never
|
|
140
|
+
// fires and every size / count cap compares against `undefined` (fails
|
|
141
|
+
// open). An unknown posture is ignored (falls through to profile/default)
|
|
142
|
+
// as before; an unknown profile throws bad-profile.
|
|
143
|
+
if (opts.posture && Object.prototype.hasOwnProperty.call(COMPLIANCE_POSTURES, opts.posture)) {
|
|
137
144
|
profileName = COMPLIANCE_POSTURES[opts.posture];
|
|
138
145
|
}
|
|
139
|
-
var caps = PROFILES
|
|
146
|
+
var caps = Object.prototype.hasOwnProperty.call(PROFILES, profileName)
|
|
147
|
+
? PROFILES[profileName] : undefined;
|
|
140
148
|
if (!caps) {
|
|
141
149
|
throw new GuardJmapError("guard-jmap/bad-profile",
|
|
142
150
|
"guardJmap.validate: unknown profile '" + profileName + "'");
|
|
@@ -198,7 +206,15 @@ function validate(rawBody, opts) {
|
|
|
198
206
|
throw new GuardJmapError("urn:ietf:params:jmap:error:invalidArguments",
|
|
199
207
|
"guardJmap.validate: `using[" + ui + "]` must be a string capability URI");
|
|
200
208
|
}
|
|
201
|
-
|
|
209
|
+
// hasOwnProperty on both tables: `cap` is attacker-supplied (from the
|
|
210
|
+
// request body). A bare `serverCaps[cap]` bracket read resolves an
|
|
211
|
+
// inherited Object.prototype member (constructor / __proto__ / toString
|
|
212
|
+
// / ...) to a truthy value, letting a prototype-key capability pass the
|
|
213
|
+
// allowlist the server never advertised. Own-key AND truthy preserves
|
|
214
|
+
// the operator's "capability: false disables it" semantics.
|
|
215
|
+
var advertised = Object.prototype.hasOwnProperty.call(CORE_CAPABILITIES, cap) ||
|
|
216
|
+
(Object.prototype.hasOwnProperty.call(serverCaps, cap) && serverCaps[cap]);
|
|
217
|
+
if (!advertised) {
|
|
202
218
|
throw new GuardJmapError("urn:ietf:params:jmap:error:unknownCapability",
|
|
203
219
|
"guardJmap.validate: capability '" + cap + "' not advertised by this server");
|
|
204
220
|
}
|
|
@@ -312,9 +312,25 @@ function _detectIssues(input, opts) {
|
|
|
312
312
|
}
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
// Payload claim sanity
|
|
315
|
+
// Payload claim sanity. A JWT claims set MUST be a JSON object (RFC 7519
|
|
316
|
+
// §7.2); a payload that does not decode to one — undecodable base64url,
|
|
317
|
+
// non-JSON bytes, a JSON primitive, or a JSON array — is refused
|
|
318
|
+
// symmetrically with the header-decode path above. Skipping it silently
|
|
319
|
+
// (the earlier behaviour) let the required-claims and exp/nbf/iat sanity
|
|
320
|
+
// checks never run, so a token carrying no readable claims set passed at
|
|
321
|
+
// strict with the guard's advertised required-claims enforcement bypassed.
|
|
316
322
|
var payload = _b64urlDecodeJson(payloadSeg);
|
|
317
|
-
if (payload
|
|
323
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
|
|
324
|
+
issues.push({
|
|
325
|
+
kind: "payload-decode", severity: "high",
|
|
326
|
+
ruleId: "jwt.payload-decode",
|
|
327
|
+
snippet: "JWT payload is not a decodable JSON object (a JWT claims " +
|
|
328
|
+
"set must be a JSON object per RFC 7519 §7.2) or contains " +
|
|
329
|
+
"prototype-pollution keys",
|
|
330
|
+
});
|
|
331
|
+
return issues;
|
|
332
|
+
}
|
|
333
|
+
{
|
|
318
334
|
var nowSec = Math.floor(Date.now() / 1000); // seconds-per-millisecond conversion
|
|
319
335
|
|
|
320
336
|
// exp in the past.
|
|
@@ -174,7 +174,7 @@ function _isRefusedAutoFetchHost(hostname, allowedHosts) {
|
|
|
174
174
|
}
|
|
175
175
|
if (lower.length === 0) return "missing-host";
|
|
176
176
|
if (IPV4_LITERAL_RE.test(lower) || IPV6_LITERAL_RE.test(lower)) return "ip-literal";
|
|
177
|
-
if (RESERVED_LOCAL_HOSTS
|
|
177
|
+
if (Object.prototype.hasOwnProperty.call(RESERVED_LOCAL_HOSTS, lower)) return "reserved-local-host";
|
|
178
178
|
// Hostname suffix refusal — RFC 6761 reserved / mDNS / single-network.
|
|
179
179
|
if (lower === "local" || lower.endsWith(".local")) return "reserved-local-suffix";
|
|
180
180
|
if (lower === "lan" || lower.endsWith(".lan")) return "reserved-local-suffix";
|
|
@@ -277,7 +277,7 @@ function validate(headers, opts) {
|
|
|
277
277
|
return _verdict("refuse", "URI '" + _trunc(u) + "' has no scheme (RFC 3986 §3.1)",
|
|
278
278
|
{ uris: classified, hasHttpsUri: hasHttpsUri, hasMailtoUri: hasMailtoUri, postHeaderOk: false });
|
|
279
279
|
}
|
|
280
|
-
if (DANGEROUS_SCHEMES
|
|
280
|
+
if (Object.prototype.hasOwnProperty.call(DANGEROUS_SCHEMES, scheme)) {
|
|
281
281
|
return _verdict("refuse", "URI scheme '" + scheme + "' is on the always-refused list (XSS / file-read class)",
|
|
282
282
|
{ uris: classified, hasHttpsUri: hasHttpsUri, hasMailtoUri: hasMailtoUri, postHeaderOk: false });
|
|
283
283
|
}
|
|
@@ -202,10 +202,18 @@ var LITERAL_RE = /^\{([0-9]{1,10})(\+?)\}$/;
|
|
|
202
202
|
function validate(line, opts) {
|
|
203
203
|
opts = opts || {};
|
|
204
204
|
var profileName = typeof opts.profile === "string" ? opts.profile : DEFAULT_PROFILE;
|
|
205
|
-
|
|
205
|
+
// hasOwnProperty on both lookups: opts.profile / opts.posture are caller
|
|
206
|
+
// input, and a bare bracket read resolves an inherited Object.prototype
|
|
207
|
+
// key (constructor / __proto__ / toString / ...) to a truthy value —
|
|
208
|
+
// PROFILES["constructor"] is the Object function, so `if (!caps)` never
|
|
209
|
+
// fires and every line / script / script-name cap compares against
|
|
210
|
+
// `undefined` (fails open). An unknown posture is ignored (falls through
|
|
211
|
+
// to profile/default); an unknown profile throws bad-profile.
|
|
212
|
+
if (opts.posture && Object.prototype.hasOwnProperty.call(COMPLIANCE_POSTURES, opts.posture)) {
|
|
206
213
|
profileName = COMPLIANCE_POSTURES[opts.posture];
|
|
207
214
|
}
|
|
208
|
-
var caps = PROFILES
|
|
215
|
+
var caps = Object.prototype.hasOwnProperty.call(PROFILES, profileName)
|
|
216
|
+
? PROFILES[profileName] : undefined;
|
|
209
217
|
if (!caps) {
|
|
210
218
|
throw new GuardManageSieveCommandError("guard-managesieve-command/bad-profile",
|
|
211
219
|
"guardManageSieveCommand.validate: unknown profile '" + profileName + "'");
|
|
@@ -87,8 +87,6 @@ var INLINE_LINK_RE = /(!?)\[([^\]\n]*)\]\(\s*([^)\s]+)\s*(?:"[^"]*")?\s*\)/g;
|
|
|
87
87
|
var AUTOLINK_RE = /<((?:[a-zA-Z][a-zA-Z0-9+.-]{0,32}):[^\s>]+)>/g;
|
|
88
88
|
// Reference-link definition `[label]: url "title"`.
|
|
89
89
|
var REF_DEF_RE = /^\s{0,3}\[([^\]\n]+)\]:\s*([^\s]+)/gm;
|
|
90
|
-
// HTML entity hex / decimal scheme bypass — decode and re-test.
|
|
91
|
-
var HTML_ENTITY_NUM_RE = /&#(?:x([0-9a-f]+)|(\d+));?/gi;
|
|
92
90
|
|
|
93
91
|
// Front-matter block (YAML triple-dash or TOML triple-plus).
|
|
94
92
|
var FRONT_MATTER_YAML_RE = /^---\s*\n[\s\S]+?\n---\s*\n?/;
|
|
@@ -99,31 +97,20 @@ var DOCTYPE_INLINE_RE = /<!DOCTYPE\b/i;
|
|
|
99
97
|
var CODE_FENCE_LANG_RE = /^(?:```|~~~)([^\n]*)\n/gm;
|
|
100
98
|
var EMPH_RUN_RE = /[*_]{20,}/; // allow:regex-no-length-cap — character-class repeat is linear in input length
|
|
101
99
|
|
|
102
|
-
function _decodeHtmlEntities(s) {
|
|
103
|
-
return s.replace(HTML_ENTITY_NUM_RE, function (match, hex, dec) {
|
|
104
|
-
var code = hex !== undefined ? parseInt(hex, 16) : parseInt(dec, 10); // parseInt radix args (16 hex / 10 decimal)
|
|
105
|
-
if (!isFinite(code) || code < 0 || code > 0x10ffff) return match; // Unicode codepoint range
|
|
106
|
-
try { return String.fromCodePoint(code); } catch (_e) { return match; }
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
100
|
|
|
110
101
|
function _isDangerousUrl(url, opts) {
|
|
111
102
|
if (typeof url !== "string") return null;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
//
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
var
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
s = stripped;
|
|
125
|
-
if (DANGEROUS_SCHEME_RE.test(s)) return s.match(/^[a-z]+/i)[0].toLowerCase(); // allow:regex-no-length-cap — `s` is a markdown URL token already bounded by the inline-link / autolink / ref-def matchers (which themselves run on input bounded by maxBytes)
|
|
126
|
-
if (FILE_SCHEME_RE.test(s) && opts.filePolicy !== "allow") return "file"; // allow:regex-no-length-cap — same bounded-URL-token reasoning
|
|
103
|
+
// Decode the entity-hidden scheme tricks a browser resolves -- numeric AND the
|
|
104
|
+
// named-entity ASCII subset (guard-markdown previously decoded numeric only, so
|
|
105
|
+
// `java	script:` / a `:`-hidden scheme slipped past) -- then fold away
|
|
106
|
+
// the whitespace the WHATWG URL parser strips (tab/lf/cr anywhere + a leading/
|
|
107
|
+
// trailing C0-control-or-space run, so ` javascript:` -> " javascript:" can't
|
|
108
|
+
// defeat the `^scheme:` anchor). Shared codepoint-class primitives keep
|
|
109
|
+
// guard-markdown / guard-html / guard-svg from drifting on which encodings to fold.
|
|
110
|
+
var s = codepointClass.stripUrlSchemeWhitespace(
|
|
111
|
+
codepointClass.decodeMarkupEntities(url.trim()));
|
|
112
|
+
if (DANGEROUS_SCHEME_RE.test(s)) return s.match(/^[a-z]+/i)[0].toLowerCase(); // allow:regex-no-length-cap -- `s` is a markdown URL token already bounded by the inline-link / autolink / ref-def matchers (which themselves run on input bounded by maxBytes)
|
|
113
|
+
if (FILE_SCHEME_RE.test(s) && opts.filePolicy !== "allow") return "file"; // allow:regex-no-length-cap -- same bounded-URL-token reasoning
|
|
127
114
|
return null;
|
|
128
115
|
}
|
|
129
116
|
|
|
@@ -156,8 +156,16 @@ function _detectIssues(metadata, opts) {
|
|
|
156
156
|
snippet: "pdf metadata is not an object" }];
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
+
// Measure the byte cap only for measurable values. A hostile bag whose
|
|
160
|
+
// `bytes` is a plain Array or array-like object carries a numeric `.length`
|
|
161
|
+
// but is NOT a byte-carrier — measuring it would throw, breaking validate's
|
|
162
|
+
// documented never-throw-on-hostile-metadata contract; byteLengthOfIfMeasurable
|
|
163
|
+
// returns null for those, so the cap is skipped (magic detection reads only
|
|
164
|
+
// the leading bytes, O(1)-bounded regardless of the reported size) instead of
|
|
165
|
+
// crashing the caller.
|
|
159
166
|
var bytes = metadata.bytes;
|
|
160
|
-
|
|
167
|
+
var byteCount = safeBuffer.byteLengthOfIfMeasurable(bytes);
|
|
168
|
+
if (byteCount !== null && byteCount > opts.maxBytes) {
|
|
161
169
|
return [{ kind: "pdf-cap", severity: "high",
|
|
162
170
|
ruleId: "pdf.pdf-cap",
|
|
163
171
|
snippet: "pdf bytes exceed maxBytes " + opts.maxBytes }];
|
|
@@ -364,13 +372,21 @@ function sanitize(input, opts) {
|
|
|
364
372
|
// Force the active-content / exfil / encryption policies to reject, then
|
|
365
373
|
// refuse anything the validate chain flags. The object graph can't be
|
|
366
374
|
// edited without a parser, so disarm collapses to "refuse if not already
|
|
367
|
-
// inert" — never a silent passthrough of a live action.
|
|
375
|
+
// inert" — never a silent passthrough of a live action. Every active-content
|
|
376
|
+
// policy is pinned to "reject" here so an operator-supplied permissive opt
|
|
377
|
+
// (javascriptPolicy / launchActionPolicy / polyglotPolicy: "allow" | "audit")
|
|
378
|
+
// cannot make disarm hand back a live PDF — the RCE / polyglot classes the
|
|
379
|
+
// guard "refuses to negotiate" on must be pinned exactly as the exfil /
|
|
380
|
+
// encryption ones are, or the override is only half-applied.
|
|
368
381
|
var strict = Object.assign({}, resolved, {
|
|
369
382
|
magicPolicy: "reject",
|
|
383
|
+
javascriptPolicy: "reject",
|
|
384
|
+
launchActionPolicy: "reject",
|
|
370
385
|
openActionPolicy: "reject",
|
|
371
386
|
embeddedFilePolicy: "reject",
|
|
372
387
|
embeddedFileCountPolicy: "reject",
|
|
373
388
|
encryptedPolicy: "reject",
|
|
389
|
+
polyglotPolicy: "reject",
|
|
374
390
|
});
|
|
375
391
|
var issues = _detectIssues(input, strict);
|
|
376
392
|
gateContract.throwOnRefusalSeverity(issues,
|
|
@@ -155,10 +155,18 @@ var MSG_NUM_RE = /^[1-9][0-9]{0,9}$/;
|
|
|
155
155
|
function validate(line, opts) {
|
|
156
156
|
opts = opts || {};
|
|
157
157
|
var profileName = typeof opts.profile === "string" ? opts.profile : DEFAULT_PROFILE;
|
|
158
|
-
|
|
158
|
+
// hasOwnProperty on both lookups: opts.profile / opts.posture are caller
|
|
159
|
+
// input, and a bare bracket read resolves an inherited Object.prototype
|
|
160
|
+
// key (constructor / __proto__ / toString / ...) to a truthy value —
|
|
161
|
+
// PROFILES["constructor"] is the Object function, so `if (!caps)` never
|
|
162
|
+
// fires and every line / username / password cap compares against
|
|
163
|
+
// `undefined` (fails open). An unknown posture is ignored (falls through
|
|
164
|
+
// to profile/default); an unknown profile throws bad-profile.
|
|
165
|
+
if (opts.posture && Object.prototype.hasOwnProperty.call(COMPLIANCE_POSTURES, opts.posture)) {
|
|
159
166
|
profileName = COMPLIANCE_POSTURES[opts.posture];
|
|
160
167
|
}
|
|
161
|
-
var caps = PROFILES
|
|
168
|
+
var caps = Object.prototype.hasOwnProperty.call(PROFILES, profileName)
|
|
169
|
+
? PROFILES[profileName] : undefined;
|
|
162
170
|
if (!caps) {
|
|
163
171
|
throw new GuardPop3CommandError("guard-pop3-command/bad-profile",
|
|
164
172
|
"guardPop3Command.validate: unknown profile '" + profileName + "'");
|
|
@@ -59,7 +59,11 @@ var _err = GuardRegexError.factory;
|
|
|
59
59
|
|
|
60
60
|
// Nested-quantifier detector: `(group)+`-style followed by another
|
|
61
61
|
// quantifier or repetition that operates on the grouped match.
|
|
62
|
-
|
|
62
|
+
// (The flat single-group nested-quantifier case is handled by the paren-aware
|
|
63
|
+
// structural scanner _hasNestedQuantifier, which — unlike a flat regex — requires
|
|
64
|
+
// the OUTER quantifier to be UNBOUNDED (`*`/`+`/`{n,}`, not `?`/`{0,1}`/`{n,m}`)
|
|
65
|
+
// and does not miscount a `(?:` group prefix as an inner quantifier, so it does
|
|
66
|
+
// not false-positive on linear shapes like `(?:X+)?` / `(X+)?` / `(?:bar)*`.)
|
|
63
67
|
|
|
64
68
|
// Alternation-with-quantifier — `(a|b|...)+`, `(a|b)*`.
|
|
65
69
|
var ALTERNATION_QUANT_RE = /\([^()]*\|[^()]*\)\s*[*+]/;
|
|
@@ -184,8 +188,7 @@ function _detectIssues(input, opts) {
|
|
|
184
188
|
if (pre.done) return pre.issues;
|
|
185
189
|
var issues = pre.issues;
|
|
186
190
|
|
|
187
|
-
if (opts.nestedQuantPolicy !== "allow" &&
|
|
188
|
-
(NESTED_QUANT_RE.test(input) || _hasNestedQuantifier(input))) { // allow:regex-no-length-cap — input bounded by maxPatternBytes
|
|
191
|
+
if (opts.nestedQuantPolicy !== "allow" && _hasNestedQuantifier(input)) {
|
|
189
192
|
issues.push({
|
|
190
193
|
kind: "nested-quantifier", severity: "critical",
|
|
191
194
|
ruleId: "regex.nested-quantifier",
|
|
@@ -481,12 +484,12 @@ function _sanitizeTransform(input) {
|
|
|
481
484
|
* @example
|
|
482
485
|
* var gate = b.guardRegex.gate({ profile: "strict" });
|
|
483
486
|
*
|
|
484
|
-
* gate({ identifier: "(a+)+b" }).then(function (rv) {
|
|
487
|
+
* gate.check({ identifier: "(a+)+b" }).then(function (rv) {
|
|
485
488
|
* rv.ok; // → false
|
|
486
489
|
* rv.action; // → "refuse"
|
|
487
490
|
* });
|
|
488
491
|
*
|
|
489
|
-
* gate({ identifier: "^[a-z]+$" }).then(function (rv) {
|
|
492
|
+
* gate.check({ identifier: "^[a-z]+$" }).then(function (rv) {
|
|
490
493
|
* rv.action; // → "serve"
|
|
491
494
|
* });
|
|
492
495
|
*/
|
|
@@ -122,11 +122,6 @@ void observability;
|
|
|
122
122
|
|
|
123
123
|
var _err = GuardSvgError.factory;
|
|
124
124
|
|
|
125
|
-
// ---- Codepoint catalog (shared via lib/codepoint-class) ----
|
|
126
|
-
|
|
127
|
-
var C0_CTRL_RE_G = codepointClass.C0_CTRL_RE_G;
|
|
128
|
-
var ZW_RE_G = codepointClass.ZW_RE_G;
|
|
129
|
-
|
|
130
125
|
// ---- Tag classification ----
|
|
131
126
|
|
|
132
127
|
// Always-dangerous SVG tags. Active scripts, namespace-shift escape
|
|
@@ -314,32 +309,20 @@ var COMPLIANCE_POSTURES = gateContract.compliancePostures(PROFILES, { base: 256
|
|
|
314
309
|
// ---- Internal helpers ----
|
|
315
310
|
|
|
316
311
|
|
|
317
|
-
//
|
|
318
|
-
//
|
|
319
|
-
//
|
|
320
|
-
|
|
321
|
-
Tab: "\t", NewLine: "\n",
|
|
322
|
-
colon: ":", semi: ";", period: ".", sol: "/", bsol: "\\",
|
|
323
|
-
num: "#", excl: "!", quest: "?", lpar: "(", rpar: ")",
|
|
324
|
-
lsqb: "[", rsqb: "]", lcub: "{", rcub: "}",
|
|
325
|
-
quot: "\"", apos: "'", lt: "<", gt: ">",
|
|
326
|
-
amp: "&", commat: "@", dollar: "$", percnt: "%",
|
|
327
|
-
ast: "*", plus: "+", lowbar: "_", hyphen: "-",
|
|
328
|
-
nbsp: " ",
|
|
329
|
-
};
|
|
312
|
+
// The named-entity ASCII table + entity decoder live in codepoint-class
|
|
313
|
+
// (NAMED_ENTITY_ASCII / decodeMarkupEntities), shared with guard-html /
|
|
314
|
+
// guard-markdown so all three decode the SAME browser-honored set and cannot
|
|
315
|
+
// drift on which encoding a scheme / CSS-token danger check must fold away.
|
|
330
316
|
|
|
331
317
|
function _extractScheme(rawUrl) {
|
|
332
|
-
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
return m;
|
|
341
|
-
});
|
|
342
|
-
s = s.replace(C0_CTRL_RE_G, "").replace(ZW_RE_G, "");
|
|
318
|
+
// Decode entities, then fold away exactly the whitespace the WHATWG URL parser
|
|
319
|
+
// would (tab/lf/cr anywhere + a leading/trailing C0-control-or-space run) via
|
|
320
|
+
// the shared codepoint-class primitive, so an entity-hidden tab or leading
|
|
321
|
+
// space (`java	script:` / ` javascript:`) can't push the scheme past
|
|
322
|
+
// the `^[A-Za-z]` anchor and read as scheme-less. Shared with guard-html so
|
|
323
|
+
// the two can't drift on which whitespace to strip.
|
|
324
|
+
var s = codepointClass.stripUrlSchemeWhitespace(
|
|
325
|
+
codepointClass.decodeMarkupEntities(String(rawUrl || "").trim()));
|
|
343
326
|
var m = s.match(/^([A-Za-z][A-Za-z0-9+.-]*):/);
|
|
344
327
|
return m ? m[1].toLowerCase() : "";
|
|
345
328
|
}
|
|
@@ -355,8 +338,19 @@ function _isFragmentRef(rawUrl) {
|
|
|
355
338
|
}
|
|
356
339
|
|
|
357
340
|
function _isCssDangerous(value) {
|
|
341
|
+
// A style attribute is HTML/XML character-reference-decoded before the CSS
|
|
342
|
+
// parser sees it, so `expression(` reaches CSS as `expression(` and
|
|
343
|
+
// `behavior:` as `behavior:`. Match against the decoded value — the
|
|
344
|
+
// same normalization the URL-scheme check performs — so an entity-encoded
|
|
345
|
+
// CSS payload can't be served verbatim past the danger patterns.
|
|
346
|
+
// Also fold the URL-scheme whitespace a browser strips inside url(...) -- tab /
|
|
347
|
+
// lf / cr -- so an entity-hidden tab in a CSS URL scheme (url(java	script:))
|
|
348
|
+
// cannot defeat the contiguous `javascript:` danger pattern, the same bypass the
|
|
349
|
+
// URL-scheme check folds away for href.
|
|
350
|
+
var decoded = codepointClass.stripUrlSchemeWhitespace(
|
|
351
|
+
codepointClass.decodeMarkupEntities(value));
|
|
358
352
|
for (var i = 0; i < CSS_DANGEROUS_PATTERNS.length; i += 1) {
|
|
359
|
-
if (CSS_DANGEROUS_PATTERNS[i].test(
|
|
353
|
+
if (CSS_DANGEROUS_PATTERNS[i].test(decoded)) return true;
|
|
360
354
|
}
|
|
361
355
|
return false;
|
|
362
356
|
}
|
|
@@ -782,7 +776,12 @@ function _sanitize(input, opts) {
|
|
|
782
776
|
}
|
|
783
777
|
var allowed = !dangerousTags[tok.name] && allowedTags[tok.name];
|
|
784
778
|
if (animationTags[tok.name] && opts.allowAnimation && allowedTags[tok.name]) {
|
|
785
|
-
// Animation element
|
|
779
|
+
// Animation element under a profile that permits animation: allowed iff
|
|
780
|
+
// its attributeName is in the safe-targets allowlist. Every animation tag
|
|
781
|
+
// is in DANGEROUS_TAGS, so `allowed` is already false above — this branch
|
|
782
|
+
// must AFFIRMATIVELY re-permit the safe case, else the open tag is dropped
|
|
783
|
+
// while its (still-allowlisted) end tag is emitted, leaving an orphan
|
|
784
|
+
// close and silently stripping a profile-permitted element.
|
|
786
785
|
var safeAnimation = true;
|
|
787
786
|
(tok.attrs || []).forEach(function (a) {
|
|
788
787
|
if (a.name.toLowerCase() === "attributename" &&
|
|
@@ -790,7 +789,7 @@ function _sanitize(input, opts) {
|
|
|
790
789
|
safeAnimation = false;
|
|
791
790
|
}
|
|
792
791
|
});
|
|
793
|
-
|
|
792
|
+
allowed = safeAnimation;
|
|
794
793
|
}
|
|
795
794
|
if (!allowed) {
|
|
796
795
|
if (BODY_DROP[tok.name] && !tok.selfClosing) {
|
|
@@ -319,7 +319,7 @@ function _detectIssues(input, opts) {
|
|
|
319
319
|
*
|
|
320
320
|
* var bad = b.guardTime.validate("1969-12-31T23:59:59Z", { profile: "strict" });
|
|
321
321
|
* bad.ok; // → false
|
|
322
|
-
* bad.issues[0].ruleId; // → "time.year-
|
|
322
|
+
* bad.issues[0].ruleId; // → "time.year-window"
|
|
323
323
|
*/
|
|
324
324
|
// validate is assembled by gateContract.defineGuard from `detect`
|
|
325
325
|
// (_detectIssues) below — `validate(input, opts) = aggregateIssues(detect(
|
|
@@ -277,7 +277,7 @@ function _detectIssues(input, opts) {
|
|
|
277
277
|
* var bad = b.guardUuid.validate("00000000-0000-0000-0000-000000000000",
|
|
278
278
|
* { profile: "strict" });
|
|
279
279
|
* bad.ok; // → false
|
|
280
|
-
* bad.issues[0].ruleId; // → "uuid.nil"
|
|
280
|
+
* bad.issues[0].ruleId; // → "uuid.nil-uuid"
|
|
281
281
|
*/
|
|
282
282
|
// validate is assembled by gateContract.defineGuard from `detect`
|
|
283
283
|
// (_detectIssues) below — `validate(input, opts) = aggregateIssues(detect(
|
|
@@ -311,7 +311,7 @@ function _detectIssues(input, opts) {
|
|
|
311
311
|
* b.guardUuid.sanitize("ffffffff-ffff-ffff-ffff-ffffffffffff",
|
|
312
312
|
* { profile: "strict" });
|
|
313
313
|
* } catch (e) {
|
|
314
|
-
* e.code; // → "uuid.max"
|
|
314
|
+
* e.code; // → "uuid.max-uuid"
|
|
315
315
|
* }
|
|
316
316
|
*/
|
|
317
317
|
// _sanitizeTransform — the guard-specific normalize applied by defineGuard's
|
|
@@ -184,7 +184,7 @@ function check(html) {
|
|
|
184
184
|
// Self-closing: `<foo />` or `<foo/>` or HTML5 void elements.
|
|
185
185
|
var selfClose = html.charCodeAt(j - 1) === 0x2F /* / */;
|
|
186
186
|
if (isClose) {
|
|
187
|
-
if (VOID_TAGS
|
|
187
|
+
if (Object.prototype.hasOwnProperty.call(VOID_TAGS, tag)) {
|
|
188
188
|
// Stray closer for a void tag — surface as error.
|
|
189
189
|
var pcv = _posToLineColumn(html, i);
|
|
190
190
|
return {
|
|
@@ -221,7 +221,7 @@ function check(html) {
|
|
|
221
221
|
stack.pop();
|
|
222
222
|
} else {
|
|
223
223
|
// Open tag (or self-closing).
|
|
224
|
-
if (selfClose || VOID_TAGS
|
|
224
|
+
if (selfClose || Object.prototype.hasOwnProperty.call(VOID_TAGS, tag)) {
|
|
225
225
|
// No push.
|
|
226
226
|
} else if (Object.prototype.hasOwnProperty.call(RAW_TEXT_TAGS, tag)) {
|
|
227
227
|
// Skip raw-text content AND its closing tag entirely. Inside
|
|
@@ -326,7 +326,7 @@ var markupTokenizer = require("./markup-tokenizer");
|
|
|
326
326
|
*
|
|
327
327
|
* @example
|
|
328
328
|
* var rv = b.htmlBalance.checkSafe("<div onclick=\"x()\">hi</div>", { profile: "strict" });
|
|
329
|
-
* // → { balanceIssue: null, guardIssues: [{ kind: "event-handler
|
|
329
|
+
* // → { balanceIssue: null, guardIssues: [{ kind: "event-handler", ... }], ok: false }
|
|
330
330
|
*
|
|
331
331
|
* b.htmlBalance.checkSafe("<p>hello</p>", { profile: "strict" });
|
|
332
332
|
* // → { balanceIssue: null, guardIssues: [], ok: true }
|
|
@@ -130,6 +130,23 @@ function _ccPresent(directives, name) {
|
|
|
130
130
|
return directives && Object.prototype.hasOwnProperty.call(directives, name);
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
// RFC 9111 §3.5 — does this request carry an `Authorization` header field
|
|
134
|
+
// (RFC 9110 §11.6.2) with a non-empty value? A shared cache must treat the
|
|
135
|
+
// response to such a request as per-principal unless the origin opts in via
|
|
136
|
+
// public / s-maxage / must-revalidate. Proxy-Authorization is deliberately
|
|
137
|
+
// NOT included — §3.5 names the Authorization header specifically.
|
|
138
|
+
function _hasAuthorization(requestHeaders) {
|
|
139
|
+
if (!requestHeaders || typeof requestHeaders !== "object") return false;
|
|
140
|
+
var keys = Object.keys(requestHeaders);
|
|
141
|
+
for (var i = 0; i < keys.length; i++) {
|
|
142
|
+
if (keys[i].toLowerCase() === "authorization") {
|
|
143
|
+
var v = requestHeaders[keys[i]];
|
|
144
|
+
return v !== undefined && v !== null && String(v) !== "";
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
|
|
133
150
|
// ---- HTTP date parsing -----------------------------------------------
|
|
134
151
|
|
|
135
152
|
function _parseHttpDate(s) {
|
|
@@ -236,7 +253,7 @@ function _extractVaryValues(varyHeader, requestHeaders) {
|
|
|
236
253
|
//
|
|
237
254
|
// freshnessMs is computed from the response — 0 means "store but
|
|
238
255
|
// always revalidate" (no-cache), -1 means "never cacheable".
|
|
239
|
-
function _evaluateStorage(method, statusCode, responseHeaders, sharedCache) {
|
|
256
|
+
function _evaluateStorage(method, statusCode, responseHeaders, sharedCache, requestHeaders) {
|
|
240
257
|
var lcResp = _lcHeaders(responseHeaders);
|
|
241
258
|
var ccRaw = _headerOne(lcResp, "cache-control");
|
|
242
259
|
var directives = _parseCacheControl(ccRaw);
|
|
@@ -262,6 +279,21 @@ function _evaluateStorage(method, statusCode, responseHeaders, sharedCache) {
|
|
|
262
279
|
return { cacheable: false, reason: "private", freshnessMs: -1, directives: directives, varyHeader: varyHeader };
|
|
263
280
|
}
|
|
264
281
|
|
|
282
|
+
// RFC 9111 §3.5 — a shared cache MUST NOT reuse a stored response to a
|
|
283
|
+
// request carrying `Authorization` to satisfy a subsequent request unless
|
|
284
|
+
// the response explicitly permits it via `public`, `s-maxage`, or
|
|
285
|
+
// `must-revalidate`. Gate at store time: a per-user authenticated response
|
|
286
|
+
// that lacks the opt-in never lands in a fleet-shared cache where a
|
|
287
|
+
// different principal's request would be served it (cross-user data leak).
|
|
288
|
+
if (sharedCache && _hasAuthorization(requestHeaders)) {
|
|
289
|
+
var authShareable = _ccPresent(directives, "public") ||
|
|
290
|
+
_ccPresent(directives, "must-revalidate") ||
|
|
291
|
+
_ccNumber(directives, "s-maxage") !== null;
|
|
292
|
+
if (!authShareable) {
|
|
293
|
+
return { cacheable: false, reason: "authorization-shared", freshnessMs: -1, directives: directives, varyHeader: varyHeader };
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
265
297
|
// Vary: * is uncacheable per RFC 9110 §12.5.5.
|
|
266
298
|
if (typeof varyHeader === "string" && varyHeader.indexOf("*") !== -1) {
|
|
267
299
|
var trimmed = varyHeader.split(",").map(function (s) { return s.trim(); }); // RFC 9110 §12.5.5 Vary field-names; token grammar only, so a bare split is correct
|
|
@@ -653,6 +685,12 @@ function create(opts) {
|
|
|
653
685
|
directives: evaluation.directives,
|
|
654
686
|
etag: _headerOne(lcResp, "etag"),
|
|
655
687
|
lastModified: _headerOne(lcResp, "last-modified"),
|
|
688
|
+
// RFC 9111 §3.5 — remember whether the request that produced this entry
|
|
689
|
+
// carried Authorization, so a later 304 refresh can re-apply the shared-
|
|
690
|
+
// cache gate (a 304 can replace Cache-Control, dropping the public /
|
|
691
|
+
// s-maxage / must-revalidate opt-in that first permitted an authed
|
|
692
|
+
// response into a shared cache).
|
|
693
|
+
hadAuthorization: _hasAuthorization(requestHeaders),
|
|
656
694
|
};
|
|
657
695
|
}
|
|
658
696
|
|
|
@@ -698,6 +736,24 @@ function create(opts) {
|
|
|
698
736
|
// index lives in the store under (method, url, varyValues) so we
|
|
699
737
|
// need both a "what Vary names apply" marker and the real entry.
|
|
700
738
|
function _lookupWithVary(method, url, requestHeaders) {
|
|
739
|
+
var result = _resolveEntryWithVary(method, url, requestHeaders);
|
|
740
|
+
// RFC 9111 §3.5 fail-closed for legacy persistent-store records: an entry
|
|
741
|
+
// written by a version before `hadAuthorization` was recorded carries no
|
|
742
|
+
// such flag. In a shared cache it could be a pre-upgrade AUTHENTICATED
|
|
743
|
+
// response, and every serve path (fresh HIT, stale-serve, revalidation)
|
|
744
|
+
// resolves through here — so evict it and report a miss rather than serve
|
|
745
|
+
// one principal's cached body to another. Entries written by this version
|
|
746
|
+
// carry the flag (true or false) and are unaffected; private caches are
|
|
747
|
+
// out of §3.5 scope.
|
|
748
|
+
if (sharedCache && result && result.entry &&
|
|
749
|
+
!result.entry.__varyMarker && result.entry.hadAuthorization === undefined) {
|
|
750
|
+
try { store.delete(result.key); } catch (_e) { /* drop-silent */ }
|
|
751
|
+
return null;
|
|
752
|
+
}
|
|
753
|
+
return result;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
function _resolveEntryWithVary(method, url, requestHeaders) {
|
|
701
757
|
var noVary = _lookup(method, url, requestHeaders);
|
|
702
758
|
if (noVary) {
|
|
703
759
|
// Distinguish marker from real entry via __varyMarker flag.
|
|
@@ -775,7 +831,20 @@ function create(opts) {
|
|
|
775
831
|
// storedAt to "now" so age math restarts.
|
|
776
832
|
function _refreshFrom304(stored, fresh304Headers) {
|
|
777
833
|
var mergedHeaders = _merge304Headers(stored, fresh304Headers);
|
|
778
|
-
|
|
834
|
+
// Re-apply the RFC 9111 §3.5 shared-cache Authorization gate against the
|
|
835
|
+
// MERGED headers, carrying forward whether the original request was
|
|
836
|
+
// Authorization-bearing. A 304 can replace Cache-Control (e.g. an entry
|
|
837
|
+
// first stored under `must-revalidate` now returns plain `max-age=60`);
|
|
838
|
+
// without the request's auth context here the refreshed entry would be
|
|
839
|
+
// retained as a freely-shareable response and served to other principals.
|
|
840
|
+
// Fail CLOSED when the flag is ABSENT (not just false): an entry written by
|
|
841
|
+
// a persistent shared store (Redis / filesystem) before this field existed
|
|
842
|
+
// carries no `hadAuthorization`, and assuming such a legacy entry was
|
|
843
|
+
// unauthenticated would let an originally-authenticated response survive
|
|
844
|
+
// the upgrade as shareable. Only an explicit `hadAuthorization === false`
|
|
845
|
+
// skips the gate.
|
|
846
|
+
var reqHeadersForGate = stored.hadAuthorization === false ? {} : { authorization: "1" };
|
|
847
|
+
var evaluation = _evaluateStorage(stored.method, stored.statusCode, mergedHeaders, sharedCache, reqHeadersForGate);
|
|
779
848
|
var lcMerged = _lcHeaders(mergedHeaders);
|
|
780
849
|
var dateMs = _parseHttpDate(_headerOne(lcMerged, "date"));
|
|
781
850
|
var ageSec = parseInt(_headerOne(lcMerged, "age") || "0", 10);
|
|
@@ -792,6 +861,15 @@ function create(opts) {
|
|
|
792
861
|
});
|
|
793
862
|
var hasVary = refreshed.varyHeader && refreshed.varyValues && refreshed.varyValues.length > 0;
|
|
794
863
|
var key = _buildCacheKey(refreshed.method, refreshed.url, hasVary ? refreshed.varyValues : []);
|
|
864
|
+
if (!evaluation.cacheable) {
|
|
865
|
+
// The merged 304 response no longer satisfies the storage policy (e.g. an
|
|
866
|
+
// Authorization-bearing entry lost its §3.5 opt-in). Evict rather than
|
|
867
|
+
// retain a now-unshareable entry — the current, freshly-revalidated
|
|
868
|
+
// caller still receives the merged body via the returned value; only its
|
|
869
|
+
// retention for a DIFFERENT principal is refused.
|
|
870
|
+
try { store.delete(key); } catch (_e) { /* drop-silent */ }
|
|
871
|
+
return refreshed;
|
|
872
|
+
}
|
|
795
873
|
try { store.set(key, refreshed); } catch (_e) { /* drop-silent */ }
|
|
796
874
|
return refreshed;
|
|
797
875
|
}
|
|
@@ -851,8 +929,8 @@ function create(opts) {
|
|
|
851
929
|
return _lookupWithVary(method, url, requestHeaders);
|
|
852
930
|
},
|
|
853
931
|
|
|
854
|
-
_evaluateStorage: function (method, statusCode, responseHeaders) {
|
|
855
|
-
return _evaluateStorage(method, statusCode, responseHeaders, sharedCache);
|
|
932
|
+
_evaluateStorage: function (method, statusCode, responseHeaders, requestHeaders) {
|
|
933
|
+
return _evaluateStorage(method, statusCode, responseHeaders, sharedCache, requestHeaders);
|
|
856
934
|
},
|
|
857
935
|
|
|
858
936
|
_evaluateStored: _evaluateStored,
|
|
@@ -185,6 +185,16 @@ function create(opts) {
|
|
|
185
185
|
throw _err("BAD_OPT",
|
|
186
186
|
"cookieJar.create: opts.file must be an absolute path, got " + JSON.stringify(filePath));
|
|
187
187
|
}
|
|
188
|
+
// A vault is optional for file mode (it seals the on-disk bytes); when
|
|
189
|
+
// supplied it MUST be a real sealer, validated up front like the
|
|
190
|
+
// persist:"vault" path. Otherwise a malformed vault is not caught until a
|
|
191
|
+
// later debounced flush -- and on a first run (the persist file absent) the
|
|
192
|
+
// jar returns empty before any seal call could surface it, so writes would
|
|
193
|
+
// be silently dropped.
|
|
194
|
+
if (vault) {
|
|
195
|
+
validateOpts.requireMethods(vault, ["seal", "unseal"],
|
|
196
|
+
"cookieJar.create: persist: 'file' opts.vault (pass b.vault to seal the on-disk bytes)", CookieJarError, "BAD_OPT");
|
|
197
|
+
}
|
|
188
198
|
}
|
|
189
199
|
if (opts.flushDebounceMs !== undefined && !numericBounds.isNonNegativeFiniteInt(opts.flushDebounceMs)) {
|
|
190
200
|
throw _err("BAD_OPT", "cookieJar.create: flushDebounceMs must be a non-negative finite integer; got " +
|
|
@@ -492,7 +502,12 @@ function create(opts) {
|
|
|
492
502
|
maxBytes: C.BYTES.mib(16), encoding: "utf8", refuseSymlink: true, inodeCheck: true,
|
|
493
503
|
});
|
|
494
504
|
} catch (e) {
|
|
495
|
-
|
|
505
|
+
// First run — no persist file yet. A missing file surfaces as a raw
|
|
506
|
+
// ENOENT, or (when fdSafeReadSync's default errorFor maps it) as the
|
|
507
|
+
// typed "atomic-file/enoent" code; both mean "start empty", not "load
|
|
508
|
+
// failed". Any other kind (symlink / too-large / toctou) is a real
|
|
509
|
+
// load failure and falls through to LOAD_FAILED.
|
|
510
|
+
if (e && (e.code === "ENOENT" || e.code === "atomic-file/enoent")) { raw = null; }
|
|
496
511
|
else {
|
|
497
512
|
throw _err("LOAD_FAILED",
|
|
498
513
|
"cookieJar.create: failed to load persist file '" + filePath + "': " +
|