@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,21 @@
|
|
|
19
19
|
var helpers = require("../helpers");
|
|
20
20
|
var b = helpers.b;
|
|
21
21
|
var check = helpers.check;
|
|
22
|
+
var fs = helpers.fs;
|
|
23
|
+
var os = helpers.os;
|
|
24
|
+
var path = helpers.path;
|
|
25
|
+
|
|
26
|
+
// Small assertion helper for the many "this hostile shape must throw with
|
|
27
|
+
// exactly this GuardFilenameError code" cases below. Not a mock — a thin
|
|
28
|
+
// try/catch wrapper around the real b.guardFilename call the test drives.
|
|
29
|
+
function _expectThrowCode(label, code, fn) {
|
|
30
|
+
var threw = null;
|
|
31
|
+
try { fn(); }
|
|
32
|
+
catch (e) { threw = e; }
|
|
33
|
+
check(label + " throws " + code,
|
|
34
|
+
threw && threw.code === code &&
|
|
35
|
+
threw instanceof b.guardFilename.GuardFilenameError);
|
|
36
|
+
}
|
|
22
37
|
|
|
23
38
|
function testGuardFilenameSurface() {
|
|
24
39
|
check("guardFilename is an object", typeof b.guardFilename === "object");
|
|
@@ -390,6 +405,390 @@ function testGuardFilenameBadProfile() {
|
|
|
390
405
|
threw && /unknown profile/i.test(threw.message));
|
|
391
406
|
}
|
|
392
407
|
|
|
408
|
+
function testGuardFilenameEmptyInput() {
|
|
409
|
+
// Empty string / empty Buffer reach _detectIssues and surface an
|
|
410
|
+
// "empty" issue rather than throwing (validate never throws).
|
|
411
|
+
var rvStr = b.guardFilename.validate("", { profile: "strict" });
|
|
412
|
+
check("validate empty string → empty issue",
|
|
413
|
+
rvStr.ok === false &&
|
|
414
|
+
rvStr.issues.some(function (i) { return i.kind === "empty"; }));
|
|
415
|
+
|
|
416
|
+
var rvBuf = b.guardFilename.validate(Buffer.alloc(0), { profile: "strict" });
|
|
417
|
+
check("validate empty Buffer → empty issue",
|
|
418
|
+
rvBuf.issues.some(function (i) { return i.kind === "empty"; }));
|
|
419
|
+
|
|
420
|
+
// Non-string / non-Buffer input is rejected by the "bytes" input
|
|
421
|
+
// contract before the detector runs — a bad-input issue, not a crash.
|
|
422
|
+
var rvNum = b.guardFilename.validate(12345, { profile: "strict" });
|
|
423
|
+
check("validate non-string/Buffer → bad-input issue",
|
|
424
|
+
rvNum.ok === false &&
|
|
425
|
+
rvNum.issues.some(function (i) { return i.kind === "bad-input"; }));
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function testGuardFilenameBenignBufferNoOverlong() {
|
|
429
|
+
// A well-formed UTF-8 Buffer must NOT raise overlong-utf8 — exercises
|
|
430
|
+
// the buffer scan completing without a non-shortest sequence.
|
|
431
|
+
var rv = b.guardFilename.validate(Buffer.from("report-2026.txt", "utf8"),
|
|
432
|
+
{ profile: "strict" });
|
|
433
|
+
check("benign Buffer → no overlong-utf8 issue",
|
|
434
|
+
!rv.issues.some(function (i) { return i.kind === "overlong-utf8"; }));
|
|
435
|
+
check("benign ASCII Buffer → clean",
|
|
436
|
+
rv.ok === true && rv.issues.length === 0);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
function testGuardFilenameHomoglyph() {
|
|
440
|
+
// Cyrillic small a (U+0430) mixed with ASCII letters — visual-confusable
|
|
441
|
+
// spoof. Under balanced (homoglyphPolicy:"audit") it surfaces a warn-
|
|
442
|
+
// severity homoglyph issue.
|
|
443
|
+
var cyrA = String.fromCharCode(0x0430);
|
|
444
|
+
var rv = b.guardFilename.validate("p" + cyrA + "ypal.txt", { profile: "balanced" });
|
|
445
|
+
check("balanced: homoglyph mixed with ASCII detected (audit=warn)",
|
|
446
|
+
rv.issues.some(function (i) {
|
|
447
|
+
return i.kind === "homoglyph" && i.severity === "warn";
|
|
448
|
+
}));
|
|
449
|
+
|
|
450
|
+
// Under strict (homoglyphPolicy:"reject") the same char is critical.
|
|
451
|
+
var rvStrict = b.guardFilename.validate("p" + cyrA + "ypal.txt", { profile: "strict" });
|
|
452
|
+
check("strict: homoglyph severity is critical",
|
|
453
|
+
rvStrict.issues.some(function (i) {
|
|
454
|
+
return i.kind === "homoglyph" && i.severity === "critical";
|
|
455
|
+
}));
|
|
456
|
+
|
|
457
|
+
// No ASCII letters present → homoglyph rule short-circuits (nothing to
|
|
458
|
+
// confuse against), so a pure-Cyrillic leaf raises no homoglyph issue.
|
|
459
|
+
var rvPure = b.guardFilename.validate(cyrA + String.fromCharCode(0x0431),
|
|
460
|
+
{ profile: "balanced" });
|
|
461
|
+
check("pure non-ASCII leaf → no homoglyph issue (no ASCII to mix)",
|
|
462
|
+
!rvPure.issues.some(function (i) { return i.kind === "homoglyph"; }));
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
function testGuardFilenameSuperscriptReservedName() {
|
|
466
|
+
// Windows folds superscript digits U+00B9/00B2/00B3 to 1/2/3 when
|
|
467
|
+
// matching COM/LPT devices — "COM<sup1>" resolves to COM1. Exercises the
|
|
468
|
+
// superscript-fold branch in _isWinReserved.
|
|
469
|
+
var sup1 = String.fromCharCode(0xB9);
|
|
470
|
+
var rv = b.guardFilename.validate("COM" + sup1, { profile: "balanced" });
|
|
471
|
+
check("superscript-digit COM device spoof → reserved-name",
|
|
472
|
+
rv.issues.some(function (i) { return i.kind === "reserved-name"; }));
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function testGuardFilenameExtAllowlistNoExtension() {
|
|
476
|
+
// A name with NO extension against an allowlist → ext-not-allowlisted
|
|
477
|
+
// (the empty-extension branch of the allowlist check).
|
|
478
|
+
var rv = b.guardFilename.validate("readme", {
|
|
479
|
+
profile: "balanced",
|
|
480
|
+
extensionAllowlist: [".txt", ".md"],
|
|
481
|
+
});
|
|
482
|
+
check("no-extension name against allowlist → ext-not-allowlisted",
|
|
483
|
+
rv.issues.some(function (i) { return i.kind === "ext-not-allowlisted"; }));
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
function testGuardFilenameSanitizeEnforceRejections() {
|
|
487
|
+
// sanitize() default (enforce) mode — every reject/throw path below is a
|
|
488
|
+
// security-floor or profile-policy refusal the operator relies on.
|
|
489
|
+
|
|
490
|
+
_expectThrowCode("sanitize empty string", "filename.empty", function () {
|
|
491
|
+
b.guardFilename.sanitize("", { profile: "balanced" });
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
_expectThrowCode("sanitize overlong-UTF-8 Buffer", "filename.overlong-utf8", function () {
|
|
495
|
+
b.guardFilename.sanitize(Buffer.from([0xC0, 0xAE, 0x66]), { profile: "balanced" });
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
_expectThrowCode("sanitize UNC path", "filename.unc", function () {
|
|
499
|
+
b.guardFilename.sanitize("//server/share/file.txt", { profile: "balanced" });
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
// strict leadingTrailingPolicy:"reject" — leading whitespace refuses
|
|
503
|
+
// rather than being stripped.
|
|
504
|
+
_expectThrowCode("sanitize strict leading whitespace", "filename.leading-trailing", function () {
|
|
505
|
+
b.guardFilename.sanitize(" report.txt", { profile: "strict" });
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
_expectThrowCode("sanitize reserved char (reject)", "filename.reserved-char", function () {
|
|
509
|
+
b.guardFilename.sanitize("a<b.txt", { profile: "balanced" });
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
// balanced reservedCharPolicy:"reject" + pathSeparatorsPolicy:"reject" —
|
|
513
|
+
// the "/" is not a reserved char, so the path-separator branch refuses it.
|
|
514
|
+
_expectThrowCode("sanitize path separator (reject)", "filename.path-separator", function () {
|
|
515
|
+
b.guardFilename.sanitize("a/b.txt", { profile: "balanced" });
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
_expectThrowCode("sanitize reserved device name (reject)", "filename.reserved-name", function () {
|
|
519
|
+
b.guardFilename.sanitize("CON", { profile: "balanced" });
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
// permissive reservedNamePolicy:"audit" — disambiguates by prefixing "_"
|
|
523
|
+
// rather than throwing.
|
|
524
|
+
check("sanitize permissive reserved name → underscore-prefixed",
|
|
525
|
+
b.guardFilename.sanitize("CON", { profile: "permissive" }) === "_CON");
|
|
526
|
+
|
|
527
|
+
// NTFS ADS refusal in enforce mode. The ":" is normally caught by the
|
|
528
|
+
// reserved-char pass first, so opt that off to drive the dedicated ADS
|
|
529
|
+
// branch: reservedCharPolicy:"allow" keeps the colon, adsPolicy:"reject"
|
|
530
|
+
// refuses the stream syntax.
|
|
531
|
+
_expectThrowCode("sanitize NTFS ADS (dedicated branch)", "filename.ntfs-ads", function () {
|
|
532
|
+
b.guardFilename.sanitize("file.txt:stream", {
|
|
533
|
+
profile: "permissive",
|
|
534
|
+
reservedCharPolicy: "allow",
|
|
535
|
+
adsPolicy: "reject",
|
|
536
|
+
});
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
_expectThrowCode("sanitize over-length leaf", "filename.length", function () {
|
|
540
|
+
b.guardFilename.sanitize("x".repeat(300) + ".txt", { profile: "balanced" });
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
// Whitespace-only leaf strips to empty under permissive → post-strip
|
|
544
|
+
// empty refusal.
|
|
545
|
+
_expectThrowCode("sanitize strips to empty", "filename.empty", function () {
|
|
546
|
+
b.guardFilename.sanitize(" ", { profile: "permissive" });
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
function testGuardFilenameSanitizeBadInput() {
|
|
551
|
+
_expectThrowCode("sanitize non-string/Buffer input", "filename.bad-input", function () {
|
|
552
|
+
b.guardFilename.sanitize(12345, { profile: "balanced" });
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
function testGuardFilenameSanitizeStripModeFloor() {
|
|
557
|
+
// Strip-mode security floor branches not covered by the round-trip test.
|
|
558
|
+
_expectThrowCode("strip-mode overlong-UTF-8 Buffer", "filename.overlong-utf8", function () {
|
|
559
|
+
b.guardFilename.sanitize(Buffer.from([0xC0, 0xAE, 0x66]),
|
|
560
|
+
{ mode: "strip", profile: "balanced" });
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
_expectThrowCode("strip-mode empty string", "filename.empty", function () {
|
|
564
|
+
b.guardFilename.sanitize("", { mode: "strip", profile: "balanced" });
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
_expectThrowCode("strip-mode over-length leaf", "filename.length", function () {
|
|
568
|
+
b.guardFilename.sanitize("x".repeat(300), { mode: "strip", profile: "balanced" });
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
async function testGuardFilenameGateSanitizeAction() {
|
|
573
|
+
// The gate's "sanitize" action fires only when EVERY reject-policy is off
|
|
574
|
+
// and a strip-eligible high/critical issue is present. Drive it with an
|
|
575
|
+
// all-policies-non-reject config and a leading-whitespace name (a "high"
|
|
576
|
+
// leading-trailing issue that sanitize repairs to "report.txt").
|
|
577
|
+
var g = b.guardFilename.gate({
|
|
578
|
+
profile: "permissive",
|
|
579
|
+
bidiPolicy: "strip",
|
|
580
|
+
controlPolicy: "strip",
|
|
581
|
+
nullBytePolicy: "allow",
|
|
582
|
+
traversalPolicy: "audit",
|
|
583
|
+
reservedCharPolicy: "strip",
|
|
584
|
+
reservedNamePolicy: "audit",
|
|
585
|
+
adsPolicy: "audit",
|
|
586
|
+
pathSeparatorsPolicy: "audit",
|
|
587
|
+
leadingTrailingPolicy: "strip",
|
|
588
|
+
});
|
|
589
|
+
var v = await g.check({ filename: " report.txt" });
|
|
590
|
+
check("gate: sanitize-eligible issue → action=sanitize",
|
|
591
|
+
v.ok === true && v.action === "sanitize");
|
|
592
|
+
|
|
593
|
+
// audit-only: a warn-severity-only issue (no high/critical) resolves to
|
|
594
|
+
// action=audit-only. A homoglyph under audit policy is warn-only.
|
|
595
|
+
var gAudit = b.guardFilename.gate({ profile: "permissive", homoglyphPolicy: "audit" });
|
|
596
|
+
var vAudit = await gAudit.check({ filename: "p" + String.fromCharCode(0x0430) + "y" });
|
|
597
|
+
check("gate: warn-only issue → action=audit-only",
|
|
598
|
+
vAudit.action === "audit-only");
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
function testVerifyExtractionPathStringRefusals() {
|
|
602
|
+
var root = "/var/quarantine";
|
|
603
|
+
_expectThrowCode("vep empty entryName", "filename.extraction-empty", function () {
|
|
604
|
+
b.guardFilename.verifyExtractionPath("", root);
|
|
605
|
+
});
|
|
606
|
+
_expectThrowCode("vep non-string entryName", "filename.extraction-empty", function () {
|
|
607
|
+
b.guardFilename.verifyExtractionPath(123, root);
|
|
608
|
+
});
|
|
609
|
+
_expectThrowCode("vep empty extractionRoot", "filename.extraction-bad-root", function () {
|
|
610
|
+
b.guardFilename.verifyExtractionPath("ok.txt", "");
|
|
611
|
+
});
|
|
612
|
+
_expectThrowCode("vep non-string extractionRoot", "filename.extraction-bad-root", function () {
|
|
613
|
+
b.guardFilename.verifyExtractionPath("ok.txt", 123);
|
|
614
|
+
});
|
|
615
|
+
_expectThrowCode("vep PATH_MAX overflow", "filename.extraction-path-max", function () {
|
|
616
|
+
b.guardFilename.verifyExtractionPath("a".repeat(4097), root);
|
|
617
|
+
});
|
|
618
|
+
_expectThrowCode("vep null byte", "filename.extraction-null-byte", function () {
|
|
619
|
+
b.guardFilename.verifyExtractionPath("file" + String.fromCharCode(0) + ".txt", root);
|
|
620
|
+
});
|
|
621
|
+
_expectThrowCode("vep absolute path", "filename.extraction-absolute", function () {
|
|
622
|
+
b.guardFilename.verifyExtractionPath("/etc/passwd", root);
|
|
623
|
+
});
|
|
624
|
+
_expectThrowCode("vep drive-letter prefix", "filename.extraction-drive-prefix", function () {
|
|
625
|
+
b.guardFilename.verifyExtractionPath("C:/Windows/system32", root);
|
|
626
|
+
});
|
|
627
|
+
_expectThrowCode("vep .. leading segment", "filename.extraction-traversal", function () {
|
|
628
|
+
b.guardFilename.verifyExtractionPath("../etc/passwd", root);
|
|
629
|
+
});
|
|
630
|
+
_expectThrowCode("vep .. interior segment", "filename.extraction-traversal", function () {
|
|
631
|
+
b.guardFilename.verifyExtractionPath("a/../b", root);
|
|
632
|
+
});
|
|
633
|
+
_expectThrowCode("vep backslash .. segment", "filename.extraction-traversal", function () {
|
|
634
|
+
b.guardFilename.verifyExtractionPath("a\\..\\b", root);
|
|
635
|
+
});
|
|
636
|
+
_expectThrowCode("vep percent-encoded ..", "filename.extraction-traversal-encoded", function () {
|
|
637
|
+
b.guardFilename.verifyExtractionPath("docs/%2e%2e/x", root);
|
|
638
|
+
});
|
|
639
|
+
_expectThrowCode("vep overlong-encoded ..", "filename.extraction-traversal-encoded", function () {
|
|
640
|
+
b.guardFilename.verifyExtractionPath("docs/%c0%ae/x", root);
|
|
641
|
+
});
|
|
642
|
+
_expectThrowCode("vep reserved device segment", "filename.extraction-reserved-name", function () {
|
|
643
|
+
b.guardFilename.verifyExtractionPath("docs/CON/x.txt", root);
|
|
644
|
+
});
|
|
645
|
+
_expectThrowCode("vep NTFS ADS segment", "filename.extraction-ntfs-ads", function () {
|
|
646
|
+
b.guardFilename.verifyExtractionPath("docs/file.txt:stream", root);
|
|
647
|
+
});
|
|
648
|
+
_expectThrowCode("vep trailing-dot segment", "filename.extraction-leading-trailing", function () {
|
|
649
|
+
b.guardFilename.verifyExtractionPath("docs/secret.txt.", root);
|
|
650
|
+
});
|
|
651
|
+
_expectThrowCode("vep leading-whitespace segment", "filename.extraction-leading-trailing", function () {
|
|
652
|
+
b.guardFilename.verifyExtractionPath(" leading/x.txt", root);
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
function testVerifyExtractionPathOptOuts() {
|
|
657
|
+
// Non-existent root so the fs realpath block is skipped; each opt-out
|
|
658
|
+
// flips a Windows-hazard segment check off and the call succeeds.
|
|
659
|
+
var root = path.join(os.tmpdir(), "gfn-none-" + Date.now() + "-" + Math.random().toString(36).slice(2));
|
|
660
|
+
var r1 = b.guardFilename.verifyExtractionPath("docs/CON/x.txt", root,
|
|
661
|
+
{ reservedNamePolicy: "allow" });
|
|
662
|
+
check("vep reservedNamePolicy:allow permits CON segment",
|
|
663
|
+
typeof r1 === "string" && r1.indexOf("x.txt") !== -1);
|
|
664
|
+
|
|
665
|
+
var r2 = b.guardFilename.verifyExtractionPath("docs/file.txt:stream", root,
|
|
666
|
+
{ adsPolicy: "allow" });
|
|
667
|
+
check("vep adsPolicy:allow permits name:stream segment",
|
|
668
|
+
typeof r2 === "string" && r2.indexOf("stream") !== -1);
|
|
669
|
+
|
|
670
|
+
var r3 = b.guardFilename.verifyExtractionPath("docs/secret.txt.", root,
|
|
671
|
+
{ leadingTrailingPolicy: "allow" });
|
|
672
|
+
check("vep leadingTrailingPolicy:allow permits trailing dot",
|
|
673
|
+
typeof r3 === "string");
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
function testVerifyExtractionPathSuccess() {
|
|
677
|
+
// Non-existent root: string-containment passes, realpath block skipped,
|
|
678
|
+
// resolved path returned.
|
|
679
|
+
var noneRoot = path.join(os.tmpdir(), "gfn-none-" + Date.now() + "-" + Math.random().toString(36).slice(2));
|
|
680
|
+
var resolved = b.guardFilename.verifyExtractionPath("docs/readme.txt", noneRoot);
|
|
681
|
+
check("vep benign entry (no root on disk) → resolved path returned",
|
|
682
|
+
typeof resolved === "string" &&
|
|
683
|
+
resolved === path.resolve(noneRoot, "docs/readme.txt"));
|
|
684
|
+
|
|
685
|
+
// Existing root on disk: exercises the realpath-agreement block — every
|
|
686
|
+
// existing ancestor must realpath inside the realpath of the root.
|
|
687
|
+
var realRoot = fs.mkdtempSync(path.join(os.tmpdir(), "gfn-root-"));
|
|
688
|
+
try {
|
|
689
|
+
var r = b.guardFilename.verifyExtractionPath("sub/dir/file.txt", realRoot);
|
|
690
|
+
check("vep existing root → realpath-agreement passes, resolved returned",
|
|
691
|
+
r === path.resolve(realRoot, "sub/dir/file.txt"));
|
|
692
|
+
} finally {
|
|
693
|
+
try { fs.rmSync(realRoot, { recursive: true, force: true }); } catch (_e) { /* best-effort */ }
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
function testVerifyExtractionPathRealpathEscape() {
|
|
698
|
+
// A symlink/junction inside the root whose realpath escapes the root is
|
|
699
|
+
// the CVE-2025-4517 PATH_MAX-TOCTOU class: string containment passes
|
|
700
|
+
// (no ".." literal) but fs.realpath resolves outside. Junction on
|
|
701
|
+
// Windows (no admin needed) / symlink on POSIX.
|
|
702
|
+
var realRoot = fs.mkdtempSync(path.join(os.tmpdir(), "gfn-root-"));
|
|
703
|
+
var outside = fs.mkdtempSync(path.join(os.tmpdir(), "gfn-out-"));
|
|
704
|
+
var linkMade = false;
|
|
705
|
+
try {
|
|
706
|
+
var link = path.join(realRoot, "link");
|
|
707
|
+
try { fs.symlinkSync(outside, link, "junction"); linkMade = true; }
|
|
708
|
+
catch (_e1) {
|
|
709
|
+
try { fs.symlinkSync(outside, link, "dir"); linkMade = true; }
|
|
710
|
+
catch (_e2) { linkMade = false; }
|
|
711
|
+
}
|
|
712
|
+
if (linkMade) {
|
|
713
|
+
_expectThrowCode("vep symlink escaping root", "filename.extraction-realpath-escape", function () {
|
|
714
|
+
b.guardFilename.verifyExtractionPath("link/evil.txt", realRoot);
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
} finally {
|
|
718
|
+
try { fs.rmSync(realRoot, { recursive: true, force: true }); } catch (_e) { /* best-effort */ }
|
|
719
|
+
try { fs.rmSync(outside, { recursive: true, force: true }); } catch (_e) { /* best-effort */ }
|
|
720
|
+
}
|
|
721
|
+
check("vep realpath-escape test wired (symlink/junction created)", linkMade === true);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
function testGuardFilenameOverlongVariants() {
|
|
725
|
+
// 3-byte overlong (0xE0 0x80-0x9F) and 4-byte overlong (0xF0 0x80-0x8F)
|
|
726
|
+
// are non-shortest forms alongside the 2-byte 0xC0/0xC1 class.
|
|
727
|
+
var three = b.guardFilename.validate(Buffer.from([0xE0, 0x80, 0xAE, 0x78]),
|
|
728
|
+
{ profile: "strict" });
|
|
729
|
+
check("3-byte overlong UTF-8 detected",
|
|
730
|
+
three.issues.some(function (i) { return i.kind === "overlong-utf8"; }));
|
|
731
|
+
|
|
732
|
+
var four = b.guardFilename.validate(Buffer.from([0xF0, 0x80, 0x80, 0xAE]),
|
|
733
|
+
{ profile: "strict" });
|
|
734
|
+
check("4-byte overlong UTF-8 detected",
|
|
735
|
+
four.issues.some(function (i) { return i.kind === "overlong-utf8"; }));
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
function testGuardFilenameSanitizeBufferInput() {
|
|
739
|
+
// A well-formed Buffer flows through the Buffer arm of both sanitize
|
|
740
|
+
// modes' name-extraction and round-trips to its UTF-8 text.
|
|
741
|
+
check("sanitize enforce accepts a benign Buffer",
|
|
742
|
+
b.guardFilename.sanitize(Buffer.from("okname.txt", "utf8"),
|
|
743
|
+
{ profile: "balanced" }) === "okname.txt");
|
|
744
|
+
check("sanitize strip accepts a benign Buffer",
|
|
745
|
+
b.guardFilename.sanitize(Buffer.from("okname.txt", "utf8"),
|
|
746
|
+
{ mode: "strip", profile: "balanced" }) === "okname.txt");
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
function testGuardFilenameStripAuditEdge() {
|
|
750
|
+
// Buffer input through strip-mode audit — the originalLength computation
|
|
751
|
+
// takes its Buffer arm.
|
|
752
|
+
var captured = [];
|
|
753
|
+
var okAudit = { safeEmit: function (ev) { captured.push(ev); } };
|
|
754
|
+
var crBuf = Buffer.from("report" + String.fromCharCode(0x0D) + ".txt", "utf8");
|
|
755
|
+
var out = b.guardFilename.sanitize(crBuf, { mode: "strip", profile: "balanced", audit: okAudit });
|
|
756
|
+
check("strip-mode audit with Buffer input emits + strips CR",
|
|
757
|
+
out === "report_.txt" && captured.length === 1 &&
|
|
758
|
+
captured[0].action === "guardfilename.sanitize.stripped");
|
|
759
|
+
|
|
760
|
+
// A throwing audit sink must NOT propagate — the sink is drop-silent so
|
|
761
|
+
// a crashing audit backend never breaks the producer.
|
|
762
|
+
var throwingAudit = { safeEmit: function () { throw new Error("audit backend down"); } };
|
|
763
|
+
var stillOut = b.guardFilename.sanitize("report" + String.fromCharCode(0x0D) + ".txt",
|
|
764
|
+
{ mode: "strip", profile: "balanced", audit: throwingAudit });
|
|
765
|
+
check("strip-mode audit sink error is swallowed (drop-silent)",
|
|
766
|
+
stillOut === "report_.txt");
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
async function testGuardFilenameGateCtxShapes() {
|
|
770
|
+
var g = b.guardFilename.gate({ profile: "strict" });
|
|
771
|
+
|
|
772
|
+
// ctx.name (not ctx.filename) is the fallback identity key.
|
|
773
|
+
var byName = await g.check({ name: "report.txt" });
|
|
774
|
+
check("gate reads ctx.name when ctx.filename absent → serve",
|
|
775
|
+
byName.ok === true && byName.action === "serve");
|
|
776
|
+
|
|
777
|
+
// No filename at all → serve (nothing to guard).
|
|
778
|
+
var empty = await g.check({});
|
|
779
|
+
check("gate with no filename → serve",
|
|
780
|
+
empty.ok === true && empty.action === "serve");
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
function testVerifyExtractionPathDotSegment() {
|
|
784
|
+
// Current-dir "." and empty segments are skipped by the per-segment
|
|
785
|
+
// walk; a benign path carrying them still resolves cleanly.
|
|
786
|
+
var root = path.join(os.tmpdir(), "gfn-none-" + Date.now() + "-" + Math.random().toString(36).slice(2));
|
|
787
|
+
var resolved = b.guardFilename.verifyExtractionPath("a/./b.txt", root);
|
|
788
|
+
check("vep skips '.' segment and resolves",
|
|
789
|
+
resolved === path.resolve(root, "a/b.txt"));
|
|
790
|
+
}
|
|
791
|
+
|
|
393
792
|
async function run() {
|
|
394
793
|
testGuardFilenameSurface();
|
|
395
794
|
testGuardFilenameStandalonePrimitive();
|
|
@@ -416,7 +815,32 @@ async function run() {
|
|
|
416
815
|
testGuardFilenameSanitizeStripMode();
|
|
417
816
|
testGuardFilenameCompliancePosture();
|
|
418
817
|
testGuardFilenameBadProfile();
|
|
818
|
+
testGuardFilenameEmptyInput();
|
|
819
|
+
testGuardFilenameBenignBufferNoOverlong();
|
|
820
|
+
testGuardFilenameHomoglyph();
|
|
821
|
+
testGuardFilenameSuperscriptReservedName();
|
|
822
|
+
testGuardFilenameExtAllowlistNoExtension();
|
|
823
|
+
testGuardFilenameSanitizeEnforceRejections();
|
|
824
|
+
testGuardFilenameSanitizeBadInput();
|
|
825
|
+
testGuardFilenameSanitizeStripModeFloor();
|
|
826
|
+
testGuardFilenameOverlongVariants();
|
|
827
|
+
testGuardFilenameSanitizeBufferInput();
|
|
828
|
+
testGuardFilenameStripAuditEdge();
|
|
829
|
+
testVerifyExtractionPathDotSegment();
|
|
830
|
+
testVerifyExtractionPathStringRefusals();
|
|
831
|
+
testVerifyExtractionPathOptOuts();
|
|
832
|
+
testVerifyExtractionPathSuccess();
|
|
833
|
+
testVerifyExtractionPathRealpathEscape();
|
|
419
834
|
await testGuardFilenameGate();
|
|
835
|
+
await testGuardFilenameGateSanitizeAction();
|
|
836
|
+
await testGuardFilenameGateCtxShapes();
|
|
420
837
|
}
|
|
421
838
|
|
|
422
839
|
module.exports = { run: run };
|
|
840
|
+
|
|
841
|
+
if (require.main === module) {
|
|
842
|
+
run().then(
|
|
843
|
+
function () { console.log("[guard-filename] OK — " + helpers.getChecks() + " checks passed"); process.exit(0); },
|
|
844
|
+
function (e) { console.error("FAIL:", e && e.stack || e); process.exit(1); }
|
|
845
|
+
);
|
|
846
|
+
}
|
|
@@ -90,6 +90,6 @@ function run() {
|
|
|
90
90
|
module.exports = { run: run };
|
|
91
91
|
|
|
92
92
|
if (require.main === module) {
|
|
93
|
-
try { run(); console.log("[guard-gate-disposition
|
|
93
|
+
try { run(); console.log("[guard-gate-disposition] OK — " + helpers.getChecks() + " checks passed"); }
|
|
94
94
|
catch (e) { console.error("FAIL:", e.stack || e); process.exit(1); }
|
|
95
95
|
}
|