@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
|
@@ -110,7 +110,7 @@ function _genId() {
|
|
|
110
110
|
* }
|
|
111
111
|
*
|
|
112
112
|
* @example
|
|
113
|
-
* var b = require("blamejs")
|
|
113
|
+
* var b = require("blamejs");
|
|
114
114
|
* var ce = b.cloudEvents.wrap({
|
|
115
115
|
* source: "/services/orders",
|
|
116
116
|
* type: "com.example.order.created",
|
|
@@ -214,7 +214,7 @@ function wrap(opts) {
|
|
|
214
214
|
* envelope.
|
|
215
215
|
*
|
|
216
216
|
* @example
|
|
217
|
-
* var b = require("blamejs")
|
|
217
|
+
* var b = require("blamejs");
|
|
218
218
|
* var record = b.cloudEvents.parse({
|
|
219
219
|
* specversion: "1.0",
|
|
220
220
|
* id: "evt-1",
|
|
@@ -244,7 +244,17 @@ function create(config) {
|
|
|
244
244
|
async function renewLease(lease, opts) {
|
|
245
245
|
if (!lease || !lease.leaseId) throw _err("INVALID_LEASE", "lease required", true);
|
|
246
246
|
var nowMs = Date.now();
|
|
247
|
-
|
|
247
|
+
// A lease is a sliding window: the span (expiresAt - acquiredAt) equals
|
|
248
|
+
// the configured TTL at acquire time, and every renewal must slide BOTH
|
|
249
|
+
// ends forward so the span stays that TTL. Advancing only expiresAt
|
|
250
|
+
// (leaving acquiredAt frozen at the original acquisition) re-derives an
|
|
251
|
+
// ever-growing TTL on the next renewal, so the expiry drifts unboundedly
|
|
252
|
+
// into the future: a dead leader's row then never lapses within leaseTtl
|
|
253
|
+
// and no follower can steal it, breaking bounded takeover. Refresh
|
|
254
|
+
// acquiredAt alongside expiresAt to keep the span invariant.
|
|
255
|
+
var ttlMs = lease.expiresAt - lease.acquiredAt;
|
|
256
|
+
var newAcquiredAt = nowMs;
|
|
257
|
+
var newExpiresAt = nowMs + ttlMs;
|
|
248
258
|
// opts.endpoint, when provided, refreshes the stored endpoint so
|
|
249
259
|
// operators who hot-update their config see the discovery row catch
|
|
250
260
|
// up. Default = preserve whatever was stored at acquire time.
|
|
@@ -261,7 +271,7 @@ function create(config) {
|
|
|
261
271
|
// MySQL has no RETURNING — UPDATE then read back, with a takeover
|
|
262
272
|
// detected when the read-back row no longer carries our leaseId.
|
|
263
273
|
var rvBuilt = sql().update(LEADER_TABLE, { dialect: dialect })
|
|
264
|
-
.set({ expiresAt: newExpiresAt, endpoint: endpoint })
|
|
274
|
+
.set({ acquiredAt: newAcquiredAt, expiresAt: newExpiresAt, endpoint: endpoint })
|
|
265
275
|
.where("scope", "leader").where("nodeId", lease.nodeId).where("leaseId", lease.leaseId)
|
|
266
276
|
.toSql();
|
|
267
277
|
var rv = await _q(clusterStorage().placeholderize(rvBuilt.sql, dialect), rvBuilt.params);
|
|
@@ -283,7 +293,7 @@ function create(config) {
|
|
|
283
293
|
row = sel.rows[0];
|
|
284
294
|
} else {
|
|
285
295
|
var result = await _run(sql().update(LEADER_TABLE, { dialect: dialect })
|
|
286
|
-
.set({ expiresAt: newExpiresAt, endpoint: endpoint })
|
|
296
|
+
.set({ acquiredAt: newAcquiredAt, expiresAt: newExpiresAt, endpoint: endpoint })
|
|
287
297
|
.where("scope", "leader").where("nodeId", lease.nodeId).where("leaseId", lease.leaseId)
|
|
288
298
|
.returning(renewCols));
|
|
289
299
|
if (!result.rows || result.rows.length === 0) {
|
|
@@ -581,10 +581,95 @@ function decodeNumericEntities(s) {
|
|
|
581
581
|
});
|
|
582
582
|
}
|
|
583
583
|
|
|
584
|
+
// The HTML5 named-entity ASCII subset a browser resolves inside URL and CSS
|
|
585
|
+
// attribute contexts — the scheme/whitespace-significant characters an attacker
|
|
586
|
+
// hides a payload behind (`java	script:` / `behavior:`). One table so
|
|
587
|
+
// guard-html / guard-svg / guard-markdown decode the SAME set and cannot drift
|
|
588
|
+
// (guard-markdown shipped without named-entity decoding at all, so `	` /
|
|
589
|
+
// `
` slipped past its scheme denylist).
|
|
590
|
+
var NAMED_ENTITY_ASCII = {
|
|
591
|
+
// Whitespace + control chars browsers strip inside URL schemes
|
|
592
|
+
Tab: "\t", NewLine: "\n",
|
|
593
|
+
// Scheme-significant punctuation
|
|
594
|
+
colon: ":", semi: ";", period: ".", sol: "/", bsol: "\\",
|
|
595
|
+
num: "#", excl: "!", quest: "?", lpar: "(", rpar: ")",
|
|
596
|
+
lsqb: "[", rsqb: "]", lcub: "{", rcub: "}",
|
|
597
|
+
// Quotes / brackets
|
|
598
|
+
quot: "\"", apos: "'", lt: "<", gt: ">",
|
|
599
|
+
// Misc ASCII
|
|
600
|
+
amp: "&", commat: "@", dollar: "$", percnt: "%",
|
|
601
|
+
ast: "*", plus: "+", lowbar: "_", hyphen: "-",
|
|
602
|
+
// Latin-1 space browsers treat as URL-strippable
|
|
603
|
+
nbsp: " ",
|
|
604
|
+
};
|
|
605
|
+
var NAMED_ENTITY_RE_G = /&([A-Za-z][A-Za-z0-9]+);/g;
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* @primitive b.codepointClass.decodeMarkupEntities
|
|
609
|
+
* @signature b.codepointClass.decodeMarkupEntities(value)
|
|
610
|
+
* @since 0.16.19
|
|
611
|
+
* @status stable
|
|
612
|
+
* @related b.codepointClass.decodeNumericEntities, b.codepointClass.stripUrlSchemeWhitespace
|
|
613
|
+
*
|
|
614
|
+
* Decode the character references a browser resolves inside an attribute value
|
|
615
|
+
* -- numeric (hex/decimal, semicolon OPTIONAL) then the named-entity ASCII
|
|
616
|
+
* subset browsers honor in URL/CSS contexts -- and drop the C0 controls and
|
|
617
|
+
* zero-widths a payload hides behind. The single decoder every content guard
|
|
618
|
+
* routes a scheme / CSS-token danger check through, so a threat cannot slip
|
|
619
|
+
* past the guard that forgot to decode an encoding a sibling strips. Pair with
|
|
620
|
+
* `stripUrlSchemeWhitespace` for a URL-scheme check.
|
|
621
|
+
*
|
|
622
|
+
* @example
|
|
623
|
+
* b.codepointClass.decodeMarkupEntities("expression("); // "expression("
|
|
624
|
+
* b.codepointClass.decodeMarkupEntities("behavior:"); // "behavior:"
|
|
625
|
+
*/
|
|
626
|
+
function decodeMarkupEntities(value) {
|
|
627
|
+
var s = decodeNumericEntities(String(value == null ? "" : value));
|
|
628
|
+
s = s.replace(NAMED_ENTITY_RE_G, function (m, name) {
|
|
629
|
+
if (Object.prototype.hasOwnProperty.call(NAMED_ENTITY_ASCII, name)) {
|
|
630
|
+
return NAMED_ENTITY_ASCII[name];
|
|
631
|
+
}
|
|
632
|
+
return m;
|
|
633
|
+
});
|
|
634
|
+
return s.replace(C0_CTRL_RE_G, "").replace(ZW_RE_G, "");
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
var URL_TAB_NEWLINE_RE_G = /[\t\n\r]/g; // URL tab/newline strip, not byte size
|
|
638
|
+
// allow:dynamic-regex -- codepoints from a literal [0x00, 0x20] range (C0 controls + space)
|
|
639
|
+
var URL_C0_SPACE_CC = charClass([[0x0000, 0x0020]]);
|
|
640
|
+
var URL_C0_SPACE_TRIM_RE = new RegExp("^(?:[" + URL_C0_SPACE_CC + "])+|(?:[" + URL_C0_SPACE_CC + "])+$", "g");
|
|
641
|
+
/**
|
|
642
|
+
* @primitive b.codepointClass.stripUrlSchemeWhitespace
|
|
643
|
+
* @signature b.codepointClass.stripUrlSchemeWhitespace(s)
|
|
644
|
+
* @since 0.16.19
|
|
645
|
+
* @status stable
|
|
646
|
+
* @related b.codepointClass.decodeMarkupEntities, b.codepointClass.decodeNumericEntities
|
|
647
|
+
*
|
|
648
|
+
* Fold away exactly the whitespace the WHATWG URL parser removes before it
|
|
649
|
+
* resolves a scheme: ASCII tab / LF / CR from ANYWHERE, plus a leading/trailing
|
|
650
|
+
* C0-control-or-space run. tab/lf/cr are excluded from the C0-control catalog
|
|
651
|
+
* and space is not a control, so a danger check that strips only C0/zero-width
|
|
652
|
+
* still lets `java<TAB>script:` or an entity-encoded leading space
|
|
653
|
+
* (` javascript:`) read as scheme-less. Run AFTER entity decoding; every
|
|
654
|
+
* guard that extracts a URL scheme for a denylist routes the decoded value
|
|
655
|
+
* through this.
|
|
656
|
+
*
|
|
657
|
+
* @example
|
|
658
|
+
* b.codepointClass.stripUrlSchemeWhitespace(" javascript:x"); // "javascript:x"
|
|
659
|
+
*/
|
|
660
|
+
function stripUrlSchemeWhitespace(s) {
|
|
661
|
+
return String(s == null ? "" : s)
|
|
662
|
+
.replace(URL_TAB_NEWLINE_RE_G, "")
|
|
663
|
+
.replace(URL_C0_SPACE_TRIM_RE, "");
|
|
664
|
+
}
|
|
665
|
+
|
|
584
666
|
module.exports = {
|
|
585
667
|
isForbiddenControlChar: isForbiddenControlChar,
|
|
586
668
|
firstControlCharOffset: firstControlCharOffset,
|
|
587
669
|
decodeNumericEntities: decodeNumericEntities,
|
|
670
|
+
decodeMarkupEntities: decodeMarkupEntities,
|
|
671
|
+
NAMED_ENTITY_ASCII: NAMED_ENTITY_ASCII,
|
|
672
|
+
stripUrlSchemeWhitespace: stripUrlSchemeWhitespace,
|
|
588
673
|
isAsciiAlnum: isAsciiAlnum,
|
|
589
674
|
isUnreserved: isUnreserved,
|
|
590
675
|
hex4: hex4,
|
|
@@ -51,7 +51,7 @@ var PROHIBITED_PRACTICES = Object.freeze([
|
|
|
51
51
|
Object.freeze({
|
|
52
52
|
id: "social-scoring",
|
|
53
53
|
article: "Art. 5(1)(c)",
|
|
54
|
-
title: "Social scoring
|
|
54
|
+
title: "Social scoring of natural persons",
|
|
55
55
|
description: "AI systems for the evaluation or classification of natural persons over a certain period of time based on their social behaviour or known, inferred or predicted personal or personality characteristics, leading to detrimental or unfavourable treatment that is unjustified or disproportionate.",
|
|
56
56
|
examples: Object.freeze([
|
|
57
57
|
"General-purpose social-credit ranking by a state agency",
|
|
@@ -151,9 +151,13 @@ function classify(systemDescription) {
|
|
|
151
151
|
if (systemDescription.targetsVulnerableGroup === true) {
|
|
152
152
|
hits.push("exploit-vulnerabilities");
|
|
153
153
|
}
|
|
154
|
-
// (c) social scoring
|
|
155
|
-
|
|
156
|
-
|
|
154
|
+
// (c) social scoring — Art. 5(1)(c) of the adopted Regulation (EU)
|
|
155
|
+
// 2024/1689 prohibits social scoring by ANY actor. The "by public
|
|
156
|
+
// authorities or on their behalf" limitation from the 2021 Commission
|
|
157
|
+
// proposal was dropped in the final text, so the practice is flagged on the
|
|
158
|
+
// purpose alone, not gated on deployerType (which would under-classify a
|
|
159
|
+
// private-actor social-scoring system as minimal-risk).
|
|
160
|
+
if (systemDescription.purpose === "social-scoring") {
|
|
157
161
|
hits.push("social-scoring");
|
|
158
162
|
}
|
|
159
163
|
// (d) predictive policing on profiling alone
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
|
|
43
43
|
var validateOpts = require("./validate-opts");
|
|
44
44
|
var markupEscape = require("./markup-escape").markupEscape;
|
|
45
|
+
var safeJson = require("./safe-json");
|
|
45
46
|
var { ComplianceError } = require("./framework-error");
|
|
46
47
|
|
|
47
48
|
var BANNER_KINDS = Object.freeze([
|
|
@@ -112,10 +113,17 @@ function _articleFor(kind) {
|
|
|
112
113
|
|
|
113
114
|
function htmlBanner(opts) {
|
|
114
115
|
var b = banner(opts);
|
|
116
|
+
// Every interpolated value is entity-escaped for the double-quoted attribute
|
|
117
|
+
// context. `lang` is free-form (a request locale / Accept-Language / query
|
|
118
|
+
// param when the banner is server-rendered), so an unescaped double quote
|
|
119
|
+
// would break out of the attribute and inject active content (reflected
|
|
120
|
+
// XSS). `article` / `kind` are constrained today, but escape-at-the-sink is
|
|
121
|
+
// the invariant — a raw concat is the defect regardless of the current
|
|
122
|
+
// value domain.
|
|
115
123
|
var attrs =
|
|
116
|
-
'role="status" data-blamejs-aiAct="' + b.article +
|
|
117
|
-
'" data-blamejs-kind="' + b.kind +
|
|
118
|
-
'" lang="' + b.lang + '"';
|
|
124
|
+
'role="status" data-blamejs-aiAct="' + _escapeHtml(b.article) +
|
|
125
|
+
'" data-blamejs-kind="' + _escapeHtml(b.kind) +
|
|
126
|
+
'" lang="' + _escapeHtml(b.lang) + '"';
|
|
119
127
|
return '<div ' + attrs + '>' + _escapeHtml(b.text) + '</div>';
|
|
120
128
|
}
|
|
121
129
|
|
|
@@ -159,9 +167,16 @@ function watermark(opts) {
|
|
|
159
167
|
|
|
160
168
|
function jsonLdDisclosure(opts) {
|
|
161
169
|
var w = watermark(opts);
|
|
170
|
+
// The manifest carries operator-supplied strings (modelId, deployerName,
|
|
171
|
+
// promptHash, ...). Embedding raw JSON.stringify inside a <script> element
|
|
172
|
+
// lets a value containing "</script>" (or "<!--") terminate the block and
|
|
173
|
+
// inject markup — the HTML parser ends the element at the first "</script>"
|
|
174
|
+
// regardless of the ld+json type. b.safeJson.stringifyForScript escapes
|
|
175
|
+
// < > & (and U+2028/U+2029) to \uXXXX so the parsed JSON is unchanged but no
|
|
176
|
+
// substring can break out of the script context.
|
|
162
177
|
var script = '<script type="application/ld+json" ' +
|
|
163
178
|
'data-blamejs-aiAct="Art. 50(2)">' +
|
|
164
|
-
|
|
179
|
+
safeJson.stringifyForScript(w) + '</script>';
|
|
165
180
|
return script;
|
|
166
181
|
}
|
|
167
182
|
|
|
@@ -591,11 +591,10 @@ function deployerChecklist(assessment) {
|
|
|
591
591
|
* });
|
|
592
592
|
*/
|
|
593
593
|
function fundamentalRightsImpactAssessment(opts) {
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
}
|
|
594
|
+
validateOpts.requireObject(opts, "fundamentalRightsImpactAssessment",
|
|
595
|
+
ComplianceError, "compliance-ai-act/bad-input");
|
|
597
596
|
validateOpts.requireNonEmptyString(opts.systemId, "systemId",
|
|
598
|
-
|
|
597
|
+
ComplianceError, "compliance-ai-act/no-system-id");
|
|
599
598
|
return {
|
|
600
599
|
"$schema": "https://blamejs.com/schema/ai-act-fria-v1.json",
|
|
601
600
|
regulation: "EU Regulation 2024/1689 — AI Act",
|
|
@@ -657,11 +656,10 @@ function fundamentalRightsImpactAssessment(opts) {
|
|
|
657
656
|
* });
|
|
658
657
|
*/
|
|
659
658
|
function trainingDataSummary(opts) {
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
}
|
|
659
|
+
validateOpts.requireObject(opts, "trainingDataSummary",
|
|
660
|
+
ComplianceError, "compliance-ai-act/bad-input");
|
|
663
661
|
validateOpts.requireNonEmptyString(opts.modelId, "modelId",
|
|
664
|
-
|
|
662
|
+
ComplianceError, "compliance-ai-act/no-model-id");
|
|
665
663
|
return {
|
|
666
664
|
"$schema": "https://blamejs.com/schema/ai-act-gpai-training-summary-v1.json",
|
|
667
665
|
regulation: "EU Regulation 2024/1689 — AI Act",
|
|
@@ -595,7 +595,7 @@ function signCose(manifest, opts) {
|
|
|
595
595
|
validateOpts.requireNonEmptyString(opts.privateKeyPem,
|
|
596
596
|
"contentCredentials.signCose: privateKeyPem", ContentCredentialsError, "BAD_KEY");
|
|
597
597
|
var algName = (opts.alg || "ml-dsa-87").toLowerCase();
|
|
598
|
-
if (!(algName
|
|
598
|
+
if (!Object.prototype.hasOwnProperty.call(COSE_ALGS, algName)) {
|
|
599
599
|
throw ContentCredentialsError.factory("content-credentials/bad-alg",
|
|
600
600
|
"contentCredentials.signCose: alg '" + algName +
|
|
601
601
|
"' not in COSE alg registry. Known: " + Object.keys(COSE_ALGS).join(", "));
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
var nodeCrypto = require("node:crypto");
|
|
33
33
|
var bCrypto = require("./crypto");
|
|
34
34
|
var safeBuffer = require("./safe-buffer");
|
|
35
|
+
var safeObject = require("./safe-object");
|
|
35
36
|
var structuredFields = require("./structured-fields");
|
|
36
37
|
var validateOpts = require("./validate-opts");
|
|
37
38
|
var { defineClass } = require("./framework-error");
|
|
@@ -104,7 +105,7 @@ function create(body, opts) {
|
|
|
104
105
|
// hasOwnProperty: the algorithm name is operator/caller input; a bracket
|
|
105
106
|
// lookup lets "constructor"/"toString" inherit a truthy value off the
|
|
106
107
|
// prototype and pass the support check (proto shadowing).
|
|
107
|
-
var nodeAlg =
|
|
108
|
+
var nodeAlg = safeObject.ownProp(ACTIVE, name);
|
|
108
109
|
if (!nodeAlg) {
|
|
109
110
|
if (Object.prototype.hasOwnProperty.call(DEPRECATED, name)) throw new ContentDigestError("content-digest/insecure-algorithm", "contentDigest.create: '" + name + "' is a deprecated/insecure digest algorithm (RFC 9530 §6); use sha-256 or sha-512");
|
|
110
111
|
throw new ContentDigestError("content-digest/unsupported-algorithm", "contentDigest.create: unsupported digest algorithm '" + name + "'");
|
|
@@ -214,15 +214,25 @@ function serialize(name, value, attrs) {
|
|
|
214
214
|
// __Host-* — MUST be Secure, Path=/, NO Domain
|
|
215
215
|
//
|
|
216
216
|
// Caught at the source so every caller (csrf-protect / session /
|
|
217
|
-
// operator) gets the same enforcement.
|
|
218
|
-
|
|
217
|
+
// operator) gets the same enforcement. RFC 6265bis §5.4 requires user
|
|
218
|
+
// agents to match these prefixes case-INSENSITIVELY (the server-side
|
|
219
|
+
// description in §4.1.3 reads "case-sensitive", but the UA is what
|
|
220
|
+
// actually enforces the cookie-drop): Chromium and Firefox both
|
|
221
|
+
// lowercase the name before the prefix test, so `__host-` / `__SECURE-`
|
|
222
|
+
// get the same browser enforcement -- Secure, Path=/, no Domain -- as
|
|
223
|
+
// `__Host-` / `__Secure-`. Case-sensitive matching was itself the
|
|
224
|
+
// vulnerability CVE-2024-5699 (httpwg/http-extensions#2231). Compare a
|
|
225
|
+
// lowercased copy so a case-variant name can't dodge the invariant here
|
|
226
|
+
// and then be silently dropped by the browser.
|
|
227
|
+
var lowerName = name.toLowerCase();
|
|
228
|
+
if (lowerName.indexOf("__secure-") === 0) {
|
|
219
229
|
if (attrs.secure !== true) {
|
|
220
230
|
throw new CookieError("cookies/prefix-secure-required",
|
|
221
231
|
"__Secure-* cookies MUST set Secure (RFC 6265bis §4.1.3.1) — got '" +
|
|
222
232
|
name + "' without secure: true");
|
|
223
233
|
}
|
|
224
234
|
}
|
|
225
|
-
if (
|
|
235
|
+
if (lowerName.indexOf("__host-") === 0) {
|
|
226
236
|
if (attrs.secure !== true) {
|
|
227
237
|
throw new CookieError("cookies/prefix-host-secure-required",
|
|
228
238
|
"__Host-* cookies MUST set Secure (RFC 6265bis §4.1.3.2) — got '" +
|
|
@@ -112,21 +112,36 @@ function _algParamsFor(algId) {
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
// RFC 9053 §2 binds each
|
|
116
|
-
// verify
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
115
|
+
// RFC 9053 §2 binds each COSE signature alg to ONE key shape. node:crypto
|
|
116
|
+
// dispatches sign()/verify() on the KEY, never on the declared COSE alg —
|
|
117
|
+
// for ECDSA it will happily verify a sha512 (ES512-shape) signature against
|
|
118
|
+
// a P-256 key as self-consistent, and for the null-digest algorithms
|
|
119
|
+
// (EdDSA, ML-DSA-87) it selects the primitive purely from the key type.
|
|
120
|
+
// Without an alg→key binding a COSE_Sign1 declaring one algorithm but
|
|
121
|
+
// carrying/using another key type verifies — an alg/key confusion (the COSE
|
|
122
|
+
// sibling of jwt-external._assertAlgKtyMatch). Two live seams: a COSE_Sign1
|
|
123
|
+
// declaring ES512 but carrying a P-256 key passes when ES512 is allowlisted;
|
|
124
|
+
// and — because EdDSA/ML-DSA-87 both sign with a null digest — an EdDSA
|
|
125
|
+
// signature passes a PQC-only ("ML-DSA-87") allowlist against an Ed25519 key
|
|
126
|
+
// (and the reverse). EdDSA / ML-DSA carry no curve, so they are bound by
|
|
127
|
+
// key TYPE, not curve. Every SIGNABLE alg is bound here.
|
|
121
128
|
var _ES_ALG_CURVE = { ES256: "prime256v1", ES384: "secp384r1", ES512: "secp521r1" };
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
"cose
|
|
129
|
-
|
|
129
|
+
var _ALG_KEY_TYPE = { EdDSA: "ed25519", "ML-DSA-87": "ml-dsa-87" }; // null-digest algs → required key type
|
|
130
|
+
function _assertAlgKeyMatch(algName, key) {
|
|
131
|
+
var wantCurve = _ES_ALG_CURVE[algName];
|
|
132
|
+
if (wantCurve !== undefined) {
|
|
133
|
+
var got = (key && key.asymmetricKeyDetails && key.asymmetricKeyDetails.namedCurve) || null;
|
|
134
|
+
if (!key || key.asymmetricKeyType !== "ec" || got !== wantCurve) {
|
|
135
|
+
throw new CoseError("cose/alg-curve-mismatch",
|
|
136
|
+
"cose: alg '" + algName + "' requires an EC key on " + wantCurve +
|
|
137
|
+
", got " + (key && key.asymmetricKeyType === "ec" ? got : (key && key.asymmetricKeyType)));
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
var wantType = _ALG_KEY_TYPE[algName];
|
|
142
|
+
if (wantType !== undefined && (!key || key.asymmetricKeyType !== wantType)) {
|
|
143
|
+
throw new CoseError("cose/alg-key-mismatch",
|
|
144
|
+
"cose: alg '" + algName + "' requires a " + wantType + " key, got " + (key && key.asymmetricKeyType));
|
|
130
145
|
}
|
|
131
146
|
}
|
|
132
147
|
|
|
@@ -189,7 +204,7 @@ async function sign(payload, opts) {
|
|
|
189
204
|
var algId = ALG_NAME_TO_ID[opts.alg];
|
|
190
205
|
var params = _algParamsFor(algId);
|
|
191
206
|
var key = _toKeyObject(opts.privateKey, "private");
|
|
192
|
-
|
|
207
|
+
_assertAlgKeyMatch(opts.alg, key); // RFC 9053 alg↔key binding — refuse e.g. ES512 over a P-256 key, or EdDSA over an ML-DSA key
|
|
193
208
|
|
|
194
209
|
var protMap = new Map();
|
|
195
210
|
protMap.set(HDR_ALG, algId);
|
|
@@ -373,7 +388,7 @@ async function verify(coseSign1, opts) {
|
|
|
373
388
|
var key = opts.publicKey
|
|
374
389
|
? _toKeyObject(opts.publicKey, "public")
|
|
375
390
|
: _toKeyObject(opts.keyResolver(protMap, unprotected), "public");
|
|
376
|
-
|
|
391
|
+
_assertAlgKeyMatch(algName, key); // RFC 9053 alg↔key binding — refuse alg/key-type confusion (EdDSA vs ML-DSA-87, ES* vs wrong curve)
|
|
377
392
|
|
|
378
393
|
var externalAad = opts.externalAad == null ? Buffer.alloc(0) : _bstr(opts.externalAad);
|
|
379
394
|
var toBeSigned = _toBeSigned(protectedBstr, externalAad, payload);
|
|
@@ -89,6 +89,11 @@ var TYPED_SENTINEL = String.fromCharCode(0) + "bjsv1:";
|
|
|
89
89
|
|
|
90
90
|
function _encodeTyped(value) {
|
|
91
91
|
if (typeof value === "string") {
|
|
92
|
+
// "" encodes to a NON-empty typed marker so a sealed empty string is a real
|
|
93
|
+
// authenticated envelope, never a bare plaintext "": vault.aad.seal refuses
|
|
94
|
+
// empty plaintext, and a bare "" in a sealed cell is indistinguishable from a
|
|
95
|
+
// ciphertext a DB-write attacker downgraded to "".
|
|
96
|
+
if (value === "") return TYPED_SENTINEL + "E:";
|
|
92
97
|
return value.indexOf(TYPED_SENTINEL) === 0 ? TYPED_SENTINEL + "S:" + value : value;
|
|
93
98
|
}
|
|
94
99
|
if (Buffer.isBuffer(value)) return TYPED_SENTINEL + "B:" + value.toString("base64");
|
|
@@ -102,6 +107,7 @@ function _decodeTyped(str) {
|
|
|
102
107
|
var body = str.slice(TYPED_SENTINEL.length);
|
|
103
108
|
var tag = body.slice(0, 2);
|
|
104
109
|
var payload = body.slice(2);
|
|
110
|
+
if (tag === "E:") return "";
|
|
105
111
|
if (tag === "B:") return Buffer.from(payload, "base64");
|
|
106
112
|
if (tag === "J:") return safeJson.parse(payload); // plaintext is AEAD-verified; safeJson blocks proto-pollution defensively
|
|
107
113
|
if (tag === "S:") return payload;
|
|
@@ -1071,6 +1077,11 @@ function sealRow(table, row, opts) {
|
|
|
1071
1077
|
// - plain mode: vault.seal (idempotent — already-sealed pass through).
|
|
1072
1078
|
for (var i = 0; i < s.sealedFields.length; i++) {
|
|
1073
1079
|
var field = s.sealedFields[i];
|
|
1080
|
+
// Skip only null / undefined (nothing to seal). An empty string IS sealed:
|
|
1081
|
+
// _encodeTyped("") yields a non-empty typed marker (E:), so every branch
|
|
1082
|
+
// produces a real authenticated envelope -- never a bare plaintext "" that a
|
|
1083
|
+
// DB-write attacker could forge, or that a ciphertext could be silently
|
|
1084
|
+
// downgraded to (unsealRow fails closed on a bare "" in an AAD/keyed cell).
|
|
1074
1085
|
if (out[field] === undefined || out[field] === null) continue;
|
|
1075
1086
|
if (kRow && field === residencyCol) continue; // residency tag stays plaintext
|
|
1076
1087
|
if (kRow) {
|
|
@@ -1216,6 +1227,27 @@ function unsealRow(table, row, actor, dbHandle) {
|
|
|
1216
1227
|
|
|
1217
1228
|
for (var i = 0; i < s.sealedFields.length; i++) {
|
|
1218
1229
|
var field = s.sealedFields[i];
|
|
1230
|
+
// Post-seal, a legitimately-empty sealed value is a NON-empty authenticated
|
|
1231
|
+
// envelope (see _encodeTyped "" -> E:), so a bare "" present in an AAD-bound
|
|
1232
|
+
// or per-row-key sealed column is an envelope-downgrade tamper -- a DB-write
|
|
1233
|
+
// attacker replacing a ciphertext with "". Fail closed (null the cell + audit),
|
|
1234
|
+
// mirroring the plain-vault aad-downgrade refusal below; never surface it as a
|
|
1235
|
+
// valid empty value. Plain-mode tables keep the lenient pass-through.
|
|
1236
|
+
if (out[field] === "" && (s.aad || keyedTable)) {
|
|
1237
|
+
out[field] = null;
|
|
1238
|
+
try {
|
|
1239
|
+
audit().safeEmit({
|
|
1240
|
+
action: "system.crypto.unseal_failed",
|
|
1241
|
+
outcome: "failure",
|
|
1242
|
+
metadata: {
|
|
1243
|
+
table: table, field: field, rowId: out[s.rowIdField] || out._id || null,
|
|
1244
|
+
shape: (s.aad ? "aad" : "row"),
|
|
1245
|
+
reason: "empty-string cell in a sealed AAD/keyed column (envelope downgrade)",
|
|
1246
|
+
},
|
|
1247
|
+
});
|
|
1248
|
+
} catch (_e) { /* drop-silent */ }
|
|
1249
|
+
continue;
|
|
1250
|
+
}
|
|
1219
1251
|
if (out[field]) {
|
|
1220
1252
|
// Per-cell envelope shape for audit metadata (operators write alert
|
|
1221
1253
|
// rules off it): "row" = K_row cell, "aad" = vault.aad: cell on an
|
|
@@ -98,8 +98,17 @@ var SUITES = Object.keys(SUITE_IMPL);
|
|
|
98
98
|
* // out === s.oprf.evaluate(kp.secretKey, Buffer.from("user@example.com"))
|
|
99
99
|
*/
|
|
100
100
|
function suite(name) {
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
// Own-property guard, not a truthiness check: SUITE_IMPL is a plain object,
|
|
102
|
+
// so a bracket read with a prototype-chain name ("__proto__" → Object.prototype,
|
|
103
|
+
// "constructor" → the Object constructor) returns a truthy inherited value that
|
|
104
|
+
// an `if (!impl)` guard would accept as a "suite". Match the hasOwnProperty
|
|
105
|
+
// shape b.crypto.sri uses for its algorithm table so an unknown name — however
|
|
106
|
+
// it collides with Object.prototype — refuses cleanly with OprfError.
|
|
107
|
+
var key = String(name).toLowerCase();
|
|
108
|
+
if (!Object.prototype.hasOwnProperty.call(SUITE_IMPL, key)) {
|
|
109
|
+
throw new OprfError("oprf/bad-suite", "crypto.oprf.suite: unknown suite '" + name + "'; expected one of " + SUITES.join(", "));
|
|
110
|
+
}
|
|
111
|
+
var impl = SUITE_IMPL[key];
|
|
103
112
|
// Expose only the modes the vendored @noble/curves implements (base +
|
|
104
113
|
// verifiable). poprf is omitted rather than surfaced as an empty stub.
|
|
105
114
|
return { name: impl.name, oprf: impl.oprf, voprf: impl.voprf };
|
|
@@ -69,11 +69,29 @@ function _x25519Public(sk) {
|
|
|
69
69
|
var spki = nodeCrypto.createPublicKey(key).export({ format: "der", type: "spki" });
|
|
70
70
|
return spki.subarray(spki.length - X25519_LEN);
|
|
71
71
|
}
|
|
72
|
+
// draft-connolly-cfrg-xwing-kem uses X25519 exactly as RFC 7748 specifies it,
|
|
73
|
+
// WITHOUT the optional RFC 7748 section 6.1 abort on an all-zero shared secret.
|
|
74
|
+
// Decapsulation must be uniform implicit-rejection: a hostile low-order X25519
|
|
75
|
+
// ephemeral in the ciphertext must NOT be able to signal validity by making
|
|
76
|
+
// decapsulate throw (the documented "yields a different secret rather than an
|
|
77
|
+
// error" contract, and a defense against a decapsulation oracle / crash-on-
|
|
78
|
+
// crafted-input DoS). OpenSSL (the X25519 backing this seam) DOES abort that
|
|
79
|
+
// derivation, so translate its error back into the all-zero shared secret RFC
|
|
80
|
+
// 7748 X25519 yields for a low-order input point. The combiner still binds ctX
|
|
81
|
+
// and pkX and the ML-KEM-768 leg still protects the result, so collapsing the
|
|
82
|
+
// classical leg costs only the classical half of the "secure if either holds"
|
|
83
|
+
// guarantee. A short/malformed key fails earlier at createPublicKey with a
|
|
84
|
+
// different code and still propagates.
|
|
72
85
|
function _x25519Shared(sk, pk) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
})
|
|
86
|
+
try {
|
|
87
|
+
return nodeCrypto.diffieHellman({
|
|
88
|
+
privateKey: nodeCrypto.createPrivateKey({ key: Buffer.concat([X25519_PKCS8_PREFIX, sk]), format: "der", type: "pkcs8" }),
|
|
89
|
+
publicKey: nodeCrypto.createPublicKey({ key: Buffer.concat([X25519_SPKI_PREFIX, pk]), format: "der", type: "spki" }),
|
|
90
|
+
});
|
|
91
|
+
} catch (e) {
|
|
92
|
+
if (e && e.code === "ERR_OSSL_FAILED_DURING_DERIVATION") return Buffer.alloc(X25519_LEN);
|
|
93
|
+
throw e;
|
|
94
|
+
}
|
|
77
95
|
}
|
|
78
96
|
|
|
79
97
|
function _shake256(buf, outLen) { return nodeCrypto.createHash("shake256", { outputLength: outLen }).update(buf).digest(); }
|