@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -4,14 +4,18 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* guard-image — image content-safety primitive (b.guardImage).
|
|
6
6
|
*
|
|
7
|
-
* Covers: surface; registry parity; magic-byte
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* the
|
|
13
|
-
*
|
|
14
|
-
*
|
|
7
|
+
* Covers: surface; registry parity; magic-byte detection across every format
|
|
8
|
+
* (PNG / JPEG / GIF87a-89a / WebP / BMP / ICO / TIFF II-MM / HEIC / AVIF /
|
|
9
|
+
* SVG), incl. truncated / ambiguous / RIFF-not-WEBP headers; declared-vs-actual
|
|
10
|
+
* MIME mismatch; multi-signature polyglot refusal; unknown-magic severity by
|
|
11
|
+
* profile; oversized / dimension / frame caps across strict/balanced/permissive
|
|
12
|
+
* and the hipaa/pci-dss/gdpr/soc2 postures; the operator-feeds-metadata gate
|
|
13
|
+
* (serve / audit-only / refuse by KIND); and the container-framing metadata
|
|
14
|
+
* strip (sanitize) over JPEG APPn/COM (incl. standalone RST, fill-FF collapse,
|
|
15
|
+
* SOS verbatim), PNG text/eXIf/tIME chunks, GIF comment/plain-text/app
|
|
16
|
+
* extensions (loop kept), WebP EXIF/XMP RIFF chunks + VP8X flag clear, plus the
|
|
17
|
+
* unsupported-format / malformed refusals and refuse-before-strip. The strip is
|
|
18
|
+
* byte-surgery over the linear container framing, not a pixel decoder.
|
|
15
19
|
*/
|
|
16
20
|
|
|
17
21
|
var helpers = require("../helpers");
|
|
@@ -20,8 +24,299 @@ var check = helpers.check;
|
|
|
20
24
|
|
|
21
25
|
function _has(buf, s) { return buf.toString("latin1").indexOf(s) !== -1; }
|
|
22
26
|
function _code(fn) { try { fn(); return null; } catch (e) { return e && e.code; } }
|
|
27
|
+
function _throws(fn) { try { fn(); return false; } catch (e) { void e; return true; } }
|
|
28
|
+
function _hasKind(issues, kind) {
|
|
29
|
+
return issues.some(function (it) { return it.kind === kind; });
|
|
30
|
+
}
|
|
31
|
+
function _hasKindSev(issues, kind, sev) {
|
|
32
|
+
return issues.some(function (it) { return it.kind === kind && it.severity === sev; });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ---- magic-byte fixtures (built from hex/latin1 so the source stays ASCII) ----
|
|
36
|
+
|
|
37
|
+
var PNG_MAGIC = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);
|
|
38
|
+
var JPEG_MAGIC = Buffer.from([0xFF, 0xD8, 0xFF]);
|
|
39
|
+
var GIF87 = Buffer.from("GIF87a", "latin1");
|
|
40
|
+
var GIF89 = Buffer.from("GIF89a", "latin1");
|
|
41
|
+
var BMP_MAGIC = Buffer.from([0x42, 0x4D]);
|
|
42
|
+
var ICO_MAGIC = Buffer.from([0x00, 0x00, 0x01, 0x00]);
|
|
43
|
+
var TIFF_II = Buffer.from([0x49, 0x49, 0x2A, 0x00]);
|
|
44
|
+
var TIFF_MM = Buffer.from([0x4D, 0x4D, 0x00, 0x2A]);
|
|
45
|
+
var WEBP = Buffer.concat([Buffer.from("RIFF", "latin1"), Buffer.from([4, 0, 0, 0]), Buffer.from("WEBP", "latin1")]);
|
|
46
|
+
var RIFF_WAVE = Buffer.concat([Buffer.from("RIFF", "latin1"), Buffer.from([4, 0, 0, 0]), Buffer.from("WAVE", "latin1")]);
|
|
47
|
+
var HEIC = Buffer.concat([Buffer.from([0, 0, 0, 0x18]), Buffer.from("ftypheic", "latin1")]);
|
|
48
|
+
var HEIX = Buffer.concat([Buffer.from([0, 0, 0, 0x18]), Buffer.from("ftypheix", "latin1")]);
|
|
49
|
+
var AVIF = Buffer.concat([Buffer.from([0, 0, 0, 0x18]), Buffer.from("ftypavif", "latin1")]);
|
|
50
|
+
var SVG_XML = Buffer.from("<?xml?>", "latin1");
|
|
51
|
+
var SVG_TAG = Buffer.from("<svg/>", "latin1");
|
|
52
|
+
|
|
53
|
+
// UTF-8 BOM (EF BB BF) precedes text-family images (SVG/XML) in the wild.
|
|
54
|
+
var BOM = Buffer.from([0xEF, 0xBB, 0xBF]);
|
|
55
|
+
var BOM_XML = Buffer.concat([BOM, SVG_XML]);
|
|
56
|
+
var BOM_SVG = Buffer.concat([BOM, SVG_TAG]);
|
|
57
|
+
|
|
58
|
+
// A single buffer matching BOTH JPEG (offset 0) and HEIC (ftyp at offset 4) —
|
|
59
|
+
// a synthetic but genuine multi-signature polyglot.
|
|
60
|
+
var POLYGLOT = Buffer.concat([Buffer.from([0xFF, 0xD8, 0xFF, 0x00]), Buffer.from("ftypheic", "latin1")]);
|
|
61
|
+
|
|
62
|
+
function testGuardImageSurface() {
|
|
63
|
+
check("guardImage is an object", typeof b.guardImage === "object");
|
|
64
|
+
check("guardImage.NAME === 'image'", b.guardImage.NAME === "image");
|
|
65
|
+
check("guardImage.PROFILES has strict", !!b.guardImage.PROFILES["strict"]);
|
|
66
|
+
check("guardImage.PROFILES has balanced", !!b.guardImage.PROFILES["balanced"]);
|
|
67
|
+
check("guardImage.PROFILES has permissive", !!b.guardImage.PROFILES["permissive"]);
|
|
68
|
+
check("guardImage.COMPLIANCE_POSTURES gdpr", !!b.guardImage.COMPLIANCE_POSTURES["gdpr"]);
|
|
69
|
+
check("guardImage.validate is a function", typeof b.guardImage.validate === "function");
|
|
70
|
+
check("guardImage.sanitize is a function", typeof b.guardImage.sanitize === "function");
|
|
71
|
+
check("guardImage.gate is a function", typeof b.guardImage.gate === "function");
|
|
72
|
+
check("guardImage.inspectMagic is a function", typeof b.guardImage.inspectMagic === "function");
|
|
73
|
+
check("frameworkError.GuardImageError exposed", typeof b.frameworkError.GuardImageError === "function");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function testGuardImageRegistryParity() {
|
|
77
|
+
check("guardImage registered in guardAll",
|
|
78
|
+
b.guardAll.allGuards().some(function (g) { return (g.name || g.NAME) === "image"; }));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function testInspectMagic() {
|
|
82
|
+
check("inspectMagic detects png",
|
|
83
|
+
b.guardImage.inspectMagic(PNG_MAGIC).indexOf("image/png") !== -1);
|
|
84
|
+
check("inspectMagic empty on garbage",
|
|
85
|
+
b.guardImage.inspectMagic(Buffer.from([0x00, 0x01, 0x02])).length === 0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function testInspectMagicAllFormats() {
|
|
89
|
+
check("inspectMagic: jpeg", b.guardImage.inspectMagic(JPEG_MAGIC).indexOf("image/jpeg") !== -1);
|
|
90
|
+
check("inspectMagic: gif87a", b.guardImage.inspectMagic(GIF87).indexOf("image/gif") !== -1);
|
|
91
|
+
check("inspectMagic: gif89a", b.guardImage.inspectMagic(GIF89).indexOf("image/gif") !== -1);
|
|
92
|
+
check("inspectMagic: webp (RIFF+WEBP)", b.guardImage.inspectMagic(WEBP).indexOf("image/webp") !== -1);
|
|
93
|
+
check("inspectMagic: bmp", b.guardImage.inspectMagic(BMP_MAGIC).indexOf("image/bmp") !== -1);
|
|
94
|
+
check("inspectMagic: ico", b.guardImage.inspectMagic(ICO_MAGIC).indexOf("image/x-icon") !== -1);
|
|
95
|
+
check("inspectMagic: tiff-II", b.guardImage.inspectMagic(TIFF_II).indexOf("image/tiff") !== -1);
|
|
96
|
+
check("inspectMagic: tiff-MM", b.guardImage.inspectMagic(TIFF_MM).indexOf("image/tiff") !== -1);
|
|
97
|
+
check("inspectMagic: heic", b.guardImage.inspectMagic(HEIC).indexOf("image/heic") !== -1);
|
|
98
|
+
check("inspectMagic: heix (heic alias)", b.guardImage.inspectMagic(HEIX).indexOf("image/heic") !== -1);
|
|
99
|
+
check("inspectMagic: avif", b.guardImage.inspectMagic(AVIF).indexOf("image/avif") !== -1);
|
|
100
|
+
check("inspectMagic: svg (<?xml)", b.guardImage.inspectMagic(SVG_XML).indexOf("image/svg+xml") !== -1);
|
|
101
|
+
check("inspectMagic: svg (<svg)", b.guardImage.inspectMagic(SVG_TAG).indexOf("image/svg+xml") !== -1);
|
|
102
|
+
|
|
103
|
+
// RIFF but not WEBP (a WAV) — the tail-mismatch continue branch: no webp hit.
|
|
104
|
+
check("inspectMagic: RIFF/WAVE is not webp", b.guardImage.inspectMagic(RIFF_WAVE).length === 0);
|
|
105
|
+
// Sub-magic-length buffer can match nothing.
|
|
106
|
+
check("inspectMagic: 2-byte buffer (< jpeg magic) → []",
|
|
107
|
+
b.guardImage.inspectMagic(Buffer.from([0xFF, 0xD8])).length === 0);
|
|
108
|
+
// Pure inspection — never throws on non-Buffer / no-length input.
|
|
109
|
+
check("inspectMagic: null → []", b.guardImage.inspectMagic(null).length === 0);
|
|
110
|
+
check("inspectMagic: undefined → []", b.guardImage.inspectMagic(undefined).length === 0);
|
|
111
|
+
check("inspectMagic: no-length obj → []", b.guardImage.inspectMagic({}).length === 0);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ---- BUG A (RED-first): a UTF-8-BOM-prefixed SVG must still route to guardSvg ----
|
|
115
|
+
//
|
|
116
|
+
// The @module block documents SVG detection "after any UTF-8 BOM", and the
|
|
117
|
+
// svgRoutingPolicy is "reject" at EVERY profile. But a BOM-prefixed SVG matched
|
|
118
|
+
// no signature, so it fell through to unknown-magic — audit-only (SERVED) under
|
|
119
|
+
// balanced/permissive — a fail-open of the "route SVG at every profile"
|
|
120
|
+
// invariant, and a mis-classification (unknown-magic, not svg-routing) even
|
|
121
|
+
// under strict.
|
|
122
|
+
function testInspectMagicBomSvg() {
|
|
123
|
+
check("inspectMagic: BOM + <?xml detected as svg",
|
|
124
|
+
b.guardImage.inspectMagic(BOM_XML).indexOf("image/svg+xml") !== -1);
|
|
125
|
+
check("inspectMagic: BOM + <svg detected as svg",
|
|
126
|
+
b.guardImage.inspectMagic(BOM_SVG).indexOf("image/svg+xml") !== -1);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function testValidateSvgRoutedEveryProfile() {
|
|
130
|
+
var profiles = ["strict", "balanced", "permissive"];
|
|
131
|
+
for (var pi = 0; pi < profiles.length; pi += 1) {
|
|
132
|
+
var p = profiles[pi];
|
|
133
|
+
// Plain (no-BOM) SVG — the existing baseline.
|
|
134
|
+
var rvPlain = b.guardImage.validate({ bytes: SVG_XML }, { profile: p });
|
|
135
|
+
check("svg (<?xml) routed under " + p, _hasKind(rvPlain.issues, "svg-routing"));
|
|
136
|
+
check("svg (<?xml) refused under " + p, rvPlain.ok === false);
|
|
137
|
+
// BOM-prefixed SVG — the fail-open case.
|
|
138
|
+
var rvBom = b.guardImage.validate({ bytes: BOM_XML }, { profile: p });
|
|
139
|
+
check("BOM-svg routed under " + p, _hasKind(rvBom.issues, "svg-routing"));
|
|
140
|
+
check("BOM-svg refused under " + p, rvBom.ok === false);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
23
143
|
|
|
24
|
-
// ----
|
|
144
|
+
// ---- BUG A follow-up (RED-first): the BOM skip must NOT extend to binary
|
|
145
|
+
// rasters. A UTF-8 BOM is legal only before XML/SVG text; a PNG/JPEG/etc.
|
|
146
|
+
// signature must sit at its real offset. Shifting every signature by the BOM
|
|
147
|
+
// width let a `EF BB BF`-prefixed PNG masquerade as a valid raster (ok:true
|
|
148
|
+
// under strict), bypassing strict magic validation. The shift is now gated on
|
|
149
|
+
// the text-family SVG/XML entries only. ----
|
|
150
|
+
function testBomDoesNotBypassRasterMagic() {
|
|
151
|
+
var pngMagic = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);
|
|
152
|
+
var bomPng = Buffer.concat([BOM, pngMagic]);
|
|
153
|
+
// BOM-prefixed PNG is NOT a valid PNG (signature not at offset 0) — it must
|
|
154
|
+
// NOT be detected as image/png, and strict validate must refuse it.
|
|
155
|
+
check("inspectMagic: BOM + PNG magic NOT detected as image/png",
|
|
156
|
+
b.guardImage.inspectMagic(bomPng).indexOf("image/png") === -1);
|
|
157
|
+
var rv = b.guardImage.validate({ bytes: bomPng, declaredMime: "image/png" }, { profile: "strict" });
|
|
158
|
+
check("strict: BOM-prefixed PNG refused (not accepted as a raster)", rv.ok === false);
|
|
159
|
+
check("strict: BOM-prefixed PNG raises unknown-magic (signature not at offset 0)",
|
|
160
|
+
_hasKind(rv.issues, "unknown-magic"));
|
|
161
|
+
// Control: a genuine PNG (no BOM) still validates as a raster.
|
|
162
|
+
var rvReal = b.guardImage.validate({ bytes: pngMagic }, { profile: "strict" });
|
|
163
|
+
check("strict: real PNG magic detected as image/png",
|
|
164
|
+
b.guardImage.inspectMagic(pngMagic).indexOf("image/png") !== -1 && !_hasKind(rvReal.issues, "unknown-magic"));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ---- BUG B (RED-first): validate must never throw on hostile metadata ----
|
|
168
|
+
//
|
|
169
|
+
// The @primitive block promises validate is "pure inspection — never mutates
|
|
170
|
+
// input or throws on hostile metadata". A bag whose `bytes` is a plain Array or
|
|
171
|
+
// an array-like object (numeric `.length`, not a Buffer/string/Uint8Array) hit
|
|
172
|
+
// safeBuffer.byteLengthOf, which throws TypeError — crashing a direct caller.
|
|
173
|
+
function testValidateNeverThrowsHostileMetadata() {
|
|
174
|
+
check("validate does not throw on Array-typed bytes",
|
|
175
|
+
_throws(function () { b.guardImage.validate({ bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A] }, { profile: "strict" }); }) === false);
|
|
176
|
+
check("validate does not throw on array-like-object bytes",
|
|
177
|
+
_throws(function () { b.guardImage.validate({ bytes: { length: 5 } }, { profile: "strict" }); }) === false);
|
|
178
|
+
// And it still refuses the unrecognized array-like content rather than crash.
|
|
179
|
+
var rv = b.guardImage.validate({ bytes: { length: 5 } }, { profile: "strict" });
|
|
180
|
+
check("array-like bytes → unknown-magic refuse (not a crash)",
|
|
181
|
+
rv.ok === false && _hasKind(rv.issues, "unknown-magic"));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function testValidateMismatchAndPolyglot() {
|
|
185
|
+
var rv = b.guardImage.validate({ bytes: JPEG_MAGIC, declaredMime: "image/png" }, { profile: "strict" });
|
|
186
|
+
check("mismatch: validate ok:false", rv.ok === false);
|
|
187
|
+
check("mismatch: kind reported", _hasKind(rv.issues, "mime-mismatch"));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function testValidatePolyglot() {
|
|
191
|
+
var mimes = b.guardImage.inspectMagic(POLYGLOT);
|
|
192
|
+
check("polyglot: inspectMagic returns two formats",
|
|
193
|
+
mimes.indexOf("image/jpeg") !== -1 && mimes.indexOf("image/heic") !== -1);
|
|
194
|
+
// Refused even under permissive (polyglotPolicy is "reject" at every profile).
|
|
195
|
+
var rv = b.guardImage.validate({ bytes: POLYGLOT }, { profile: "permissive" });
|
|
196
|
+
check("polyglot refused under permissive", rv.ok === false);
|
|
197
|
+
check("polyglot: critical severity", _hasKindSev(rv.issues, "polyglot", "critical"));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function testValidateUnknownMagicSeverity() {
|
|
201
|
+
var garbage = Buffer.from([0x00, 0x01, 0x02, 0x03, 0x04]);
|
|
202
|
+
var rvS = b.guardImage.validate({ bytes: garbage }, { profile: "strict" });
|
|
203
|
+
check("unknown-magic high under strict (reject policy)",
|
|
204
|
+
rvS.ok === false && _hasKindSev(rvS.issues, "unknown-magic", "high"));
|
|
205
|
+
var rvB = b.guardImage.validate({ bytes: garbage }, { profile: "balanced" });
|
|
206
|
+
check("unknown-magic warn under balanced (audit policy)",
|
|
207
|
+
rvB.ok === true && _hasKindSev(rvB.issues, "unknown-magic", "warn"));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function testValidateOversizedBytes() {
|
|
211
|
+
var over = Buffer.alloc(10, 0x89);
|
|
212
|
+
var rv = b.guardImage.validate({ bytes: over }, { profile: "strict", maxBytes: 4 });
|
|
213
|
+
check("oversized bytes → image-cap refuse",
|
|
214
|
+
rv.ok === false && _hasKind(rv.issues, "image-cap"));
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function testValidateDimensionAndFrameCaps() {
|
|
218
|
+
// Width over the strict 8192 cap (reject) → high.
|
|
219
|
+
var rvW = b.guardImage.validate(
|
|
220
|
+
{ bytes: PNG_MAGIC, declaredMime: "image/png", width: 9000, height: 100 }, { profile: "strict" });
|
|
221
|
+
check("width over strict cap → width-cap high refuse",
|
|
222
|
+
rvW.ok === false && _hasKindSev(rvW.issues, "width-cap", "high"));
|
|
223
|
+
// Height over the strict cap → high.
|
|
224
|
+
var rvH = b.guardImage.validate(
|
|
225
|
+
{ bytes: PNG_MAGIC, declaredMime: "image/png", width: 100, height: 9000 }, { profile: "strict" });
|
|
226
|
+
check("height over strict cap → height-cap high refuse",
|
|
227
|
+
rvH.ok === false && _hasKindSev(rvH.issues, "height-cap", "high"));
|
|
228
|
+
// Width over the balanced 16384 cap (audit) → warn, ok stays true.
|
|
229
|
+
var rvWB = b.guardImage.validate(
|
|
230
|
+
{ bytes: PNG_MAGIC, declaredMime: "image/png", width: 20000 }, { profile: "balanced" });
|
|
231
|
+
check("width over balanced cap → warn (ok true)",
|
|
232
|
+
rvWB.ok === true && _hasKindSev(rvWB.issues, "width-cap", "warn"));
|
|
233
|
+
// Frames over the strict 60 cap (reject) → high.
|
|
234
|
+
var rvF = b.guardImage.validate(
|
|
235
|
+
{ bytes: GIF89, declaredMime: "image/gif", frames: 100 }, { profile: "strict" });
|
|
236
|
+
check("frames over strict cap → frames-cap high refuse",
|
|
237
|
+
rvF.ok === false && _hasKindSev(rvF.issues, "frames-cap", "high"));
|
|
238
|
+
// Frames over the balanced 200 cap (audit) → warn.
|
|
239
|
+
var rvFB = b.guardImage.validate(
|
|
240
|
+
{ bytes: GIF89, declaredMime: "image/gif", frames: 300 }, { profile: "balanced" });
|
|
241
|
+
check("frames over balanced cap → warn (ok true)",
|
|
242
|
+
rvFB.ok === true && _hasKindSev(rvFB.issues, "frames-cap", "warn"));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function testValidateBadInput() {
|
|
246
|
+
var rvNull = b.guardImage.validate(null, { profile: "strict" });
|
|
247
|
+
check("validate(null) → bad-input refuse",
|
|
248
|
+
rvNull.ok === false && _hasKind(rvNull.issues, "bad-input"));
|
|
249
|
+
var rvNum = b.guardImage.validate(42, { profile: "strict" });
|
|
250
|
+
check("validate(non-object) → bad-input refuse",
|
|
251
|
+
rvNum.ok === false && _hasKind(rvNum.issues, "bad-input"));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function testValidateBadOpt() {
|
|
255
|
+
check("maxWidth: -1 → bad-opt throw",
|
|
256
|
+
_code(function () { b.guardImage.validate({ bytes: PNG_MAGIC }, { maxWidth: -1 }); }) === "image.bad-opt");
|
|
257
|
+
check("maxFrames: Infinity → bad-opt throw",
|
|
258
|
+
_code(function () { b.guardImage.validate({ bytes: PNG_MAGIC }, { maxFrames: Infinity }); }) === "image.bad-opt");
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function testCompliancePostures() {
|
|
262
|
+
// hipaa / pci-dss / soc2 map to the strict tier (dimensionsPolicy reject);
|
|
263
|
+
// gdpr maps to balanced (dimensionsPolicy audit). Width 20000 exceeds both
|
|
264
|
+
// the strict (8192) and balanced (16384) caps, so the posture's tier shows.
|
|
265
|
+
var strictPostures = ["hipaa", "pci-dss", "soc2"];
|
|
266
|
+
for (var ci = 0; ci < strictPostures.length; ci += 1) {
|
|
267
|
+
var name = strictPostures[ci];
|
|
268
|
+
var rv = b.guardImage.validate(
|
|
269
|
+
{ bytes: PNG_MAGIC, declaredMime: "image/png", width: 20000 },
|
|
270
|
+
{ compliancePosture: name });
|
|
271
|
+
check(name + " posture → strict tier refuses oversized width",
|
|
272
|
+
rv.ok === false && _hasKindSev(rv.issues, "width-cap", "high"));
|
|
273
|
+
}
|
|
274
|
+
var rvGdpr = b.guardImage.validate(
|
|
275
|
+
{ bytes: PNG_MAGIC, declaredMime: "image/png", width: 20000 },
|
|
276
|
+
{ compliancePosture: "gdpr" });
|
|
277
|
+
check("gdpr posture → balanced tier audits oversized width (ok true)",
|
|
278
|
+
rvGdpr.ok === true && _hasKindSev(rvGdpr.issues, "width-cap", "warn"));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// ---- the bespoke operator-feeds-metadata gate ----
|
|
282
|
+
|
|
283
|
+
async function testGate() {
|
|
284
|
+
var g = b.guardImage.gate({ profile: "strict" });
|
|
285
|
+
check("gate() returns a gate object", g && typeof g.check === "function");
|
|
286
|
+
|
|
287
|
+
// No metadata → serve (nothing for the operator's decoder to report).
|
|
288
|
+
var rvNone = await g.check({});
|
|
289
|
+
check("gate: no metadata → serve", rvNone.action === "serve");
|
|
290
|
+
|
|
291
|
+
// Clean PNG metadata → serve.
|
|
292
|
+
var rvClean = await g.check({ metadata: {
|
|
293
|
+
bytes: PNG_MAGIC, declaredMime: "image/png", width: 100, height: 100, frames: 1 } });
|
|
294
|
+
check("gate: clean image → serve", rvClean.action === "serve");
|
|
295
|
+
|
|
296
|
+
// MIME-mismatch → refuse.
|
|
297
|
+
var rvMis = await g.check({ metadata: { bytes: JPEG_MAGIC, declaredMime: "image/png" } });
|
|
298
|
+
check("gate: mime-mismatch → refuse", rvMis.action === "refuse");
|
|
299
|
+
check("gate: mismatch issue reported", _hasKind(rvMis.issues, "mime-mismatch"));
|
|
300
|
+
|
|
301
|
+
// Alternative ctx field ctx.imageMetadata.
|
|
302
|
+
var rvAlt = await g.check({ imageMetadata: { bytes: JPEG_MAGIC, declaredMime: "image/png" } });
|
|
303
|
+
check("gate: reads ctx.imageMetadata alias → refuse", rvAlt.action === "refuse");
|
|
304
|
+
|
|
305
|
+
// Warn-level finding (balanced oversized dimension) → audit-only.
|
|
306
|
+
var gBal = b.guardImage.gate({ profile: "balanced" });
|
|
307
|
+
var rvAudit = await gBal.check({ metadata: { bytes: PNG_MAGIC, declaredMime: "image/png", width: 20000 } });
|
|
308
|
+
check("gate: balanced oversized dimension → audit-only", rvAudit.action === "audit-only");
|
|
309
|
+
|
|
310
|
+
// Polyglot → refuse.
|
|
311
|
+
var rvPoly = await g.check({ metadata: { bytes: POLYGLOT } });
|
|
312
|
+
check("gate: polyglot → refuse", rvPoly.action === "refuse");
|
|
313
|
+
|
|
314
|
+
// BOM-SVG through the gate → refuse (route to guardSvg), not a silent serve.
|
|
315
|
+
var rvBomSvg = await g.check({ metadata: { bytes: BOM_XML } });
|
|
316
|
+
check("gate: BOM-svg → refuse (routed, not served)", rvBomSvg.action === "refuse");
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// ---- the real metadata strip (sanitize) ----
|
|
25
320
|
|
|
26
321
|
function _jpegWithExif() {
|
|
27
322
|
return Buffer.concat([
|
|
@@ -39,7 +334,7 @@ function _pngWithText() {
|
|
|
39
334
|
Buffer.from("Comment secret-gps", "latin1"), Buffer.from([9, 9, 9, 9])]);
|
|
40
335
|
var iend = Buffer.concat([Buffer.from([0, 0, 0, 0]), Buffer.from("IEND", "latin1"),
|
|
41
336
|
Buffer.from([0xAE, 0x42, 0x60, 0x82])]);
|
|
42
|
-
return Buffer.concat([
|
|
337
|
+
return Buffer.concat([PNG_MAGIC, ihdr, text, iend]);
|
|
43
338
|
}
|
|
44
339
|
|
|
45
340
|
function _gifWithComment() {
|
|
@@ -61,38 +356,6 @@ function _webpWithExif() {
|
|
|
61
356
|
]);
|
|
62
357
|
}
|
|
63
358
|
|
|
64
|
-
function testGuardImageSurface() {
|
|
65
|
-
check("guardImage is an object", typeof b.guardImage === "object");
|
|
66
|
-
check("guardImage.NAME === 'image'", b.guardImage.NAME === "image");
|
|
67
|
-
check("guardImage.PROFILES has strict", !!b.guardImage.PROFILES["strict"]);
|
|
68
|
-
check("guardImage.COMPLIANCE_POSTURES gdpr", !!b.guardImage.COMPLIANCE_POSTURES["gdpr"]);
|
|
69
|
-
check("guardImage.validate is a function", typeof b.guardImage.validate === "function");
|
|
70
|
-
check("guardImage.sanitize is a function", typeof b.guardImage.sanitize === "function");
|
|
71
|
-
check("guardImage.gate is a function", typeof b.guardImage.gate === "function");
|
|
72
|
-
check("guardImage.inspectMagic is a function", typeof b.guardImage.inspectMagic === "function");
|
|
73
|
-
check("frameworkError.GuardImageError exposed", typeof b.frameworkError.GuardImageError === "function");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function testGuardImageRegistryParity() {
|
|
77
|
-
check("guardImage registered in guardAll",
|
|
78
|
-
b.guardAll.allGuards().some(function (g) { return (g.name || g.NAME) === "image"; }));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function testInspectMagic() {
|
|
82
|
-
check("inspectMagic detects png",
|
|
83
|
-
b.guardImage.inspectMagic(Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])).indexOf("image/png") !== -1);
|
|
84
|
-
check("inspectMagic empty on garbage",
|
|
85
|
-
b.guardImage.inspectMagic(Buffer.from([0x00, 0x01, 0x02])).length === 0);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function testValidateMismatchAndPolyglot() {
|
|
89
|
-
var rv = b.guardImage.validate({ bytes: Buffer.from([0xFF, 0xD8, 0xFF]), declaredMime: "image/png" }, { profile: "strict" });
|
|
90
|
-
check("mismatch: validate ok:false", rv.ok === false);
|
|
91
|
-
check("mismatch: kind reported", rv.issues.some(function (i) { return i.kind === "mime-mismatch"; }));
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// ---- the real metadata strip ----
|
|
95
|
-
|
|
96
359
|
function testStripJpegExif() {
|
|
97
360
|
var src = _jpegWithExif();
|
|
98
361
|
var out = b.guardImage.sanitize({ bytes: src });
|
|
@@ -105,6 +368,51 @@ function testStripJpegExif() {
|
|
|
105
368
|
check("jpeg: bag is a fresh object (bytes replaced)", typeof out === "object" && Buffer.isBuffer(out.bytes));
|
|
106
369
|
}
|
|
107
370
|
|
|
371
|
+
// JPEG framing edge cases: standalone RST marker, a 0xFF fill byte before a
|
|
372
|
+
// marker code, kept ICC (APP2), dropped IPTC (APP13) + COM, and SOS entropy
|
|
373
|
+
// preserved verbatim.
|
|
374
|
+
function _jpegRich() {
|
|
375
|
+
return Buffer.concat([
|
|
376
|
+
Buffer.from([0xFF, 0xD8]), // SOI
|
|
377
|
+
Buffer.from([0xFF, 0xE1, 0x00, 0x05]), Buffer.from("px1", "latin1"), // APP1 EXIF — drop
|
|
378
|
+
Buffer.from([0xFF, 0xE2, 0x00, 0x05]), Buffer.from("px2", "latin1"), // APP2 ICC — keep
|
|
379
|
+
Buffer.from([0xFF, 0xED, 0x00, 0x05]), Buffer.from("px3", "latin1"), // APP13 IPTC — drop
|
|
380
|
+
Buffer.from([0xFF, 0xFE, 0x00, 0x05]), Buffer.from("px4", "latin1"), // COM — drop
|
|
381
|
+
Buffer.from([0xFF, 0xD0]), // RST0 standalone — keep
|
|
382
|
+
Buffer.from([0xFF, 0xFF, 0xDB, 0x00, 0x04]), Buffer.from([1, 2]), // fill-FF + DQT — keep
|
|
383
|
+
Buffer.from([0xFF, 0xDA, 0x00, 0x03, 0x01]), Buffer.from("px5entropy", "latin1"), // SOS + entropy — keep verbatim
|
|
384
|
+
Buffer.from([0xFF, 0xD9]), // EOI (inside entropy verbatim)
|
|
385
|
+
]);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
function testStripJpegRichFraming() {
|
|
389
|
+
var src = _jpegRich();
|
|
390
|
+
var out = b.guardImage.sanitize({ bytes: src });
|
|
391
|
+
check("jpeg-rich: EXIF (APP1) dropped", !_has(out.bytes, "px1"));
|
|
392
|
+
check("jpeg-rich: IPTC (APP13) dropped", !_has(out.bytes, "px3"));
|
|
393
|
+
check("jpeg-rich: COM dropped", !_has(out.bytes, "px4"));
|
|
394
|
+
check("jpeg-rich: ICC (APP2) preserved", _has(out.bytes, "px2"));
|
|
395
|
+
check("jpeg-rich: SOS entropy preserved verbatim", _has(out.bytes, "px5entropy"));
|
|
396
|
+
check("jpeg-rich: output shrank", out.bytes.length < src.length);
|
|
397
|
+
check("jpeg-rich: SOI intact", out.bytes[0] === 0xFF && out.bytes[1] === 0xD8);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
function testStripJpegMalformed() {
|
|
401
|
+
// Each input detects as JPEG (FF D8 FF...) + passes validate, then trips a
|
|
402
|
+
// distinct framing check inside the strip.
|
|
403
|
+
check("jpeg: expected-marker malformed",
|
|
404
|
+
_code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xDB, 0x00, 0x04, 0xAA, 0xBB, 0x00]) }); }) === "image.sanitize-malformed");
|
|
405
|
+
check("jpeg: truncated-marker malformed",
|
|
406
|
+
_code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xDB, 0x00, 0x04, 0xAA, 0xBB, 0xFF, 0xFF]) }); }) === "image.sanitize-malformed");
|
|
407
|
+
check("jpeg: truncated-segment-length malformed",
|
|
408
|
+
_code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xE2]) }); }) === "image.sanitize-malformed");
|
|
409
|
+
check("jpeg: bad-segment-length malformed",
|
|
410
|
+
_code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xE2, 0x00, 0x01]) }); }) === "image.sanitize-malformed");
|
|
411
|
+
// Existing baseline: APP1 length overruns the buffer.
|
|
412
|
+
check("jpeg: segment-overrun malformed",
|
|
413
|
+
_code(function () { b.guardImage.sanitize({ bytes: Buffer.from([0xFF, 0xD8, 0xFF, 0xE1, 0x00, 0xFF]) }); }) === "image.sanitize-malformed");
|
|
414
|
+
}
|
|
415
|
+
|
|
108
416
|
function testStripPngText() {
|
|
109
417
|
var out = b.guardImage.sanitize({ bytes: _pngWithText() });
|
|
110
418
|
check("png: tEXt payload removed", !_has(out.bytes, "secret-gps"));
|
|
@@ -113,6 +421,47 @@ function testStripPngText() {
|
|
|
113
421
|
check("png: signature intact", out.bytes[0] === 0x89 && out.bytes[1] === 0x50);
|
|
114
422
|
}
|
|
115
423
|
|
|
424
|
+
function _pngChunk(type, data) {
|
|
425
|
+
var len = Buffer.from([(data.length >>> 24) & 0xFF, (data.length >>> 16) & 0xFF,
|
|
426
|
+
(data.length >>> 8) & 0xFF, data.length & 0xFF]);
|
|
427
|
+
return Buffer.concat([len, Buffer.from(type, "latin1"), data, Buffer.from([0, 0, 0, 0])]); // crc placeholder
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
function _pngRich() {
|
|
431
|
+
return Buffer.concat([
|
|
432
|
+
PNG_MAGIC,
|
|
433
|
+
_pngChunk("IHDR", Buffer.from([0, 0, 0, 1, 0, 0, 0, 1, 8, 0, 0, 0, 0])),
|
|
434
|
+
_pngChunk("zTXt", Buffer.from("zpayload", "latin1")),
|
|
435
|
+
_pngChunk("eXIf", Buffer.from("epayload", "latin1")),
|
|
436
|
+
_pngChunk("tIME", Buffer.from("tpayload", "latin1")),
|
|
437
|
+
_pngChunk("iTXt", Buffer.from("ipayload", "latin1")),
|
|
438
|
+
_pngChunk("IDAT", Buffer.from([1, 2, 3, 4])),
|
|
439
|
+
_pngChunk("IEND", Buffer.from([])),
|
|
440
|
+
]);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function testStripPngRichChunks() {
|
|
444
|
+
var out = b.guardImage.sanitize({ bytes: _pngRich() });
|
|
445
|
+
check("png: zTXt dropped", !_has(out.bytes, "zpayload"));
|
|
446
|
+
check("png: eXIf dropped", !_has(out.bytes, "epayload"));
|
|
447
|
+
check("png: tIME dropped", !_has(out.bytes, "tpayload"));
|
|
448
|
+
check("png: iTXt dropped", !_has(out.bytes, "ipayload"));
|
|
449
|
+
check("png: IHDR preserved", _has(out.bytes, "IHDR"));
|
|
450
|
+
check("png: IDAT preserved", _has(out.bytes, "IDAT"));
|
|
451
|
+
check("png: IEND preserved", _has(out.bytes, "IEND"));
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
function testStripPngMalformed() {
|
|
455
|
+
check("png: chunk-overrun malformed",
|
|
456
|
+
_code(function () {
|
|
457
|
+
b.guardImage.sanitize({ bytes: Buffer.concat([PNG_MAGIC, Buffer.from([0, 0, 0, 0xFF]), Buffer.from("IDAT", "latin1")]) });
|
|
458
|
+
}) === "image.sanitize-malformed");
|
|
459
|
+
check("png: chunk-length-exceeds-max malformed",
|
|
460
|
+
_code(function () {
|
|
461
|
+
b.guardImage.sanitize({ bytes: Buffer.concat([PNG_MAGIC, Buffer.from([0xFF, 0xFF, 0xFF, 0xFF]), Buffer.from("IDAT", "latin1")]) });
|
|
462
|
+
}) === "image.sanitize-malformed");
|
|
463
|
+
}
|
|
464
|
+
|
|
116
465
|
function testStripGifComment() {
|
|
117
466
|
var out = b.guardImage.sanitize({ bytes: _gifWithComment() });
|
|
118
467
|
check("gif: comment payload removed", !_has(out.bytes, "secret-gps"));
|
|
@@ -120,6 +469,62 @@ function testStripGifComment() {
|
|
|
120
469
|
check("gif: trailer preserved", out.bytes[out.bytes.length - 1] === 0x3B);
|
|
121
470
|
}
|
|
122
471
|
|
|
472
|
+
// Build a GIF extension block: 0x21 <label> <sub-block>* 0x00. For app / plain-
|
|
473
|
+
// text extensions the first sub-block is the fixed leading block (app-id / the
|
|
474
|
+
// 12-byte plain-text header).
|
|
475
|
+
function _gifExt(label, subBlocks) {
|
|
476
|
+
var parts = [Buffer.from([0x21, label])];
|
|
477
|
+
for (var i = 0; i < subBlocks.length; i += 1) {
|
|
478
|
+
parts.push(Buffer.from([subBlocks[i].length]));
|
|
479
|
+
parts.push(subBlocks[i]);
|
|
480
|
+
}
|
|
481
|
+
parts.push(Buffer.from([0x00])); // block terminator
|
|
482
|
+
return Buffer.concat(parts);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
function _gifRich() {
|
|
486
|
+
var headerGct = Buffer.concat([
|
|
487
|
+
Buffer.from("GIF89a", "latin1"),
|
|
488
|
+
Buffer.from([1, 0, 1, 0, 0x80, 0, 0]), // LSD, packed=0x80 (GCT, 2 entries)
|
|
489
|
+
Buffer.from([0, 0, 0, 0, 0, 0]), // 6-byte global color table
|
|
490
|
+
]);
|
|
491
|
+
var imgDesc = Buffer.concat([
|
|
492
|
+
Buffer.from([0x2C, 0, 0, 0, 0, 1, 0, 1, 0, 0x80]), // image descriptor + LCT flag
|
|
493
|
+
Buffer.from([0, 0, 0, 0, 0, 0]), // 6-byte local color table
|
|
494
|
+
Buffer.from([0x02]), // LZW min code size
|
|
495
|
+
Buffer.from([0x01, 0x44, 0x00]), // sub-block + terminator
|
|
496
|
+
]);
|
|
497
|
+
return Buffer.concat([
|
|
498
|
+
headerGct,
|
|
499
|
+
_gifExt(0xF9, [Buffer.from([0x00, 0x00, 0x00, 0x00])]), // graphic control — keep
|
|
500
|
+
_gifExt(0xFE, [Buffer.from("gifcmt", "latin1")]), // comment — drop
|
|
501
|
+
_gifExt(0x01, [Buffer.alloc(12, 0), Buffer.from("gifptx", "latin1")]), // plain-text — drop
|
|
502
|
+
_gifExt(0xFF, [Buffer.from("NETSCAPE2.0", "latin1"), Buffer.from([0x01, 0x00, 0x00])]), // loop — keep
|
|
503
|
+
_gifExt(0xFF, [Buffer.from("DROPMEAPPZZ", "latin1"), Buffer.from("gifxmp", "latin1")]), // non-loop app — drop
|
|
504
|
+
imgDesc,
|
|
505
|
+
Buffer.from([0x3B]), // trailer
|
|
506
|
+
]);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function testStripGifRichBlocks() {
|
|
510
|
+
var out = b.guardImage.sanitize({ bytes: _gifRich() });
|
|
511
|
+
check("gif-rich: comment dropped", !_has(out.bytes, "gifcmt"));
|
|
512
|
+
check("gif-rich: plain-text dropped", !_has(out.bytes, "gifptx"));
|
|
513
|
+
check("gif-rich: non-loop app dropped", !_has(out.bytes, "gifxmp") && !_has(out.bytes, "DROPMEAPP"));
|
|
514
|
+
check("gif-rich: NETSCAPE loop preserved", _has(out.bytes, "NETSCAPE2.0"));
|
|
515
|
+
check("gif-rich: header preserved", _has(out.bytes, "GIF89a"));
|
|
516
|
+
check("gif-rich: trailer preserved", out.bytes[out.bytes.length - 1] === 0x3B);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
function testStripGifMalformed() {
|
|
520
|
+
check("gif: truncated-header malformed",
|
|
521
|
+
_code(function () { b.guardImage.sanitize({ bytes: Buffer.from("GIF89a", "latin1") }); }) === "image.sanitize-malformed");
|
|
522
|
+
check("gif: unknown-block malformed",
|
|
523
|
+
_code(function () {
|
|
524
|
+
b.guardImage.sanitize({ bytes: Buffer.concat([Buffer.from("GIF89a", "latin1"), Buffer.from([1, 0, 1, 0, 0x00, 0, 0]), Buffer.from([0x99])]) });
|
|
525
|
+
}) === "image.sanitize-malformed");
|
|
526
|
+
}
|
|
527
|
+
|
|
123
528
|
function testStripWebpExif() {
|
|
124
529
|
var out = b.guardImage.sanitize({ bytes: _webpWithExif() });
|
|
125
530
|
check("webp: EXIF payload removed", !_has(out.bytes, "secret-gps"));
|
|
@@ -127,6 +532,35 @@ function testStripWebpExif() {
|
|
|
127
532
|
check("webp: RIFF size rewritten", out.bytes.readUInt32LE(4) === 16);
|
|
128
533
|
}
|
|
129
534
|
|
|
535
|
+
function testStripWebpXmpAndPad() {
|
|
536
|
+
var xmp = Buffer.concat([
|
|
537
|
+
Buffer.from("RIFF", "latin1"), Buffer.from([0, 0, 0, 0]), Buffer.from("WEBP", "latin1"),
|
|
538
|
+
Buffer.from("VP8 ", "latin1"), Buffer.from([4, 0, 0, 0]), Buffer.from([1, 2, 3, 4]),
|
|
539
|
+
Buffer.from("XMP ", "latin1"), Buffer.from([6, 0, 0, 0]), Buffer.from("wxmpz0", "latin1"),
|
|
540
|
+
]);
|
|
541
|
+
var outXmp = b.guardImage.sanitize({ bytes: xmp });
|
|
542
|
+
check("webp: XMP chunk dropped", !_has(outXmp.bytes, "wxmpz0"));
|
|
543
|
+
check("webp: VP8 preserved past XMP drop", _has(outXmp.bytes, "VP8 "));
|
|
544
|
+
|
|
545
|
+
// Final chunk with an odd size and no trailing pad byte — tolerated.
|
|
546
|
+
var oddNoPad = Buffer.concat([
|
|
547
|
+
Buffer.from("RIFF", "latin1"), Buffer.from([0, 0, 0, 0]), Buffer.from("WEBP", "latin1"),
|
|
548
|
+
Buffer.from("VP8 ", "latin1"), Buffer.from([3, 0, 0, 0]), Buffer.from([1, 2, 3]),
|
|
549
|
+
]);
|
|
550
|
+
var outOdd = b.guardImage.sanitize({ bytes: oddNoPad });
|
|
551
|
+
check("webp: odd-size final chunk without pad tolerated", _has(outOdd.bytes, "VP8 "));
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
function testStripWebpMalformed() {
|
|
555
|
+
check("webp: chunk-overrun malformed",
|
|
556
|
+
_code(function () {
|
|
557
|
+
b.guardImage.sanitize({ bytes: Buffer.concat([
|
|
558
|
+
Buffer.from("RIFF", "latin1"), Buffer.from([0, 0, 0, 0]), Buffer.from("WEBP", "latin1"),
|
|
559
|
+
Buffer.from("VP8 ", "latin1"), Buffer.from([0xFF, 0, 0, 0]),
|
|
560
|
+
]) });
|
|
561
|
+
}) === "image.sanitize-malformed");
|
|
562
|
+
}
|
|
563
|
+
|
|
130
564
|
function testStripWebpVp8xFlags() {
|
|
131
565
|
var webpx = Buffer.concat([
|
|
132
566
|
Buffer.from("RIFF", "latin1"), Buffer.from([0, 0, 0, 0]), Buffer.from("WEBP", "latin1"),
|
|
@@ -162,25 +596,65 @@ function testBmpPassthrough() {
|
|
|
162
596
|
check("bmp: passes through (no metadata container)", out.bytes === bmp);
|
|
163
597
|
}
|
|
164
598
|
|
|
165
|
-
function
|
|
599
|
+
function testSanitizePassthroughShapes() {
|
|
600
|
+
// ICO carries no metadata container — same-reference passthrough.
|
|
601
|
+
var icoBag = { bytes: Buffer.from([0x00, 0x00, 0x01, 0x00, 0, 0, 0, 0]) };
|
|
602
|
+
check("ico: passes through unchanged", b.guardImage.sanitize(icoBag) === icoBag);
|
|
603
|
+
// Non-Buffer bytes (Array) are not utf8-decoded — the bag returns unchanged.
|
|
604
|
+
var arrBag = { bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A] };
|
|
605
|
+
check("sanitize: non-Buffer bytes pass through (same bag)", b.guardImage.sanitize(arrBag) === arrBag);
|
|
606
|
+
// No bytes at all → bag returned unchanged.
|
|
607
|
+
var emptyBag = {};
|
|
608
|
+
check("sanitize: no bytes → bag unchanged", b.guardImage.sanitize(emptyBag) === emptyBag);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
function testSanitizeBadInput() {
|
|
612
|
+
check("sanitize(null) → bad-input refuse",
|
|
613
|
+
_code(function () { b.guardImage.sanitize(null); }) === "image.bad-input");
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
async function run() {
|
|
166
617
|
testGuardImageSurface();
|
|
167
618
|
testGuardImageRegistryParity();
|
|
168
619
|
testInspectMagic();
|
|
620
|
+
testInspectMagicAllFormats();
|
|
621
|
+
testInspectMagicBomSvg();
|
|
622
|
+
testValidateSvgRoutedEveryProfile();
|
|
623
|
+
testBomDoesNotBypassRasterMagic();
|
|
624
|
+
testValidateNeverThrowsHostileMetadata();
|
|
169
625
|
testValidateMismatchAndPolyglot();
|
|
626
|
+
testValidatePolyglot();
|
|
627
|
+
testValidateUnknownMagicSeverity();
|
|
628
|
+
testValidateOversizedBytes();
|
|
629
|
+
testValidateDimensionAndFrameCaps();
|
|
630
|
+
testValidateBadInput();
|
|
631
|
+
testValidateBadOpt();
|
|
632
|
+
testCompliancePostures();
|
|
633
|
+
await testGate();
|
|
170
634
|
testStripJpegExif();
|
|
635
|
+
testStripJpegRichFraming();
|
|
636
|
+
testStripJpegMalformed();
|
|
171
637
|
testStripPngText();
|
|
638
|
+
testStripPngRichChunks();
|
|
639
|
+
testStripPngMalformed();
|
|
172
640
|
testStripGifComment();
|
|
641
|
+
testStripGifRichBlocks();
|
|
642
|
+
testStripGifMalformed();
|
|
173
643
|
testStripWebpExif();
|
|
644
|
+
testStripWebpXmpAndPad();
|
|
645
|
+
testStripWebpMalformed();
|
|
174
646
|
testStripWebpVp8xFlags();
|
|
175
647
|
testRefuseBeforeStrip();
|
|
176
648
|
testRefuseUnsupportedFormat();
|
|
177
649
|
testRefuseMalformed();
|
|
178
650
|
testBmpPassthrough();
|
|
651
|
+
testSanitizePassthroughShapes();
|
|
652
|
+
testSanitizeBadInput();
|
|
179
653
|
}
|
|
180
654
|
|
|
181
655
|
module.exports = { run: run };
|
|
182
656
|
|
|
183
657
|
if (require.main === module) {
|
|
184
|
-
|
|
185
|
-
|
|
658
|
+
run().then(function () { console.log("[guard-image] OK — " + helpers.getChecks() + " checks passed"); })
|
|
659
|
+
.catch(function (e) { console.error("FAIL:", helpers.formatErr(e)); process.exit(1); });
|
|
186
660
|
}
|
|
Binary file
|