@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
|
@@ -102,19 +102,30 @@ function _matchGlobPart(part, channel, fromIdx) {
|
|
|
102
102
|
if (channel.substr(pos, lit.length) !== lit) return -1;
|
|
103
103
|
pos += lit.length;
|
|
104
104
|
} else if (i === segments.length - 1) {
|
|
105
|
-
// Trailing literal
|
|
105
|
+
// Trailing literal after the final '*'. The '*' gap between the
|
|
106
|
+
// previous literal and this one matches non-'.' chars only, so the
|
|
107
|
+
// literal must START at or before the next '.' boundary — but the
|
|
108
|
+
// literal itself MAY contain '.' (it is matched verbatim, e.g. the
|
|
109
|
+
// '.created' tail in 'orders.*.created'). Greedy: pick the
|
|
110
|
+
// rightmost dot-free-reachable start.
|
|
106
111
|
var hardStop = channel.indexOf(".", pos);
|
|
107
|
-
var
|
|
108
|
-
if (lit === "") { pos =
|
|
109
|
-
var
|
|
110
|
-
|
|
111
|
-
|
|
112
|
+
var maxStart = hardStop === -1 ? channel.length : hardStop;
|
|
113
|
+
if (lit === "") { pos = maxStart; break; }
|
|
114
|
+
var placed = -1;
|
|
115
|
+
for (var s = maxStart; s >= pos; s--) {
|
|
116
|
+
if (channel.substr(s, lit.length) === lit) { placed = s; break; }
|
|
117
|
+
}
|
|
118
|
+
if (placed < 0) return -1;
|
|
119
|
+
pos = placed + lit.length;
|
|
112
120
|
} else {
|
|
113
|
-
// Middle literal
|
|
121
|
+
// Middle literal after a '*'. The '*' gap must be dot-free, so the
|
|
122
|
+
// literal must START at or before the next '.'; the literal itself
|
|
123
|
+
// MAY contain '.'. Leftmost occurrence keeps the preceding '*'
|
|
124
|
+
// minimal.
|
|
114
125
|
var hardStop2 = channel.indexOf(".", pos);
|
|
115
|
-
var
|
|
126
|
+
var maxStart2 = hardStop2 === -1 ? channel.length : hardStop2;
|
|
116
127
|
var f2 = channel.indexOf(lit, pos);
|
|
117
|
-
if (f2 < 0 || f2
|
|
128
|
+
if (f2 < 0 || f2 > maxStart2) return -1;
|
|
118
129
|
pos = f2 + lit.length;
|
|
119
130
|
}
|
|
120
131
|
}
|
|
@@ -467,7 +467,8 @@ function create(config) {
|
|
|
467
467
|
// dispatches both calls to the same backend.
|
|
468
468
|
var rowBuilt = _select()
|
|
469
469
|
.columns(["_id", "queueName", "payload", "repeatCron", "repeatTimezone",
|
|
470
|
-
"flowId", "flowChildName", "priority", "classification", "traceId"
|
|
470
|
+
"flowId", "flowChildName", "priority", "classification", "traceId",
|
|
471
|
+
"maxAttempts"])
|
|
471
472
|
.where("_id", jobId)
|
|
472
473
|
.toSql();
|
|
473
474
|
var rowRes = await store.execute(rowBuilt.sql, rowBuilt.params);
|
|
@@ -503,6 +504,11 @@ function create(config) {
|
|
|
503
504
|
var unsealedRow = cryptoField.unsealRow(SEAL_TABLE, row);
|
|
504
505
|
var cron = scheduler.parseCron(unsealedRow.repeatCron);
|
|
505
506
|
var nextMs = scheduler.nextCronFire(cron, new Date(nowMs), unsealedRow.repeatTimezone || null);
|
|
507
|
+
// Carry the operator's maxAttempts forward: the next occurrence must
|
|
508
|
+
// keep the same retry budget the operator configured, not silently
|
|
509
|
+
// reset to the enqueue default. A non-positive / non-finite value
|
|
510
|
+
// falls back to undefined so enqueue applies its own default.
|
|
511
|
+
var repeatMax = Number(unsealedRow.maxAttempts);
|
|
506
512
|
await enqueue(unsealedRow.queueName,
|
|
507
513
|
unsealedRow.payload ? safeJson.parse(unsealedRow.payload, { maxBytes: C.BYTES.mib(64) }) : null,
|
|
508
514
|
{
|
|
@@ -514,6 +520,7 @@ function create(config) {
|
|
|
514
520
|
availableAt: nextMs,
|
|
515
521
|
repeat: { cron: unsealedRow.repeatCron, timezone: unsealedRow.repeatTimezone },
|
|
516
522
|
priority: Number(unsealedRow.priority) || 0,
|
|
523
|
+
maxAttempts: (isFinite(repeatMax) && repeatMax > 0) ? repeatMax : undefined,
|
|
517
524
|
classification: unsealedRow.classification || null,
|
|
518
525
|
traceId: unsealedRow.traceId || null,
|
|
519
526
|
});
|
|
@@ -532,12 +532,17 @@ function create(opts) {
|
|
|
532
532
|
var cron = scheduler.parseCron(unsealed.repeatCron);
|
|
533
533
|
var nextMs = scheduler.nextCronFire(
|
|
534
534
|
cron, new Date(nowMs), unsealed.repeatTimezone || null);
|
|
535
|
+
// Carry the operator's maxAttempts forward so the next occurrence keeps
|
|
536
|
+
// the configured retry budget instead of silently resetting to the
|
|
537
|
+
// enqueue default (mirrors queue-local's cron-repeat).
|
|
538
|
+
var repeatMax = Number(unsealed.maxAttempts);
|
|
535
539
|
await enqueue(unsealed.queueName,
|
|
536
540
|
unsealed.payload ? safeJson.parse(unsealed.payload) : null,
|
|
537
541
|
{
|
|
538
542
|
availableAt: nextMs,
|
|
539
543
|
repeat: { cron: unsealed.repeatCron, timezone: unsealed.repeatTimezone },
|
|
540
544
|
priority: Number(unsealed.priority) || 0,
|
|
545
|
+
maxAttempts: (isFinite(repeatMax) && repeatMax > 0) ? repeatMax : undefined,
|
|
541
546
|
classification: unsealed.classification || null,
|
|
542
547
|
traceId: unsealed.traceId || null,
|
|
543
548
|
});
|
|
@@ -1055,8 +1055,62 @@ function installForPosture(posture, primitives) {
|
|
|
1055
1055
|
});
|
|
1056
1056
|
}
|
|
1057
1057
|
|
|
1058
|
+
var TEXT_REDACT_MARKER = "[redacted]";
|
|
1059
|
+
|
|
1060
|
+
/**
|
|
1061
|
+
* @primitive b.redact.redactText
|
|
1062
|
+
* @signature b.redact.redactText(str)
|
|
1063
|
+
* @since 0.17.13
|
|
1064
|
+
* @status stable
|
|
1065
|
+
* @related b.redact.redact
|
|
1066
|
+
*
|
|
1067
|
+
* Scrub credentials EMBEDDED in a free-text string in place, keeping the
|
|
1068
|
+
* surrounding prose — for log messages and other operator-facing text where a
|
|
1069
|
+
* secret may be interpolated mid-sentence. Unlike `redact` (structured,
|
|
1070
|
+
* whole-value, anchored), this uses word-boundary fragment replacement so
|
|
1071
|
+
* "login failed: <jwt> for bob" keeps everything but the jwt. Detects PEM
|
|
1072
|
+
* blocks, JWTs, AWS access keys, URL-userinfo passwords, bearer tokens,
|
|
1073
|
+
* `key=secret` assignments, SSN/EIN, and Luhn-valid PANs. The high-entropy
|
|
1074
|
+
* api-key-shape detector is deliberately excluded (on free text it eats
|
|
1075
|
+
* ordinary IDs / hashes / base64). Drop-safe: never throws (it runs on the
|
|
1076
|
+
* hot-path log-emit sink); on any error it returns a fully-masked marker rather
|
|
1077
|
+
* than the raw input. Every quantifier is length-capped (ReDoS backstop).
|
|
1078
|
+
*
|
|
1079
|
+
* @example
|
|
1080
|
+
* b.redact.redactText("token=AKIAIOSFODNN7EXAMPLE ok"); // → "token=[redacted] ok"
|
|
1081
|
+
*/
|
|
1082
|
+
function redactText(str) {
|
|
1083
|
+
if (typeof str !== "string" || str.length === 0) return str;
|
|
1084
|
+
try {
|
|
1085
|
+
return str
|
|
1086
|
+
// PEM / OpenSSH private-key blocks (multi-line).
|
|
1087
|
+
.replace(/-----BEGIN [A-Z0-9 ]{1,40}-----[\s\S]{0,8192}?-----END [A-Z0-9 ]{1,40}-----/g, TEXT_REDACT_MARKER)
|
|
1088
|
+
// JWT — three base64url segments, word-boundary anchored for embedding.
|
|
1089
|
+
.replace(/\beyJ[A-Za-z0-9_-]{1,4096}\.[A-Za-z0-9_-]{1,8192}\.[A-Za-z0-9_-]{1,4096}\b/g, TEXT_REDACT_MARKER)
|
|
1090
|
+
// AWS access-key IDs.
|
|
1091
|
+
.replace(/\b(?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASCA)[A-Z0-9]{16}\b/g, TEXT_REDACT_MARKER)
|
|
1092
|
+
// Credentials in a URL userinfo: scheme://user:secret@host.
|
|
1093
|
+
.replace(/([a-z][a-z0-9+.-]{0,32}:\/\/[^\s:@/]{1,256}:)[^\s@/]{1,256}(@)/gi, "$1" + TEXT_REDACT_MARKER + "$2")
|
|
1094
|
+
// Bearer tokens.
|
|
1095
|
+
.replace(/\b([Bb]earer\s{1,4})[A-Za-z0-9._~+/-]{8,4096}=*/g, "$1" + TEXT_REDACT_MARKER)
|
|
1096
|
+
// key=secret / password: secret style assignments.
|
|
1097
|
+
.replace(/\b((?:api[_-]?key|access[_-]?token|secret|password|passwd|pwd|token)\s{0,4}[=:]\s{0,4})[^\s&;"']{6,4096}/gi, "$1" + TEXT_REDACT_MARKER)
|
|
1098
|
+
// SSN / EIN.
|
|
1099
|
+
.replace(/\b\d{3}-\d{2}-\d{4}\b/g, TEXT_REDACT_MARKER)
|
|
1100
|
+
.replace(/\b\d{2}-\d{7}\b/g, TEXT_REDACT_MARKER)
|
|
1101
|
+
// Credit-card / PAN — Luhn-validated so ordinary long digit runs survive.
|
|
1102
|
+
.replace(/\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{1,7}\b/g, function (m) {
|
|
1103
|
+
var inner = m.replace(/[\s-]/g, "");
|
|
1104
|
+
return (inner.length >= 13 && inner.length <= 19 && _luhnCheck(inner)) ? TEXT_REDACT_MARKER : m;
|
|
1105
|
+
});
|
|
1106
|
+
} catch (_e) {
|
|
1107
|
+
return TEXT_REDACT_MARKER;
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1058
1111
|
module.exports = {
|
|
1059
1112
|
redact: redact,
|
|
1113
|
+
redactText: redactText,
|
|
1060
1114
|
registerFieldRule: registerFieldRule,
|
|
1061
1115
|
registerValueDetector: registerValueDetector,
|
|
1062
1116
|
classifyDefaults: classifyDefaults,
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
var nodeFs = require("node:fs");
|
|
51
51
|
var nodePath = require("node:path");
|
|
52
52
|
var atomicFile = require("./atomic-file");
|
|
53
|
+
var safePath = require("./safe-path");
|
|
53
54
|
var C = require("./constants");
|
|
54
55
|
var backupCrypto = require("./backup/crypto");
|
|
55
56
|
var backupManifest = require("./backup/manifest");
|
|
@@ -226,7 +227,11 @@ async function extract(opts) {
|
|
|
226
227
|
continue;
|
|
227
228
|
}
|
|
228
229
|
|
|
229
|
-
|
|
230
|
+
// Resolve the manifest-declared encrypted-blob path THROUGH the base with
|
|
231
|
+
// safePath -- a tampered manifest could otherwise carry a traversal /
|
|
232
|
+
// absolute / drive-letter / NTFS-ADS encryptedPath and read a file outside
|
|
233
|
+
// the bundle. manifest.validate is a first-line check; this is the sink.
|
|
234
|
+
var blobPath = safePath.resolve(bundleDir, entry.encryptedPath);
|
|
230
235
|
// Cap the read to the manifest's declared encryptedSize so an oversize-on-
|
|
231
236
|
// disk blob is refused BEFORE it is read into memory (was: read fully, then
|
|
232
237
|
// compare → an OOM window for a huge swapped blob). A valid blob is exactly
|
|
@@ -282,7 +287,10 @@ async function extract(opts) {
|
|
|
282
287
|
" — bundle is corrupted or manifest tampered");
|
|
283
288
|
}
|
|
284
289
|
|
|
285
|
-
|
|
290
|
+
// Resolve the restore destination THROUGH the staging base with safePath
|
|
291
|
+
// so a tampered relativePath (traversal / absolute / drive-letter / ADS)
|
|
292
|
+
// cannot escape stagingDir when the decrypted file is written.
|
|
293
|
+
var destPath = safePath.resolve(stagingDir, entry.relativePath);
|
|
286
294
|
atomicFile.ensureDir(nodePath.dirname(destPath));
|
|
287
295
|
atomicFile.writeSync(destPath, plaintext, { fileMode: 0o600 });
|
|
288
296
|
|
|
@@ -310,6 +310,25 @@ function create(opts) {
|
|
|
310
310
|
"extract failed: " + ((e && e.message) || String(e)));
|
|
311
311
|
}
|
|
312
312
|
|
|
313
|
+
// Defense-in-depth: never swap a zero-file extract over a populated
|
|
314
|
+
// dataDir. A zero-file staging dir moved over the live dataDir is a
|
|
315
|
+
// silent full wipe. The manifest validator now refuses an empty
|
|
316
|
+
// manifest (the attacker path), but an opts.filter that matched no
|
|
317
|
+
// entry also yields fileCount 0 — an operator mistake that must not
|
|
318
|
+
// destroy live data with a success report. If the dataDir is already
|
|
319
|
+
// empty a zero-file swap is a harmless no-op, so gate on non-empty.
|
|
320
|
+
var dataDirEntries = [];
|
|
321
|
+
try { dataDirEntries = nodeFs.readdirSync(dataDir); } catch (_e) { dataDirEntries = []; }
|
|
322
|
+
if (extracted.fileCount === 0 && dataDirEntries.length > 0) {
|
|
323
|
+
_cleanupTmp();
|
|
324
|
+
_emitAudit("restore.failure",
|
|
325
|
+
{ bundleId: bundleId, reason: "refusing zero-file restore over a non-empty dataDir" },
|
|
326
|
+
"failure");
|
|
327
|
+
throw new RestoreError("restore/empty-extract-refused",
|
|
328
|
+
"refusing to swap a zero-file restore over the non-empty dataDir '" + dataDir +
|
|
329
|
+
"' (a filter matched no manifest entry, or the manifest is empty) — this would wipe live data");
|
|
330
|
+
}
|
|
331
|
+
|
|
313
332
|
// 3. Atomic swap. On swap failure, the stagingDir is preserved so
|
|
314
333
|
// an operator can recover manually — we do NOT delete it here.
|
|
315
334
|
var swapResult;
|
|
@@ -492,7 +492,7 @@ function create(opts) {
|
|
|
492
492
|
// tables), the central registry is authoritative. Honors
|
|
493
493
|
// the same skip semantics as the per-row field.
|
|
494
494
|
if (rule.subjectField && row[rule.subjectField]) {
|
|
495
|
-
var holdsRegistry = legalHold._getSingleton();
|
|
495
|
+
var holdsRegistry = legalHold()._getSingleton();
|
|
496
496
|
if (holdsRegistry && holdsRegistry.isHeld(row[rule.subjectField])) {
|
|
497
497
|
summary.legalHoldsHonored++;
|
|
498
498
|
_emit("retention.row.legal_hold_skipped",
|
|
@@ -623,7 +623,7 @@ var COMPLIANCE_RETENTION_FLOOR_MS = Object.freeze({
|
|
|
623
623
|
* matched). Throws on an unknown posture so config-time typos surface.
|
|
624
624
|
*
|
|
625
625
|
* @example
|
|
626
|
-
* var ttl = b.retention.complianceFloor("hipaa", b.
|
|
626
|
+
* var ttl = b.retention.complianceFloor("hipaa", b.constants.TIME.days(180));
|
|
627
627
|
* // → 189216000000 (HIPAA's 6-year floor wins over the 180-day candidate)
|
|
628
628
|
*
|
|
629
629
|
* var sox = b.retention.complianceFloor("sox", 0);
|
|
@@ -641,7 +641,12 @@ function complianceFloor(posture, candidateTtlMs) {
|
|
|
641
641
|
"complianceFloor: posture must be a string (pass one, or set the active " +
|
|
642
642
|
"posture via applyPosture / b.compliance.set), got " + JSON.stringify(posture));
|
|
643
643
|
}
|
|
644
|
-
|
|
644
|
+
// Own-key lookup only: `posture` is operator-supplied, so a value colliding
|
|
645
|
+
// with an Object.prototype member ("valueOf" / "toString" / "constructor" /
|
|
646
|
+
// "hasOwnProperty" / ...) must be treated as unknown and throw below — not
|
|
647
|
+
// resolve to the inherited prototype function and be returned as a "floor".
|
|
648
|
+
var floor = Object.prototype.hasOwnProperty.call(COMPLIANCE_RETENTION_FLOOR_MS, posture)
|
|
649
|
+
? COMPLIANCE_RETENTION_FLOOR_MS[posture] : undefined;
|
|
645
650
|
if (floor === undefined) {
|
|
646
651
|
throw new RetentionError("retention/unknown-posture",
|
|
647
652
|
"complianceFloor: unknown posture '" + posture + "'; expected one of " +
|
|
@@ -691,7 +696,10 @@ function applyPosture(posture) {
|
|
|
691
696
|
STATE.activeFloorMs = null;
|
|
692
697
|
return null;
|
|
693
698
|
}
|
|
694
|
-
|
|
699
|
+
// Own-key lookup only — a proto-member posture name must not inherit a
|
|
700
|
+
// prototype function as the floor (see complianceFloor above).
|
|
701
|
+
var floor = Object.prototype.hasOwnProperty.call(COMPLIANCE_RETENTION_FLOOR_MS, posture)
|
|
702
|
+
? COMPLIANCE_RETENTION_FLOOR_MS[posture] : undefined;
|
|
695
703
|
STATE.activePosture = posture;
|
|
696
704
|
STATE.activeFloorMs = (typeof floor === "number") ? floor : null;
|
|
697
705
|
return { posture: posture, floorMs: STATE.activeFloorMs };
|
|
@@ -298,6 +298,18 @@ function compilePattern(pattern) {
|
|
|
298
298
|
// object on match, null otherwise. Single non-empty trailing slash
|
|
299
299
|
// difference is treated as a no-match (callers that want trailing-slash
|
|
300
300
|
// tolerance normalize the path before dispatch).
|
|
301
|
+
// Collapse a leading run of slashes in a request target to a single "/" so a
|
|
302
|
+
// `//host/path` network-path reference becomes a plain path. Shared by handle()
|
|
303
|
+
// (routing + the value written back onto req.url) and _check0RttReplay (the
|
|
304
|
+
// early-data replay key) so both derive from ONE canonical target: otherwise
|
|
305
|
+
// `//x`, `///x`, and `/x` route to the same endpoint but would each mint a
|
|
306
|
+
// distinct replay-cache key, letting an attacker replay Early-Data by varying
|
|
307
|
+
// the leading-slash run.
|
|
308
|
+
function _canonicalRequestTarget(url) {
|
|
309
|
+
var t = String(url == null ? "/" : url);
|
|
310
|
+
return t.charAt(0) === "/" && t.charAt(1) === "/" ? t.replace(/^\/+/, "/") : t;
|
|
311
|
+
}
|
|
312
|
+
|
|
301
313
|
function _matchCompiled(compiled, pathname) {
|
|
302
314
|
var pathSegments = pathname.split("/");
|
|
303
315
|
var patSegments = compiled.segments;
|
|
@@ -747,11 +759,50 @@ class Router {
|
|
|
747
759
|
}
|
|
748
760
|
|
|
749
761
|
async handle(req, res) {
|
|
750
|
-
//
|
|
751
|
-
//
|
|
752
|
-
//
|
|
753
|
-
//
|
|
754
|
-
|
|
762
|
+
// Derive the request path + query from req.url ALONE, resolved against a
|
|
763
|
+
// FIXED internal authority — the Host header must NEVER influence which
|
|
764
|
+
// route is dispatched. Host is client-controlled: a value like
|
|
765
|
+
// "trusted/admin" bleeds its path segment into WHATWG-URL's pathname
|
|
766
|
+
// parsing (a leading "/admin" prepended), so a request whose request-line
|
|
767
|
+
// is "/x" would route as "/admin/x" while req.url stays "/x". That
|
|
768
|
+
// desyncs req.pathname (the value the route matcher AND every path-scoped
|
|
769
|
+
// guard compare against) from req.url, and a front proxy that ACLs on the
|
|
770
|
+
// visible request path is bypassed — the proxy sees "/x", the origin
|
|
771
|
+
// dispatches "/admin/x". Parsing req.url against a constant base keeps
|
|
772
|
+
// req.pathname a pure function of the request target. The request's real
|
|
773
|
+
// scheme + host live on req.headers.host / requestHelpers.requestProtocol
|
|
774
|
+
// for the consumers (canonical-URL, CORS, host-allowlist) that need them.
|
|
775
|
+
var reqTarget = req.url || "/";
|
|
776
|
+
// Only an origin-form request target — beginning with "/" (RFC 9112
|
|
777
|
+
// §3.2.1) — is routable by a path router. Reject an absolute-form
|
|
778
|
+
// (`http://host/path`), authority-form (`host:port`), or asterisk-form
|
|
779
|
+
// (`OPTIONS *`) target with 400 rather than coercing it into a routable
|
|
780
|
+
// path by prefixing: prefixing would turn `http://evil/admin` into
|
|
781
|
+
// `/http://evil/admin`, which a `/:x` or catch-all route would still match
|
|
782
|
+
// — the opposite of failing closed. A "/"-leading target (including one
|
|
783
|
+
// with a redundant leading slash like `//x`, a valid absolute-path with an
|
|
784
|
+
// empty first segment) is safe: parsed against the fixed authority it
|
|
785
|
+
// becomes a pathname, never a host, so the Host header still cannot steer
|
|
786
|
+
// routing.
|
|
787
|
+
if (reqTarget.charAt(0) !== "/") {
|
|
788
|
+
res.statusCode = 400;
|
|
789
|
+
res.end("400 Bad Request: non-origin-form request target");
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
// Collapse a leading run of slashes to a single "/". A `//host/path` target
|
|
793
|
+
// is a valid absolute-path (empty first segment) so it need not be refused,
|
|
794
|
+
// but left intact it stays a network-path reference: any consumer that
|
|
795
|
+
// resolves req.url as a URL reference (`new URL(req.url, base)`) would read
|
|
796
|
+
// the first segment as an AUTHORITY — a Host bleed / SSRF. Normalizing here
|
|
797
|
+
// (via the same canonical-target helper the 0-RTT replay key uses), and
|
|
798
|
+
// writing the result back onto req.url, keeps it a pure path for the route
|
|
799
|
+
// matcher AND every downstream req.url reader.
|
|
800
|
+
var canonicalTarget = _canonicalRequestTarget(reqTarget);
|
|
801
|
+
if (canonicalTarget !== reqTarget) {
|
|
802
|
+
reqTarget = canonicalTarget;
|
|
803
|
+
req.url = reqTarget;
|
|
804
|
+
}
|
|
805
|
+
var absolute = "http://blamejs.invalid" + reqTarget;
|
|
755
806
|
var parsed = safeUrl.parse(absolute, {
|
|
756
807
|
allowedProtocols: safeUrl.ALLOW_HTTP_ALL,
|
|
757
808
|
});
|
|
@@ -930,7 +981,10 @@ class Router {
|
|
|
930
981
|
this._reap0RttCache(nowMs);
|
|
931
982
|
var hash = require("node:crypto").createHash("sha3-512");
|
|
932
983
|
hash.update(String(req.method || "") + "\n");
|
|
933
|
-
|
|
984
|
+
// Canonical target — collapse a leading slash run so `//x` and `/x`, which
|
|
985
|
+
// dispatch to the same route, share one replay key (varying the leading
|
|
986
|
+
// slashes must not mint a fresh key and defeat the replay window).
|
|
987
|
+
hash.update(_canonicalRequestTarget(req.url) + "\n");
|
|
934
988
|
hash.update(String((req.headers && req.headers["host"]) || "") + "\n");
|
|
935
989
|
hash.update(String((req.headers && req.headers["authorization"]) || "") + "\n");
|
|
936
990
|
hash.update(String((req.headers && req.headers["date"]) || "") + "\n");
|
|
@@ -366,6 +366,38 @@ function byteLengthOf(value, encoding) {
|
|
|
366
366
|
"Buffer, or Uint8Array; got " + (value === null ? "null" : typeof value));
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
+
/**
|
|
370
|
+
* @primitive b.safeBuffer.byteLengthOfIfMeasurable
|
|
371
|
+
* @signature b.safeBuffer.byteLengthOfIfMeasurable(value)
|
|
372
|
+
* @since 0.16.36
|
|
373
|
+
* @related b.safeBuffer.byteLengthOf
|
|
374
|
+
*
|
|
375
|
+
* Like `byteLengthOf`, but returns `null` for a value that is not a
|
|
376
|
+
* measurable byte-carrier (a plain `Array`, an array-like object with a
|
|
377
|
+
* numeric `.length`, a number, ...) instead of throwing.
|
|
378
|
+
*
|
|
379
|
+
* For capping the size of an UNTRUSTED metadata bag whose byte field may be
|
|
380
|
+
* any shape: a content guard measures its cap only when the value is
|
|
381
|
+
* measurable and treats an unmeasurable value as uncapped-here — its
|
|
382
|
+
* magic/shape inspection reads only the leading bytes, so it is O(1)-bounded
|
|
383
|
+
* regardless of a claimed `.length` — rather than throwing out of its
|
|
384
|
+
* documented never-throw-on-hostile-metadata inspection contract. Route a
|
|
385
|
+
* hostile-metadata byte cap through this instead of gating `byteLengthOf` on
|
|
386
|
+
* a hand-rolled `typeof x.length === "number"` check (which admits array-likes
|
|
387
|
+
* and crashes `byteLengthOf`).
|
|
388
|
+
*
|
|
389
|
+
* @example
|
|
390
|
+
* var b = require("blamejs");
|
|
391
|
+
* b.safeBuffer.byteLengthOfIfMeasurable("abc"); // → 3
|
|
392
|
+
* b.safeBuffer.byteLengthOfIfMeasurable([1, 2, 3]); // → null (a plain Array)
|
|
393
|
+
* b.safeBuffer.byteLengthOfIfMeasurable({ length: 1e9 }); // → null (array-like)
|
|
394
|
+
*/
|
|
395
|
+
function byteLengthOfIfMeasurable(value) {
|
|
396
|
+
if (typeof value === "string") return Buffer.byteLength(value, "utf8");
|
|
397
|
+
if (Buffer.isBuffer(value) || value instanceof Uint8Array) return value.length;
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
|
|
369
401
|
// ---- boundedChunkCollector ----
|
|
370
402
|
//
|
|
371
403
|
// Replaces the unbounded `chunks.push(c); ... Buffer.concat(chunks)`
|
|
@@ -872,11 +904,47 @@ function assertHeaderSafe(value, label, ErrorClass, code) {
|
|
|
872
904
|
return value;
|
|
873
905
|
}
|
|
874
906
|
|
|
907
|
+
/**
|
|
908
|
+
* @primitive b.safeBuffer.quoteString
|
|
909
|
+
* @signature b.safeBuffer.quoteString(s)
|
|
910
|
+
* @since 0.16.9
|
|
911
|
+
* @status stable
|
|
912
|
+
* @related b.safeBuffer.assertHeaderSafe, b.safeBuffer.foldHeaderText
|
|
913
|
+
*
|
|
914
|
+
* Serialize a value as an RFC quoted-string: coerce to string, escape
|
|
915
|
+
* every backslash and DQUOTE with a leading backslash, and wrap the
|
|
916
|
+
* result in DQUOTEs. One serializer for the quoted-string grammars the
|
|
917
|
+
* framework emits — RFC 8941 §3.3.3 Structured Fields sf-string
|
|
918
|
+
* (Cache-Status, Signature-Input, Server-Timing desc), RFC 8288 Link
|
|
919
|
+
* header parameters, RFC 8601 §2.2 Authentication-Results reason,
|
|
920
|
+
* RFC 3501 §4.3 IMAP quoted strings, and RFC 5804 §1.2 ManageSieve
|
|
921
|
+
* strings — so an unescaped quote can never terminate the string early
|
|
922
|
+
* and smuggle extra parameters into the protocol line.
|
|
923
|
+
*
|
|
924
|
+
* Escaping only — it does not validate a grammar's character range. A
|
|
925
|
+
* grammar that forbids bytes a quoted-string cannot carry (sf-string is
|
|
926
|
+
* printable-ASCII only; IMAP quoted strings cannot carry CR / LF)
|
|
927
|
+
* enforces its range check before calling this.
|
|
928
|
+
*
|
|
929
|
+
* @example
|
|
930
|
+
* var b = require("blamejs");
|
|
931
|
+
* b.safeBuffer.quoteString("cache miss");
|
|
932
|
+
* // → "\"cache miss\""
|
|
933
|
+
*
|
|
934
|
+
* // A quote or backslash in the value cannot break out of the string.
|
|
935
|
+
* b.safeBuffer.quoteString('say "hi"');
|
|
936
|
+
* // → "\"say \\\"hi\\\"\""
|
|
937
|
+
*/
|
|
938
|
+
function quoteString(s) {
|
|
939
|
+
return "\"" + String(s).replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\""; // allow:regex-no-length-cap — fixed-char-set escape on caller-bounded input
|
|
940
|
+
}
|
|
941
|
+
|
|
875
942
|
module.exports = {
|
|
876
943
|
normalizeText: normalizeText,
|
|
877
944
|
toBuffer: toBuffer,
|
|
878
945
|
makeByteCoercer: makeByteCoercer,
|
|
879
946
|
byteLengthOf: byteLengthOf,
|
|
947
|
+
byteLengthOfIfMeasurable: byteLengthOfIfMeasurable,
|
|
880
948
|
boundedChunkCollector: boundedChunkCollector,
|
|
881
949
|
collectStream: collectStream,
|
|
882
950
|
secureZero: secureZero,
|
|
@@ -885,6 +953,7 @@ module.exports = {
|
|
|
885
953
|
stripCrlf: stripCrlf,
|
|
886
954
|
foldHeaderText: foldHeaderText,
|
|
887
955
|
assertHeaderSafe: assertHeaderSafe,
|
|
956
|
+
quoteString: quoteString,
|
|
888
957
|
stripTrailingHspace: stripTrailingHspace,
|
|
889
958
|
indexAfterOpenTag: indexAfterOpenTag,
|
|
890
959
|
HEX_RE: HEX_RE,
|
|
@@ -165,8 +165,14 @@ function safeDecompress(input, opts) {
|
|
|
165
165
|
"windowBits", "audit", "ctx"],
|
|
166
166
|
"safeDecompress");
|
|
167
167
|
|
|
168
|
-
// Algorithm — required, must be in allowlist
|
|
169
|
-
|
|
168
|
+
// Algorithm — required, must be in allowlist. Use an own-property check,
|
|
169
|
+
// not `!_algorithms[algo]`: a bare truthiness/`in` lookup inherits
|
|
170
|
+
// Object.prototype members, so a non-own key ("constructor", "toString",
|
|
171
|
+
// …) would resolve to a prototype function and get invoked below —
|
|
172
|
+
// `Object(buf)` returns the raw input, silently bypassing the allowlist
|
|
173
|
+
// and returning un-decompressed bytes (fail-open).
|
|
174
|
+
if (typeof opts.algorithm !== "string" ||
|
|
175
|
+
!Object.prototype.hasOwnProperty.call(_algorithms, opts.algorithm)) {
|
|
170
176
|
throw new SafeDecompressError(
|
|
171
177
|
"safe-decompress/unsupported-algorithm",
|
|
172
178
|
"safeDecompress: algorithm must be one of " +
|
|
@@ -357,14 +357,24 @@ function checkCnameChainDepth(depth, opts) {
|
|
|
357
357
|
}
|
|
358
358
|
}
|
|
359
359
|
|
|
360
|
-
function _readName(state, pointerDepth) {
|
|
360
|
+
function _readName(state, pointerDepth, acc) {
|
|
361
361
|
if (pointerDepth > state.caps.maxPointerDepth) {
|
|
362
362
|
throw new SafeDnsError("safe-dns/oversize-pointer-depth",
|
|
363
363
|
"safeDns.readName: compression-pointer chain depth=" + pointerDepth +
|
|
364
364
|
" exceeds maxPointerDepth=" + state.caps.maxPointerDepth + " (RFC 1035 §4.1.4 loop defense)");
|
|
365
365
|
}
|
|
366
|
+
// Both per-name accountants — the decompressed octet count and the label
|
|
367
|
+
// count — thread through the WHOLE compression-pointer chain via `acc`. A
|
|
368
|
+
// pointer jump continues the same budget instead of restarting it, so the
|
|
369
|
+
// composite name a chain expands to is bounded by the same RFC 1035 §3.1
|
|
370
|
+
// 255-octet / §2.3.4 maxLabels caps that bound a single in-line name. When
|
|
371
|
+
// the accountants were frame-local, each jump began a fresh 255-octet /
|
|
372
|
+
// maxLabels budget, so a chain of N pointers decompressed to ~N x 255 octets
|
|
373
|
+
// and ~N x maxLabels labels past the advertised per-name caps — a
|
|
374
|
+
// decompression-amplification seam. `acc` is undefined for a top-level name
|
|
375
|
+
// (each is measured independently) and shared with every sub-read.
|
|
376
|
+
if (!acc) acc = { bytes: 0, labels: 0 };
|
|
366
377
|
var labels = [];
|
|
367
|
-
var totalBytes = 0;
|
|
368
378
|
var jumped = false;
|
|
369
379
|
var afterPointerOff = -1;
|
|
370
380
|
var off = state.off;
|
|
@@ -376,10 +386,10 @@ function _readName(state, pointerDepth) {
|
|
|
376
386
|
var byte = state.buf[off];
|
|
377
387
|
if (byte === 0) {
|
|
378
388
|
off += 1;
|
|
379
|
-
|
|
380
|
-
if (
|
|
389
|
+
acc.bytes += 1;
|
|
390
|
+
if (acc.bytes > DNS_MAX_NAME_BYTES) {
|
|
381
391
|
throw new SafeDnsError("safe-dns/oversize-name",
|
|
382
|
-
"safeDns.readName: wire-name=" +
|
|
392
|
+
"safeDns.readName: wire-name=" + acc.bytes + " bytes exceeds RFC 1035 cap=" +
|
|
383
393
|
DNS_MAX_NAME_BYTES);
|
|
384
394
|
}
|
|
385
395
|
break;
|
|
@@ -394,20 +404,14 @@ function _readName(state, pointerDepth) {
|
|
|
394
404
|
throw new SafeDnsError("safe-dns/truncated-name",
|
|
395
405
|
"safeDns.readName: compression pointer offset past message end");
|
|
396
406
|
}
|
|
397
|
-
// First compression pointer ends the in-line label walk
|
|
398
|
-
//
|
|
399
|
-
//
|
|
407
|
+
// First compression pointer ends the in-line label walk. The pointed-to
|
|
408
|
+
// tail continues accumulating into the SAME `acc`, so the composite
|
|
409
|
+
// decompressed name stays bounded by the per-name octet + label caps.
|
|
400
410
|
afterPointerOff = off + 2; // RFC 1035 §4.1.4 2-byte pointer width
|
|
401
411
|
jumped = true;
|
|
402
412
|
var subState = { off: ptrOff, buf: state.buf, caps: state.caps };
|
|
403
|
-
var tailName = _readName(subState, pointerDepth + 1);
|
|
413
|
+
var tailName = _readName(subState, pointerDepth + 1, acc);
|
|
404
414
|
if (tailName.length) labels.push(tailName);
|
|
405
|
-
totalBytes += 2; // RFC 1035 §4.1.4 2-byte pointer width
|
|
406
|
-
if (totalBytes > DNS_MAX_NAME_BYTES) {
|
|
407
|
-
throw new SafeDnsError("safe-dns/oversize-name",
|
|
408
|
-
"safeDns.readName: composite name=" + totalBytes + " bytes exceeds RFC 1035 cap=" +
|
|
409
|
-
DNS_MAX_NAME_BYTES);
|
|
410
|
-
}
|
|
411
415
|
break;
|
|
412
416
|
}
|
|
413
417
|
if (byte > DNS_MAX_LABEL_BYTES) {
|
|
@@ -419,15 +423,16 @@ function _readName(state, pointerDepth) {
|
|
|
419
423
|
"safeDns.readName: label content past message end");
|
|
420
424
|
}
|
|
421
425
|
labels.push(state.buf.toString("ascii", off + 1, off + 1 + byte));
|
|
422
|
-
|
|
426
|
+
acc.labels += 1;
|
|
427
|
+
if (acc.labels > state.caps.maxLabels) {
|
|
423
428
|
throw new SafeDnsError("safe-dns/oversize-labels",
|
|
424
|
-
"safeDns.readName: label count=" + labels
|
|
429
|
+
"safeDns.readName: label count=" + acc.labels + " exceeds maxLabels=" + state.caps.maxLabels);
|
|
425
430
|
}
|
|
426
431
|
off += 1 + byte;
|
|
427
|
-
|
|
428
|
-
if (
|
|
432
|
+
acc.bytes += 1 + byte;
|
|
433
|
+
if (acc.bytes > DNS_MAX_NAME_BYTES) {
|
|
429
434
|
throw new SafeDnsError("safe-dns/oversize-name",
|
|
430
|
-
"safeDns.readName: wire-name=" +
|
|
435
|
+
"safeDns.readName: wire-name=" + acc.bytes + " bytes exceeds RFC 1035 cap=" +
|
|
431
436
|
DNS_MAX_NAME_BYTES);
|
|
432
437
|
}
|
|
433
438
|
}
|
|
@@ -281,14 +281,18 @@ function _resolveCaps(opts) {
|
|
|
281
281
|
if (typeof opts.profile === "string") {
|
|
282
282
|
name = opts.profile;
|
|
283
283
|
} else if (typeof opts.compliancePosture === "string") {
|
|
284
|
-
name = COMPLIANCE_POSTURES
|
|
284
|
+
name = Object.prototype.hasOwnProperty.call(COMPLIANCE_POSTURES, opts.compliancePosture)
|
|
285
|
+
? COMPLIANCE_POSTURES[opts.compliancePosture] : "strict";
|
|
285
286
|
}
|
|
286
|
-
|
|
287
|
-
if (!
|
|
287
|
+
// Own-property lookup: `name` derives from attacker/operator opts.profile, so
|
|
288
|
+
// a bare `if (!PROFILES[name])` would let a prototype key ("constructor") pass
|
|
289
|
+
// as a known profile and run under an inherited member (fail-open).
|
|
290
|
+
if (!Object.prototype.hasOwnProperty.call(PROFILES, name)) {
|
|
288
291
|
throw new SafeIcalError("safe-ical/bad-opt",
|
|
289
292
|
"safeIcal.parse: unknown profile '" + name +
|
|
290
293
|
"' (expected strict|balanced|permissive)");
|
|
291
294
|
}
|
|
295
|
+
var caps = PROFILES[name];
|
|
292
296
|
return caps;
|
|
293
297
|
}
|
|
294
298
|
|
|
@@ -750,7 +750,18 @@ function _filenameFromHeaders(headers) {
|
|
|
750
750
|
}
|
|
751
751
|
if (/^[A-Za-z0-9_-]+'[A-Za-z0-9_-]*'/.test(raw)) {
|
|
752
752
|
var enc = raw.split("'");
|
|
753
|
-
|
|
753
|
+
// RFC 2231 / 5987 ext-value percent-decode. A hostile
|
|
754
|
+
// `filename*=UTF-8''%` (truncated %-escape, non-hex digits, or a
|
|
755
|
+
// %-escape sequence that isn't valid UTF-8) makes decodeURIComponent
|
|
756
|
+
// throw a raw URIError, which would escape the SafeMimeError contract
|
|
757
|
+
// and crash the attachment walk. Degrade to the still-encoded segment
|
|
758
|
+
// — best-effort, and downstream filename guards handle the raw form —
|
|
759
|
+
// matching every other decodeURIComponent site in the framework.
|
|
760
|
+
try {
|
|
761
|
+
return decodeURIComponent(enc[2]);
|
|
762
|
+
} catch (_e) {
|
|
763
|
+
return enc[2];
|
|
764
|
+
}
|
|
754
765
|
}
|
|
755
766
|
return raw;
|
|
756
767
|
}
|