@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
|
@@ -119,11 +119,11 @@ function _b64uDecodeBuf(s) {
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
function _hashDisclosure(disclosureStr, hashAlg) {
|
|
122
|
-
|
|
123
|
-
if (!nodeAlg) {
|
|
122
|
+
if (!Object.prototype.hasOwnProperty.call(SUPPORTED_HASH_ALGS, hashAlg)) {
|
|
124
123
|
throw new AuthError("auth-sd-jwt-vc/bad-hash",
|
|
125
124
|
"Unsupported hash algorithm: " + hashAlg);
|
|
126
125
|
}
|
|
126
|
+
var nodeAlg = SUPPORTED_HASH_ALGS[hashAlg];
|
|
127
127
|
var h = nodeCrypto.createHash(nodeAlg);
|
|
128
128
|
h.update(disclosureStr, "ascii");
|
|
129
129
|
return h.digest().toString("base64url");
|
|
@@ -338,12 +338,12 @@ function present(opts) {
|
|
|
338
338
|
}
|
|
339
339
|
var _sdAlg = (_issuerPayload && typeof _issuerPayload._sd_alg === "string")
|
|
340
340
|
? _issuerPayload._sd_alg : "sha-256";
|
|
341
|
-
|
|
342
|
-
if (!_sdNodeHash) {
|
|
341
|
+
if (!Object.prototype.hasOwnProperty.call(SUPPORTED_HASH_ALGS, _sdAlg)) {
|
|
343
342
|
throw new AuthError("auth-sd-jwt-vc/bad-hash",
|
|
344
343
|
"present: issuer credential declares _sd_alg \"" + _sdAlg +
|
|
345
344
|
"\" which this framework version does not support");
|
|
346
345
|
}
|
|
346
|
+
var _sdNodeHash = SUPPORTED_HASH_ALGS[_sdAlg];
|
|
347
347
|
|
|
348
348
|
var disclosedNames = Array.isArray(opts.disclosedClaimNames)
|
|
349
349
|
? opts.disclosedClaimNames.slice() : [];
|
|
@@ -510,6 +510,12 @@ async function verify(presentation, opts) {
|
|
|
510
510
|
!Buffer.isBuffer(issuerKey) &&
|
|
511
511
|
typeof issuerKey.kty === "string") {
|
|
512
512
|
jwtExternal._assertAlgKtyMatch(alg, issuerKey);
|
|
513
|
+
// node:crypto.verify cannot consume a bare JWK object — import it to
|
|
514
|
+
// a KeyObject first, mirroring the holder KB-JWT path below
|
|
515
|
+
// (bCrypto.importPublicJwk). Without this a resolver that returns a
|
|
516
|
+
// JWK (the common path per the CVE-2026-22817 note above) rejects a
|
|
517
|
+
// VALID credential with ERR_INVALID_ARG_TYPE instead of verifying.
|
|
518
|
+
issuerKey = bCrypto.importPublicJwk(issuerKey);
|
|
513
519
|
}
|
|
514
520
|
var jwtParsed = _verifyJwt(jwt, issuerKey, alg);
|
|
515
521
|
// Post-verify header compare. Pre-verify we parsed the
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
var nodeFs = require("node:fs");
|
|
52
52
|
var nodePath = require("node:path");
|
|
53
53
|
var atomicFile = require("../atomic-file");
|
|
54
|
+
var safePath = require("../safe-path");
|
|
54
55
|
var bCrypto = require("./crypto");
|
|
55
56
|
var backupManifest = require("./manifest");
|
|
56
57
|
var validateOpts = require("../validate-opts");
|
|
@@ -122,11 +123,20 @@ async function create(opts) {
|
|
|
122
123
|
throw new BackupBundleError("backup-bundle/bad-include",
|
|
123
124
|
"create: files[" + i + "] requires { relativePath: string }");
|
|
124
125
|
}
|
|
125
|
-
if (entry.relativePath.indexOf("..") !== -1 || /^[/\\]/.test(entry.relativePath)
|
|
126
|
+
if (entry.relativePath.indexOf("..") !== -1 || /^[/\\]/.test(entry.relativePath) ||
|
|
127
|
+
entry.relativePath.indexOf(":") !== -1) {
|
|
128
|
+
// A colon anywhere is refused alongside '..' and a leading separator: it
|
|
129
|
+
// covers both a Windows drive prefix (C:\..., absolute) and an NTFS
|
|
130
|
+
// alternate-data-stream marker (db.enc:evil). This friendly pre-screen
|
|
131
|
+
// mirrors b.backupManifest.validate; safePath.resolve below is the
|
|
132
|
+
// authoritative sink for the residual classes (UNC, reserved name, etc.).
|
|
126
133
|
throw new BackupBundleError("backup-bundle/bad-include",
|
|
127
|
-
"create: files[" + i + "].relativePath must be a relative path (got '" + entry.relativePath + "')");
|
|
134
|
+
"create: files[" + i + "].relativePath must be a relative path without '..', a leading separator, or a colon (got '" + entry.relativePath + "')");
|
|
128
135
|
}
|
|
129
|
-
|
|
136
|
+
// Resolve the source path THROUGH dataDir with safePath so a relativePath
|
|
137
|
+
// built from untrusted input can't read a file outside dataDir even if it
|
|
138
|
+
// slips the first-line check (UNC, reserved name, encoded separator, bidi).
|
|
139
|
+
var srcPath = safePath.resolve(dataDir, entry.relativePath);
|
|
130
140
|
if (!nodeFs.existsSync(srcPath)) {
|
|
131
141
|
if (entry.required) {
|
|
132
142
|
throw new BackupBundleError("backup-bundle/missing-required",
|
|
@@ -55,6 +55,7 @@ var os = require("node:os");
|
|
|
55
55
|
var nodePath = require("node:path");
|
|
56
56
|
var bCrypto = require("../crypto");
|
|
57
57
|
var atomicFile = require("../atomic-file");
|
|
58
|
+
var safePath = require("../safe-path");
|
|
58
59
|
var C = require("../constants");
|
|
59
60
|
var backupBundle = require("./bundle");
|
|
60
61
|
var frameworkFiles = require("../framework-files");
|
|
@@ -2197,13 +2198,23 @@ bundleAdapterStorage.fsAdapter = function (fsOpts) {
|
|
|
2197
2198
|
atomicFile.ensureDir(root);
|
|
2198
2199
|
|
|
2199
2200
|
function _keyPath(key) {
|
|
2200
|
-
//
|
|
2201
|
-
//
|
|
2202
|
-
|
|
2201
|
+
// Gate the key under Windows path semantics REGARDLESS of the host, then
|
|
2202
|
+
// resolve the real on-disk path with the host's semantics. An fsAdapter
|
|
2203
|
+
// store is portable — a bundle written on one OS is often read on another —
|
|
2204
|
+
// and win32 splits on both `/` and `\`, so a key like `..\evil` (a harmless
|
|
2205
|
+
// literal filename under POSIX, but a climb out of root when the same key is
|
|
2206
|
+
// later interpreted on Windows) is refused everywhere. The gate is a strict
|
|
2207
|
+
// superset of the host's, also refusing an absolute / drive-letter / UNC
|
|
2208
|
+
// prefix, an NTFS alternate-data-stream marker, a Windows reserved name, and
|
|
2209
|
+
// NUL / control bytes; defense in depth even though the storage layer also
|
|
2210
|
+
// checks. A hand-rolled '..' + NUL substring check (the prior shape) missed
|
|
2211
|
+
// the drive / ADS / reserved-name class the shared primitive handles, and a
|
|
2212
|
+
// host-only resolve missed the cross-platform backslash-traversal class.
|
|
2213
|
+
if (safePath.resolveOrNull(root, key, { platform: "win32" }) === null) {
|
|
2203
2214
|
throw new BackupError("backup/bad-key",
|
|
2204
|
-
"fsAdapter: key contains invalid characters: " + JSON.stringify(key));
|
|
2215
|
+
"fsAdapter: key contains invalid or unsafe path characters: " + JSON.stringify(key));
|
|
2205
2216
|
}
|
|
2206
|
-
return
|
|
2217
|
+
return safePath.resolve(root, key);
|
|
2207
2218
|
}
|
|
2208
2219
|
|
|
2209
2220
|
return {
|
|
@@ -121,14 +121,19 @@ function _validateFileEntry(f, idx, errors) {
|
|
|
121
121
|
}
|
|
122
122
|
if (typeof f.relativePath !== "string" || f.relativePath.length === 0) {
|
|
123
123
|
errors.push("files[" + idx + "].relativePath: required non-empty string");
|
|
124
|
-
} else if (f.relativePath.indexOf("..") !== -1 || /^[/\\]/.test(f.relativePath)) {
|
|
125
|
-
// No traversal — when restored, relativePath joins under dataDir
|
|
126
|
-
|
|
124
|
+
} else if (f.relativePath.indexOf("..") !== -1 || /^[/\\]/.test(f.relativePath) || f.relativePath.indexOf(":") !== -1) {
|
|
125
|
+
// No traversal — when restored, relativePath joins under dataDir. A colon
|
|
126
|
+
// anywhere is refused alongside '..' and a leading separator: it covers
|
|
127
|
+
// both a Windows drive prefix (C:\..., absolute — path.resolve would honor
|
|
128
|
+
// it and escape dataDir) and an NTFS alternate-data-stream marker
|
|
129
|
+
// (db.enc:evil), so validate() fails closed before restore, matching the
|
|
130
|
+
// safePath sink b.restoreBundle resolves both paths through.
|
|
131
|
+
errors.push("files[" + idx + "].relativePath: must be a relative path without '..', a leading separator, or a colon (drive letter / NTFS data-stream marker)");
|
|
127
132
|
}
|
|
128
133
|
if (typeof f.encryptedPath !== "string" || f.encryptedPath.length === 0) {
|
|
129
134
|
errors.push("files[" + idx + "].encryptedPath: required non-empty string");
|
|
130
|
-
} else if (f.encryptedPath.indexOf("..") !== -1 || /^[/\\]/.test(f.encryptedPath)) {
|
|
131
|
-
errors.push("files[" + idx + "].encryptedPath: must be a relative path without '..'
|
|
135
|
+
} else if (f.encryptedPath.indexOf("..") !== -1 || /^[/\\]/.test(f.encryptedPath) || f.encryptedPath.indexOf(":") !== -1) {
|
|
136
|
+
errors.push("files[" + idx + "].encryptedPath: must be a relative path without '..', a leading separator, or a colon (drive letter / NTFS data-stream marker)");
|
|
132
137
|
}
|
|
133
138
|
if (typeof f.size !== "number" || !Number.isInteger(f.size) || f.size < 0) {
|
|
134
139
|
errors.push("files[" + idx + "].size: required non-negative integer");
|
|
@@ -172,6 +177,14 @@ function validate(manifest) {
|
|
|
172
177
|
}
|
|
173
178
|
if (!Array.isArray(manifest.files)) {
|
|
174
179
|
errors.push("files: required array");
|
|
180
|
+
} else if (manifest.files.length === 0) {
|
|
181
|
+
// A backup that describes zero files is never legitimate — the bundle
|
|
182
|
+
// writer refuses to emit one. Refuse it here too: this is the single
|
|
183
|
+
// guard the restore path parses an untrusted manifest through, and a
|
|
184
|
+
// tampered manifest that strips every entry (while keeping a valid
|
|
185
|
+
// wrapped vault key) would otherwise restore to an empty staging dir
|
|
186
|
+
// that the swap moves over the live dataDir — a silent destructive wipe.
|
|
187
|
+
errors.push("files: required non-empty array");
|
|
175
188
|
} else {
|
|
176
189
|
// Detect duplicate relativePath / encryptedPath — would corrupt restore
|
|
177
190
|
var seenRel = Object.create(null);
|
|
@@ -128,6 +128,7 @@ function decode(str, opts) {
|
|
|
128
128
|
var bytes = [];
|
|
129
129
|
var value = 0, bits = 0;
|
|
130
130
|
var inPad = false; // once "=" padding starts, only more "=" may follow
|
|
131
|
+
var dataCount = 0; // count of data symbols (excludes padding + skipped separators)
|
|
131
132
|
for (var i = 0; i < str.length; i++) {
|
|
132
133
|
var ch = str.charAt(i);
|
|
133
134
|
if (ch === "=") { inPad = true; continue; } // trailing padding
|
|
@@ -140,11 +141,31 @@ function decode(str, opts) {
|
|
|
140
141
|
if (idx === undefined) throw new Base32Error("base32/bad-char", "base32.decode: invalid Base32 character '" + str.charAt(i) + "' at index " + i);
|
|
141
142
|
value = (value << BITS) | idx;
|
|
142
143
|
bits += BITS;
|
|
144
|
+
dataCount += 1;
|
|
143
145
|
if (bits >= 8) { // emit a full output byte
|
|
144
146
|
bytes.push((value >>> (bits - 8)) & 0xff); // eight-bit output byte mask
|
|
145
147
|
bits -= 8; // consumed eight bits
|
|
146
148
|
}
|
|
147
149
|
}
|
|
150
|
+
// A group of 5 input bytes encodes to 8 symbols; the only valid partial-group
|
|
151
|
+
// symbol counts are 2, 4, 5, 7 (for 1, 2, 3, 4 trailing bytes). A count of
|
|
152
|
+
// 1/3/6 (mod 8) cannot represent any whole-byte input, so the OLD decoder
|
|
153
|
+
// silently returned a truncated/garbage buffer — refuse it.
|
|
154
|
+
var rem = dataCount % GROUP;
|
|
155
|
+
if (rem === 1 || rem === 3 || rem === 6) {
|
|
156
|
+
throw new Base32Error("base32/bad-length",
|
|
157
|
+
"base32.decode: " + dataCount + " data symbol(s) is not a valid Base32 length " +
|
|
158
|
+
"(a partial group is 2, 4, 5 or 7 symbols)");
|
|
159
|
+
}
|
|
160
|
+
// Non-canonical trailing bits (RFC 4648 §3.5): a conforming encoder zeroes the
|
|
161
|
+
// final symbol's unused low bits. Non-zero leftover bits mean two distinct
|
|
162
|
+
// strings decode to the same bytes — decoder malleability. Refuse it so every
|
|
163
|
+
// byte sequence has exactly one Base32 form (matters where the string is a
|
|
164
|
+
// key / secret / dedup handle, e.g. TOTP, identifiers).
|
|
165
|
+
if (bits > 0 && (value & ((1 << bits) - 1)) !== 0) {
|
|
166
|
+
throw new Base32Error("base32/non-canonical",
|
|
167
|
+
"base32.decode: non-canonical encoding — the final symbol's unused low bits must be zero");
|
|
168
|
+
}
|
|
148
169
|
return Buffer.from(bytes);
|
|
149
170
|
}
|
|
150
171
|
|
|
@@ -1431,8 +1431,25 @@ async function unsealRow(grantHandle, table, rowId, opts) {
|
|
|
1431
1431
|
.whereOp("expiresAt", ">", Date.now())
|
|
1432
1432
|
.toSql();
|
|
1433
1433
|
var updateRes = await clusterStorage.execute(incBuilt.sql, incBuilt.params);
|
|
1434
|
-
//
|
|
1435
|
-
//
|
|
1434
|
+
// The atomic compare-and-increment IS the claim, and the count of rows it
|
|
1435
|
+
// CHANGED is the only per-caller signal for whether THIS caller won the
|
|
1436
|
+
// slot. `execute` returns rowCount = the rows the UPDATE modified
|
|
1437
|
+
// (info.changes on local sqlite; the driver's affected-row count in cluster
|
|
1438
|
+
// mode), so rowCount >= 1 means this caller's compare-and-increment landed
|
|
1439
|
+
// and rowCount === 0 means it lost — the grant was exhausted / revoked /
|
|
1440
|
+
// expired concurrently between the runtime checks above and this UPDATE.
|
|
1441
|
+
//
|
|
1442
|
+
// Do NOT infer the claim from a re-read of rowsConsumed against this
|
|
1443
|
+
// caller's stale pre-value: a concurrent WINNER's increment is visible to
|
|
1444
|
+
// the LOSER's re-read, so `post !== pre` is true for the loser too and both
|
|
1445
|
+
// proceed — a double-claim that reads two rows under a maxRowsPerGrant:1
|
|
1446
|
+
// grant, defeating row-by-row auth. The affected-row count is unambiguous.
|
|
1447
|
+
if (!updateRes || Number(updateRes.rowCount) < 1) {
|
|
1448
|
+
throw new BreakGlassError("breakglass/grant-exhausted",
|
|
1449
|
+
"unsealRow: grant " + grantHandle.id + " was exhausted by a concurrent read", true);
|
|
1450
|
+
}
|
|
1451
|
+
// Re-query for the post-increment counter — used ONLY for the audit's
|
|
1452
|
+
// rowsRemaining hint below, no longer for the claim decision.
|
|
1436
1453
|
var postReadBuilt = sql.select("_blamejs_break_glass_grants", _sqlOpts()) // allow:hand-rolled-sql
|
|
1437
1454
|
.columns(["rowsConsumed", "revokedAt", "expiresAt"])
|
|
1438
1455
|
.where("_id", grantHandle.id)
|
|
@@ -1443,14 +1460,6 @@ async function unsealRow(grantHandle, table, rowId, opts) {
|
|
|
1443
1460
|
"unsealRow: grant " + grantHandle.id + " disappeared during unseal", true);
|
|
1444
1461
|
}
|
|
1445
1462
|
var postRowsConsumed = Number(postRows[0].rowsConsumed);
|
|
1446
|
-
// If the UPDATE didn't actually increment (race lost — another unseal
|
|
1447
|
-
// exhausted the grant or it was revoked / expired between our check
|
|
1448
|
-
// and the UPDATE), refuse this read.
|
|
1449
|
-
if (postRowsConsumed === Number(grantRow.rowsConsumed)) {
|
|
1450
|
-
throw new BreakGlassError("breakglass/grant-exhausted",
|
|
1451
|
-
"unsealRow: grant " + grantHandle.id + " was exhausted by a concurrent read", true);
|
|
1452
|
-
}
|
|
1453
|
-
void updateRes;
|
|
1454
1463
|
// policy was fetched above for the pin enforcement; reuse it for the
|
|
1455
1464
|
// Model-A vs Model-B (cryptographic) unseal dispatch.
|
|
1456
1465
|
var unsealedRow;
|
|
@@ -276,7 +276,11 @@ function create(opts) {
|
|
|
276
276
|
|
|
277
277
|
// Test seam: tests pass a fake watcher so we don't actually nodeFs.watch
|
|
278
278
|
var watchFn = opts._watch || function (dirOrFile, wopts, listener) {
|
|
279
|
-
|
|
279
|
+
// realpathSync.native expands an 8.3 short-name component before the watch;
|
|
280
|
+
// fs.watch aborts libuv (uncatchable) on a Windows short-name path.
|
|
281
|
+
var target = dirOrFile;
|
|
282
|
+
try { target = nodeFs.realpathSync.native(dirOrFile); } catch (_e) { /* keep raw path */ }
|
|
283
|
+
return nodeFs.watch(target, wopts, listener);
|
|
280
284
|
};
|
|
281
285
|
var setTimeoutFn = opts._setTimeout || setTimeout;
|
|
282
286
|
var clearTimeoutFn = opts._clearTimeout || clearTimeout;
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
* RFC 9211 Cache-Status header — documents which intermediate caches handled a request with structured `hit` / `fwd` / `ttl` parameters so operators diagnose cache-decision chains.
|
|
35
35
|
*/
|
|
36
36
|
|
|
37
|
+
var safeBuffer = require("./safe-buffer");
|
|
37
38
|
var validateOpts = require("./validate-opts");
|
|
38
39
|
var { defineClass } = require("./framework-error");
|
|
39
40
|
|
|
@@ -58,11 +59,6 @@ var BOOLEAN_PARAMS = Object.freeze(["hit", "stored", "collapsed"]);
|
|
|
58
59
|
// passing other keys get passed-through verbatim as token=value.
|
|
59
60
|
var KNOWN_PARAMS = Object.freeze(["hit", "fwd", "fwd-status", "ttl", "stored", "collapsed", "key", "detail"]);
|
|
60
61
|
|
|
61
|
-
function _sfStringQuote(s) {
|
|
62
|
-
// RFC 8941 sf-string — quoted-string with escaping for " and \.
|
|
63
|
-
// Operator-supplied detail/key strings get the full quote-escape.
|
|
64
|
-
return "\"" + String(s).replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"";
|
|
65
|
-
}
|
|
66
62
|
|
|
67
63
|
/**
|
|
68
64
|
* @primitive b.cacheStatus.append
|
|
@@ -178,14 +174,14 @@ function entryString(entry) {
|
|
|
178
174
|
throw new CacheStatusError("cache-status/bad-key",
|
|
179
175
|
"entry.key must be a string when provided");
|
|
180
176
|
}
|
|
181
|
-
parts.push("key=" +
|
|
177
|
+
parts.push("key=" + safeBuffer.quoteString(entry.key));
|
|
182
178
|
}
|
|
183
179
|
if (entry.detail !== undefined && entry.detail !== null) {
|
|
184
180
|
if (typeof entry.detail !== "string") {
|
|
185
181
|
throw new CacheStatusError("cache-status/bad-detail",
|
|
186
182
|
"entry.detail must be a string when provided");
|
|
187
183
|
}
|
|
188
|
-
parts.push("detail=" +
|
|
184
|
+
parts.push("detail=" + safeBuffer.quoteString(entry.detail));
|
|
189
185
|
}
|
|
190
186
|
return parts.join("; ");
|
|
191
187
|
}
|
|
@@ -804,6 +804,11 @@ function _expandSingleRule(rule, startMs, ctx) {
|
|
|
804
804
|
throw new CalendarError("calendar/bad-recurrence",
|
|
805
805
|
"b.calendar.expandRecurrence: unsupported frequency '" + freq + "'");
|
|
806
806
|
}
|
|
807
|
+
// The caller-supplied `interval` is unbounded; a large one drives
|
|
808
|
+
// _advance's Date arithmetic past the representable range, returning
|
|
809
|
+
// NaN. No further instances can exist — stop before the NaN reaches
|
|
810
|
+
// _msToIsoZ on the next iteration, which throws on an invalid Date.
|
|
811
|
+
if (!isFinite(t)) break;
|
|
807
812
|
}
|
|
808
813
|
return { instances: out, stepBudgetRemaining: ctx.stepBudgetRef.remaining };
|
|
809
814
|
}
|
|
@@ -856,6 +861,14 @@ function _expandWithBysetpos(ctx) {
|
|
|
856
861
|
while (out.length < count && out.length < maxCount && stepBudgetRef.remaining > 0) {
|
|
857
862
|
var period = _periodForIndex(freq, startDate, periodIndex * interval);
|
|
858
863
|
periodIndex += 1;
|
|
864
|
+
// A non-finite period means the FREQ interval (unbounded and
|
|
865
|
+
// caller-supplied) drove Date.UTC past the representable ECMAScript
|
|
866
|
+
// date range. No further instances can exist. This break is also
|
|
867
|
+
// load-bearing against a hang: a NaN period runs the day-enumeration
|
|
868
|
+
// loop zero times, so it never decrements the shared step budget,
|
|
869
|
+
// and the untilMs / toMs comparisons below are NaN no-ops (`NaN > x`
|
|
870
|
+
// is false) — without stopping here the outer loop spins forever.
|
|
871
|
+
if (!isFinite(period.startMs) || !isFinite(period.endMs)) break;
|
|
859
872
|
// Out-of-window early exit. Window-uppper applies once the period
|
|
860
873
|
// start crosses toMs; until applies once period-start crosses untilMs.
|
|
861
874
|
if (period.startMs > untilMs) break;
|
|
@@ -1116,7 +1129,14 @@ function _firstParamValue(prop, paramName) {
|
|
|
1116
1129
|
if (!prop) return null;
|
|
1117
1130
|
var first = Array.isArray(prop) ? prop[0] : prop;
|
|
1118
1131
|
if (!first || !first.params) return null;
|
|
1119
|
-
|
|
1132
|
+
// b.safeIcal exposes each property parameter as a (possibly
|
|
1133
|
+
// multi-valued) array. Consumers here want a scalar — a TZID maps to
|
|
1134
|
+
// the JSCalendar `timeZone` String (RFC 8984 §4.7.1), not an array.
|
|
1135
|
+
// Unwrap to the first element so `timeZone` is a plain string that
|
|
1136
|
+
// round-trips through toIcal's `DTSTART;TZID=<zone>` emission.
|
|
1137
|
+
var v = first.params[paramName];
|
|
1138
|
+
if (v === undefined || v === null) return null;
|
|
1139
|
+
return Array.isArray(v) ? (v.length > 0 ? v[0] : null) : v;
|
|
1120
1140
|
}
|
|
1121
1141
|
|
|
1122
1142
|
function _icalRruleToJscal(rrule) {
|
|
@@ -393,7 +393,18 @@ function _decodeItem(state, depth) {
|
|
|
393
393
|
case 0: return _readArgument(state, ai); // unsigned int
|
|
394
394
|
case 1: { // negative int
|
|
395
395
|
var n = _readArgument(state, ai);
|
|
396
|
-
|
|
396
|
+
if (typeof n === "bigint") return -1n - n;
|
|
397
|
+
// The argument n is a safe Number, but a negative CBOR value is
|
|
398
|
+
// -1 - n, which reaches one below the safe range: n === 2^53-1
|
|
399
|
+
// yields -2^53, NOT a safe integer. The deterministic encoder's
|
|
400
|
+
// integer branch is |v| <= 2^53-1, so it would re-emit that value
|
|
401
|
+
// as a float — breaking round-trip and falsely tripping
|
|
402
|
+
// requireDeterministic on a canonical integer. Promote to BigInt
|
|
403
|
+
// when the value isn't a safe integer so encode() re-emits the
|
|
404
|
+
// integer head (RFC 8949 §3 — a negative-int argument is an
|
|
405
|
+
// integer, never a float).
|
|
406
|
+
var neg = -1 - n;
|
|
407
|
+
return Number.isSafeInteger(neg) ? neg : (-1n - BigInt(n));
|
|
397
408
|
}
|
|
398
409
|
case 2: { // byte string
|
|
399
410
|
var blen = _lenOf(_readArgument(state, ai));
|
|
@@ -155,14 +155,16 @@ function _createSealedDiskStorage(opts) {
|
|
|
155
155
|
}
|
|
156
156
|
},
|
|
157
157
|
|
|
158
|
-
async writeEscrow(relPath, plaintextKeyPem,
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
|
|
158
|
+
async writeEscrow(relPath, plaintextKeyPem, recipient) {
|
|
159
|
+
// Seal the private key to the operator's offline break-glass
|
|
160
|
+
// recipient via b.crypto.encrypt (ML-KEM-1024 KEM, plus the P-384
|
|
161
|
+
// hybrid leg when the recipient supplies an ecPublicKey). The
|
|
162
|
+
// operator recovers it offline with b.crypto.decrypt and the
|
|
163
|
+
// matching private key(s) — it is never decrypted by the framework.
|
|
164
|
+
var envelope = bCrypto().encrypt(plaintextKeyPem, recipient);
|
|
163
165
|
var p = nodePath.join(rootDir, relPath);
|
|
164
166
|
_ensureDir(nodePath.dirname(p));
|
|
165
|
-
atomicFile.writeSync(p,
|
|
167
|
+
atomicFile.writeSync(p, envelope + "\n", { mode: 0o600 });
|
|
166
168
|
},
|
|
167
169
|
};
|
|
168
170
|
}
|
|
@@ -212,7 +214,10 @@ function _createSealedDiskStorage(opts) {
|
|
|
212
214
|
* cleanup: async function (params) { ... }, // required — runs after authorization completes
|
|
213
215
|
* },
|
|
214
216
|
* keyEscrow: { // optional — break-glass-only key recovery
|
|
215
|
-
* recipient:
|
|
217
|
+
* recipient: string | { publicKey, ecPublicKey }, // ML-KEM-1024 pubkey PEM, or a
|
|
218
|
+
* // b.crypto.generateEncryptionKeyPair() hybrid pair; the
|
|
219
|
+
* // renewed key is sealed to it via b.crypto.encrypt and
|
|
220
|
+
* // recovered offline with b.crypto.decrypt
|
|
216
221
|
* },
|
|
217
222
|
* }>,
|
|
218
223
|
* renew: {
|
|
@@ -350,10 +355,23 @@ function create(opts) {
|
|
|
350
355
|
throw new CertError("cert/bad-key-alg",
|
|
351
356
|
"cert.create.certs[" + i + "].keyAlg must be ecdsa-p256 / ecdsa-p384 / rsa-2048 / rsa-3072 / rsa-4096");
|
|
352
357
|
}
|
|
353
|
-
if (c.keyEscrow
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
358
|
+
if (c.keyEscrow) {
|
|
359
|
+
var rec = c.keyEscrow.recipient;
|
|
360
|
+
var okStr = typeof rec === "string" && rec.length > 0;
|
|
361
|
+
// Object form: publicKey (ML-KEM PEM) is required non-empty, matching the
|
|
362
|
+
// string path; ecPublicKey (P-384 hybrid leg) is optional, but if present
|
|
363
|
+
// must itself be a non-empty string — an empty key would otherwise reach
|
|
364
|
+
// b.crypto.encrypt and either fail deeper or silently drop the hybrid leg.
|
|
365
|
+
var okObj = rec && typeof rec === "object" &&
|
|
366
|
+
typeof rec.publicKey === "string" && rec.publicKey.length > 0 &&
|
|
367
|
+
(rec.ecPublicKey == null ||
|
|
368
|
+
(typeof rec.ecPublicKey === "string" && rec.ecPublicKey.length > 0));
|
|
369
|
+
if (!okStr && !okObj) {
|
|
370
|
+
throw new CertError("cert/bad-key-escrow",
|
|
371
|
+
"cert.create.certs[" + i + "].keyEscrow.recipient must be an ML-KEM-1024 " +
|
|
372
|
+
"public-key PEM string, or a { publicKey, ecPublicKey } object from " +
|
|
373
|
+
"b.crypto.generateEncryptionKeyPair() for the P-384 hybrid path");
|
|
374
|
+
}
|
|
357
375
|
}
|
|
358
376
|
certsByName[c.name] = {
|
|
359
377
|
name: c.name,
|
|
@@ -84,7 +84,12 @@ function _writeLine(stream, line) {
|
|
|
84
84
|
// written flag validation continues to read the same { pos, flags }
|
|
85
85
|
// shape the cli has always exposed.
|
|
86
86
|
function _parseArgs(argv) {
|
|
87
|
-
|
|
87
|
+
// `--version` is the global boolean version flag — declare it so it never
|
|
88
|
+
// swallows a following token as its value. Without this, `--version <cmd>`
|
|
89
|
+
// (or `<cmd> --version <sub>`) would consume the subcommand and a stray
|
|
90
|
+
// version flag could no-op the command it accompanies. (`-v` is a
|
|
91
|
+
// single-dash flag and is already boolean in parseRaw.)
|
|
92
|
+
return argParser.parseRaw(argv, { booleanNames: ["version"] });
|
|
88
93
|
}
|
|
89
94
|
|
|
90
95
|
function _resolvePath(p, cwd) {
|
|
@@ -93,6 +98,16 @@ function _resolvePath(p, cwd) {
|
|
|
93
98
|
return nodePath.resolve(cwd || process.cwd(), p);
|
|
94
99
|
}
|
|
95
100
|
|
|
101
|
+
// A destructive command's --confirm gate is satisfied ONLY by an explicit
|
|
102
|
+
// `true` / "true"; a bare-truthiness check (`!flags.confirm`) would accept
|
|
103
|
+
// `--confirm false` as confirmation, so an operator who typed `--confirm
|
|
104
|
+
// false` — meaning "do NOT proceed" — would still trigger an irreversible
|
|
105
|
+
// operation. Shared by every destructive subcommand so the acknowledgement
|
|
106
|
+
// contract can't drift between them.
|
|
107
|
+
function _isConfirmed(flags) {
|
|
108
|
+
return flags.confirm === true || flags.confirm === "true";
|
|
109
|
+
}
|
|
110
|
+
|
|
96
111
|
function _openSqlite(dbPath) {
|
|
97
112
|
// Lazy-required so the CLI doesn't crash on `blamejs version` or
|
|
98
113
|
// `blamejs help` if node:sqlite isn't usable for some reason.
|
|
@@ -424,7 +439,7 @@ async function _runDev(args, ctx) {
|
|
|
424
439
|
}
|
|
425
440
|
var killSignal = args.flags["kill-signal"];
|
|
426
441
|
|
|
427
|
-
var d = dev.create({
|
|
442
|
+
var d = (ctx._dev || dev.create)({
|
|
428
443
|
command: String(command),
|
|
429
444
|
args: argList,
|
|
430
445
|
watch: watchList.length ? watchList : undefined,
|
|
@@ -435,31 +450,51 @@ async function _runDev(args, ctx) {
|
|
|
435
450
|
env: ctx.env,
|
|
436
451
|
});
|
|
437
452
|
|
|
438
|
-
// Forward parent SIGINT/SIGTERM to the child via stop()
|
|
453
|
+
// Forward parent SIGINT/SIGTERM to the child via stop(). The supervisor
|
|
454
|
+
// resolves ONLY after stop() has fully completed (SIGTERM → SIGKILL
|
|
455
|
+
// escalation → watchers disarmed), so main() never returns — and the bin
|
|
456
|
+
// shim never process.exit()s — while a child kill is still in flight and
|
|
457
|
+
// could be abandoned, orphaning the app child.
|
|
439
458
|
var stopped = false;
|
|
459
|
+
var onStopComplete;
|
|
460
|
+
var stopComplete = new Promise(function (resolve) { onStopComplete = resolve; });
|
|
440
461
|
function shutdown() {
|
|
441
462
|
if (stopped) return;
|
|
442
463
|
stopped = true;
|
|
443
|
-
d.stop().then(
|
|
464
|
+
Promise.resolve(d.stop()).then(onStopComplete, onStopComplete);
|
|
444
465
|
}
|
|
445
466
|
process.once("SIGINT", shutdown);
|
|
446
467
|
process.once("SIGTERM", shutdown);
|
|
468
|
+
function _clearSignalHandlers() {
|
|
469
|
+
process.removeListener("SIGINT", shutdown);
|
|
470
|
+
process.removeListener("SIGTERM", shutdown);
|
|
471
|
+
}
|
|
447
472
|
|
|
448
473
|
try {
|
|
449
474
|
await d.start();
|
|
450
475
|
} catch (e) {
|
|
451
476
|
_writeLine(ctx.stderr, "blamejs dev: " + ((e && e.message) || String(e)));
|
|
477
|
+
_clearSignalHandlers();
|
|
452
478
|
return 1;
|
|
453
479
|
}
|
|
454
|
-
// The dev loop runs until the operator interrupts.
|
|
455
|
-
//
|
|
456
|
-
//
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
});
|
|
480
|
+
// The dev loop runs until the operator interrupts. A REF'd heartbeat holds
|
|
481
|
+
// the event loop open so a watched-child CRASH does not drain it and exit
|
|
482
|
+
// the supervisor — dev's crash-resilience contract is to stay up and
|
|
483
|
+
// hot-restart on the next file change, but an unref'd keep-alive let a
|
|
484
|
+
// child's exit terminate the parent with a false code 0. Cleared once
|
|
485
|
+
// stop() has completed on SIGINT/SIGTERM. Unref'ing would drain the loop on
|
|
486
|
+
// a child crash and reintroduce the exit-on-crash bug this heartbeat fixes.
|
|
487
|
+
// allow:timer-no-unref-process-pinning — supervisor must stay pinned.
|
|
488
|
+
var heartbeat = setInterval(function () {}, C.TIME.minutes(1));
|
|
489
|
+
// Hand the shutdown trigger to a test seam (no-op in production) so a test
|
|
490
|
+
// can drive the signal path deterministically instead of raising SIGINT.
|
|
491
|
+
if (typeof ctx._onDevRunning === "function") ctx._onDevRunning(shutdown);
|
|
492
|
+
try {
|
|
493
|
+
await stopComplete;
|
|
494
|
+
} finally {
|
|
495
|
+
clearInterval(heartbeat);
|
|
496
|
+
_clearSignalHandlers();
|
|
497
|
+
}
|
|
463
498
|
return 0;
|
|
464
499
|
}
|
|
465
500
|
|
|
@@ -713,7 +748,14 @@ async function _runAudit(args, ctx) {
|
|
|
713
748
|
var tableV = args.flags.table ? String(args.flags.table) : "audit_log";
|
|
714
749
|
var maxRows = args.flags["max-rows"];
|
|
715
750
|
var maxRowsN = maxRows === undefined ? undefined : Number(maxRows);
|
|
716
|
-
|
|
751
|
+
// Positive-INTEGER validation, mirroring `migrate down --steps`: reject
|
|
752
|
+
// NaN/Infinity, < 1, AND any fractional value. The message promises "a
|
|
753
|
+
// positive integer", so a value like 2.5 must be refused here at the
|
|
754
|
+
// entry point rather than passed to verifyChain, where a fractional
|
|
755
|
+
// maxRows truncates the walk mid-chain and reports a nonsensical
|
|
756
|
+
// fractional rowsVerified (Math.min(rows.length, 2.5)).
|
|
757
|
+
if (maxRowsN !== undefined &&
|
|
758
|
+
(!Number.isFinite(maxRowsN) || maxRowsN < 1 || Math.floor(maxRowsN) !== maxRowsN)) {
|
|
717
759
|
_writeLine(ctx.stderr, "blamejs audit verify-chain: --max-rows must be a positive integer");
|
|
718
760
|
return 2;
|
|
719
761
|
}
|
|
@@ -759,7 +801,7 @@ async function _runAudit(args, ctx) {
|
|
|
759
801
|
_writeLine(ctx.stderr, "blamejs audit purge: --archive (path to verified archive bundle) is required");
|
|
760
802
|
return 2;
|
|
761
803
|
}
|
|
762
|
-
if (args.flags
|
|
804
|
+
if (!_isConfirmed(args.flags)) {
|
|
763
805
|
_writeLine(ctx.stderr, "blamejs audit purge: --confirm is REQUIRED — destructive operation");
|
|
764
806
|
return 2;
|
|
765
807
|
}
|
|
@@ -1044,9 +1086,14 @@ async function _runRestore(args, ctx) {
|
|
|
1044
1086
|
report.write("rollback points at " + rollbackRootL + ": " + pts.length);
|
|
1045
1087
|
for (var p = 0; p < pts.length; p++) {
|
|
1046
1088
|
var pt = pts[p];
|
|
1089
|
+
// restoreRollback.list() returns { rollbackPath, swappedAt, marker },
|
|
1090
|
+
// and operator metadata (bundleId / reason) rides on marker.operator --
|
|
1091
|
+
// not a top-level recordedAt/bundleId, so those never rendered.
|
|
1092
|
+
var ptOp = pt.marker && pt.marker.operator;
|
|
1047
1093
|
report.write(" " + (pt.rollbackPath || pt) +
|
|
1048
|
-
(pt.
|
|
1049
|
-
(
|
|
1094
|
+
(pt.swappedAt ? " swappedAt=" + pt.swappedAt : "") +
|
|
1095
|
+
(ptOp && ptOp.bundleId ? " bundleId=" + ptOp.bundleId : "") +
|
|
1096
|
+
(ptOp && ptOp.reason ? " reason=" + ptOp.reason : ""));
|
|
1050
1097
|
}
|
|
1051
1098
|
return report.ok();
|
|
1052
1099
|
} catch (e) {
|
|
@@ -1605,10 +1652,21 @@ async function _runVault(args, ctx) {
|
|
|
1605
1652
|
var dataDir = _resolvePath(String(args.flags["data-dir"] || "./data"), ctx.cwd);
|
|
1606
1653
|
|
|
1607
1654
|
if (sub === "status") {
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1655
|
+
// A missing / unreadable data-dir must surface as the standard clean
|
|
1656
|
+
// reporter error (exit 1), not an uncaught throw: preflightSealable /
|
|
1657
|
+
// preflightUnsealable raise VaultPassphraseError when the dir doesn't
|
|
1658
|
+
// exist, and without this catch that rejection propagates out of main()
|
|
1659
|
+
// — the bin shim would print a stack trace instead of the one-line
|
|
1660
|
+
// "data-dir does not exist" the sibling seal / unseal / rotate paths give.
|
|
1661
|
+
var pre, unsealable;
|
|
1662
|
+
try {
|
|
1663
|
+
pre = vaultPassphraseOps.preflightSealable({ dataDir: dataDir });
|
|
1664
|
+
unsealable = vaultPassphraseOps.preflightUnsealable
|
|
1665
|
+
? vaultPassphraseOps.preflightUnsealable({ dataDir: dataDir })
|
|
1666
|
+
: null;
|
|
1667
|
+
} catch (e) {
|
|
1668
|
+
return report.error((e && e.message) || String(e));
|
|
1669
|
+
}
|
|
1612
1670
|
report.write("data-dir: " + dataDir);
|
|
1613
1671
|
report.write("vault.key (plaintext): " +
|
|
1614
1672
|
(pre.ok ? "present (sealable)" : "absent — " + (pre.reason || "n/a")));
|
|
@@ -2058,7 +2116,7 @@ async function _runErase(args, ctx) {
|
|
|
2058
2116
|
var rowId = args.flags["row-id"];
|
|
2059
2117
|
if (!table || table === true) return report.error("--table <name> is required", 2);
|
|
2060
2118
|
if (!rowId || rowId === true) return report.error("--row-id <id> is required", 2);
|
|
2061
|
-
if (!args.flags
|
|
2119
|
+
if (!_isConfirmed(args.flags)) {
|
|
2062
2120
|
return report.error("--confirm is required (this operation is irreversible)", 2);
|
|
2063
2121
|
}
|
|
2064
2122
|
var dataDirFlag = args.flags["data-dir"];
|
|
@@ -2294,12 +2352,24 @@ async function main(argv, opts) {
|
|
|
2294
2352
|
stderr: opts.stderr || process.stderr,
|
|
2295
2353
|
env: opts.env || process.env,
|
|
2296
2354
|
cwd: opts.cwd || process.cwd(),
|
|
2355
|
+
// Test seams (undefined in production): _dev injects the dev-supervisor
|
|
2356
|
+
// factory; _onDevRunning receives the shutdown fn once `dev` is live, so
|
|
2357
|
+
// a test can drive graceful teardown without raising a real OS signal.
|
|
2358
|
+
_dev: opts._dev,
|
|
2359
|
+
_onDevRunning: opts._onDevRunning,
|
|
2297
2360
|
};
|
|
2298
2361
|
if (!Array.isArray(argv)) argv = [];
|
|
2299
2362
|
var args = _parseArgs(argv);
|
|
2300
2363
|
|
|
2301
|
-
//
|
|
2302
|
-
|
|
2364
|
+
// Version is honored only as the WHOLE invocation — a bare `-v` /
|
|
2365
|
+
// `--version` with no subcommand. `_parseArgs` declares `--version`
|
|
2366
|
+
// boolean, so a stray version flag never swallows a token: it works in any
|
|
2367
|
+
// order (leading, trailing, or between a command and its subcommand) and
|
|
2368
|
+
// leaves the positional list intact, so the command dispatches instead of
|
|
2369
|
+
// a silent version no-op returning a false 0. A `-v` used as another
|
|
2370
|
+
// option's value stays that value, and a version token after the `--`
|
|
2371
|
+
// terminator stays a literal positional.
|
|
2372
|
+
if ((args.flags.version || args.flags.v) && args.pos.length === 0) {
|
|
2303
2373
|
_writeLine(ctx.stdout, C.version);
|
|
2304
2374
|
return 0;
|
|
2305
2375
|
}
|