@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
|
@@ -57,7 +57,7 @@ var ssrfGuard = require("./ssrf-guard");
|
|
|
57
57
|
var networkProxy = require("./network-proxy");
|
|
58
58
|
var numericBounds = require("./numeric-bounds");
|
|
59
59
|
var validateOpts = require("./validate-opts");
|
|
60
|
-
var {
|
|
60
|
+
var { HttpClientError } = require("./framework-error");
|
|
61
61
|
|
|
62
62
|
// Per-origin transport cache. Entry is either the resolved transport
|
|
63
63
|
// object or a pending Promise that resolves to one. The Promise form
|
|
@@ -370,8 +370,11 @@ function _getTransport(u, opts, ips) {
|
|
|
370
370
|
}
|
|
371
371
|
|
|
372
372
|
function _makeError(errorClass, code, message, permanent, statusCode) {
|
|
373
|
-
|
|
374
|
-
|
|
373
|
+
// Default to HttpClientError (the documented default errorClass) rather than
|
|
374
|
+
// the base FrameworkError, so error.statusCode and error.permanent are
|
|
375
|
+
// populated even when the caller passed no explicit opts.errorClass.
|
|
376
|
+
var Cls = errorClass || HttpClientError;
|
|
377
|
+
return new Cls(code, message, permanent, statusCode);
|
|
375
378
|
}
|
|
376
379
|
|
|
377
380
|
// RFC 9110 §15.5 4xx codes that are NOT permanent (request-timeout,
|
|
@@ -553,10 +556,25 @@ function _buildMultipartBody(spec) {
|
|
|
553
556
|
totalSize += CRLF.length;
|
|
554
557
|
}
|
|
555
558
|
|
|
559
|
+
// Reject CR/LF/NUL in any value interpolated onto a part-header line
|
|
560
|
+
// (Content-Disposition name/filename, Content-Type). Without this an attacker
|
|
561
|
+
// who controls a field name / filename / content-type can smuggle a CRLF and
|
|
562
|
+
// inject extra part headers or forge additional form parts (multipart header
|
|
563
|
+
// injection) — the same class the mail-header sweep closed for RFC 822 lines.
|
|
564
|
+
function _assertHeaderSafe(v, label) {
|
|
565
|
+
for (var i = 0; i < v.length; i++) {
|
|
566
|
+
var c = v.charCodeAt(i);
|
|
567
|
+
if (c === 13 || c === 10 || c === 0) { // CR / LF / NUL
|
|
568
|
+
throw new Error("multipart: " + label + " must not contain CR, LF, or NUL (header injection)");
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
|
|
556
573
|
function _pushField(name, value) {
|
|
557
574
|
if (typeof name !== "string" || name.length === 0) {
|
|
558
575
|
throw new Error("multipart: field name must be a non-empty string");
|
|
559
576
|
}
|
|
577
|
+
_assertHeaderSafe(name, "field name");
|
|
560
578
|
var disposition = 'Content-Disposition: form-data; name="' + name + '"';
|
|
561
579
|
var head = _entryHeaderBytes(disposition, null);
|
|
562
580
|
var bodyBuf = Buffer.isBuffer(value) ? value : Buffer.from(String(value), "utf8");
|
|
@@ -588,6 +606,9 @@ function _buildMultipartBody(spec) {
|
|
|
588
606
|
filename = "blob";
|
|
589
607
|
}
|
|
590
608
|
var mimeType = file.contentType || file.mimeType || "application/octet-stream";
|
|
609
|
+
_assertHeaderSafe(file.field, "file.field");
|
|
610
|
+
_assertHeaderSafe(filename, "filename");
|
|
611
|
+
_assertHeaderSafe(mimeType, "contentType");
|
|
591
612
|
var disposition = 'Content-Disposition: form-data; name="' + file.field + '"' +
|
|
592
613
|
'; filename="' + filename.replace(/"/g, "%22") + '"';
|
|
593
614
|
var head = _entryHeaderBytes(disposition, mimeType);
|
|
@@ -1242,7 +1263,11 @@ function _revalidate(cache, method, opts, entry, requestHeaders) {
|
|
|
1242
1263
|
// throw so caching cannot surface as a request failure.
|
|
1243
1264
|
function _maybeStore(cache, method, url, requestHeaders, res) {
|
|
1244
1265
|
try {
|
|
1245
|
-
|
|
1266
|
+
// requestHeaders drives the RFC 9111 §3.5 Authorization gate inside the
|
|
1267
|
+
// storage decision — a shared cache must not persist a per-principal
|
|
1268
|
+
// authenticated response absent an explicit public / s-maxage /
|
|
1269
|
+
// must-revalidate opt-in from the origin.
|
|
1270
|
+
var evaluation = cache._evaluateStorage(method, res.statusCode, res.headers || {}, requestHeaders);
|
|
1246
1271
|
if (!evaluation.cacheable) return;
|
|
1247
1272
|
cache._store(method, url, requestHeaders, res.statusCode, res.headers || {}, res.body, evaluation);
|
|
1248
1273
|
} catch (_e) { /* drop-silent — caching never breaks the request */ }
|
|
@@ -1337,14 +1362,21 @@ function _requestWithRedirects(opts, hopsLeft) {
|
|
|
1337
1362
|
headersStripped: headersStripped,
|
|
1338
1363
|
method: nextMethod,
|
|
1339
1364
|
});
|
|
1365
|
+
function _redirectAborted(e) {
|
|
1366
|
+
return Promise.reject(_makeError(opts.errorClass, "REDIRECT_ABORTED",
|
|
1367
|
+
"onRedirect hook refused redirect: " + ((e && e.message) || String(e)), true));
|
|
1368
|
+
}
|
|
1340
1369
|
try {
|
|
1341
1370
|
var hookResult = onRedirect(hookEvent);
|
|
1342
1371
|
if (hookResult && typeof hookResult.then === "function") {
|
|
1343
|
-
|
|
1372
|
+
// An async hook's rejection must abort the follow with the SAME
|
|
1373
|
+
// REDIRECT_ABORTED shape a sync throw produces — otherwise an
|
|
1374
|
+
// operator who awaits inside the hook (or returns a rejected
|
|
1375
|
+
// Promise) silently gets an un-coded raw rejection instead.
|
|
1376
|
+
return hookResult.then(function () { return _continueFollow(); }, _redirectAborted);
|
|
1344
1377
|
}
|
|
1345
1378
|
} catch (e) {
|
|
1346
|
-
return
|
|
1347
|
-
"onRedirect hook refused redirect: " + ((e && e.message) || String(e)), true));
|
|
1379
|
+
return _redirectAborted(e);
|
|
1348
1380
|
}
|
|
1349
1381
|
}
|
|
1350
1382
|
return _continueFollow();
|
|
@@ -104,7 +104,7 @@ function _sfQuotedString(s) {
|
|
|
104
104
|
"httpSig: parameter string contains non-printable byte at offset " + i);
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
return
|
|
107
|
+
return safeBuffer.quoteString(s);
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
// _serializeCovered — RFC 9421 §2.5 covered-components list.
|
|
@@ -379,6 +379,24 @@ function sign(msg, opts) {
|
|
|
379
379
|
}
|
|
380
380
|
validateOpts.requireNonEmptyString(opts.privateKey,
|
|
381
381
|
"httpSig.sign: privateKey (PEM)", HttpSigError, "BAD_OPT");
|
|
382
|
+
// Bind the declared alg to the signing key's real type. SUPPORTED_ALGS names
|
|
383
|
+
// ARE node's asymmetricKeyType values ("ed25519" / "ml-dsa-65"), so signing
|
|
384
|
+
// an ed25519 key under alg="ml-dsa-65" would emit an authenticated `alg`
|
|
385
|
+
// label that misstates the real algorithm -- a false PQC-signed claim that a
|
|
386
|
+
// verifier trusting the label would honor. Refuse the mislabeled artifact at
|
|
387
|
+
// sign time (matching every other signature verifier in the framework and the
|
|
388
|
+
// verify-side check below; alg-confusion family, CWE-347).
|
|
389
|
+
// Parse only to read the type; an unparseable key is left for the sign step
|
|
390
|
+
// below to reject (SIGN_FAILED), preserving that contract. A parseable key
|
|
391
|
+
// whose type differs from the declared alg is the mislabel we refuse here.
|
|
392
|
+
var signKeyType = null;
|
|
393
|
+
try { signKeyType = nodeCrypto.createPrivateKey(opts.privateKey).asymmetricKeyType; }
|
|
394
|
+
catch (_e) { signKeyType = null; }
|
|
395
|
+
if (signKeyType !== null && signKeyType !== opts.alg) {
|
|
396
|
+
throw _err("BAD_OPT",
|
|
397
|
+
"httpSig.sign: alg '" + opts.alg + "' does not match the private key's type '" +
|
|
398
|
+
signKeyType + "' (the alg label must be bound to the key's real algorithm)");
|
|
399
|
+
}
|
|
382
400
|
if (!Array.isArray(opts.covered) || opts.covered.length === 0) {
|
|
383
401
|
throw _err("BAD_OPT", "httpSig.sign: covered must be a non-empty array");
|
|
384
402
|
}
|
|
@@ -614,6 +632,22 @@ function verify(msg, opts) {
|
|
|
614
632
|
if (typeof publicKeyPem !== "string" || publicKeyPem.length === 0) {
|
|
615
633
|
return { valid: false, reason: "unknown-keyid", keyid: p.keyid };
|
|
616
634
|
}
|
|
635
|
+
// Bind the (authenticated) declared alg to the resolved key's real type
|
|
636
|
+
// BEFORE the crypto check. nodeCrypto.verify(null, ...) selects the algorithm
|
|
637
|
+
// from the key, not from p.alg, so a key whose type differs from p.alg means
|
|
638
|
+
// the alg label misstates the real signature algorithm (e.g. a classical
|
|
639
|
+
// ed25519 key under a declared PQC alg="ml-dsa-65"). Refuse rather than verify
|
|
640
|
+
// under a mislabeled alg (alg-confusion family, CWE-347) -- SUPPORTED_ALGS
|
|
641
|
+
// names ARE the asymmetricKeyType values.
|
|
642
|
+
// Parse only to read the type; an unparseable key is left for the crypto
|
|
643
|
+
// step below to reject (verify-threw), preserving that contract. A parseable
|
|
644
|
+
// key whose type differs from the declared alg is the mislabel we refuse here.
|
|
645
|
+
var verifyKeyType = null;
|
|
646
|
+
try { verifyKeyType = nodeCrypto.createPublicKey(publicKeyPem).asymmetricKeyType; }
|
|
647
|
+
catch (_e) { verifyKeyType = null; }
|
|
648
|
+
if (verifyKeyType !== null && verifyKeyType !== p.alg) {
|
|
649
|
+
return { valid: false, reason: "alg-key-mismatch", alg: p.alg, keyType: verifyKeyType };
|
|
650
|
+
}
|
|
617
651
|
|
|
618
652
|
// If content-digest is covered, recompute and compare. RFC 9421 §B.2.5
|
|
619
653
|
// mandates that verifiers re-run the digest over the body — a stale
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
*/
|
|
49
49
|
var lazyRequire = require("./lazy-require");
|
|
50
50
|
var boundedMap = require("./bounded-map");
|
|
51
|
+
var safeObject = require("./safe-object");
|
|
51
52
|
var { defineClass } = require("./framework-error");
|
|
52
53
|
|
|
53
54
|
var I18nMessageFormatError = defineClass("I18nMessageFormatError",
|
|
@@ -362,17 +363,41 @@ function _renderSequence(nodes, vars, locale, hashContext, depth) {
|
|
|
362
363
|
return out;
|
|
363
364
|
}
|
|
364
365
|
|
|
366
|
+
// Own-property case lookup. A select value is operator/end-user supplied, so
|
|
367
|
+
// String(sv) can be `__proto__` / `constructor` / `toString` / `hasOwnProperty`
|
|
368
|
+
// etc. A bare `node.cases[key]` would then return a truthy INHERITED
|
|
369
|
+
// Object.prototype member, bypassing the `other` fallback and either rendering
|
|
370
|
+
// garbage (a proto value with no `.length`) or throwing on `_renderSequence` of
|
|
371
|
+
// a non-array (a request DoS). Every case-map lookup goes through this so no key
|
|
372
|
+
// can reach the prototype chain.
|
|
373
|
+
function _ownCase(cases, key) {
|
|
374
|
+
return safeObject.ownProp(cases, key);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Own-property variable lookup. A template argument NAME is parse-derived from
|
|
378
|
+
// the (possibly operator/tenant-supplied) message, so it can be `toString` /
|
|
379
|
+
// `constructor` / `valueOf` / `__proto__` / any prototype-polluted key. A bare
|
|
380
|
+
// `vars[name]` would then return the INHERITED Object.prototype member instead
|
|
381
|
+
// of treating the variable as absent — leaking a function source (or a planted
|
|
382
|
+
// prototype value) into rendered output and diverging from both the "missing
|
|
383
|
+
// arg renders empty" contract and the sibling simple interpolator in b.i18n,
|
|
384
|
+
// which is already own-property-only. Every argument / plural / select value
|
|
385
|
+
// lookup goes through this so no template name can reach the prototype chain.
|
|
386
|
+
function _ownVar(vars, name) {
|
|
387
|
+
return safeObject.ownProp(vars, name);
|
|
388
|
+
}
|
|
389
|
+
|
|
365
390
|
function _renderNode(node, vars, locale, hashContext, depth) {
|
|
366
391
|
if (node.type === "literal") return node.value;
|
|
367
392
|
if (node.type === "hash") {
|
|
368
393
|
return hashContext != null ? String(hashContext) : "#";
|
|
369
394
|
}
|
|
370
395
|
if (node.type === "argument") {
|
|
371
|
-
var v = vars
|
|
396
|
+
var v = _ownVar(vars, node.name);
|
|
372
397
|
return v === undefined ? "" : (v === null ? "" : String(v));
|
|
373
398
|
}
|
|
374
399
|
if (node.type === "plural" || node.type === "ordinal") {
|
|
375
|
-
var raw = vars
|
|
400
|
+
var raw = _ownVar(vars, node.name);
|
|
376
401
|
var n = Number(raw);
|
|
377
402
|
if (!Number.isFinite(n)) {
|
|
378
403
|
throw _err("BAD_VAR",
|
|
@@ -381,18 +406,18 @@ function _renderNode(node, vars, locale, hashContext, depth) {
|
|
|
381
406
|
}
|
|
382
407
|
var adjusted = n - (node.offset || 0);
|
|
383
408
|
var exact = "=" + n;
|
|
384
|
-
var caseBody = node.cases
|
|
409
|
+
var caseBody = _ownCase(node.cases, exact);
|
|
385
410
|
if (!caseBody) {
|
|
386
411
|
var pr = _pluralRules(locale, node.type === "ordinal" ? "ordinal" : "cardinal");
|
|
387
412
|
var category = pr.select(adjusted);
|
|
388
|
-
caseBody = node.cases
|
|
413
|
+
caseBody = _ownCase(node.cases, category) || _ownCase(node.cases, "other");
|
|
389
414
|
}
|
|
390
415
|
return _renderSequence(caseBody, vars, locale, adjusted, depth + 1);
|
|
391
416
|
}
|
|
392
417
|
if (node.type === "select") {
|
|
393
|
-
var sv = vars
|
|
418
|
+
var sv = _ownVar(vars, node.name);
|
|
394
419
|
var key = (sv === undefined || sv === null) ? "other" : String(sv);
|
|
395
|
-
var body = node.cases
|
|
420
|
+
var body = _ownCase(node.cases, key) || _ownCase(node.cases, "other");
|
|
396
421
|
return _renderSequence(body, vars, locale, hashContext, depth + 1);
|
|
397
422
|
}
|
|
398
423
|
return "";
|
|
@@ -250,12 +250,19 @@ function _validateRtlList(value) {
|
|
|
250
250
|
if (!Array.isArray(value)) {
|
|
251
251
|
throw _err("BAD_OPT", "i18n.create: rtlLanguages must be an array of language subtags");
|
|
252
252
|
}
|
|
253
|
+
// dir() folds the requested locale's primary subtag to lower case before
|
|
254
|
+
// the membership test, so fold the configured list the same way. Language
|
|
255
|
+
// subtags are conventionally lower case but BCP 47 is case-insensitive;
|
|
256
|
+
// normalizing only the lookup side would silently drop RTL for an
|
|
257
|
+
// operator-supplied entry like "AR" or "CKB".
|
|
258
|
+
var normalized = [];
|
|
253
259
|
for (var i = 0; i < value.length; i++) {
|
|
254
260
|
if (typeof value[i] !== "string" || value[i].length === 0) {
|
|
255
261
|
throw _err("BAD_OPT", "i18n.create: rtlLanguages[" + i + "] must be a non-empty string");
|
|
256
262
|
}
|
|
263
|
+
normalized.push(value[i].toLowerCase());
|
|
257
264
|
}
|
|
258
|
-
return new Set(
|
|
265
|
+
return new Set(normalized);
|
|
259
266
|
}
|
|
260
267
|
|
|
261
268
|
// ---- Translation tree validation ----
|
|
@@ -575,15 +582,19 @@ function create(opts) {
|
|
|
575
582
|
translations = {};
|
|
576
583
|
}
|
|
577
584
|
var onMissingKey = opts.onMissingKey || null;
|
|
578
|
-
// Validate translation trees up-front so plural-shape errors surface
|
|
579
|
-
//
|
|
580
|
-
// locales
|
|
581
|
-
|
|
582
|
-
|
|
585
|
+
// Validate translation trees up-front so plural-shape errors surface at
|
|
586
|
+
// boot, not at the first request that hits the broken key. Validate EVERY
|
|
587
|
+
// inline tree, not just the configured `locales`: a locale present in
|
|
588
|
+
// `translations` but absent from `locales` is still reachable via an explicit
|
|
589
|
+
// locale override, and the invariants the lookup relies on (notably
|
|
590
|
+
// _selectPlural assuming a mandatory `other`) must hold for it too — an
|
|
591
|
+
// unvalidated tree could otherwise make t() return undefined instead of the
|
|
592
|
+
// key. Lazy locales validate on first load.
|
|
593
|
+
Object.keys(translations).forEach(function (loc) {
|
|
583
594
|
if (translations[loc]) {
|
|
584
595
|
_validateTranslationTree(loc, translations[loc], "");
|
|
585
596
|
}
|
|
586
|
-
}
|
|
597
|
+
});
|
|
587
598
|
|
|
588
599
|
function _ensureLocaleLoaded(locale) {
|
|
589
600
|
if (loadedSet.has(locale)) return;
|
|
@@ -658,7 +669,14 @@ function create(opts) {
|
|
|
658
669
|
_ensureLocaleLoaded(loc);
|
|
659
670
|
if (!translations[loc]) continue;
|
|
660
671
|
var v = _resolveKey(translations[loc], key);
|
|
661
|
-
if (v
|
|
672
|
+
if (v === undefined) continue;
|
|
673
|
+
// Only a renderable leaf is a hit: a string, or a plural-shaped
|
|
674
|
+
// object. A nested namespace object at this path is not a
|
|
675
|
+
// translation value — skip it and keep walking the fallback chain so
|
|
676
|
+
// a leaf defined in a less-specific parent or fallback locale still
|
|
677
|
+
// resolves, instead of the namespace shadowing it and the raw key
|
|
678
|
+
// leaking into the UI.
|
|
679
|
+
if (typeof v === "string" || _isPluralShape(v)) {
|
|
662
680
|
return { value: v, foundIn: loc };
|
|
663
681
|
}
|
|
664
682
|
}
|
|
@@ -717,14 +735,12 @@ function create(opts) {
|
|
|
717
735
|
var raw;
|
|
718
736
|
if (typeof found.value === "string") {
|
|
719
737
|
raw = found.value;
|
|
720
|
-
} else
|
|
738
|
+
} else {
|
|
739
|
+
// Guaranteed plural-shaped: _lookupRaw only reports a hit for a
|
|
740
|
+
// renderable leaf (string or plural-shaped object), so a namespace
|
|
741
|
+
// object never reaches here — it is skipped during the chain walk.
|
|
721
742
|
var count = (vars && typeof vars.count === "number") ? vars.count : 0;
|
|
722
743
|
raw = _selectPlural(found.value, count, found.foundIn, callerOpts.ordinal === true);
|
|
723
|
-
} else {
|
|
724
|
-
// Operator stored a nested tree at this key but called t() against
|
|
725
|
-
// the namespace. Return the key-path as a missing-key signal.
|
|
726
|
-
_emitObs("i18n.missing", { locale: locale, key: key });
|
|
727
|
-
return key;
|
|
728
744
|
}
|
|
729
745
|
|
|
730
746
|
// ICU MessageFormat path — when the operator opts in via
|
|
@@ -767,14 +783,12 @@ function create(opts) {
|
|
|
767
783
|
callerOpts = callerOpts || {};
|
|
768
784
|
if (typeof key !== "string" || key.length === 0) return false;
|
|
769
785
|
var locale = _resolveLocale(callerOpts.locale);
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
//
|
|
773
|
-
//
|
|
786
|
+
// _lookupRaw only reports a hit for a renderable leaf (a string or a
|
|
787
|
+
// plural-shaped object); a nested namespace object is skipped during
|
|
788
|
+
// the chain walk. So has() correctly reports false for a namespace key
|
|
789
|
+
// yet true when a fallback locale supplies the leaf — callers can gate
|
|
774
790
|
// "show this UI block only if translated" on leaf entries.
|
|
775
|
-
|
|
776
|
-
if (_isPluralShape(found.value)) return true;
|
|
777
|
-
return false;
|
|
791
|
+
return _lookupRaw(key, locale) !== null;
|
|
778
792
|
}
|
|
779
793
|
|
|
780
794
|
function formatNumber(value, formatOpts, callerOpts) {
|
|
@@ -128,7 +128,14 @@ var REGIME_DEADLINES = Object.freeze({
|
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
function _resolveDeadlines(regime, override) {
|
|
131
|
-
|
|
131
|
+
// Own-key lookup only: `regime` is operator-supplied and free-form, so a
|
|
132
|
+
// value colliding with an Object.prototype member ("valueOf", "toString",
|
|
133
|
+
// "constructor", ...) must fall back to DEFAULT_DEADLINES, not resolve to the
|
|
134
|
+
// inherited prototype function (which would make every dueBy NaN and report a
|
|
135
|
+
// missed deadline as met). Unknown-but-benign regimes fall back the same way.
|
|
136
|
+
var base = (typeof regime === "string" &&
|
|
137
|
+
Object.prototype.hasOwnProperty.call(REGIME_DEADLINES, regime))
|
|
138
|
+
? REGIME_DEADLINES[regime] : DEFAULT_DEADLINES;
|
|
132
139
|
if (!override || typeof override !== "object") return base;
|
|
133
140
|
return Object.freeze({
|
|
134
141
|
initial: typeof override.initial === "number" ? override.initial : base.initial,
|
|
@@ -30,8 +30,12 @@ function expandIpv6Hex(ip) {
|
|
|
30
30
|
// RFC 4291 §2.5.5.2 IPv4-mapped / dual-stack: accept ".d.d.d.d" tail.
|
|
31
31
|
var dual = ip.match(/^(.*?):(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/); // allow:regex-no-length-cap — dotted-quad has fixed shape; LHS bounded by IPv6 group cap below
|
|
32
32
|
if (dual) {
|
|
33
|
+
// The embedded IPv4 tail must be a strict RFC 791 dotted-quad. Reuse the
|
|
34
|
+
// canonical isIPv4 (rejects octets > 255 AND leading-zero / octal-ambiguous
|
|
35
|
+
// octets like "01") so this mapped-form parse doesn't diverge from net.isIP
|
|
36
|
+
// or from the standalone isIPv4 validator on the same dotted-quad.
|
|
37
|
+
if (!isIPv4(dual[2])) return null;
|
|
33
38
|
var v4 = dual[2].split(".").map(Number);
|
|
34
|
-
if (v4.some(function (o) { return !(o >= 0 && o <= 255); })) return null; // IPv4 octet range
|
|
35
39
|
var hi = (v4[0] << 8) | v4[1]; // 16-bit group pack
|
|
36
40
|
var lo = (v4[2] << 8) | v4[3]; // 16-bit group pack
|
|
37
41
|
ip = dual[1] + ":" + hi.toString(16) + ":" + lo.toString(16);
|
|
@@ -43,6 +47,12 @@ function expandIpv6Hex(ip) {
|
|
|
43
47
|
if (dblColon.length === 1 && leftGroups.length !== 8) return null; // RFC 4291 IPv6 group count
|
|
44
48
|
var fillCount = 8 - leftGroups.length - rightGroups.length; // RFC 4291 IPv6 group count
|
|
45
49
|
if (fillCount < 0) return null;
|
|
50
|
+
// RFC 4291 §2.2 — "::" abbreviates ONE OR MORE groups of all-zero 16-bit
|
|
51
|
+
// fields, so when a "::" is present it must insert at least one group. Eight
|
|
52
|
+
// explicit groups plus a "::" (e.g. 1:2:3:4:5:6:7:8:: or 1:2:3:4:5:6:7::8)
|
|
53
|
+
// compresses zero groups and is not valid IPv6 text; net.isIP rejects these,
|
|
54
|
+
// so reject them here too rather than diverge from the kernel/peer parser.
|
|
55
|
+
if (dblColon.length === 2 && fillCount === 0) return null;
|
|
46
56
|
var fill = [];
|
|
47
57
|
for (var f = 0; f < fillCount; f += 1) fill.push("0");
|
|
48
58
|
var groups = leftGroups.concat(fill).concat(rightGroups);
|
|
@@ -623,12 +623,34 @@ function query(doc, path) {
|
|
|
623
623
|
return _evalSegments(ast.segments, doc).map(function (n) { return n.value; });
|
|
624
624
|
}
|
|
625
625
|
|
|
626
|
+
// RFC 9535 §2.7: a normalized-path name is single-quoted and MUST escape
|
|
627
|
+
// `'`, `\`, and every control code (%x0-1F) — the latter as the named
|
|
628
|
+
// short escape (\b \t \n \f \r) or \uXXXX. Emitting a raw control char
|
|
629
|
+
// produces a path that no longer round-trips through the parser (which
|
|
630
|
+
// rejects unescaped control characters in a string literal).
|
|
631
|
+
function _normalizeName(name) {
|
|
632
|
+
var out = "";
|
|
633
|
+
for (var i = 0; i < name.length; i++) {
|
|
634
|
+
var ch = name.charAt(i), cc = name.charCodeAt(i);
|
|
635
|
+
if (ch === "'") out += "\\'";
|
|
636
|
+
else if (ch === "\\") out += "\\\\";
|
|
637
|
+
else if (cc === 0x08) out += "\\b";
|
|
638
|
+
else if (cc === 0x09) out += "\\t";
|
|
639
|
+
else if (cc === 0x0a) out += "\\n";
|
|
640
|
+
else if (cc === 0x0c) out += "\\f";
|
|
641
|
+
else if (cc === 0x0d) out += "\\r";
|
|
642
|
+
else if (cc < 0x20) out += "\\u" + ("0000" + cc.toString(16)).slice(-4);
|
|
643
|
+
else out += ch;
|
|
644
|
+
}
|
|
645
|
+
return out;
|
|
646
|
+
}
|
|
647
|
+
|
|
626
648
|
function _normalizedPath(tokens) {
|
|
627
649
|
var out = "$";
|
|
628
650
|
for (var i = 0; i < tokens.length; i++) {
|
|
629
651
|
var t = tokens[i];
|
|
630
652
|
if (typeof t === "number") out += "[" + t + "]";
|
|
631
|
-
else out += "['" + String(t)
|
|
653
|
+
else out += "['" + _normalizeName(String(t)) + "']";
|
|
632
654
|
}
|
|
633
655
|
return out;
|
|
634
656
|
}
|
|
@@ -58,8 +58,17 @@ function _requiredMembers(jwk) {
|
|
|
58
58
|
if (typeof jwk.kty !== "string" || jwk.kty.length === 0) {
|
|
59
59
|
throw new JwkError("jwk/bad-jwk", "jwk: 'kty' is required");
|
|
60
60
|
}
|
|
61
|
+
// Own-property lookup only: `kty` is attacker-controlled, and a plain-object
|
|
62
|
+
// bracket read resolves inherited Object.prototype members (`__proto__`,
|
|
63
|
+
// `toString`, `valueOf`, `toLocaleString`, …). Those are truthy, so an
|
|
64
|
+
// unguarded `if (!names)` would treat them as supported key types — the
|
|
65
|
+
// zero-`length` prototype methods then iterate no required members and
|
|
66
|
+
// thumbprint the empty object, collapsing distinct inputs onto one
|
|
67
|
+
// predictable digest instead of the intended unsupported-kty refusal.
|
|
68
|
+
if (!Object.prototype.hasOwnProperty.call(REQUIRED, jwk.kty)) {
|
|
69
|
+
throw new JwkError("jwk/unsupported-kty", "jwk: unsupported kty '" + jwk.kty + "'");
|
|
70
|
+
}
|
|
61
71
|
var names = REQUIRED[jwk.kty];
|
|
62
|
-
if (!names) throw new JwkError("jwk/unsupported-kty", "jwk: unsupported kty '" + jwk.kty + "'");
|
|
63
72
|
var out = {};
|
|
64
73
|
for (var i = 0; i < names.length; i++) {
|
|
65
74
|
var n = names[i];
|
|
@@ -115,8 +124,16 @@ function canonicalize(jwk) {
|
|
|
115
124
|
*/
|
|
116
125
|
function thumbprint(jwk, opts) {
|
|
117
126
|
opts = opts || {};
|
|
118
|
-
|
|
119
|
-
|
|
127
|
+
// Own-property lookup only — `opts.hash` is caller-controlled; a bare
|
|
128
|
+
// bracket read of the HASHES table resolves inherited members (`toString`,
|
|
129
|
+
// `constructor`, …) to truthy functions that slip past `!hash` and reach
|
|
130
|
+
// createHash as a non-string, leaking a raw ERR_INVALID_ARG_TYPE instead of
|
|
131
|
+
// the typed jwk/bad-hash refusal the primitive documents.
|
|
132
|
+
var hashName = opts.hash || "sha256";
|
|
133
|
+
if (!Object.prototype.hasOwnProperty.call(HASHES, hashName)) {
|
|
134
|
+
throw new JwkError("jwk/bad-hash", "jwk.thumbprint: hash must be sha256, sha384, or sha512");
|
|
135
|
+
}
|
|
136
|
+
var hash = HASHES[hashName];
|
|
120
137
|
var canon = canonicalize(jwk);
|
|
121
138
|
return nodeCrypto.createHash(hash).update(canon, "utf8").digest("base64url");
|
|
122
139
|
}
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
* parameter never splits the list.
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
|
+
var safeBuffer = require("./safe-buffer");
|
|
32
33
|
var structuredFields = require("./structured-fields");
|
|
33
34
|
var { defineClass } = require("./framework-error");
|
|
34
35
|
|
|
@@ -114,7 +115,7 @@ function parse(headerValue) {
|
|
|
114
115
|
// common convention (RFC 8288 examples, REST pagination) quotes too.
|
|
115
116
|
function _serParam(name, value) {
|
|
116
117
|
if (value === "" || value === true) return name; // valueless parameter
|
|
117
|
-
return name + "
|
|
118
|
+
return name + "=" + safeBuffer.quoteString(value);
|
|
118
119
|
}
|
|
119
120
|
|
|
120
121
|
/**
|
|
@@ -40,6 +40,10 @@ var lazyRequire = require("./lazy-require");
|
|
|
40
40
|
// scrub attribute values through the telemetry redactor before they cross the
|
|
41
41
|
// OTLP egress boundary (CWE-532).
|
|
42
42
|
var observability = lazyRequire(function () { return require("./observability"); });
|
|
43
|
+
// Lazy to match the observability cycle-break above. Scrubs secrets embedded in
|
|
44
|
+
// the free-text log body for a directly-wired sink (defense in depth — emit()
|
|
45
|
+
// already redacts, but a sink can be driven without it, same as meta/redactAttrs).
|
|
46
|
+
var redact = lazyRequire(function () { return require("./redact"); });
|
|
43
47
|
// Lazy — network-tls is widely required; audit an insecure (cert-validation-
|
|
44
48
|
// disabled) outbound TLS session at honor time, same surface as connectWithEch.
|
|
45
49
|
var networkTls = lazyRequire(function () { return require("./network-tls"); });
|
|
@@ -148,7 +152,7 @@ function _encodeLogRecord(record) {
|
|
|
148
152
|
var attrPieces = _encodeAttributes(observability().redactAttrs(record.meta)).map(function (kvBody) {
|
|
149
153
|
return pb.embeddedMessage(6, kvBody);
|
|
150
154
|
});
|
|
151
|
-
var msg = (record.message != null ? String(record.message) : "");
|
|
155
|
+
var msg = (record.message != null ? redact().redactText(String(record.message)) : "");
|
|
152
156
|
return Buffer.concat([
|
|
153
157
|
pb.fixed64(1, tsNs),
|
|
154
158
|
pb.uint32(2, sev.number),
|
|
@@ -65,6 +65,10 @@ var lazyRequire = require("./lazy-require");
|
|
|
65
65
|
// log path can reach a log-stream sink). Used only to scrub attribute values
|
|
66
66
|
// through the telemetry redactor before they cross the OTLP egress boundary.
|
|
67
67
|
var observability = lazyRequire(function () { return require("./observability"); });
|
|
68
|
+
// Lazy to match the observability cycle-break above. Scrubs secrets embedded in
|
|
69
|
+
// the free-text log body for a directly-wired sink (defense in depth — emit()
|
|
70
|
+
// already redacts, but a sink can be driven without it, same as meta/redactAttrs).
|
|
71
|
+
var redact = lazyRequire(function () { return require("./redact"); });
|
|
68
72
|
|
|
69
73
|
var MAX_RESPONSE_BYTES = C.BYTES.mib(1);
|
|
70
74
|
var FRAMEWORK_VERSION = (pkg && pkg.version) || "unknown";
|
|
@@ -157,7 +161,7 @@ function _toLogRecord(record) {
|
|
|
157
161
|
observedTimeUnixNano: nanos,
|
|
158
162
|
severityNumber: sev.number,
|
|
159
163
|
severityText: sev.text,
|
|
160
|
-
body: { stringValue: record.message == null ? "" : String(record.message) },
|
|
164
|
+
body: { stringValue: record.message == null ? "" : redact().redactText(String(record.message)) },
|
|
161
165
|
attributes: attrs,
|
|
162
166
|
};
|
|
163
167
|
}
|
|
@@ -210,11 +210,14 @@ function emit(level, message, meta) {
|
|
|
210
210
|
if (LEVELS.indexOf(level) === -1) {
|
|
211
211
|
throw _err("INVALID_LEVEL", "log level must be one of " + LEVELS.join(", "), true);
|
|
212
212
|
}
|
|
213
|
-
// Build the record. Redact
|
|
213
|
+
// Build the record. Redact BOTH the structured metadata AND the free-text
|
|
214
|
+
// message BEFORE distribution to any sink — a secret interpolated into the
|
|
215
|
+
// message string (a JWT, an AWS key, a URL password) must not reach a file /
|
|
216
|
+
// remote sink verbatim. redactText scrubs embedded fragments in place.
|
|
214
217
|
var record = {
|
|
215
218
|
ts: Date.now(),
|
|
216
219
|
level: level,
|
|
217
|
-
message: message == null ? null : String(message),
|
|
220
|
+
message: message == null ? null : redact.redactText(String(message)),
|
|
218
221
|
};
|
|
219
222
|
if (meta) {
|
|
220
223
|
record.meta = redact.redact(meta);
|
|
@@ -539,7 +542,9 @@ function bootFromEnv(opts) {
|
|
|
539
542
|
sink.logGroupName = env.BLAMEJS_LOG_STREAM_CLOUDWATCH_LOG_GROUP;
|
|
540
543
|
sink.logStreamName = env.BLAMEJS_LOG_STREAM_CLOUDWATCH_LOG_STREAM;
|
|
541
544
|
} else if (proto === "local") {
|
|
542
|
-
sink
|
|
545
|
+
// The local sink is directory-based (writes <dir>/<prefix>.log);
|
|
546
|
+
// BLAMEJS_LOG_STREAM_PATH names that directory and maps to `dir`.
|
|
547
|
+
sink.dir = env.BLAMEJS_LOG_STREAM_PATH;
|
|
543
548
|
} else {
|
|
544
549
|
throw _err("BAD_OPT",
|
|
545
550
|
"BLAMEJS_LOG_STREAM_PROTOCOL='" + proto + "' is not one of " +
|