@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,86 @@
|
|
|
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
|
+
function expectThrows(label, fn, codeMatch) {
|
|
10
|
+
var threw = null;
|
|
11
|
+
try { fn(); } catch (e) { threw = e; }
|
|
12
|
+
check(label, !!threw && (threw.code || "") === codeMatch);
|
|
13
|
+
return threw;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function _kinds(rv) {
|
|
17
|
+
return rv.issues.map(function (i) { return i.kind; });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function testValidate() {
|
|
21
|
+
// Benign: a registered, well-formed media type is clean under strict.
|
|
22
|
+
var okRv = b.guardMime.validate("application/json", { profile: "strict" });
|
|
23
|
+
check("guardMime.validate benign ok", okRv.ok === true);
|
|
24
|
+
check("guardMime.validate benign no issues", okRv.issues.length === 0);
|
|
25
|
+
|
|
26
|
+
// Hostile: an executable/script-host media type is on the risky-type
|
|
27
|
+
// refuse list — high severity under strict.
|
|
28
|
+
var risky = b.guardMime.validate("application/x-msdownload", { profile: "strict" });
|
|
29
|
+
check("guardMime.validate risky refused", risky.ok === false);
|
|
30
|
+
check("guardMime.validate risky-type kind",
|
|
31
|
+
_kinds(risky).indexOf("risky-type") !== -1);
|
|
32
|
+
|
|
33
|
+
// Hostile: missing `/` between type and subtype — mime-shape refuse.
|
|
34
|
+
var shape = b.guardMime.validate("noslash", { profile: "strict" });
|
|
35
|
+
check("guardMime.validate mime-shape refused", shape.ok === false);
|
|
36
|
+
check("guardMime.validate mime-shape kind",
|
|
37
|
+
_kinds(shape).indexOf("mime-shape") !== -1);
|
|
38
|
+
|
|
39
|
+
// Hostile: a space in the subtype violates the RFC 6838 restricted-
|
|
40
|
+
// name grammar — subtype-shape refuse.
|
|
41
|
+
var badTok = b.guardMime.validate("application/js on", { profile: "strict" });
|
|
42
|
+
check("guardMime.validate subtype-shape refused", badTok.ok === false);
|
|
43
|
+
check("guardMime.validate subtype-shape kind",
|
|
44
|
+
_kinds(badTok).indexOf("subtype-shape") !== -1);
|
|
45
|
+
|
|
46
|
+
// Wildcard is Accept-only — refused as a content-type at strict.
|
|
47
|
+
var wild = b.guardMime.validate("*/*", { profile: "strict" });
|
|
48
|
+
check("guardMime.validate wildcard refused", wild.ok === false);
|
|
49
|
+
check("guardMime.validate wildcard kind",
|
|
50
|
+
_kinds(wild).indexOf("wildcard") !== -1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function testSanitize() {
|
|
54
|
+
// Benign: lower-cases the canonical type/subtype while preserving the
|
|
55
|
+
// parameter value's case (boundary tokens are case-significant).
|
|
56
|
+
var norm = b.guardMime.sanitize("Application/JSON; charset=UTF-8", { profile: "balanced" });
|
|
57
|
+
check("guardMime.sanitize lowercases type/subtype",
|
|
58
|
+
norm === "application/json; charset=UTF-8");
|
|
59
|
+
check("guardMime.sanitize preserves param-value case",
|
|
60
|
+
norm.indexOf("charset=UTF-8") !== -1);
|
|
61
|
+
check("guardMime.sanitize output neutralized",
|
|
62
|
+
norm !== "Application/JSON; charset=UTF-8");
|
|
63
|
+
|
|
64
|
+
// Already-canonical input is returned unchanged under strict.
|
|
65
|
+
var same = b.guardMime.sanitize("application/json", { profile: "strict" });
|
|
66
|
+
check("guardMime.sanitize canonical unchanged", same === "application/json");
|
|
67
|
+
|
|
68
|
+
// Hostile: a script-host media type throws rather than normalizing a
|
|
69
|
+
// risky type into place.
|
|
70
|
+
var err = expectThrows("guardMime.sanitize risky-type throws",
|
|
71
|
+
function () { b.guardMime.sanitize("application/javascript", { profile: "strict" }); },
|
|
72
|
+
"mime.risky-type");
|
|
73
|
+
check("guardMime.sanitize risky GuardMimeError",
|
|
74
|
+
err instanceof b.guardMime.GuardMimeError);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function run() {
|
|
78
|
+
testValidate();
|
|
79
|
+
testSanitize();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
module.exports = { run: run };
|
|
83
|
+
if (require.main === module) {
|
|
84
|
+
run().then(function () { console.log("OK"); })
|
|
85
|
+
.catch(function (e) { console.error(e); process.exit(1); });
|
|
86
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
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
|
+
// A spec-clean authorization-code flow: PKCE S256, state present,
|
|
10
|
+
// allowlisted redirect_uri, single `code` response_type.
|
|
11
|
+
var BENIGN_FLOW = Object.freeze({
|
|
12
|
+
response_type: "code",
|
|
13
|
+
redirect_uri: "https://app.example.com/callback",
|
|
14
|
+
state: "csrf-rand-1",
|
|
15
|
+
scope: "openid profile",
|
|
16
|
+
code_challenge: "abc123def456ghi789jkl012mno345pqr678",
|
|
17
|
+
code_challenge_method: "S256",
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
var ALLOWED_REDIRECTS = Object.freeze(["https://app.example.com/callback"]);
|
|
21
|
+
|
|
22
|
+
function expectThrows(label, fn, codeMatch) {
|
|
23
|
+
var threw = null;
|
|
24
|
+
try { fn(); } catch (e) { threw = e; }
|
|
25
|
+
check(label, !!threw && (threw.code || "") === codeMatch);
|
|
26
|
+
return threw;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function testSanitize() {
|
|
30
|
+
// Benign: a well-formed flow passes through unchanged (OAuth bundles
|
|
31
|
+
// can't be partially repaired — clean or refused).
|
|
32
|
+
var out = b.guardOauth.sanitize(BENIGN_FLOW, {
|
|
33
|
+
profile: "strict",
|
|
34
|
+
allowedRedirectUris: ALLOWED_REDIRECTS,
|
|
35
|
+
});
|
|
36
|
+
check("guardOauth.sanitize benign passthrough", out === BENIGN_FLOW);
|
|
37
|
+
|
|
38
|
+
// Hostile: no PKCE at all — OAuth 2.1 mandates PKCE for every client;
|
|
39
|
+
// sanitize throws rather than returning the downgraded flow.
|
|
40
|
+
var pkceErr = expectThrows("guardOauth.sanitize pkce-missing throws",
|
|
41
|
+
function () {
|
|
42
|
+
b.guardOauth.sanitize({
|
|
43
|
+
response_type: "code",
|
|
44
|
+
redirect_uri: "https://app.example.com/callback",
|
|
45
|
+
scope: "openid",
|
|
46
|
+
}, { profile: "strict" });
|
|
47
|
+
},
|
|
48
|
+
"oauth.pkce-missing");
|
|
49
|
+
check("guardOauth.sanitize pkce GuardOauthError",
|
|
50
|
+
pkceErr instanceof b.guardOauth.GuardOauthError);
|
|
51
|
+
|
|
52
|
+
// Hostile: `plain` PKCE method under strict is a downgrade-attack
|
|
53
|
+
// class — refused (require-s256).
|
|
54
|
+
expectThrows("guardOauth.sanitize pkce plain-method throws",
|
|
55
|
+
function () {
|
|
56
|
+
b.guardOauth.sanitize({
|
|
57
|
+
response_type: "code",
|
|
58
|
+
redirect_uri: "https://app.example.com/callback",
|
|
59
|
+
state: "s1",
|
|
60
|
+
scope: "openid",
|
|
61
|
+
code_challenge: "abc123def456ghi789jkl012mno345pqr678",
|
|
62
|
+
code_challenge_method: "plain",
|
|
63
|
+
}, { profile: "strict", allowedRedirectUris: ALLOWED_REDIRECTS });
|
|
64
|
+
},
|
|
65
|
+
"oauth.pkce-method");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function testGate() {
|
|
69
|
+
var oauthGate = b.guardOauth.gate({
|
|
70
|
+
profile: "strict",
|
|
71
|
+
allowedRedirectUris: ALLOWED_REDIRECTS,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Benign flow → serve.
|
|
75
|
+
var served = await oauthGate.check({ oauthFlow: BENIGN_FLOW });
|
|
76
|
+
check("guardOauth.gate benign serves", served.ok === true && served.action === "serve");
|
|
77
|
+
|
|
78
|
+
// Hostile: redirect_uri not on the operator allowlist — the canonical
|
|
79
|
+
// loose-match account-takeover class. Gate refuses before the token
|
|
80
|
+
// exchange, even though state/PKCE are present.
|
|
81
|
+
var refused = await oauthGate.check({
|
|
82
|
+
oauthFlow: {
|
|
83
|
+
response_type: "code",
|
|
84
|
+
redirect_uri: "https://attacker.example/callback",
|
|
85
|
+
state: "csrf-rand-1",
|
|
86
|
+
scope: "openid",
|
|
87
|
+
code_challenge: "abc123def456ghi789jkl012mno345pqr678",
|
|
88
|
+
code_challenge_method: "S256",
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
check("guardOauth.gate hostile redirect refuses",
|
|
92
|
+
refused.ok === false && refused.action === "refuse");
|
|
93
|
+
check("guardOauth.gate redirect-uri-not-allowed kind",
|
|
94
|
+
(refused.issues || []).some(function (i) { return i.kind === "redirect-uri-not-allowed"; }));
|
|
95
|
+
|
|
96
|
+
// Hostile: replay — a code the operator's seenCodeStore has already
|
|
97
|
+
// seen is a critical code-reuse refuse (RFC 6749 §10.5).
|
|
98
|
+
var replayGate = b.guardOauth.gate({
|
|
99
|
+
profile: "strict",
|
|
100
|
+
allowedRedirectUris: ALLOWED_REDIRECTS,
|
|
101
|
+
seenCodeStore: { hasSeen: function () { return true; } },
|
|
102
|
+
});
|
|
103
|
+
var replay = await replayGate.check({
|
|
104
|
+
oauthFlow: Object.assign({}, BENIGN_FLOW, { code: "authcode-123" }),
|
|
105
|
+
});
|
|
106
|
+
check("guardOauth.gate replayed code refuses",
|
|
107
|
+
replay.ok === false && replay.action === "refuse");
|
|
108
|
+
check("guardOauth.gate code-reused kind",
|
|
109
|
+
(replay.issues || []).some(function (i) { return i.kind === "code-reused"; }));
|
|
110
|
+
|
|
111
|
+
// Fail-closed: a seenCodeStore that errors can't prove the code is
|
|
112
|
+
// unused → refuse (code-reuse-unverifiable), never silently serve.
|
|
113
|
+
var errGate = b.guardOauth.gate({
|
|
114
|
+
profile: "strict",
|
|
115
|
+
allowedRedirectUris: ALLOWED_REDIRECTS,
|
|
116
|
+
seenCodeStore: { hasSeen: function () { throw new Error("store down"); } },
|
|
117
|
+
});
|
|
118
|
+
var failClosed = await errGate.check({
|
|
119
|
+
oauthFlow: Object.assign({}, BENIGN_FLOW, { code: "authcode-123" }),
|
|
120
|
+
});
|
|
121
|
+
check("guardOauth.gate replay-store error fails closed",
|
|
122
|
+
failClosed.ok === false && failClosed.action === "refuse");
|
|
123
|
+
check("guardOauth.gate code-reuse-unverifiable kind",
|
|
124
|
+
(failClosed.issues || []).some(function (i) { return i.kind === "code-reuse-unverifiable"; }));
|
|
125
|
+
|
|
126
|
+
// No flow on the ctx → serve (nothing to gate).
|
|
127
|
+
var empty = await oauthGate.check({});
|
|
128
|
+
check("guardOauth.gate absent flow serves", empty.ok === true && empty.action === "serve");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function run() {
|
|
132
|
+
testSanitize();
|
|
133
|
+
await testGate();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = { run: run };
|
|
137
|
+
if (require.main === module) {
|
|
138
|
+
run().then(function () { console.log("OK"); })
|
|
139
|
+
.catch(function (e) { console.error(e); process.exit(1); });
|
|
140
|
+
}
|
|
@@ -77,11 +77,71 @@ function testSanitizeForcesEncryptedReject() {
|
|
|
77
77
|
_code(function () { b.guardPdf.sanitize({ bytes: _PDF, isEncrypted: true }, { profile: "permissive" }); }) === "pdf.encrypted");
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
// An operator-supplied permissive policy opt must NOT let sanitize hand back a
|
|
81
|
+
// PDF that still carries an RCE-class action. sanitize is disarm-by-refusal and
|
|
82
|
+
// forces the active-content policies to reject; the forced set previously
|
|
83
|
+
// covered open-action / embedded-file / encrypted but OMITTED the three classes
|
|
84
|
+
// the guard "refuses to negotiate" on — JavaScript, Launch, and polyglot — so
|
|
85
|
+
// `sanitize(bag, { javascriptPolicy: "allow" })` returned the live PDF. Each of
|
|
86
|
+
// these drives the same override object and must refuse regardless of the opt.
|
|
87
|
+
function testSanitizeForcesJavaScriptRejectOverOperatorAllow() {
|
|
88
|
+
check("javascript refused under sanitize even when javascriptPolicy:allow",
|
|
89
|
+
_code(function () {
|
|
90
|
+
b.guardPdf.sanitize({ bytes: _PDF, hasJavaScript: true },
|
|
91
|
+
{ profile: "strict", javascriptPolicy: "allow" });
|
|
92
|
+
}) === "pdf.javascript-action");
|
|
93
|
+
check("javascript refused under sanitize even when javascriptPolicy:audit",
|
|
94
|
+
_code(function () {
|
|
95
|
+
b.guardPdf.sanitize({ bytes: _PDF, hasJavaScript: true },
|
|
96
|
+
{ profile: "permissive", javascriptPolicy: "audit" });
|
|
97
|
+
}) === "pdf.javascript-action");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function testSanitizeForcesLaunchRejectOverOperatorAllow() {
|
|
101
|
+
check("launch refused under sanitize even when launchActionPolicy:allow",
|
|
102
|
+
_code(function () {
|
|
103
|
+
b.guardPdf.sanitize({ bytes: _PDF, hasLaunchAction: true },
|
|
104
|
+
{ profile: "strict", launchActionPolicy: "allow" });
|
|
105
|
+
}) === "pdf.launch-action");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function testSanitizeForcesPolyglotRejectOverOperatorAllow() {
|
|
109
|
+
check("polyglot refused under sanitize even when polyglotPolicy:allow",
|
|
110
|
+
_code(function () {
|
|
111
|
+
b.guardPdf.sanitize({ bytes: _PDF, polyglotDetected: true },
|
|
112
|
+
{ profile: "strict", polyglotPolicy: "allow" });
|
|
113
|
+
}) === "pdf.polyglot");
|
|
114
|
+
}
|
|
115
|
+
|
|
80
116
|
function testSanitizeBadInput() {
|
|
81
117
|
check("bad input refused",
|
|
82
118
|
_code(function () { b.guardPdf.sanitize(null, { profile: "balanced" }); }) === "pdf.bad-input");
|
|
83
119
|
}
|
|
84
120
|
|
|
121
|
+
// ---- magic-byte inspection ----
|
|
122
|
+
|
|
123
|
+
function testInspectMagic() {
|
|
124
|
+
// %PDF-1.7 header (25 50 44 46 2D 31 2E 37) — real PDF prefix.
|
|
125
|
+
var pdfBytes = Buffer.from([0x25, 0x50, 0x44, 0x46, 0x2D, 0x31, 0x2E, 0x37]);
|
|
126
|
+
check("inspectMagic: %PDF- prefix → true",
|
|
127
|
+
b.guardPdf.inspectMagic(pdfBytes) === true);
|
|
128
|
+
// Exactly the 5-byte magic is enough.
|
|
129
|
+
check("inspectMagic: bare %PDF- (5 bytes) → true",
|
|
130
|
+
b.guardPdf.inspectMagic(_PDF) === true);
|
|
131
|
+
// Non-PDF bytes — the operator fed the wrong gate.
|
|
132
|
+
check("inspectMagic: mismatching bytes → false",
|
|
133
|
+
b.guardPdf.inspectMagic(Buffer.from([0x00, 0x01, 0x02])) === false);
|
|
134
|
+
// A buffer shorter than the 5-byte magic can't match.
|
|
135
|
+
check("inspectMagic: too-short buffer → false",
|
|
136
|
+
b.guardPdf.inspectMagic(Buffer.from([0x25, 0x50])) === false);
|
|
137
|
+
// Near-miss: right length, one byte off (0x2E vs 0x2D at index 4).
|
|
138
|
+
check("inspectMagic: one-byte-off prefix → false",
|
|
139
|
+
b.guardPdf.inspectMagic(Buffer.from([0x25, 0x50, 0x44, 0x46, 0x2E])) === false);
|
|
140
|
+
// Pure inspection — never throws on non-Buffer input.
|
|
141
|
+
check("inspectMagic: null input → false (no throw)",
|
|
142
|
+
b.guardPdf.inspectMagic(null) === false);
|
|
143
|
+
}
|
|
144
|
+
|
|
85
145
|
function run() {
|
|
86
146
|
testGuardPdfSurface();
|
|
87
147
|
testGuardPdfRegistryParity();
|
|
@@ -92,7 +152,27 @@ function run() {
|
|
|
92
152
|
testSanitizeForcesOpenActionReject();
|
|
93
153
|
testSanitizeForcesEmbeddedFileReject();
|
|
94
154
|
testSanitizeForcesEncryptedReject();
|
|
155
|
+
testSanitizeForcesJavaScriptRejectOverOperatorAllow();
|
|
156
|
+
testSanitizeForcesLaunchRejectOverOperatorAllow();
|
|
157
|
+
testSanitizeForcesPolyglotRejectOverOperatorAllow();
|
|
95
158
|
testSanitizeBadInput();
|
|
159
|
+
testInspectMagic();
|
|
160
|
+
testValidateNeverThrowsOnArrayLikeBytes();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ---- validate must never throw on hostile metadata (sibling of the guard-image
|
|
164
|
+
// array-like crash: byteLengthOf was called for any numeric-.length value, but
|
|
165
|
+
// it only accepts string/Buffer/Uint8Array and threw TypeError on a plain Array
|
|
166
|
+
// / array-like bag, crashing a direct validate/sanitize caller). ----
|
|
167
|
+
function testValidateNeverThrowsOnArrayLikeBytes() {
|
|
168
|
+
check("validate does not throw on Array-typed bytes",
|
|
169
|
+
_code(function () { b.guardPdf.validate({ bytes: [0x25, 0x50, 0x44, 0x46] }, { profile: "balanced" }); }) === null);
|
|
170
|
+
check("validate does not throw on array-like-object bytes",
|
|
171
|
+
_code(function () { b.guardPdf.validate({ bytes: { length: 1e9 } }, { profile: "strict" }); }) === null);
|
|
172
|
+
// The unrecognized array-like content is still refused (unknown-magic under
|
|
173
|
+
// strict), not served — never-throw does not mean fail-open.
|
|
174
|
+
var rv = b.guardPdf.validate({ bytes: [1, 2, 3] }, { profile: "strict" });
|
|
175
|
+
check("array-like bytes → refused (ok:false), not a crash", rv.ok === false);
|
|
96
176
|
}
|
|
97
177
|
|
|
98
178
|
module.exports = { run: run };
|
|
@@ -162,6 +162,32 @@ function testByteCapMultibyte() {
|
|
|
162
162
|
t3 && t3.code === "guard-pop3-command/password-too-long");
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
function testProfilePrototypeKeyRefused() {
|
|
166
|
+
// A profile name that collides with a JS prototype-key must resolve to
|
|
167
|
+
// bad-profile, never silently disable the caps. Pre-fix the resolver
|
|
168
|
+
// read PROFILES[profileName] by bracket access, so PROFILES["constructor"]
|
|
169
|
+
// was the inherited Object function — truthy — and `if (!caps)` never
|
|
170
|
+
// fired; the line / username / password caps then compared against
|
|
171
|
+
// `undefined` (always false) and failed open.
|
|
172
|
+
var protoKeys = ["constructor", "__proto__", "toString", "valueOf", "hasOwnProperty"];
|
|
173
|
+
for (var i = 0; i < protoKeys.length; i += 1) {
|
|
174
|
+
var threw = null;
|
|
175
|
+
try { b.guardPop3Command.validate("NOOP", { profile: protoKeys[i] }); }
|
|
176
|
+
catch (e) { threw = e; }
|
|
177
|
+
check("profile '" + protoKeys[i] + "' refused as bad-profile",
|
|
178
|
+
threw && threw.code === "guard-pop3-command/bad-profile");
|
|
179
|
+
}
|
|
180
|
+
// Concrete fail-open proof: a USER name past the strict 40-byte cap
|
|
181
|
+
// must NOT be accepted under a prototype-key profile.
|
|
182
|
+
var threwLong = null;
|
|
183
|
+
try {
|
|
184
|
+
b.guardPop3Command.validate("USER " + "a".repeat(300),
|
|
185
|
+
{ profile: "constructor", tls: true });
|
|
186
|
+
} catch (e) { threwLong = e; }
|
|
187
|
+
check("prototype-key profile does not fail open on the username cap",
|
|
188
|
+
threwLong && threwLong.code === "guard-pop3-command/bad-profile");
|
|
189
|
+
}
|
|
190
|
+
|
|
165
191
|
function run() {
|
|
166
192
|
testByteCapMultibyte();
|
|
167
193
|
testSurface();
|
|
@@ -170,6 +196,7 @@ function run() {
|
|
|
170
196
|
testAuthCleartextRefused();
|
|
171
197
|
testApopRefusedUnderStrict();
|
|
172
198
|
testBadInputRefused();
|
|
199
|
+
testProfilePrototypeKeyRefused();
|
|
173
200
|
testCompliancePosture();
|
|
174
201
|
}
|
|
175
202
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.guardRegex — ReDoS screening for operator-supplied patterns. Covers the
|
|
6
|
+
* nested-quantifier detector's true positives AND the linear shapes it must NOT
|
|
7
|
+
* false-refuse (#432 / #429): a quantified non-capturing group (`(?:…)?`,
|
|
8
|
+
* `(?:…)*`) and an OPTIONAL quantified group (`(X+)?`, `(?:X+)?`) repeat the
|
|
9
|
+
* group at most once, so they are linear, not catastrophic. The catastrophic
|
|
10
|
+
* class requires the OUTER quantifier to be unbounded (`*`/`+`/`{n,}`).
|
|
11
|
+
*
|
|
12
|
+
* Run standalone: `node test/layer-0-primitives/guard-regex.test.js`
|
|
13
|
+
* Or via smoke: `node test/smoke.js`
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
var helpers = require("../helpers");
|
|
17
|
+
var b = helpers.b;
|
|
18
|
+
var check = helpers.check;
|
|
19
|
+
|
|
20
|
+
function assertSafeAccepts(src) {
|
|
21
|
+
try { b.guardRegex.assertSafe(new RegExp(src), "x"); return true; } catch (_e) { return false; }
|
|
22
|
+
}
|
|
23
|
+
function sanitizeAccepts(src) {
|
|
24
|
+
try { b.guardRegex.sanitize(src); return true; } catch (_e) { return false; }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// ---- #432 / #429: linear shapes must be ACCEPTED (were false-refused) ----
|
|
28
|
+
function testLinearShapesAccepted() {
|
|
29
|
+
var linear = [
|
|
30
|
+
"^(?:/page/\\d+)?$", // optional non-capturing group
|
|
31
|
+
"^foo(?:bar)*$", // quantified non-capturing group
|
|
32
|
+
"^foo(?:bar)?$",
|
|
33
|
+
"^(a+)?$", // optional quantified group — repeats 0..1
|
|
34
|
+
"(?:[-+][0-9A-Za-z.-]+)?", // optional group with inner quantifier (#429)
|
|
35
|
+
"(?:[-+][0-9A-Za-z.-]{1,64})?",
|
|
36
|
+
"v\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?-linux-x64",
|
|
37
|
+
];
|
|
38
|
+
linear.forEach(function (src) {
|
|
39
|
+
check("assertSafe accepts linear " + JSON.stringify(src), assertSafeAccepts(src));
|
|
40
|
+
check("sanitize accepts linear " + JSON.stringify(src), sanitizeAccepts(src));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ---- genuine nested-UNBOUNDED shapes must still be REFUSED ----
|
|
45
|
+
function testCatastrophicShapesRefused() {
|
|
46
|
+
var bad = ["^(a+)+$", "(a+)*", "((a)+)+", "(([a-z]+)*)*", "(a+){2,}"];
|
|
47
|
+
bad.forEach(function (src) {
|
|
48
|
+
check("assertSafe refuses catastrophic " + JSON.stringify(src), assertSafeAccepts(src) === false);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ---- other ReDoS classes the guard covers stay covered ----
|
|
53
|
+
function testOtherClasses() {
|
|
54
|
+
check("alternation-with-quantifier refused", assertSafeAccepts("^(a|b|c)+$") === false);
|
|
55
|
+
check("plain linear pattern accepted", assertSafeAccepts("^[a-z0-9_-]{1,64}$"));
|
|
56
|
+
check("anchored alternation without group-quantifier accepted", assertSafeAccepts("^(?:cat|dog|bird)$"));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ---- b.guardRegex.gate — the request-boundary screener ----
|
|
60
|
+
// The gate reads ctx.identifier (or ctx.pattern) and maps validate's
|
|
61
|
+
// severity to serve / audit-only / refuse before any new RegExp() compile.
|
|
62
|
+
async function testGate() {
|
|
63
|
+
var gate = b.guardRegex.gate({ profile: "strict" });
|
|
64
|
+
|
|
65
|
+
var clean = await gate.check({ identifier: "^[a-z]+$" });
|
|
66
|
+
check("gate: linear pattern → action=serve, ok=true",
|
|
67
|
+
clean.ok === true && clean.action === "serve");
|
|
68
|
+
|
|
69
|
+
var nested = await gate.check({ identifier: "(a+)+b" });
|
|
70
|
+
check("gate: nested-quantifier ReDoS → action=refuse, ok=false",
|
|
71
|
+
nested.ok === false && nested.action === "refuse");
|
|
72
|
+
check("gate: nested-quantifier → nested-quantifier issue",
|
|
73
|
+
nested.issues.some(function (i) { return i.kind === "nested-quantifier"; }));
|
|
74
|
+
|
|
75
|
+
// ctx.pattern is the documented fallback field for the pattern.
|
|
76
|
+
var alt = await gate.check({ pattern: "(a|b|c)+" });
|
|
77
|
+
check("gate: alternation-with-quantifier via ctx.pattern → refuse",
|
|
78
|
+
alt.action === "refuse");
|
|
79
|
+
|
|
80
|
+
// Absent pattern is a no-op serve (nothing to screen).
|
|
81
|
+
var none = await gate.check({});
|
|
82
|
+
check("gate: no pattern supplied → action=serve",
|
|
83
|
+
none.ok === true && none.action === "serve");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function run() {
|
|
87
|
+
testLinearShapesAccepted();
|
|
88
|
+
testCatastrophicShapesRefused();
|
|
89
|
+
testOtherClasses();
|
|
90
|
+
await testGate();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (require.main === module) {
|
|
94
|
+
run()
|
|
95
|
+
.then(function () { console.log("guard-regex OK — " + helpers.getChecks() + " checks"); })
|
|
96
|
+
.catch(function (e) { console.error("FAIL:", e.stack || e); process.exit(1); });
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
module.exports = { run: run };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* guard-shell — shell-argument content-safety primitive (b.guardShell).
|
|
6
|
+
*
|
|
7
|
+
* Covers the pass-through-or-throw sanitize contract: a clean argument
|
|
8
|
+
* returns unchanged, while an argument carrying a shell-injection shape
|
|
9
|
+
* throws GuardShellError with the offending rule id. Command / process
|
|
10
|
+
* substitution, backticks and newlines are refused at EVERY profile
|
|
11
|
+
* (including permissive) — the RCE class is never an operator opt-in.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
var helpers = require("../helpers");
|
|
15
|
+
var b = helpers.b;
|
|
16
|
+
var check = helpers.check;
|
|
17
|
+
|
|
18
|
+
function _code(fn) { try { fn(); return null; } catch (e) { return e && e.code; } }
|
|
19
|
+
|
|
20
|
+
function testGuardShellSurface() {
|
|
21
|
+
check("guardShell is an object", typeof b.guardShell === "object");
|
|
22
|
+
check("guardShell.NAME === 'shell'", b.guardShell.NAME === "shell");
|
|
23
|
+
check("guardShell.sanitize is a function", typeof b.guardShell.sanitize === "function");
|
|
24
|
+
check("guardShell registered in guardAll",
|
|
25
|
+
b.guardAll.allGuards().some(function (g) { return (g.name || g.NAME) === "shell"; }));
|
|
26
|
+
check("frameworkError.GuardShellError exposed",
|
|
27
|
+
typeof b.frameworkError.GuardShellError === "function");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function testSanitizeCleanPassthrough() {
|
|
31
|
+
// A metacharacter-free argument survives sanitize verbatim.
|
|
32
|
+
var out = b.guardShell.sanitize("safe-arg-value", { profile: "strict" });
|
|
33
|
+
check("clean arg passes through unchanged", out === "safe-arg-value");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function testSanitizeRefusesMetacharChain() {
|
|
37
|
+
// `safe; rm -rf /` carries the POSIX `;` command separator — a shell
|
|
38
|
+
// would run `rm -rf /` after the intended arg.
|
|
39
|
+
check("posix metacharacter chain refused under strict",
|
|
40
|
+
_code(function () { b.guardShell.sanitize("safe; rm -rf /", { profile: "strict" }); })
|
|
41
|
+
=== "shell.posix-metachar");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function testSanitizeRefusesCommandSubstitutionEveryProfile() {
|
|
45
|
+
// $(...) command substitution is refused even at permissive.
|
|
46
|
+
check("$(...) command substitution refused at permissive",
|
|
47
|
+
_code(function () { b.guardShell.sanitize("$(whoami)", { profile: "permissive" }); })
|
|
48
|
+
=== "shell.dollar-substitution");
|
|
49
|
+
// Backtick substitution is likewise refused at permissive.
|
|
50
|
+
check("backtick substitution refused at permissive",
|
|
51
|
+
_code(function () { b.guardShell.sanitize("`id`", { profile: "permissive" }); })
|
|
52
|
+
=== "shell.backtick");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function testSanitizeThrowsGuardShellError() {
|
|
56
|
+
var caught = null;
|
|
57
|
+
try { b.guardShell.sanitize("a|b", { profile: "strict" }); }
|
|
58
|
+
catch (e) { caught = e; }
|
|
59
|
+
check("sanitize throws a GuardShellError instance",
|
|
60
|
+
caught instanceof b.frameworkError.GuardShellError);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function run() {
|
|
64
|
+
testGuardShellSurface();
|
|
65
|
+
testSanitizeCleanPassthrough();
|
|
66
|
+
testSanitizeRefusesMetacharChain();
|
|
67
|
+
testSanitizeRefusesCommandSubstitutionEveryProfile();
|
|
68
|
+
testSanitizeThrowsGuardShellError();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = { run: run };
|
|
72
|
+
|
|
73
|
+
if (require.main === module) {
|
|
74
|
+
try { run(); console.log("[guard-shell] OK — " + helpers.getChecks() + " checks passed"); }
|
|
75
|
+
catch (e) { console.error("FAIL:", e.stack || e); process.exit(1); }
|
|
76
|
+
}
|
package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js}
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright (c) blamejs contributors
|
|
3
3
|
"use strict";
|
|
4
4
|
/**
|
|
5
|
-
* guard-sql
|
|
5
|
+
* guard-sql — error / adversarial-branch coverage for
|
|
6
6
|
* b.guardSql (the raw-SQL content-safety primitive).
|
|
7
7
|
*
|
|
8
8
|
* The smoke + integration suites already exercise the happy path (a
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* - sanitize's refuse-throw path and gate's serve / audit-only /
|
|
29
29
|
* refuse / fail-closed dispositions.
|
|
30
30
|
*
|
|
31
|
-
* Run standalone: node test/layer-0-primitives/guard-sql
|
|
31
|
+
* Run standalone: node test/layer-0-primitives/guard-sql.test.js
|
|
32
32
|
* Or via smoke: node test/smoke.js
|
|
33
33
|
*/
|
|
34
34
|
|
|
@@ -426,7 +426,7 @@ module.exports = { run: run };
|
|
|
426
426
|
|
|
427
427
|
if (require.main === module) {
|
|
428
428
|
run().then(
|
|
429
|
-
function () { console.log("[guard-sql
|
|
429
|
+
function () { console.log("[guard-sql] OK — " + helpers.getChecks() + " checks passed"); process.exit(0); },
|
|
430
430
|
function (e) { console.error("FAIL:", e && e.stack || e); process.exit(1); }
|
|
431
431
|
);
|
|
432
432
|
}
|