@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
|
@@ -236,7 +236,7 @@ function create(opts) {
|
|
|
236
236
|
return _failTo(auditImpl, e, ms);
|
|
237
237
|
});
|
|
238
238
|
}
|
|
239
|
-
return _scanClamavInstream(messageBytes).then(function (rv) {
|
|
239
|
+
return _scanClamavInstream(messageBytes, scanOpts).then(function (rv) {
|
|
240
240
|
rv.durationMs = Date.now() - t0;
|
|
241
241
|
_emitScanResult(auditImpl, rv);
|
|
242
242
|
return rv;
|
|
@@ -339,9 +339,11 @@ function create(opts) {
|
|
|
339
339
|
});
|
|
340
340
|
}
|
|
341
341
|
|
|
342
|
-
function _scanClamavInstream(messageBytes) {
|
|
342
|
+
function _scanClamavInstream(messageBytes, scanOpts) {
|
|
343
343
|
return new Promise(function (resolve, reject) {
|
|
344
|
-
var sock =
|
|
344
|
+
var sock = (scanOpts && scanOpts._socket && typeof scanOpts._socket.write === "function")
|
|
345
|
+
? scanOpts._socket
|
|
346
|
+
: net.createConnection({ host: opts.host, port: opts.port });
|
|
345
347
|
var collector = safeBuffer.boundedChunkCollector({
|
|
346
348
|
maxBytes: caps.maxResponseBytes,
|
|
347
349
|
errorClass: MailScanError,
|
|
@@ -383,21 +385,26 @@ function create(opts) {
|
|
|
383
385
|
var reply = collector.result().toString("utf8").replace(/[\r\n\0]+$/g, ""); // allow:regex-no-length-cap — trailing-trim anchored
|
|
384
386
|
// ClamAV INSTREAM reply: "<id>: <verdict>" where verdict is
|
|
385
387
|
// "stream: OK", "stream: <Sig.Name> FOUND", or "INSTREAM size
|
|
386
|
-
// limit exceeded. ERROR".
|
|
387
|
-
|
|
388
|
+
// limit exceeded. ERROR". This is a security verdict classifier,
|
|
389
|
+
// so it is fail-closed: the malign FOUND signal is tested BEFORE
|
|
390
|
+
// the benign OK signal. A reply that carries both a FOUND token
|
|
391
|
+
// and an OK token (a coalesced / stale-then-fresh reply on a
|
|
392
|
+
// reused connection, or an intermediary that concatenates two
|
|
393
|
+
// responses) must resolve to "infected", never downgrade to
|
|
394
|
+
// "clean". An unrecognized shape is "error" (do-not-deliver), so
|
|
395
|
+
// the only path to "clean" is an OK with no FOUND / no ERROR.
|
|
396
|
+
var m = reply.match(/stream:\s+(.+?)\s+FOUND\b/); // allow:regex-no-length-cap — anchored to fixed FOUND token
|
|
397
|
+
if (m) {
|
|
398
|
+
resolve({ verdict: "infected", threats: [m[1]] });
|
|
399
|
+
} else if (/ERROR/i.test(reply)) { // allow:regex-no-length-cap — anchored to fixed ERROR token
|
|
400
|
+
resolve({ verdict: "error", threats: [] });
|
|
401
|
+
} else if (/stream:\s+OK\b/.test(reply)) { // allow:regex-no-length-cap — anchored to fixed token
|
|
388
402
|
resolve({ verdict: "clean", threats: [] });
|
|
389
403
|
} else {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
resolve({ verdict: "error", threats: [] });
|
|
395
|
-
} else {
|
|
396
|
-
// Unrecognized reply shape — treat as error so the caller
|
|
397
|
-
// gets a definite "do not deliver" signal instead of a
|
|
398
|
-
// silent clean verdict.
|
|
399
|
-
resolve({ verdict: "error", threats: [] });
|
|
400
|
-
}
|
|
404
|
+
// Unrecognized reply shape — treat as error so the caller
|
|
405
|
+
// gets a definite "do not deliver" signal instead of a
|
|
406
|
+
// silent clean verdict.
|
|
407
|
+
resolve({ verdict: "error", threats: [] });
|
|
401
408
|
}
|
|
402
409
|
});
|
|
403
410
|
|
|
@@ -244,22 +244,32 @@ async function _applyMtaStsPolicy(domain, mxs, policyMode, auditEmit) {
|
|
|
244
244
|
{ domain: domain, mode: policyMode });
|
|
245
245
|
return mxs;
|
|
246
246
|
}
|
|
247
|
-
if (sts.mode === "testing"
|
|
248
|
-
//
|
|
249
|
-
//
|
|
250
|
-
//
|
|
247
|
+
if (sts.mode === "testing") {
|
|
248
|
+
// RFC 8461 §5.2 — a policy published in "testing" mode records
|
|
249
|
+
// validation failures via TLS-RPT but MUST NOT block delivery. The
|
|
250
|
+
// domain has explicitly opted out of enforcement, so the local
|
|
251
|
+
// posture (even the default mtaSts:"enforce") cannot promote a
|
|
252
|
+
// testing policy to a hard bounce. Deliver against the full MX set
|
|
253
|
+
// and surface the match result as a report-only signal.
|
|
254
|
+
var testingMatched = mxs.filter(function (m) {
|
|
255
|
+
return smtpPolicy().mtaSts.matchMx(m.exchange, sts.mx || []);
|
|
256
|
+
});
|
|
251
257
|
auditEmit("mail.send.deliver.mtaSts.testing", "info",
|
|
252
|
-
{ domain: domain, mxPatterns: sts.mx
|
|
258
|
+
{ domain: domain, mxPatterns: sts.mx,
|
|
259
|
+
matched: testingMatched.length, total: mxs.length });
|
|
260
|
+
return mxs;
|
|
253
261
|
}
|
|
254
262
|
var filtered = mxs.filter(function (m) {
|
|
255
263
|
return smtpPolicy().mtaSts.matchMx(m.exchange, sts.mx || []);
|
|
256
264
|
});
|
|
257
|
-
if (filtered.length === 0 &&
|
|
265
|
+
if (filtered.length === 0 && sts.mode === "enforce") {
|
|
258
266
|
throw new DeliverError("deliver/mta-sts-mx-mismatch",
|
|
259
267
|
"no MX for " + domain + " matches the published MTA-STS policy (mode=" + sts.mode + ")");
|
|
260
268
|
}
|
|
261
269
|
if (filtered.length === 0) {
|
|
262
|
-
//
|
|
270
|
+
// Any remaining published mode that is neither enforce nor testing
|
|
271
|
+
// with no match — log and continue with the original list rather
|
|
272
|
+
// than block delivery.
|
|
263
273
|
auditEmit("mail.send.deliver.mtaSts.no-match", "warn",
|
|
264
274
|
{ domain: domain, mode: sts.mode });
|
|
265
275
|
return mxs;
|
|
@@ -352,7 +362,23 @@ async function _deliverOne(envelope, recipient, ctx) {
|
|
|
352
362
|
// composes directly into smtpTransport.dane); this branch carries
|
|
353
363
|
// the discovery so the audit chain records the policy posture
|
|
354
364
|
// applied to each delivery attempt.
|
|
355
|
-
|
|
365
|
+
try {
|
|
366
|
+
await _fetchDaneTlsa(mx.exchange, ctx.port, ctx.policy.dane, ctx.auditEmit);
|
|
367
|
+
} catch (daneErr) {
|
|
368
|
+
// DANE "enforce": a TLSA lookup failure means this MX host cannot
|
|
369
|
+
// be used for authenticated delivery (RFC 7672 §2.2). Fail this
|
|
370
|
+
// single MX over to the next candidate; if every MX for this
|
|
371
|
+
// recipient fails DANE the recipient is deferred (and eventually
|
|
372
|
+
// bounced once the operator's retry budget is spent). A per-
|
|
373
|
+
// recipient DANE failure must never throw out of the whole
|
|
374
|
+
// deliver() batch and discard the sibling recipients' outcomes —
|
|
375
|
+
// it is contained here exactly like the MTA-STS enforce path.
|
|
376
|
+
lastErr = daneErr;
|
|
377
|
+
ctx.auditEmit("mail.send.deliver.dane-failover", "warn", {
|
|
378
|
+
recipient: recipient, mxHost: mx.exchange, reason: daneErr.message,
|
|
379
|
+
});
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
356
382
|
try {
|
|
357
383
|
var rv = await _tryHost({
|
|
358
384
|
from: envelope.from,
|
|
@@ -789,7 +789,7 @@ function create(opts) {
|
|
|
789
789
|
.then(function (rows) {
|
|
790
790
|
if (Array.isArray(rows) && rows.length > 0) {
|
|
791
791
|
var pairs = rows.map(function (r) {
|
|
792
|
-
var v = r.value === null || r.value === undefined ? "NIL" :
|
|
792
|
+
var v = r.value === null || r.value === undefined ? "NIL" : safeBuffer.quoteString(r.value);
|
|
793
793
|
return r.entry + " " + v;
|
|
794
794
|
}).join(" ");
|
|
795
795
|
_writeUntagged(socket, "METADATA " + (mailbox === "" ? '""' : mailbox) + " (" + pairs + ")");
|
|
@@ -1247,7 +1247,7 @@ function create(opts) {
|
|
|
1247
1247
|
for (var i = 0; i < folders.length; i += 1) {
|
|
1248
1248
|
var f = folders[i];
|
|
1249
1249
|
var attrs = (f.attributes || []).map(function (a) { return "\\" + a; }).join(" ");
|
|
1250
|
-
_writeUntagged(socket, "LIST (" + attrs + ") \"/\" " +
|
|
1250
|
+
_writeUntagged(socket, "LIST (" + attrs + ") \"/\" " + safeBuffer.quoteString(f.name));
|
|
1251
1251
|
}
|
|
1252
1252
|
_writeTagged(socket, tag, "OK LIST completed");
|
|
1253
1253
|
})
|
|
@@ -1282,7 +1282,7 @@ function create(opts) {
|
|
|
1282
1282
|
var key = items[k].toUpperCase();
|
|
1283
1283
|
if (info[key] !== undefined) parts.push(key + " " + info[key]);
|
|
1284
1284
|
}
|
|
1285
|
-
_writeUntagged(socket, "STATUS " +
|
|
1285
|
+
_writeUntagged(socket, "STATUS " + safeBuffer.quoteString(name) + " (" + parts.join(" ") + ")");
|
|
1286
1286
|
_writeTagged(socket, tag, "OK STATUS completed");
|
|
1287
1287
|
})
|
|
1288
1288
|
.catch(function (err) {
|
|
@@ -1780,7 +1780,6 @@ function create(opts) {
|
|
|
1780
1780
|
try { socket.destroy(); } catch (_e2) { /* idempotent */ }
|
|
1781
1781
|
connections.delete(socket);
|
|
1782
1782
|
}
|
|
1783
|
-
function _quote(s) { return '"' + String(s).replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + '"'; }
|
|
1784
1783
|
function _unquote(s) {
|
|
1785
1784
|
if (typeof s !== "string") return "";
|
|
1786
1785
|
if (s[0] === "\"" && s[s.length - 1] === "\"") return s.slice(1, -1);
|
|
@@ -730,7 +730,7 @@ function create(opts) {
|
|
|
730
730
|
var s = list[i];
|
|
731
731
|
var nm = String(s.name || "");
|
|
732
732
|
var active = s.active === true ? " ACTIVE" : "";
|
|
733
|
-
socket.write(
|
|
733
|
+
socket.write(safeBuffer.quoteString(nm) + active + "\r\n");
|
|
734
734
|
}
|
|
735
735
|
_emit("mail.server.managesieve.listscripts",
|
|
736
736
|
{ connectionId: state.id, count: list.length });
|
|
@@ -813,24 +813,20 @@ function create(opts) {
|
|
|
813
813
|
});
|
|
814
814
|
}
|
|
815
815
|
|
|
816
|
-
// RFC 5804 §1.2 quoted
|
|
817
|
-
//
|
|
818
|
-
function _quoteEscape(s) {
|
|
819
|
-
return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); // allow:regex-no-length-cap — backslash + DQUOTE escape on bounded-input
|
|
820
|
-
}
|
|
821
|
-
|
|
816
|
+
// RFC 5804 §1.2 quoted strings — serialization routes through
|
|
817
|
+
// safeBuffer.quoteString (one quoted-string escaper framework-wide).
|
|
822
818
|
function _writeOk(socket, msg) {
|
|
823
|
-
try { socket.write(
|
|
819
|
+
try { socket.write("OK " + safeBuffer.quoteString(msg) + "\r\n"); } catch (_e) { /* socket down */ }
|
|
824
820
|
}
|
|
825
821
|
function _writeOkWithTag(socket, tag, msg) {
|
|
826
|
-
try { socket.write(
|
|
822
|
+
try { socket.write("OK (TAG " + safeBuffer.quoteString(tag) + ") " + safeBuffer.quoteString(msg) + "\r\n"); }
|
|
827
823
|
catch (_e) { /* socket down */ }
|
|
828
824
|
}
|
|
829
825
|
function _writeNo(socket, msg) {
|
|
830
|
-
try { socket.write(
|
|
826
|
+
try { socket.write("NO " + safeBuffer.quoteString(msg) + "\r\n"); } catch (_e) { /* socket down */ }
|
|
831
827
|
}
|
|
832
828
|
function _writeBye(socket, msg) {
|
|
833
|
-
try { socket.write(
|
|
829
|
+
try { socket.write("BYE " + safeBuffer.quoteString(msg) + "\r\n"); } catch (_e) { /* socket down */ }
|
|
834
830
|
}
|
|
835
831
|
function _close(socket) {
|
|
836
832
|
try { socket.end(); } catch (_e) { /* idempotent */ }
|
|
@@ -150,6 +150,8 @@ var safeSmtp = require("./safe-smtp");
|
|
|
150
150
|
var validateOpts = require("./validate-opts");
|
|
151
151
|
var guardSmtpCommand = require("./guard-smtp-command");
|
|
152
152
|
var guardDomain = require("./guard-domain");
|
|
153
|
+
var guardCidr = require("./guard-cidr");
|
|
154
|
+
var ssrfGuard = require("./ssrf-guard");
|
|
153
155
|
var mailServerRateLimit = require("./mail-server-rate-limit");
|
|
154
156
|
var mailServerTls = require("./mail-server-tls");
|
|
155
157
|
var mailServerNet = require("./mail-server-net");
|
|
@@ -196,6 +198,42 @@ var RE_MAIL_FROM = /^MAIL\s+FROM:\s*<([^>]*)>(?:\s+(.*))?$/i;
|
|
|
196
198
|
var RE_RCPT_TO = /^RCPT\s+TO:\s*<([^>]+)>(?:\s+.*)?$/i;
|
|
197
199
|
var RE_SIZE = /SIZE=(\d+)/i;
|
|
198
200
|
|
|
201
|
+
// A relayAllowedFor entry's `cidr` must be an `<ip>/<prefix>` range so the
|
|
202
|
+
// relay-authorization decision can match the connecting peer against it via
|
|
203
|
+
// b.ssrfGuard.cidrContains (the same range arithmetic the HTTP
|
|
204
|
+
// b.middleware.networkAllowlist fence uses). Shape-validated by composing
|
|
205
|
+
// b.guardCidr.validate rather than a hand-rolled parse: a mask is REQUIRED
|
|
206
|
+
// (a bare IP never matches in cidrContains, so it is refused at boot rather
|
|
207
|
+
// than silently disabling the entry), reserved / private ranges are ALLOWED
|
|
208
|
+
// (a relay allowlist legitimately names 10.0.0.0/8 and friends), and a
|
|
209
|
+
// non-canonical-but-functional network address (host bits set) is audited,
|
|
210
|
+
// not rejected — cidrContains masks it off at match time.
|
|
211
|
+
var _RELAY_CIDR_OPTS = Object.freeze({
|
|
212
|
+
requireMaskPolicy: "reject-bare-ip",
|
|
213
|
+
reservedRangesPolicy: "allow",
|
|
214
|
+
ipv4MappedIpv6Policy: "allow",
|
|
215
|
+
networkAlignmentPolicy: "audit",
|
|
216
|
+
family: "either",
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// _normalizeRelayCidr — fold a DOTTED IPv4-mapped IPv6 relay CIDR
|
|
220
|
+
// (::ffff:a.b.c.d/N, N in 96..128) to its plain IPv4 CIDR (a.b.c.d/(N-96)).
|
|
221
|
+
// guardCidr.validate parses hex-group IPv6 but not the dotted-mapped spelling,
|
|
222
|
+
// so an operator naming a mapped range that way would be refused at boot even
|
|
223
|
+
// though cidrContains accepts it. Folding to plain IPv4 both validates AND
|
|
224
|
+
// makes the entry match every peer form: a genuine IPv4 peer directly, and an
|
|
225
|
+
// IPv4-mapped peer via the _isRelayAllowed fold. Storing the mapped CIDR as-is
|
|
226
|
+
// would instead match a mapped peer but NOT a genuine IPv4 peer (the inverse
|
|
227
|
+
// asymmetry). Every other spelling (plain IPv4, hex-group IPv6) is unchanged.
|
|
228
|
+
function _normalizeRelayCidr(cidr) {
|
|
229
|
+
if (typeof cidr !== "string") return cidr;
|
|
230
|
+
var m = /^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/(\d{1,3})$/i.exec(cidr);
|
|
231
|
+
if (!m) return cidr;
|
|
232
|
+
var prefix = parseInt(m[2], 10);
|
|
233
|
+
if (prefix < 96 || prefix > 128) return cidr; // outside the ::ffff:0:0/96 block — a genuine IPv6 range
|
|
234
|
+
return m[1] + "/" + (prefix - 96);
|
|
235
|
+
}
|
|
236
|
+
|
|
199
237
|
// Map the b.mail.inbound.verify verdict to the DATA-phase gate action.
|
|
200
238
|
// The sender's published DMARC policy drives it (RFC 7489 §6.3 p= /
|
|
201
239
|
// §6.6.2 disposition): reject → refuse at the wire; quarantine →
|
|
@@ -319,6 +357,25 @@ function create(opts) {
|
|
|
319
357
|
throw new MailServerMxError("mail-server-mx/bad-opts",
|
|
320
358
|
"mail.server.mx.create: relayAllowedFor must be an array if provided");
|
|
321
359
|
}
|
|
360
|
+
// Every relay-allowlist entry MUST carry a valid `<ip>/<prefix>` CIDR:
|
|
361
|
+
// relay is granted only to a peer whose address falls inside an allowlisted
|
|
362
|
+
// range. Refuse a malformed / mask-less entry at boot so an operator typo
|
|
363
|
+
// can't silently leave the relay decision mis-scoped (open relay is the
|
|
364
|
+
// failure this closes — pre-fix any non-empty relayAllowedFor admitted
|
|
365
|
+
// every peer regardless of source address).
|
|
366
|
+
if (Array.isArray(opts.relayAllowedFor)) {
|
|
367
|
+
for (var __ri = 0; __ri < opts.relayAllowedFor.length; __ri += 1) {
|
|
368
|
+
var __re = opts.relayAllowedFor[__ri];
|
|
369
|
+
var __reOk = __re && typeof __re === "object" && !Array.isArray(__re) &&
|
|
370
|
+
guardCidr.validate(_normalizeRelayCidr(__re.cidr), _RELAY_CIDR_OPTS).ok;
|
|
371
|
+
if (!__reOk) {
|
|
372
|
+
throw new MailServerMxError("mail-server-mx/bad-relay-cidr",
|
|
373
|
+
"mail.server.mx.create: relayAllowedFor[" + __ri + "] must be an object with a " +
|
|
374
|
+
"valid CIDR string (e.g. { cidr: \"10.0.0.0/8\", scope: \"internal\" }); relay is " +
|
|
375
|
+
"granted only to peers whose source address falls inside an allowlisted range");
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
322
379
|
|
|
323
380
|
var greeting = opts.greeting || DEFAULT_GREETING;
|
|
324
381
|
var maxLineBytes = opts.maxLineBytes || DEFAULT_MAX_LINE_BYTES;
|
|
@@ -326,7 +383,11 @@ function create(opts) {
|
|
|
326
383
|
var maxRcptsPerMsg = opts.maxRcptsPerMessage || DEFAULT_MAX_RCPTS_PER_MESSAGE;
|
|
327
384
|
var idleTimeoutMs = opts.idleTimeoutMs || DEFAULT_IDLE_TIMEOUT_MS;
|
|
328
385
|
var localDomains = (opts.localDomains || []).map(function (d) { return String(d).toLowerCase(); });
|
|
329
|
-
var relayAllowedFor = opts.relayAllowedFor || []
|
|
386
|
+
var relayAllowedFor = (opts.relayAllowedFor || []).map(function (__e) {
|
|
387
|
+
return (__e && typeof __e === "object" && !Array.isArray(__e))
|
|
388
|
+
? Object.assign({}, __e, { cidr: _normalizeRelayCidr(__e.cidr) })
|
|
389
|
+
: __e;
|
|
390
|
+
});
|
|
330
391
|
var profile = opts.profile || "strict";
|
|
331
392
|
// SMTPUTF8 (RFC 6531) — single switch threaded end-to-end. The MX
|
|
332
393
|
// listener doesn't advertise SMTPUTF8 to the peer regardless, so
|
|
@@ -658,7 +719,7 @@ function create(opts) {
|
|
|
658
719
|
} catch (err) {
|
|
659
720
|
if (err.code === "guard-smtp-command/bare-lf" ||
|
|
660
721
|
err.code === "guard-smtp-command/bare-cr" ||
|
|
661
|
-
err.code === "guard-smtp-command/nul
|
|
722
|
+
err.code === "guard-smtp-command/nul") {
|
|
662
723
|
_emit("mail.server.mx.smtp_smuggling_detected",
|
|
663
724
|
{ connectionId: state.id, code: err.code, line: line.slice(0, 200) }, // audit-log line truncation
|
|
664
725
|
"denied");
|
|
@@ -1195,12 +1256,37 @@ function create(opts) {
|
|
|
1195
1256
|
return profile === "strict" || profile === "balanced";
|
|
1196
1257
|
}
|
|
1197
1258
|
|
|
1198
|
-
function _isRelayAllowed(
|
|
1199
|
-
//
|
|
1200
|
-
//
|
|
1201
|
-
//
|
|
1259
|
+
function _isRelayAllowed(remoteAddress, _rcptTo) {
|
|
1260
|
+
// Relay is admitted ONLY when the connecting peer's source address
|
|
1261
|
+
// falls inside one of the operator's allowlisted CIDR ranges — the
|
|
1262
|
+
// same range arithmetic (b.ssrfGuard.cidrContains) the HTTP
|
|
1263
|
+
// b.middleware.networkAllowlist fence uses. Every entry's `cidr` was
|
|
1264
|
+
// shape-validated at create() time; a peer outside every range (or a
|
|
1265
|
+
// non-string / empty peer address) is refused, so a misconfigured
|
|
1266
|
+
// relayAllowedFor fails closed instead of turning the listener into an
|
|
1267
|
+
// open relay. `scope` is an operator-facing annotation on the entry;
|
|
1268
|
+
// the network boundary is the authorization control.
|
|
1202
1269
|
if (relayAllowedFor.length === 0) return false;
|
|
1203
|
-
return
|
|
1270
|
+
if (typeof remoteAddress !== "string" || remoteAddress.length === 0) return false;
|
|
1271
|
+
// Node reports an IPv4 client as an IPv4-mapped IPv6 address
|
|
1272
|
+
// (::ffff:a.b.c.d) when the listener binds the IPv6 wildcard `::` (the
|
|
1273
|
+
// common dual-stack deployment). cidrContains refuses a mixed-family
|
|
1274
|
+
// compare, so a documented IPv4 relay CIDR (10.0.0.0/8) would deny every
|
|
1275
|
+
// intended IPv4 client on that listener. Fold the mapped form to its
|
|
1276
|
+
// IPv4 dotted address (ssrfGuard.canonicalizeHost, which folds only the
|
|
1277
|
+
// ::ffff:0:0/96 block) and match EITHER the peer as reported OR the
|
|
1278
|
+
// folded form — so an IPv4 CIDR matches a mapped peer and an IPv6 CIDR
|
|
1279
|
+
// still matches a genuine IPv6 peer.
|
|
1280
|
+
var canonPeer;
|
|
1281
|
+
try { canonPeer = ssrfGuard.canonicalizeHost(remoteAddress); }
|
|
1282
|
+
catch (_e) { canonPeer = remoteAddress; }
|
|
1283
|
+
for (var i = 0; i < relayAllowedFor.length; i += 1) {
|
|
1284
|
+
var entry = relayAllowedFor[i];
|
|
1285
|
+
if (!entry || typeof entry !== "object") continue;
|
|
1286
|
+
if (ssrfGuard.cidrContains(entry.cidr, remoteAddress)) return true;
|
|
1287
|
+
if (canonPeer !== remoteAddress && ssrfGuard.cidrContains(entry.cidr, canonPeer)) return true;
|
|
1288
|
+
}
|
|
1289
|
+
return false;
|
|
1204
1290
|
}
|
|
1205
1291
|
}
|
|
1206
1292
|
|
|
@@ -197,12 +197,18 @@ function create(opts) {
|
|
|
197
197
|
"register: '" + name + "' entry.maxHandlerMs must be a positive integer ≤ " +
|
|
198
198
|
MAX_HANDLER_MS_CEILING + " (got " + entry.maxHandlerMs + ")");
|
|
199
199
|
}
|
|
200
|
-
|
|
200
|
+
// Own-property membership, not `catalogue[name]` truthiness: the frozen
|
|
201
|
+
// plain-object catalogues (IMAP_VERBS / JMAP_METHODS / MANAGESIEVE_VERBS)
|
|
202
|
+
// inherit Object.prototype, so a handler name colliding with a prototype
|
|
203
|
+
// member (`constructor`, `toString`) would read a truthy inherited value
|
|
204
|
+
// and silently pass the catalogue gate without allowExperimental.
|
|
205
|
+
var inCatalogue = Object.prototype.hasOwnProperty.call(catalogue, name);
|
|
206
|
+
if (!inCatalogue && entry.allowExperimental !== true) {
|
|
201
207
|
throw new MailServerRegistryError("mail-server-registry/unknown-method",
|
|
202
208
|
"register: '" + name + "' is not in the " + opts.protocol + " catalogue; pass " +
|
|
203
209
|
"allowExperimental: true to opt out of the catalogue gate (audited)");
|
|
204
210
|
}
|
|
205
|
-
if (entry.allowExperimental === true && !
|
|
211
|
+
if (entry.allowExperimental === true && !inCatalogue) {
|
|
206
212
|
try {
|
|
207
213
|
audit.safeEmit({
|
|
208
214
|
action: "mail.serverRegistry.experimental_registration",
|
|
@@ -786,13 +786,23 @@ function _buildRfc822(message) {
|
|
|
786
786
|
body = parts.join("\r\n");
|
|
787
787
|
}
|
|
788
788
|
|
|
789
|
-
// Normalize line endings
|
|
789
|
+
// Normalize line endings only. Dot-stuffing (SMTP DATA transparency, RFC 5321
|
|
790
|
+
// §4.5.2) is applied at DATA send time — NOT here — because it must NOT touch
|
|
791
|
+
// the RFC 3030 BDAT/CHUNKING path (length-framed; receivers do not un-stuff, so
|
|
792
|
+
// a baked-in doubled dot corrupts the body) and must NOT be inside the
|
|
793
|
+
// DKIM-signed message (the receiver verifies the un-stuffed body).
|
|
790
794
|
body = body.replace(/\r?\n/g, "\r\n");
|
|
791
|
-
body = body.split("\r\n").map(function (l) { return l.charAt(0) === "." ? "." + l : l; }).join("\r\n");
|
|
792
795
|
|
|
793
796
|
return headers.join("\r\n") + "\r\n\r\n" + body;
|
|
794
797
|
}
|
|
795
798
|
|
|
799
|
+
// Dot-stuff a message for the SMTP DATA path (RFC 5321 §4.5.2): any line whose
|
|
800
|
+
// first byte is "." gets a doubled dot so the receiver's `.`-on-its-own-line
|
|
801
|
+
// terminator can't be forged by body content. Applied ONLY on DATA, never BDAT.
|
|
802
|
+
function _dotStuffForData(msg) {
|
|
803
|
+
return msg.split("\r\n").map(function (l) { return l.charAt(0) === "." ? "." + l : l; }).join("\r\n");
|
|
804
|
+
}
|
|
805
|
+
|
|
796
806
|
function smtpTransport(opts) {
|
|
797
807
|
opts = opts || {};
|
|
798
808
|
if (!opts.host) {
|
|
@@ -1371,7 +1381,7 @@ function _smtpSend(message, cfg) {
|
|
|
1371
1381
|
}
|
|
1372
1382
|
else if (step === SMTP_STEP_DATA) {
|
|
1373
1383
|
if (code !== 354) { fail("data-rejected (code " + code + ")"); return; }
|
|
1374
|
-
send(dataMessage + "\r\n.");
|
|
1384
|
+
send(_dotStuffForData(dataMessage) + "\r\n.");
|
|
1375
1385
|
step = SMTP_STEP_BODY;
|
|
1376
1386
|
}
|
|
1377
1387
|
else if (step === SMTP_STEP_BDAT) {
|
|
@@ -1609,10 +1619,10 @@ function resendTransport(opts) {
|
|
|
1609
1619
|
throw new MailError("mail/resend-bad-response",
|
|
1610
1620
|
"resend response was not JSON: " + text.slice(0, DIAG_SNIPPET_LEN), false);
|
|
1611
1621
|
}
|
|
1612
|
-
if (!data.id) {
|
|
1622
|
+
if (!data || !data.id) {
|
|
1613
1623
|
return {
|
|
1614
1624
|
ok: false,
|
|
1615
|
-
reason: data.message || JSON.stringify(data).slice(0, DIAG_SNIPPET_LEN),
|
|
1625
|
+
reason: (data && data.message) || JSON.stringify(data).slice(0, DIAG_SNIPPET_LEN),
|
|
1616
1626
|
};
|
|
1617
1627
|
}
|
|
1618
1628
|
return { ok: true, id: data.id };
|