@blamejs/blamejs-shop 0.5.12 → 0.5.14
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 +4 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/sales-tax-filings.js +143 -0
- 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
|
@@ -311,16 +311,21 @@ function create(opts) {
|
|
|
311
311
|
|
|
312
312
|
var middleware = async function dpopMiddleware(req, res, next) {
|
|
313
313
|
var proofHeader = req.headers && req.headers.dpop;
|
|
314
|
+
// RFC 9449 §4.1 — only ONE DPoP header value per request. Check the
|
|
315
|
+
// array shape (repeated `DPoP:` header lines a custom server/proxy did
|
|
316
|
+
// not collapse) BEFORE the non-string guard: an array is not a string,
|
|
317
|
+
// so the guard below would otherwise shadow this branch and mislabel a
|
|
318
|
+
// duplicated proof as a missing one, letting the multiple-proof
|
|
319
|
+
// rejection never run.
|
|
320
|
+
if (Array.isArray(proofHeader)) {
|
|
321
|
+
return _writeUnauthorized(req, res, "invalid_dpop_proof",
|
|
322
|
+
"multiple DPoP headers are not allowed", null, onDeny, problemMode);
|
|
323
|
+
}
|
|
314
324
|
if (typeof proofHeader !== "string" || proofHeader.length === 0) {
|
|
315
325
|
return _writeUnauthorized(req, res,
|
|
316
326
|
nonceMgr ? "use_dpop_nonce" : "invalid_dpop_proof",
|
|
317
327
|
"DPoP header required", _freshNonce(), onDeny, problemMode);
|
|
318
328
|
}
|
|
319
|
-
// RFC 9449 §4.1 — only ONE DPoP header value per request.
|
|
320
|
-
if (Array.isArray(proofHeader)) {
|
|
321
|
-
return _writeUnauthorized(req, res, "invalid_dpop_proof",
|
|
322
|
-
"multiple DPoP headers are not allowed", null, onDeny, problemMode);
|
|
323
|
-
}
|
|
324
329
|
// RFC 9449 §4.1 single-value invariant. node:http
|
|
325
330
|
// collapses repeated headers into a comma-joined string when the
|
|
326
331
|
// client ships `DPoP: proof1, DPoP: proof2`; the Array.isArray
|
|
@@ -120,7 +120,11 @@ module.exports = {
|
|
|
120
120
|
tracePropagate: tracePropagate.create,
|
|
121
121
|
tusUpload: tusUpload.create,
|
|
122
122
|
webAppManifest: webAppManifest.create,
|
|
123
|
-
clearSiteData: clearSiteData.create,
|
|
123
|
+
clearSiteData: Object.assign(clearSiteData.create, {
|
|
124
|
+
headerValue: clearSiteData.headerValue,
|
|
125
|
+
KNOWN_TYPES: clearSiteData.KNOWN_TYPES,
|
|
126
|
+
DEFAULT_TYPES: clearSiteData.DEFAULT_TYPES,
|
|
127
|
+
}),
|
|
124
128
|
nel: nel.create,
|
|
125
129
|
speculationRules: speculationRules.create,
|
|
126
130
|
protectedResourceMetadata: protectedResourceMetadata.create,
|
|
@@ -186,3 +190,4 @@ module.exports = {
|
|
|
186
190
|
};
|
|
187
191
|
|
|
188
192
|
module.exports.tusUpload.memoryStore = tusUpload.memoryStore;
|
|
193
|
+
module.exports.tusUpload.close = tusUpload.close;
|
|
@@ -151,7 +151,7 @@ function create(opts) {
|
|
|
151
151
|
// honor secure-origin report endpoints. Refusing at config-time so
|
|
152
152
|
// an operator typo (`http://`) surfaces at boot, not as silent
|
|
153
153
|
// never-fires-in-production.
|
|
154
|
-
if (opts.collectorUrl.slice(0, 8) !== "https://") {
|
|
154
|
+
if (opts.collectorUrl.slice(0, 8).toLowerCase() !== "https://") { // RFC 3986 scheme is case-insensitive; string-prefix length, not bytes
|
|
155
155
|
throw new TypeError(
|
|
156
156
|
"middleware.nel: opts.collectorUrl must be https:// (browsers " +
|
|
157
157
|
"ignore non-secure NEL collectors); got " + opts.collectorUrl);
|
|
@@ -100,7 +100,7 @@ var audit = lazyRequire(function () { return require("../audit"); });
|
|
|
100
100
|
* @example
|
|
101
101
|
* var b = require("@blamejs/core");
|
|
102
102
|
* var app = b.router.create();
|
|
103
|
-
* var doc = b.openapi.create({ title: "api", version: "1.0.0" });
|
|
103
|
+
* var doc = b.openapi.create({ info: { title: "api", version: "1.0.0" } });
|
|
104
104
|
* app.use(b.middleware.openapiServe({
|
|
105
105
|
* document: doc,
|
|
106
106
|
* pretty: true,
|
|
@@ -570,7 +570,18 @@ function create(opts) {
|
|
|
570
570
|
var middleware = function rateLimit(req, res, next) {
|
|
571
571
|
if (_shouldSkip(req)) return next();
|
|
572
572
|
var k = keyFn(req);
|
|
573
|
-
|
|
573
|
+
// Per-route scope keys on the route PATH only — never the query string. The
|
|
574
|
+
// query is not part of route identity; keying on it lets an attacker rotate
|
|
575
|
+
// a throwaway param (?nonce=N) to mint a fresh per-route bucket per request
|
|
576
|
+
// and evade the limit. req.pathname (set query-free by b.router) is
|
|
577
|
+
// preferred; when it is absent (a raw Node req handed to the middleware
|
|
578
|
+
// directly) fall back to req.url with the query stripped — the same strip
|
|
579
|
+
// every sibling guard (request-log / require-auth / network-allowlist)
|
|
580
|
+
// already applies.
|
|
581
|
+
if (scope === "per-route") {
|
|
582
|
+
var routePath = req.pathname || (req.url || "/").split("?")[0] || "/";
|
|
583
|
+
k = (req.method || "GET") + ":" + routePath + "|" + k;
|
|
584
|
+
}
|
|
574
585
|
|
|
575
586
|
function _handle(verdict) {
|
|
576
587
|
if (emitHeaders && typeof res.setHeader === "function") {
|
|
@@ -289,7 +289,7 @@ function create(opts) {
|
|
|
289
289
|
keyId: record.id || null,
|
|
290
290
|
});
|
|
291
291
|
}
|
|
292
|
-
} else if (!bCrypto().isCertRevoked(req.peerCert.raw, pinned)) {
|
|
292
|
+
} else if (!(req.peerCert && req.peerCert.raw) || !bCrypto().isCertRevoked(req.peerCert.raw, pinned)) {
|
|
293
293
|
// isCertRevoked returns true on MATCH against the deny-list
|
|
294
294
|
// shape; we use it here as a fingerprint-set membership test
|
|
295
295
|
// because it does the same constant-time hex/colon comparison
|
|
@@ -262,7 +262,7 @@ async function _dispatch(req, res, basePath, bearer, opts, maxPageSize, bulkCfg)
|
|
|
262
262
|
if (req.method === "POST" && !resourceId) {
|
|
263
263
|
_assertSchema(body, resourceType === "Users" ? SCIM_CORE_SCHEMA_USER : SCIM_CORE_SCHEMA_GROUP);
|
|
264
264
|
var created = await impl.create(body, ctx);
|
|
265
|
-
_writeJson(res,
|
|
265
|
+
_writeJson(res, 201, created); // 201 Created (HTTP_STATUS has no CREATED key)
|
|
266
266
|
return;
|
|
267
267
|
}
|
|
268
268
|
|
|
@@ -511,8 +511,12 @@ function create(opts) {
|
|
|
511
511
|
if (expHdr) headers["Upload-Expires"] = expHdr;
|
|
512
512
|
|
|
513
513
|
// creation-with-upload: append the body in the same request when
|
|
514
|
-
// Content-Type is application/offset+octet-stream.
|
|
515
|
-
|
|
514
|
+
// Content-Type is application/offset+octet-stream. RFC 7231 §3.1.1.1 —
|
|
515
|
+
// the media type is case-insensitive and may carry parameters, so compare
|
|
516
|
+
// the lowercased type/subtype (a compliant `Application/Offset+Octet-Stream`
|
|
517
|
+
// must still take the append path).
|
|
518
|
+
var rawContentType = req.headers["content-type"];
|
|
519
|
+
var contentType = rawContentType ? String(rawContentType).split(";")[0].trim().toLowerCase() : "";
|
|
516
520
|
if (hasCreationWithBody && contentType === "application/offset+octet-stream") {
|
|
517
521
|
var chunk;
|
|
518
522
|
try { chunk = await _readChunk(req, maxChunkSize); }
|
|
@@ -607,7 +607,21 @@ function create(opts) {
|
|
|
607
607
|
"framework's bundled CA engine, which supports it");
|
|
608
608
|
}
|
|
609
609
|
var ca = await initCA();
|
|
610
|
-
var
|
|
610
|
+
var allRevocations = revocationStore.list();
|
|
611
|
+
// A standard X.509 CRL (RFC 5280 §5.1) is keyed by certificate serial
|
|
612
|
+
// number. revoke({ fingerprint }) — a first-class revocation mode, and the
|
|
613
|
+
// value the require-mtls gate pins on — stores no serial (serialNumber is
|
|
614
|
+
// null). Such an entry cannot be represented in a CRL, so project it out
|
|
615
|
+
// here rather than handing a null serial to the CRL encoder: the encoder
|
|
616
|
+
// throws on it, which would break CRL generation for the ENTIRE registry,
|
|
617
|
+
// dropping the serial-keyed certs that CAN be published from every fresh
|
|
618
|
+
// CRL (a fail-open for those certs' published revocation). Fingerprint-only
|
|
619
|
+
// revocations stay enforced through isRevoked()/the mTLS gate, which is
|
|
620
|
+
// fingerprint-aware; the count that could not be represented is surfaced.
|
|
621
|
+
var revocations = allRevocations.filter(function (r) {
|
|
622
|
+
return r && r.serialNumber != null;
|
|
623
|
+
});
|
|
624
|
+
var fingerprintOnlyOmitted = allRevocations.length - revocations.length;
|
|
611
625
|
var nowMs = Date.now();
|
|
612
626
|
var thisUpdate = opts3.thisUpdate || new Date(nowMs);
|
|
613
627
|
var nextUpdate = opts3.nextUpdate ||
|
|
@@ -627,7 +641,9 @@ function create(opts) {
|
|
|
627
641
|
atomicFile.writeSync(paths.crl, crlPem, { mode: 0o644 });
|
|
628
642
|
}
|
|
629
643
|
return { crlPem: crlPem, thisUpdate: thisUpdate, nextUpdate: nextUpdate,
|
|
630
|
-
entryCount: revocations.length,
|
|
644
|
+
entryCount: revocations.length,
|
|
645
|
+
fingerprintOnlyOmitted: fingerprintOnlyOmitted,
|
|
646
|
+
path: paths.crl };
|
|
631
647
|
}
|
|
632
648
|
|
|
633
649
|
return {
|
|
@@ -323,7 +323,17 @@ function create(opts) {
|
|
|
323
323
|
var filled;
|
|
324
324
|
try { filled = await entry.promise; }
|
|
325
325
|
finally { if (inflight.get(key) === entry) inflight.delete(key); }
|
|
326
|
-
if (filled.stale)
|
|
326
|
+
if (filled.stale) {
|
|
327
|
+
// The validate: true AD-bit gate holds on the serve-stale path too —
|
|
328
|
+
// otherwise an upstream outage silently downgrades a DNSSEC-strict
|
|
329
|
+
// lookup to unauthenticated stale data (the verdict is per-response,
|
|
330
|
+
// RFC 4035 §3.2.3, so a stale entry cached AD=0 must still be refused).
|
|
331
|
+
if (validate && !filled.result.validated) {
|
|
332
|
+
throw new ResolverError("resolver/validate-failed",
|
|
333
|
+
"query: validate: true but served-stale response was AD=0 for " + name + "/" + qtype);
|
|
334
|
+
}
|
|
335
|
+
return filled.result;
|
|
336
|
+
}
|
|
327
337
|
if (validate && !filled.validated) {
|
|
328
338
|
throw new ResolverError("resolver/validate-failed",
|
|
329
339
|
"query: validate: true but upstream returned AD=0 for " + name + "/" + qtype);
|
|
@@ -158,8 +158,12 @@ function _cachePutPositive(host, family, value) {
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
function _cachePutNegative(host, family, error) {
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
// Effective negative TTL: an explicit cacheNegativeTtlMs applies even when the
|
|
162
|
+
// positive TTL is 0 (setCacheTtlMs(0, 60000) = positives off, negatives 60s);
|
|
163
|
+
// only fall back to the positive TTL when no explicit negative TTL is set.
|
|
164
|
+
var ttl = STATE.cacheNegativeTtlMs > 0 ? STATE.cacheNegativeTtlMs
|
|
165
|
+
: (STATE.cacheTtlMs > 0 ? Math.min(STATE.cacheTtlMs, C.TIME.seconds(30)) : 0);
|
|
166
|
+
if (ttl <= 0) return;
|
|
163
167
|
NEGATIVE_CACHE.set(host + "/" + family, {
|
|
164
168
|
error: error,
|
|
165
169
|
expiresAt: _now() + ttl,
|
|
@@ -237,6 +241,14 @@ function setCacheTtlMs(ms, negativeMs) {
|
|
|
237
241
|
"dns.setCacheTtlMs negativeMs: expected non-negative finite number, got " + JSON.stringify(negativeMs));
|
|
238
242
|
}
|
|
239
243
|
STATE.cacheNegativeTtlMs = negativeMs;
|
|
244
|
+
} else {
|
|
245
|
+
// No explicit negative TTL this call — clear any stale explicit value so it
|
|
246
|
+
// can't outlive the setCacheTtlMs call that set it. Otherwise
|
|
247
|
+
// setCacheTtlMs(0) after an earlier setCacheTtlMs(ms, negMs) would leave
|
|
248
|
+
// negative caching alive (sticky transient failures) even though caching was
|
|
249
|
+
// just disabled; with this cleared, negative TTL derives from the positive
|
|
250
|
+
// TTL, so ms=0 disables both positive and negative caching.
|
|
251
|
+
STATE.cacheNegativeTtlMs = 0;
|
|
240
252
|
}
|
|
241
253
|
if (ms === 0) _clearCache();
|
|
242
254
|
}
|
|
@@ -1696,6 +1708,13 @@ async function resolveAaaa(host, opts) { return _resolveProtocol(host, 6, opts);
|
|
|
1696
1708
|
// `type` defaults to "A"; "AAAA" routes through resolve6; SVCB / HTTPS
|
|
1697
1709
|
// types route through the new querySvcb / queryHttps primitives.
|
|
1698
1710
|
async function resolve(host, type, opts) {
|
|
1711
|
+
// A non-string `type` would throw a raw TypeError from .toUpperCase() (code
|
|
1712
|
+
// undefined, no .permanent) — reject it as a typed DnsError like every other
|
|
1713
|
+
// bad-type path, so a caller keying on err.permanent gets the right verdict.
|
|
1714
|
+
if (type !== undefined && type !== null && typeof type !== "string") {
|
|
1715
|
+
throw new DnsError("dns/unsupported-type",
|
|
1716
|
+
"dns.resolve: type must be a string (got " + typeof type + ")");
|
|
1717
|
+
}
|
|
1699
1718
|
type = (type || "A").toUpperCase();
|
|
1700
1719
|
if (type === "A") return _resolveProtocol(host, 4, opts);
|
|
1701
1720
|
if (type === "AAAA") return _resolveProtocol(host, 6, opts);
|
|
@@ -13,6 +13,7 @@ var atomicFile = require("./atomic-file");
|
|
|
13
13
|
var bCrypto = require("./crypto");
|
|
14
14
|
var C = require("./constants");
|
|
15
15
|
var safeBuffer = require("./safe-buffer");
|
|
16
|
+
var safeJson = require("./safe-json");
|
|
16
17
|
var validateOpts = require("./validate-opts");
|
|
17
18
|
var lazyRequire = require("./lazy-require");
|
|
18
19
|
var safeAsync = require("./safe-async");
|
|
@@ -3071,6 +3072,49 @@ function _matchDnsNamePattern(pattern, host) {
|
|
|
3071
3072
|
return true;
|
|
3072
3073
|
}
|
|
3073
3074
|
|
|
3075
|
+
// Node renders a SAN value that contains separators/control chars as a
|
|
3076
|
+
// JSON-quoted string (the CVE-2021-44531/44532 remediation), e.g. a single
|
|
3077
|
+
// dNSName whose value is `x, DNS:y.com` appears as `DNS:"x, DNS:y.com"`. A
|
|
3078
|
+
// naive split(",") would break that one entry into several and smuggle a
|
|
3079
|
+
// clean `DNS:y.com` token the certificate never asserted — a hostname
|
|
3080
|
+
// verification bypass. Split on commas OUTSIDE quotes and JSON-decode quoted
|
|
3081
|
+
// spans, mirroring Node's own splitEscapedAltNames, so each entry is exactly
|
|
3082
|
+
// one GeneralName.
|
|
3083
|
+
var _SAN_QUOTED_RE = /^"(?:[^"\\]|\\.)*"/;
|
|
3084
|
+
function _splitEscapedAltNames(altNames) {
|
|
3085
|
+
var result = [];
|
|
3086
|
+
var current = "";
|
|
3087
|
+
var offset = 0;
|
|
3088
|
+
while (offset !== altNames.length) {
|
|
3089
|
+
var nextSep = altNames.indexOf(",", offset);
|
|
3090
|
+
var nextQuote = altNames.indexOf('"', offset);
|
|
3091
|
+
if (nextQuote !== -1 && (nextSep === -1 || nextQuote < nextSep)) {
|
|
3092
|
+
current += altNames.substring(offset, nextQuote);
|
|
3093
|
+
var match = _SAN_QUOTED_RE.exec(altNames.substring(nextQuote));
|
|
3094
|
+
if (!match) {
|
|
3095
|
+
// Malformed quoting — refuse to parse rather than guess.
|
|
3096
|
+
throw new TlsTrustError("tls/altname-format",
|
|
3097
|
+
"malformed quoted subjectAltName entry");
|
|
3098
|
+
}
|
|
3099
|
+
// match[0] is a JSON string literal (the `_SAN_QUOTED_RE` shape); route
|
|
3100
|
+
// through the framework JSON primitive rather than raw JSON.parse.
|
|
3101
|
+
current += safeJson.parse(match[0]);
|
|
3102
|
+
offset = nextQuote + match[0].length;
|
|
3103
|
+
} else if (nextSep !== -1) {
|
|
3104
|
+
current += altNames.substring(offset, nextSep);
|
|
3105
|
+
result.push(current);
|
|
3106
|
+
current = "";
|
|
3107
|
+
offset = nextSep + 1;
|
|
3108
|
+
if (altNames.charAt(offset) === " ") offset += 1; // skip the ", " gap
|
|
3109
|
+
} else {
|
|
3110
|
+
current += altNames.substring(offset);
|
|
3111
|
+
offset = altNames.length;
|
|
3112
|
+
}
|
|
3113
|
+
}
|
|
3114
|
+
result.push(current);
|
|
3115
|
+
return result;
|
|
3116
|
+
}
|
|
3117
|
+
|
|
3074
3118
|
function _parseSanString(rawSubjectAltName) {
|
|
3075
3119
|
// Node exposes the SAN as a comma-separated string of typed entries:
|
|
3076
3120
|
// "DNS:foo.example.com, DNS:*.example.com, IP Address:198.51.100.1,
|
|
@@ -3081,13 +3125,27 @@ function _parseSanString(rawSubjectAltName) {
|
|
|
3081
3125
|
if (typeof rawSubjectAltName !== "string" || rawSubjectAltName.length === 0) {
|
|
3082
3126
|
return { dns: dns, ips: ips };
|
|
3083
3127
|
}
|
|
3084
|
-
var entries
|
|
3128
|
+
var entries;
|
|
3129
|
+
try {
|
|
3130
|
+
entries = _splitEscapedAltNames(rawSubjectAltName);
|
|
3131
|
+
} catch (_e) {
|
|
3132
|
+
// Malformed SAN quoting → assert no identifiers (fail closed).
|
|
3133
|
+
return { dns: dns, ips: ips };
|
|
3134
|
+
}
|
|
3085
3135
|
for (var i = 0; i < entries.length; i += 1) {
|
|
3086
|
-
var
|
|
3087
|
-
var colon =
|
|
3136
|
+
var entry = entries[i];
|
|
3137
|
+
var colon = entry.indexOf(":");
|
|
3088
3138
|
if (colon === -1) continue;
|
|
3089
|
-
|
|
3090
|
-
|
|
3139
|
+
// The GeneralName TYPE prefix is emitted by _splitEscapedAltNames exactly
|
|
3140
|
+
// (no surrounding whitespace), and the value MUST be preserved EXACTLY —
|
|
3141
|
+
// NOT trimmed. Trimming would strip leading/trailing control whitespace a
|
|
3142
|
+
// decoded quoted value can carry: a dNSName that is a newline followed by
|
|
3143
|
+
// "victim.com" decodes to "\nvictim.com", and a trim would reduce it to a
|
|
3144
|
+
// bare "victim.com" that matches a name the certificate never asserts — a
|
|
3145
|
+
// bypass. Node compares the decoded value verbatim, so an identifier with
|
|
3146
|
+
// such characters simply fails the exact match and is rejected.
|
|
3147
|
+
var kind = entry.slice(0, colon);
|
|
3148
|
+
var val = entry.slice(colon + 1);
|
|
3091
3149
|
if (kind === "DNS") {
|
|
3092
3150
|
dns.push(val);
|
|
3093
3151
|
} else if (kind === "IP Address" || kind === "IP") {
|
|
@@ -3101,9 +3159,13 @@ function _parseSanString(rawSubjectAltName) {
|
|
|
3101
3159
|
|
|
3102
3160
|
function _normalizeIpForCompare(ip) {
|
|
3103
3161
|
// Lower-case + strip embedded brackets so "[::1]" / "::1" / "::0001"
|
|
3104
|
-
// all compare equal.
|
|
3162
|
+
// all compare equal. Do NOT trim surrounding whitespace: a valid IP never
|
|
3163
|
+
// carries any, and trimming would let a smuggled SAN value like
|
|
3164
|
+
// "1.2.3.4\n" (a decoded quoted entry) normalize to a clean IP and match a
|
|
3165
|
+
// host the certificate never asserts — net.isIP rejects such a value, so
|
|
3166
|
+
// preserving it verbatim fails closed.
|
|
3105
3167
|
if (typeof ip !== "string") return null;
|
|
3106
|
-
var s = ip
|
|
3168
|
+
var s = ip;
|
|
3107
3169
|
if (s.length >= 2 && s.charAt(0) === "[" && s.charAt(s.length - 1) === "]") {
|
|
3108
3170
|
s = s.slice(1, -1);
|
|
3109
3171
|
}
|
|
@@ -291,7 +291,15 @@ async function enforceReplay(store, jti, expireAtMs, opts) {
|
|
|
291
291
|
throw new opts.errorClass(opts.storeFailedCode,
|
|
292
292
|
"replayStore.checkAndInsert threw: " + ((e && e.message) || String(e)));
|
|
293
293
|
}
|
|
294
|
-
|
|
294
|
+
// Fail CLOSED on ANY non-truthy result, not just a literal `false`. The
|
|
295
|
+
// recommended backends (Redis SETNX, SQL INSERT ... ON CONFLICT) signal a
|
|
296
|
+
// duplicate with a non-`false` falsy value — `SET ... NX` returns null, the
|
|
297
|
+
// SETNX command / an INSERT returns 0 — so an `=== false` compare would miss
|
|
298
|
+
// the replay and admit the token (fail open). Only a truthy result is a
|
|
299
|
+
// positive "first-seen" confirmation; anything else is treated as a replay.
|
|
300
|
+
// Mirrors the truthiness guard every inline consumer already uses
|
|
301
|
+
// (b.auth.oauth `!inserted`, api-encrypt `!freshNonce`, webhook `!fresh`).
|
|
302
|
+
if (!inserted) {
|
|
295
303
|
throw new opts.errorClass(opts.replayCode,
|
|
296
304
|
opts.tokenLabel + " jti='" + jti + "' has been seen before — replay refused");
|
|
297
305
|
}
|
|
@@ -362,6 +362,13 @@ function create(config) {
|
|
|
362
362
|
|
|
363
363
|
url.searchParams.set("X-Goog-Signature", signature);
|
|
364
364
|
|
|
365
|
+
// Final query mutation done — align the wire space encoding to the signed
|
|
366
|
+
// canonical query (GCS V4 signs "%20" but url.toString() would serialize a
|
|
367
|
+
// space as "+", so a spaced response-header override / prefix would be
|
|
368
|
+
// rejected as a signature mismatch). Must precede url.toString(); do not
|
|
369
|
+
// touch url.searchParams afterward (it re-serializes spaces back to "+").
|
|
370
|
+
sigv4.alignWireQueryToSigV4(url);
|
|
371
|
+
|
|
365
372
|
var clientHeaders = {};
|
|
366
373
|
if (opts.contentType) clientHeaders["Content-Type"] = opts.contentType;
|
|
367
374
|
|
|
@@ -120,6 +120,29 @@ function canonicalQueryString(searchParams) {
|
|
|
120
120
|
}).join("&");
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
// Reconcile the wire query with the signed canonical query. The WHATWG URL
|
|
124
|
+
// serializes its query via application/x-www-form-urlencoded, which encodes a
|
|
125
|
+
// space as "+"; SigV4 signs canonicalQueryString, which encodes a space as
|
|
126
|
+
// "%20" (AWS: "encode the space character as %20 and not +"). Left
|
|
127
|
+
// unreconciled, a signed query parameter carrying a literal space (a
|
|
128
|
+
// response-content-disposition filename, a list prefix) is transmitted
|
|
129
|
+
// (url.search / url.toString) as "+" while the signature commits to "%20", so
|
|
130
|
+
// the server re-canonicalizes to different bytes and rejects the request with
|
|
131
|
+
// SignatureDoesNotMatch. A bare "+" in url.search is ALWAYS an encoded space —
|
|
132
|
+
// URLSearchParams serializes a literal "+" as "%2B" and parses "+" back to a
|
|
133
|
+
// space, so canonicalQueryString already signed that position as "%20";
|
|
134
|
+
// rewriting "+" to "%20" makes the transmitted query byte-identical to the
|
|
135
|
+
// signed canonical query. Bare subresource tokens (?uploads / ?lifecycle) carry
|
|
136
|
+
// no "+", so they pass through untouched. Mutates url.search in place (the
|
|
137
|
+
// string setter preserves "%20"); callers MUST NOT touch url.searchParams
|
|
138
|
+
// afterward — that re-serializes spaces back to "+".
|
|
139
|
+
function _alignWireQueryToSigV4(url) {
|
|
140
|
+
var search = url.search;
|
|
141
|
+
if (search.indexOf("+") !== -1) {
|
|
142
|
+
url.search = search.replace(/\+/g, "%20"); // allow:regex-no-length-cap — single-char global replace, input bounded by maxUrlLength
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
123
146
|
function canonicalHeaders(headers) {
|
|
124
147
|
var pairs = [];
|
|
125
148
|
for (var k in headers) {
|
|
@@ -233,6 +256,10 @@ function signRequest(opts) {
|
|
|
233
256
|
", Signature=" + signature;
|
|
234
257
|
headers["Authorization"] = auth;
|
|
235
258
|
|
|
259
|
+
// The URL just signed is the one the caller transmits — make its wire query
|
|
260
|
+
// byte-identical to the canonical query the signature commits to.
|
|
261
|
+
_alignWireQueryToSigV4(url);
|
|
262
|
+
|
|
236
263
|
return { headers: headers, signature: signature, canonicalRequest: canon, stringToSign: sts };
|
|
237
264
|
}
|
|
238
265
|
|
|
@@ -810,6 +837,9 @@ function create(config) {
|
|
|
810
837
|
var signature = nodeCrypto.createHmac("sha256", signingKey).update(sts).digest("hex");
|
|
811
838
|
|
|
812
839
|
url.searchParams.set("X-Amz-Signature", signature);
|
|
840
|
+
// Final query mutation done — align the wire space encoding to the signed
|
|
841
|
+
// "%20" form before serializing the URL the client will use.
|
|
842
|
+
_alignWireQueryToSigV4(url);
|
|
813
843
|
|
|
814
844
|
var clientHeaders = {};
|
|
815
845
|
if (opts.contentType) clientHeaders["Content-Type"] = opts.contentType;
|
|
@@ -994,6 +1024,7 @@ module.exports = {
|
|
|
994
1024
|
deriveSigningKey: deriveSigningKey,
|
|
995
1025
|
canonicalQueryString: canonicalQueryString,
|
|
996
1026
|
canonicalHeaders: canonicalHeaders,
|
|
1027
|
+
alignWireQueryToSigV4: _alignWireQueryToSigV4,
|
|
997
1028
|
awsUriEncode: awsUriEncode,
|
|
998
1029
|
sha256Hex: sha256Hex,
|
|
999
1030
|
formatAmzDate: _formatAmzDate,
|
|
@@ -377,7 +377,7 @@ function _spanToProto(span) {
|
|
|
377
377
|
pb.uint32(10, span.droppedAttributesCount || 0),
|
|
378
378
|
eventsRepeated,
|
|
379
379
|
pb.uint32(12, span.droppedEventsCount || 0),
|
|
380
|
-
pb.uint32(
|
|
380
|
+
pb.uint32(14, 0), // dropped_links_count (proto field 14); no links propagated yet
|
|
381
381
|
Buffer.concat([
|
|
382
382
|
pb._tag(15, 2), // WIRE_LDELIM tag for status
|
|
383
383
|
pb._writeVarint(statusBody.length),
|
|
@@ -99,7 +99,7 @@ var KEY_MAX_LEN = C.BYTES.bytes(255);
|
|
|
99
99
|
function _validateTableName(name) {
|
|
100
100
|
// SQL identifier — quoteIdentifier rejects anything with embedded
|
|
101
101
|
// quotes, schema-qualified names valid via dot-separated parts.
|
|
102
|
-
return safeSql.quoteIdentifier(name);
|
|
102
|
+
return safeSql.quoteIdentifier(name, undefined, { allowReserved: true }); // parity with b.db.from()
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
// Map the operator backend's dialect tag to the b.sql dialect vocabulary.
|
|
@@ -132,7 +132,15 @@ function _coerceValue(raw) {
|
|
|
132
132
|
return n;
|
|
133
133
|
}
|
|
134
134
|
if (/^-?\d+\.\d+([eE][+-]?\d+)?$/.test(raw) || /^-?\d+[eE][+-]?\d+$/.test(raw)) {
|
|
135
|
-
|
|
135
|
+
var f = Number(raw);
|
|
136
|
+
// Float overflow (e.g. 1e999) coerces to ±Infinity — the same
|
|
137
|
+
// never-silently-coerce refusal the integer/hex branches enforce with
|
|
138
|
+
// Number.isSafeInteger. An Infinity slipping into a downstream size cap
|
|
139
|
+
// or timeout is a live DoS, so an out-of-range float is rejected here.
|
|
140
|
+
if (!Number.isFinite(f)) {
|
|
141
|
+
throw _err("ini/value-out-of-range", "float exceeds representable range: " + raw);
|
|
142
|
+
}
|
|
143
|
+
return f;
|
|
136
144
|
}
|
|
137
145
|
return _unquote(raw);
|
|
138
146
|
}
|
|
@@ -201,7 +201,16 @@ function parse(input, opts) {
|
|
|
201
201
|
while (!_eof()) {
|
|
202
202
|
var c = _peek();
|
|
203
203
|
if (c === quote) {
|
|
204
|
-
|
|
204
|
+
// Append the pending verbatim run for BOTH kinds. A basic key
|
|
205
|
+
// accumulates decoded escapes into `out` and resets `start` past
|
|
206
|
+
// each; the trailing literal run (or the whole key when it has no
|
|
207
|
+
// escapes) must still be appended here. A literal key never
|
|
208
|
+
// touches `out` before this point, so the append yields its full
|
|
209
|
+
// verbatim content. Assigning only for the literal branch dropped
|
|
210
|
+
// every escape-free basic key to "" — collapsing distinct quoted
|
|
211
|
+
// keys together and letting a quoted `"__proto__"` slip past the
|
|
212
|
+
// poisoned-key guard by decoding to the empty string.
|
|
213
|
+
out += input.substring(start, pos);
|
|
205
214
|
_advance();
|
|
206
215
|
return out;
|
|
207
216
|
}
|
|
@@ -572,9 +572,12 @@ function create(opts) {
|
|
|
572
572
|
// Window floor — when neither route nor role supplies an
|
|
573
573
|
// explicit mfaWindowMs, default to 15 minutes. Without this
|
|
574
574
|
// floor, a stolen long-lived cookie carrying an old `mfaAt`
|
|
575
|
-
// walks past every requireMfa: true gate.
|
|
576
|
-
//
|
|
577
|
-
// mfaWindowMs
|
|
575
|
+
// walks past every requireMfa: true gate. There is deliberately
|
|
576
|
+
// NO no-window opt-out: the role- and route-level validators
|
|
577
|
+
// reject a non-finite mfaWindowMs, so freshness is always
|
|
578
|
+
// enforced. (The `!== Infinity` guard below is a defensive
|
|
579
|
+
// backstop for a hypothetically-injected value, not a supported
|
|
580
|
+
// config path.)
|
|
578
581
|
if (enforceWindowMs === null) {
|
|
579
582
|
enforceWindowMs = C.TIME.minutes(15);
|
|
580
583
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
//
|
|
5
|
+
// pid-probe — the signal-0 liveness probe + fd-safe pidfile reader shared by
|
|
6
|
+
// b.daemon (lib/daemon.js) and b.appShutdown.pidLock (lib/app-shutdown.js).
|
|
7
|
+
// Both files carried a byte-for-byte copy of the liveness check and the capped,
|
|
8
|
+
// symlink-refusing pidfile reader; a single owner keeps the liveness semantics
|
|
9
|
+
// (process.kill(pid, 0) → alive; EPERM → alive-but-unowned; ESRCH → dead) and
|
|
10
|
+
// the read hardening (1 KiB cap + O_NOFOLLOW refusal so a planted symlink or an
|
|
11
|
+
// oversized file can neither redirect nor OOM the read) identical across every
|
|
12
|
+
// caller — daemon.start / stop / status and pidLock.acquire / release.
|
|
13
|
+
//
|
|
14
|
+
// This is not request-reachable: the two callers are process-lifecycle
|
|
15
|
+
// primitives, so a throw here would only ever surface at daemon start/stop.
|
|
16
|
+
// Both entry points are defensive readers (return-default, never throw): a
|
|
17
|
+
// missing / malformed / hostile pidfile yields null ("nothing live there")
|
|
18
|
+
// rather than propagating an error into the shutdown path.
|
|
19
|
+
|
|
20
|
+
var atomicFile = require("./atomic-file");
|
|
21
|
+
var C = require("./constants");
|
|
22
|
+
|
|
23
|
+
// isLivePid(pid) — signal-0 existence probe. process.kill(pid, 0) sends no
|
|
24
|
+
// signal but performs the permission + existence check the kernel would do for
|
|
25
|
+
// a real signal: it succeeds when the process is alive and signalable, throws
|
|
26
|
+
// EPERM when the process is alive but owned by another user (still "live"), and
|
|
27
|
+
// throws ESRCH when no such process exists (dead). A non-numeric / non-finite /
|
|
28
|
+
// non-positive pid is never live.
|
|
29
|
+
function isLivePid(pid) {
|
|
30
|
+
if (typeof pid !== "number" || !isFinite(pid) || pid <= 0) return false;
|
|
31
|
+
try { process.kill(pid, 0); return true; }
|
|
32
|
+
catch (e) { return !!(e && e.code === "EPERM"); }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// readPidFile(pidFile) — fd-safe + capped + symlink-refusing read of a PID
|
|
36
|
+
// sidecar. A PID file is never a legitimate symlink mount (unlike a k8s/certbot
|
|
37
|
+
// secret mount), so refuseSymlink is safe here and stops a planted symlink from
|
|
38
|
+
// redirecting the read; the 1 KiB cap stops an oversized planted file from
|
|
39
|
+
// OOM-ing it. Returns the parsed positive PID, or null for any failure
|
|
40
|
+
// (missing / symlink / too-large / non-numeric) — the uniform "nothing live
|
|
41
|
+
// there" sentinel both callers already relied on.
|
|
42
|
+
function readPidFile(pidFile) {
|
|
43
|
+
try {
|
|
44
|
+
var raw = atomicFile.fdSafeReadSync(pidFile, {
|
|
45
|
+
maxBytes: C.BYTES.kib(1), refuseSymlink: true, encoding: "utf8",
|
|
46
|
+
});
|
|
47
|
+
var pid = parseInt(String(raw).trim(), 10);
|
|
48
|
+
return isFinite(pid) && pid > 0 ? pid : null;
|
|
49
|
+
} catch (_e) { return null; }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
module.exports = {
|
|
53
|
+
isLivePid: isLivePid,
|
|
54
|
+
readPidFile: readPidFile,
|
|
55
|
+
};
|
|
@@ -176,6 +176,13 @@ function _buildAgentOpts(opts) {
|
|
|
176
176
|
} else {
|
|
177
177
|
merged.ecdhCurve = C.TLS_GROUP_CURVE_STR;
|
|
178
178
|
}
|
|
179
|
+
// Mirror the resolved ecdhCurve into `groups` from one string (same
|
|
180
|
+
// shape as network-tls.buildOptions). `applyToContext` only fills
|
|
181
|
+
// `groups` when it is undefined, so setting it here preserves the
|
|
182
|
+
// caller's narrowed/reordered selection instead of letting the
|
|
183
|
+
// context filler re-derive `groups` from STATE.tlsKeyShares — a
|
|
184
|
+
// different ordering that would ignore the caller's ecdhCurve.
|
|
185
|
+
merged.groups = merged.ecdhCurve;
|
|
179
186
|
merged.minVersion = "TLSv1.3";
|
|
180
187
|
if (networkTls && typeof networkTls.applyToContext === "function") {
|
|
181
188
|
merged = networkTls.applyToContext({ base: merged });
|
|
@@ -203,7 +210,7 @@ function _buildAgentOpts(opts) {
|
|
|
203
210
|
* maxSockets?: number,
|
|
204
211
|
* maxFreeSockets?: number,
|
|
205
212
|
* scheduling?: string,
|
|
206
|
-
* ecdhCurve?: string, // colon-separated group names; must subset C.TLS_GROUP_PREFERENCE
|
|
213
|
+
* ecdhCurve?: string, // colon-separated group names; must subset C.TLS_GROUP_PREFERENCE. The TLS `groups` list tracks this value exactly (mirrored from one resolved string), so a narrowed/reordered ecdhCurve is the negotiated key-share order.
|
|
207
214
|
* allowOperatorGroups?: boolean, // default false; opt in to operator-supplied groups outside the framework PQC preference
|
|
208
215
|
*
|
|
209
216
|
* @example
|
|
@@ -103,7 +103,7 @@ function _accessor(name) {
|
|
|
103
103
|
* posture returns a stub whose primitive calls throw `PqcError`.
|
|
104
104
|
*
|
|
105
105
|
* @example
|
|
106
|
-
* var b = require("blamejs")
|
|
106
|
+
* var b = require("blamejs");
|
|
107
107
|
* if (b.pqcSoftware.isAvailable()) {
|
|
108
108
|
* var ss = b.pqcSoftware.DEFAULT_KEM.keygen();
|
|
109
109
|
* ss.publicKey.length;
|
|
@@ -128,7 +128,7 @@ function isAvailable() {
|
|
|
128
128
|
* bundle is unavailable.
|
|
129
129
|
*
|
|
130
130
|
* @example
|
|
131
|
-
* var b = require("blamejs")
|
|
131
|
+
* var b = require("blamejs");
|
|
132
132
|
* var names = b.pqcSoftware.listAlgorithms();
|
|
133
133
|
* names.indexOf("ml_kem_1024") >= 0;
|
|
134
134
|
* // → true (when the vendored bundle is present)
|
|
@@ -235,7 +235,7 @@ Object.defineProperty(pqc, "DEFAULT_HASH_SIG", {
|
|
|
235
235
|
* shared secrets are byte-identical (32 bytes per FIPS 203 §1).
|
|
236
236
|
*
|
|
237
237
|
* @example
|
|
238
|
-
* var b = require("blamejs")
|
|
238
|
+
* var b = require("blamejs");
|
|
239
239
|
* var result = b.pqcSoftware.runKnownAnswerTest();
|
|
240
240
|
* result.ok;
|
|
241
241
|
* // → true (or { ok: false, reason: "<diagnostic>" } when broken)
|