@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
|
@@ -178,8 +178,11 @@ var INPUT_TYPES = {
|
|
|
178
178
|
};
|
|
179
179
|
|
|
180
180
|
function _renderInput(field) {
|
|
181
|
+
// A field with no explicit type defaults to a text input — mirror the
|
|
182
|
+
// `|| "text"` dispatch in _renderField so the emitted type attribute
|
|
183
|
+
// agrees with the widget actually rendered (never a bare type="").
|
|
181
184
|
var attrs = [
|
|
182
|
-
'type="' + escapeAttribute(field.type) + '"',
|
|
185
|
+
'type="' + escapeAttribute(field.type || "text") + '"',
|
|
183
186
|
'name="' + escapeAttribute(field.name) + '"',
|
|
184
187
|
];
|
|
185
188
|
if (field.value !== undefined && field.value !== null) {
|
|
@@ -358,7 +361,14 @@ function _coerce(field, raw) {
|
|
|
358
361
|
// (false), not "not provided." Coerce to false BEFORE the generic
|
|
359
362
|
// undefined-passthrough below.
|
|
360
363
|
if (field.type === "checkbox") {
|
|
361
|
-
|
|
364
|
+
// A urlencoded checkbox submits its VALUE string only when checked, so
|
|
365
|
+
// any present string — including a custom value of "false" / "0" / "" —
|
|
366
|
+
// means checked: presence, not the string content, is the checked
|
|
367
|
+
// signal. Unchecked is the field's ABSENCE (undefined / null) or, for a
|
|
368
|
+
// typed (JSON) body, an explicit boolean false / numeric 0. This keeps a
|
|
369
|
+
// required checkbox satisfiable whatever value it is rendered with, while
|
|
370
|
+
// a JSON false / 0 still reads as unchecked.
|
|
371
|
+
if (raw === undefined || raw === null || raw === false || raw === 0) return false;
|
|
362
372
|
return true;
|
|
363
373
|
}
|
|
364
374
|
if (raw === undefined) return undefined;
|
|
@@ -381,6 +391,74 @@ function _isEmpty(v) {
|
|
|
381
391
|
return v === undefined || v === null || v === "";
|
|
382
392
|
}
|
|
383
393
|
|
|
394
|
+
// A field's numeric bound (min / max / minlength / maxlength) must resolve
|
|
395
|
+
// to a finite number. A non-finite bound (a non-numeric string, NaN,
|
|
396
|
+
// Infinity) would make its comparison a silent no-op — NaN comparisons are
|
|
397
|
+
// always false — turning a documented constraint into nothing. That is an
|
|
398
|
+
// operator config error, so throw at the entry point (mirrors the
|
|
399
|
+
// pre-compiled-RegExp requirement for `pattern`) rather than shipping a
|
|
400
|
+
// form whose bound is quietly unenforced.
|
|
401
|
+
// A clean numeric literal: an optional sign, an integer/decimal mantissa,
|
|
402
|
+
// and an optional exponent. Linear (no nested quantifier over overlapping
|
|
403
|
+
// classes), so it is a framework-internal constant with no ReDoS surface.
|
|
404
|
+
var NUMERIC_LITERAL_RE = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
405
|
+
// Any real numeric bound is short — Number.MAX_VALUE stringifies to ~23
|
|
406
|
+
// chars — so cap the length before the regex test; a longer "number" string
|
|
407
|
+
// is malformed, and running a regex over an unbounded operator string is a
|
|
408
|
+
// DoS shape regardless of the pattern's own linearity.
|
|
409
|
+
var MAX_NUMERIC_BOUND_CHARS = 40;
|
|
410
|
+
|
|
411
|
+
function _numericBound(f, key) {
|
|
412
|
+
var v = f[key];
|
|
413
|
+
// Accept ONLY a genuine finite number or a string that is a clean numeric
|
|
414
|
+
// literal. A bare Number() coerces null / "" / whitespace / false / [] to a
|
|
415
|
+
// finite 0 (and true to 1), which would let a malformed bound — e.g.
|
|
416
|
+
// min: null, which the renderer emits as min="" (no constraint) — silently
|
|
417
|
+
// validate as 0 on the backend and diverge from the browser. Those are
|
|
418
|
+
// rejected here, not coerced.
|
|
419
|
+
var n = NaN;
|
|
420
|
+
if (typeof v === "number") n = v;
|
|
421
|
+
else if (typeof v === "string" && v.length <= MAX_NUMERIC_BOUND_CHARS && NUMERIC_LITERAL_RE.test(v)) n = Number(v);
|
|
422
|
+
if (!Number.isFinite(n)) {
|
|
423
|
+
throw new Error("forms.validate: field '" + f.name + "'." + key +
|
|
424
|
+
" must be a finite number; got " +
|
|
425
|
+
(typeof v === "string" ? JSON.stringify(v) : typeof v) +
|
|
426
|
+
". Fix the form spec.");
|
|
427
|
+
}
|
|
428
|
+
return n;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Validate a field's SPEC — the operator-supplied shape, independent of any
|
|
432
|
+
// submitted value. A numeric bound (min / max / minlength / maxlength) must
|
|
433
|
+
// be finite, and a `pattern` must be a pre-compiled, ReDoS-safe RegExp
|
|
434
|
+
// (compiling operator source on the request path would be an engine ReDoS
|
|
435
|
+
// surface). A malformed spec is an operator config error surfaced
|
|
436
|
+
// deterministically at the entry point — never conditionally on whether a
|
|
437
|
+
// given request happens to carry a value that reaches the bound, which would
|
|
438
|
+
// turn a config bug into an input-dependent runtime failure.
|
|
439
|
+
function _assertFieldSpec(f) {
|
|
440
|
+
if (!f.name || f.type === "submit") return;
|
|
441
|
+
// min / max are compared numerically only for number / range controls;
|
|
442
|
+
// date / time / datetime-local / month / week controls carry ISO-string
|
|
443
|
+
// bounds (e.g. min: "2026-01-01") that validate() never compares
|
|
444
|
+
// numerically, so those are not numeric bounds and must not be rejected.
|
|
445
|
+
if (f.type === "number" || f.type === "range") {
|
|
446
|
+
if (f.min !== undefined) _numericBound(f, "min");
|
|
447
|
+
if (f.max !== undefined) _numericBound(f, "max");
|
|
448
|
+
}
|
|
449
|
+
// minlength / maxlength are always character counts, whatever the control.
|
|
450
|
+
if (f.minlength !== undefined) _numericBound(f, "minlength");
|
|
451
|
+
if (f.maxlength !== undefined) _numericBound(f, "maxlength");
|
|
452
|
+
if (f.pattern) {
|
|
453
|
+
if (!(f.pattern instanceof RegExp)) {
|
|
454
|
+
throw new Error("forms.validate: field '" + f.name +
|
|
455
|
+
"'.pattern must be a pre-compiled RegExp; got " +
|
|
456
|
+
(typeof f.pattern) + ". Wrap the source string with `RegExp` at config time.");
|
|
457
|
+
}
|
|
458
|
+
guardRegex.assertSafe(f.pattern, "forms: field[" + f.name + "].pattern");
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
384
462
|
/**
|
|
385
463
|
* @primitive b.forms.validate
|
|
386
464
|
* @signature b.forms.validate(spec, body)
|
|
@@ -390,8 +468,9 @@ function _isEmpty(v) {
|
|
|
390
468
|
*
|
|
391
469
|
* Walks the same spec the renderer accepts and validates a submitted
|
|
392
470
|
* body. Per field: required-field check, type coercion (string /
|
|
393
|
-
* number / boolean / email / url), `
|
|
394
|
-
* regex `pattern`, `enum` membership.
|
|
471
|
+
* number / boolean / email / url), `minlength` / `maxlength` bounds,
|
|
472
|
+
* numeric `min` / `max` bounds, regex `pattern`, `enum` membership.
|
|
473
|
+
* Returns
|
|
395
474
|
* `{ valid: boolean, errors: { field: msg, ... }, values: { ... } }`.
|
|
396
475
|
* The `values` object holds coerced values keyed by field name —
|
|
397
476
|
* route handlers consume `result.values` directly without re-parsing.
|
|
@@ -400,7 +479,7 @@ function _isEmpty(v) {
|
|
|
400
479
|
* var result = b.forms.validate(
|
|
401
480
|
* { fields: [
|
|
402
481
|
* { type: "email", name: "email", required: true },
|
|
403
|
-
* { type: "number", name: "age",
|
|
482
|
+
* { type: "number", name: "age", min: 1 },
|
|
404
483
|
* ] },
|
|
405
484
|
* { email: "ada@example.com", age: "37" }
|
|
406
485
|
* );
|
|
@@ -410,6 +489,12 @@ function validate(spec, body) {
|
|
|
410
489
|
if (!spec || !Array.isArray(spec.fields)) {
|
|
411
490
|
throw new Error("forms.validate: spec.fields must be an array");
|
|
412
491
|
}
|
|
492
|
+
// Validate every field's spec up front — a malformed bound or pattern is
|
|
493
|
+
// rejected on the first call, deterministically, regardless of the body
|
|
494
|
+
// (never only when a request happens to carry a value that reaches it).
|
|
495
|
+
for (var s = 0; s < spec.fields.length; s++) {
|
|
496
|
+
_assertFieldSpec(spec.fields[s]);
|
|
497
|
+
}
|
|
413
498
|
body = body || {};
|
|
414
499
|
var errors = {};
|
|
415
500
|
var values = {};
|
|
@@ -423,7 +508,21 @@ function validate(spec, body) {
|
|
|
423
508
|
var coerced = _coerce(f, raw);
|
|
424
509
|
values[f.name] = coerced;
|
|
425
510
|
|
|
426
|
-
|
|
511
|
+
// Checkbox: the only constraint is `required`, which HTML defines as
|
|
512
|
+
// "must be checked" — and the renderer emits that attribute, so the
|
|
513
|
+
// server enforces the same (backend validates what the frontend
|
|
514
|
+
// displays). An unchecked required box (coerced === false) is an error,
|
|
515
|
+
// never a silent pass. No length / pattern / enum checks apply.
|
|
516
|
+
if (f.type === "checkbox") {
|
|
517
|
+
if (f.required && coerced !== true) {
|
|
518
|
+
errors[f.name] = f.errorMessages && f.errorMessages.required
|
|
519
|
+
? f.errorMessages.required
|
|
520
|
+
: (f.label || f.name) + " is required";
|
|
521
|
+
}
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
if (f.required && _isEmpty(coerced)) {
|
|
427
526
|
errors[f.name] = f.errorMessages && f.errorMessages.required
|
|
428
527
|
? f.errorMessages.required
|
|
429
528
|
: (f.label || f.name) + " is required";
|
|
@@ -486,27 +585,14 @@ function validate(spec, body) {
|
|
|
486
585
|
errors[f.name] = (f.label || f.name) + " must be at most " + f.maxlength + " characters";
|
|
487
586
|
continue;
|
|
488
587
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
"'.pattern must be a pre-compiled RegExp; got " +
|
|
498
|
-
(typeof f.pattern) + ". Wrap the source string with `RegExp` at config time.");
|
|
499
|
-
}
|
|
500
|
-
// Screen the operator-supplied pattern for catastrophic-backtracking
|
|
501
|
-
// (ReDoS) shapes before the test, so a pathological regex can't be
|
|
502
|
-
// run against the submitted value.
|
|
503
|
-
guardRegex.assertSafe(f.pattern, "forms: field[" + f.name + "].pattern");
|
|
504
|
-
if (!f.pattern.test(coerced)) {
|
|
505
|
-
errors[f.name] = f.errorMessages && f.errorMessages.pattern
|
|
506
|
-
? f.errorMessages.pattern
|
|
507
|
-
: (f.label || f.name) + " has an invalid format";
|
|
508
|
-
continue;
|
|
509
|
-
}
|
|
588
|
+
// `pattern` was proven a pre-compiled, ReDoS-safe RegExp by the
|
|
589
|
+
// up-front spec pass, so only the match against the submitted value
|
|
590
|
+
// remains on the request path.
|
|
591
|
+
if (f.pattern && !f.pattern.test(coerced)) {
|
|
592
|
+
errors[f.name] = f.errorMessages && f.errorMessages.pattern
|
|
593
|
+
? f.errorMessages.pattern
|
|
594
|
+
: (f.label || f.name) + " has an invalid format";
|
|
595
|
+
continue;
|
|
510
596
|
}
|
|
511
597
|
}
|
|
512
598
|
if ((f.type === "select" || f.type === "radio") && Array.isArray(f.options)) {
|
|
@@ -1190,12 +1190,20 @@ function makeProfileResolver(cfg) {
|
|
|
1190
1190
|
var label = _guardLabelFromError(ErrorClass);
|
|
1191
1191
|
return function resolveProfile(opts) {
|
|
1192
1192
|
opts = opts || {};
|
|
1193
|
-
|
|
1193
|
+
// Own-property lookups only: opts.posture / opts.profile are attacker/
|
|
1194
|
+
// operator input, so a bare bracket read would let a prototype key
|
|
1195
|
+
// ("constructor" / "__proto__" / "toString") resolve to an inherited
|
|
1196
|
+
// truthy member — the posture read would return it as the profile name,
|
|
1197
|
+
// and `!profiles[p]` would treat it as a known profile and skip the
|
|
1198
|
+
// bad-profile refusal, running the gate under a bogus profile (fail-open).
|
|
1199
|
+
if (opts.posture && postures &&
|
|
1200
|
+
Object.prototype.hasOwnProperty.call(postures, opts.posture) &&
|
|
1201
|
+
postures[opts.posture]) {
|
|
1194
1202
|
var pn = postures[opts.posture];
|
|
1195
1203
|
return byObject ? profiles[pn] : pn;
|
|
1196
1204
|
}
|
|
1197
1205
|
var p = opts.profile || dft;
|
|
1198
|
-
if (!profiles
|
|
1206
|
+
if (!Object.prototype.hasOwnProperty.call(profiles, p)) {
|
|
1199
1207
|
throw ErrorClass.factory(codePrefix + "/bad-profile",
|
|
1200
1208
|
label + ": unknown profile '" + p + "' (use " +
|
|
1201
1209
|
Object.keys(profiles).join(" / ") + ")");
|
|
@@ -2313,11 +2321,11 @@ function _resetForTest() {
|
|
|
2313
2321
|
* `makeProfileBuilder` and never call `buildProfile` directly.
|
|
2314
2322
|
*
|
|
2315
2323
|
* @opts
|
|
2316
|
-
* baseProfile: string,
|
|
2317
|
-
* extends: string[],
|
|
2318
|
-
* overrides: object,
|
|
2319
|
-
* removes: object,
|
|
2320
|
-
* resolveProfile: function,
|
|
2324
|
+
* baseProfile: string, // start from this profile name
|
|
2325
|
+
* extends: string|string[], // additional base(s) (later-wins)
|
|
2326
|
+
* overrides: object, // inline merge after extends
|
|
2327
|
+
* removes: object, // drop array entries or keys
|
|
2328
|
+
* resolveProfile: function, // (name) → profile|null (required)
|
|
2321
2329
|
*
|
|
2322
2330
|
* @example
|
|
2323
2331
|
* var PROFILES = {
|
|
@@ -2363,9 +2371,14 @@ function buildProfile(opts) {
|
|
|
2363
2371
|
return merged;
|
|
2364
2372
|
}
|
|
2365
2373
|
var base = opts.baseProfile ? _walk(opts.baseProfile) : {};
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2374
|
+
// @opts documents `extends: string|string[]`; normalize a bare string
|
|
2375
|
+
// to a one-element list so the single-base form composes instead of
|
|
2376
|
+
// being silently dropped (the ABI-template @example every guard shares
|
|
2377
|
+
// is `buildProfile({ extends: "strict" })`).
|
|
2378
|
+
var extendsList = typeof opts.extends === "string" ? [opts.extends] : opts.extends;
|
|
2379
|
+
if (Array.isArray(extendsList)) {
|
|
2380
|
+
for (var i = 0; i < extendsList.length; i++) {
|
|
2381
|
+
base = _mergeProfile(base, _walk(extendsList[i]));
|
|
2369
2382
|
}
|
|
2370
2383
|
}
|
|
2371
2384
|
if (opts.overrides) base = _mergeProfile(base, opts.overrides);
|
|
@@ -129,7 +129,14 @@ function create(opts) {
|
|
|
129
129
|
registeredAt: existing.registeredAt,
|
|
130
130
|
lastUpdatedAt: now(),
|
|
131
131
|
});
|
|
132
|
-
|
|
132
|
+
// Validate whenever the patch TOUCHES legalBasis — keyed on own-property
|
|
133
|
+
// presence, not truthiness. A falsy-but-invalid value ("" / 0 / false /
|
|
134
|
+
// undefined) is still an invalid legal basis and must be rejected with the
|
|
135
|
+
// same rigor register() applies; a `patch.legalBasis &&` guard would skip
|
|
136
|
+
// the enum check for those values and silently corrupt a required
|
|
137
|
+
// Article 30 field.
|
|
138
|
+
if (Object.prototype.hasOwnProperty.call(patch, "legalBasis") &&
|
|
139
|
+
!Object.prototype.hasOwnProperty.call(VALID_LEGAL_BASES, merged.legalBasis)) {
|
|
133
140
|
throw new GdprRopaError("gdpr-ropa/bad-legal-basis",
|
|
134
141
|
"gdpr.ropa.update: legalBasis must be one of " + Object.keys(VALID_LEGAL_BASES).join(", "));
|
|
135
142
|
}
|
|
@@ -102,7 +102,7 @@ function _checkName(name, profile) {
|
|
|
102
102
|
throw new GuardAgentRegistryError("agent-registry/name-too-long",
|
|
103
103
|
"guardAgentRegistry.validate: name exceeds maxNameBytes=" + profile.maxNameBytes);
|
|
104
104
|
}
|
|
105
|
-
if (RESERVED_EXACT
|
|
105
|
+
if (Object.prototype.hasOwnProperty.call(RESERVED_EXACT, name)) {
|
|
106
106
|
throw new GuardAgentRegistryError("agent-registry/reserved-name",
|
|
107
107
|
"guardAgentRegistry.validate: name '" + name + "' is framework-reserved");
|
|
108
108
|
}
|
|
@@ -781,10 +781,10 @@ function gate(opts) {
|
|
|
781
781
|
* `GuardArchiveError("archive.bad-profile")` on unknown name.
|
|
782
782
|
*
|
|
783
783
|
* @opts
|
|
784
|
-
*
|
|
784
|
+
* extends: "strict"|"balanced"|"permissive", // base profile name(s)
|
|
785
785
|
*
|
|
786
786
|
* @example
|
|
787
|
-
* var resolved = b.guardArchive.buildProfile({
|
|
787
|
+
* var resolved = b.guardArchive.buildProfile({ extends: "strict" });
|
|
788
788
|
* resolved.maxEntries; // → 100
|
|
789
789
|
* resolved.symlinkPolicy; // → "reject"
|
|
790
790
|
* resolved.maxCompressionRatio; // → 100
|
|
@@ -182,6 +182,11 @@ function _parseIpv6(s) {
|
|
|
182
182
|
if (left === null || right === null) return null;
|
|
183
183
|
var pad = IPV6_GROUPS - left.length - right.length;
|
|
184
184
|
if (pad < 0) return null;
|
|
185
|
+
// RFC 4291 §2.2 — "::" must compress at least one all-zero group. Eight
|
|
186
|
+
// explicit groups adjacent to a "::" (pad === 0) compress nothing and are
|
|
187
|
+
// malformed IPv6 text (net.isIP rejects them), so reject rather than accept
|
|
188
|
+
// a non-canonical spelling into CIDR matching.
|
|
189
|
+
if (pad === 0) return null;
|
|
185
190
|
var zeros = [];
|
|
186
191
|
for (var z = 0; z < pad; z += 1) zeros.push("0000"); // IPv6 zero group
|
|
187
192
|
groups = left.concat(zeros).concat(right);
|
|
@@ -232,13 +237,34 @@ function _ipv4InReservedRange(octets, prefix) {
|
|
|
232
237
|
return hits;
|
|
233
238
|
}
|
|
234
239
|
|
|
240
|
+
// Bit-accurate prefix match over two hex strings. Reserved-range membership
|
|
241
|
+
// is a relation on the first `prefixBits` bits, NOT on a whole number of hex
|
|
242
|
+
// nibbles: ULA fc00::/7 (7 bits) and link-local fe80::/10 (10 bits) end
|
|
243
|
+
// mid-nibble, so a hex-string startsWith on the reserved nibbles silently
|
|
244
|
+
// misses every address whose trailing (masked-off) bits differ — e.g. fd00::
|
|
245
|
+
// (the assigned half of fc00::/7) and fe90::/fea0::/feb0:: (all inside
|
|
246
|
+
// fe80::/10). Compare the whole nibbles, then the top `prefixBits % 4` bits of
|
|
247
|
+
// the boundary nibble under a mask — the same bit-prefix relation the IPv4
|
|
248
|
+
// side gets from `(addr & mask) === net` and ssrf-guard gets from its byte-
|
|
249
|
+
// level `_ipv6PrefixMatch`.
|
|
250
|
+
function _ipv6HexPrefixMatch(hex, reservedHex, prefixBits) {
|
|
251
|
+
var fullNibbles = Math.floor(prefixBits / 4); // whole hex chars fully inside the prefix
|
|
252
|
+
if (hex.slice(0, fullNibbles) !== reservedHex.slice(0, fullNibbles)) return false;
|
|
253
|
+
var remBits = prefixBits - fullNibbles * 4; // 0-3 bits in the boundary nibble
|
|
254
|
+
if (remBits === 0) return true;
|
|
255
|
+
var mask = (0xF << (4 - remBits)) & 0xF; // high `remBits` bits of the nibble
|
|
256
|
+
var aNib = parseInt(hex.charAt(fullNibbles), 16); // base-16 radix
|
|
257
|
+
var rNib = parseInt(reservedHex.charAt(fullNibbles), 16); // base-16 radix
|
|
258
|
+
return (aNib & mask) === (rNib & mask);
|
|
259
|
+
}
|
|
260
|
+
|
|
235
261
|
function _ipv6InReservedRange(groups, prefix) {
|
|
236
262
|
var hex = groups.join("");
|
|
237
263
|
var hits = [];
|
|
238
264
|
for (var i = 0; i < IPV6_RESERVED.length; i += 1) {
|
|
239
265
|
var r = IPV6_RESERVED[i];
|
|
240
266
|
if (prefix < r.prefix) continue;
|
|
241
|
-
if (hex.
|
|
267
|
+
if (_ipv6HexPrefixMatch(hex, r.hexPrefix, r.prefix)) hits.push(r.label);
|
|
242
268
|
}
|
|
243
269
|
return hits;
|
|
244
270
|
}
|
|
@@ -165,7 +165,8 @@ function _measureQueryShape(query) {
|
|
|
165
165
|
var depth = 0;
|
|
166
166
|
var inString = false;
|
|
167
167
|
var inComment = false;
|
|
168
|
-
var
|
|
168
|
+
var escapeNext = false; // inside a string, the previous char was an unescaped backslash
|
|
169
|
+
var aliasStack = [0]; // per-selection-set alias counter (top of stack = current set)
|
|
169
170
|
for (var i = 0; i < query.length; i += 1) {
|
|
170
171
|
var c = query.charAt(i);
|
|
171
172
|
if (inComment) {
|
|
@@ -173,7 +174,18 @@ function _measureQueryShape(query) {
|
|
|
173
174
|
continue;
|
|
174
175
|
}
|
|
175
176
|
if (inString) {
|
|
176
|
-
|
|
177
|
+
// Escaped-quote handling must track the backslash RUN, not just the
|
|
178
|
+
// single preceding char. `"\\"` is a complete string (its backslash is
|
|
179
|
+
// itself escaped), so a naive `charAt(i - 1) !== "\\"` test reads the
|
|
180
|
+
// closing quote as escaped, leaves the walker stuck in-string, and
|
|
181
|
+
// blinds it to every following brace / colon — silently under-counting
|
|
182
|
+
// depth and alias breadth so a depth-bomb or alias-bomb rides through as
|
|
183
|
+
// shape-clean (a fail-open DoS-measurement bypass on valid GraphQL).
|
|
184
|
+
// Toggle on each backslash: a closing quote ends the string only after
|
|
185
|
+
// an EVEN run (escapeNext false).
|
|
186
|
+
if (escapeNext) { escapeNext = false; continue; }
|
|
187
|
+
if (c === "\\") { escapeNext = true; continue; }
|
|
188
|
+
if (c === '"') inString = false;
|
|
177
189
|
continue;
|
|
178
190
|
}
|
|
179
191
|
if (c === '"') { inString = true; continue; }
|
|
@@ -181,28 +193,35 @@ function _measureQueryShape(query) {
|
|
|
181
193
|
if (c === "{") {
|
|
182
194
|
depth += 1;
|
|
183
195
|
if (depth > maxDepth) maxDepth = depth;
|
|
184
|
-
|
|
196
|
+
aliasStack.push(0);
|
|
185
197
|
} else if (c === "}") {
|
|
186
198
|
// Capture the current selection-set's alias count before popping
|
|
187
199
|
// — otherwise we lose the per-block max when the block closes.
|
|
188
|
-
var current =
|
|
200
|
+
var current = aliasStack[aliasStack.length - 1] || 0;
|
|
189
201
|
if (current > maxAliases) maxAliases = current;
|
|
190
202
|
depth -= 1;
|
|
191
|
-
|
|
203
|
+
// Never pop the base counter: an unbalanced leading `}` would otherwise
|
|
204
|
+
// desync the stack from `depth`, and a subsequent `depth`-indexed
|
|
205
|
+
// increment lands on an absent slot (`undefined + 1 === NaN`), poisoning
|
|
206
|
+
// every later comparison so an alias-bomb reads as clean.
|
|
207
|
+
if (aliasStack.length > 1) aliasStack.pop();
|
|
192
208
|
if (depth < 0) depth = 0;
|
|
193
209
|
} else if (c === ":") {
|
|
194
|
-
// Alias indicator — `alias: field
|
|
195
|
-
//
|
|
210
|
+
// Alias / argument indicator — `alias: field` / `field(arg: value)`.
|
|
211
|
+
// Increment the CURRENT selection-set's counter (top of stack) when the
|
|
212
|
+
// char before `:` looks like an identifier. Using the stack top rather
|
|
213
|
+
// than a `depth` index keeps counting correct even when a malformed
|
|
214
|
+
// brace run has decoupled `depth` from the stack length.
|
|
196
215
|
var prev = i > 0 ? query.charAt(i - 1) : "";
|
|
197
|
-
if (/[A-Za-z0-9_]/.test(prev) &&
|
|
198
|
-
|
|
216
|
+
if (/[A-Za-z0-9_]/.test(prev) && aliasStack.length > 1) {
|
|
217
|
+
aliasStack[aliasStack.length - 1] += 1;
|
|
199
218
|
}
|
|
200
219
|
}
|
|
201
220
|
}
|
|
202
221
|
// Final sweep covers any unclosed selection-sets (operator-supplied
|
|
203
222
|
// syntactically-invalid queries).
|
|
204
|
-
for (var ai = 0; ai <
|
|
205
|
-
if (
|
|
223
|
+
for (var ai = 0; ai < aliasStack.length; ai += 1) {
|
|
224
|
+
if (aliasStack[ai] > maxAliases) maxAliases = aliasStack[ai];
|
|
206
225
|
}
|
|
207
226
|
return { maxDepth: maxDepth, maxAliases: maxAliases };
|
|
208
227
|
}
|
|
@@ -110,11 +110,6 @@ void observability;
|
|
|
110
110
|
|
|
111
111
|
var _err = GuardHtmlError.factory;
|
|
112
112
|
|
|
113
|
-
// ---- Codepoint catalog (shared via lib/codepoint-class) ----
|
|
114
|
-
|
|
115
|
-
var C0_CTRL_RE_G = codepointClass.C0_CTRL_RE_G;
|
|
116
|
-
var ZW_RE_G = codepointClass.ZW_RE_G;
|
|
117
|
-
|
|
118
113
|
// ---- Tag denylists / allowlists ----
|
|
119
114
|
|
|
120
115
|
// Always-dangerous tags. Active scripts, plugin embeds, form elements,
|
|
@@ -362,54 +357,21 @@ function escapeAttr(value) {
|
|
|
362
357
|
.replace(/=/g, "=");
|
|
363
358
|
}
|
|
364
359
|
|
|
365
|
-
//
|
|
366
|
-
//
|
|
367
|
-
//
|
|
368
|
-
//
|
|
369
|
-
//
|
|
370
|
-
//
|
|
371
|
-
//
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
num: "#", excl: "!", quest: "?", lpar: "(", rpar: ")",
|
|
378
|
-
lsqb: "[", rsqb: "]", lcub: "{", rcub: "}",
|
|
379
|
-
// Quotes / brackets
|
|
380
|
-
quot: "\"", apos: "'", lt: "<", gt: ">",
|
|
381
|
-
// Misc ASCII
|
|
382
|
-
amp: "&", commat: "@", dollar: "$", percnt: "%",
|
|
383
|
-
ast: "*", plus: "+", lowbar: "_", hyphen: "-",
|
|
384
|
-
// Whitespace markers (codepoints in the ASCII / Latin-1 range that
|
|
385
|
-
// browsers treat as URL-strippable)
|
|
386
|
-
nbsp: " ",
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
// _normalizeUrl — peel off entity-encoded leading whitespace and
|
|
390
|
-
// HTML/URL-encoded scheme prefix tricks, then return the lowercased
|
|
391
|
-
// scheme. Returns "" if no scheme.
|
|
360
|
+
// The named-entity ASCII table + entity decoder now live in codepoint-class
|
|
361
|
+
// (NAMED_ENTITY_ASCII / decodeMarkupEntities), shared with guard-svg /
|
|
362
|
+
// guard-markdown so all three decode the SAME browser-honored set and cannot
|
|
363
|
+
// drift on which encoding a scheme / CSS-token danger check must fold away.
|
|
364
|
+
// _extractScheme — decode entity-hidden scheme-prefix tricks, fold away the
|
|
365
|
+
// whitespace the WHATWG URL parser would (tab/lf/cr anywhere + a leading/
|
|
366
|
+
// trailing C0-control-or-space run — none of which the C0/zero-width strip
|
|
367
|
+
// covers: tab/lf/cr are excluded from C0_CTRL_RANGES and space is not a
|
|
368
|
+
// control), then return the lowercased scheme ("" if none). The shared
|
|
369
|
+
// codepoint-class primitive keeps guard-html / guard-svg from drifting on which
|
|
370
|
+
// whitespace to strip, so neither `java<TAB>script:` nor ` javascript:` can
|
|
371
|
+
// read as scheme-less.
|
|
392
372
|
function _extractScheme(rawUrl) {
|
|
393
|
-
var s =
|
|
394
|
-
|
|
395
|
-
// OPTIONAL) just enough to expose hidden schemes like javascript: or
|
|
396
|
-
// the browser-decoded no-semicolon form javascript:. Shared decoder so
|
|
397
|
-
// guard-html / guard-svg / guard-markdown can't drift (see codepoint-class).
|
|
398
|
-
s = codepointClass.decodeNumericEntities(s);
|
|
399
|
-
// Decode HTML5 named entities that browsers honor inside URL
|
|
400
|
-
// contexts. Without this, payloads like `java	script:alert(1)`
|
|
401
|
-
// bypass the scheme allowlist (the literal `	` between `java`
|
|
402
|
-
// and `script:` doesn't match any denied scheme; the browser then
|
|
403
|
-
// decodes the entity, strips the tab, and executes javascript:).
|
|
404
|
-
s = s.replace(/&([A-Za-z][A-Za-z0-9]+);/g, function (m, name) {
|
|
405
|
-
if (Object.prototype.hasOwnProperty.call(NAMED_ENTITY_ASCII, name)) {
|
|
406
|
-
return NAMED_ENTITY_ASCII[name];
|
|
407
|
-
}
|
|
408
|
-
return m;
|
|
409
|
-
});
|
|
410
|
-
// Strip embedded whitespace + control chars + zero-widths the
|
|
411
|
-
// URL parser would tolerate.
|
|
412
|
-
s = s.replace(C0_CTRL_RE_G, "").replace(ZW_RE_G, "");
|
|
373
|
+
var s = codepointClass.stripUrlSchemeWhitespace(
|
|
374
|
+
codepointClass.decodeMarkupEntities(String(rawUrl || "").trim()));
|
|
413
375
|
var m = s.match(/^([A-Za-z][A-Za-z0-9+.-]*):/);
|
|
414
376
|
return m ? m[1].toLowerCase() : "";
|
|
415
377
|
}
|
|
@@ -443,8 +405,19 @@ function _isClobberGlobal(name) {
|
|
|
443
405
|
}
|
|
444
406
|
|
|
445
407
|
function _isCssDangerous(value) {
|
|
408
|
+
// A style attribute is HTML/XML character-reference-decoded before the CSS
|
|
409
|
+
// parser sees it, so `expression(` reaches CSS as `expression(` and
|
|
410
|
+
// `behavior:` as `behavior:`. Match against the decoded value — the same
|
|
411
|
+
// normalization the URL-scheme check performs — so an entity-encoded CSS
|
|
412
|
+
// payload can't be served verbatim past the danger patterns.
|
|
413
|
+
// Also fold the URL-scheme whitespace a browser strips inside url(...) -- tab /
|
|
414
|
+
// lf / cr -- so an entity-hidden tab in a CSS URL scheme (url(java	script:))
|
|
415
|
+
// cannot defeat the contiguous `javascript:` danger pattern, the same bypass the
|
|
416
|
+
// URL-scheme check folds away for href.
|
|
417
|
+
var decoded = codepointClass.stripUrlSchemeWhitespace(
|
|
418
|
+
codepointClass.decodeMarkupEntities(value));
|
|
446
419
|
for (var i = 0; i < CSS_DANGEROUS_PATTERNS.length; i += 1) {
|
|
447
|
-
if (CSS_DANGEROUS_PATTERNS[i].test(
|
|
420
|
+
if (CSS_DANGEROUS_PATTERNS[i].test(decoded)) return true;
|
|
448
421
|
}
|
|
449
422
|
return false;
|
|
450
423
|
}
|
|
@@ -101,8 +101,11 @@ var MAGIC_BYTES = Object.freeze([
|
|
|
101
101
|
{ mime: "image/heic", bytes: [0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x78], offset: 4 },
|
|
102
102
|
{ mime: "image/avif", bytes: [0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66], offset: 4 },
|
|
103
103
|
// SVG (XML) — `<?xml` or `<svg` starting bytes (after any UTF-8 BOM).
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
// textFamily: a leading UTF-8 BOM is legal before XML/SVG text and is skipped
|
|
105
|
+
// when matching these; binary rasters (above) are matched only at their real
|
|
106
|
+
// offset, so a BOM-prefixed raster is NOT accepted.
|
|
107
|
+
{ mime: "image/svg+xml", bytes: [0x3C, 0x3F, 0x78, 0x6D, 0x6C], textFamily: true }, // `<?xml`
|
|
108
|
+
{ mime: "image/svg+xml", bytes: [0x3C, 0x73, 0x76, 0x67], textFamily: true }, // `<svg`
|
|
106
109
|
]);
|
|
107
110
|
|
|
108
111
|
// ---- Profile presets ----
|
|
@@ -163,12 +166,21 @@ function _bytesAt(buf, offset, sig) {
|
|
|
163
166
|
|
|
164
167
|
function _detectMagicMimes(buf) {
|
|
165
168
|
if (!buf || typeof buf.length !== "number") return [];
|
|
169
|
+
// A leading UTF-8 BOM (EF BB BF) is legal only before the text-family images
|
|
170
|
+
// (SVG / XML); skip it ONLY for those entries so a BOM-prefixed SVG still
|
|
171
|
+
// matches its `<?xml` / `<svg` signature and routes to guardSvg at every
|
|
172
|
+
// profile. Binary rasters (PNG/JPEG/GIF/...) must carry their signature at
|
|
173
|
+
// its real offset — applying the BOM shift to them would let a BOM-prefixed
|
|
174
|
+
// raster masquerade as valid, bypassing strict magic validation. So the
|
|
175
|
+
// shift is gated on entry.textFamily.
|
|
176
|
+
var bom = (buf.length >= 3 && buf[0] === 0xEF && buf[1] === 0xBB && buf[2] === 0xBF) ? 3 : 0;
|
|
166
177
|
var hits = [];
|
|
167
178
|
for (var i = 0; i < MAGIC_BYTES.length; i += 1) {
|
|
168
179
|
var entry = MAGIC_BYTES[i];
|
|
169
|
-
var
|
|
180
|
+
var shift = entry.textFamily ? bom : 0;
|
|
181
|
+
var offset = (entry.offset || 0) + shift;
|
|
170
182
|
if (!_bytesAt(buf, offset, entry.bytes)) continue;
|
|
171
|
-
if (entry.tail && !_bytesAt(buf, entry.tailOffset, entry.tail)) continue;
|
|
183
|
+
if (entry.tail && !_bytesAt(buf, entry.tailOffset + shift, entry.tail)) continue;
|
|
172
184
|
hits.push(entry.mime);
|
|
173
185
|
}
|
|
174
186
|
return hits;
|
|
@@ -182,8 +194,15 @@ function _detectIssues(metadata, opts) {
|
|
|
182
194
|
snippet: "image metadata is not an object" }];
|
|
183
195
|
}
|
|
184
196
|
|
|
197
|
+
// Measure the byte cap only for measurable values. A hostile bag whose
|
|
198
|
+
// `bytes` is a plain Array or array-like object carries a numeric `.length`
|
|
199
|
+
// but is NOT a byte-carrier — measuring it would throw, breaking validate's
|
|
200
|
+
// documented never-throw contract; byteLengthOfIfMeasurable returns null for
|
|
201
|
+
// those, so the cap is skipped (magic detection below is O(1)-bounded
|
|
202
|
+
// regardless of size) instead of crashing the caller.
|
|
185
203
|
var bytes = metadata.bytes;
|
|
186
|
-
|
|
204
|
+
var byteCount = safeBuffer.byteLengthOfIfMeasurable(bytes);
|
|
205
|
+
if (byteCount !== null && byteCount > opts.maxBytes) {
|
|
187
206
|
return [{ kind: "image-cap", severity: "high",
|
|
188
207
|
ruleId: "image.image-cap",
|
|
189
208
|
snippet: "image bytes exceed maxBytes " + opts.maxBytes }];
|
|
@@ -198,10 +198,18 @@ var LITERAL_SMUGGLE_RE = /\{[0-9]+\+?\}(?!\s*$)/;
|
|
|
198
198
|
function validate(line, opts) {
|
|
199
199
|
opts = opts || {};
|
|
200
200
|
var profileName = typeof opts.profile === "string" ? opts.profile : DEFAULT_PROFILE;
|
|
201
|
-
|
|
201
|
+
// hasOwnProperty on both lookups: opts.profile / opts.posture are caller
|
|
202
|
+
// input, and a bare bracket read resolves an inherited Object.prototype
|
|
203
|
+
// key (constructor / __proto__ / toString / ...) to a truthy value —
|
|
204
|
+
// PROFILES["constructor"] is the Object function, so `if (!caps)` never
|
|
205
|
+
// fires and every byte / literal cap compares against `undefined` (fails
|
|
206
|
+
// open). An unknown posture is ignored (falls through to profile/default);
|
|
207
|
+
// an unknown profile throws bad-profile.
|
|
208
|
+
if (opts.posture && Object.prototype.hasOwnProperty.call(COMPLIANCE_POSTURES, opts.posture)) {
|
|
202
209
|
profileName = COMPLIANCE_POSTURES[opts.posture];
|
|
203
210
|
}
|
|
204
|
-
var caps = PROFILES
|
|
211
|
+
var caps = Object.prototype.hasOwnProperty.call(PROFILES, profileName)
|
|
212
|
+
? PROFILES[profileName] : undefined;
|
|
205
213
|
if (!caps) {
|
|
206
214
|
throw new GuardImapCommandError("guard-imap-command/bad-profile",
|
|
207
215
|
"guardImapCommand.validate: unknown profile '" + profileName + "'");
|