@blamejs/blamejs-shop 0.5.12 → 0.5.14
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 +4 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/sales-tax-filings.js +143 -0
- 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
|
@@ -19,6 +19,7 @@ var b = helpers.b;
|
|
|
19
19
|
var os = require("node:os");
|
|
20
20
|
var path = require("node:path");
|
|
21
21
|
var fs = require("node:fs");
|
|
22
|
+
var zlib = require("node:zlib");
|
|
22
23
|
|
|
23
24
|
async function testRoundTripExtract() {
|
|
24
25
|
var z = b.archive.zip();
|
|
@@ -541,6 +542,10 @@ function buildZip64Store(name, data, crc, opts) {
|
|
|
541
542
|
cdExtra.writeBigUInt64LE(BigInt(size), 4);
|
|
542
543
|
cdExtra.writeBigUInt64LE(BigInt(size), 12);
|
|
543
544
|
if (includeOffset) cdExtra.writeBigUInt64LE(BigInt(lfhOffset), 20);
|
|
545
|
+
// Adversarial CD-extra fixtures inject a hand-built extra block to drive
|
|
546
|
+
// the ZIP64 extended-information refusal branches (truncated / missing /
|
|
547
|
+
// multi-disk / value-too-large).
|
|
548
|
+
if (opts.cdExtraOverride) cdExtra = opts.cdExtraOverride;
|
|
544
549
|
|
|
545
550
|
// Central directory header (46 bytes) with sentinel sizes.
|
|
546
551
|
var cd = Buffer.alloc(46);
|
|
@@ -557,7 +562,7 @@ function buildZip64Store(name, data, crc, opts) {
|
|
|
557
562
|
cd.writeUInt16LE(nameBuf.length, 28);
|
|
558
563
|
cd.writeUInt16LE(cdExtra.length, 30);
|
|
559
564
|
cd.writeUInt16LE(0, 32); // comment len
|
|
560
|
-
cd.writeUInt16LE(0, 34);
|
|
565
|
+
cd.writeUInt16LE(opts.diskSentinel === true ? U16_SENTINEL : 0, 34); // disk start (sentinel when opted in)
|
|
561
566
|
cd.writeUInt16LE(0, 36); // internal attrs
|
|
562
567
|
cd.writeUInt32LE(0, 38); // external attrs
|
|
563
568
|
cd.writeUInt32LE(includeOffset ? U32_SENTINEL : lfhOffset, 42); // lfh offset (sentinel when opted in)
|
|
@@ -686,7 +691,629 @@ async function testZip64Read() {
|
|
|
686
691
|
orphanErr && /zip64/.test(orphanErr.code || orphanErr.message));
|
|
687
692
|
}
|
|
688
693
|
|
|
694
|
+
// ---------------------------------------------------------------------------
|
|
695
|
+
// Adversarial / defensive branch coverage — hand-built malformed archives.
|
|
696
|
+
// The write side always emits well-formed classic archives, so the reader's
|
|
697
|
+
// refusal + defensive paths (bad signatures, LFH/CD skew, ZIP64 trailer
|
|
698
|
+
// corruption, entry-type policy, bomb caps, deflate decode) are driven from
|
|
699
|
+
// hand-crafted fixtures decoded through the real b.archive.read.zip consumer
|
|
700
|
+
// path (buffer / objectStore adapter).
|
|
701
|
+
// ---------------------------------------------------------------------------
|
|
702
|
+
|
|
703
|
+
var SIG_LFH_OK = 0x04034b50;
|
|
704
|
+
var SIG_CFH_OK = 0x02014b50;
|
|
705
|
+
var SIG_EOCD_OK = 0x06054b50;
|
|
706
|
+
|
|
707
|
+
// External-attribute high-16-bit unix mode markers (mode << 16).
|
|
708
|
+
var EXT_SYMLINK = 0xA1FF0000; // S_IFLNK
|
|
709
|
+
var EXT_SOCKET = 0xC0000000; // S_IFSOCK
|
|
710
|
+
var EXT_FIFO = 0x10000000; // S_IFIFO
|
|
711
|
+
var EXT_CHARDEV = 0x20000000; // S_IFCHR
|
|
712
|
+
var EXT_BLOCKDEV = 0x60000000; // S_IFBLK
|
|
713
|
+
var EXT_DIR = 0x40000000; // S_IFDIR
|
|
714
|
+
|
|
715
|
+
// Build a classic (non-ZIP64) archive with full per-entry field control so a
|
|
716
|
+
// single field can be corrupted to drive one refusal branch. Each spec:
|
|
717
|
+
// { name, data?, method?, usize?, csize?, crc?, flags?, externalAttrs?,
|
|
718
|
+
// lfhSig?, cdSig?, lfhMethod?, lfhCrc?, lfhCsize?, lfhUsize?, lfhName?,
|
|
719
|
+
// cdNameLen? }
|
|
720
|
+
// opts: { eocdDiskNumber?, eocdCdDisk?, totalEntries? }
|
|
721
|
+
function buildClassicZip(specs, opts) {
|
|
722
|
+
opts = opts || {};
|
|
723
|
+
var localParts = [];
|
|
724
|
+
var offsets = [];
|
|
725
|
+
var running = 0;
|
|
726
|
+
specs.forEach(function (s) {
|
|
727
|
+
var nameBuf = Buffer.from(s.name, "utf8");
|
|
728
|
+
var data = s.data || Buffer.alloc(0);
|
|
729
|
+
var usize = s.usize != null ? s.usize : data.length;
|
|
730
|
+
var csize = s.csize != null ? s.csize : data.length;
|
|
731
|
+
var crc = (s.crc != null ? s.crc : 0) >>> 0;
|
|
732
|
+
var method = s.method != null ? s.method : 0;
|
|
733
|
+
var lfh = Buffer.alloc(30);
|
|
734
|
+
lfh.writeUInt32LE((s.lfhSig != null ? s.lfhSig : SIG_LFH_OK) >>> 0, 0);
|
|
735
|
+
lfh.writeUInt16LE(20, 4);
|
|
736
|
+
lfh.writeUInt16LE(s.flags != null ? s.flags : 0, 6);
|
|
737
|
+
lfh.writeUInt16LE(s.lfhMethod != null ? s.lfhMethod : method, 8);
|
|
738
|
+
lfh.writeUInt16LE(0, 10);
|
|
739
|
+
lfh.writeUInt16LE(0x21, 12);
|
|
740
|
+
lfh.writeUInt32LE((s.lfhCrc != null ? s.lfhCrc : crc) >>> 0, 14);
|
|
741
|
+
lfh.writeUInt32LE((s.lfhCsize != null ? s.lfhCsize : csize) >>> 0, 18);
|
|
742
|
+
lfh.writeUInt32LE((s.lfhUsize != null ? s.lfhUsize : usize) >>> 0, 22);
|
|
743
|
+
var lfhNameBuf = s.lfhName != null ? Buffer.from(s.lfhName, "utf8") : nameBuf;
|
|
744
|
+
lfh.writeUInt16LE(lfhNameBuf.length, 26);
|
|
745
|
+
lfh.writeUInt16LE(0, 28);
|
|
746
|
+
var part = Buffer.concat([lfh, lfhNameBuf, data]);
|
|
747
|
+
offsets.push(running);
|
|
748
|
+
running += part.length;
|
|
749
|
+
localParts.push(part);
|
|
750
|
+
});
|
|
751
|
+
var localBlob = Buffer.concat(localParts);
|
|
752
|
+
var cdParts = [];
|
|
753
|
+
specs.forEach(function (s, i) {
|
|
754
|
+
var nameBuf = Buffer.from(s.name, "utf8");
|
|
755
|
+
var data = s.data || Buffer.alloc(0);
|
|
756
|
+
var usize = s.usize != null ? s.usize : data.length;
|
|
757
|
+
var csize = s.csize != null ? s.csize : data.length;
|
|
758
|
+
var crc = (s.crc != null ? s.crc : 0) >>> 0;
|
|
759
|
+
var method = s.method != null ? s.method : 0;
|
|
760
|
+
var cd = Buffer.alloc(46);
|
|
761
|
+
cd.writeUInt32LE((s.cdSig != null ? s.cdSig : SIG_CFH_OK) >>> 0, 0);
|
|
762
|
+
cd.writeUInt16LE(20, 4);
|
|
763
|
+
cd.writeUInt16LE(20, 6);
|
|
764
|
+
cd.writeUInt16LE(s.flags != null ? s.flags : 0, 8);
|
|
765
|
+
cd.writeUInt16LE(method, 10);
|
|
766
|
+
cd.writeUInt16LE(0, 12);
|
|
767
|
+
cd.writeUInt16LE(0x21, 14);
|
|
768
|
+
cd.writeUInt32LE(crc, 16);
|
|
769
|
+
cd.writeUInt32LE(csize >>> 0, 20);
|
|
770
|
+
cd.writeUInt32LE(usize >>> 0, 24);
|
|
771
|
+
cd.writeUInt16LE(s.cdNameLen != null ? s.cdNameLen : nameBuf.length, 28);
|
|
772
|
+
cd.writeUInt16LE(0, 30);
|
|
773
|
+
cd.writeUInt16LE(0, 32);
|
|
774
|
+
cd.writeUInt16LE(0, 34);
|
|
775
|
+
cd.writeUInt16LE(0, 36);
|
|
776
|
+
cd.writeUInt32LE(s.externalAttrs != null ? (s.externalAttrs >>> 0) : 0, 38);
|
|
777
|
+
cd.writeUInt32LE(offsets[i] >>> 0, 42);
|
|
778
|
+
cdParts.push(Buffer.concat([cd, nameBuf]));
|
|
779
|
+
});
|
|
780
|
+
var cdBlob = Buffer.concat(cdParts);
|
|
781
|
+
var eocd = Buffer.alloc(22);
|
|
782
|
+
eocd.writeUInt32LE(SIG_EOCD_OK, 0);
|
|
783
|
+
eocd.writeUInt16LE(opts.eocdDiskNumber != null ? opts.eocdDiskNumber : 0, 4);
|
|
784
|
+
eocd.writeUInt16LE(opts.eocdCdDisk != null ? opts.eocdCdDisk : 0, 6);
|
|
785
|
+
var total = opts.totalEntries != null ? opts.totalEntries : specs.length;
|
|
786
|
+
eocd.writeUInt16LE(total, 8);
|
|
787
|
+
eocd.writeUInt16LE(total, 10);
|
|
788
|
+
eocd.writeUInt32LE(cdBlob.length >>> 0, 12);
|
|
789
|
+
eocd.writeUInt32LE(localBlob.length >>> 0, 16);
|
|
790
|
+
eocd.writeUInt16LE(0, 20);
|
|
791
|
+
return Buffer.concat([localBlob, cdBlob, eocd]);
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
async function _inspectErr(bytes, opts) {
|
|
795
|
+
var e = null;
|
|
796
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(bytes), opts).inspect(); }
|
|
797
|
+
catch (err) { e = err; }
|
|
798
|
+
return e;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
async function _extractEntriesErr(bytes, opts, extractOpts) {
|
|
802
|
+
var e = null;
|
|
803
|
+
try {
|
|
804
|
+
var r = b.archive.read.zip(b.archive.adapters.buffer(bytes), opts);
|
|
805
|
+
for await (var x of r.extractEntries(extractOpts)) { void x; }
|
|
806
|
+
} catch (err) { e = err; }
|
|
807
|
+
return e;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
function _hasCode(e, code) { return !!(e && (e.code || "").indexOf(code) !== -1); }
|
|
811
|
+
|
|
812
|
+
// EOCD / central-directory structural refusals driven through inspect().
|
|
813
|
+
async function testMalformedRefusals() {
|
|
814
|
+
var e1 = await _inspectErr(Buffer.alloc(10));
|
|
815
|
+
check("archive-read: sub-EOCD-size archive refused", _hasCode(e1, "archive-read/too-small"));
|
|
816
|
+
|
|
817
|
+
var e2 = await _inspectErr(Buffer.alloc(100));
|
|
818
|
+
check("archive-read: no-EOCD archive refused", _hasCode(e2, "archive-read/no-eocd"));
|
|
819
|
+
|
|
820
|
+
var e3 = await _inspectErr(buildClassicZip([{ name: "a.txt", data: Buffer.from("x") }], { eocdDiskNumber: 1 }));
|
|
821
|
+
check("archive-read: multi-disk EOCD refused", _hasCode(e3, "archive-read/multi-disk"));
|
|
822
|
+
|
|
823
|
+
var e4 = await _inspectErr(buildClassicZip([{ name: "a.txt", data: Buffer.from("x"), cdSig: 0xdeadbeef }]));
|
|
824
|
+
check("archive-read: bad central-directory signature refused", _hasCode(e4, "archive-read/bad-cd-signature"));
|
|
825
|
+
|
|
826
|
+
var e5 = await _inspectErr(buildClassicZip([{ name: "a.txt", data: Buffer.from("x") }], { totalEntries: 2 }));
|
|
827
|
+
check("archive-read: CD truncated (entry count overshoot) refused", _hasCode(e5, "archive-read/cd-truncated"));
|
|
828
|
+
|
|
829
|
+
var e6 = await _inspectErr(buildClassicZip([{ name: "a.txt", data: Buffer.from("x"), cdNameLen: 500 }]));
|
|
830
|
+
check("archive-read: CD variable-length overflow refused", _hasCode(e6, "archive-read/cd-truncated"));
|
|
831
|
+
|
|
832
|
+
var empty = await b.archive.read.zip(b.archive.adapters.buffer(buildClassicZip([]))).inspect();
|
|
833
|
+
check("archive-read: empty archive yields no entries", Array.isArray(empty) && empty.length === 0);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// LFH/CD skew defense — every mismatched field refuses the entry.
|
|
837
|
+
async function testLfhCdSkewRefusals() {
|
|
838
|
+
var opts = { guardProfile: false };
|
|
839
|
+
function mk(spec) { return buildClassicZip([spec]); }
|
|
840
|
+
|
|
841
|
+
var e1 = await _extractEntriesErr(mk({ name: "a.txt", data: Buffer.from("hi"), lfhSig: 0xdeadbeef }), opts);
|
|
842
|
+
check("archive-read: bad LFH signature refused", _hasCode(e1, "archive-read/bad-lfh-signature"));
|
|
843
|
+
|
|
844
|
+
var e2 = await _extractEntriesErr(mk({ name: "a.txt", data: Buffer.from("hi"), method: 0, lfhMethod: 8 }), opts);
|
|
845
|
+
check("archive-read: LFH/CD method skew refused", _hasCode(e2, "archive-read/lfh-cd-skew"));
|
|
846
|
+
|
|
847
|
+
var e3 = await _extractEntriesErr(mk({ name: "a.txt", data: Buffer.from("hi"), crc: 1, lfhCrc: 2 }), opts);
|
|
848
|
+
check("archive-read: LFH/CD crc skew refused", _hasCode(e3, "archive-read/lfh-cd-skew"));
|
|
849
|
+
|
|
850
|
+
var e4 = await _extractEntriesErr(mk({ name: "a.txt", data: Buffer.from("hi"), lfhCsize: 99 }), opts);
|
|
851
|
+
check("archive-read: LFH/CD compressed-size skew refused", _hasCode(e4, "archive-read/lfh-cd-skew"));
|
|
852
|
+
|
|
853
|
+
var e5 = await _extractEntriesErr(mk({ name: "a.txt", data: Buffer.from("hi"), lfhUsize: 99 }), opts);
|
|
854
|
+
check("archive-read: LFH/CD uncompressed-size skew refused", _hasCode(e5, "archive-read/lfh-cd-skew"));
|
|
855
|
+
|
|
856
|
+
var e6 = await _extractEntriesErr(mk({ name: "a.txt", data: Buffer.from("hi"), lfhName: "b.txt" }), opts);
|
|
857
|
+
check("archive-read: LFH/CD name skew refused", _hasCode(e6, "archive-read/lfh-cd-skew"));
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// Zip-bomb caps that the round-trip happy path never trips.
|
|
861
|
+
async function testBombPolicyEdges() {
|
|
862
|
+
var z = b.archive.zip();
|
|
863
|
+
z.addFile("a.txt", "hello");
|
|
864
|
+
var good = z.toBuffer();
|
|
865
|
+
|
|
866
|
+
var e1 = null;
|
|
867
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(good), { bombPolicy: { maxEntries: 0 } }).inspect(); }
|
|
868
|
+
catch (err) { e1 = err; }
|
|
869
|
+
check("archive-read: maxEntries cap trips", _hasCode(e1, "archive-read/too-many-entries"));
|
|
870
|
+
|
|
871
|
+
// Highly compressible payload → expansion ratio well above the default 100.
|
|
872
|
+
var raw = Buffer.alloc(10000);
|
|
873
|
+
var deflated = zlib.deflateRawSync(raw);
|
|
874
|
+
var bytes = buildClassicZip([{ name: "z.bin", data: deflated, method: 8, usize: raw.length, csize: deflated.length }]);
|
|
875
|
+
var e2 = await _inspectErr(bytes);
|
|
876
|
+
check("archive-read: expansion-ratio cap trips", _hasCode(e2, "archive-read/expansion-ratio"));
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
// Deterministic, effectively incompressible bytes (sha256 chain off a fixed
|
|
880
|
+
// seed) so the entry's real deflate ratio is stable across runs.
|
|
881
|
+
function _incompressibleBytes(nBytes) {
|
|
882
|
+
var crypto = require("node:crypto");
|
|
883
|
+
var out = Buffer.alloc(nBytes);
|
|
884
|
+
var block = crypto.createHash("sha256").update("blamejs-archive-ratio-fixture").digest();
|
|
885
|
+
var pos = 0;
|
|
886
|
+
while (pos < nBytes) {
|
|
887
|
+
block = crypto.createHash("sha256").update(block).digest();
|
|
888
|
+
var n = Math.min(block.length, nBytes - pos);
|
|
889
|
+
block.copy(out, pos, 0, n);
|
|
890
|
+
pos += n;
|
|
891
|
+
}
|
|
892
|
+
return out;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
// The per-entry inflate must honor the operator's bombPolicy.maxExpansionRatio,
|
|
896
|
+
// not a stricter hardcoded default buried in the safeDecompress composition.
|
|
897
|
+
// A ~55:1 entry sits far under the reader's own default cap (100) and under an
|
|
898
|
+
// operator-raised cap (1000), yet the DEFLATE decode refused it because
|
|
899
|
+
// _decompressEntry composed b.safeDecompress WITHOUT forwarding maxRatio, so
|
|
900
|
+
// safeDecompress fell back to its own DEFAULT_MAX_RATIO (50) — silently
|
|
901
|
+
// overriding the operator's policy for every entry that compresses better than
|
|
902
|
+
// 50:1 (logs / JSON / zero-padded binaries). Root: archive-read/_decompressEntry.
|
|
903
|
+
async function testExpansionRatioHonorsPolicy() {
|
|
904
|
+
var payload = Buffer.concat([_incompressibleBytes(1000), Buffer.alloc(60000, 0)]);
|
|
905
|
+
var deflated = zlib.deflateRawSync(payload);
|
|
906
|
+
var ratio = payload.length / deflated.length;
|
|
907
|
+
// Precondition: the fixture ratio must sit in (50, 100] — above safe-decompress's
|
|
908
|
+
// hardcoded 50 default, below the reader's own default policy cap of 100.
|
|
909
|
+
check("archive-read: ratio fixture lands in (50, 100]", ratio > 50 && ratio <= 100);
|
|
910
|
+
|
|
911
|
+
var bytes = buildClassicZip([{
|
|
912
|
+
name: "log.txt", data: deflated, method: 8,
|
|
913
|
+
usize: payload.length, csize: deflated.length,
|
|
914
|
+
}]);
|
|
915
|
+
|
|
916
|
+
// Operator RAISES the ratio cap to 1000 — comfortably above the ~55:1 entry.
|
|
917
|
+
var generous = {
|
|
918
|
+
maxEntries: 1000, maxExpansionRatio: 1000,
|
|
919
|
+
maxEntryDecompressedBytes: 128 * 1024 * 1024,
|
|
920
|
+
maxTotalDecompressedBytes: 4 * 1024 * 1024 * 1024,
|
|
921
|
+
};
|
|
922
|
+
var got = [];
|
|
923
|
+
for await (var e of b.archive.read.zip(b.archive.adapters.buffer(bytes),
|
|
924
|
+
{ bombPolicy: generous, guardProfile: false }).extractEntries()) {
|
|
925
|
+
got.push(e);
|
|
926
|
+
}
|
|
927
|
+
check("archive-read: entry within operator maxExpansionRatio extracts (policy honored)",
|
|
928
|
+
got.length === 1 && got[0].bytes.equals(payload));
|
|
929
|
+
|
|
930
|
+
// Operator LOWERS the ratio cap below the entry's real ratio — still refused,
|
|
931
|
+
// proving the enforced cap tracks the operator value (not a hardcoded 50).
|
|
932
|
+
var strict = Object.assign({}, generous, { maxExpansionRatio: 30 });
|
|
933
|
+
var refused = null;
|
|
934
|
+
try {
|
|
935
|
+
var r2 = b.archive.read.zip(b.archive.adapters.buffer(bytes),
|
|
936
|
+
{ bombPolicy: strict, guardProfile: false });
|
|
937
|
+
for await (var x of r2.extractEntries()) { void x; }
|
|
938
|
+
} catch (err) { refused = err; }
|
|
939
|
+
check("archive-read: entry above operator maxExpansionRatio refused",
|
|
940
|
+
_hasCode(refused, "archive-read/expansion-ratio"));
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
// STORE + DEFLATE + unsupported-method decode paths + inspect() method labels.
|
|
944
|
+
async function testDecompressPaths() {
|
|
945
|
+
var opts = { guardProfile: false };
|
|
946
|
+
|
|
947
|
+
var payload = Buffer.from("deflate round-trip payload with some entropy 1234567890", "utf8");
|
|
948
|
+
var deflated = zlib.deflateRawSync(payload);
|
|
949
|
+
var dbytes = buildClassicZip([{ name: "d.txt", data: deflated, method: 8, usize: payload.length, csize: deflated.length }]);
|
|
950
|
+
var dr = b.archive.read.zip(b.archive.adapters.buffer(dbytes), opts);
|
|
951
|
+
var got = null;
|
|
952
|
+
for await (var e of dr.extractEntries()) { got = e; }
|
|
953
|
+
check("archive-read: DEFLATE entry inflates to exact bytes", got && got.bytes.equals(payload));
|
|
954
|
+
var di = await dr.inspect();
|
|
955
|
+
check("archive-read: inspect maps DEFLATE method label", di[0].method === "deflate");
|
|
956
|
+
|
|
957
|
+
var e2 = await _extractEntriesErr(buildClassicZip([{ name: "s.txt", data: Buffer.from("ABCDE"), csize: 5, usize: 7 }]), opts);
|
|
958
|
+
check("archive-read: STORE size mismatch refused", _hasCode(e2, "archive-read/store-size-mismatch"));
|
|
959
|
+
|
|
960
|
+
var umBytes = buildClassicZip([{ name: "u.bin", data: Buffer.from("QQ"), method: 99 }]);
|
|
961
|
+
var e3 = await _extractEntriesErr(umBytes, opts);
|
|
962
|
+
check("archive-read: unsupported method refused", _hasCode(e3, "archive-read/unsupported-method"));
|
|
963
|
+
var ui = await b.archive.read.zip(b.archive.adapters.buffer(umBytes), opts).inspect();
|
|
964
|
+
check("archive-read: inspect maps unknown method label", ui[0].method === "method-99");
|
|
965
|
+
|
|
966
|
+
var empBytes = buildClassicZip([{ name: "empty.txt", data: Buffer.alloc(0) }]);
|
|
967
|
+
var emptyGot = null;
|
|
968
|
+
for await (var ee of b.archive.read.zip(b.archive.adapters.buffer(empBytes), opts).extractEntries()) { emptyGot = ee; }
|
|
969
|
+
check("archive-read: empty entry yields zero-length buffer", emptyGot && emptyGot.bytes.length === 0);
|
|
970
|
+
|
|
971
|
+
// DEFLATE inflate-size mismatch — declared uncompressed size overstates the
|
|
972
|
+
// actual inflated length (still under the per-entry cap, so it reaches the
|
|
973
|
+
// post-inflate size check rather than a bomb refusal).
|
|
974
|
+
var infl = Buffer.from("0123456789", "utf8");
|
|
975
|
+
var inflDef = zlib.deflateRawSync(infl);
|
|
976
|
+
var inflBytes = buildClassicZip([{ name: "m.txt", data: inflDef, method: 8, usize: 20, csize: inflDef.length }]);
|
|
977
|
+
var e4 = await _extractEntriesErr(inflBytes, opts);
|
|
978
|
+
check("archive-read: DEFLATE inflate-size mismatch refused", _hasCode(e4, "archive-read/inflate-size-mismatch"));
|
|
979
|
+
|
|
980
|
+
// extractEntries skips directory entries (no bytes yielded for them).
|
|
981
|
+
var dirMix = buildClassicZip([
|
|
982
|
+
{ name: "d", externalAttrs: EXT_DIR },
|
|
983
|
+
{ name: "d/inner.txt", data: Buffer.from("in") },
|
|
984
|
+
]);
|
|
985
|
+
var dirNames = [];
|
|
986
|
+
for await (var de of b.archive.read.zip(b.archive.adapters.buffer(dirMix), opts).extractEntries()) { dirNames.push(de.name); }
|
|
987
|
+
check("archive-read: extractEntries skips directory entries",
|
|
988
|
+
dirNames.length === 1 && dirNames[0] === "d/inner.txt");
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
// b.archive.read.zip factory adapter-shape guards.
|
|
992
|
+
async function testZipFactoryAdapterGuards() {
|
|
993
|
+
var e1 = null;
|
|
994
|
+
try { b.archive.read.zip(null); } catch (err) { e1 = err; }
|
|
995
|
+
check("archive-read: null adapter refused", _hasCode(e1, "archive-read/bad-adapter"));
|
|
996
|
+
|
|
997
|
+
var e2 = null;
|
|
998
|
+
try { b.archive.read.zip({ kind: "bogus" }); } catch (err) { e2 = err; }
|
|
999
|
+
check("archive-read: wrong-kind adapter refused", _hasCode(e2, "archive-read/bad-adapter"));
|
|
1000
|
+
|
|
1001
|
+
var nodeStream = require("node:stream");
|
|
1002
|
+
var readable = new nodeStream.Readable({ read: function () {} });
|
|
1003
|
+
var e3 = null;
|
|
1004
|
+
try { b.archive.read.zip(b.archive.adapters.trustedStream(readable)); }
|
|
1005
|
+
catch (err) { e3 = err; }
|
|
1006
|
+
finally { readable.destroy(); }
|
|
1007
|
+
check("archive-read: trusted-stream adapter at random-access entry refused",
|
|
1008
|
+
_hasCode(e3, "archive-read/wrong-entry-point"));
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
// Entry-type classification surfaced on inspect() for every unix mode marker.
|
|
1012
|
+
async function testEntryTypeClassification() {
|
|
1013
|
+
var bytes = buildClassicZip([
|
|
1014
|
+
{ name: "link", externalAttrs: EXT_SYMLINK, data: Buffer.from("target") },
|
|
1015
|
+
{ name: "sock", externalAttrs: EXT_SOCKET },
|
|
1016
|
+
{ name: "pipe", externalAttrs: EXT_FIFO },
|
|
1017
|
+
{ name: "cdev", externalAttrs: EXT_CHARDEV },
|
|
1018
|
+
{ name: "bdev", externalAttrs: EXT_BLOCKDEV },
|
|
1019
|
+
{ name: "dattr", externalAttrs: EXT_DIR },
|
|
1020
|
+
{ name: "dslash/", data: Buffer.alloc(0) },
|
|
1021
|
+
{ name: "file.txt", data: Buffer.from("hi") },
|
|
1022
|
+
]);
|
|
1023
|
+
var entries = await b.archive.read.zip(b.archive.adapters.buffer(bytes)).inspect();
|
|
1024
|
+
var byName = {};
|
|
1025
|
+
entries.forEach(function (e) { byName[e.name] = e.entryType; });
|
|
1026
|
+
check("classify: symlink attrs", byName["link"] === "symlink");
|
|
1027
|
+
check("classify: socket attrs", byName["sock"] === "socket");
|
|
1028
|
+
check("classify: fifo attrs", byName["pipe"] === "fifo");
|
|
1029
|
+
check("classify: char device attrs", byName["cdev"] === "device");
|
|
1030
|
+
check("classify: block device attrs", byName["bdev"] === "device");
|
|
1031
|
+
check("classify: directory via unix mode attrs", byName["dattr"] === "directory");
|
|
1032
|
+
check("classify: directory via trailing slash", byName["dslash/"] === "directory");
|
|
1033
|
+
check("classify: regular file", byName["file.txt"] === "file");
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
// entryTypePolicy refuses dangerous-by-default entry types on both extract
|
|
1037
|
+
// paths (guardProfile:false isolates the type check from the guard cascade).
|
|
1038
|
+
async function testEntryTypePolicyRefusals() {
|
|
1039
|
+
var opts = { guardProfile: false };
|
|
1040
|
+
async function refuse(attrs, label) {
|
|
1041
|
+
var bytes = buildClassicZip([{ name: "n", externalAttrs: attrs, data: Buffer.from("x") }]);
|
|
1042
|
+
var e = await _extractEntriesErr(bytes, opts);
|
|
1043
|
+
check("entry-type policy refuses " + label,
|
|
1044
|
+
_hasCode(e, "archive-read/entry-type-refused") && (e.message || "").indexOf(label) !== -1);
|
|
1045
|
+
}
|
|
1046
|
+
await refuse(EXT_SYMLINK, "symlink");
|
|
1047
|
+
await refuse(EXT_CHARDEV, "device");
|
|
1048
|
+
await refuse(EXT_FIFO, "fifo");
|
|
1049
|
+
await refuse(EXT_SOCKET, "socket");
|
|
1050
|
+
|
|
1051
|
+
var dest = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-artype-"));
|
|
1052
|
+
var e = null;
|
|
1053
|
+
try {
|
|
1054
|
+
await b.archive.read.zip(
|
|
1055
|
+
b.archive.adapters.buffer(buildClassicZip([{ name: "lnk", externalAttrs: EXT_SYMLINK, data: Buffer.from("t") }])), opts
|
|
1056
|
+
).extract({ destination: dest });
|
|
1057
|
+
} catch (err) { e = err; }
|
|
1058
|
+
finally { fs.rmSync(dest, { recursive: true, force: true }); }
|
|
1059
|
+
check("entry-type policy refuses symlink on disk extract", _hasCode(e, "archive-read/entry-type-refused"));
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
// Encrypted entries are refused (this reader never decrypts) on both paths.
|
|
1063
|
+
async function testEncryptedEntryRefusal() {
|
|
1064
|
+
var opts = { guardProfile: false };
|
|
1065
|
+
var FLAG_ENCRYPTED = 0x0001;
|
|
1066
|
+
var bytes = buildClassicZip([{ name: "enc.txt", data: Buffer.from("cipher"), flags: FLAG_ENCRYPTED }]);
|
|
1067
|
+
|
|
1068
|
+
var e1 = await _extractEntriesErr(bytes, opts);
|
|
1069
|
+
check("archive-read: encrypted entry refused (extractEntries)", _hasCode(e1, "archive-read/encrypted-entry"));
|
|
1070
|
+
|
|
1071
|
+
var dest = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-enc-"));
|
|
1072
|
+
var e2 = null;
|
|
1073
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(bytes), opts).extract({ destination: dest }); }
|
|
1074
|
+
catch (err) { e2 = err; }
|
|
1075
|
+
finally { fs.rmSync(dest, { recursive: true, force: true }); }
|
|
1076
|
+
check("archive-read: encrypted entry refused (disk extract)", _hasCode(e2, "archive-read/encrypted-entry"));
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
// The raw-entry async generators on both reader variants.
|
|
1080
|
+
async function testEntriesGenerators() {
|
|
1081
|
+
var z = b.archive.zip();
|
|
1082
|
+
z.addFile("a.txt", "A");
|
|
1083
|
+
z.addFile("b.txt", "B");
|
|
1084
|
+
var bytes = z.toBuffer();
|
|
1085
|
+
|
|
1086
|
+
var names = [];
|
|
1087
|
+
for await (var e of b.archive.read.zip(b.archive.adapters.buffer(bytes)).entries()) { names.push(e.name); }
|
|
1088
|
+
check("archive-read: entries() random-access generator yields raw entries",
|
|
1089
|
+
names.length === 2 && names.indexOf("a.txt") !== -1);
|
|
1090
|
+
|
|
1091
|
+
var nodeStream = require("node:stream");
|
|
1092
|
+
var tnames = [];
|
|
1093
|
+
var tr = b.archive.read.zip.fromTrustedStream(
|
|
1094
|
+
b.archive.adapters.trustedStream(nodeStream.Readable.from(bytes)));
|
|
1095
|
+
for await (var te of tr.entries()) { tnames.push(te.name); }
|
|
1096
|
+
check("archive-read: entries() trusted-stream generator yields entries", tnames.length === 2);
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
// Disk extract(): no-destination refusal, destination auto-create, directory
|
|
1100
|
+
// materialization, and atomic rollback of a partial extract on a later error.
|
|
1101
|
+
async function testExtractDirAndCleanup() {
|
|
1102
|
+
var opts = { guardProfile: false };
|
|
1103
|
+
|
|
1104
|
+
var e0 = null;
|
|
1105
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(buildClassicZip([{ name: "a.txt", data: Buffer.from("x") }])), opts).extract({}); }
|
|
1106
|
+
catch (err) { e0 = err; }
|
|
1107
|
+
check("archive-read: extract without destination refused", _hasCode(e0, "archive-read/no-destination"));
|
|
1108
|
+
|
|
1109
|
+
var eEmpty = null;
|
|
1110
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(buildClassicZip([{ name: "a.txt", data: Buffer.from("x") }])), opts).extract({ destination: "" }); }
|
|
1111
|
+
catch (err) { eEmpty = err; }
|
|
1112
|
+
check("archive-read: extract with empty destination string refused", _hasCode(eEmpty, "archive-read/no-destination"));
|
|
1113
|
+
|
|
1114
|
+
var eBare = null;
|
|
1115
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(buildClassicZip([{ name: "a.txt", data: Buffer.from("x") }])), opts).extract(); }
|
|
1116
|
+
catch (err) { eBare = err; }
|
|
1117
|
+
check("archive-read: extract() with no options refused", _hasCode(eBare, "archive-read/no-destination"));
|
|
1118
|
+
|
|
1119
|
+
var base = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-extdir-"));
|
|
1120
|
+
var dest = path.join(base, "nested-not-there"); // does not exist yet
|
|
1121
|
+
try {
|
|
1122
|
+
var dbytes = buildClassicZip([
|
|
1123
|
+
{ name: "subdir", externalAttrs: EXT_DIR },
|
|
1124
|
+
{ name: "subdir/f.txt", data: Buffer.from("inside\n") },
|
|
1125
|
+
]);
|
|
1126
|
+
var res = await b.archive.read.zip(b.archive.adapters.buffer(dbytes), opts).extract({ destination: dest });
|
|
1127
|
+
check("archive-read: extract auto-creates destination + writes file", res.bytesExtracted === 7);
|
|
1128
|
+
check("archive-read: directory entry materialized", fs.existsSync(path.join(dest, "subdir")));
|
|
1129
|
+
check("archive-read: file under directory restored",
|
|
1130
|
+
fs.readFileSync(path.join(dest, "subdir", "f.txt"), "utf8") === "inside\n");
|
|
1131
|
+
} finally {
|
|
1132
|
+
fs.rmSync(base, { recursive: true, force: true });
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
var base2 = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-extcleanup-"));
|
|
1136
|
+
try {
|
|
1137
|
+
var mixed = buildClassicZip([
|
|
1138
|
+
{ name: "ok.txt", data: Buffer.from("kept-until-rollback\n") },
|
|
1139
|
+
{ name: "bad.bin", data: Buffer.from("ZZ"), method: 99 },
|
|
1140
|
+
]);
|
|
1141
|
+
var e2 = null;
|
|
1142
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(mixed), opts).extract({ destination: base2 }); }
|
|
1143
|
+
catch (err) { e2 = err; }
|
|
1144
|
+
check("archive-read: extract aborts on a later bad entry", _hasCode(e2, "archive-read/unsupported-method"));
|
|
1145
|
+
check("archive-read: partial file rolled back on abort", !fs.existsSync(path.join(base2, "ok.txt")));
|
|
1146
|
+
} finally {
|
|
1147
|
+
fs.rmSync(base2, { recursive: true, force: true });
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
// ZIP64 trailer (EOCD64 record + locator) corruption refusals.
|
|
1152
|
+
async function testZip64TrailerErrors() {
|
|
1153
|
+
var payload = Buffer.from("zip64 trailer error fixtures", "utf8");
|
|
1154
|
+
var z = b.archive.zip();
|
|
1155
|
+
z.addFile("z.txt", payload);
|
|
1156
|
+
var crc = (await b.archive.read.zip(b.archive.adapters.buffer(z.toBuffer())).inspect())[0].crc;
|
|
1157
|
+
|
|
1158
|
+
function base() { return buildZip64Store("z.txt", payload, crc); }
|
|
1159
|
+
var LOC = 22 + 20; // locator starts 42 bytes from EOF
|
|
1160
|
+
var E64 = 22 + 20 + 56; // eocd64 record starts 98 bytes from EOF
|
|
1161
|
+
|
|
1162
|
+
var b1 = base(); b1.writeUInt32LE(0xdeadbeef, b1.length - LOC);
|
|
1163
|
+
var e1 = await _inspectErr(b1);
|
|
1164
|
+
check("zip64: bad locator signature refused", _hasCode(e1, "archive-read/zip64-locator-missing"));
|
|
1165
|
+
|
|
1166
|
+
var b2 = base(); b2.writeUInt32LE(2, b2.length - LOC + 16);
|
|
1167
|
+
var e2 = await _inspectErr(b2);
|
|
1168
|
+
check("zip64: multi-disk locator refused", _hasCode(e2, "archive-read/multi-disk"));
|
|
1169
|
+
|
|
1170
|
+
var b3 = base(); b3.writeBigUInt64LE(BigInt(b3.length + 1000), b3.length - LOC + 8);
|
|
1171
|
+
var e3 = await _inspectErr(b3);
|
|
1172
|
+
check("zip64: EOCD64 offset past EOF refused", _hasCode(e3, "archive-read/zip64-eocd-out-of-range"));
|
|
1173
|
+
|
|
1174
|
+
var b4 = base(); b4.writeUInt32LE(0xdeadbeef, b4.length - E64);
|
|
1175
|
+
var e4 = await _inspectErr(b4);
|
|
1176
|
+
check("zip64: bad EOCD64 record signature refused", _hasCode(e4, "archive-read/zip64-eocd-bad-signature"));
|
|
1177
|
+
|
|
1178
|
+
// Classic EOCD carries a sentinel but sits at offset 0 — no room for a locator.
|
|
1179
|
+
var tiny = Buffer.alloc(22);
|
|
1180
|
+
tiny.writeUInt32LE(0x06054b50, 0);
|
|
1181
|
+
tiny.writeUInt16LE(1, 8); tiny.writeUInt16LE(1, 10);
|
|
1182
|
+
tiny.writeUInt32LE(0xffffffff, 12); tiny.writeUInt32LE(0xffffffff, 16);
|
|
1183
|
+
var e5 = await _inspectErr(tiny);
|
|
1184
|
+
check("zip64: sentinel with no room for locator refused", _hasCode(e5, "archive-read/zip64-locator-missing"));
|
|
1185
|
+
|
|
1186
|
+
// EOCD64 resolves cdSize to a literal 0xFFFFFFFF, which the CD walk still
|
|
1187
|
+
// treats as an unresolved sentinel and refuses.
|
|
1188
|
+
var b6 = base();
|
|
1189
|
+
b6.writeBigUInt64LE(0xffffffffn, (b6.length - E64) + 40);
|
|
1190
|
+
var e6 = await _inspectErr(b6);
|
|
1191
|
+
check("zip64: EOCD64 leaves an unresolved sentinel refused", _hasCode(e6, "archive-read/zip64-eocd-unresolved"));
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
// ZIP64 extended-information extra field (§4.5.3) corruption refusals.
|
|
1195
|
+
async function testZip64ExtraErrors() {
|
|
1196
|
+
var payload = Buffer.from("x", "utf8");
|
|
1197
|
+
var z = b.archive.zip();
|
|
1198
|
+
z.addFile("z.txt", payload);
|
|
1199
|
+
var crc = (await b.archive.read.zip(b.archive.adapters.buffer(z.toBuffer())).inspect())[0].crc;
|
|
1200
|
+
|
|
1201
|
+
function zip64Extra(id, dataBuf) {
|
|
1202
|
+
var e = Buffer.alloc(4 + dataBuf.length);
|
|
1203
|
+
e.writeUInt16LE(id, 0);
|
|
1204
|
+
e.writeUInt16LE(dataBuf.length, 2);
|
|
1205
|
+
dataBuf.copy(e, 4);
|
|
1206
|
+
return e;
|
|
1207
|
+
}
|
|
1208
|
+
function withExtra(extra, more) {
|
|
1209
|
+
var o = { cdExtraOverride: extra };
|
|
1210
|
+
if (more) { Object.keys(more).forEach(function (k) { o[k] = more[k]; }); }
|
|
1211
|
+
return buildZip64Store("z.txt", payload, crc, o);
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
var huge = Buffer.alloc(16);
|
|
1215
|
+
huge.writeBigUInt64LE(1n << 53n, 0); // > Number.MAX_SAFE_INTEGER
|
|
1216
|
+
huge.writeBigUInt64LE(BigInt(payload.length), 8);
|
|
1217
|
+
var e1 = await _inspectErr(withExtra(zip64Extra(0x0001, huge)));
|
|
1218
|
+
check("zip64: extra value exceeding MAX_SAFE_INTEGER refused", _hasCode(e1, "archive-read/zip64-value-too-large"));
|
|
1219
|
+
|
|
1220
|
+
var e2 = await _inspectErr(withExtra(zip64Extra(0x0001, Buffer.alloc(0))));
|
|
1221
|
+
check("zip64: extra truncated (uncompressed) refused", _hasCode(e2, "archive-read/zip64-extra-truncated"));
|
|
1222
|
+
|
|
1223
|
+
var e3 = await _inspectErr(withExtra(zip64Extra(0x0001, Buffer.alloc(8))));
|
|
1224
|
+
check("zip64: extra truncated (compressed) refused", _hasCode(e3, "archive-read/zip64-extra-truncated"));
|
|
1225
|
+
|
|
1226
|
+
var e4 = await _inspectErr(withExtra(zip64Extra(0x0001, Buffer.alloc(16)), { offsetSentinel: true }));
|
|
1227
|
+
check("zip64: extra truncated (lfh offset) refused", _hasCode(e4, "archive-read/zip64-extra-truncated"));
|
|
1228
|
+
|
|
1229
|
+
var e5 = await _inspectErr(withExtra(zip64Extra(0x0001, Buffer.alloc(24)), { offsetSentinel: true, diskSentinel: true }));
|
|
1230
|
+
check("zip64: extra truncated (disk start) refused", _hasCode(e5, "archive-read/zip64-extra-truncated"));
|
|
1231
|
+
|
|
1232
|
+
var withDisk = Buffer.alloc(28); withDisk.writeUInt32LE(1, 24);
|
|
1233
|
+
var e6 = await _inspectErr(withExtra(zip64Extra(0x0001, withDisk), { offsetSentinel: true, diskSentinel: true }));
|
|
1234
|
+
check("zip64: non-zero disk start refused", _hasCode(e6, "archive-read/multi-disk"));
|
|
1235
|
+
|
|
1236
|
+
var e7 = await _inspectErr(withExtra(zip64Extra(0x9999, Buffer.alloc(0))));
|
|
1237
|
+
check("zip64: sentinel with no 0x0001 extra block refused", _hasCode(e7, "archive-read/zip64-extra-missing"));
|
|
1238
|
+
|
|
1239
|
+
var badHeader = Buffer.alloc(4);
|
|
1240
|
+
badHeader.writeUInt16LE(0x0001, 0);
|
|
1241
|
+
badHeader.writeUInt16LE(100, 2); // claims 100 bytes of data that aren't present
|
|
1242
|
+
var e8 = await _inspectErr(withExtra(badHeader));
|
|
1243
|
+
check("zip64: truncated extra header refused", _hasCode(e8, "archive-read/zip64-extra-missing"));
|
|
1244
|
+
|
|
1245
|
+
// A fully-present extra with a valid (zero) disk start resolves cleanly —
|
|
1246
|
+
// the success side of the disk-start check.
|
|
1247
|
+
var full = Buffer.alloc(28);
|
|
1248
|
+
full.writeBigUInt64LE(BigInt(payload.length), 0); // uncompressedSize
|
|
1249
|
+
full.writeBigUInt64LE(BigInt(payload.length), 8); // compressedSize
|
|
1250
|
+
full.writeBigUInt64LE(0n, 16); // localHeaderOffset
|
|
1251
|
+
full.writeUInt32LE(0, 24); // diskStart = 0 (valid, single-disk)
|
|
1252
|
+
var okEntries = await b.archive.read.zip(
|
|
1253
|
+
b.archive.adapters.buffer(withExtra(zip64Extra(0x0001, full), { offsetSentinel: true, diskSentinel: true }))
|
|
1254
|
+
).inspect();
|
|
1255
|
+
check("zip64: full extra with disk-start 0 resolves the entry",
|
|
1256
|
+
okEntries.length === 1 && okEntries[0].size === payload.length);
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
// objectStore adapter delivers size via resolveSize() (not a static .size),
|
|
1260
|
+
// exercising the reader's deferred-size EOCD-locate branch.
|
|
1261
|
+
async function testObjectStoreAdapterResolveSize() {
|
|
1262
|
+
var z = b.archive.zip();
|
|
1263
|
+
z.addFile("a.txt", "object-store payload");
|
|
1264
|
+
var bytes = z.toBuffer();
|
|
1265
|
+
var client = {
|
|
1266
|
+
head: async function () { return { size: bytes.length }; },
|
|
1267
|
+
get: async function (key, o) {
|
|
1268
|
+
var start = o.range[0], end = o.range[1];
|
|
1269
|
+
var slice = Buffer.allocUnsafe(end - start + 1);
|
|
1270
|
+
bytes.copy(slice, 0, start, end + 1);
|
|
1271
|
+
return slice;
|
|
1272
|
+
},
|
|
1273
|
+
};
|
|
1274
|
+
var adapter = b.archive.adapters.objectStore(client, "incoming/a.zip");
|
|
1275
|
+
var entries = await b.archive.read.zip(adapter).inspect();
|
|
1276
|
+
check("archive-read: objectStore adapter resolveSize path decodes",
|
|
1277
|
+
entries.length === 1 && entries[0].name === "a.txt");
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
// AbortSignal with a reason string surfaces the reason in the thrown message.
|
|
1281
|
+
async function testAbortWithReason() {
|
|
1282
|
+
var z = b.archive.zip();
|
|
1283
|
+
z.addFile("a.txt", "x");
|
|
1284
|
+
var bytes = z.toBuffer();
|
|
1285
|
+
var ac = new AbortController();
|
|
1286
|
+
ac.abort("operator cancelled the read");
|
|
1287
|
+
var e = null;
|
|
1288
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(bytes), { signal: ac.signal }).inspect(); }
|
|
1289
|
+
catch (err) { e = err; }
|
|
1290
|
+
check("archive-read: abort reason surfaced in message",
|
|
1291
|
+
_hasCode(e, "archive-read/aborted") && (e.message || "").indexOf("operator cancelled") !== -1);
|
|
1292
|
+
|
|
1293
|
+
// A signal-like object whose aborted flag is set but that carries no reason
|
|
1294
|
+
// exercises the no-reason message branch.
|
|
1295
|
+
var e2 = null;
|
|
1296
|
+
try { await b.archive.read.zip(b.archive.adapters.buffer(bytes), { signal: { aborted: true } }).inspect(); }
|
|
1297
|
+
catch (err) { e2 = err; }
|
|
1298
|
+
check("archive-read: aborted signal without a reason still refuses", _hasCode(e2, "archive-read/aborted"));
|
|
1299
|
+
}
|
|
1300
|
+
|
|
689
1301
|
async function run() {
|
|
1302
|
+
await testMalformedRefusals();
|
|
1303
|
+
await testLfhCdSkewRefusals();
|
|
1304
|
+
await testBombPolicyEdges();
|
|
1305
|
+
await testExpansionRatioHonorsPolicy();
|
|
1306
|
+
await testDecompressPaths();
|
|
1307
|
+
await testZipFactoryAdapterGuards();
|
|
1308
|
+
await testEntryTypeClassification();
|
|
1309
|
+
await testEntryTypePolicyRefusals();
|
|
1310
|
+
await testEncryptedEntryRefusal();
|
|
1311
|
+
await testEntriesGenerators();
|
|
1312
|
+
await testExtractDirAndCleanup();
|
|
1313
|
+
await testZip64TrailerErrors();
|
|
1314
|
+
await testZip64ExtraErrors();
|
|
1315
|
+
await testObjectStoreAdapterResolveSize();
|
|
1316
|
+
await testAbortWithReason();
|
|
690
1317
|
await testZip64Read();
|
|
691
1318
|
await testRoundTripExtract();
|
|
692
1319
|
await testExtractEntriesInMemory();
|