@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -1,565 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
// Copyright (c) blamejs contributors
|
|
3
|
-
"use strict";
|
|
4
|
-
/**
|
|
5
|
-
* b.network.smtp.policy — coverage for the input-validation, option-default,
|
|
6
|
-
* error-handling, and pure-logic branches that smtp-policy.test.js leaves
|
|
7
|
-
* uncovered.
|
|
8
|
-
*
|
|
9
|
-
* Everything here is in-memory: DNS is driven through the `dnsLookup` opt,
|
|
10
|
-
* HTTPS submission through an operator-supplied `httpClient` fake, and the
|
|
11
|
-
* receive-side `parseReport` runs on Buffers built in-process. No branch
|
|
12
|
-
* needs a live network or DNS backend (those belong to the integration
|
|
13
|
-
* suite). The uncovered surface is: MTA-STS parse rejects (empty / bad-mode /
|
|
14
|
-
* non-string), matchMx defensive returns, mtaSts.fetch precondition + domain
|
|
15
|
-
* guard, dane.tlsa / recordShape guards + every RFC 6698 label, verifyChain
|
|
16
|
-
* PKIX-opt-in + unsupported-usage + SHA-512 + SPKI-no-bytes paths, tlsRpt
|
|
17
|
-
* recordShape type guards + policy defaults, fetchPolicy rua-required +
|
|
18
|
-
* no-record returns, submit scheme dispatch + failure branches, and the
|
|
19
|
-
* entire tlsRpt.parseReport receive-side parser.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
var helpers = require("../helpers");
|
|
23
|
-
var b = helpers.b;
|
|
24
|
-
var check = helpers.check;
|
|
25
|
-
|
|
26
|
-
var nodeCrypto = require("crypto");
|
|
27
|
-
var zlib = require("zlib");
|
|
28
|
-
var C = require("../../lib/constants");
|
|
29
|
-
|
|
30
|
-
// ---- small local helpers -------------------------------------------------
|
|
31
|
-
|
|
32
|
-
function throwsWithCode(fn, codeRe) {
|
|
33
|
-
var threw = null;
|
|
34
|
-
try { fn(); } catch (e) { threw = e; }
|
|
35
|
-
return threw !== null && codeRe.test(threw.code || "");
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async function asyncThrowsWithCode(fn, codeRe) {
|
|
39
|
-
var threw = null;
|
|
40
|
-
try { await fn(); } catch (e) { threw = e; }
|
|
41
|
-
return threw !== null && codeRe.test(threw.code || "");
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// ---- MTA-STS parse (mtaSts.parsePolicy) ----------------------------------
|
|
45
|
-
|
|
46
|
-
function testParseStsEmptyAndNonString() {
|
|
47
|
-
check("parsePolicy: empty text → mta-sts-empty",
|
|
48
|
-
throwsWithCode(function () { b.network.smtp.mtaSts.parsePolicy(""); }, /mta-sts-empty/));
|
|
49
|
-
check("parsePolicy: non-string → mta-sts-empty",
|
|
50
|
-
throwsWithCode(function () { b.network.smtp.mtaSts.parsePolicy(null); }, /mta-sts-empty/));
|
|
51
|
-
check("parsePolicy: number → mta-sts-empty",
|
|
52
|
-
throwsWithCode(function () { b.network.smtp.mtaSts.parsePolicy(42); }, /mta-sts-empty/));
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function testParseStsBadMode() {
|
|
56
|
-
check("parsePolicy: unknown mode → mta-sts-bad-mode",
|
|
57
|
-
throwsWithCode(function () {
|
|
58
|
-
b.network.smtp.mtaSts.parsePolicy("version: STSv1\nmode: bogus\n");
|
|
59
|
-
}, /mta-sts-bad-mode/));
|
|
60
|
-
// A version-only policy (no mode line) leaves mode null → bad-mode.
|
|
61
|
-
check("parsePolicy: missing mode → mta-sts-bad-mode",
|
|
62
|
-
throwsWithCode(function () {
|
|
63
|
-
b.network.smtp.mtaSts.parsePolicy("version: STSv1\nmax_age: 100\n");
|
|
64
|
-
}, /mta-sts-bad-mode/));
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function testParseStsModeVariantsAndMaxAge() {
|
|
68
|
-
var testing = b.network.smtp.mtaSts.parsePolicy("version: STSv1\nmode: testing\n");
|
|
69
|
-
check("parsePolicy: testing mode accepted", testing.mode === "testing");
|
|
70
|
-
|
|
71
|
-
var none = b.network.smtp.mtaSts.parsePolicy("version: STSv1\nmode: none\n");
|
|
72
|
-
check("parsePolicy: none mode accepted", none.mode === "none");
|
|
73
|
-
|
|
74
|
-
// mode is lowercased on parse.
|
|
75
|
-
var upper = b.network.smtp.mtaSts.parsePolicy("version: STSv1\nmode: ENFORCE\n");
|
|
76
|
-
check("parsePolicy: mode is case-normalized to lowercase", upper.mode === "enforce");
|
|
77
|
-
|
|
78
|
-
// mx hosts are lowercased and collected in order (repeats preserved).
|
|
79
|
-
var multi = b.network.smtp.mtaSts.parsePolicy(
|
|
80
|
-
"version: STSv1\nmode: enforce\nmx: MX1.Example.COM\nmx: mx2.example.com\n");
|
|
81
|
-
check("parsePolicy: mx hosts lowercased + ordered",
|
|
82
|
-
multi.mx.length === 2 && multi.mx[0] === "mx1.example.com" && multi.mx[1] === "mx2.example.com");
|
|
83
|
-
|
|
84
|
-
// With no max_age line the field stays null (falls back to the default TTL
|
|
85
|
-
// inside fetch; parse itself just records absence).
|
|
86
|
-
check("parsePolicy: absent max_age stays null", multi.max_age === null);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ---- MTA-STS MX match (mtaSts.matchMx) — defensive returns ----------------
|
|
90
|
-
|
|
91
|
-
function testMatchMxDefensiveReturns() {
|
|
92
|
-
check("matchMx: non-string mxHost → false",
|
|
93
|
-
b.network.smtp.mtaSts.matchMx(123, ["mx.example.com"]) === false);
|
|
94
|
-
check("matchMx: non-array mxList → false",
|
|
95
|
-
b.network.smtp.mtaSts.matchMx("mx.example.com", "mx.example.com") === false);
|
|
96
|
-
check("matchMx: null mxList → false",
|
|
97
|
-
b.network.smtp.mtaSts.matchMx("mx.example.com", null) === false);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function testMatchMxCaseAndDotEdges() {
|
|
101
|
-
// Case-insensitive exact match.
|
|
102
|
-
check("matchMx: exact match is case-insensitive",
|
|
103
|
-
b.network.smtp.mtaSts.matchMx("MX1.EXAMPLE.COM", ["mx1.example.com"]) === true);
|
|
104
|
-
// A single-label host (no dot) cannot satisfy a wildcard entry.
|
|
105
|
-
check("matchMx: dotless host vs wildcard → false",
|
|
106
|
-
b.network.smtp.mtaSts.matchMx("localhost", ["*.example.com"]) === false);
|
|
107
|
-
// A bare "*." entry is too short to be a wildcard and never matches.
|
|
108
|
-
check("matchMx: bare '*.' entry never matches",
|
|
109
|
-
b.network.smtp.mtaSts.matchMx("a.example.com", ["*."]) === false);
|
|
110
|
-
// A non-matching-suffix wildcard → false.
|
|
111
|
-
check("matchMx: wildcard suffix must match",
|
|
112
|
-
b.network.smtp.mtaSts.matchMx("mx1.other.com", ["*.example.com"]) === false);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// ---- MTA-STS fetch (mtaSts.fetch) — precondition + domain guard -----------
|
|
116
|
-
|
|
117
|
-
async function testMtaStsFetchDomainGuard() {
|
|
118
|
-
check("mtaSts.fetch: non-string domain → bad-domain",
|
|
119
|
-
await asyncThrowsWithCode(function () { return b.network.smtp.mtaSts.fetch(123); }, /bad-domain/));
|
|
120
|
-
check("mtaSts.fetch: empty domain → bad-domain",
|
|
121
|
-
await asyncThrowsWithCode(function () { return b.network.smtp.mtaSts.fetch(""); }, /bad-domain/));
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
async function testMtaStsFetchNoTxtRecord() {
|
|
125
|
-
// A domain whose _mta-sts TXT does not carry v=STSv1 has no rotation
|
|
126
|
-
// signal → fetch refuses to pull the HTTPS policy (RFC 8461 §3.1) and
|
|
127
|
-
// returns null WITHOUT touching the network.
|
|
128
|
-
var dnsLookup = async function () { return [["some-unrelated-txt-value"]]; };
|
|
129
|
-
var rv = await b.network.smtp.mtaSts.fetch("example.com", { dnsLookup: dnsLookup });
|
|
130
|
-
check("mtaSts.fetch: TXT without v=STSv1 → null", rv === null);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async function testMtaStsFetchTxtAbsent() {
|
|
134
|
-
// ENOTFOUND from the resolver → safeResolveTxt returns null → fetch null.
|
|
135
|
-
var dnsLookup = async function () { var e = new Error("nx"); e.code = "ENOTFOUND"; throw e; };
|
|
136
|
-
var rv = await b.network.smtp.mtaSts.fetch("no-such.example.com", { dnsLookup: dnsLookup });
|
|
137
|
-
check("mtaSts.fetch: absent _mta-sts TXT → null", rv === null);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// ---- DANE tlsa (dane.tlsa) — domain guard ---------------------------------
|
|
141
|
-
|
|
142
|
-
async function testDaneTlsaDomainGuard() {
|
|
143
|
-
check("dane.tlsa: non-string domain → bad-domain",
|
|
144
|
-
await asyncThrowsWithCode(function () { return b.network.smtp.dane.tlsa(42); }, /bad-domain/));
|
|
145
|
-
check("dane.tlsa: empty domain → bad-domain",
|
|
146
|
-
await asyncThrowsWithCode(function () { return b.network.smtp.dane.tlsa(""); }, /bad-domain/));
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// ---- DANE recordShape (dane.recordShape) — guard + every label -----------
|
|
150
|
-
|
|
151
|
-
function testDaneRecordShapeGuard() {
|
|
152
|
-
check("dane.recordShape: non-object → dane-bad-record",
|
|
153
|
-
throwsWithCode(function () { b.network.smtp.dane.recordShape(null); }, /dane-bad-record/));
|
|
154
|
-
check("dane.recordShape: string → dane-bad-record",
|
|
155
|
-
throwsWithCode(function () { b.network.smtp.dane.recordShape("x"); }, /dane-bad-record/));
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function testDaneRecordShapeAllLabels() {
|
|
159
|
-
var pkixTa = b.network.smtp.dane.recordShape({ usage: 0, selector: 0, mtype: 0, dataHex: "aa" });
|
|
160
|
-
check("recordShape: usage 0 / selector 0 / mtype 0 → PKIX-TA / Cert / Full",
|
|
161
|
-
pkixTa.usageLabel === "PKIX-TA" && pkixTa.selectorLabel === "Cert" && pkixTa.mtypeLabel === "Full");
|
|
162
|
-
|
|
163
|
-
var pkixEe = b.network.smtp.dane.recordShape({ usage: 1, selector: 1, mtype: 2, dataHex: "bb" });
|
|
164
|
-
check("recordShape: usage 1 / selector 1 / mtype 2 → PKIX-EE / SPKI / SHA-512",
|
|
165
|
-
pkixEe.usageLabel === "PKIX-EE" && pkixEe.selectorLabel === "SPKI" && pkixEe.mtypeLabel === "SHA-512");
|
|
166
|
-
|
|
167
|
-
var daneTa = b.network.smtp.dane.recordShape({ usage: 2, selector: 0, mtype: 1, dataHex: "cc" });
|
|
168
|
-
check("recordShape: usage 2 → DANE-TA", daneTa.usageLabel === "DANE-TA");
|
|
169
|
-
|
|
170
|
-
var unknown = b.network.smtp.dane.recordShape({ usage: 9, selector: 5, mtype: 7, dataHex: "dd" });
|
|
171
|
-
check("recordShape: out-of-range codes → unknown labels",
|
|
172
|
-
unknown.usageLabel === "unknown" && unknown.selectorLabel === "unknown" && unknown.mtypeLabel === "unknown");
|
|
173
|
-
|
|
174
|
-
// The raw fields pass through unchanged.
|
|
175
|
-
check("recordShape: raw fields pass through",
|
|
176
|
-
daneTa.usage === 2 && daneTa.selector === 0 && daneTa.mtype === 1 && daneTa.dataHex === "cc");
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// ---- DANE verifyChain (dane.verifyChain) — uncovered branches ------------
|
|
180
|
-
|
|
181
|
-
function testVerifyChainPkixOptIn() {
|
|
182
|
-
var leaf = Buffer.from("leaf-der-bytes", "utf8");
|
|
183
|
-
var ca = Buffer.from("ca-der-bytes", "utf8");
|
|
184
|
-
|
|
185
|
-
// PKIX-EE (usage 1) with allowPkixModes → matches leaf, flags pkixPathRequired.
|
|
186
|
-
var eeRec = { usage: 1, selector: 0, mtype: 0, dataHex: leaf.toString("hex") };
|
|
187
|
-
var eeRv = b.network.smtp.dane.verifyChain([leaf, ca], [eeRec], { allowPkixModes: true });
|
|
188
|
-
check("verifyChain: PKIX-EE opt-in matches leaf with pkixPathRequired",
|
|
189
|
-
eeRv.ok === true && eeRv.matches[0].usage === "PKIX-EE" &&
|
|
190
|
-
eeRv.matches[0].certIndex === 0 && eeRv.matches[0].pkixPathRequired === true);
|
|
191
|
-
|
|
192
|
-
// PKIX-TA (usage 0) with allowPkixModes → matches a non-leaf cert.
|
|
193
|
-
var taRec = { usage: 0, selector: 0, mtype: 0, dataHex: ca.toString("hex") };
|
|
194
|
-
var taRv = b.network.smtp.dane.verifyChain([leaf, ca], [taRec], { allowPkixModes: true });
|
|
195
|
-
check("verifyChain: PKIX-TA opt-in matches trust-anchor cert with pkixPathRequired",
|
|
196
|
-
taRv.ok === true && taRv.matches[0].usage === "PKIX-TA" &&
|
|
197
|
-
taRv.matches[0].certIndex === 1 && taRv.matches[0].pkixPathRequired === true);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
function testVerifyChainUnsupportedUsage() {
|
|
201
|
-
var leaf = Buffer.from("leaf", "utf8");
|
|
202
|
-
var rec = { usage: 7, selector: 0, mtype: 0, dataHex: "00" }; // out-of-range usage
|
|
203
|
-
var rv = b.network.smtp.dane.verifyChain([leaf], [rec]);
|
|
204
|
-
check("verifyChain: unsupported usage → ok=false + unsupported-usage error",
|
|
205
|
-
rv.ok === false && rv.matches.length === 0 &&
|
|
206
|
-
rv.errors[0] && rv.errors[0].reason === "unsupported-usage" && rv.errors[0].usage === 7);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function testVerifyChainDaneEeSha512() {
|
|
210
|
-
var leaf = Buffer.from("leaf-bytes-for-sha512", "utf8");
|
|
211
|
-
var sha512Hex = nodeCrypto.createHash("sha512").update(leaf).digest("hex");
|
|
212
|
-
var rec = { usage: 3, selector: 0, mtype: 2, dataHex: sha512Hex };
|
|
213
|
-
var rv = b.network.smtp.dane.verifyChain([leaf], [rec]);
|
|
214
|
-
check("verifyChain: DANE-EE / Cert / SHA-512 matches via hash",
|
|
215
|
-
rv.ok === true && rv.matches[0].usage === "DANE-EE" && rv.matches[0].mtype === "SHA-512");
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
function testVerifyChainSpkiSelectorNoBytes() {
|
|
219
|
-
// selector=1 (SPKI) on a non-DER buffer → SPKI extraction returns null →
|
|
220
|
-
// no match (the `if (!bytes) return null` branch in _matchTlsaAgainstCert).
|
|
221
|
-
var fake = Buffer.from("definitely not DER", "utf8");
|
|
222
|
-
var rec = { usage: 3, selector: 1, mtype: 0, dataHex: fake.toString("hex") };
|
|
223
|
-
var rv = b.network.smtp.dane.verifyChain([fake], [rec]);
|
|
224
|
-
check("verifyChain: SPKI selector on non-DER cert → no match",
|
|
225
|
-
rv.ok === false && rv.matches.length === 0);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// ---- TLS-RPT recordShape (tlsRpt.recordShape) — type guards + defaults ----
|
|
229
|
-
|
|
230
|
-
function testRecordShapeTypeGuards() {
|
|
231
|
-
check("recordShape: non-string organization → tls-rpt-bad-organization",
|
|
232
|
-
throwsWithCode(function () {
|
|
233
|
-
b.network.smtp.tlsRpt.recordShape({ organization: 123, policies: [] });
|
|
234
|
-
}, /tls-rpt-bad-organization/));
|
|
235
|
-
check("recordShape: non-array policies → tls-rpt-bad-policies",
|
|
236
|
-
throwsWithCode(function () {
|
|
237
|
-
b.network.smtp.tlsRpt.recordShape({ organization: "example.com", policies: "nope" });
|
|
238
|
-
}, /tls-rpt-bad-policies/));
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
function testRecordShapePolicyDefaults() {
|
|
242
|
-
var rpt = b.network.smtp.tlsRpt.recordShape({
|
|
243
|
-
organization: "example.com",
|
|
244
|
-
policies: [{ domain: "example.com" }], // everything else defaulted
|
|
245
|
-
});
|
|
246
|
-
var pol = rpt.policies[0];
|
|
247
|
-
check("recordShape: policy-type defaults to 'sts'", pol.policy["policy-type"] === "sts");
|
|
248
|
-
check("recordShape: policy-string defaults to []",
|
|
249
|
-
Array.isArray(pol.policy["policy-string"]) && pol.policy["policy-string"].length === 0);
|
|
250
|
-
check("recordShape: mx-host defaults to []",
|
|
251
|
-
Array.isArray(pol.policy["mx-host"]) && pol.policy["mx-host"].length === 0);
|
|
252
|
-
check("recordShape: session counts default to 0",
|
|
253
|
-
pol.summary["total-successful-session-count"] === 0 &&
|
|
254
|
-
pol.summary["total-failure-session-count"] === 0);
|
|
255
|
-
check("recordShape: failure-details defaults to []",
|
|
256
|
-
Array.isArray(pol["failure-details"]) && pol["failure-details"].length === 0);
|
|
257
|
-
// A generated report-id + a default date-range are always present.
|
|
258
|
-
check("recordShape: auto report-id present",
|
|
259
|
-
typeof rpt["report-id"] === "string" && rpt["report-id"].length > 0);
|
|
260
|
-
check("recordShape: default date-range present",
|
|
261
|
-
typeof rpt["date-range"]["start-datetime"] === "string" &&
|
|
262
|
-
typeof rpt["date-range"]["end-datetime"] === "string");
|
|
263
|
-
check("recordShape: contact-info defaults to null", rpt["contact-info"] === null);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// ---- TLS-RPT fetchPolicy (tlsRpt.fetchPolicy) — guard + no-record returns --
|
|
267
|
-
|
|
268
|
-
async function testFetchPolicyDomainGuard() {
|
|
269
|
-
check("fetchPolicy: non-string domain → tls-rpt-bad-domain",
|
|
270
|
-
await asyncThrowsWithCode(function () { return b.network.smtp.tlsRpt.fetchPolicy(42); }, /tls-rpt-bad-domain/));
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
async function testFetchPolicyRuaRequired() {
|
|
274
|
-
// A v=TLSRPTv1 record with no rua= is malformed and MUST be ignored.
|
|
275
|
-
var dnsLookup = async function () { return [["v=TLSRPTv1;"]]; };
|
|
276
|
-
var rv = await b.network.smtp.tlsRpt.fetchPolicy("example.com", { dnsLookup: dnsLookup });
|
|
277
|
-
check("fetchPolicy: v=TLSRPTv1 without rua → null", rv === null);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
async function testFetchPolicyNoMatchingRecord() {
|
|
281
|
-
// No record begins with v=TLSRPTv1 → null.
|
|
282
|
-
var dnsLookup = async function () { return [["v=spf1 -all"]]; };
|
|
283
|
-
var rv = await b.network.smtp.tlsRpt.fetchPolicy("example.com", { dnsLookup: dnsLookup });
|
|
284
|
-
check("fetchPolicy: no v=TLSRPTv1 record → null", rv === null);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
async function testFetchPolicyNoTxtAtAll() {
|
|
288
|
-
// safeResolveTxt returns null on ENODATA → fetchPolicy null.
|
|
289
|
-
var dnsLookup = async function () { var e = new Error("nodata"); e.code = "ENODATA"; throw e; };
|
|
290
|
-
var rv = await b.network.smtp.tlsRpt.fetchPolicy("bare.example.com", { dnsLookup: dnsLookup });
|
|
291
|
-
check("fetchPolicy: no TXT record at all → null", rv === null);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
async function testFetchPolicyTrimsAndSplitsRua() {
|
|
295
|
-
var dnsLookup = async function () {
|
|
296
|
-
return [["v=TLSRPTv1; rua=https://a.example.com/r , mailto:tls@example.com "]];
|
|
297
|
-
};
|
|
298
|
-
var rv = await b.network.smtp.tlsRpt.fetchPolicy("example.com", { dnsLookup: dnsLookup });
|
|
299
|
-
check("fetchPolicy: comma-split rua entries are trimmed",
|
|
300
|
-
rv && rv.rua.length === 2 &&
|
|
301
|
-
rv.rua[0] === "https://a.example.com/r" && rv.rua[1] === "mailto:tls@example.com");
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// ---- TLS-RPT submit (tlsRpt.submit) — dispatch + failure branches ----------
|
|
305
|
-
|
|
306
|
-
async function testSubmitRejectsNonObjectReport() {
|
|
307
|
-
check("submit: non-object report → tls-rpt-bad-report",
|
|
308
|
-
await asyncThrowsWithCode(function () {
|
|
309
|
-
return b.network.smtp.tlsRpt.submit("not-a-report", { rua: ["https://x.example/r"] });
|
|
310
|
-
}, /tls-rpt-bad-report/));
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
async function testSubmitHttpsNon2xx() {
|
|
314
|
-
// The framework httpClient resolves { statusCode, headers, body } — the
|
|
315
|
-
// fake mirrors that real contract so this branch exercises the shape the
|
|
316
|
-
// production path actually returns.
|
|
317
|
-
var fakeHttp = { request: async function () { return { statusCode: 500, body: Buffer.from("") }; } };
|
|
318
|
-
var rv = await b.network.smtp.tlsRpt.submit(
|
|
319
|
-
{ "organization-name": "example.com", "report-id": "r1" },
|
|
320
|
-
{ rua: ["https://reports.example.com/submit"], httpClient: fakeHttp });
|
|
321
|
-
var e = rv.results[0];
|
|
322
|
-
check("submit: https non-2xx → ok=false with HTTP-status error",
|
|
323
|
-
e.kind === "https" && e.ok === false && e.error === "HTTP 500");
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
async function testSubmitHttpsSuccess2xx() {
|
|
327
|
-
// A successful submission MUST be reported ok=true. The framework
|
|
328
|
-
// httpClient resolves { statusCode, headers, body } (see mtaSts.fetch,
|
|
329
|
-
// which reads res.statusCode); a submit path that reads a non-existent
|
|
330
|
-
// `status` field would mark every real 2xx POST as a failure.
|
|
331
|
-
var fakeHttp = { request: async function () { return { statusCode: 200, headers: {}, body: Buffer.from("") }; } };
|
|
332
|
-
var rv = await b.network.smtp.tlsRpt.submit(
|
|
333
|
-
{ "organization-name": "example.com", "report-id": "r1" },
|
|
334
|
-
{ rua: ["https://reports.example.com/submit"], httpClient: fakeHttp });
|
|
335
|
-
var e = rv.results[0];
|
|
336
|
-
check("submit: https 2xx → ok=true, status=200, no error",
|
|
337
|
-
e.kind === "https" && e.ok === true && e.status === 200 && e.error === null);
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
async function testSubmitHttpsThrows() {
|
|
341
|
-
var fakeHttp = { request: async function () { throw new Error("connreset"); } };
|
|
342
|
-
var rv = await b.network.smtp.tlsRpt.submit(
|
|
343
|
-
{ "organization-name": "example.com" },
|
|
344
|
-
{ rua: ["https://reports.example.com/submit"], httpClient: fakeHttp });
|
|
345
|
-
var e = rv.results[0];
|
|
346
|
-
check("submit: https request throw is caught into entry.error",
|
|
347
|
-
e.ok === false && /connreset/.test(e.error || ""));
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
async function testSubmitInvalidMailtoAddr() {
|
|
351
|
-
var rv = await b.network.smtp.tlsRpt.submit(
|
|
352
|
-
{ "organization-name": "example.com" },
|
|
353
|
-
{ rua: ["mailto:not a valid address"] });
|
|
354
|
-
var e = rv.results[0];
|
|
355
|
-
check("submit: invalid mailto addr-spec → refused, not forwarded",
|
|
356
|
-
e.ok === false && /not a valid RFC 5322 addr-spec/.test(e.error || "") && !e.mailto);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
async function testSubmitUnsupportedScheme() {
|
|
360
|
-
var rv = await b.network.smtp.tlsRpt.submit(
|
|
361
|
-
{ "organization-name": "example.com" },
|
|
362
|
-
{ rua: ["ftp://reports.example.com/r"] });
|
|
363
|
-
var e = rv.results[0];
|
|
364
|
-
check("submit: unsupported rua scheme → error names the scheme",
|
|
365
|
-
e.ok === false && /unsupported rua URI scheme: ftp/.test(e.error || ""));
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
async function testSubmitValidMailtoBody() {
|
|
369
|
-
var report = b.network.smtp.tlsRpt.recordShape({
|
|
370
|
-
organization: "example.com",
|
|
371
|
-
reportId: "rpt-777",
|
|
372
|
-
policies: [{ type: "sts", domain: "example.com" }],
|
|
373
|
-
});
|
|
374
|
-
var rv = await b.network.smtp.tlsRpt.submit(report, { rua: ["mailto:tls@example.com"] });
|
|
375
|
-
var e = rv.results[0];
|
|
376
|
-
check("submit: valid mailto → prepared gzip body + subject with Report-ID",
|
|
377
|
-
e.kind === "mailto" && e.ok === true &&
|
|
378
|
-
Buffer.isBuffer(e.mailto.body) && e.mailto.body[0] === 0x1f && e.mailto.body[1] === 0x8b &&
|
|
379
|
-
e.mailto.to === "tls@example.com" &&
|
|
380
|
-
e.mailto.subject.indexOf("rpt-777") !== -1);
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
// ---- TLS-RPT parseReport (tlsRpt.parseReport) — receive-side parser -------
|
|
384
|
-
|
|
385
|
-
function _validReport() {
|
|
386
|
-
return {
|
|
387
|
-
"organization-name": "reporter.example",
|
|
388
|
-
"date-range": { "start-datetime": "2026-01-01T00:00:00Z", "end-datetime": "2026-01-02T00:00:00Z" },
|
|
389
|
-
"report-id": "report-abc-123",
|
|
390
|
-
"contact-info": "tls-reports@reporter.example",
|
|
391
|
-
"policies": [
|
|
392
|
-
{ summary: { "total-successful-session-count": 10, "total-failure-session-count": 3 } },
|
|
393
|
-
{ summary: { "total-successful-session-count": 5, "total-failure-session-count": 1 } },
|
|
394
|
-
],
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
function testParseReportBadInput() {
|
|
399
|
-
check("parseReport: null body → tls-rpt-bad-input",
|
|
400
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(null); }, /tls-rpt-bad-input/));
|
|
401
|
-
check("parseReport: undefined body → tls-rpt-bad-input",
|
|
402
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(undefined); }, /tls-rpt-bad-input/));
|
|
403
|
-
check("parseReport: number body → tls-rpt-bad-input",
|
|
404
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(12345); }, /tls-rpt-bad-input/));
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
function testParseReportBadJsonAndShape() {
|
|
408
|
-
check("parseReport: malformed JSON → tls-rpt-bad-json",
|
|
409
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport("{not json"); }, /tls-rpt-bad-json/));
|
|
410
|
-
check("parseReport: scalar JSON (number) → tls-rpt-bad-shape",
|
|
411
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport("123"); }, /tls-rpt-bad-shape/));
|
|
412
|
-
check("parseReport: JSON null → tls-rpt-bad-shape",
|
|
413
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport("null"); }, /tls-rpt-bad-shape/));
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
function testParseReportMissingRequiredField() {
|
|
417
|
-
var r = _validReport();
|
|
418
|
-
delete r["report-id"];
|
|
419
|
-
check("parseReport: missing required field → tls-rpt-missing-field",
|
|
420
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(JSON.stringify(r)); }, /tls-rpt-missing-field/));
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
function testParseReportBadDateRange() {
|
|
424
|
-
var r = _validReport();
|
|
425
|
-
r["date-range"] = { "start-datetime": 1234, "end-datetime": "2026-01-02T00:00:00Z" };
|
|
426
|
-
check("parseReport: non-string date-range field → tls-rpt-bad-date-range",
|
|
427
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(JSON.stringify(r)); }, /tls-rpt-bad-date-range/));
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
function testParseReportPoliciesNotArray() {
|
|
431
|
-
var r = _validReport();
|
|
432
|
-
r.policies = { "0": {} };
|
|
433
|
-
check("parseReport: policies not an array → tls-rpt-bad-policies",
|
|
434
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(JSON.stringify(r)); }, /tls-rpt-bad-policies/));
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
function testParseReportTooManyPolicies() {
|
|
438
|
-
var r = _validReport();
|
|
439
|
-
r.policies = [];
|
|
440
|
-
for (var i = 0; i < 1025; i += 1) r.policies.push({ summary: {} }); // cap is 1024
|
|
441
|
-
check("parseReport: > 1024 policies → tls-rpt-too-many-policies",
|
|
442
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(JSON.stringify(r)); }, /tls-rpt-too-many-policies/));
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
function testParseReportTooLarge() {
|
|
446
|
-
// A body larger than the 8 MiB cap is refused before any parse/decompress.
|
|
447
|
-
var big = Buffer.alloc(C.BYTES.mib(8) + 1, 0x20); // spaces, not gzip magic
|
|
448
|
-
check("parseReport: over-cap body → tls-rpt-too-large",
|
|
449
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(big); }, /tls-rpt-too-large/));
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
function testParseReportHappyPathAggregates() {
|
|
453
|
-
var parsed = b.network.smtp.tlsRpt.parseReport(JSON.stringify(_validReport()));
|
|
454
|
-
check("parseReport: organization surfaced", parsed.organization === "reporter.example");
|
|
455
|
-
check("parseReport: report-id surfaced", parsed.reportId === "report-abc-123");
|
|
456
|
-
check("parseReport: contact surfaced", parsed.contact === "tls-reports@reporter.example");
|
|
457
|
-
check("parseReport: date-range surfaced",
|
|
458
|
-
parsed.dateRange.start === "2026-01-01T00:00:00Z" && parsed.dateRange.end === "2026-01-02T00:00:00Z");
|
|
459
|
-
check("parseReport: success/failure counts aggregated across policies",
|
|
460
|
-
parsed.totals.successful === 15 && parsed.totals.failure === 4);
|
|
461
|
-
check("parseReport: raw report echoed", parsed.raw && parsed.raw["report-id"] === "report-abc-123");
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
function testParseReportContactOptional() {
|
|
465
|
-
var r = _validReport();
|
|
466
|
-
delete r["contact-info"];
|
|
467
|
-
var parsed = b.network.smtp.tlsRpt.parseReport(JSON.stringify(r));
|
|
468
|
-
check("parseReport: absent contact-info → null", parsed.contact === null);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
function testParseReportNonFiniteCountsSkipped() {
|
|
472
|
-
var r = _validReport();
|
|
473
|
-
r.policies = [
|
|
474
|
-
{ summary: { "total-successful-session-count": "not-a-number", "total-failure-session-count": 2 } },
|
|
475
|
-
{ summary: { "total-successful-session-count": 4, "total-failure-session-count": null } },
|
|
476
|
-
{ /* no summary at all */ },
|
|
477
|
-
];
|
|
478
|
-
var parsed = b.network.smtp.tlsRpt.parseReport(JSON.stringify(r));
|
|
479
|
-
check("parseReport: non-numeric counts ignored in aggregation",
|
|
480
|
-
parsed.totals.successful === 4 && parsed.totals.failure === 2);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
function testParseReportGzipMagicSniff() {
|
|
484
|
-
var gz = zlib.gzipSync(Buffer.from(JSON.stringify(_validReport()), "utf8"));
|
|
485
|
-
var parsed = b.network.smtp.tlsRpt.parseReport(gz); // no contentType — sniffed by magic
|
|
486
|
-
check("parseReport: gzip body auto-detected by magic bytes",
|
|
487
|
-
parsed.organization === "reporter.example" && parsed.totals.successful === 15);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
function testParseReportGzipViaContentType() {
|
|
491
|
-
var gz = zlib.gzipSync(Buffer.from(JSON.stringify(_validReport()), "utf8"));
|
|
492
|
-
var parsed = b.network.smtp.tlsRpt.parseReport(gz, { contentType: "application/tlsrpt+gzip" });
|
|
493
|
-
check("parseReport: gzip body decompressed via contentType hint",
|
|
494
|
-
parsed.reportId === "report-abc-123");
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
function testParseReportGunzipFailure() {
|
|
498
|
-
// gzip magic bytes but a truncated/garbage deflate stream → gunzip throws.
|
|
499
|
-
var bad = Buffer.from([0x1f, 0x8b, 0x08, 0x00, 0xde, 0xad, 0xbe, 0xef]);
|
|
500
|
-
check("parseReport: corrupt gzip → tls-rpt-gunzip-failed",
|
|
501
|
-
throwsWithCode(function () { b.network.smtp.tlsRpt.parseReport(bad); }, /tls-rpt-gunzip-failed/));
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
// ---- runner --------------------------------------------------------------
|
|
505
|
-
|
|
506
|
-
async function run() {
|
|
507
|
-
testParseStsEmptyAndNonString();
|
|
508
|
-
testParseStsBadMode();
|
|
509
|
-
testParseStsModeVariantsAndMaxAge();
|
|
510
|
-
|
|
511
|
-
testMatchMxDefensiveReturns();
|
|
512
|
-
testMatchMxCaseAndDotEdges();
|
|
513
|
-
|
|
514
|
-
await testMtaStsFetchDomainGuard();
|
|
515
|
-
await testMtaStsFetchNoTxtRecord();
|
|
516
|
-
await testMtaStsFetchTxtAbsent();
|
|
517
|
-
|
|
518
|
-
await testDaneTlsaDomainGuard();
|
|
519
|
-
|
|
520
|
-
testDaneRecordShapeGuard();
|
|
521
|
-
testDaneRecordShapeAllLabels();
|
|
522
|
-
|
|
523
|
-
testVerifyChainPkixOptIn();
|
|
524
|
-
testVerifyChainUnsupportedUsage();
|
|
525
|
-
testVerifyChainDaneEeSha512();
|
|
526
|
-
testVerifyChainSpkiSelectorNoBytes();
|
|
527
|
-
|
|
528
|
-
testRecordShapeTypeGuards();
|
|
529
|
-
testRecordShapePolicyDefaults();
|
|
530
|
-
|
|
531
|
-
await testFetchPolicyDomainGuard();
|
|
532
|
-
await testFetchPolicyRuaRequired();
|
|
533
|
-
await testFetchPolicyNoMatchingRecord();
|
|
534
|
-
await testFetchPolicyNoTxtAtAll();
|
|
535
|
-
await testFetchPolicyTrimsAndSplitsRua();
|
|
536
|
-
|
|
537
|
-
await testSubmitRejectsNonObjectReport();
|
|
538
|
-
await testSubmitHttpsNon2xx();
|
|
539
|
-
await testSubmitHttpsSuccess2xx();
|
|
540
|
-
await testSubmitHttpsThrows();
|
|
541
|
-
await testSubmitInvalidMailtoAddr();
|
|
542
|
-
await testSubmitUnsupportedScheme();
|
|
543
|
-
await testSubmitValidMailtoBody();
|
|
544
|
-
|
|
545
|
-
testParseReportBadInput();
|
|
546
|
-
testParseReportBadJsonAndShape();
|
|
547
|
-
testParseReportMissingRequiredField();
|
|
548
|
-
testParseReportBadDateRange();
|
|
549
|
-
testParseReportPoliciesNotArray();
|
|
550
|
-
testParseReportTooManyPolicies();
|
|
551
|
-
testParseReportTooLarge();
|
|
552
|
-
testParseReportHappyPathAggregates();
|
|
553
|
-
testParseReportContactOptional();
|
|
554
|
-
testParseReportNonFiniteCountsSkipped();
|
|
555
|
-
testParseReportGzipMagicSniff();
|
|
556
|
-
testParseReportGzipViaContentType();
|
|
557
|
-
testParseReportGunzipFailure();
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
module.exports = { run: run };
|
|
561
|
-
|
|
562
|
-
if (require.main === module) {
|
|
563
|
-
run().then(function () { console.log("OK"); })
|
|
564
|
-
.catch(function (e) { console.error(e.stack || e); process.exit(1); });
|
|
565
|
-
}
|