@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
|
@@ -1966,6 +1966,223 @@ async function testAuthDpopPqcMlDsa() {
|
|
|
1966
1966
|
check("ML-DSA-87 jwk.alg=ML-DSA-87", rv.header.jwk.alg === "ML-DSA-87");
|
|
1967
1967
|
}
|
|
1968
1968
|
|
|
1969
|
+
// DPoP verify/buildProof adversarial + error-branch coverage. These drive
|
|
1970
|
+
// the public b.auth.dpop surface an operator calls (buildProof / verify /
|
|
1971
|
+
// thumbprint) through every documented failure mode: malformed / oversize /
|
|
1972
|
+
// omitted-required-opt input, header-level refusals (typ / alg / jwk / crit),
|
|
1973
|
+
// signature tampering, payload-claim omissions, nonce binding, replay-store
|
|
1974
|
+
// shape, buildProof input validation, and thumbprint kty gating.
|
|
1975
|
+
|
|
1976
|
+
function _dpopB64url(x) {
|
|
1977
|
+
return Buffer.from(x).toString("base64")
|
|
1978
|
+
.replace(/=+$/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1981
|
+
// Craft a proof segment triple with a caller-supplied header/payload and a
|
|
1982
|
+
// throwaway signature — for the verify branches that run BEFORE the signature
|
|
1983
|
+
// is checked (typ / alg / jwk / crit / structural malformation).
|
|
1984
|
+
function _dpopCraft(header, payload, sig) {
|
|
1985
|
+
return _dpopB64url(JSON.stringify(header)) + "." +
|
|
1986
|
+
_dpopB64url(JSON.stringify(payload)) + "." + (sig || "AA");
|
|
1987
|
+
}
|
|
1988
|
+
|
|
1989
|
+
// Sign a caller-supplied header+payload with a real P-256 key (ES256,
|
|
1990
|
+
// ieee-p1363 like the framework emits) — for the payload-claim branches that
|
|
1991
|
+
// run AFTER signature verification, so they must reach a genuinely valid sig.
|
|
1992
|
+
function _dpopSignES256(privateKey, header, payload) {
|
|
1993
|
+
var nodeCrypto = require("crypto");
|
|
1994
|
+
var si = _dpopB64url(JSON.stringify(header)) + "." + _dpopB64url(JSON.stringify(payload));
|
|
1995
|
+
var sig = nodeCrypto.sign("sha256", Buffer.from(si, "ascii"),
|
|
1996
|
+
{ key: privateKey, dsaEncoding: "ieee-p1363" });
|
|
1997
|
+
return si + "." + _dpopB64url(sig);
|
|
1998
|
+
}
|
|
1999
|
+
|
|
2000
|
+
async function testAuthDpopVerifyMalformedInputs() {
|
|
2001
|
+
var d = b.auth.dpop;
|
|
2002
|
+
var o = { htm: "GET", htu: "https://x/y" };
|
|
2003
|
+
async function code(proof, opts) {
|
|
2004
|
+
try { await d.verify(proof, opts); return null; }
|
|
2005
|
+
catch (e) { return e && e.code; }
|
|
2006
|
+
}
|
|
2007
|
+
|
|
2008
|
+
check("dpop.verify: empty proof → auth-dpop/no-proof",
|
|
2009
|
+
(await code("", o)) === "auth-dpop/no-proof");
|
|
2010
|
+
check("dpop.verify: non-string proof → auth-dpop/no-proof",
|
|
2011
|
+
(await code(null, o)) === "auth-dpop/no-proof");
|
|
2012
|
+
check("dpop.verify: oversize proof → auth-dpop/proof-too-large",
|
|
2013
|
+
(await code("x".repeat(96 * 1024 + 1), o)) === "auth-dpop/proof-too-large");
|
|
2014
|
+
check("dpop.verify: omitted opts.htm → auth-dpop/bad-htm",
|
|
2015
|
+
(await code("a.b.c", { htu: "https://x/y" })) === "auth-dpop/bad-htm");
|
|
2016
|
+
check("dpop.verify: omitted opts.htu → auth-dpop/bad-htu",
|
|
2017
|
+
(await code("a.b.c", { htm: "GET" })) === "auth-dpop/bad-htu");
|
|
2018
|
+
check("dpop.verify: iatWindowSec<=0 → auth-dpop/bad-iat-window",
|
|
2019
|
+
(await code("a.b.c", { htm: "GET", htu: "https://x/y", iatWindowSec: 0 })) === "auth-dpop/bad-iat-window");
|
|
2020
|
+
check("dpop.verify: non-finite iatWindowSec → auth-dpop/bad-iat-window",
|
|
2021
|
+
(await code("a.b.c", { htm: "GET", htu: "https://x/y", iatWindowSec: Infinity })) === "auth-dpop/bad-iat-window");
|
|
2022
|
+
check("dpop.verify: wrong dot-part count → auth-dpop/malformed",
|
|
2023
|
+
(await code("a.b", o)) === "auth-dpop/malformed");
|
|
2024
|
+
check("dpop.verify: header not base64url-JSON → auth-dpop/malformed",
|
|
2025
|
+
(await code(_dpopB64url("not json") + "." + _dpopB64url("{}") + ".AA", o)) === "auth-dpop/malformed");
|
|
2026
|
+
check("dpop.verify: payload not base64url-JSON → auth-dpop/malformed",
|
|
2027
|
+
(await code(_dpopB64url(JSON.stringify({ typ: "dpop+jwt", alg: "ES256", jwk: {} })) + "." +
|
|
2028
|
+
_dpopB64url("nope}") + ".AA", o)) === "auth-dpop/malformed");
|
|
2029
|
+
check("dpop.verify: header is JSON null (not object) → auth-dpop/malformed",
|
|
2030
|
+
(await code(_dpopB64url("null") + "." + _dpopB64url("{}") + ".AA", o)) === "auth-dpop/malformed");
|
|
2031
|
+
check("dpop.verify: payload is JSON null (not object) → auth-dpop/malformed",
|
|
2032
|
+
(await code(_dpopB64url(JSON.stringify({ typ: "dpop+jwt", alg: "ES256", jwk: {} })) + "." +
|
|
2033
|
+
_dpopB64url("null") + ".AA", o)) === "auth-dpop/malformed");
|
|
2034
|
+
}
|
|
2035
|
+
|
|
2036
|
+
async function testAuthDpopVerifyHeaderChecks() {
|
|
2037
|
+
var d = b.auth.dpop;
|
|
2038
|
+
var nodeCrypto = require("crypto");
|
|
2039
|
+
var ec = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "prime256v1" });
|
|
2040
|
+
var pubJwk = ec.publicKey.export({ format: "jwk" });
|
|
2041
|
+
var o = { htm: "GET", htu: "https://x/y" };
|
|
2042
|
+
var payload = { jti: "j", htm: "GET", htu: "https://x/y", iat: Math.floor(Date.now() / 1000) };
|
|
2043
|
+
async function code(proof, opts) {
|
|
2044
|
+
try { await d.verify(proof, opts || o); return null; }
|
|
2045
|
+
catch (e) { return e && e.code; }
|
|
2046
|
+
}
|
|
2047
|
+
|
|
2048
|
+
check("dpop.verify: header.typ != dpop+jwt → auth-dpop/bad-typ",
|
|
2049
|
+
(await code(_dpopCraft({ typ: "JWT", alg: "ES256", jwk: pubJwk }, payload))) === "auth-dpop/bad-typ");
|
|
2050
|
+
check("dpop.verify: non-string header.alg → auth-dpop/malformed",
|
|
2051
|
+
(await code(_dpopCraft({ typ: "dpop+jwt", alg: 123, jwk: pubJwk }, payload))) === "auth-dpop/malformed");
|
|
2052
|
+
check("dpop.verify: token alg absent from allowlist → auth-dpop/alg-not-allowed",
|
|
2053
|
+
(await code(_dpopCraft({ typ: "dpop+jwt", alg: "ES384", jwk: pubJwk }, payload),
|
|
2054
|
+
{ htm: "GET", htu: "https://x/y", algorithms: ["ES256"] })) === "auth-dpop/alg-not-allowed");
|
|
2055
|
+
check("dpop.verify: unsupported alg in opts.algorithms → auth-dpop/unsupported-alg",
|
|
2056
|
+
(await code("a.b.c", { htm: "GET", htu: "https://x/y", algorithms: ["FOO"] })) === "auth-dpop/unsupported-alg");
|
|
2057
|
+
check("dpop.verify: missing header.jwk → auth-dpop/missing-jwk",
|
|
2058
|
+
(await code(_dpopCraft({ typ: "dpop+jwt", alg: "ES256" }, payload))) === "auth-dpop/missing-jwk");
|
|
2059
|
+
check("dpop.verify: non-object header.jwk → auth-dpop/missing-jwk",
|
|
2060
|
+
(await code(_dpopCraft({ typ: "dpop+jwt", alg: "ES256", jwk: "nope" }, payload))) === "auth-dpop/missing-jwk");
|
|
2061
|
+
check("dpop.verify: 'crit' header declared → auth-dpop/unknown-crit",
|
|
2062
|
+
(await code(_dpopCraft({ typ: "dpop+jwt", alg: "ES256", jwk: pubJwk, crit: ["b64"] }, payload))) === "auth-dpop/unknown-crit");
|
|
2063
|
+
}
|
|
2064
|
+
|
|
2065
|
+
async function testAuthDpopVerifyBadSignature() {
|
|
2066
|
+
var d = b.auth.dpop;
|
|
2067
|
+
var nodeCrypto = require("crypto");
|
|
2068
|
+
var ec = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "prime256v1" });
|
|
2069
|
+
var proof = await d.buildProof({ htm: "GET", htu: "https://x/y", privateKey: ec.privateKey });
|
|
2070
|
+
var parts = proof.split(".");
|
|
2071
|
+
// Flip a byte of the (validly base64url) signature → decodes fine, verifies
|
|
2072
|
+
// false → invalid-signature (NOT a base64url-decode malformed error).
|
|
2073
|
+
var sigBuf = Buffer.from(parts[2].replace(/-/g, "+").replace(/_/g, "/"), "base64");
|
|
2074
|
+
sigBuf[0] = sigBuf[0] ^ 0xff;
|
|
2075
|
+
parts[2] = sigBuf.toString("base64").replace(/=+$/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
2076
|
+
var threw = null;
|
|
2077
|
+
try { await d.verify(parts.join("."), { htm: "GET", htu: "https://x/y" }); }
|
|
2078
|
+
catch (e) { threw = e; }
|
|
2079
|
+
check("dpop.verify: tampered signature → auth-dpop/invalid-signature",
|
|
2080
|
+
threw && threw.code === "auth-dpop/invalid-signature");
|
|
2081
|
+
}
|
|
2082
|
+
|
|
2083
|
+
async function testAuthDpopVerifyPayloadChecks() {
|
|
2084
|
+
var d = b.auth.dpop;
|
|
2085
|
+
var nodeCrypto = require("crypto");
|
|
2086
|
+
var ec = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "prime256v1" });
|
|
2087
|
+
var hdr = { typ: "dpop+jwt", alg: "ES256", jwk: ec.publicKey.export({ format: "jwk" }) };
|
|
2088
|
+
var now = Math.floor(Date.now() / 1000);
|
|
2089
|
+
var o = { htm: "GET", htu: "https://x/y" };
|
|
2090
|
+
async function code(payload, opts) {
|
|
2091
|
+
try { await d.verify(_dpopSignES256(ec.privateKey, hdr, payload), opts || o); return null; }
|
|
2092
|
+
catch (e) { return e && e.code; }
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
check("dpop.verify: missing payload.jti → auth-dpop/missing-jti",
|
|
2096
|
+
(await code({ htm: "GET", htu: "https://x/y", iat: now })) === "auth-dpop/missing-jti");
|
|
2097
|
+
check("dpop.verify: missing payload.htm → auth-dpop/bad-htm",
|
|
2098
|
+
(await code({ jti: "j", htu: "https://x/y", iat: now })) === "auth-dpop/bad-htm");
|
|
2099
|
+
check("dpop.verify: missing payload.htu → auth-dpop/bad-htu",
|
|
2100
|
+
(await code({ jti: "j", htm: "GET", iat: now })) === "auth-dpop/bad-htu");
|
|
2101
|
+
check("dpop.verify: non-number payload.iat → auth-dpop/bad-iat",
|
|
2102
|
+
(await code({ jti: "j", htm: "GET", htu: "https://x/y", iat: "soon" })) === "auth-dpop/bad-iat");
|
|
2103
|
+
}
|
|
2104
|
+
|
|
2105
|
+
async function testAuthDpopNonceBinding() {
|
|
2106
|
+
var d = b.auth.dpop;
|
|
2107
|
+
var nodeCrypto = require("crypto");
|
|
2108
|
+
var ec = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "prime256v1" });
|
|
2109
|
+
|
|
2110
|
+
var withNonce = await d.buildProof({
|
|
2111
|
+
htm: "GET", htu: "https://x/y", privateKey: ec.privateKey, nonce: "srv-nonce-1",
|
|
2112
|
+
});
|
|
2113
|
+
var ok = await d.verify(withNonce, { htm: "GET", htu: "https://x/y", nonce: "srv-nonce-1" });
|
|
2114
|
+
check("dpop.verify: matching nonce accepted", ok.payload.nonce === "srv-nonce-1");
|
|
2115
|
+
|
|
2116
|
+
var threwMis = null;
|
|
2117
|
+
try { await d.verify(withNonce, { htm: "GET", htu: "https://x/y", nonce: "srv-nonce-2" }); }
|
|
2118
|
+
catch (e) { threwMis = e; }
|
|
2119
|
+
check("dpop.verify: nonce mismatch → auth-dpop/nonce-mismatch",
|
|
2120
|
+
threwMis && threwMis.code === "auth-dpop/nonce-mismatch");
|
|
2121
|
+
|
|
2122
|
+
var noNonce = await d.buildProof({ htm: "GET", htu: "https://x/y", privateKey: ec.privateKey });
|
|
2123
|
+
var threwMissing = null;
|
|
2124
|
+
try { await d.verify(noNonce, { htm: "GET", htu: "https://x/y", nonce: "srv-nonce-1" }); }
|
|
2125
|
+
catch (e) { threwMissing = e; }
|
|
2126
|
+
check("dpop.verify: expected nonce absent from proof → auth-dpop/missing-nonce",
|
|
2127
|
+
threwMissing && threwMissing.code === "auth-dpop/missing-nonce");
|
|
2128
|
+
}
|
|
2129
|
+
|
|
2130
|
+
async function testAuthDpopVerifyBadReplayStore() {
|
|
2131
|
+
var d = b.auth.dpop;
|
|
2132
|
+
var nodeCrypto = require("crypto");
|
|
2133
|
+
var ec = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "prime256v1" });
|
|
2134
|
+
var proof = await d.buildProof({ htm: "GET", htu: "https://x/y", privateKey: ec.privateKey });
|
|
2135
|
+
var threw = null;
|
|
2136
|
+
// An object lacking checkAndInsert must be refused at the opts tier, not
|
|
2137
|
+
// silently skip replay defense.
|
|
2138
|
+
try { await d.verify(proof, { htm: "GET", htu: "https://x/y", replayStore: {} }); }
|
|
2139
|
+
catch (e) { threw = e; }
|
|
2140
|
+
check("dpop.verify: replayStore without checkAndInsert → auth-dpop/bad-replay-store",
|
|
2141
|
+
threw && threw.code === "auth-dpop/bad-replay-store");
|
|
2142
|
+
}
|
|
2143
|
+
|
|
2144
|
+
async function testAuthDpopBuildProofValidation() {
|
|
2145
|
+
var d = b.auth.dpop;
|
|
2146
|
+
var nodeCrypto = require("crypto");
|
|
2147
|
+
var ec = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "prime256v1" });
|
|
2148
|
+
async function code(opts) {
|
|
2149
|
+
try { await d.buildProof(opts); return null; }
|
|
2150
|
+
catch (e) { return e && e.code; }
|
|
2151
|
+
}
|
|
2152
|
+
|
|
2153
|
+
check("dpop.buildProof: omitted htm → auth-dpop/bad-htm",
|
|
2154
|
+
(await code({ htu: "https://x/y", privateKey: ec.privateKey })) === "auth-dpop/bad-htm");
|
|
2155
|
+
check("dpop.buildProof: omitted htu → auth-dpop/bad-htu",
|
|
2156
|
+
(await code({ htm: "GET", privateKey: ec.privateKey })) === "auth-dpop/bad-htu");
|
|
2157
|
+
check("dpop.buildProof: omitted privateKey → auth-dpop/missing-private-key",
|
|
2158
|
+
(await code({ htm: "GET", htu: "https://x/y" })) === "auth-dpop/missing-private-key");
|
|
2159
|
+
check("dpop.buildProof: unparseable PEM → auth-dpop/bad-private-key",
|
|
2160
|
+
(await code({ htm: "GET", htu: "https://x/y",
|
|
2161
|
+
privateKey: "-----BEGIN PRIVATE KEY-----\nnope\n-----END PRIVATE KEY-----" })) === "auth-dpop/bad-private-key");
|
|
2162
|
+
check("dpop.buildProof: wrong-type privateKey → auth-dpop/bad-private-key",
|
|
2163
|
+
(await code({ htm: "GET", htu: "https://x/y", privateKey: 12345 })) === "auth-dpop/bad-private-key");
|
|
2164
|
+
check("dpop.buildProof: unsupported algorithm → auth-dpop/unsupported-alg",
|
|
2165
|
+
(await code({ htm: "GET", htu: "https://x/y", privateKey: ec.privateKey, algorithm: "FOO" })) === "auth-dpop/unsupported-alg");
|
|
2166
|
+
check("dpop.buildProof: non-http(s) htu scheme → auth-dpop/bad-htu",
|
|
2167
|
+
(await code({ htm: "GET", htu: "ftp://host/path", privateKey: ec.privateKey })) === "auth-dpop/bad-htu");
|
|
2168
|
+
check("dpop.buildProof: explicit jwk with refused kty → auth-dpop/refused-kty",
|
|
2169
|
+
(await code({ htm: "GET", htu: "https://x/y", privateKey: ec.privateKey,
|
|
2170
|
+
jwk: { kty: "oct", k: "AAAA" } })) === "auth-dpop/refused-kty");
|
|
2171
|
+
}
|
|
2172
|
+
|
|
2173
|
+
function testAuthDpopThumbprintErrors() {
|
|
2174
|
+
var d = b.auth.dpop;
|
|
2175
|
+
function code(jwkVal) {
|
|
2176
|
+
try { d.thumbprint(jwkVal); return null; }
|
|
2177
|
+
catch (e) { return e && e.code; }
|
|
2178
|
+
}
|
|
2179
|
+
check("dpop.thumbprint: null → auth-dpop/bad-jwk", code(null) === "auth-dpop/bad-jwk");
|
|
2180
|
+
check("dpop.thumbprint: non-object → auth-dpop/bad-jwk", code("nope") === "auth-dpop/bad-jwk");
|
|
2181
|
+
check("dpop.thumbprint: missing kty → auth-dpop/bad-jwk", code({ x: "y" }) === "auth-dpop/bad-jwk");
|
|
2182
|
+
check("dpop.thumbprint: symmetric oct kty refused → auth-dpop/refused-kty",
|
|
2183
|
+
code({ kty: "oct", k: "AAAA" }) === "auth-dpop/refused-kty");
|
|
2184
|
+
}
|
|
2185
|
+
|
|
1969
2186
|
// ---- AAL — NIST SP 800-63-4 authentication assurance levels ----
|
|
1970
2187
|
|
|
1971
2188
|
function testAuthAalSurface() {
|
|
@@ -6061,6 +6278,34 @@ async function testBackupBundlePathTraversalRejected() {
|
|
|
6061
6278
|
});
|
|
6062
6279
|
} catch (e) { threw = e; }
|
|
6063
6280
|
check("absolute path in relativePath rejected", threw && threw.code === "backup-bundle/bad-include");
|
|
6281
|
+
|
|
6282
|
+
// A Windows drive-letter prefix is absolute (path.resolve honors it) and a
|
|
6283
|
+
// colon anywhere is also an NTFS alternate-data-stream marker -- both must
|
|
6284
|
+
// be refused so a relativePath built from untrusted input can't read a file
|
|
6285
|
+
// outside dataDir. Sibling of the manifest.validate / restore-sink checks.
|
|
6286
|
+
threw = null;
|
|
6287
|
+
try {
|
|
6288
|
+
await b.backupBundle.create({
|
|
6289
|
+
dataDir: fx.dataDir,
|
|
6290
|
+
outDir: path.join(fx.root, "bundle3"),
|
|
6291
|
+
passphrase: Buffer.from("p"),
|
|
6292
|
+
vaultKeyJson: "{}",
|
|
6293
|
+
files: [{ relativePath: "C:" + "\\" + "Windows" + "\\" + "evil", kind: "raw", required: true }],
|
|
6294
|
+
});
|
|
6295
|
+
} catch (e) { threw = e; }
|
|
6296
|
+
check("drive-letter path in relativePath rejected", threw && threw.code === "backup-bundle/bad-include");
|
|
6297
|
+
|
|
6298
|
+
threw = null;
|
|
6299
|
+
try {
|
|
6300
|
+
await b.backupBundle.create({
|
|
6301
|
+
dataDir: fx.dataDir,
|
|
6302
|
+
outDir: path.join(fx.root, "bundle4"),
|
|
6303
|
+
passphrase: Buffer.from("p"),
|
|
6304
|
+
vaultKeyJson: "{}",
|
|
6305
|
+
files: [{ relativePath: "db.enc:evil", kind: "raw", required: true }],
|
|
6306
|
+
});
|
|
6307
|
+
} catch (e) { threw = e; }
|
|
6308
|
+
check("NTFS-ADS (colon) in relativePath rejected", threw && threw.code === "backup-bundle/bad-include");
|
|
6064
6309
|
} finally { fx.cleanup(); }
|
|
6065
6310
|
}
|
|
6066
6311
|
|
|
@@ -11423,6 +11668,101 @@ async function testDevDebouncesBurstOfEventsToOneRestart() {
|
|
|
11423
11668
|
await d.stop();
|
|
11424
11669
|
}
|
|
11425
11670
|
|
|
11671
|
+
async function testDevStopSettlesAfterSpawnError() {
|
|
11672
|
+
// A command that cannot be spawned (ENOENT) emits 'error' + 'close' but
|
|
11673
|
+
// NEVER 'exit', and kill() returns false (no live OS process). stop() must
|
|
11674
|
+
// still settle so the supervisor can shut down — otherwise a ref'd
|
|
11675
|
+
// keep-alive in the CLI would hang and a single Ctrl-C could not terminate.
|
|
11676
|
+
function makeSpawnErrorChild() {
|
|
11677
|
+
var listeners = {};
|
|
11678
|
+
return {
|
|
11679
|
+
pid: undefined,
|
|
11680
|
+
kill: function () { return false; }, // no live process to signal
|
|
11681
|
+
on: function (ev, cb) { (listeners[ev] = listeners[ev] || []).push(cb); return this; },
|
|
11682
|
+
once: function (ev, cb) {
|
|
11683
|
+
var wrap = function (a, b) {
|
|
11684
|
+
listeners[ev] = (listeners[ev] || []).filter(function (x) { return x !== wrap; });
|
|
11685
|
+
cb(a, b);
|
|
11686
|
+
};
|
|
11687
|
+
return this.on(ev, wrap);
|
|
11688
|
+
},
|
|
11689
|
+
_emit: function (ev, a, b) { (listeners[ev] || []).slice().forEach(function (cb) { cb(a, b); }); },
|
|
11690
|
+
};
|
|
11691
|
+
}
|
|
11692
|
+
var errChild = makeSpawnErrorChild();
|
|
11693
|
+
var d = b.dev.create({
|
|
11694
|
+
command: "does-not-exist",
|
|
11695
|
+
cwd: "/repo",
|
|
11696
|
+
_spawn: function () { return errChild; },
|
|
11697
|
+
_watch: function () { return { on: function () { return this; }, close: function () {} }; },
|
|
11698
|
+
_setTimeout: function () { return { unref: function () { return this; } }; }, // never fires
|
|
11699
|
+
_clearTimeout: function () {},
|
|
11700
|
+
});
|
|
11701
|
+
await d.start();
|
|
11702
|
+
// Simulate the spawn failure: 'error' then 'close', no 'exit'.
|
|
11703
|
+
errChild._emit("error", Object.assign(new Error("spawn does-not-exist ENOENT"), { code: "ENOENT" }));
|
|
11704
|
+
errChild._emit("close", null, null);
|
|
11705
|
+
|
|
11706
|
+
var settled = false;
|
|
11707
|
+
d.stop().then(function () { settled = true; }, function () { settled = true; });
|
|
11708
|
+
await new Promise(function (r) { setImmediate(r); });
|
|
11709
|
+
await new Promise(function (r) { setImmediate(r); });
|
|
11710
|
+
check("dev.stop() settles after a spawn-error child (no 'exit' event)", settled === true);
|
|
11711
|
+
}
|
|
11712
|
+
|
|
11713
|
+
async function testDevStopWaitsForLiveChildKillFailure() {
|
|
11714
|
+
// A LIVE child (has a pid) whose kill() fails — the signal was not
|
|
11715
|
+
// delivered, e.g. EPERM after the child changed credentials — must NOT
|
|
11716
|
+
// settle stop() immediately: the process may still be running. stop()
|
|
11717
|
+
// completes only when an exit/close actually arrives, never on a false
|
|
11718
|
+
// kill() return alone (which would falsely report termination).
|
|
11719
|
+
function makeLiveUnkillableChild() {
|
|
11720
|
+
var listeners = {};
|
|
11721
|
+
return {
|
|
11722
|
+
pid: 4242, // a real, live process
|
|
11723
|
+
kill: function () { return false; }, // signal not delivered (EPERM)
|
|
11724
|
+
on: function (ev, cb) { (listeners[ev] = listeners[ev] || []).push(cb); return this; },
|
|
11725
|
+
once: function (ev, cb) {
|
|
11726
|
+
var wrap = function (a, b) {
|
|
11727
|
+
listeners[ev] = (listeners[ev] || []).filter(function (x) { return x !== wrap; });
|
|
11728
|
+
cb(a, b);
|
|
11729
|
+
};
|
|
11730
|
+
return this.on(ev, wrap);
|
|
11731
|
+
},
|
|
11732
|
+
_emit: function (ev, a, b) { (listeners[ev] || []).slice().forEach(function (cb) { cb(a, b); }); },
|
|
11733
|
+
};
|
|
11734
|
+
}
|
|
11735
|
+
var live = makeLiveUnkillableChild();
|
|
11736
|
+
var d = b.dev.create({
|
|
11737
|
+
command: "x",
|
|
11738
|
+
cwd: "/repo",
|
|
11739
|
+
_spawn: function () { return live; },
|
|
11740
|
+
_watch: function () { return { on: function () { return this; }, close: function () {} }; },
|
|
11741
|
+
_setTimeout: function () { return { unref: function () { return this; } }; }, // killTimer never fires
|
|
11742
|
+
_clearTimeout: function () {},
|
|
11743
|
+
});
|
|
11744
|
+
await d.start();
|
|
11745
|
+
|
|
11746
|
+
var settled = false;
|
|
11747
|
+
d.stop().then(function () { settled = true; }, function () { settled = true; });
|
|
11748
|
+
await new Promise(function (r) { setImmediate(r); });
|
|
11749
|
+
await new Promise(function (r) { setImmediate(r); });
|
|
11750
|
+
check("dev.stop() does NOT settle while a live child's kill was rejected (no exit yet)", settled === false);
|
|
11751
|
+
|
|
11752
|
+
// A kill 'error' on a STILL-LIVE child (EPERM) must not complete shutdown
|
|
11753
|
+
// either — the process is still running.
|
|
11754
|
+
live._emit("error", Object.assign(new Error("kill EPERM"), { code: "EPERM" }));
|
|
11755
|
+
await new Promise(function (r) { setImmediate(r); });
|
|
11756
|
+
await new Promise(function (r) { setImmediate(r); });
|
|
11757
|
+
check("dev.stop() does NOT settle on an 'error' from a still-live child", settled === false);
|
|
11758
|
+
|
|
11759
|
+
// Only a real exit completes it.
|
|
11760
|
+
live._emit("exit", 0, null);
|
|
11761
|
+
await new Promise(function (r) { setImmediate(r); });
|
|
11762
|
+
await new Promise(function (r) { setImmediate(r); });
|
|
11763
|
+
check("dev.stop() settles once the live child finally exits", settled === true);
|
|
11764
|
+
}
|
|
11765
|
+
|
|
11426
11766
|
async function testDevIgnoresMatchingPaths() {
|
|
11427
11767
|
var h = _makeDevHarness();
|
|
11428
11768
|
var d = b.dev.create({
|
|
@@ -14561,6 +14901,245 @@ function testEnvParseSecurityRejections() {
|
|
|
14561
14901
|
check("env: unterminated quoted rejected", threwUnterm);
|
|
14562
14902
|
}
|
|
14563
14903
|
|
|
14904
|
+
function testEnvParseQuotingAndEscapes() {
|
|
14905
|
+
var env = b.parsers.env;
|
|
14906
|
+
|
|
14907
|
+
// Double-quoted escape sequences decode individually.
|
|
14908
|
+
check("env: \\t escape decodes to tab", env.parse('K="a\\tb"').K === "a\tb");
|
|
14909
|
+
check("env: \\r escape decodes to CR", env.parse('K="a\\rb"').K === "a\rb");
|
|
14910
|
+
check("env: \\\\ escape decodes to \\", env.parse('K="a\\\\b"').K === "a\\b");
|
|
14911
|
+
check("env: \\\" escape decodes to quote", env.parse('K="a\\"b"').K === 'a"b');
|
|
14912
|
+
|
|
14913
|
+
// \u unicode escape decodes; malformed hex is a typed refusal.
|
|
14914
|
+
check("env: \\u escape decodes", env.parse('U="\\u0041\\u0042"').U === "AB");
|
|
14915
|
+
var threwBadU = false;
|
|
14916
|
+
try { env.parse('K="\\uZZZZ"'); }
|
|
14917
|
+
catch (e) { threwBadU = e.code === "env/bad-escape"; }
|
|
14918
|
+
check("env: bad \\u escape rejected", threwBadU);
|
|
14919
|
+
|
|
14920
|
+
// Unknown backslash escape is a typed refusal (not silently swallowed).
|
|
14921
|
+
var threwUnknownEsc = false;
|
|
14922
|
+
try { env.parse('K="\\q"'); }
|
|
14923
|
+
catch (e) { threwUnknownEsc = e.code === "env/bad-escape"; }
|
|
14924
|
+
check("env: unknown escape rejected", threwUnknownEsc);
|
|
14925
|
+
|
|
14926
|
+
// Single-quoted values are fully literal — an unterminated one refuses.
|
|
14927
|
+
var threwSingleUnterm = false;
|
|
14928
|
+
try { env.parse("K='abc"); }
|
|
14929
|
+
catch (e) { threwSingleUnterm = e.code === "env/unterminated-string"; }
|
|
14930
|
+
check("env: unterminated single-quote rejected", threwSingleUnterm);
|
|
14931
|
+
|
|
14932
|
+
// A comment after a closing double-quote is ignored.
|
|
14933
|
+
check("env: comment after closing quote ignored", env.parse('K="v" # trailing').K === "v");
|
|
14934
|
+
|
|
14935
|
+
// A '#' NOT preceded by whitespace is a literal part of the value.
|
|
14936
|
+
check("env: '#' without leading space kept literal", env.parse("K=color#red").K === "color#red");
|
|
14937
|
+
|
|
14938
|
+
// A real tab INSIDE a quoted value is fine (only a tab starting an
|
|
14939
|
+
// unquoted value is the paste-accident we reject).
|
|
14940
|
+
check("env: tab inside double-quote preserved", env.parse('K="a\tb"').K === "a\tb");
|
|
14941
|
+
|
|
14942
|
+
// A trailing '$' with no name after it is a literal, not an expansion.
|
|
14943
|
+
check("env: trailing '$' is literal", env.parse("K=abc$").K === "abc$");
|
|
14944
|
+
|
|
14945
|
+
// ${VAR} in a double-quoted value is refused (brace form).
|
|
14946
|
+
var threwBraceDq = false;
|
|
14947
|
+
try { env.parse('K="${HOME}"'); }
|
|
14948
|
+
catch (e) { threwBraceDq = e.code === "env/expansion-banned"; }
|
|
14949
|
+
check("env: ${VAR} in double-quote rejected", threwBraceDq);
|
|
14950
|
+
}
|
|
14951
|
+
|
|
14952
|
+
function testEnvParseStructureAndKeys() {
|
|
14953
|
+
var env = b.parsers.env;
|
|
14954
|
+
|
|
14955
|
+
// CRLF and lone-CR line endings both split into records.
|
|
14956
|
+
var crlf = env.parse("A=1\r\nB=2");
|
|
14957
|
+
check("env: CRLF line endings", crlf.A === "1" && crlf.B === "2");
|
|
14958
|
+
var cr = env.parse("A=1\rB=2");
|
|
14959
|
+
check("env: lone-CR line endings", cr.A === "1" && cr.B === "2");
|
|
14960
|
+
|
|
14961
|
+
// A leading BOM is stripped before parsing.
|
|
14962
|
+
check("env: leading BOM stripped", env.parse("A=1").A === "1");
|
|
14963
|
+
|
|
14964
|
+
// Empty key ('=value' with no key) is a typed refusal.
|
|
14965
|
+
var threwEmptyKey = false;
|
|
14966
|
+
try { env.parse("=value"); }
|
|
14967
|
+
catch (e) { threwEmptyKey = e.code === "env/empty-key"; }
|
|
14968
|
+
check("env: empty key rejected", threwEmptyKey);
|
|
14969
|
+
|
|
14970
|
+
// keyShape override lets an operator opt into lowercase keys.
|
|
14971
|
+
check("env: keyShape override accepts lowercase",
|
|
14972
|
+
env.parse("lower_key=v", { keyShape: /^[a-z_]+$/ }).lower_key === "v");
|
|
14973
|
+
|
|
14974
|
+
// Even with a permissive keyShape, a poisoned key is refused at the
|
|
14975
|
+
// dedicated guard (the pollution defense is not keyShape-dependent).
|
|
14976
|
+
var threwPoisoned = false;
|
|
14977
|
+
try { env.parse("__proto__=x", { keyShape: /^[a-z_]+$/ }); }
|
|
14978
|
+
catch (e) { threwPoisoned = e.code === "env/poisoned-key"; }
|
|
14979
|
+
check("env: poisoned key refused regardless of keyShape", threwPoisoned);
|
|
14980
|
+
|
|
14981
|
+
// ${VAR} expansion in an unquoted value is refused (brace form).
|
|
14982
|
+
var threwBrace = false;
|
|
14983
|
+
try { env.parse("K=${HOME}"); }
|
|
14984
|
+
catch (e) { threwBrace = e.code === "env/expansion-banned"; }
|
|
14985
|
+
check("env: ${VAR} unquoted rejected", threwBrace);
|
|
14986
|
+
|
|
14987
|
+
// maxKeys cap is enforced (DoS bound).
|
|
14988
|
+
var threwManyKeys = false;
|
|
14989
|
+
try { env.parse("A=1\nB=2\nC=3", { maxKeys: 2 }); }
|
|
14990
|
+
catch (e) { threwManyKeys = e.code === "env/too-many-keys"; }
|
|
14991
|
+
check("env: maxKeys enforced", threwManyKeys);
|
|
14992
|
+
|
|
14993
|
+
// Non-positive / non-integer / non-finite numeric opts are refused up
|
|
14994
|
+
// front — they must not silently lift the DoS caps they configure.
|
|
14995
|
+
var badOpts = [
|
|
14996
|
+
{ maxBytes: -5 }, { maxBytes: 1.5 }, { maxBytes: Infinity },
|
|
14997
|
+
{ maxBytes: NaN }, { maxKeys: 0 }, { maxKeys: Infinity },
|
|
14998
|
+
];
|
|
14999
|
+
var allBadOptsRejected = badOpts.every(function (o) {
|
|
15000
|
+
try { env.parse("A=1", o); return false; }
|
|
15001
|
+
catch (e) { return e.code === "env/bad-opt"; }
|
|
15002
|
+
});
|
|
15003
|
+
check("env: invalid numeric opts rejected as env/bad-opt", allBadOptsRejected);
|
|
15004
|
+
}
|
|
15005
|
+
|
|
15006
|
+
function testEnvReadVarEdgeCases() {
|
|
15007
|
+
var env = b.parsers.env;
|
|
15008
|
+
|
|
15009
|
+
// Non-string / empty name is a typed refusal.
|
|
15010
|
+
var threwNonStr = false;
|
|
15011
|
+
try { env.readVar(123); }
|
|
15012
|
+
catch (e) { threwNonStr = e.code === "env/bad-arg"; }
|
|
15013
|
+
check("readVar: non-string name rejected", threwNonStr);
|
|
15014
|
+
var threwEmptyName = false;
|
|
15015
|
+
try { env.readVar(""); }
|
|
15016
|
+
catch (e) { threwEmptyName = e.code === "env/bad-arg"; }
|
|
15017
|
+
check("readVar: empty name rejected", threwEmptyName);
|
|
15018
|
+
|
|
15019
|
+
// Invalid maxBytes opt refused before any read.
|
|
15020
|
+
var threwBadOpt = false;
|
|
15021
|
+
try { env.readVar("BLAMEJS_TEST_EV1", { maxBytes: 0 }); }
|
|
15022
|
+
catch (e) { threwBadOpt = e.code === "env/bad-opt"; }
|
|
15023
|
+
check("readVar: invalid maxBytes rejected", threwBadOpt);
|
|
15024
|
+
|
|
15025
|
+
var KEYS = ["BLAMEJS_TEST_EV1", "BLAMEJS_TEST_EV2", "BLAMEJS_TEST_EV3", "BLAMEJS_TEST_EV4"];
|
|
15026
|
+
var saved = {};
|
|
15027
|
+
for (var i = 0; i < KEYS.length; i++) { saved[KEYS[i]] = process.env[KEYS[i]]; delete process.env[KEYS[i]]; }
|
|
15028
|
+
|
|
15029
|
+
try {
|
|
15030
|
+
// type:json coerces a valid JSON value.
|
|
15031
|
+
process.env.BLAMEJS_TEST_EV1 = '{"a":1,"b":true}';
|
|
15032
|
+
var parsed = env.readVar("BLAMEJS_TEST_EV1", { type: "json" });
|
|
15033
|
+
check("readVar: json coercion", parsed && parsed.a === 1 && parsed.b === true);
|
|
15034
|
+
|
|
15035
|
+
// type:json on garbage is a typed refusal (not an uncaught crash).
|
|
15036
|
+
process.env.BLAMEJS_TEST_EV2 = "not json";
|
|
15037
|
+
var threwBadJson = false;
|
|
15038
|
+
try { env.readVar("BLAMEJS_TEST_EV2", { type: "json" }); }
|
|
15039
|
+
catch (e) { threwBadJson = e.code === "env/bad-type"; }
|
|
15040
|
+
check("readVar: invalid json rejected", threwBadJson);
|
|
15041
|
+
|
|
15042
|
+
// Unknown schema type is a typed refusal.
|
|
15043
|
+
process.env.BLAMEJS_TEST_EV3 = "v";
|
|
15044
|
+
var threwUnknownType = false;
|
|
15045
|
+
try { env.readVar("BLAMEJS_TEST_EV3", { type: "frobnicate" }); }
|
|
15046
|
+
catch (e) { threwUnknownType = e.code === "env/bad-schema"; }
|
|
15047
|
+
check("readVar: unknown type rejected", threwUnknownType);
|
|
15048
|
+
|
|
15049
|
+
// type:number on a non-number is a typed refusal.
|
|
15050
|
+
process.env.BLAMEJS_TEST_EV4 = "notnum";
|
|
15051
|
+
var threwBadNum = false;
|
|
15052
|
+
try { env.readVar("BLAMEJS_TEST_EV4", { type: "number" }); }
|
|
15053
|
+
catch (e) { threwBadNum = e.code === "env/bad-type"; }
|
|
15054
|
+
check("readVar: non-number rejected", threwBadNum);
|
|
15055
|
+
} finally {
|
|
15056
|
+
for (var j = 0; j < KEYS.length; j++) {
|
|
15057
|
+
if (saved[KEYS[j]] === undefined) delete process.env[KEYS[j]];
|
|
15058
|
+
else process.env[KEYS[j]] = saved[KEYS[j]];
|
|
15059
|
+
}
|
|
15060
|
+
}
|
|
15061
|
+
}
|
|
15062
|
+
|
|
15063
|
+
function testEnvLoad() {
|
|
15064
|
+
var env = b.parsers.env;
|
|
15065
|
+
|
|
15066
|
+
// Non-string path is a typed refusal.
|
|
15067
|
+
var threwBadArg = false;
|
|
15068
|
+
try { env.load(123); }
|
|
15069
|
+
catch (e) { threwBadArg = e.code === "env/bad-arg"; }
|
|
15070
|
+
check("env.load: non-string path rejected", threwBadArg);
|
|
15071
|
+
|
|
15072
|
+
var dir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-env-load-"));
|
|
15073
|
+
try {
|
|
15074
|
+
// Happy path: schema-driven coercion + defaults + unregistered
|
|
15075
|
+
// passthrough. audit:false keeps the load pure (no audit chain).
|
|
15076
|
+
var f1 = path.join(dir, "a.env");
|
|
15077
|
+
fs.writeFileSync(f1, "PORT=8080\nDEBUG=true\nCONF={\"x\":1}\nEMPTYNUM=\nEXTRA=raw\n");
|
|
15078
|
+
var r1 = env.load(f1, {
|
|
15079
|
+
audit: false,
|
|
15080
|
+
expected: {
|
|
15081
|
+
PORT: { type: "number" },
|
|
15082
|
+
DEBUG: { type: "boolean" },
|
|
15083
|
+
CONF: { type: "json" },
|
|
15084
|
+
EMPTYNUM: { type: "number" },
|
|
15085
|
+
MISSING_DEF: { type: "string", default: "fallback" },
|
|
15086
|
+
},
|
|
15087
|
+
});
|
|
15088
|
+
check("env.load: number coercion", r1.values.PORT === 8080);
|
|
15089
|
+
check("env.load: boolean coercion", r1.values.DEBUG === true);
|
|
15090
|
+
check("env.load: json coercion", r1.values.CONF && r1.values.CONF.x === 1);
|
|
15091
|
+
check("env.load: empty number → null", r1.values.EMPTYNUM === null);
|
|
15092
|
+
check("env.load: absent key uses default", r1.values.MISSING_DEF === "fallback");
|
|
15093
|
+
check("env.load: unregistered key passed through raw", r1.values.EXTRA === "raw");
|
|
15094
|
+
|
|
15095
|
+
// Missing required key is a typed refusal.
|
|
15096
|
+
var f2 = path.join(dir, "b.env");
|
|
15097
|
+
fs.writeFileSync(f2, "PORT=1\n");
|
|
15098
|
+
var threwMissing = false;
|
|
15099
|
+
try { env.load(f2, { audit: false, expected: { NEEDED: { type: "string", required: true } } }); }
|
|
15100
|
+
catch (e) { threwMissing = e.code === "env/missing-required"; }
|
|
15101
|
+
check("env.load: missing required rejected", threwMissing);
|
|
15102
|
+
|
|
15103
|
+
// A sensitivity:'breaking' change against the snapshot refuses unless
|
|
15104
|
+
// acknowledged via { allow: [...] }.
|
|
15105
|
+
var f3 = path.join(dir, "c.env");
|
|
15106
|
+
fs.writeFileSync(f3, "APP_MODE=new\n");
|
|
15107
|
+
var snap = path.join(dir, "snap.json");
|
|
15108
|
+
fs.writeFileSync(snap, JSON.stringify({ APP_MODE: "old" }));
|
|
15109
|
+
var threwBreaking = false;
|
|
15110
|
+
try {
|
|
15111
|
+
env.load(f3, { audit: false, snapshotPath: snap,
|
|
15112
|
+
expected: { APP_MODE: { sensitivity: "breaking" } } });
|
|
15113
|
+
} catch (e) { threwBreaking = e.code === "env/breaking-change"; }
|
|
15114
|
+
check("env.load: unacknowledged breaking change rejected", threwBreaking);
|
|
15115
|
+
|
|
15116
|
+
fs.writeFileSync(snap, JSON.stringify({ APP_MODE: "old" }));
|
|
15117
|
+
var r3 = env.load(f3, { audit: false, snapshotPath: snap, allow: ["APP_MODE"],
|
|
15118
|
+
expected: { APP_MODE: { sensitivity: "breaking" } } });
|
|
15119
|
+
check("env.load: acknowledged breaking change accepted", r3.values.APP_MODE === "new");
|
|
15120
|
+
check("env.load: breaking change surfaced in diff",
|
|
15121
|
+
r3.diff.changed.length === 1 && r3.diff.changed[0].key === "APP_MODE");
|
|
15122
|
+
|
|
15123
|
+
// rejectUnknown refuses when an unregistered key is present.
|
|
15124
|
+
var f4 = path.join(dir, "d.env");
|
|
15125
|
+
fs.writeFileSync(f4, "KNOWN=1\nUNKNOWN_KEY=2\n");
|
|
15126
|
+
var threwUnknownKeys = false;
|
|
15127
|
+
try { env.load(f4, { audit: false, rejectUnknown: true, expected: { KNOWN: { type: "number" } } }); }
|
|
15128
|
+
catch (e) { threwUnknownKeys = e.code === "env/unknown-keys"; }
|
|
15129
|
+
check("env.load: rejectUnknown refuses unregistered key", threwUnknownKeys);
|
|
15130
|
+
|
|
15131
|
+
// A near-miss key surfaces as a suspicious typo suggestion.
|
|
15132
|
+
var f5 = path.join(dir, "e.env");
|
|
15133
|
+
fs.writeFileSync(f5, "DATABASE_UR=x\n");
|
|
15134
|
+
var r5 = env.load(f5, { audit: false, expected: { DATABASE_URL: { type: "string" } } });
|
|
15135
|
+
check("env.load: typo surfaced as suspicious",
|
|
15136
|
+
r5.diff.suspicious.length === 1 &&
|
|
15137
|
+
r5.diff.suspicious[0].suggestion === "DATABASE_URL");
|
|
15138
|
+
} finally {
|
|
15139
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
15140
|
+
}
|
|
15141
|
+
}
|
|
15142
|
+
|
|
14564
15143
|
function testBufferSafeNormalizeText() {
|
|
14565
15144
|
var bs = b.safeBuffer;
|
|
14566
15145
|
check("safeBuffer.normalizeText is a function", typeof bs.normalizeText === "function");
|
|
@@ -18827,6 +19406,8 @@ async function run() {
|
|
|
18827
19406
|
await testDevRestartCoalescesQueuedRestart();
|
|
18828
19407
|
await testDevStopKillsAndDisarms();
|
|
18829
19408
|
await testDevUnexpectedExitDoesNotRespawn();
|
|
19409
|
+
await testDevStopSettlesAfterSpawnError();
|
|
19410
|
+
await testDevStopWaitsForLiveChildKillFailure();
|
|
18830
19411
|
// cli — `blamejs <cmd>` dispatch + migrate subcommand
|
|
18831
19412
|
testCliSurface();
|
|
18832
19413
|
testCliArgParser();
|
|
@@ -18950,6 +19531,14 @@ async function run() {
|
|
|
18950
19531
|
await testAuthDpopJwkPrivateLeakRefused();
|
|
18951
19532
|
await testAuthDpopThumbprint();
|
|
18952
19533
|
await testAuthDpopPqcMlDsa();
|
|
19534
|
+
await testAuthDpopVerifyMalformedInputs();
|
|
19535
|
+
await testAuthDpopVerifyHeaderChecks();
|
|
19536
|
+
await testAuthDpopVerifyBadSignature();
|
|
19537
|
+
await testAuthDpopVerifyPayloadChecks();
|
|
19538
|
+
await testAuthDpopNonceBinding();
|
|
19539
|
+
await testAuthDpopVerifyBadReplayStore();
|
|
19540
|
+
await testAuthDpopBuildProofValidation();
|
|
19541
|
+
testAuthDpopThumbprintErrors();
|
|
18953
19542
|
testAuthAalSurface();
|
|
18954
19543
|
testAuthAalFromMethods();
|
|
18955
19544
|
testAuthAalMeets();
|
|
@@ -19099,7 +19688,11 @@ async function run() {
|
|
|
19099
19688
|
testYamlSecurityRejections();
|
|
19100
19689
|
testEnvParseBasic();
|
|
19101
19690
|
testEnvParseSecurityRejections();
|
|
19691
|
+
testEnvParseQuotingAndEscapes();
|
|
19692
|
+
testEnvParseStructureAndKeys();
|
|
19102
19693
|
testEnvReadVar();
|
|
19694
|
+
testEnvReadVarEdgeCases();
|
|
19695
|
+
testEnvLoad();
|
|
19103
19696
|
// redact primitive
|
|
19104
19697
|
testRedact();
|
|
19105
19698
|
testAuditSafeEmitRedacts();
|
|
@@ -19213,6 +19806,14 @@ module.exports = {
|
|
|
19213
19806
|
testAuthDpopJwkPrivateLeakRefused: testAuthDpopJwkPrivateLeakRefused,
|
|
19214
19807
|
testAuthDpopThumbprint: testAuthDpopThumbprint,
|
|
19215
19808
|
testAuthDpopPqcMlDsa: testAuthDpopPqcMlDsa,
|
|
19809
|
+
testAuthDpopVerifyMalformedInputs: testAuthDpopVerifyMalformedInputs,
|
|
19810
|
+
testAuthDpopVerifyHeaderChecks: testAuthDpopVerifyHeaderChecks,
|
|
19811
|
+
testAuthDpopVerifyBadSignature: testAuthDpopVerifyBadSignature,
|
|
19812
|
+
testAuthDpopVerifyPayloadChecks: testAuthDpopVerifyPayloadChecks,
|
|
19813
|
+
testAuthDpopNonceBinding: testAuthDpopNonceBinding,
|
|
19814
|
+
testAuthDpopVerifyBadReplayStore: testAuthDpopVerifyBadReplayStore,
|
|
19815
|
+
testAuthDpopBuildProofValidation: testAuthDpopBuildProofValidation,
|
|
19816
|
+
testAuthDpopThumbprintErrors: testAuthDpopThumbprintErrors,
|
|
19216
19817
|
testAuthAalSurface: testAuthAalSurface,
|
|
19217
19818
|
testAuthAalFromMethods: testAuthAalFromMethods,
|
|
19218
19819
|
testAuthAalMeets: testAuthAalMeets,
|
|
@@ -19691,7 +20292,11 @@ module.exports = {
|
|
|
19691
20292
|
testYamlSecurityRejections: testYamlSecurityRejections,
|
|
19692
20293
|
testEnvParseBasic: testEnvParseBasic,
|
|
19693
20294
|
testEnvParseSecurityRejections: testEnvParseSecurityRejections,
|
|
20295
|
+
testEnvParseQuotingAndEscapes: testEnvParseQuotingAndEscapes,
|
|
20296
|
+
testEnvParseStructureAndKeys: testEnvParseStructureAndKeys,
|
|
19694
20297
|
testEnvReadVar: testEnvReadVar,
|
|
20298
|
+
testEnvReadVarEdgeCases: testEnvReadVarEdgeCases,
|
|
20299
|
+
testEnvLoad: testEnvLoad,
|
|
19695
20300
|
testRedact: testRedact,
|
|
19696
20301
|
testAuditSafeEmitRedacts: testAuditSafeEmitRedacts,
|
|
19697
20302
|
|