@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
|
@@ -46,6 +46,77 @@ function _rsaPair() {
|
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
// ---- shared fixtures for the branch/error coverage below ----
|
|
50
|
+
|
|
51
|
+
// One RSA keypair reused across the RS256 mint/verify branch tests — RSA
|
|
52
|
+
// generation is the slow step and none of the branches under test depend
|
|
53
|
+
// on key uniqueness.
|
|
54
|
+
var _sharedRsaKp = null;
|
|
55
|
+
function _rsaKp() {
|
|
56
|
+
if (!_sharedRsaKp) {
|
|
57
|
+
_sharedRsaKp = nodeCrypto.generateKeyPairSync("rsa", { modulusLength: 2048 }); // allow:raw-byte-literal — RSA modulus bits
|
|
58
|
+
}
|
|
59
|
+
return _sharedRsaKp;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Public JWK for the shared RSA key, optionally tagged with a kid.
|
|
63
|
+
function _rsaPubJwk(kid) {
|
|
64
|
+
var jwk = _rsaKp().publicKey.export({ format: "jwk" });
|
|
65
|
+
if (kid) jwk.kid = kid;
|
|
66
|
+
return jwk;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Public EC JWK on a named curve, optionally tagged with a kid.
|
|
70
|
+
function _ecJwk(curve, kid) {
|
|
71
|
+
var kp = nodeCrypto.generateKeyPairSync("ec", { namedCurve: curve });
|
|
72
|
+
var jwk = kp.publicKey.export({ format: "jwk" });
|
|
73
|
+
if (kid) jwk.kid = kid;
|
|
74
|
+
return jwk;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Mint a valid RS256 JWS over `claims` with the shared RSA key via the real
|
|
78
|
+
// signer (b.auth.jws.sign derives RS256 from the RSA key type).
|
|
79
|
+
function _mintRs256(claims, kid) {
|
|
80
|
+
var opts = { privateKey: _rsaKp().privateKey };
|
|
81
|
+
if (kid) opts.kid = kid;
|
|
82
|
+
return b.auth.jws.sign(claims, opts);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// An unsigned 3-part token — the signature segment is a placeholder for
|
|
86
|
+
// branches that fail BEFORE signature verification (alg / kid / kty / decode
|
|
87
|
+
// gates), so the signature bytes are never inspected.
|
|
88
|
+
function _unsigned(header, payload) {
|
|
89
|
+
return _b64url(JSON.stringify(header)) + "." +
|
|
90
|
+
_b64url(JSON.stringify(payload)) + "." + _b64url("sig");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Wrap a fixed value in a keyResolver (keeps the closure out of a loop body).
|
|
94
|
+
function _constResolver(v) { return function () { return v; }; }
|
|
95
|
+
|
|
96
|
+
// Seconds-since-epoch anchor for building exp / nbf / iat claims.
|
|
97
|
+
var _nowSec = Math.floor(Date.now() / 1000); // allow:raw-byte-literal — seconds-per-ms
|
|
98
|
+
|
|
99
|
+
// Assert verifyExternal rejects `token` under `opts` with a code matching `re`.
|
|
100
|
+
async function _expectCode(label, token, opts, re) {
|
|
101
|
+
var threw = null;
|
|
102
|
+
try { await b.auth.jwt.verifyExternal(token, opts); }
|
|
103
|
+
catch (e) { threw = e; }
|
|
104
|
+
check(label, threw && re.test(threw.code || ""));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Assert jws.sign rejects `claims`/`opts` with a code matching `re`.
|
|
108
|
+
function _expectSignCode(label, claims, opts, re) {
|
|
109
|
+
var threw = null;
|
|
110
|
+
try { b.auth.jws.sign(claims, opts); }
|
|
111
|
+
catch (e) { threw = e; }
|
|
112
|
+
check(label, threw && re.test(threw.code || ""));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Read the protected-header `alg` from a compact JWS.
|
|
116
|
+
function _hdrAlg(jws) {
|
|
117
|
+
return JSON.parse(Buffer.from(jws.split(".")[0], "base64url").toString("utf8")).alg;
|
|
118
|
+
}
|
|
119
|
+
|
|
49
120
|
function testSurface() {
|
|
50
121
|
check("auth.jwt.verifyExternal exposed",
|
|
51
122
|
typeof b.auth.jwt.verifyExternal === "function");
|
|
@@ -239,6 +310,203 @@ async function testJwsSignB64CritRefused() {
|
|
|
239
310
|
e3 && /sign-unsupported-header/.test(e3.code || ""));
|
|
240
311
|
}
|
|
241
312
|
|
|
313
|
+
// ---- verifyExternal: token pre-flight rejections ----
|
|
314
|
+
// Everything refused before key resolution: bad token type/size, an
|
|
315
|
+
// operator alg outside the supported set, a JWE on the JWS verifier, a
|
|
316
|
+
// non-3-segment token, an undecodable header, a header missing alg, a crit
|
|
317
|
+
// header, and a token alg absent from the operator's allowed list.
|
|
318
|
+
async function testTokenPreflight() {
|
|
319
|
+
var jwk = _rsaPubJwk("k1");
|
|
320
|
+
await _expectCode("empty token → no-token",
|
|
321
|
+
"", { algorithms: ["RS256"], jwks: [jwk] }, /no-token/);
|
|
322
|
+
var threw = null;
|
|
323
|
+
try { await b.auth.jwt.verifyExternal(12345, { algorithms: ["RS256"], jwks: [jwk] }); }
|
|
324
|
+
catch (e) { threw = e; }
|
|
325
|
+
check("non-string token → no-token", threw && /no-token/.test(threw.code || ""));
|
|
326
|
+
await _expectCode("oversized token → token-too-large",
|
|
327
|
+
"a".repeat(17000), { algorithms: ["RS256"], jwks: [jwk] }, /token-too-large/); // allow:raw-byte-literal — exceeds 16 KiB token cap
|
|
328
|
+
await _expectCode("operator lists an unsupported alg → unsupported-alg",
|
|
329
|
+
"a.b.c", { algorithms: ["RS999"], jwks: [jwk] }, /unsupported-alg/);
|
|
330
|
+
await _expectCode("5-segment JWE token → jwe-refused",
|
|
331
|
+
"a.b.c.d.e", { algorithms: ["RS256"], jwks: [jwk] }, /jwe-refused/);
|
|
332
|
+
await _expectCode("2-segment token → malformed-jwt",
|
|
333
|
+
"a.b", { algorithms: ["RS256"], jwks: [jwk] }, /malformed-jwt/);
|
|
334
|
+
await _expectCode("header decodes to non-JSON → malformed-jwt",
|
|
335
|
+
_b64url("not json") + "." + _b64url("{}") + "." + _b64url("sig"),
|
|
336
|
+
{ algorithms: ["RS256"], jwks: [jwk] }, /malformed-jwt/);
|
|
337
|
+
await _expectCode("header missing alg → malformed-jwt",
|
|
338
|
+
_unsigned({ typ: "JWT" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
339
|
+
{ algorithms: ["RS256"], jwks: [jwk] }, /malformed-jwt/);
|
|
340
|
+
await _expectCode("crit header → unknown-crit",
|
|
341
|
+
_unsigned({ alg: "RS256", kid: "k1", crit: ["exp"] }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
342
|
+
{ algorithms: ["RS256"], jwks: [jwk] }, /unknown-crit/);
|
|
343
|
+
await _expectCode("token alg supported but not in allowed list → alg-not-allowed",
|
|
344
|
+
_unsigned({ alg: "RS384", kid: "k1" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
345
|
+
{ algorithms: ["RS256"], jwks: [jwk] }, /alg-not-allowed/);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// ---- verifyExternal: JWKS kid resolution ----
|
|
349
|
+
// Empty JWKS, no-matching-kid, and the kid-less refusal (default) vs the
|
|
350
|
+
// allowKidlessJwks opt-in that accepts a lone-key JWKS.
|
|
351
|
+
async function testKidResolution() {
|
|
352
|
+
var jwkK1 = _rsaPubJwk("k1");
|
|
353
|
+
await _expectCode("empty JWKS array → no-jwks-keys",
|
|
354
|
+
_unsigned({ alg: "RS256", kid: "k1" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
355
|
+
{ algorithms: ["RS256"], jwks: [] }, /no-jwks-keys/);
|
|
356
|
+
await _expectCode("kid with no matching JWKS key → no-matching-kid",
|
|
357
|
+
_unsigned({ alg: "RS256", kid: "absent" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
358
|
+
{ algorithms: ["RS256"], jwks: [jwkK1] }, /no-matching-kid/);
|
|
359
|
+
await _expectCode("kid-less token, multi-key JWKS → kid-required",
|
|
360
|
+
_unsigned({ alg: "RS256" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
361
|
+
{ algorithms: ["RS256"], jwks: [jwkK1, _rsaPubJwk("k2")] }, /kid-required/);
|
|
362
|
+
await _expectCode("kid-less token, single-key JWKS, no opt-in → kid-required",
|
|
363
|
+
_unsigned({ alg: "RS256" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
364
|
+
{ algorithms: ["RS256"], jwks: [_rsaPubJwk()] }, /kid-required/);
|
|
365
|
+
var rv = await b.auth.jwt.verifyExternal(
|
|
366
|
+
_mintRs256({ sub: "u1", exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
367
|
+
{ algorithms: ["RS256"], jwks: [_rsaPubJwk()], allowKidlessJwks: true });
|
|
368
|
+
check("kid-less single-key JWKS + allowKidlessJwks → verifies", rv.claims.sub === "u1");
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// ---- verifyExternal: CVE-2026-22817 alg↔kty/crv cross-check ----
|
|
372
|
+
// The resolved JWK's key type must match the header alg BEFORE it is handed
|
|
373
|
+
// to node:crypto: a missing kty, an RSA alg over an EC key, and an ES256 alg
|
|
374
|
+
// over a P-384 key are each refused.
|
|
375
|
+
async function testAlgKtyCrossCheck() {
|
|
376
|
+
await _expectCode("resolved JWK without kty → bad-jwk",
|
|
377
|
+
_unsigned({ alg: "RS256", kid: "k1" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
378
|
+
{ algorithms: ["RS256"], jwks: [{ kid: "k1" }] }, /bad-jwk/);
|
|
379
|
+
await _expectCode("alg RS256 over an EC JWK → alg-kty-mismatch",
|
|
380
|
+
_unsigned({ alg: "RS256", kid: "k1" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
381
|
+
{ algorithms: ["RS256"], jwks: [_ecJwk("P-256", "k1")] }, /alg-kty-mismatch/);
|
|
382
|
+
await _expectCode("alg ES256 over a P-384 JWK → alg-crv-mismatch",
|
|
383
|
+
_unsigned({ alg: "ES256", kid: "k1" }, { exp: _nowSec + 300 }), // allow:raw-byte-literal — 5min
|
|
384
|
+
{ algorithms: ["ES256"], jwks: [_ecJwk("P-384", "k1")] }, /alg-crv-mismatch/);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// ---- verifyExternal: signature rejection ----
|
|
388
|
+
// A byte-flipped signature over an otherwise-valid RS256 token fails
|
|
389
|
+
// verification.
|
|
390
|
+
async function testSignatureVerification() {
|
|
391
|
+
var token = _mintRs256({ sub: "u1", exp: _nowSec + 300 }, "k1"); // allow:raw-byte-literal — 5min
|
|
392
|
+
var parts = token.split(".");
|
|
393
|
+
// Invert the first signature byte — a leading byte carries meaningful
|
|
394
|
+
// bits (unlike a trailing base64url char, whose low bits are padding and
|
|
395
|
+
// can round-trip unchanged), so the tamper is deterministic.
|
|
396
|
+
var sigBuf = Buffer.from(parts[2], "base64url");
|
|
397
|
+
sigBuf[0] = sigBuf[0] ^ 0xff;
|
|
398
|
+
var tampered = parts[0] + "." + parts[1] + "." + _b64url(sigBuf);
|
|
399
|
+
await _expectCode("tampered signature → invalid-signature",
|
|
400
|
+
tampered, { algorithms: ["RS256"], jwks: [_rsaPubJwk("k1")] }, /invalid-signature/);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// ---- verifyExternal: claim validation ----
|
|
404
|
+
// exp/nbf/iat time gates, the iss cross-realm refusal (including the
|
|
405
|
+
// array-iss CVE-2025-30144 shape and a missing iss), the sub-equality check,
|
|
406
|
+
// and the clockSkewMs handling — a finite skew tolerates a just-expired
|
|
407
|
+
// token while Infinity is refused rather than silently disabling expiry.
|
|
408
|
+
async function testClaimValidation() {
|
|
409
|
+
var jwk = _rsaPubJwk("k1");
|
|
410
|
+
await _expectCode("missing exp claim → missing-exp",
|
|
411
|
+
_mintRs256({ sub: "u1" }, "k1"),
|
|
412
|
+
{ algorithms: ["RS256"], jwks: [jwk] }, /missing-exp/);
|
|
413
|
+
await _expectCode("nbf in the future → nbf-future",
|
|
414
|
+
_mintRs256({ sub: "u1", exp: _nowSec + 7200, nbf: _nowSec + 3600 }, "k1"), // allow:raw-byte-literal — 2h/1h in seconds
|
|
415
|
+
{ algorithms: ["RS256"], jwks: [jwk], now: Date.now() }, /nbf-future/);
|
|
416
|
+
await _expectCode("iat in the future → iat-future",
|
|
417
|
+
_mintRs256({ sub: "u1", exp: _nowSec + 7200, iat: _nowSec + 3600 }, "k1"), // allow:raw-byte-literal — 2h/1h in seconds
|
|
418
|
+
{ algorithms: ["RS256"], jwks: [jwk] }, /iat-future/);
|
|
419
|
+
await _expectCode("issuer mismatch → iss-mismatch",
|
|
420
|
+
_mintRs256({ sub: "u1", exp: _nowSec + 3600, iss: "https://evil.example" }, "k1"), // allow:raw-byte-literal — 1h
|
|
421
|
+
{ algorithms: ["RS256"], jwks: [jwk], issuer: "https://idp.example.com" }, /iss-mismatch/);
|
|
422
|
+
await _expectCode("array-valued iss refused → iss-mismatch",
|
|
423
|
+
_mintRs256({ sub: "u1", exp: _nowSec + 3600, iss: ["https://idp.example.com", "x"] }, "k1"), // allow:raw-byte-literal — 1h
|
|
424
|
+
{ algorithms: ["RS256"], jwks: [jwk], issuer: "https://idp.example.com" }, /iss-mismatch/);
|
|
425
|
+
await _expectCode("missing iss when issuer expected → iss-mismatch",
|
|
426
|
+
_mintRs256({ sub: "u1", exp: _nowSec + 3600 }, "k1"), // allow:raw-byte-literal — 1h
|
|
427
|
+
{ algorithms: ["RS256"], jwks: [jwk], issuer: "https://idp.example.com" }, /iss-mismatch/);
|
|
428
|
+
await _expectCode("subject mismatch → sub-mismatch",
|
|
429
|
+
_mintRs256({ sub: "u1", exp: _nowSec + 3600 }, "k1"), // allow:raw-byte-literal — 1h
|
|
430
|
+
{ algorithms: ["RS256"], jwks: [jwk], subject: "someone-else" }, /sub-mismatch/);
|
|
431
|
+
var tolerated = await b.auth.jwt.verifyExternal(
|
|
432
|
+
_mintRs256({ sub: "u1", exp: _nowSec - 10 }, "k1"), // allow:raw-byte-literal — 10s past
|
|
433
|
+
{ algorithms: ["RS256"], jwks: [jwk], clockSkewMs: 60000 }); // allow:raw-byte-literal — 60s skew in ms
|
|
434
|
+
check("finite clockSkewMs tolerates a just-expired token", tolerated.claims.sub === "u1");
|
|
435
|
+
await _expectCode("Infinity clockSkewMs refused (cannot disable expiry) → bad-clock-skew",
|
|
436
|
+
_mintRs256({ sub: "u1", exp: _nowSec - 3600 }, "k1"), // allow:raw-byte-literal — 1h past
|
|
437
|
+
{ algorithms: ["RS256"], jwks: [jwk], clockSkewMs: Infinity }, /bad-clock-skew/);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// ---- verifyExternal: keyResolver value shapes ----
|
|
441
|
+
// A keyResolver may return a KeyObject, a public JWK, a PEM string, or a PEM
|
|
442
|
+
// Buffer — each imports and verifies. (PEM / KeyObject / Buffer carry no kty
|
|
443
|
+
// surface so the alg↔kty cross-check applies to the JWK shape only.)
|
|
444
|
+
async function testKeyResolverShapes() {
|
|
445
|
+
var kp = _rsaKp();
|
|
446
|
+
var pubPem = kp.publicKey.export({ type: "spki", format: "pem" });
|
|
447
|
+
var token = _mintRs256({ sub: "u1", exp: _nowSec + 300 }, "k1"); // allow:raw-byte-literal — 5min
|
|
448
|
+
var shapes = [
|
|
449
|
+
{ name: "KeyObject", val: kp.publicKey },
|
|
450
|
+
{ name: "public JWK", val: kp.publicKey.export({ format: "jwk" }) },
|
|
451
|
+
{ name: "PEM string", val: pubPem },
|
|
452
|
+
{ name: "PEM Buffer", val: Buffer.from(pubPem) },
|
|
453
|
+
];
|
|
454
|
+
for (var i = 0; i < shapes.length; i++) {
|
|
455
|
+
var rv = await b.auth.jwt.verifyExternal(token, {
|
|
456
|
+
algorithms: ["RS256"],
|
|
457
|
+
keyResolver: _constResolver(shapes[i].val),
|
|
458
|
+
});
|
|
459
|
+
check("keyResolver returns " + shapes[i].name + " → verifies", rv.claims.sub === "u1");
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// ---- verifyExternal: keyResolver rejections ----
|
|
464
|
+
async function testKeyResolverRejections() {
|
|
465
|
+
var token = _unsigned({ alg: "RS256" }, { exp: _nowSec + 300 }); // allow:raw-byte-literal — 5min
|
|
466
|
+
await _expectCode("keyResolver returns null → no-key",
|
|
467
|
+
token, { algorithms: ["RS256"], keyResolver: _constResolver(null) }, /no-key/);
|
|
468
|
+
await _expectCode("keyResolver returns a non-key value → bad-key-shape",
|
|
469
|
+
token, { algorithms: ["RS256"], keyResolver: _constResolver(42) }, /bad-key-shape/);
|
|
470
|
+
await _expectCode("keyResolver throws → key-resolver-failed",
|
|
471
|
+
token, { algorithms: ["RS256"], keyResolver: function () { throw new Error("boom"); } },
|
|
472
|
+
/key-resolver-failed/);
|
|
473
|
+
await _expectCode("keyResolver returns unparseable PEM string → bad-pem",
|
|
474
|
+
token, { algorithms: ["RS256"], keyResolver: _constResolver("not-a-pem") }, /bad-pem/);
|
|
475
|
+
await _expectCode("keyResolver returns unparseable PEM Buffer → bad-pem",
|
|
476
|
+
token, { algorithms: ["RS256"], keyResolver: _constResolver(Buffer.from("not-a-pem")) },
|
|
477
|
+
/bad-pem/);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// ---- jws.sign: key import + alg-derivation branches ----
|
|
481
|
+
// The private-key importer (missing / unparseable / non-key / JWK) and the
|
|
482
|
+
// alg resolver (default-from-key for rsa-pss, unsupported EC curve, non-JWS
|
|
483
|
+
// key type, an explicit non-classical alg, and an explicit compatible alg).
|
|
484
|
+
async function testJwsSignKeyImport() {
|
|
485
|
+
_expectSignCode("jws.sign: missing privateKey → sign-no-key",
|
|
486
|
+
{ sub: "u" }, {}, /sign-no-key/);
|
|
487
|
+
_expectSignCode("jws.sign: unparseable PEM key → sign-bad-key",
|
|
488
|
+
{ sub: "u" }, { privateKey: "not-a-pem" }, /sign-bad-key/);
|
|
489
|
+
_expectSignCode("jws.sign: non-key value → sign-bad-key",
|
|
490
|
+
{ sub: "u" }, { privateKey: 12345 }, /sign-bad-key/);
|
|
491
|
+
var ec = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "P-256" });
|
|
492
|
+
check("jws.sign: private JWK accepted, derives ES256",
|
|
493
|
+
_hdrAlg(b.auth.jws.sign({ sub: "u" }, { privateKey: ec.privateKey.export({ format: "jwk" }) })) === "ES256");
|
|
494
|
+
_expectSignCode("jws.sign: EC secp256k1 has no JWS alg → sign-key-unsupported",
|
|
495
|
+
{ sub: "u" },
|
|
496
|
+
{ privateKey: nodeCrypto.generateKeyPairSync("ec", { namedCurve: "secp256k1" }).privateKey },
|
|
497
|
+
/sign-key-unsupported/);
|
|
498
|
+
var pss = nodeCrypto.generateKeyPairSync("rsa-pss", { modulusLength: 2048 }); // allow:raw-byte-literal — RSA modulus bits
|
|
499
|
+
check("jws.sign: rsa-pss key defaults to PS256",
|
|
500
|
+
_hdrAlg(b.auth.jws.sign({ sub: "u" }, { privateKey: pss.privateKey })) === "PS256");
|
|
501
|
+
_expectSignCode("jws.sign: x25519 (non-signing) key → sign-key-unsupported",
|
|
502
|
+
{ sub: "u" }, { privateKey: nodeCrypto.generateKeyPairSync("x25519").privateKey },
|
|
503
|
+
/sign-key-unsupported/);
|
|
504
|
+
_expectSignCode("jws.sign: explicit non-classical alg → sign-alg-unsupported",
|
|
505
|
+
{ sub: "u" }, { privateKey: _rsaKp().privateKey, alg: "ML-DSA-65" }, /sign-alg-unsupported/);
|
|
506
|
+
check("jws.sign: explicit compatible alg RS512 honored",
|
|
507
|
+
_hdrAlg(b.auth.jws.sign({ sub: "u" }, { privateKey: _rsaKp().privateKey, alg: "RS512" })) === "RS512");
|
|
508
|
+
}
|
|
509
|
+
|
|
242
510
|
async function run() {
|
|
243
511
|
testSurface();
|
|
244
512
|
await testAlgorithmsRequired();
|
|
@@ -253,6 +521,14 @@ async function run() {
|
|
|
253
521
|
await testJwsSignRefusals();
|
|
254
522
|
await testJwsSignHeaderCannotOverrideAlg();
|
|
255
523
|
await testJwsSignB64CritRefused();
|
|
524
|
+
await testTokenPreflight();
|
|
525
|
+
await testKidResolution();
|
|
526
|
+
await testAlgKtyCrossCheck();
|
|
527
|
+
await testSignatureVerification();
|
|
528
|
+
await testClaimValidation();
|
|
529
|
+
await testKeyResolverShapes();
|
|
530
|
+
await testKeyResolverRejections();
|
|
531
|
+
await testJwsSignKeyImport();
|
|
256
532
|
}
|
|
257
533
|
|
|
258
534
|
module.exports = { run: run };
|
|
Binary file
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.logStream — dispatcher introspection (listSinks), the debug level
|
|
6
|
+
* wrapper, and env-driven boot (bootFromEnv).
|
|
7
|
+
*
|
|
8
|
+
* Run standalone: `node test/layer-0-primitives/log-stream.test.js`
|
|
9
|
+
* Or via smoke: `node test/smoke.js`
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
var helpers = require("../helpers");
|
|
13
|
+
var b = helpers.b;
|
|
14
|
+
var check = helpers.check;
|
|
15
|
+
var fs = helpers.fs;
|
|
16
|
+
var os = helpers.os;
|
|
17
|
+
var path = helpers.path;
|
|
18
|
+
|
|
19
|
+
var OTLP_URL = "https://collector.example.com:4318/v1/logs";
|
|
20
|
+
|
|
21
|
+
function _resetLogStream() { b.logStream._resetForTest(); }
|
|
22
|
+
function _mkTmp() { return fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-logstream-")); }
|
|
23
|
+
function _rmTmp(dir) { try { fs.rmSync(dir, { recursive: true, force: true }); } catch (_e) { /* best effort */ } }
|
|
24
|
+
|
|
25
|
+
// ---- listSinks ----
|
|
26
|
+
|
|
27
|
+
function testListSinksEmptyBeforeInit() {
|
|
28
|
+
_resetLogStream();
|
|
29
|
+
var snap = b.logStream.listSinks();
|
|
30
|
+
check("logStream.listSinks: returns [] before init (health endpoints call it unconditionally)",
|
|
31
|
+
Array.isArray(snap) && snap.length === 0);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function testListSinksReportsConfiguredSinks() {
|
|
35
|
+
_resetLogStream();
|
|
36
|
+
var dir = _mkTmp();
|
|
37
|
+
try {
|
|
38
|
+
b.logStream.init({
|
|
39
|
+
minLevel: "info",
|
|
40
|
+
sinks: {
|
|
41
|
+
file: { protocol: "local", dir: dir },
|
|
42
|
+
remote: { protocol: "otlp", url: OTLP_URL, serviceName: "checkout" },
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
var snap = b.logStream.listSinks();
|
|
46
|
+
check("listSinks: one descriptor per configured sink", snap.length === 2);
|
|
47
|
+
var byName = {};
|
|
48
|
+
snap.forEach(function (d) { byName[d.name] = d; });
|
|
49
|
+
check("listSinks: descriptor carries name + protocol (local)",
|
|
50
|
+
byName.file && byName.file.protocol === "local");
|
|
51
|
+
check("listSinks: a sink without a stats() method reports stats: null",
|
|
52
|
+
byName.file.stats === null);
|
|
53
|
+
check("listSinks: descriptor carries name + protocol (otlp)",
|
|
54
|
+
byName.remote && byName.remote.protocol === "otlp");
|
|
55
|
+
check("listSinks: a sink exposing stats() reports through it",
|
|
56
|
+
byName.remote.stats && typeof byName.remote.stats === "object" &&
|
|
57
|
+
byName.remote.stats.url === OTLP_URL);
|
|
58
|
+
} finally {
|
|
59
|
+
await b.logStream.shutdown();
|
|
60
|
+
_resetLogStream();
|
|
61
|
+
_rmTmp(dir);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ---- debug ----
|
|
66
|
+
|
|
67
|
+
async function testDebugEmitsWhenMinLevelDebug() {
|
|
68
|
+
_resetLogStream();
|
|
69
|
+
var dir = _mkTmp();
|
|
70
|
+
try {
|
|
71
|
+
b.logStream.init({ minLevel: "debug", sinks: { file: { protocol: "local", dir: dir } } });
|
|
72
|
+
b.logStream.debug("cache lookup", { shard: 3, hit: false });
|
|
73
|
+
await b.logStream.shutdown(); // drains in-flight fire-and-forget emits before close
|
|
74
|
+
var body = fs.readFileSync(path.join(dir, "blamejs.log"), "utf8");
|
|
75
|
+
var rows = body.trim().split("\n").filter(Boolean).map(function (l) { return JSON.parse(l); });
|
|
76
|
+
check("logStream.debug: record reaches the sink at minLevel debug", rows.length === 1);
|
|
77
|
+
check("logStream.debug: record level is 'debug'", rows[0].level === "debug");
|
|
78
|
+
check("logStream.debug: message preserved", rows[0].message === "cache lookup");
|
|
79
|
+
check("logStream.debug: non-sensitive meta preserved through redaction", rows[0].meta.shard === 3);
|
|
80
|
+
} finally {
|
|
81
|
+
_resetLogStream();
|
|
82
|
+
_rmTmp(dir);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function testDebugDroppedBelowDefaultMinLevel() {
|
|
87
|
+
_resetLogStream();
|
|
88
|
+
var dir = _mkTmp();
|
|
89
|
+
try {
|
|
90
|
+
// Default minLevel is "info" — debug records drop before the sink.
|
|
91
|
+
b.logStream.init({ sinks: { file: { protocol: "local", dir: dir } } });
|
|
92
|
+
b.logStream.debug("debug-should-drop", { shard: 1 });
|
|
93
|
+
b.logStream.info("info-should-keep", { shard: 2 });
|
|
94
|
+
await b.logStream.shutdown();
|
|
95
|
+
var body = fs.readFileSync(path.join(dir, "blamejs.log"), "utf8");
|
|
96
|
+
check("logStream.debug: dropped below default minLevel (never written)",
|
|
97
|
+
body.indexOf("debug-should-drop") === -1);
|
|
98
|
+
check("logStream.debug: sibling info at/above minLevel is written",
|
|
99
|
+
body.indexOf("info-should-keep") !== -1);
|
|
100
|
+
} finally {
|
|
101
|
+
_resetLogStream();
|
|
102
|
+
_rmTmp(dir);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ---- bootFromEnv ----
|
|
107
|
+
|
|
108
|
+
function testBootFromEnvSkipsWhenProtocolUnset() {
|
|
109
|
+
_resetLogStream();
|
|
110
|
+
var wired = b.logStream.bootFromEnv({ env: {} });
|
|
111
|
+
check("logStream.bootFromEnv: returns false when BLAMEJS_LOG_STREAM_PROTOCOL unset", wired === false);
|
|
112
|
+
check("logStream.bootFromEnv: no sink wired on skip", b.logStream.listSinks().length === 0);
|
|
113
|
+
_resetLogStream();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function testBootFromEnvWiresSinkFromProcessEnv() {
|
|
117
|
+
_resetLogStream();
|
|
118
|
+
// Exercise the default process.env branch (no opts.env). Snapshot the
|
|
119
|
+
// exact keys touched and restore them in finally so the test leaks no env.
|
|
120
|
+
var KEYS = [
|
|
121
|
+
"BLAMEJS_LOG_STREAM_PROTOCOL",
|
|
122
|
+
"BLAMEJS_LOG_STREAM_URL",
|
|
123
|
+
"BLAMEJS_LOG_STREAM_SERVICE_NAME",
|
|
124
|
+
"BLAMEJS_LOG_STREAM_MIN_LEVEL",
|
|
125
|
+
];
|
|
126
|
+
var saved = {};
|
|
127
|
+
KEYS.forEach(function (k) { saved[k] = process.env[k]; });
|
|
128
|
+
try {
|
|
129
|
+
process.env.BLAMEJS_LOG_STREAM_PROTOCOL = "otlp";
|
|
130
|
+
process.env.BLAMEJS_LOG_STREAM_URL = OTLP_URL;
|
|
131
|
+
process.env.BLAMEJS_LOG_STREAM_SERVICE_NAME = "checkout";
|
|
132
|
+
process.env.BLAMEJS_LOG_STREAM_MIN_LEVEL = "info";
|
|
133
|
+
|
|
134
|
+
var wired = b.logStream.bootFromEnv(); // reads process.env
|
|
135
|
+
check("bootFromEnv: returns true when protocol set", wired === true);
|
|
136
|
+
var snap = b.logStream.listSinks();
|
|
137
|
+
check("bootFromEnv: wires exactly one sink named 'primary'",
|
|
138
|
+
snap.length === 1 && snap[0].name === "primary");
|
|
139
|
+
check("bootFromEnv: sink protocol matches env", snap[0].protocol === "otlp");
|
|
140
|
+
check("bootFromEnv: otlp sink carries the configured URL",
|
|
141
|
+
snap[0].stats && snap[0].stats.url === OTLP_URL);
|
|
142
|
+
} finally {
|
|
143
|
+
await b.logStream.shutdown();
|
|
144
|
+
KEYS.forEach(function (k) {
|
|
145
|
+
if (saved[k] === undefined) delete process.env[k];
|
|
146
|
+
else process.env[k] = saved[k];
|
|
147
|
+
});
|
|
148
|
+
_resetLogStream();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async function testBootFromEnvWiresLocalSinkEndToEnd() {
|
|
153
|
+
_resetLogStream();
|
|
154
|
+
var dir = _mkTmp();
|
|
155
|
+
try {
|
|
156
|
+
// The local sink is directory-based; BLAMEJS_LOG_STREAM_PATH names that
|
|
157
|
+
// directory. bootFromEnv must map it to the sink's `dir` config so the
|
|
158
|
+
// documented `local` protocol actually wires (not throw at init).
|
|
159
|
+
var wired = b.logStream.bootFromEnv({
|
|
160
|
+
env: {
|
|
161
|
+
BLAMEJS_LOG_STREAM_PROTOCOL: "local",
|
|
162
|
+
BLAMEJS_LOG_STREAM_PATH: dir,
|
|
163
|
+
BLAMEJS_LOG_STREAM_MIN_LEVEL: "debug",
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
check("bootFromEnv: local protocol wires a sink from BLAMEJS_LOG_STREAM_PATH", wired === true);
|
|
167
|
+
var snap = b.logStream.listSinks();
|
|
168
|
+
check("bootFromEnv: local sink registered", snap.length === 1 && snap[0].protocol === "local");
|
|
169
|
+
|
|
170
|
+
b.logStream.info("boot-from-env-local", { shard: 7 });
|
|
171
|
+
await b.logStream.shutdown();
|
|
172
|
+
var body = fs.readFileSync(path.join(dir, "blamejs.log"), "utf8");
|
|
173
|
+
check("bootFromEnv: the env-wired local sink actually wrote the record",
|
|
174
|
+
body.indexOf("boot-from-env-local") !== -1);
|
|
175
|
+
} finally {
|
|
176
|
+
_resetLogStream();
|
|
177
|
+
_rmTmp(dir);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function testBootFromEnvThrowsUnknownProtocol() {
|
|
182
|
+
_resetLogStream();
|
|
183
|
+
var threw = null;
|
|
184
|
+
try { b.logStream.bootFromEnv({ env: { BLAMEJS_LOG_STREAM_PROTOCOL: "kafka" } }); }
|
|
185
|
+
catch (e) { threw = e; }
|
|
186
|
+
check("bootFromEnv: unknown protocol throws a loud boot error",
|
|
187
|
+
threw && /not one of/.test(threw.message));
|
|
188
|
+
_resetLogStream();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// #493 — emit() must redact secrets embedded in the free-text `message`, not
|
|
192
|
+
// just structured `meta`. And it must scrub an EMBEDDED token in a longer
|
|
193
|
+
// string (the built-in ^…$-anchored value detectors miss those) while keeping
|
|
194
|
+
// the surrounding message.
|
|
195
|
+
async function testMessageRedactionScrubsEmbeddedSecrets() {
|
|
196
|
+
_resetLogStream();
|
|
197
|
+
var dir = _mkTmp();
|
|
198
|
+
try {
|
|
199
|
+
b.logStream.init({ sinks: { file: { protocol: "local", dir: dir } } });
|
|
200
|
+
// Direct coverage of the primitive (in addition to the via-emit path below).
|
|
201
|
+
check("redact.redactText scrubs an embedded AWS key, keeps surrounding text",
|
|
202
|
+
b.redact.redactText("k=AKIAIOSFODNN7EXAMPLE done").indexOf("AKIAIOSFODNN7EXAMPLE") === -1 &&
|
|
203
|
+
b.redact.redactText("k=AKIAIOSFODNN7EXAMPLE done").indexOf("done") !== -1);
|
|
204
|
+
b.logStream.error("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJib2IifQ.c2lnbmF0dXJl"); // bare JWT
|
|
205
|
+
b.logStream.warn("checkout retry with token=AKIAIOSFODNN7EXAMPLE for order 42"); // embedded AWS key
|
|
206
|
+
b.logStream.info("db connect postgres://app:s3cr3tPASS@db.internal:5432/app"); // URL-embedded password
|
|
207
|
+
await b.logStream.shutdown();
|
|
208
|
+
var body = fs.readFileSync(path.join(dir, "blamejs.log"), "utf8");
|
|
209
|
+
check("logStream: a JWT in the message is redacted",
|
|
210
|
+
body.indexOf("eyJhbGciOiJIUzI1NiJ9") === -1);
|
|
211
|
+
check("logStream: an embedded AWS key is redacted while surrounding text is kept",
|
|
212
|
+
body.indexOf("AKIAIOSFODNN7EXAMPLE") === -1 &&
|
|
213
|
+
body.indexOf("checkout retry") !== -1 && body.indexOf("order 42") !== -1);
|
|
214
|
+
check("logStream: a URL-embedded password is redacted while the rest is kept",
|
|
215
|
+
body.indexOf("s3cr3tPASS") === -1 && body.indexOf("db connect") !== -1);
|
|
216
|
+
} finally {
|
|
217
|
+
_resetLogStream();
|
|
218
|
+
_rmTmp(dir);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
async function run() {
|
|
223
|
+
testListSinksEmptyBeforeInit();
|
|
224
|
+
await testListSinksReportsConfiguredSinks();
|
|
225
|
+
await testDebugEmitsWhenMinLevelDebug();
|
|
226
|
+
await testDebugDroppedBelowDefaultMinLevel();
|
|
227
|
+
testBootFromEnvSkipsWhenProtocolUnset();
|
|
228
|
+
await testBootFromEnvWiresSinkFromProcessEnv();
|
|
229
|
+
await testBootFromEnvWiresLocalSinkEndToEnd();
|
|
230
|
+
testBootFromEnvThrowsUnknownProtocol();
|
|
231
|
+
await testMessageRedactionScrubsEmbeddedSecrets();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
module.exports = { run: run };
|
|
235
|
+
|
|
236
|
+
if (require.main === module) {
|
|
237
|
+
run().then(
|
|
238
|
+
function () { console.log("log-stream tests passed"); process.exit(0); },
|
|
239
|
+
function (e) { console.error(e); process.exit(1); }
|
|
240
|
+
);
|
|
241
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.log.makeViaOrFallback — operator-log routing closure that falls
|
|
6
|
+
* back to a per-module logger when the operator didn't pass one.
|
|
7
|
+
*
|
|
8
|
+
* Run standalone: `node test/layer-0-primitives/log.test.js`
|
|
9
|
+
* Or via smoke: `node test/smoke.js`
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
var helpers = require("../helpers");
|
|
13
|
+
var b = helpers.b;
|
|
14
|
+
var check = helpers.check;
|
|
15
|
+
|
|
16
|
+
// A recording fallback logger with the boot()-shape surface
|
|
17
|
+
// (info/warn/error take a single pre-formatted line).
|
|
18
|
+
function _recordingFallback() {
|
|
19
|
+
var lines = [];
|
|
20
|
+
return {
|
|
21
|
+
lines: lines,
|
|
22
|
+
info: function (line) { lines.push(["info", line]); },
|
|
23
|
+
warn: function (line) { lines.push(["warn", line]); },
|
|
24
|
+
error: function (line) { lines.push(["error", line]); },
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function testFallbackFiresWhenOperatorLogAbsent() {
|
|
29
|
+
var fb = _recordingFallback();
|
|
30
|
+
var via = b.log.makeViaOrFallback(null, fb);
|
|
31
|
+
via("error", "build-failed", { reason: "missing entrypoint" });
|
|
32
|
+
check("makeViaOrFallback: routes to fallback.error with a formatted line",
|
|
33
|
+
fb.lines.length === 1 &&
|
|
34
|
+
fb.lines[0][0] === "error" &&
|
|
35
|
+
fb.lines[0][1] === 'build-failed {"reason":"missing entrypoint"}');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function testFallbackLevelMapping() {
|
|
39
|
+
var fb = _recordingFallback();
|
|
40
|
+
var via = b.log.makeViaOrFallback(null, fb);
|
|
41
|
+
via("warn", "warned"); // → fallback.warn
|
|
42
|
+
via("info", "informed"); // → fallback.info
|
|
43
|
+
via("fatal", "fatal-line"); // fatal + error both route to fallback.error
|
|
44
|
+
check("makeViaOrFallback: warn → fallback.warn", fb.lines[0][0] === "warn" && fb.lines[0][1] === "warned");
|
|
45
|
+
check("makeViaOrFallback: info → fallback.info", fb.lines[1][0] === "info" && fb.lines[1][1] === "informed");
|
|
46
|
+
check("makeViaOrFallback: fatal maps to fallback.error", fb.lines[2][0] === "error" && fb.lines[2][1] === "fatal-line");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function testOperatorLogWinsWhenLevelPresent() {
|
|
50
|
+
var fb = _recordingFallback();
|
|
51
|
+
var opCalls = [];
|
|
52
|
+
var operatorLog = { error: function (message, fields) { opCalls.push([message, fields]); } };
|
|
53
|
+
var via = b.log.makeViaOrFallback(operatorLog, fb);
|
|
54
|
+
via("error", "op-msg", { a: 1 });
|
|
55
|
+
check("makeViaOrFallback: operator log receives (message, fields) verbatim",
|
|
56
|
+
opCalls.length === 1 && opCalls[0][0] === "op-msg" && opCalls[0][1].a === 1);
|
|
57
|
+
check("makeViaOrFallback: fallback NOT called when operator handles the level",
|
|
58
|
+
fb.lines.length === 0);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function testFallbackFiresWhenOperatorMissingLevel() {
|
|
62
|
+
var fb = _recordingFallback();
|
|
63
|
+
// Operator log exposes only info(); an error() call must fall back.
|
|
64
|
+
var operatorLog = { info: function () {} };
|
|
65
|
+
var via = b.log.makeViaOrFallback(operatorLog, fb);
|
|
66
|
+
via("error", "no-operator-error-method");
|
|
67
|
+
check("makeViaOrFallback: falls back when operator lacks the requested level",
|
|
68
|
+
fb.lines.length === 1 && fb.lines[0][0] === "error" &&
|
|
69
|
+
fb.lines[0][1] === "no-operator-error-method");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function testOperatorLogThrowIsSwallowed() {
|
|
73
|
+
var fb = _recordingFallback();
|
|
74
|
+
var operatorLog = { error: function () { throw new Error("operator log blew up"); } };
|
|
75
|
+
var via = b.log.makeViaOrFallback(operatorLog, fb);
|
|
76
|
+
var threw = null;
|
|
77
|
+
try { via("error", "boom"); } catch (e) { threw = e; }
|
|
78
|
+
check("makeViaOrFallback: a throwing operator log is swallowed (best-effort)", threw === null);
|
|
79
|
+
check("makeViaOrFallback: no fallback double-emit after operator log threw", fb.lines.length === 0);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function testMessageWithoutFieldsFormatsBareLine() {
|
|
83
|
+
var fb = _recordingFallback();
|
|
84
|
+
var via = b.log.makeViaOrFallback(null, fb);
|
|
85
|
+
via("info", "no-fields-here"); // no fields arg → line is the message verbatim
|
|
86
|
+
check("makeViaOrFallback: a fields-less call formats the bare message",
|
|
87
|
+
fb.lines.length === 1 && fb.lines[0][1] === "no-fields-here");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function run() {
|
|
91
|
+
testFallbackFiresWhenOperatorLogAbsent();
|
|
92
|
+
testFallbackLevelMapping();
|
|
93
|
+
testOperatorLogWinsWhenLevelPresent();
|
|
94
|
+
testFallbackFiresWhenOperatorMissingLevel();
|
|
95
|
+
testOperatorLogThrowIsSwallowed();
|
|
96
|
+
testMessageWithoutFieldsFormatsBareLine();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
module.exports = { run: run };
|
|
100
|
+
|
|
101
|
+
if (require.main === module) {
|
|
102
|
+
run().then(
|
|
103
|
+
function () { console.log("log tests passed"); process.exit(0); },
|
|
104
|
+
function (e) { console.error(e); process.exit(1); }
|
|
105
|
+
);
|
|
106
|
+
}
|