@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
|
@@ -1,690 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
// Copyright (c) blamejs contributors
|
|
3
|
-
"use strict";
|
|
4
|
-
/**
|
|
5
|
-
* Layer 0 — lib/backup/index.js branch coverage.
|
|
6
|
-
*
|
|
7
|
-
* Targets input-validation / option-default / error-handling branches
|
|
8
|
-
* not exercised by test/00-primitives.js (create/recommendedFiles/
|
|
9
|
-
* run round-trip), backup-object-store-adapter, backup-find-bundles,
|
|
10
|
-
* backup-worker, or backup-residency-posture:
|
|
11
|
-
*
|
|
12
|
-
* - diskStorage direct: bad root, bad bundleId, bundle-exists,
|
|
13
|
-
* bundle-not-found, empty/filtered listBundles, delete/has no-op.
|
|
14
|
-
* - create(): residencyTag validation, schedule/scheduleTest
|
|
15
|
-
* wiring + arg validation, requireFlush hard-fail, HIPAA
|
|
16
|
-
* encrypt:false refusal.
|
|
17
|
-
* - verifyManifestSignature: bad-target / no-manifest / bad-manifest
|
|
18
|
-
* / parsed-object / on-disk string path.
|
|
19
|
-
* - bundleAdapterStorage: format / crypto-strategy / recipient /
|
|
20
|
-
* passphrase / entropy-floor / maxBundleBytes validation,
|
|
21
|
-
* bundle-too-large, opt-in posture gate, directory-format
|
|
22
|
-
* round-trip, bundleInfo / verifyBundle.
|
|
23
|
-
* - fsAdapter: traversal-key refusal, readPartial / statKey /
|
|
24
|
-
* hasKey / deleteKey.
|
|
25
|
-
* - migrate(): bad-from / bad-to / bad bundleId, directory->tar
|
|
26
|
-
* round-trip + idempotency.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
var fs = require("node:fs");
|
|
30
|
-
var path = require("node:path");
|
|
31
|
-
var os = require("node:os");
|
|
32
|
-
var b = require("../../index");
|
|
33
|
-
var helpers = require("../helpers");
|
|
34
|
-
var check = helpers.check;
|
|
35
|
-
|
|
36
|
-
var VALID_ID = "2026-04-27T14-00-00-123Z-a8f30b21";
|
|
37
|
-
var VALID_ID2 = "2026-04-27T14-30-00-456Z-b1c2d3e4";
|
|
38
|
-
var ABSENT_ID = "2026-04-27T09-00-00-000Z-ffffffff";
|
|
39
|
-
|
|
40
|
-
function _tmp(tag) {
|
|
41
|
-
return fs.mkdtempSync(path.join(os.tmpdir(), "bidx-" + tag + "-"));
|
|
42
|
-
}
|
|
43
|
-
function _rm(p) {
|
|
44
|
-
try { fs.rmSync(p, { recursive: true, force: true }); } catch (_e) { /* ignore */ }
|
|
45
|
-
}
|
|
46
|
-
function _mkSrcDir(files) {
|
|
47
|
-
var dir = _tmp("src");
|
|
48
|
-
Object.keys(files).forEach(function (rel) {
|
|
49
|
-
var full = path.join(dir, rel);
|
|
50
|
-
fs.mkdirSync(path.dirname(full), { recursive: true });
|
|
51
|
-
fs.writeFileSync(full, files[rel]);
|
|
52
|
-
});
|
|
53
|
-
return dir;
|
|
54
|
-
}
|
|
55
|
-
function _errOf(e) { return (e && (e.code || e.message)) || String(e); }
|
|
56
|
-
|
|
57
|
-
// ---- diskStorage ----
|
|
58
|
-
|
|
59
|
-
function testDiskStorageValidatesRoot() {
|
|
60
|
-
var threw = null;
|
|
61
|
-
try { b.backup.diskStorage({}); } catch (e) { threw = e; }
|
|
62
|
-
check("diskStorage: missing root refused with no-storage-root",
|
|
63
|
-
threw && threw.code === "backup/no-storage-root");
|
|
64
|
-
var threw2 = null;
|
|
65
|
-
try { b.backup.diskStorage({ root: "" }); } catch (e) { threw2 = e; }
|
|
66
|
-
check("diskStorage: empty root refused",
|
|
67
|
-
threw2 && threw2.code === "backup/no-storage-root");
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async function testDiskStorageBadBundleId() {
|
|
71
|
-
var root = _tmp("ds-badid");
|
|
72
|
-
try {
|
|
73
|
-
var ds = b.backup.diskStorage({ root: root });
|
|
74
|
-
var src = _mkSrcDir({ "manifest.json": "{}" });
|
|
75
|
-
try {
|
|
76
|
-
var threw = null;
|
|
77
|
-
try { await ds.writeBundle("not-a-valid-id", src); } catch (e) { threw = e; }
|
|
78
|
-
check("diskStorage.writeBundle: bad bundleId refused",
|
|
79
|
-
threw && threw.code === "backup/bad-bundle-id");
|
|
80
|
-
} finally { _rm(src); }
|
|
81
|
-
} finally { _rm(root); }
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async function testDiskStorageBundleExistsAndNotFound() {
|
|
85
|
-
var root = _tmp("ds-exists");
|
|
86
|
-
var src = _mkSrcDir({ "manifest.json": "{\"v\":1}", "files/a.enc": "AAA" });
|
|
87
|
-
try {
|
|
88
|
-
var ds = b.backup.diskStorage({ root: root });
|
|
89
|
-
await ds.writeBundle(VALID_ID, src);
|
|
90
|
-
check("diskStorage.hasBundle: true after write", await ds.hasBundle(VALID_ID));
|
|
91
|
-
|
|
92
|
-
var threw = null;
|
|
93
|
-
try { await ds.writeBundle(VALID_ID, src); } catch (e) { threw = e; }
|
|
94
|
-
check("diskStorage.writeBundle: duplicate id refused with bundle-exists",
|
|
95
|
-
threw && threw.code === "backup/bundle-exists");
|
|
96
|
-
|
|
97
|
-
var threw2 = null;
|
|
98
|
-
try { await ds.readBundle(ABSENT_ID, path.join(root, "out")); } catch (e) { threw2 = e; }
|
|
99
|
-
check("diskStorage.readBundle: absent bundle refused with bundle-not-found",
|
|
100
|
-
threw2 && threw2.code === "backup/bundle-not-found");
|
|
101
|
-
} finally { _rm(root); _rm(src); }
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async function testDiskStorageListFiltersAndEmpty() {
|
|
105
|
-
// listBundles on a non-existent root returns [].
|
|
106
|
-
var missing = path.join(os.tmpdir(), "bidx-missing-" + Date.now());
|
|
107
|
-
var dsMissing = b.backup.diskStorage({ root: missing });
|
|
108
|
-
var empty = await dsMissing.listBundles();
|
|
109
|
-
check("diskStorage.listBundles: non-existent root returns []",
|
|
110
|
-
Array.isArray(empty) && empty.length === 0);
|
|
111
|
-
|
|
112
|
-
// listBundles skips non-bundle-id directories + stray files.
|
|
113
|
-
var root = _tmp("ds-list");
|
|
114
|
-
var src = _mkSrcDir({ "manifest.json": "{}", "files/a.enc": "A" });
|
|
115
|
-
try {
|
|
116
|
-
var ds = b.backup.diskStorage({ root: root });
|
|
117
|
-
await ds.writeBundle(VALID_ID, src);
|
|
118
|
-
fs.mkdirSync(path.join(root, "not-a-bundle-dir"));
|
|
119
|
-
fs.writeFileSync(path.join(root, "loose-file.txt"), "junk");
|
|
120
|
-
var listed = await ds.listBundles();
|
|
121
|
-
check("diskStorage.listBundles: only the valid bundle id is returned",
|
|
122
|
-
listed.length === 1 && listed[0].bundleId === VALID_ID);
|
|
123
|
-
check("diskStorage.listBundles: entry carries size + createdAt",
|
|
124
|
-
typeof listed[0].size === "number" && typeof listed[0].createdAt === "string");
|
|
125
|
-
} finally { _rm(root); _rm(src); }
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
async function testDiskStorageDeleteAndHasNoop() {
|
|
129
|
-
var root = _tmp("ds-del");
|
|
130
|
-
try {
|
|
131
|
-
var ds = b.backup.diskStorage({ root: root });
|
|
132
|
-
// deleteBundle on an absent-but-valid id is a silent no-op.
|
|
133
|
-
var threw = null;
|
|
134
|
-
try { await ds.deleteBundle(ABSENT_ID); } catch (e) { threw = e; }
|
|
135
|
-
check("diskStorage.deleteBundle: absent id is a no-op (no throw)", threw === null);
|
|
136
|
-
check("diskStorage.hasBundle: false for absent id", (await ds.hasBundle(ABSENT_ID)) === false);
|
|
137
|
-
// hasBundle on a malformed id refuses via _bundlePath.
|
|
138
|
-
var threw2 = null;
|
|
139
|
-
try { await ds.hasBundle("bad id"); } catch (e) { threw2 = e; }
|
|
140
|
-
check("diskStorage.hasBundle: malformed id returns false (swallowed)", threw2 === null);
|
|
141
|
-
} finally { _rm(root); }
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// ---- create(): validation + wiring branches ----
|
|
145
|
-
|
|
146
|
-
function _createOpts(dataDir, root, extra) {
|
|
147
|
-
fs.writeFileSync(path.join(dataDir, "db.enc"), Buffer.from([1, 2, 3]));
|
|
148
|
-
var opts = {
|
|
149
|
-
dataDir: dataDir,
|
|
150
|
-
storage: b.backup.diskStorage({ root: root }),
|
|
151
|
-
passphrase: Buffer.from("operator-backup-passphrase"),
|
|
152
|
-
files: [{ relativePath: "db.enc", kind: "raw", required: true }],
|
|
153
|
-
vaultKeyJson: '{"v":1}',
|
|
154
|
-
audit: false,
|
|
155
|
-
};
|
|
156
|
-
if (extra) Object.keys(extra).forEach(function (k) { opts[k] = extra[k]; });
|
|
157
|
-
return opts;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function testCreateResidencyTagValidation() {
|
|
161
|
-
var data = _tmp("res-data");
|
|
162
|
-
var root = _tmp("res-root");
|
|
163
|
-
try {
|
|
164
|
-
var threw = null;
|
|
165
|
-
try { b.backup.create(_createOpts(data, root, { residencyTag: 123 })); } catch (e) { threw = e; }
|
|
166
|
-
check("create: non-string residencyTag refused with bad-residency-tag",
|
|
167
|
-
threw && threw.code === "backup/bad-residency-tag");
|
|
168
|
-
|
|
169
|
-
var threw2 = null;
|
|
170
|
-
try { b.backup.create(_createOpts(data, root, { residencyTag: "" })); } catch (e) { threw2 = e; }
|
|
171
|
-
check("create: empty residencyTag refused",
|
|
172
|
-
threw2 && threw2.code === "backup/bad-residency-tag");
|
|
173
|
-
|
|
174
|
-
// null residencyTag is accepted (means "undeclared").
|
|
175
|
-
var eng = b.backup.create(_createOpts(data, root, { residencyTag: null }));
|
|
176
|
-
check("create: null residencyTag accepted", eng && typeof eng.run === "function");
|
|
177
|
-
} finally { _rm(data); _rm(root); }
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
function testCreateScheduleRequiresScheduler() {
|
|
181
|
-
var data = _tmp("sch-data");
|
|
182
|
-
var root = _tmp("sch-root");
|
|
183
|
-
try {
|
|
184
|
-
var eng = b.backup.create(_createOpts(data, root));
|
|
185
|
-
var threw = null;
|
|
186
|
-
try { eng.schedule({ cron: "0 3 * * *" }); } catch (e) { threw = e; }
|
|
187
|
-
check("create: schedule() without a scheduler refused with no-scheduler",
|
|
188
|
-
threw && threw.code === "backup/no-scheduler");
|
|
189
|
-
var threw2 = null;
|
|
190
|
-
try { eng.scheduleTest({ cron: "0 3 * * *", restoreTo: "/x", verify: function () {} }); } catch (e) { threw2 = e; }
|
|
191
|
-
check("create: scheduleTest() without a scheduler refused with no-scheduler",
|
|
192
|
-
threw2 && threw2.code === "backup/no-scheduler");
|
|
193
|
-
} finally { _rm(data); _rm(root); }
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function testCreateScheduleArgValidation() {
|
|
197
|
-
var data = _tmp("scha-data");
|
|
198
|
-
var root = _tmp("scha-root");
|
|
199
|
-
try {
|
|
200
|
-
var scheduled = [];
|
|
201
|
-
var fakeScheduler = {
|
|
202
|
-
create: function () {
|
|
203
|
-
return { schedule: function (spec) { scheduled.push(spec); } };
|
|
204
|
-
},
|
|
205
|
-
};
|
|
206
|
-
var eng = b.backup.create(_createOpts(data, root, { scheduler: fakeScheduler }));
|
|
207
|
-
|
|
208
|
-
var threw = null;
|
|
209
|
-
try { eng.schedule({}); } catch (e) { threw = e; }
|
|
210
|
-
check("create: schedule() without cron refused with bad-schedule",
|
|
211
|
-
threw && threw.code === "backup/bad-schedule");
|
|
212
|
-
|
|
213
|
-
var handle = eng.schedule({ cron: "0 3 * * *", name: "nightly" });
|
|
214
|
-
check("create: schedule() returns { name, instance }",
|
|
215
|
-
handle && handle.name === "nightly" && handle.instance);
|
|
216
|
-
check("create: schedule() registered a job on the scheduler instance",
|
|
217
|
-
scheduled.length === 1 && scheduled[0].cron === "0 3 * * *" &&
|
|
218
|
-
typeof scheduled[0].run === "function");
|
|
219
|
-
|
|
220
|
-
var t1 = null;
|
|
221
|
-
try { eng.scheduleTest({}); } catch (e) { t1 = e; }
|
|
222
|
-
check("create: scheduleTest() without cron refused",
|
|
223
|
-
t1 && t1.code === "backup/bad-test-schedule");
|
|
224
|
-
var t2 = null;
|
|
225
|
-
try { eng.scheduleTest({ cron: "0 3 * * *" }); } catch (e) { t2 = e; }
|
|
226
|
-
check("create: scheduleTest() without restoreTo refused",
|
|
227
|
-
t2 && t2.code === "backup/bad-test-restore-to");
|
|
228
|
-
var t3 = null;
|
|
229
|
-
try { eng.scheduleTest({ cron: "0 3 * * *", restoreTo: "/x" }); } catch (e) { t3 = e; }
|
|
230
|
-
check("create: scheduleTest() without verify fn refused",
|
|
231
|
-
t3 && t3.code === "backup/bad-test-verify");
|
|
232
|
-
|
|
233
|
-
var testHandle = eng.scheduleTest({ cron: "0 3 * * *", restoreTo: "/x", verify: function () {} });
|
|
234
|
-
check("create: scheduleTest() returns a handle with default name",
|
|
235
|
-
testHandle && testHandle.name === "blamejs.backup.test");
|
|
236
|
-
} finally { _rm(data); _rm(root); }
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
async function testCreateRequireFlushHardFails() {
|
|
240
|
-
var data = _tmp("rf-data");
|
|
241
|
-
var root = _tmp("rf-root");
|
|
242
|
-
try {
|
|
243
|
-
var eng = b.backup.create(_createOpts(data, root, {
|
|
244
|
-
requireFlush: true,
|
|
245
|
-
flushBeforeBackup: function () { throw new Error("flush-broke"); },
|
|
246
|
-
}));
|
|
247
|
-
var threw = null;
|
|
248
|
-
try { await eng.run(); } catch (e) { threw = e; }
|
|
249
|
-
check("create: requireFlush + failing flush aborts run with flush-required-failed",
|
|
250
|
-
threw && threw.code === "backup/flush-required-failed");
|
|
251
|
-
// No bundle should have landed in storage.
|
|
252
|
-
var listed = await eng.list();
|
|
253
|
-
check("create: aborted flush leaves no bundle in storage", listed.length === 0);
|
|
254
|
-
} finally { _rm(data); _rm(root); }
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
function testCreateHipaaRefusesUnencrypted() {
|
|
258
|
-
var data = _tmp("hip-data");
|
|
259
|
-
var root = _tmp("hip-root");
|
|
260
|
-
b.compliance.clear();
|
|
261
|
-
b.compliance.set("hipaa");
|
|
262
|
-
try {
|
|
263
|
-
var threw = null;
|
|
264
|
-
try { b.backup.create(_createOpts(data, root, { encrypt: false })); } catch (e) { threw = e; }
|
|
265
|
-
check("create: HIPAA posture + encrypt:false refused with encryption-required",
|
|
266
|
-
threw && threw.code === "backup/encryption-required");
|
|
267
|
-
// Default (encrypt on) still constructs under HIPAA.
|
|
268
|
-
var eng = b.backup.create(_createOpts(data, root));
|
|
269
|
-
check("create: HIPAA posture + default encryption constructs",
|
|
270
|
-
eng && typeof eng.run === "function");
|
|
271
|
-
} finally {
|
|
272
|
-
b.compliance.clear();
|
|
273
|
-
_rm(data); _rm(root);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// ---- verifyManifestSignature ----
|
|
278
|
-
|
|
279
|
-
function testVerifyManifestSignatureBadTarget() {
|
|
280
|
-
var t1 = null;
|
|
281
|
-
try { b.backup.verifyManifestSignature(12345); } catch (e) { t1 = e; }
|
|
282
|
-
check("verifyManifestSignature: numeric target refused with bad-target",
|
|
283
|
-
t1 && t1.code === "backup/bad-target");
|
|
284
|
-
var t2 = null;
|
|
285
|
-
try { b.backup.verifyManifestSignature(null); } catch (e) { t2 = e; }
|
|
286
|
-
check("verifyManifestSignature: null target refused with bad-target",
|
|
287
|
-
t2 && t2.code === "backup/bad-target");
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
function testVerifyManifestSignatureNoManifest() {
|
|
291
|
-
var dir = _tmp("vms-none");
|
|
292
|
-
try {
|
|
293
|
-
var threw = null;
|
|
294
|
-
try { b.backup.verifyManifestSignature(dir); } catch (e) { threw = e; }
|
|
295
|
-
check("verifyManifestSignature: missing manifest.json refused with no-manifest",
|
|
296
|
-
threw && threw.code === "backup/no-manifest");
|
|
297
|
-
} finally { _rm(dir); }
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
function testVerifyManifestSignatureBadManifest() {
|
|
301
|
-
var dir = _tmp("vms-bad");
|
|
302
|
-
try {
|
|
303
|
-
fs.writeFileSync(path.join(dir, "manifest.json"), "{ this is not valid json ");
|
|
304
|
-
var threw = null;
|
|
305
|
-
try { b.backup.verifyManifestSignature(dir); } catch (e) { threw = e; }
|
|
306
|
-
check("verifyManifestSignature: unparseable manifest refused with bad-manifest",
|
|
307
|
-
threw && threw.code === "backup/bad-manifest");
|
|
308
|
-
} finally { _rm(dir); }
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
function testVerifyManifestSignatureParsedObject() {
|
|
312
|
-
// A parsed manifest object (version number) with no signature block is
|
|
313
|
-
// NOT a throw — it returns a verdict the caller branches on.
|
|
314
|
-
var verdict = b.backup.verifyManifestSignature({ version: 1 });
|
|
315
|
-
check("verifyManifestSignature: unsigned parsed manifest returns ok:false verdict",
|
|
316
|
-
verdict && verdict.ok === false && typeof verdict.reason === "string");
|
|
317
|
-
// { manifest } wrapper form takes the same path.
|
|
318
|
-
var verdict2 = b.backup.verifyManifestSignature({ manifest: { version: 1 } });
|
|
319
|
-
check("verifyManifestSignature: { manifest } wrapper returns a verdict",
|
|
320
|
-
verdict2 && verdict2.ok === false);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
async function testVerifyManifestSignatureOnDiskStringPath() {
|
|
324
|
-
// Drive the on-disk string-path reader end-to-end through a real
|
|
325
|
-
// create()/read() bundle (the branch is otherwise integration-only).
|
|
326
|
-
var data = _tmp("vms-disk-data");
|
|
327
|
-
var root = _tmp("vms-disk-root");
|
|
328
|
-
var pull = path.join(os.tmpdir(), "bidx-vms-pull-" + Date.now());
|
|
329
|
-
try {
|
|
330
|
-
fs.writeFileSync(path.join(data, "db.enc"), Buffer.from("ENC"));
|
|
331
|
-
var eng = b.backup.create({
|
|
332
|
-
dataDir: data,
|
|
333
|
-
storage: b.backup.diskStorage({ root: root }),
|
|
334
|
-
passphrase: Buffer.from("pp"),
|
|
335
|
-
files: [{ relativePath: "db.enc", kind: "raw", required: true }],
|
|
336
|
-
vaultKeyJson: '{"v":1}',
|
|
337
|
-
audit: false,
|
|
338
|
-
});
|
|
339
|
-
var r = await eng.run();
|
|
340
|
-
await eng.read(r.bundleId, pull);
|
|
341
|
-
var verdict = b.backup.verifyManifestSignature(pull);
|
|
342
|
-
check("verifyManifestSignature: on-disk manifest parses + returns a verdict object",
|
|
343
|
-
verdict && typeof verdict.ok === "boolean");
|
|
344
|
-
// Pinning a fingerprint the manifest can't satisfy returns ok:false,
|
|
345
|
-
// not a throw.
|
|
346
|
-
var pinned = b.backup.verifyManifestSignature(pull, {
|
|
347
|
-
expectedFingerprint: "de".repeat(64),
|
|
348
|
-
});
|
|
349
|
-
check("verifyManifestSignature: unmatchable pinned fingerprint returns ok:false",
|
|
350
|
-
pinned && pinned.ok === false);
|
|
351
|
-
} finally { _rm(data); _rm(root); _rm(pull); }
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
// ---- bundleAdapterStorage: construction validation ----
|
|
355
|
-
|
|
356
|
-
function _fsAdapter(tag) {
|
|
357
|
-
return b.backup.bundleAdapterStorage.fsAdapter({ root: _tmp(tag) });
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
function testAdapterStorageConstructionValidation() {
|
|
361
|
-
var t;
|
|
362
|
-
|
|
363
|
-
t = null;
|
|
364
|
-
try { b.backup.bundleAdapterStorage({ adapter: {} }); } catch (e) { t = e; }
|
|
365
|
-
check("bundleAdapterStorage: adapter missing methods refused with bad-adapter",
|
|
366
|
-
t && t.code === "backup/bad-adapter");
|
|
367
|
-
|
|
368
|
-
t = null;
|
|
369
|
-
try { b.backup.bundleAdapterStorage({ adapter: _fsAdapter("f1"), format: "zip" }); } catch (e) { t = e; }
|
|
370
|
-
check("bundleAdapterStorage: unknown format refused with bad-format",
|
|
371
|
-
t && t.code === "backup/bad-format");
|
|
372
|
-
|
|
373
|
-
t = null;
|
|
374
|
-
try { b.backup.bundleAdapterStorage({ adapter: _fsAdapter("f2"), cryptoStrategy: "rot13" }); } catch (e) { t = e; }
|
|
375
|
-
check("bundleAdapterStorage: unknown cryptoStrategy refused with bad-crypto-strategy",
|
|
376
|
-
t && t.code === "backup/bad-crypto-strategy");
|
|
377
|
-
|
|
378
|
-
t = null;
|
|
379
|
-
try { b.backup.bundleAdapterStorage({ adapter: _fsAdapter("f3"), cryptoStrategy: "recipient" }); } catch (e) { t = e; }
|
|
380
|
-
check("bundleAdapterStorage: recipient strategy without recipient refused with no-recipient",
|
|
381
|
-
t && t.code === "backup/no-recipient");
|
|
382
|
-
|
|
383
|
-
t = null;
|
|
384
|
-
try { b.backup.bundleAdapterStorage({ adapter: _fsAdapter("f4"), cryptoStrategy: "passphrase" }); } catch (e) { t = e; }
|
|
385
|
-
check("bundleAdapterStorage: passphrase strategy without passphrase refused with no-passphrase",
|
|
386
|
-
t && t.code === "backup/no-passphrase");
|
|
387
|
-
|
|
388
|
-
t = null;
|
|
389
|
-
try {
|
|
390
|
-
b.backup.bundleAdapterStorage({
|
|
391
|
-
adapter: _fsAdapter("f5"), cryptoStrategy: "recipient", recipient: {}, format: "directory",
|
|
392
|
-
});
|
|
393
|
-
} catch (e) { t = e; }
|
|
394
|
-
check("bundleAdapterStorage: recipient + directory format refused (envelope needs bundled format)",
|
|
395
|
-
t && t.code === "backup/recipient-strategy-needs-bundled-format");
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
function testAdapterStorageEntropyFloorValidation() {
|
|
399
|
-
// NaN / Infinity / negative passphraseMinEntropyBits must be refused
|
|
400
|
-
// upfront so the HIPAA/PCI-DSS 128-bit floor can't be NaN'd out.
|
|
401
|
-
["nan", "inf", "neg"].forEach(function (kind) {
|
|
402
|
-
var val = kind === "nan" ? NaN : kind === "inf" ? Infinity : -10;
|
|
403
|
-
var t = null;
|
|
404
|
-
try {
|
|
405
|
-
b.backup.bundleAdapterStorage({
|
|
406
|
-
adapter: _fsAdapter("ent-" + kind),
|
|
407
|
-
cryptoStrategy: "passphrase",
|
|
408
|
-
passphrase: "x",
|
|
409
|
-
passphraseMinEntropyBits: val,
|
|
410
|
-
});
|
|
411
|
-
} catch (e) { t = e; }
|
|
412
|
-
check("bundleAdapterStorage: passphraseMinEntropyBits=" + kind + " refused with bad-arg",
|
|
413
|
-
t && t.code === "backup/bad-arg");
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
function testAdapterStorageMaxBundleBytesValidation() {
|
|
418
|
-
["nan", "neg", "zero"].forEach(function (kind) {
|
|
419
|
-
var val = kind === "nan" ? NaN : kind === "neg" ? -1 : 0;
|
|
420
|
-
var t = null;
|
|
421
|
-
try {
|
|
422
|
-
b.backup.bundleAdapterStorage({ adapter: _fsAdapter("mbb-" + kind), maxBundleBytes: val });
|
|
423
|
-
} catch (e) { t = e; }
|
|
424
|
-
check("bundleAdapterStorage: maxBundleBytes=" + kind + " refused with bad-arg",
|
|
425
|
-
t && t.code === "backup/bad-arg");
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
function testAdapterStoragePostureGateOptIn() {
|
|
430
|
-
// The posture gate is opt-in via opts.posture (see the reported
|
|
431
|
-
// asymmetry with create(), which reads the ambient posture). When
|
|
432
|
-
// opts.posture names a regulated posture, cryptoStrategy:"none" is
|
|
433
|
-
// refused.
|
|
434
|
-
var t = null;
|
|
435
|
-
try {
|
|
436
|
-
b.backup.bundleAdapterStorage({ adapter: _fsAdapter("pg"), posture: "hipaa", cryptoStrategy: "none" });
|
|
437
|
-
} catch (e) { t = e; }
|
|
438
|
-
check("bundleAdapterStorage: opts.posture=hipaa + cryptoStrategy none refused",
|
|
439
|
-
t && t.code === "backup/posture-requires-encryption");
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
async function testAdapterStorageBundleTooLarge() {
|
|
443
|
-
var root = _tmp("tl-root");
|
|
444
|
-
var src = _mkSrcDir({ "big.bin": Buffer.alloc(2048) });
|
|
445
|
-
try {
|
|
446
|
-
var storage = b.backup.bundleAdapterStorage({
|
|
447
|
-
adapter: b.backup.bundleAdapterStorage.fsAdapter({ root: root }),
|
|
448
|
-
format: "tar",
|
|
449
|
-
maxBundleBytes: 512,
|
|
450
|
-
});
|
|
451
|
-
var threw = null;
|
|
452
|
-
try { await storage.writeBundle(VALID_ID, src); } catch (e) { threw = e; }
|
|
453
|
-
check("bundleAdapterStorage.writeBundle: oversize source refused with bundle-too-large",
|
|
454
|
-
threw && threw.code === "backup/bundle-too-large");
|
|
455
|
-
} finally { _rm(root); _rm(src); }
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
async function testAdapterStoragePassphraseFloorEnforcedOnWrite() {
|
|
459
|
-
// An explicit high entropy floor makes a weak passphrase fail at
|
|
460
|
-
// write time (drives the real wrapWithPassphrase consumer path).
|
|
461
|
-
var root = _tmp("pf-root");
|
|
462
|
-
var src = _mkSrcDir({ "a.txt": "data" });
|
|
463
|
-
try {
|
|
464
|
-
var storage = b.backup.bundleAdapterStorage({
|
|
465
|
-
adapter: b.backup.bundleAdapterStorage.fsAdapter({ root: root }),
|
|
466
|
-
format: "tar",
|
|
467
|
-
cryptoStrategy: "passphrase",
|
|
468
|
-
passphrase: "ab",
|
|
469
|
-
passphraseMinEntropyBits: 256,
|
|
470
|
-
});
|
|
471
|
-
var threw = null;
|
|
472
|
-
try { await storage.writeBundle(VALID_ID, src); } catch (e) { threw = e; }
|
|
473
|
-
check("bundleAdapterStorage: weak passphrase below entropy floor refused on write",
|
|
474
|
-
threw && /weak-passphrase|entropy/i.test(_errOf(threw)));
|
|
475
|
-
} finally { _rm(root); _rm(src); }
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
// ---- bundleAdapterStorage: directory-format round-trip ----
|
|
479
|
-
|
|
480
|
-
async function testAdapterStorageDirectoryRoundTrip() {
|
|
481
|
-
var root = _tmp("dir-root");
|
|
482
|
-
var src = _mkSrcDir({ "manifest.json": "{\"version\":1}", "files/a.enc": "AAA" });
|
|
483
|
-
var dest = path.join(os.tmpdir(), "bidx-dir-dest-" + Date.now());
|
|
484
|
-
try {
|
|
485
|
-
var storage = b.backup.bundleAdapterStorage({
|
|
486
|
-
adapter: b.backup.bundleAdapterStorage.fsAdapter({ root: root }),
|
|
487
|
-
format: "directory",
|
|
488
|
-
});
|
|
489
|
-
await storage.writeBundle(VALID_ID, src);
|
|
490
|
-
check("adapter/directory: hasBundle true after write", await storage.hasBundle(VALID_ID));
|
|
491
|
-
|
|
492
|
-
var info = await storage.bundleInfo(VALID_ID);
|
|
493
|
-
check("adapter/directory: bundleInfo reports directory format + no envelope",
|
|
494
|
-
info.format === "directory" && info.envelopeKind === "none");
|
|
495
|
-
|
|
496
|
-
var listed = await storage.listBundles();
|
|
497
|
-
check("adapter/directory: listBundles reports the bundle with directory format",
|
|
498
|
-
listed.length === 1 && listed[0].bundleId === VALID_ID && listed[0].format === "directory");
|
|
499
|
-
|
|
500
|
-
var vb = await storage.verifyBundle(VALID_ID);
|
|
501
|
-
check("adapter/directory: verifyBundle ok:true (manifest presence is the check)",
|
|
502
|
-
vb.ok === true && vb.format === "directory" && vb.entryCount === null);
|
|
503
|
-
|
|
504
|
-
await storage.readBundle(VALID_ID, dest);
|
|
505
|
-
check("adapter/directory: readBundle recovers the file bytes",
|
|
506
|
-
fs.readFileSync(path.join(dest, "files", "a.enc"), "utf8") === "AAA");
|
|
507
|
-
|
|
508
|
-
var dupe = null;
|
|
509
|
-
try { await storage.writeBundle(VALID_ID, src); } catch (e) { dupe = e; }
|
|
510
|
-
check("adapter/directory: duplicate write refused with bundle-exists",
|
|
511
|
-
dupe && dupe.code === "backup/bundle-exists");
|
|
512
|
-
|
|
513
|
-
var de = null;
|
|
514
|
-
try { await storage.readBundle(VALID_ID, dest); } catch (e) { de = e; }
|
|
515
|
-
check("adapter/directory: readBundle into existing dest refused with dest-exists",
|
|
516
|
-
de && de.code === "backup/dest-exists");
|
|
517
|
-
|
|
518
|
-
await storage.deleteBundle(VALID_ID);
|
|
519
|
-
check("adapter/directory: hasBundle false after delete",
|
|
520
|
-
(await storage.hasBundle(VALID_ID)) === false);
|
|
521
|
-
} finally { _rm(root); _rm(src); _rm(dest); }
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
async function testAdapterStorageTarVerifyAndMissing() {
|
|
525
|
-
var root = _tmp("tar-root");
|
|
526
|
-
var src = _mkSrcDir({ "x.txt": "hello", "y.txt": "world" });
|
|
527
|
-
try {
|
|
528
|
-
var storage = b.backup.bundleAdapterStorage({
|
|
529
|
-
adapter: b.backup.bundleAdapterStorage.fsAdapter({ root: root }),
|
|
530
|
-
format: "tar",
|
|
531
|
-
});
|
|
532
|
-
await storage.writeBundle(VALID_ID, src);
|
|
533
|
-
var vb = await storage.verifyBundle(VALID_ID);
|
|
534
|
-
check("adapter/tar: verifyBundle walks tar entries + counts them",
|
|
535
|
-
vb.ok === true && vb.format === "tar" && vb.entryCount === 2);
|
|
536
|
-
|
|
537
|
-
var nf = null;
|
|
538
|
-
try { await storage.bundleInfo(ABSENT_ID); } catch (e) { nf = e; }
|
|
539
|
-
check("adapter/tar: bundleInfo on absent bundle refused with bundle-not-found",
|
|
540
|
-
nf && nf.code === "backup/bundle-not-found");
|
|
541
|
-
|
|
542
|
-
var ns = null;
|
|
543
|
-
try { await storage.writeBundle(VALID_ID2, path.join(os.tmpdir(), "no-such-src-" + Date.now())); } catch (e) { ns = e; }
|
|
544
|
-
check("adapter/tar: writeBundle with missing sourceDir refused with no-source",
|
|
545
|
-
ns && ns.code === "backup/no-source");
|
|
546
|
-
} finally { _rm(root); _rm(src); }
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
// ---- fsAdapter capabilities ----
|
|
550
|
-
|
|
551
|
-
async function testFsAdapterTraversalRefused() {
|
|
552
|
-
var root = _tmp("fsad-trav");
|
|
553
|
-
try {
|
|
554
|
-
var adapter = b.backup.bundleAdapterStorage.fsAdapter({ root: root });
|
|
555
|
-
var t = null;
|
|
556
|
-
try { await adapter.writeFile("../escape", Buffer.from("x")); } catch (e) { t = e; }
|
|
557
|
-
check("fsAdapter.writeFile: traversal key refused with bad-key",
|
|
558
|
-
t && t.code === "backup/bad-key");
|
|
559
|
-
} finally { _rm(root); }
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
async function testFsAdapterReadPartialAndStat() {
|
|
563
|
-
var root = _tmp("fsad-rp");
|
|
564
|
-
try {
|
|
565
|
-
var adapter = b.backup.bundleAdapterStorage.fsAdapter({ root: root });
|
|
566
|
-
await adapter.writeFile("k1", Buffer.from("hello-world"));
|
|
567
|
-
var head = await adapter.readPartial("k1", 5);
|
|
568
|
-
check("fsAdapter.readPartial: returns only the requested leading bytes",
|
|
569
|
-
Buffer.isBuffer(head) && head.toString() === "hello");
|
|
570
|
-
|
|
571
|
-
var st = await adapter.statKey("k1");
|
|
572
|
-
check("fsAdapter.statKey: reports size + mtimeMs for an existing key",
|
|
573
|
-
st && st.size === 11 && typeof st.mtimeMs === "number");
|
|
574
|
-
check("fsAdapter.statKey: null for a missing key", (await adapter.statKey("nope")) === null);
|
|
575
|
-
check("fsAdapter.hasKey: true for existing / false for missing",
|
|
576
|
-
(await adapter.hasKey("k1")) === true && (await adapter.hasKey("nope")) === false);
|
|
577
|
-
|
|
578
|
-
var t = null;
|
|
579
|
-
try { await adapter.readPartial("nope", 4); } catch (e) { t = e; }
|
|
580
|
-
check("fsAdapter.readPartial: missing key refused with no-key",
|
|
581
|
-
t && t.code === "backup/no-key");
|
|
582
|
-
|
|
583
|
-
var delThrew = null;
|
|
584
|
-
try { await adapter.deleteKey("nope"); } catch (e) { delThrew = e; }
|
|
585
|
-
check("fsAdapter.deleteKey: absent key is a silent no-op", delThrew === null);
|
|
586
|
-
} finally { _rm(root); }
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
// ---- migrate ----
|
|
590
|
-
|
|
591
|
-
async function testMigrateValidation() {
|
|
592
|
-
var t1 = null;
|
|
593
|
-
try { await b.backup.migrate({ from: {}, to: {} }); } catch (e) { t1 = e; }
|
|
594
|
-
check("migrate: bad from backend refused with bad-from",
|
|
595
|
-
t1 && t1.code === "backup/bad-from");
|
|
596
|
-
|
|
597
|
-
var t2 = null;
|
|
598
|
-
try {
|
|
599
|
-
await b.backup.migrate({
|
|
600
|
-
from: { readBundle: function () {}, listBundles: function () {} },
|
|
601
|
-
to: {},
|
|
602
|
-
});
|
|
603
|
-
} catch (e) { t2 = e; }
|
|
604
|
-
check("migrate: bad to backend refused with bad-to",
|
|
605
|
-
t2 && t2.code === "backup/bad-to");
|
|
606
|
-
|
|
607
|
-
var t3 = null;
|
|
608
|
-
try {
|
|
609
|
-
await b.backup.migrate({
|
|
610
|
-
from: { readBundle: function () {}, listBundles: function () {} },
|
|
611
|
-
to: { writeBundle: function () {}, hasBundle: function () {} },
|
|
612
|
-
bundleId: "not-valid",
|
|
613
|
-
});
|
|
614
|
-
} catch (e) { t3 = e; }
|
|
615
|
-
check("migrate: malformed bundleId refused with bad-bundle-id",
|
|
616
|
-
t3 && t3.code === "backup/bad-bundle-id");
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
async function testMigrateDirectoryToTarRoundTrip() {
|
|
620
|
-
var fromRoot = _tmp("mig-from");
|
|
621
|
-
var toRoot = _tmp("mig-to");
|
|
622
|
-
var src = _mkSrcDir({ "manifest.json": "{\"version\":1}", "files/d.enc": "DDD" });
|
|
623
|
-
try {
|
|
624
|
-
var from = b.backup.bundleAdapterStorage({
|
|
625
|
-
adapter: b.backup.bundleAdapterStorage.fsAdapter({ root: fromRoot }),
|
|
626
|
-
format: "directory",
|
|
627
|
-
});
|
|
628
|
-
var to = b.backup.bundleAdapterStorage({
|
|
629
|
-
adapter: b.backup.bundleAdapterStorage.fsAdapter({ root: toRoot }),
|
|
630
|
-
format: "tar",
|
|
631
|
-
});
|
|
632
|
-
await from.writeBundle(VALID_ID, src);
|
|
633
|
-
|
|
634
|
-
var result = await b.backup.migrate({ from: from, to: to });
|
|
635
|
-
check("migrate: directory->tar migrates the bundle",
|
|
636
|
-
result.migrated === 1 && result.skipped === 0 && result.total === 1);
|
|
637
|
-
check("migrate: destination now holds the bundle", await to.hasBundle(VALID_ID));
|
|
638
|
-
var toInfo = await to.bundleInfo(VALID_ID);
|
|
639
|
-
check("migrate: destination bundle is tar format", toInfo.format === "tar");
|
|
640
|
-
|
|
641
|
-
// Re-running is idempotent: destination already has it → skipped.
|
|
642
|
-
var again = await b.backup.migrate({ from: from, to: to });
|
|
643
|
-
check("migrate: re-run is idempotent (skipped, not re-migrated)",
|
|
644
|
-
again.migrated === 0 && again.skipped === 1);
|
|
645
|
-
} finally { _rm(fromRoot); _rm(toRoot); _rm(src); }
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
async function run() {
|
|
649
|
-
testDiskStorageValidatesRoot();
|
|
650
|
-
await testDiskStorageBadBundleId();
|
|
651
|
-
await testDiskStorageBundleExistsAndNotFound();
|
|
652
|
-
await testDiskStorageListFiltersAndEmpty();
|
|
653
|
-
await testDiskStorageDeleteAndHasNoop();
|
|
654
|
-
|
|
655
|
-
testCreateResidencyTagValidation();
|
|
656
|
-
testCreateScheduleRequiresScheduler();
|
|
657
|
-
testCreateScheduleArgValidation();
|
|
658
|
-
await testCreateRequireFlushHardFails();
|
|
659
|
-
testCreateHipaaRefusesUnencrypted();
|
|
660
|
-
|
|
661
|
-
testVerifyManifestSignatureBadTarget();
|
|
662
|
-
testVerifyManifestSignatureNoManifest();
|
|
663
|
-
testVerifyManifestSignatureBadManifest();
|
|
664
|
-
testVerifyManifestSignatureParsedObject();
|
|
665
|
-
await testVerifyManifestSignatureOnDiskStringPath();
|
|
666
|
-
|
|
667
|
-
testAdapterStorageConstructionValidation();
|
|
668
|
-
testAdapterStorageEntropyFloorValidation();
|
|
669
|
-
testAdapterStorageMaxBundleBytesValidation();
|
|
670
|
-
testAdapterStoragePostureGateOptIn();
|
|
671
|
-
await testAdapterStorageBundleTooLarge();
|
|
672
|
-
await testAdapterStoragePassphraseFloorEnforcedOnWrite();
|
|
673
|
-
await testAdapterStorageDirectoryRoundTrip();
|
|
674
|
-
await testAdapterStorageTarVerifyAndMissing();
|
|
675
|
-
|
|
676
|
-
await testFsAdapterTraversalRefused();
|
|
677
|
-
await testFsAdapterReadPartialAndStat();
|
|
678
|
-
|
|
679
|
-
await testMigrateValidation();
|
|
680
|
-
await testMigrateDirectoryToTarRoundTrip();
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
module.exports = { run: run };
|
|
684
|
-
|
|
685
|
-
if (require.main === module) {
|
|
686
|
-
run().then(
|
|
687
|
-
function () { console.log("[backup-index-coverage] OK — " + helpers.getChecks() + " checks passed"); },
|
|
688
|
-
function (e) { console.error("FAIL:", e && e.stack || e); process.exit(1); }
|
|
689
|
-
);
|
|
690
|
-
}
|