@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,340 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
|
|
5
|
+
var helpers = require("../helpers");
|
|
6
|
+
var b = helpers.b;
|
|
7
|
+
var check = helpers.check;
|
|
8
|
+
|
|
9
|
+
var BENIGN_REQ = { query: "query GetMe { me { id name } }", operationName: "GetMe" };
|
|
10
|
+
|
|
11
|
+
// Introspection leak — `__schema` in production posture. Strict refuses.
|
|
12
|
+
var INTROSPECT_REQ = {
|
|
13
|
+
query: "query Inspect { __schema { types { name } } }",
|
|
14
|
+
operationName: "Inspect",
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// Alias-amplification — 9 aliases in one selection-set exceeds strict's
|
|
18
|
+
// maxAliasesPerSelection (8); the breadth-DoS class.
|
|
19
|
+
var ALIAS_BOMB_REQ = {
|
|
20
|
+
query: "{ a:me { id } b:me { id } c:me { id } d:me { id } e:me { id } " +
|
|
21
|
+
"f:me { id } g:me { id } h:me { id } i:me { id } }",
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// A complete GraphQL string literal whose backslash is itself escaped:
|
|
25
|
+
// double-quote, backslash, backslash, double-quote. `'\\\\'` is a two-char
|
|
26
|
+
// backslash run in JS source, so this is exactly the 4 characters `"\\"`.
|
|
27
|
+
var ESC_BS_STRING = '"' + "\\\\" + '"';
|
|
28
|
+
|
|
29
|
+
function expectThrows(label, fn, codeMatch) {
|
|
30
|
+
var threw = null;
|
|
31
|
+
try { fn(); } catch (e) { threw = e; }
|
|
32
|
+
check(label, !!threw && (threw.code || "") === codeMatch);
|
|
33
|
+
return threw;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function hasRule(rv, ruleId) {
|
|
37
|
+
return rv.issues.some(function (i) { return i.ruleId === ruleId; });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Build a query whose real selection-set depth is `levels + 2`, with an early
|
|
41
|
+
// GraphQL string literal ending in an escaped backslash. A scanner that
|
|
42
|
+
// mis-tracks the escaped closing quote stays stuck in-string and ignores every
|
|
43
|
+
// following brace, under-measuring the depth to 1.
|
|
44
|
+
function deepQueryAfterEscapedString(levels) {
|
|
45
|
+
var open = "";
|
|
46
|
+
var close = "";
|
|
47
|
+
for (var i = 0; i < levels; i += 1) { open += "n" + i + " { "; close = " }" + close; }
|
|
48
|
+
return "{ f(a: " + ESC_BS_STRING + ") { " + open + "id" + close + " } }";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function testGate() {
|
|
52
|
+
var gqlGate = b.guardGraphql.gate({ profile: "strict" });
|
|
53
|
+
|
|
54
|
+
// Introspection query → refuse before any schema-resolution work.
|
|
55
|
+
var introspect = await gqlGate.check({ graphqlRequest: INTROSPECT_REQ });
|
|
56
|
+
check("guardGraphql.gate introspection action=refuse", introspect.action === "refuse");
|
|
57
|
+
check("guardGraphql.gate introspection ok=false", introspect.ok === false);
|
|
58
|
+
check("guardGraphql.gate introspection ruleId",
|
|
59
|
+
introspect.issues.some(function (i) { return i.ruleId === "graphql.introspection"; }));
|
|
60
|
+
|
|
61
|
+
// Benign named query → serve.
|
|
62
|
+
var serve = await gqlGate.check({ graphqlRequest: BENIGN_REQ });
|
|
63
|
+
check("guardGraphql.gate benign action=serve", serve.action === "serve");
|
|
64
|
+
check("guardGraphql.gate benign ok=true", serve.ok === true);
|
|
65
|
+
|
|
66
|
+
// Alias bomb → refuse (breadth-amplification DoS).
|
|
67
|
+
var bomb = await gqlGate.check({ graphqlRequest: ALIAS_BOMB_REQ });
|
|
68
|
+
check("guardGraphql.gate alias-bomb action=refuse", bomb.action === "refuse");
|
|
69
|
+
check("guardGraphql.gate alias-bomb ruleId",
|
|
70
|
+
bomb.issues.some(function (i) { return i.ruleId === "graphql.alias-bomb"; }));
|
|
71
|
+
|
|
72
|
+
// No request on ctx → serve (nothing to gate).
|
|
73
|
+
var none = await gqlGate.check({});
|
|
74
|
+
check("guardGraphql.gate no-request action=serve", none.action === "serve");
|
|
75
|
+
|
|
76
|
+
// Gate also reads ctx.gql (alias field) — deep query blinded by an escaped
|
|
77
|
+
// string must still refuse via the gate consumer path, not just validate.
|
|
78
|
+
var viaGql = await gqlGate.check({ gql: { query: deepQueryAfterEscapedString(15) } });
|
|
79
|
+
check("guardGraphql.gate ctx.gql depth-after-string refuse", viaGql.action === "refuse");
|
|
80
|
+
check("guardGraphql.gate ctx.gql depth-after-string ruleId",
|
|
81
|
+
viaGql.issues.some(function (i) { return i.ruleId === "graphql.depth-exceeded"; }));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function testSanitize() {
|
|
85
|
+
// Benign request passes through unchanged (bundles aren't repairable, so
|
|
86
|
+
// sanitize is pass-through-or-throw); the returned bundle re-validates clean.
|
|
87
|
+
var clean = b.guardGraphql.sanitize(BENIGN_REQ, { profile: "strict" });
|
|
88
|
+
check("guardGraphql.sanitize benign returns bundle", clean === BENIGN_REQ);
|
|
89
|
+
check("guardGraphql.sanitize benign revalidates ok",
|
|
90
|
+
b.guardGraphql.validate(clean, { profile: "strict" }).ok === true);
|
|
91
|
+
|
|
92
|
+
// Hostile: introspection query REFUSED (thrown), never returned — the leak
|
|
93
|
+
// shape is a refuse-class outcome, not something sanitize patches up.
|
|
94
|
+
var err = expectThrows("guardGraphql.sanitize introspection throws",
|
|
95
|
+
function () { b.guardGraphql.sanitize(INTROSPECT_REQ, { profile: "strict" }); },
|
|
96
|
+
"graphql.introspection");
|
|
97
|
+
check("guardGraphql.sanitize introspection GuardGraphqlError",
|
|
98
|
+
err instanceof b.guardGraphql.GuardGraphqlError);
|
|
99
|
+
|
|
100
|
+
// Hostile: prototype-pollution gadget in a query alias (CVE-2026-32621) —
|
|
101
|
+
// critical, refused at every profile.
|
|
102
|
+
expectThrows("guardGraphql.sanitize proto-poison throws",
|
|
103
|
+
function () {
|
|
104
|
+
b.guardGraphql.sanitize({ query: "query { a:__proto__ { id } }" }, { profile: "strict" });
|
|
105
|
+
},
|
|
106
|
+
"graphql.query-prototype-poison");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ---- RED: escaped-backslash string desync blinds the DoS shape walker ----
|
|
110
|
+
//
|
|
111
|
+
// A complete GraphQL string literal ending in an escaped backslash (`"\\"`)
|
|
112
|
+
// must not blind the depth / alias walker. A scanner that reads the closing
|
|
113
|
+
// quote as escaped stays stuck in-string, ignores every following brace and
|
|
114
|
+
// colon, and under-measures depth to 1 / aliases to 0 — a depth-bomb or
|
|
115
|
+
// alias-bomb then rides through strict validation as shape-clean (fail-open
|
|
116
|
+
// DoS-measurement bypass on VALID GraphQL). These drive the shipped
|
|
117
|
+
// b.guardGraphql.validate consumer path.
|
|
118
|
+
function testStringEvasionDepthBomb() {
|
|
119
|
+
var req = { query: deepQueryAfterEscapedString(15) }; // real depth 17 > strict cap 8
|
|
120
|
+
var rv = b.guardGraphql.validate(req, { profile: "strict" });
|
|
121
|
+
check("depth-after-escaped-string refuses (ok=false)", rv.ok === false);
|
|
122
|
+
check("depth-after-escaped-string fires depth-exceeded",
|
|
123
|
+
hasRule(rv, "graphql.depth-exceeded"));
|
|
124
|
+
|
|
125
|
+
// The benign control: an escaped double-quote INSIDE a string must NOT be
|
|
126
|
+
// mistaken for the terminator, and braces inside the string content must stay
|
|
127
|
+
// ignored. Query text: `{ f(a: "x\"{{{{{{{{{{{{" ) { id } }` — the 12 braces
|
|
128
|
+
// live inside the string, so real depth is 2 (well under the strict cap).
|
|
129
|
+
var benign = { query: '{ f(a: "x\\"' + "{{{{{{{{{{{{" + '" ) { id } }' };
|
|
130
|
+
var rvB = b.guardGraphql.validate(benign, { profile: "strict" });
|
|
131
|
+
check("escaped quote + in-string braces stay shape-clean", rvB.ok === true);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function testStringEvasionAliasBomb() {
|
|
135
|
+
// 12 aliases (> strict cap 8) in a selection-set that follows an escaped
|
|
136
|
+
// string literal. Must be measured and refused.
|
|
137
|
+
var aliases = "";
|
|
138
|
+
for (var i = 0; i < 12; i += 1) {
|
|
139
|
+
aliases += String.fromCharCode(97 + i) + ":me { id } ";
|
|
140
|
+
}
|
|
141
|
+
var req = { query: "{ f(a: " + ESC_BS_STRING + ") { " + aliases + " } }" };
|
|
142
|
+
var rv = b.guardGraphql.validate(req, { profile: "strict" });
|
|
143
|
+
check("alias-after-escaped-string refuses (ok=false)", rv.ok === false);
|
|
144
|
+
check("alias-after-escaped-string fires alias-bomb",
|
|
145
|
+
hasRule(rv, "graphql.alias-bomb"));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ---- RED: unbalanced-brace stack desync must not blind the alias walker ----
|
|
149
|
+
//
|
|
150
|
+
// A malformed query with a leading `}` must not desync the per-selection-set
|
|
151
|
+
// alias stack from brace depth. A `depth`-indexed counter that lands on an
|
|
152
|
+
// absent slot (`undefined + 1 === NaN`) poisons every later comparison so an
|
|
153
|
+
// alias-bomb reads as clean. The walker must remain robust on adversarial /
|
|
154
|
+
// syntactically-invalid input.
|
|
155
|
+
function testUnbalancedBraceAliasBomb() {
|
|
156
|
+
var req = { query: "}{ a:m b:m c:m d:m e:m f:m g:m h:m i:m j:m k:m }" }; // 11 aliases > 8
|
|
157
|
+
var rv = b.guardGraphql.validate(req, { profile: "strict" });
|
|
158
|
+
check("unbalanced-brace alias walker stays measured (ok=false)", rv.ok === false);
|
|
159
|
+
check("unbalanced-brace alias-bomb still fires",
|
|
160
|
+
hasRule(rv, "graphql.alias-bomb"));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ---- bad-input / query-missing defensive branches ----
|
|
164
|
+
function testBadInput() {
|
|
165
|
+
var rvNull = b.guardGraphql.validate(null, { profile: "strict" });
|
|
166
|
+
check("bad-input null refuses", rvNull.ok === false);
|
|
167
|
+
check("bad-input null ruleId", hasRule(rvNull, "graphql.bad-input"));
|
|
168
|
+
|
|
169
|
+
var rvNum = b.guardGraphql.validate(5, { profile: "strict" });
|
|
170
|
+
check("bad-input number refuses", rvNum.ok === false);
|
|
171
|
+
check("bad-input number ruleId", hasRule(rvNum, "graphql.bad-input"));
|
|
172
|
+
|
|
173
|
+
var rvEmpty = b.guardGraphql.validate({ query: "" }, { profile: "strict" });
|
|
174
|
+
check("query-missing empty refuses", rvEmpty.ok === false);
|
|
175
|
+
check("query-missing empty ruleId", hasRule(rvEmpty, "graphql.query-missing"));
|
|
176
|
+
|
|
177
|
+
var rvNonStr = b.guardGraphql.validate({ query: 123 }, { profile: "strict" });
|
|
178
|
+
check("query-missing non-string refuses", rvNonStr.ok === false);
|
|
179
|
+
check("query-missing non-string ruleId", hasRule(rvNonStr, "graphql.query-missing"));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// ---- byte caps: request / query / variables ----
|
|
183
|
+
function testCaps() {
|
|
184
|
+
// request-cap — total serialized bytes over strict maxBytes (32 KiB).
|
|
185
|
+
var big = {};
|
|
186
|
+
for (var i = 0; i < 5000; i += 1) { big["k" + i] = "v" + i; }
|
|
187
|
+
var rvReq = b.guardGraphql.validate({ query: "{ me { id } }", variables: big },
|
|
188
|
+
{ profile: "strict" });
|
|
189
|
+
check("request-cap refuses", rvReq.ok === false);
|
|
190
|
+
check("request-cap ruleId", hasRule(rvReq, "graphql.request-cap"));
|
|
191
|
+
|
|
192
|
+
// query-cap — query bytes over an explicit tiny maxQueryBytes override.
|
|
193
|
+
var rvQ = b.guardGraphql.validate({ query: "{ me { id name } }" },
|
|
194
|
+
{ profile: "strict", maxQueryBytes: 4 });
|
|
195
|
+
check("query-cap refuses", rvQ.ok === false);
|
|
196
|
+
check("query-cap ruleId", hasRule(rvQ, "graphql.query-cap"));
|
|
197
|
+
|
|
198
|
+
// variables-cap — variables bytes over an explicit tiny maxVariableBytes.
|
|
199
|
+
var rvV = b.guardGraphql.validate({ query: "{ me { id } }", variables: { a: "xxxxxxxxxx" } },
|
|
200
|
+
{ profile: "strict", maxVariableBytes: 4 });
|
|
201
|
+
check("variables-cap refuses", rvV.ok === false);
|
|
202
|
+
check("variables-cap ruleId", hasRule(rvV, "graphql.variables-cap"));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ---- prototype-pollution: variable-key form (CVE-2026-32621) ----
|
|
206
|
+
function testVariableProtoPoison() {
|
|
207
|
+
// JSON.parse installs `__proto__` as an OWN enumerable key (not the
|
|
208
|
+
// prototype slot), the exact deep-merge gadget shape.
|
|
209
|
+
var req = { query: "{ me { id } }", variables: JSON.parse('{"__proto__": {"x": 1}}') };
|
|
210
|
+
var rv = b.guardGraphql.validate(req, { profile: "strict" });
|
|
211
|
+
check("variable-proto-poison refuses", rv.ok === false);
|
|
212
|
+
check("variable-proto-poison critical",
|
|
213
|
+
rv.issues.some(function (i) {
|
|
214
|
+
return i.ruleId === "graphql.variable-prototype-poison" && i.severity === "critical";
|
|
215
|
+
}));
|
|
216
|
+
|
|
217
|
+
// sanitize surfaces the critical ruleId as the thrown error code.
|
|
218
|
+
expectThrows("variable-proto-poison sanitize throws",
|
|
219
|
+
function () { b.guardGraphql.sanitize(req, { profile: "strict" }); },
|
|
220
|
+
"graphql.variable-prototype-poison");
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ---- introspection policy matrix: reject (strict) / audit (balanced) ----
|
|
224
|
+
function testIntrospectionPolicies() {
|
|
225
|
+
// balanced audits: warn-only, still ok=true (audit-only disposition).
|
|
226
|
+
var rvAudit = b.guardGraphql.validate({ query: '{ __type(name:"X"){ name } }' },
|
|
227
|
+
{ profile: "balanced" });
|
|
228
|
+
check("introspection balanced audit ok=true", rvAudit.ok === true);
|
|
229
|
+
check("introspection balanced warn severity",
|
|
230
|
+
rvAudit.issues.some(function (i) {
|
|
231
|
+
return i.ruleId === "graphql.introspection" && i.severity === "warn";
|
|
232
|
+
}));
|
|
233
|
+
|
|
234
|
+
// permissive allows outright — no introspection issue at all.
|
|
235
|
+
var rvAllow = b.guardGraphql.validate({ query: "{ __schema { types { name } } }" },
|
|
236
|
+
{ profile: "permissive" });
|
|
237
|
+
check("introspection permissive no issue", !hasRule(rvAllow, "graphql.introspection"));
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// ---- persisted-query allowlist (require) ----
|
|
241
|
+
function testPersistedQuery() {
|
|
242
|
+
var rvMissing = b.guardGraphql.validate({ query: "{ me { id } }" },
|
|
243
|
+
{ profile: "strict", persistedQueryPolicy: "require" });
|
|
244
|
+
check("persisted-query missing refuses", rvMissing.ok === false);
|
|
245
|
+
check("persisted-query missing ruleId", hasRule(rvMissing, "graphql.persisted-query-missing"));
|
|
246
|
+
|
|
247
|
+
var rvPresent = b.guardGraphql.validate(
|
|
248
|
+
{ query: "{ me { id } }", extensions: { persistedQuery: { sha256Hash: "abc" } } },
|
|
249
|
+
{ profile: "strict", persistedQueryPolicy: "require" });
|
|
250
|
+
check("persisted-query present ok=true", rvPresent.ok === true);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// ---- operation-name allowlist ----
|
|
254
|
+
function testOperationAllowlist() {
|
|
255
|
+
var rvDenied = b.guardGraphql.validate(
|
|
256
|
+
{ query: "{ me { id } }", operationName: "Evil" },
|
|
257
|
+
{ profile: "strict", allowedOperations: ["GetMe"], operationNamePolicy: "reject" });
|
|
258
|
+
check("operation-not-allowed refuses", rvDenied.ok === false);
|
|
259
|
+
check("operation-not-allowed ruleId", hasRule(rvDenied, "graphql.operation-not-allowed"));
|
|
260
|
+
|
|
261
|
+
var rvAllowed = b.guardGraphql.validate(
|
|
262
|
+
{ query: "{ me { id } }", operationName: "GetMe" },
|
|
263
|
+
{ profile: "strict", allowedOperations: ["GetMe"], operationNamePolicy: "reject" });
|
|
264
|
+
check("operation allowed ok=true", rvAllowed.ok === true);
|
|
265
|
+
|
|
266
|
+
// audit disposition: a denied op under `audit` warns but does not refuse.
|
|
267
|
+
var rvAudit = b.guardGraphql.validate(
|
|
268
|
+
{ query: "{ me { id } }", operationName: "Evil" },
|
|
269
|
+
{ profile: "strict", allowedOperations: ["GetMe"], operationNamePolicy: "audit" });
|
|
270
|
+
check("operation-not-allowed audit ok=true", rvAudit.ok === true);
|
|
271
|
+
check("operation-not-allowed audit warn",
|
|
272
|
+
rvAudit.issues.some(function (i) {
|
|
273
|
+
return i.ruleId === "graphql.operation-not-allowed" && i.severity === "warn";
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// ---- variable-shape type-confusion ----
|
|
278
|
+
function testVariableTypeConfusion() {
|
|
279
|
+
var rvReject = b.guardGraphql.validate(
|
|
280
|
+
{ query: "{ me { id } }", variables: { id: "5" } },
|
|
281
|
+
{ profile: "strict", variableShapes: { id: "number" }, variableShapePolicy: "reject" });
|
|
282
|
+
check("variable-type-confusion refuses", rvReject.ok === false);
|
|
283
|
+
check("variable-type-confusion ruleId", hasRule(rvReject, "graphql.variable-type-confusion"));
|
|
284
|
+
|
|
285
|
+
// Matching type → clean; an undefined declared var is skipped (no false hit).
|
|
286
|
+
var rvOk = b.guardGraphql.validate(
|
|
287
|
+
{ query: "{ me { id } }", variables: { id: 5 } },
|
|
288
|
+
{ profile: "strict", variableShapes: { id: "number", other: "string" },
|
|
289
|
+
variableShapePolicy: "reject" });
|
|
290
|
+
check("variable-shape matching type ok=true", rvOk.ok === true);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// ---- batch defense: reject / audit-over-limit / per-entry recursion ----
|
|
294
|
+
function testBatch() {
|
|
295
|
+
// strict refuses any batch outright and short-circuits.
|
|
296
|
+
var rvReject = b.guardGraphql.validate(
|
|
297
|
+
[ { query: "{ me { id } }" }, { query: "{ me { id } }" } ], { profile: "strict" });
|
|
298
|
+
check("batch reject strict refuses", rvReject.ok === false);
|
|
299
|
+
check("batch reject strict ruleId", hasRule(rvReject, "graphql.batch-size"));
|
|
300
|
+
|
|
301
|
+
// balanced audits an over-limit batch (12 > cap 10): warn-only, ok=true.
|
|
302
|
+
var batch = [];
|
|
303
|
+
for (var i = 0; i < 12; i += 1) { batch.push({ query: "{ me { id } }" }); }
|
|
304
|
+
var rvAudit = b.guardGraphql.validate(batch, { profile: "balanced" });
|
|
305
|
+
check("batch over-limit balanced ok=true", rvAudit.ok === true);
|
|
306
|
+
check("batch over-limit balanced warn",
|
|
307
|
+
rvAudit.issues.some(function (i) {
|
|
308
|
+
return i.ruleId === "graphql.batch-size" && i.severity === "warn";
|
|
309
|
+
}));
|
|
310
|
+
|
|
311
|
+
// per-entry recursion prefixes the sub-issue snippet with the batch index.
|
|
312
|
+
var rvSub = b.guardGraphql.validate(
|
|
313
|
+
[ { query: "query Inspect { __schema { types { name } } }" } ], { profile: "balanced" });
|
|
314
|
+
check("batch per-entry recursion surfaces sub-issue",
|
|
315
|
+
hasRule(rvSub, "graphql.introspection"));
|
|
316
|
+
check("batch per-entry snippet is index-prefixed",
|
|
317
|
+
rvSub.issues.some(function (i) { return /^\[batch\[0\]\]/.test(i.snippet); }));
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
async function run() {
|
|
321
|
+
await testGate();
|
|
322
|
+
testSanitize();
|
|
323
|
+
testStringEvasionDepthBomb();
|
|
324
|
+
testStringEvasionAliasBomb();
|
|
325
|
+
testUnbalancedBraceAliasBomb();
|
|
326
|
+
testBadInput();
|
|
327
|
+
testCaps();
|
|
328
|
+
testVariableProtoPoison();
|
|
329
|
+
testIntrospectionPolicies();
|
|
330
|
+
testPersistedQuery();
|
|
331
|
+
testOperationAllowlist();
|
|
332
|
+
testVariableTypeConfusion();
|
|
333
|
+
testBatch();
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
module.exports = { run: run };
|
|
337
|
+
if (require.main === module) {
|
|
338
|
+
run().then(function () { console.log("OK"); })
|
|
339
|
+
.catch(function (e) { console.error(e); process.exit(1); });
|
|
340
|
+
}
|
|
@@ -134,6 +134,24 @@ function testGuardHtmlUrlSchemes() {
|
|
|
134
134
|
check("no-semicolon entity javascript: detected",
|
|
135
135
|
rvNoSemi.issues.some(function (issue) { return issue.kind === "dangerous-url-scheme"; }));
|
|
136
136
|
|
|
137
|
+
// Whitespace/entity-hidden scheme: a browser removes tab/lf/cr from a URL and
|
|
138
|
+
// trims a leading/trailing C0-control-or-space run before resolving the scheme,
|
|
139
|
+
// so an entity tab (`java	script:` / `java	`) and an entity-encoded
|
|
140
|
+
// leading space (` javascript:`) all navigate as javascript:. A scheme
|
|
141
|
+
// extractor that strips only C0/zero-width lets these read as scheme-less.
|
|
142
|
+
var schemeWs = [
|
|
143
|
+
["entity tab 	", "java	script:alert(1)"],
|
|
144
|
+
["named 	", "java	script:alert(1)"],
|
|
145
|
+
["entity space  ", " javascript:alert(1)"],
|
|
146
|
+
["entity space  ", " javascript:alert(1)"],
|
|
147
|
+
];
|
|
148
|
+
for (var w = 0; w < schemeWs.length; w++) {
|
|
149
|
+
var rvW = b.guardHtml.validate('<a href="' + schemeWs[w][1] + '">x</a>',
|
|
150
|
+
{ profile: "balanced" });
|
|
151
|
+
check("whitespace/entity-hidden scheme (" + schemeWs[w][0] + ") detected",
|
|
152
|
+
rvW.issues.some(function (issue) { return issue.kind === "dangerous-url-scheme"; }));
|
|
153
|
+
}
|
|
154
|
+
|
|
137
155
|
// Image-context data URL allowed under balanced when allowImageData true.
|
|
138
156
|
var rvImg = b.guardHtml.validate(
|
|
139
157
|
'<img src="data:image/png;base64,iVBORw0KG" alt="x">',
|
|
@@ -154,6 +172,17 @@ function testGuardHtmlCssInjection() {
|
|
|
154
172
|
'style="-moz-binding:url(x.xml)"',
|
|
155
173
|
'style="background:url(javascript:alert(1))"',
|
|
156
174
|
'style="@import url(evil.css)"',
|
|
175
|
+
// Entity-encoded CSS: a style attribute is character-reference-decoded before
|
|
176
|
+
// the CSS parser sees it, so `expression(` reaches CSS as `expression(`.
|
|
177
|
+
// Matching the raw bytes lets these bypass -> fail-open. Match the decoded value.
|
|
178
|
+
'style="width:expression(alert(1))"',
|
|
179
|
+
'style="background:url(javascript:alert(1))"',
|
|
180
|
+
'style="behavior:url(x.htc)"',
|
|
181
|
+
// Whitespace-hidden scheme inside url(): a browser strips tab/lf/cr from a URL
|
|
182
|
+
// before resolving its scheme, so url(java<TAB>script:) navigates as
|
|
183
|
+
// javascript:. The decoded CSS value must also fold that whitespace.
|
|
184
|
+
'style="background:url(java	script:alert(1))"',
|
|
185
|
+
'style="background:url(java	script:alert(1))"',
|
|
157
186
|
];
|
|
158
187
|
for (var i = 0; i < payloads.length; i++) {
|
|
159
188
|
var rv = b.guardHtml.validate("<div " + payloads[i] + ">x</div>",
|
|
@@ -80,11 +80,39 @@ function testPermissive() {
|
|
|
80
80
|
"idempotency-key/control-char");
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
function testProtoKeyProfileRejected() {
|
|
84
|
+
// A prototype-member name as the profile must be refused, not resolved to an
|
|
85
|
+
// inherited member ("constructor" -> Object.prototype.constructor,
|
|
86
|
+
// "__proto__" -> Object.prototype). The makeProfileResolver own-property
|
|
87
|
+
// guard rejects it; a bare `profiles[name]` bracket read would treat the
|
|
88
|
+
// inherited member as a known profile and run the gate under it (fail-open).
|
|
89
|
+
expectRefused("refuses prototype-key profile 'constructor'",
|
|
90
|
+
function () { b.guardIdempotencyKey.validate("k", { profile: "constructor" }); },
|
|
91
|
+
"idempotency-key/bad-profile");
|
|
92
|
+
expectRefused("refuses prototype-key profile '__proto__'",
|
|
93
|
+
function () { b.guardIdempotencyKey.validate("k", { profile: "__proto__" }); },
|
|
94
|
+
"idempotency-key/bad-profile");
|
|
95
|
+
// A prototype-member name as the posture must not resolve to an inherited
|
|
96
|
+
// member either. The resolver's own-property guard skips the unknown posture
|
|
97
|
+
// and falls back to the default profile, validating cleanly — a bare
|
|
98
|
+
// `postures[name]` read would return a Function and blow up on `.maxBytes`.
|
|
99
|
+
var postureThrew = null;
|
|
100
|
+
try { b.guardIdempotencyKey.validate("k", { posture: "constructor" }); }
|
|
101
|
+
catch (e) { postureThrew = e; }
|
|
102
|
+
check("prototype-key posture does not fail-open", postureThrew === null);
|
|
103
|
+
// A valid profile still resolves and validates.
|
|
104
|
+
var validThrew = null;
|
|
105
|
+
try { b.guardIdempotencyKey.validate("k", { profile: "strict" }); }
|
|
106
|
+
catch (e) { validThrew = e; }
|
|
107
|
+
check("valid profile still resolves", validThrew === null);
|
|
108
|
+
}
|
|
109
|
+
|
|
83
110
|
async function run() {
|
|
84
111
|
testSurface();
|
|
85
112
|
testValid();
|
|
86
113
|
testRefuses();
|
|
87
114
|
testPermissive();
|
|
115
|
+
testProtoKeyProfileRejected();
|
|
88
116
|
}
|
|
89
117
|
|
|
90
118
|
module.exports = { run: run };
|