@blamejs/blamejs-shop 0.5.12 → 0.5.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/sales-tax-filings.js +143 -0
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -1,437 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
// Copyright (c) blamejs contributors
|
|
3
|
-
"use strict";
|
|
4
|
-
/**
|
|
5
|
-
* b.mail.spf / b.mail.dmarc / b.mail.arc / b.mail.authResults —
|
|
6
|
-
* additional branch coverage.
|
|
7
|
-
*
|
|
8
|
-
* Companion to mail-auth.test.js. Targets uncovered input-validation,
|
|
9
|
-
* option-default, qualifier, macro-transformer, alignment-mode, and
|
|
10
|
-
* error-classification branches reachable through the public API with
|
|
11
|
-
* in-memory dnsLookup fakes (no live network — those live in
|
|
12
|
-
* test/integration). Does not duplicate the sibling file's cases.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
var helpers = require("../helpers");
|
|
16
|
-
var b = helpers.b;
|
|
17
|
-
var check = helpers.check;
|
|
18
|
-
|
|
19
|
-
// A TXT-only dnsLookup fake: `map[host]` returns the TXT record array
|
|
20
|
-
// ([["v=spf1 ..."]]); everything else is ENOTFOUND.
|
|
21
|
-
function _txtOnly(map) {
|
|
22
|
-
return async function (host, type) {
|
|
23
|
-
if (type === "TXT" && Object.prototype.hasOwnProperty.call(map, host)) return map[host];
|
|
24
|
-
var e = new Error("ENOTFOUND"); e.code = "ENOTFOUND"; throw e;
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Resolve a promise to the error it rejects with (or null when it fulfils).
|
|
29
|
-
async function _rejectedWith(promise) {
|
|
30
|
-
try { await promise; return null; } catch (e) { return e; }
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function _threw(fn) {
|
|
34
|
-
try { fn(); return null; } catch (e) { return e; }
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// ---- SPF: input validation (Tier-A throw at the entry point) ----
|
|
38
|
-
|
|
39
|
-
async function testSpfVerifyInputValidation() {
|
|
40
|
-
var e1 = await _rejectedWith(b.mail.spf.verify({ ip: 12345, mailFrom: "a@s.example" }));
|
|
41
|
-
check("spf.verify: non-string ip → spf-bad-ip throw",
|
|
42
|
-
e1 && /spf-bad-ip/.test(e1.code || ""));
|
|
43
|
-
var e2 = await _rejectedWith(b.mail.spf.verify({ ip: "192.0.2.5" }));
|
|
44
|
-
check("spf.verify: neither mailFrom nor helo → spf-bad-domain throw",
|
|
45
|
-
e2 && /spf-bad-domain/.test(e2.code || ""));
|
|
46
|
-
var e3 = await _rejectedWith(b.mail.spf.verify({ ip: "192.0.2.5", mailFrom: "a@s.example", bogus: 1 }));
|
|
47
|
-
check("spf.verify: unknown opt refused (config-time)", e3 !== null);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// ---- SPF: `all` qualifier → verdict mapping (RFC 7208 §4.6.2) ----
|
|
51
|
-
|
|
52
|
-
async function testSpfAllQualifierVerdicts() {
|
|
53
|
-
var cases = [
|
|
54
|
-
{ rec: "v=spf1 +all", want: "pass" },
|
|
55
|
-
{ rec: "v=spf1 ~all", want: "softfail" },
|
|
56
|
-
{ rec: "v=spf1 ?all", want: "neutral" },
|
|
57
|
-
{ rec: "v=spf1 all", want: "pass" }, // bare mechanism defaults to '+'
|
|
58
|
-
];
|
|
59
|
-
for (var i = 0; i < cases.length; i += 1) {
|
|
60
|
-
var dns = _txtOnly({ "s.example": [[cases[i].rec]] });
|
|
61
|
-
var rv = await b.mail.spf.verify({ ip: "192.0.2.5", mailFrom: "a@s.example", dnsLookup: dns });
|
|
62
|
-
check("spf.verify(" + JSON.stringify(cases[i].rec) + ") → " + cases[i].want,
|
|
63
|
-
rv.result === cases[i].want);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function testSpfNeutralWhenNoMechanismMatches() {
|
|
68
|
-
// A record with a non-matching mechanism and NO `all` / redirect falls
|
|
69
|
-
// through to the "no mechanism matched" default → neutral (RFC 7208 §4.7).
|
|
70
|
-
var dns = _txtOnly({ "s.example": [["v=spf1 ip4:198.51.100.0/24"]] });
|
|
71
|
-
var rv = await b.mail.spf.verify({ ip: "192.0.2.5", mailFrom: "a@s.example", dnsLookup: dns });
|
|
72
|
-
check("spf.verify: no mechanism matched + no all → neutral",
|
|
73
|
-
rv.result === "neutral" && /no mechanism matched/.test(rv.explanation || ""));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// ---- SPF: ip6 mechanism (RFC 7208 §5.6) on an IPv6 connection ----
|
|
77
|
-
|
|
78
|
-
async function testSpfIp6Mechanism() {
|
|
79
|
-
var dns = _txtOnly({ "s.example": [["v=spf1 ip6:2001:db8::/32 -all"]] });
|
|
80
|
-
var hit = await b.mail.spf.verify({ ip: "2001:db8::5", mailFrom: "a@s.example", dnsLookup: dns });
|
|
81
|
-
check("spf.verify(ip6:2001:db8::/32, IP in range) → pass", hit.result === "pass");
|
|
82
|
-
var miss = await b.mail.spf.verify({ ip: "2001:dead::5", mailFrom: "a@s.example", dnsLookup: dns });
|
|
83
|
-
check("spf.verify(ip6:2001:db8::/32, IP out of range) → fail (-all)", miss.result === "fail");
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// ---- SPF: helo fallback when MAIL FROM is absent (RFC 7208 §2.4) ----
|
|
87
|
-
|
|
88
|
-
async function testSpfHeloFallbackIdentity() {
|
|
89
|
-
var dns = _txtOnly({ "mail.example.com": [["v=spf1 ip4:192.0.2.0/24 -all"]] });
|
|
90
|
-
var rv = await b.mail.spf.verify({ ip: "192.0.2.5", helo: "mail.example.com", dnsLookup: dns });
|
|
91
|
-
check("spf.verify: HELO identity used when MAIL FROM absent → pass on helo domain",
|
|
92
|
-
rv.result === "pass" && rv.domain === "mail.example.com");
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// ---- SPF: include semantics (RFC 7208 §5.2) ----
|
|
96
|
-
|
|
97
|
-
async function testSpfIncludeSemantics() {
|
|
98
|
-
// A single include: to a domain with NO SPF record MUST permerror
|
|
99
|
-
// (RFC 7208 §5.2) — distinct from the void-lookup-cap path.
|
|
100
|
-
var noneDns = _txtOnly({ "s.example": [["v=spf1 include:missing.example -all"]] });
|
|
101
|
-
var rvNone = await b.mail.spf.verify({ ip: "192.0.2.5", mailFrom: "a@s.example", dnsLookup: noneDns });
|
|
102
|
-
check("spf.verify: include of a record-less domain → permerror (RFC 7208 §5.2)",
|
|
103
|
-
rvNone.result === "permerror" && /§5\.2|has no SPF record/.test(rvNone.explanation || ""));
|
|
104
|
-
|
|
105
|
-
// A matching include propagates the inner pass to the outer verdict.
|
|
106
|
-
var passDns = _txtOnly({
|
|
107
|
-
"s.example": [["v=spf1 include:_spf.p.example -all"]],
|
|
108
|
-
"_spf.p.example": [["v=spf1 ip4:192.0.2.0/24 ~all"]],
|
|
109
|
-
});
|
|
110
|
-
var rvPass = await b.mail.spf.verify({ ip: "192.0.2.5", mailFrom: "a@s.example", dnsLookup: passDns });
|
|
111
|
-
check("spf.verify: include that passes propagates to outer pass", rvPass.result === "pass");
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// ---- SPF: redirect= to a record-less target → permerror (RFC 7208 §6.1) ----
|
|
115
|
-
|
|
116
|
-
async function testSpfRedirectNoRecordPermerror() {
|
|
117
|
-
var dns = _txtOnly({ "s.example": [["v=spf1 redirect=_spf.missing.example"]] });
|
|
118
|
-
var rv = await b.mail.spf.verify({ ip: "192.0.2.5", mailFrom: "a@s.example", dnsLookup: dns });
|
|
119
|
-
check("spf.verify: redirect= to a record-less domain → permerror (RFC 7208 §6.1)",
|
|
120
|
-
rv.result === "permerror" && /§6\.1|has no SPF record/.test(rv.explanation || ""));
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// ---- SPF: macro letters + transformers (RFC 7208 §7) via exists ----
|
|
124
|
-
|
|
125
|
-
async function testSpfMacroLettersAndTransformers() {
|
|
126
|
-
// Each case is one `exists:` whose expanded A-query name we capture. The
|
|
127
|
-
// exists RESOLVES (→ pass) so it never charges the §4.6.4 void slot — a
|
|
128
|
-
// multi-miss chain would trip the void cap before every shape ran.
|
|
129
|
-
async function expand(record, mailFrom) {
|
|
130
|
-
var queried = [];
|
|
131
|
-
var dns = async function (host, type) {
|
|
132
|
-
if (type === "TXT" && host === "a.b.example") return [[record]];
|
|
133
|
-
if (type === "A") { queried.push(host); return ["127.0.0.2"]; }
|
|
134
|
-
var e = new Error("ENOTFOUND"); e.code = "ENOTFOUND"; throw e;
|
|
135
|
-
};
|
|
136
|
-
var rv = await b.mail.spf.verify({ ip: "192.0.2.9", mailFrom: mailFrom, dnsLookup: dns });
|
|
137
|
-
return { result: rv.result, queried: queried };
|
|
138
|
-
}
|
|
139
|
-
var mf = "alice@a.b.example";
|
|
140
|
-
var lo = await expand("v=spf1 exists:%{l}.%{o}.probe -all", mf);
|
|
141
|
-
check("spf macro %{l}.%{o} → local-part + full sender-domain",
|
|
142
|
-
lo.result === "pass" && lo.queried.indexOf("alice.a.b.example.probe") !== -1);
|
|
143
|
-
var d2 = await expand("v=spf1 exists:%{d2}.probe -all", mf);
|
|
144
|
-
check("spf macro %{d2} → rightmost two labels of current domain",
|
|
145
|
-
d2.result === "pass" && d2.queried.indexOf("b.example.probe") !== -1);
|
|
146
|
-
var dr = await expand("v=spf1 exists:%{dr}.probe -all", mf);
|
|
147
|
-
check("spf macro %{dr} → reversed current-domain labels",
|
|
148
|
-
dr.result === "pass" && dr.queried.indexOf("example.b.a.probe") !== -1);
|
|
149
|
-
var pct = await expand("v=spf1 exists:a%%b.probe -all", mf);
|
|
150
|
-
check("spf macro %% → literal percent",
|
|
151
|
-
pct.result === "pass" && pct.queried.indexOf("a%b.probe") !== -1);
|
|
152
|
-
var sp = await expand("v=spf1 exists:a%_b.probe -all", mf);
|
|
153
|
-
check("spf macro %_ → literal space",
|
|
154
|
-
sp.result === "pass" && sp.queried.indexOf("a b.probe") !== -1);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// ---- SPF: parseRecord surfaces qualifier + modifier structure ----
|
|
158
|
-
|
|
159
|
-
function testSpfParseRecordStructure() {
|
|
160
|
-
var rec = b.mail.spf.parseRecord("v=spf1 ~all");
|
|
161
|
-
check("spf.parseRecord: bare '~all' → softfail qualifier + all mechanism",
|
|
162
|
-
rec.length === 1 && rec[0].qualifier === "~" && rec[0].mechanism === "all");
|
|
163
|
-
var rec2 = b.mail.spf.parseRecord("v=spf1 a:mail.example.com/24 redirect=_spf.example.com");
|
|
164
|
-
check("spf.parseRecord: modifier separated from mechanisms (non-enumerable)",
|
|
165
|
-
rec2.length === 1 && rec2[0].mechanism === "a" &&
|
|
166
|
-
Array.isArray(rec2.modifiers) && rec2.modifiers[0].name === "redirect" &&
|
|
167
|
-
rec2.modifiers[0].value === "_spf.example.com");
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// ---- DMARC: parseRecord defaults + failure classification ----
|
|
171
|
-
|
|
172
|
-
function testDmarcParseDefaultsAndErrors() {
|
|
173
|
-
var p = b.mail.dmarc.parseRecord("v=DMARC1; p=quarantine");
|
|
174
|
-
check("dmarc.parseRecord: pct/adkim/aspf default to 100/r/r when omitted",
|
|
175
|
-
p.pct === 100 && p.adkim === "r" && p.aspf === "r");
|
|
176
|
-
var eVer = _threw(function () { b.mail.dmarc.parseRecord("v=DMARC2; p=none"); });
|
|
177
|
-
check("dmarc.parseRecord: wrong version → dmarc-bad-version",
|
|
178
|
-
eVer && /dmarc-bad-version/.test(eVer.code || ""));
|
|
179
|
-
var eNoP = _threw(function () { b.mail.dmarc.parseRecord("v=DMARC1; pct=100"); });
|
|
180
|
-
check("dmarc.parseRecord: missing required p= → dmarc-missing-policy (RFC 7489 §6.3)",
|
|
181
|
-
eNoP && /dmarc-missing-policy/.test(eNoP.code || ""));
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// ---- DMARC evaluate: from-address validation ----
|
|
185
|
-
|
|
186
|
-
async function testDmarcEvaluateFromValidation() {
|
|
187
|
-
var e1 = await _rejectedWith(b.mail.dmarc.evaluate({ from: 123 }));
|
|
188
|
-
check("dmarc.evaluate: non-string from → dmarc-bad-from",
|
|
189
|
-
e1 && /dmarc-bad-from/.test(e1.code || ""));
|
|
190
|
-
var e2 = await _rejectedWith(b.mail.dmarc.evaluate({ from: "nodomain" }));
|
|
191
|
-
check("dmarc.evaluate: from lacking @domain → dmarc-bad-from",
|
|
192
|
-
e2 && /dmarc-bad-from/.test(e2.code || ""));
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// ---- DMARC evaluate: policy-driven disposition branches ----
|
|
196
|
-
|
|
197
|
-
async function testDmarcEvaluatePolicyNoneDelivers() {
|
|
198
|
-
// p=none is monitor-only: an unaligned message still delivers.
|
|
199
|
-
var dns = _txtOnly({ "_dmarc.example.com": [["v=DMARC1; p=none"]] });
|
|
200
|
-
var rv = await b.mail.dmarc.evaluate({
|
|
201
|
-
from: "alice@example.com",
|
|
202
|
-
spf: { result: "fail", domain: "example.com" }, dkim: [], dnsLookup: dns,
|
|
203
|
-
});
|
|
204
|
-
check("dmarc.evaluate: p=none unaligned → result fail but recommendedAction deliver",
|
|
205
|
-
rv.result === "fail" && rv.recommendedAction === "deliver");
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
async function testDmarcEvaluateNoRecordIsNone() {
|
|
209
|
-
var dns = async function () { var e = new Error("ENOTFOUND"); e.code = "ENOTFOUND"; throw e; };
|
|
210
|
-
var rv = await b.mail.dmarc.evaluate({
|
|
211
|
-
from: "alice@norecord.example",
|
|
212
|
-
spf: { result: "fail", domain: "x" }, dkim: [], dnsLookup: dns,
|
|
213
|
-
});
|
|
214
|
-
check("dmarc.evaluate: no _dmarc record → result none",
|
|
215
|
-
rv.result === "none" && rv.policy === null);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
async function testDmarcEvaluatePermerrorOnBadRecord() {
|
|
219
|
-
// A syntactically bad record (invalid p=) is a PERMANENT error, not a
|
|
220
|
-
// silent pass — dmarc.evaluate catches the parse throw → permerror.
|
|
221
|
-
var dns = _txtOnly({ "_dmarc.example.com": [["v=DMARC1; p=maybe"]] });
|
|
222
|
-
var rv = await b.mail.dmarc.evaluate({
|
|
223
|
-
from: "alice@example.com",
|
|
224
|
-
spf: { result: "pass", domain: "example.com" }, dkim: [], dnsLookup: dns,
|
|
225
|
-
});
|
|
226
|
-
check("dmarc.evaluate: unparseable published policy → permerror (not a pass)",
|
|
227
|
-
rv.result === "permerror" && rv.alignment.spf === false);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// ---- DMARC evaluate: alignment input shapes + modes ----
|
|
231
|
-
|
|
232
|
-
async function testDmarcEvaluateDkimResultShapes() {
|
|
233
|
-
var dns = _txtOnly({ "_dmarc.example.com": [["v=DMARC1; p=reject; adkim=r; aspf=r"]] });
|
|
234
|
-
// dkim supplied as a single object (not an array).
|
|
235
|
-
var single = await b.mail.dmarc.evaluate({
|
|
236
|
-
from: "alice@example.com", spf: { result: "fail", domain: "x" },
|
|
237
|
-
dkim: { result: "pass", domain: "example.com" }, dnsLookup: dns,
|
|
238
|
-
});
|
|
239
|
-
check("dmarc.evaluate: dkim as a single object aligns → pass",
|
|
240
|
-
single.result === "pass" && single.alignment.dkim === true);
|
|
241
|
-
// dkim result carrying a `d` field instead of `domain`.
|
|
242
|
-
var dField = await b.mail.dmarc.evaluate({
|
|
243
|
-
from: "alice@example.com", spf: { result: "fail", domain: "x" },
|
|
244
|
-
dkim: [{ result: "pass", d: "example.com" }], dnsLookup: dns,
|
|
245
|
-
});
|
|
246
|
-
check("dmarc.evaluate: dkim result exposing d= (not domain) still aligns → pass",
|
|
247
|
-
dField.result === "pass" && dField.alignment.dkim === true);
|
|
248
|
-
// A non-pass SPF result must not count as aligned even with a matching domain.
|
|
249
|
-
var soft = await b.mail.dmarc.evaluate({
|
|
250
|
-
from: "alice@example.com", spf: { result: "softfail", domain: "example.com" },
|
|
251
|
-
dkim: [], dnsLookup: dns,
|
|
252
|
-
});
|
|
253
|
-
check("dmarc.evaluate: SPF softfail with matching domain is NOT aligned",
|
|
254
|
-
soft.alignment.spf === false && soft.result === "fail");
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
async function testDmarcEvaluateStrictVsRelaxedAlignment() {
|
|
258
|
-
// aspf=s (strict): a subdomain From vs a parent-domain SPF auth-domain
|
|
259
|
-
// does NOT align (exact host match required).
|
|
260
|
-
var strictDns = _txtOnly({ "_dmarc.sub.example.com": [["v=DMARC1; p=reject; aspf=s; adkim=s"]] });
|
|
261
|
-
var strict = await b.mail.dmarc.evaluate({
|
|
262
|
-
from: "alice@sub.example.com", spf: { result: "pass", domain: "example.com" },
|
|
263
|
-
dkim: [], dnsLookup: strictDns,
|
|
264
|
-
});
|
|
265
|
-
check("dmarc.evaluate: strict aspf=s — sub vs parent domain does NOT align → fail",
|
|
266
|
-
strict.alignment.spf === false && strict.result === "fail");
|
|
267
|
-
// aspf=r (relaxed): the same pair aligns via the shared org-domain.
|
|
268
|
-
var relaxDns = _txtOnly({ "_dmarc.sub.example.com": [["v=DMARC1; p=reject; aspf=r"]] });
|
|
269
|
-
var relaxed = await b.mail.dmarc.evaluate({
|
|
270
|
-
from: "alice@sub.example.com", spf: { result: "pass", domain: "example.com" },
|
|
271
|
-
dkim: [], dnsLookup: relaxDns,
|
|
272
|
-
});
|
|
273
|
-
check("dmarc.evaluate: relaxed aspf=r — sub vs parent domain aligns → pass",
|
|
274
|
-
relaxed.alignment.spf === true && relaxed.result === "pass");
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// ---- ARC verify: input validation + uncovered chain-rule / time-fault arms ----
|
|
278
|
-
|
|
279
|
-
async function testArcVerifyInputValidation() {
|
|
280
|
-
var e1 = await _rejectedWith(b.mail.arc.verify(12345));
|
|
281
|
-
check("arc.verify: non-string input → arc-bad-input",
|
|
282
|
-
e1 && /arc-bad-input/.test(e1.code || ""));
|
|
283
|
-
var e2 = await _rejectedWith(b.mail.arc.verify(""));
|
|
284
|
-
check("arc.verify: empty-string input → arc-bad-input",
|
|
285
|
-
e2 && /arc-bad-input/.test(e2.code || ""));
|
|
286
|
-
var e3 = await _rejectedWith(b.mail.arc.evaluate(12345, { trustedSealers: [] }));
|
|
287
|
-
check("arc.evaluate: non-string input → arc-bad-input",
|
|
288
|
-
e3 && /arc-bad-input/.test(e3.code || ""));
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
async function testArcVerifyMissingCvArm() {
|
|
292
|
-
// A structurally-complete i=1 hop whose ARC-Seal omits cv= trips the
|
|
293
|
-
// missing-cv chain-rule arm (which takes precedence over the signature-
|
|
294
|
-
// verification failure the dummy b= would otherwise report).
|
|
295
|
-
var msg = "ARC-Seal: i=1; a=rsa-sha256; d=example.com; s=arc; b=AAAA\r\n" +
|
|
296
|
-
"ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=arc; bh=AAAA; h=from; b=AAAA\r\n" +
|
|
297
|
-
"ARC-Authentication-Results: i=1; example.com; spf=pass\r\n" +
|
|
298
|
-
"From: alice@example.com\r\n\r\nbody\r\n";
|
|
299
|
-
var rv = await b.mail.arc.verify(msg);
|
|
300
|
-
check("arc.verify: ARC-Seal with no cv= → fail w/ missing-cv reason",
|
|
301
|
-
rv.chainStatus === "fail" && /missing-cv-at-i=1/.test(rv.reason || ""));
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
async function testArcVerifyTimeFaultArms() {
|
|
305
|
-
// RFC 8617 §5.2 — a future t= and an unparseable x= are each time faults
|
|
306
|
-
// that fail the AMS closed, independent of the (dummy) signature check.
|
|
307
|
-
var keyDns = function () {
|
|
308
|
-
return async function (qname) {
|
|
309
|
-
if (qname === "arc._domainkey.example.com") {
|
|
310
|
-
var nc = require("crypto");
|
|
311
|
-
var pair = nc.generateKeyPairSync("rsa", { modulusLength: 2048 });
|
|
312
|
-
return [["v=DKIM1; k=rsa; p=" +
|
|
313
|
-
pair.publicKey.export({ type: "spki", format: "der" }).toString("base64")]];
|
|
314
|
-
}
|
|
315
|
-
var e = new Error("ENOTFOUND"); e.code = "ENOTFOUND"; throw e;
|
|
316
|
-
};
|
|
317
|
-
};
|
|
318
|
-
var now = Math.floor(Date.now() / 1000);
|
|
319
|
-
var futureMsg =
|
|
320
|
-
"ARC-Seal: i=1; a=rsa-sha256; cv=none; d=example.com; s=arc; b=AAAA\r\n" +
|
|
321
|
-
"ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=arc; t=" +
|
|
322
|
-
(now + 999999) + "; bh=AAAA; h=from; b=AAAA\r\n" +
|
|
323
|
-
"ARC-Authentication-Results: i=1; example.com; spf=pass\r\n" +
|
|
324
|
-
"From: alice@example.com\r\nTo: bob@example.com\r\n\r\nbody\r\n";
|
|
325
|
-
var rvF = await b.mail.arc.verify(futureMsg, { dnsLookup: keyDns() });
|
|
326
|
-
var fErrs = ((rvF.hops[0] && rvF.hops[0].amsErrors) || []).join(" ; ");
|
|
327
|
-
check("arc.verify: future t= → ams-t-future time fault (AMS fails closed)",
|
|
328
|
-
rvF.chainStatus === "fail" && /ams-t-future/.test(fErrs));
|
|
329
|
-
|
|
330
|
-
var unparseMsg =
|
|
331
|
-
"ARC-Seal: i=1; a=rsa-sha256; cv=none; d=example.com; s=arc; b=AAAA\r\n" +
|
|
332
|
-
"ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=arc; x=notanumber; bh=AAAA; h=from; b=AAAA\r\n" +
|
|
333
|
-
"ARC-Authentication-Results: i=1; example.com; spf=pass\r\n" +
|
|
334
|
-
"From: alice@example.com\r\nTo: bob@example.com\r\n\r\nbody\r\n";
|
|
335
|
-
var rvU = await b.mail.arc.verify(unparseMsg, { dnsLookup: keyDns() });
|
|
336
|
-
var uErrs = ((rvU.hops[0] && rvU.hops[0].amsErrors) || []).join(" ; ");
|
|
337
|
-
check("arc.verify: unparseable x= → ams-x-unparseable time fault (fails closed)",
|
|
338
|
-
rvU.chainStatus === "fail" && /ams-x-unparseable/.test(uErrs));
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// ---- authResults.emit (RFC 8601 §2) — the whole builder is otherwise
|
|
342
|
-
// exercised only indirectly through inbound.verify ----
|
|
343
|
-
|
|
344
|
-
function testAuthResultsEmitValidation() {
|
|
345
|
-
var E = b.mail.authResults.emit;
|
|
346
|
-
var eObj = _threw(function () { E(null); });
|
|
347
|
-
check("authResults.emit: non-object opts → ar-bad-input",
|
|
348
|
-
eObj && /ar-bad-input/.test(eObj.code || ""));
|
|
349
|
-
var eOpt = _threw(function () { E({ authservId: "mx.a", results: [], bogus: 1 }); });
|
|
350
|
-
check("authResults.emit: unknown opt refused (config-time)", eOpt !== null);
|
|
351
|
-
var eEmpty = _threw(function () { E({ authservId: "", results: [] }); });
|
|
352
|
-
check("authResults.emit: empty authservId → ar-bad-authserv-id",
|
|
353
|
-
eEmpty && /ar-bad-authserv-id/.test(eEmpty.code || ""));
|
|
354
|
-
var eCrlf = _threw(function () { E({ authservId: "mx.a\r\nInjected: 1", results: [] }); });
|
|
355
|
-
check("authResults.emit: CR/LF in authservId → ar-bad-authserv-id (no header injection)",
|
|
356
|
-
eCrlf && /ar-bad-authserv-id/.test(eCrlf.code || ""));
|
|
357
|
-
var eNul = _threw(function () { E({ authservId: "mx.a" + String.fromCharCode(0) + "x", results: [] }); });
|
|
358
|
-
check("authResults.emit: NUL in authservId → ar-bad-authserv-id",
|
|
359
|
-
eNul && /ar-bad-authserv-id/.test(eNul.code || ""));
|
|
360
|
-
var eArr = _threw(function () { E({ authservId: "mx.a", results: "nope" }); });
|
|
361
|
-
check("authResults.emit: non-array results → ar-bad-results",
|
|
362
|
-
eArr && /ar-bad-results/.test(eArr.code || ""));
|
|
363
|
-
var eEntry = _threw(function () { E({ authservId: "mx.a", results: [42] }); });
|
|
364
|
-
check("authResults.emit: non-object result entry → ar-bad-result-entry",
|
|
365
|
-
eEntry && /ar-bad-result-entry/.test(eEntry.code || ""));
|
|
366
|
-
var eMethod = _threw(function () { E({ authservId: "mx.a", results: [{ method: "bogus", result: "pass" }] }); });
|
|
367
|
-
check("authResults.emit: unknown method → ar-bad-method",
|
|
368
|
-
eMethod && /ar-bad-method/.test(eMethod.code || ""));
|
|
369
|
-
// RFC 8601 §2.7 — result vocabulary is method-specific: 'hardfail' is
|
|
370
|
-
// not in SPF's set, so it is refused rather than passed through.
|
|
371
|
-
var eResult = _threw(function () { E({ authservId: "mx.a", results: [{ method: "spf", result: "hardfail" }] }); });
|
|
372
|
-
check("authResults.emit: result outside a method's §2.7 vocabulary → ar-bad-result",
|
|
373
|
-
eResult && /ar-bad-result/.test(eResult.code || ""));
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
function testAuthResultsEmitFormatting() {
|
|
377
|
-
var E = b.mail.authResults.emit;
|
|
378
|
-
// Zero methods evaluated → the RFC 8601 §2.2 `none` form.
|
|
379
|
-
check("authResults.emit: empty results → '; none'",
|
|
380
|
-
E({ authservId: "mx.a", results: [] }) === "Authentication-Results: mx.a; none");
|
|
381
|
-
// ptype.property=value triples for the recognized shorthand keys.
|
|
382
|
-
var props = E({ authservId: "mx.a", results: [
|
|
383
|
-
{ method: "spf", result: "pass", smtpMailfrom: "u@s.example" },
|
|
384
|
-
{ method: "dmarc", result: "pass", from: "u@s.example" },
|
|
385
|
-
] });
|
|
386
|
-
check("authResults.emit: property keys mapped to RFC 8601 §2.3 ptype.property",
|
|
387
|
-
/spf=pass smtp\.mailfrom=u@s\.example/.test(props) &&
|
|
388
|
-
/dmarc=pass header\.from=u@s\.example/.test(props));
|
|
389
|
-
// A reason string with an embedded DQUOTE is backslash-escaped (§2.2).
|
|
390
|
-
var reason = E({ authservId: "mx.a", results: [{ method: "dkim", result: "fail", reason: 'key "rotated"' }] });
|
|
391
|
-
check("authResults.emit: reason DQUOTE escaped as \\\" (RFC 8601 §2.2)",
|
|
392
|
-
reason.indexOf('reason="key \\"rotated\\""') !== -1);
|
|
393
|
-
// A pvalue carrying a forbidden character (space) is dropped, not emitted.
|
|
394
|
-
var pv = E({ authservId: "mx.a", results: [{ method: "dkim", result: "pass", domain: "has space" }] });
|
|
395
|
-
check("authResults.emit: structurally-invalid pvalue is omitted (not injected)",
|
|
396
|
-
pv.indexOf("header.d=") === -1 && /dkim=pass/.test(pv));
|
|
397
|
-
// fold:false switches the clause separator from the folded form to '; '.
|
|
398
|
-
var flat = E({ authservId: "mx.a", fold: false,
|
|
399
|
-
results: [{ method: "spf", result: "pass" }, { method: "dkim", result: "pass" }] });
|
|
400
|
-
check("authResults.emit: fold:false joins clauses with '; ' (no folded inter-clause break)",
|
|
401
|
-
/spf=pass; dkim=pass/.test(flat) && flat.indexOf(";\r\n dkim") === -1);
|
|
402
|
-
// A non-'1' version is appended after the authserv-id token (§2.2).
|
|
403
|
-
var ver = E({ authservId: "mx.a", version: "2", results: [{ method: "spf", result: "pass" }] });
|
|
404
|
-
check("authResults.emit: version appended to authserv-id when not '1'",
|
|
405
|
-
ver.indexOf("Authentication-Results: mx.a 2;") === 0);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
async function run() {
|
|
409
|
-
await testSpfVerifyInputValidation();
|
|
410
|
-
await testSpfAllQualifierVerdicts();
|
|
411
|
-
await testSpfNeutralWhenNoMechanismMatches();
|
|
412
|
-
await testSpfIp6Mechanism();
|
|
413
|
-
await testSpfHeloFallbackIdentity();
|
|
414
|
-
await testSpfIncludeSemantics();
|
|
415
|
-
await testSpfRedirectNoRecordPermerror();
|
|
416
|
-
await testSpfMacroLettersAndTransformers();
|
|
417
|
-
testSpfParseRecordStructure();
|
|
418
|
-
testDmarcParseDefaultsAndErrors();
|
|
419
|
-
await testDmarcEvaluateFromValidation();
|
|
420
|
-
await testDmarcEvaluatePolicyNoneDelivers();
|
|
421
|
-
await testDmarcEvaluateNoRecordIsNone();
|
|
422
|
-
await testDmarcEvaluatePermerrorOnBadRecord();
|
|
423
|
-
await testDmarcEvaluateDkimResultShapes();
|
|
424
|
-
await testDmarcEvaluateStrictVsRelaxedAlignment();
|
|
425
|
-
await testArcVerifyInputValidation();
|
|
426
|
-
await testArcVerifyMissingCvArm();
|
|
427
|
-
await testArcVerifyTimeFaultArms();
|
|
428
|
-
testAuthResultsEmitValidation();
|
|
429
|
-
testAuthResultsEmitFormatting();
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
module.exports = { run: run };
|
|
433
|
-
|
|
434
|
-
if (require.main === module) {
|
|
435
|
-
run().then(function () { console.log("OK"); })
|
|
436
|
-
.catch(function (e) { console.error(e.stack || e); process.exit(1); });
|
|
437
|
-
}
|