@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -197,7 +197,7 @@ async function _safeResolveMx(qname, operatorLookup) {
|
|
|
197
197
|
return entries.map(function (e) { return e.exchange; });
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
async function _safeReverse(ip) {
|
|
200
|
+
async function _safeReverse(ip, operatorLookup) {
|
|
201
201
|
// PTR query against the reverse-arpa name. IPv4: a.b.c.d.in-addr.arpa
|
|
202
202
|
// (reversed octets); IPv6: nibble-reversed under ip6.arpa.
|
|
203
203
|
var qname = _ipToReverseArpa(ip);
|
|
@@ -206,6 +206,30 @@ async function _safeReverse(ip) {
|
|
|
206
206
|
err.code = "ENOTFOUND";
|
|
207
207
|
throw err;
|
|
208
208
|
}
|
|
209
|
+
// Operator-supplied resolver: the callback receives the reverse-arpa
|
|
210
|
+
// qname (the same name a real resolver queries) and returns the
|
|
211
|
+
// documented flat PTR-name array. Threading it here makes the iprev
|
|
212
|
+
// forward-confirm path operator-mockable, matching the dnsLookup
|
|
213
|
+
// contract every other type in this file already honors.
|
|
214
|
+
if (operatorLookup) {
|
|
215
|
+
var resp = await operatorLookup(qname, "PTR");
|
|
216
|
+
if (!Array.isArray(resp) || resp.length === 0) {
|
|
217
|
+
var perr = new Error("no PTR records for " + ip);
|
|
218
|
+
perr.code = "ENODATA";
|
|
219
|
+
throw perr;
|
|
220
|
+
}
|
|
221
|
+
var names = [];
|
|
222
|
+
for (var pi = 0; pi < resp.length; pi += 1) {
|
|
223
|
+
var nm = String(resp[pi]).replace(/\.$/, "");
|
|
224
|
+
if (nm.length > 0) names.push(nm);
|
|
225
|
+
}
|
|
226
|
+
if (names.length === 0) {
|
|
227
|
+
var perr2 = new Error("no PTR records for " + ip);
|
|
228
|
+
perr2.code = "ENODATA";
|
|
229
|
+
throw perr2;
|
|
230
|
+
}
|
|
231
|
+
return names;
|
|
232
|
+
}
|
|
209
233
|
var r = await _getDefaultResolver().query(qname, "PTR");
|
|
210
234
|
var out = [];
|
|
211
235
|
for (var i = 0; i < r.rrs.length; i += 1) {
|
|
@@ -1483,6 +1507,17 @@ async function arcVerify(rfc822, opts) {
|
|
|
1483
1507
|
"arc.verify: rfc822 must be a non-empty string");
|
|
1484
1508
|
}
|
|
1485
1509
|
opts = opts || {};
|
|
1510
|
+
// RFC 8617 §5.1.1 / RFC 6376 §3.4 — ARC-Message-Signature verification
|
|
1511
|
+
// reuses the DKIM verifier, whose header/body split REQUIRES CRLF CRLF and
|
|
1512
|
+
// whose canonicalization is CRLF-based. _splitHeaders / _parseHeaderLines
|
|
1513
|
+
// here accept bare-LF, so a bare-LF ARC message (proper for its own header
|
|
1514
|
+
// scan) reached the DKIM step and threw an uncaught DkimError out of
|
|
1515
|
+
// arc.verify — a foreign error type breaking the "returns a chain result or
|
|
1516
|
+
// throws only a typed MailAuthError" contract. Normalize bare LF the
|
|
1517
|
+
// operator's tooling introduced to canonical CRLF (a no-op on a proper CRLF
|
|
1518
|
+
// message; identical to the LF→CRLF fold the DKIM body canon already does)
|
|
1519
|
+
// so the AMS DKIM verify sees the same canonical bytes the sealer signed.
|
|
1520
|
+
rfc822 = rfc822.replace(/\r?\n/g, "\r\n");
|
|
1486
1521
|
var headers = _parseHeaderLines(_splitHeaders(rfc822));
|
|
1487
1522
|
var hops = [];
|
|
1488
1523
|
var seenSlot = {}; // {`<instance>:<name>`: true} — duplicate detection
|
|
@@ -1814,6 +1849,19 @@ async function _verifyArc(rfc822, hop, allHops, kind, dnsLookup, dkim) {
|
|
|
1814
1849
|
var asUnsigned = dkim._stripBTagValue(sigValue);
|
|
1815
1850
|
canonicalized += _canonRelaxedHeader("ARC-Seal", asUnsigned).replace(/\r\n$/, "");
|
|
1816
1851
|
|
|
1852
|
+
// RFC 6376 §3.6.1 / RFC 8617 — the ARC key record's k= (DEFAULT "rsa" when
|
|
1853
|
+
// absent) must match the seal's a= family. Without this, a record
|
|
1854
|
+
// `p=<raw-32-byte-key>` with no k= is an RSA record that would be misread as
|
|
1855
|
+
// Ed25519 and validate an a=ed25519-sha256 seal the record never authorized
|
|
1856
|
+
// (a key-family confusion that marks a forged chain as cryptographically
|
|
1857
|
+
// passing).
|
|
1858
|
+
var asKFamily = keyTags.k !== undefined ? String(keyTags.k).toLowerCase() : "rsa";
|
|
1859
|
+
var asSigFamily = String(tags.a || "").toLowerCase().split("-")[0];
|
|
1860
|
+
if (asKFamily !== asSigFamily) {
|
|
1861
|
+
return { result: "permerror",
|
|
1862
|
+
errors: [kind + ": key k=" + asKFamily + " does not match seal a=" + tags.a + " (RFC 6376 §3.6.1)"] };
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1817
1865
|
// Verify the AS signature.
|
|
1818
1866
|
return _runVerify(canonicalized, tags.b, tags.a, keyTags.p, "as");
|
|
1819
1867
|
}
|
|
@@ -1897,7 +1945,18 @@ function _canonRelaxedHeader(name, value) {
|
|
|
1897
1945
|
return dkim.canonHeaderRelaxed(name, value);
|
|
1898
1946
|
}
|
|
1899
1947
|
|
|
1948
|
+
// RFC 8410 Ed25519 SubjectPublicKeyInfo header prepended to a raw 32-byte key.
|
|
1949
|
+
var ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
|
|
1950
|
+
|
|
1900
1951
|
function _pemFromB64KeyMaterial(b64) {
|
|
1952
|
+
// RFC 8463 §3-4 publishes an ed25519 DKIM key as the RAW 32-byte key
|
|
1953
|
+
// (base64'd), which is not valid SPKI DER; wrap it in the ed25519 SPKI header
|
|
1954
|
+
// first. Already-SPKI ed25519 (44 bytes) / RSA SPKI (larger) pass through.
|
|
1955
|
+
var raw = null;
|
|
1956
|
+
try { raw = Buffer.from(b64, "base64"); } catch (_e) { raw = null; }
|
|
1957
|
+
if (raw && raw.length === 32) {
|
|
1958
|
+
b64 = Buffer.concat([ED25519_SPKI_PREFIX, raw]).toString("base64");
|
|
1959
|
+
}
|
|
1901
1960
|
var pem = "-----BEGIN PUBLIC KEY-----\n";
|
|
1902
1961
|
for (var i = 0; i < b64.length; i += 64) { // PEM wrap width
|
|
1903
1962
|
pem += b64.slice(i, i + 64) + "\n"; // PEM wrap width
|
|
@@ -2158,7 +2217,7 @@ function authResultsEmit(opts) {
|
|
|
2158
2217
|
// (`\"`). Pre-v0.8.32 the framework collapsed `"` to `'` which
|
|
2159
2218
|
// is lossy. Use the spec-correct escape so the receiver can
|
|
2160
2219
|
// round-trip the original reason.
|
|
2161
|
-
clause +=
|
|
2220
|
+
clause += " reason=" + safeBuffer.quoteString(r.reason);
|
|
2162
2221
|
}
|
|
2163
2222
|
// Method-specific properties (ptype.property=value triples per
|
|
2164
2223
|
// RFC 8601 §2.3). Operators pass them as flat object keys.
|
|
@@ -2365,6 +2424,27 @@ async function inboundVerify(opts) {
|
|
|
2365
2424
|
throw new MailAuthError("mail-auth/inbound-bad-message",
|
|
2366
2425
|
"inbound.verify: message must be a non-empty string or Buffer (the full RFC 5322 message)");
|
|
2367
2426
|
}
|
|
2427
|
+
// RFC 5322 §2.1 — the SMTP wire format is CRLF, but bare-LF input is
|
|
2428
|
+
// accepted defensively (see the pipeline note above; _splitHeaderBlock
|
|
2429
|
+
// already honors it for the From extraction). The DKIM verifier
|
|
2430
|
+
// (RFC 6376 §3.4) canonicalizes over CRLF and its header/body split
|
|
2431
|
+
// REQUIRES CRLF CRLF — a bare-LF message otherwise threw an uncaught
|
|
2432
|
+
// DkimError out of the pipeline, breaking the documented "bare-LF
|
|
2433
|
+
// accepted" contract (and the module-wide invariant that message-derived
|
|
2434
|
+
// faults surface as a verdict, never a throw). Normalize any bare LF the
|
|
2435
|
+
// operator's tooling introduced to canonical CRLF — a no-op on a proper
|
|
2436
|
+
// CRLF message, and identical to the LF→CRLF fold the DKIM body
|
|
2437
|
+
// canonicalizer already performs — so every sub-verifier receives the
|
|
2438
|
+
// same canonical bytes and produces a verdict.
|
|
2439
|
+
message = message.replace(/\r?\n/g, "\r\n");
|
|
2440
|
+
// RFC 5322 §2.1 — a well-formed message terminates its header block with
|
|
2441
|
+
// an empty line. _splitHeaderBlock already treats a message with no such
|
|
2442
|
+
// separator as headers-only (empty body); mirror that here so the DKIM
|
|
2443
|
+
// verifier — whose split REQUIRES CRLF CRLF — sees a separator and
|
|
2444
|
+
// returns a "none" verdict on the same headers-only input instead of
|
|
2445
|
+
// throwing. Same root as the bare-LF case: every message _splitHeaderBlock
|
|
2446
|
+
// accepts must reach a verdict, never an uncaught throw.
|
|
2447
|
+
if (message.indexOf("\r\n\r\n") === -1) message += "\r\n\r\n";
|
|
2368
2448
|
var mailFrom = (typeof opts.mailFrom === "string" && opts.mailFrom.length > 0) ? opts.mailFrom : null;
|
|
2369
2449
|
var helo = (typeof opts.helo === "string" && opts.helo.length > 0) ? opts.helo : null;
|
|
2370
2450
|
|
|
@@ -2864,13 +2944,22 @@ function dmarcBuildAggregateReport(report, opts) {
|
|
|
2864
2944
|
// Authentication-Results header so downstream policies can react.
|
|
2865
2945
|
//
|
|
2866
2946
|
// Surface:
|
|
2867
|
-
// await b.mail.iprev.verify(ip)
|
|
2947
|
+
// await b.mail.iprev.verify(ip, opts?)
|
|
2868
2948
|
// → { result: "pass"|"fail"|"permerror"|"temperror",
|
|
2869
2949
|
// ptr, forward, fcrdns, ip }
|
|
2870
2950
|
//
|
|
2871
|
-
// Returns "permerror" on bad-shape input (not an IP literal
|
|
2872
|
-
//
|
|
2873
|
-
//
|
|
2951
|
+
// Returns "permerror" on bad-shape input (not an IP literal, or a PTR
|
|
2952
|
+
// whose rdata isn't a valid DNS name). A definitive negative answer
|
|
2953
|
+
// (no PTR record, or the PTR forward-resolves to a set that omits the
|
|
2954
|
+
// connecting IP) is a "fail"; a transient resolver fault (SERVFAIL,
|
|
2955
|
+
// timeout, or any non-negative error code) is a "temperror" the
|
|
2956
|
+
// receiver retries on. Every path RETURNS a verdict object — the
|
|
2957
|
+
// primitive never throws on a message- or DNS-derived fault.
|
|
2958
|
+
//
|
|
2959
|
+
// DNS defaults to b.network.dns.resolver; an operator `opts.dnsLookup`
|
|
2960
|
+
// callback overrides it (same shape as the rest of this file — the PTR
|
|
2961
|
+
// query receives the reverse-arpa qname; the forward query the PTR
|
|
2962
|
+
// name), so a receiver can unit-test the forward-confirm decision.
|
|
2874
2963
|
|
|
2875
2964
|
// RFC 8601 §3 — PTR result shape. The PTR rdata is an FQDN (1*labels).
|
|
2876
2965
|
// Reject answers that aren't shaped as a DNS name: non-strings,
|
|
@@ -2897,7 +2986,10 @@ function _isValidPtrName(name) {
|
|
|
2897
2986
|
return true;
|
|
2898
2987
|
}
|
|
2899
2988
|
|
|
2900
|
-
async function iprevVerify(ip) {
|
|
2989
|
+
async function iprevVerify(ip, opts) {
|
|
2990
|
+
opts = opts || {};
|
|
2991
|
+
validateOpts(opts, ["dnsLookup"], "mail.iprev.verify");
|
|
2992
|
+
var dnsLookup = opts.dnsLookup;
|
|
2901
2993
|
if (typeof ip !== "string" || ip.length === 0) {
|
|
2902
2994
|
return { result: "permerror", ip: ip || null,
|
|
2903
2995
|
ptr: null, forward: [], fcrdns: false,
|
|
@@ -2910,7 +3002,7 @@ async function iprevVerify(ip) {
|
|
|
2910
3002
|
}
|
|
2911
3003
|
|
|
2912
3004
|
var ptrs;
|
|
2913
|
-
try { ptrs = await _safeReverse(ip); }
|
|
3005
|
+
try { ptrs = await _safeReverse(ip, dnsLookup); }
|
|
2914
3006
|
catch (e) {
|
|
2915
3007
|
var rcode = e && e.code;
|
|
2916
3008
|
if (rcode === "ENOTFOUND" || rcode === "ENODATA") {
|
|
@@ -2942,7 +3034,7 @@ async function iprevVerify(ip) {
|
|
|
2942
3034
|
var isV6 = net.isIPv6(ip);
|
|
2943
3035
|
var forwardAddrs;
|
|
2944
3036
|
try {
|
|
2945
|
-
forwardAddrs = await _safeResolveA(ptr, isV6 ? 6 : 4);
|
|
3037
|
+
forwardAddrs = await _safeResolveA(ptr, isV6 ? 6 : 4, dnsLookup);
|
|
2946
3038
|
} catch (e) {
|
|
2947
3039
|
var fcode = e && e.code;
|
|
2948
3040
|
if (fcode === "ENOTFOUND" || fcode === "ENODATA") {
|
|
@@ -2950,23 +3042,32 @@ async function iprevVerify(ip) {
|
|
|
2950
3042
|
ptr: ptr, forward: [], fcrdns: false,
|
|
2951
3043
|
explanation: "no forward record for PTR " + ptr };
|
|
2952
3044
|
}
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
//
|
|
2959
|
-
//
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
|
|
3045
|
+
// Every non-negative fault (SERVFAIL, timeout, or any other
|
|
3046
|
+
// platform-resolver code) is transient — RETURN a temperror verdict,
|
|
3047
|
+
// mirroring the reverse-lookup catch above. Throwing here broke the
|
|
3048
|
+
// primitive's contract that every message/DNS-derived fault surfaces
|
|
3049
|
+
// as a verdict object: a caller of the documented API got an
|
|
3050
|
+
// exception on e.g. an EREFUSED forward fault. Only the definitive
|
|
3051
|
+
// negative answers above (no forward record) are a "fail".
|
|
3052
|
+
return { result: "temperror", ip: ip,
|
|
3053
|
+
ptr: ptr, forward: [], fcrdns: false,
|
|
3054
|
+
explanation: "forward lookup of " + ptr + " transient failure: " +
|
|
3055
|
+
(fcode || (e && e.message) || String(e)) };
|
|
2964
3056
|
}
|
|
2965
3057
|
var forward = Array.isArray(forwardAddrs) ? forwardAddrs.slice() : [];
|
|
2966
|
-
|
|
3058
|
+
// RFC 8601 §3 forward-confirm match. An IPv6 address has many equivalent
|
|
3059
|
+
// textual forms (compressed `2001:db8::1` vs expanded
|
|
3060
|
+
// `2001:0db8:0:0:0:0:0:1`); the connecting literal and the AAAA rdata
|
|
3061
|
+
// routinely differ. Compare the CANONICAL form (fixed-width hex nibbles)
|
|
3062
|
+
// so an equivalent-but-differently-written IPv6 address still confirms.
|
|
3063
|
+
// IPv4 has a single canonical dotted form, so a lowercased string compare
|
|
3064
|
+
// is exact there.
|
|
3065
|
+
var ipCanon = isV6 ? ipUtils.expandIpv6Hex(ip) : ip.toLowerCase();
|
|
2967
3066
|
var fcrdns = false;
|
|
2968
3067
|
for (var i = 0; i < forward.length; i += 1) {
|
|
2969
|
-
|
|
3068
|
+
var fwdStr = String(forward[i]);
|
|
3069
|
+
var fwdCanon = isV6 ? ipUtils.expandIpv6Hex(fwdStr) : fwdStr.toLowerCase();
|
|
3070
|
+
if (ipCanon && fwdCanon && fwdCanon === ipCanon) { fcrdns = true; break; }
|
|
2970
3071
|
}
|
|
2971
3072
|
return {
|
|
2972
3073
|
result: fcrdns ? "pass" : "fail",
|
|
@@ -398,7 +398,7 @@ function validateTinyPsSvg(svgBytes) {
|
|
|
398
398
|
|
|
399
399
|
if (t.type === "tag") {
|
|
400
400
|
var name = t.name;
|
|
401
|
-
if (TINY_PS_FORBIDDEN_TAGS
|
|
401
|
+
if (Object.prototype.hasOwnProperty.call(TINY_PS_FORBIDDEN_TAGS, name)) {
|
|
402
402
|
_vio("element-forbidden",
|
|
403
403
|
"<" + name + "> is forbidden in Tiny-PS (script / style / animation / filter / image / foreign-content class)");
|
|
404
404
|
}
|
|
@@ -183,6 +183,14 @@ function _parseSes(p) {
|
|
|
183
183
|
throw _err("ses/bad-message-json",
|
|
184
184
|
"SES SNS Message field is not valid JSON: " + (e && e.message));
|
|
185
185
|
}
|
|
186
|
+
// A syntactically valid Message can still decode to a non-object —
|
|
187
|
+
// JSON literal null / number / string / boolean / array. Reject it
|
|
188
|
+
// with a typed error rather than dereferencing null downstream, and
|
|
189
|
+
// do not echo the decoded value (avoid leaking payload internals).
|
|
190
|
+
if (!msg || typeof msg !== "object" || Array.isArray(msg)) {
|
|
191
|
+
throw _err("ses/bad-message-json",
|
|
192
|
+
"SES SNS Message field must decode to a JSON object");
|
|
193
|
+
}
|
|
186
194
|
}
|
|
187
195
|
var notificationType = msg.notificationType || msg.eventType;
|
|
188
196
|
if (!notificationType) {
|
|
@@ -456,7 +456,12 @@ function sign(opts) {
|
|
|
456
456
|
hashAlg = HASH_ALG_SHA512;
|
|
457
457
|
var rawPub = _extractEd25519PublicRaw(publicKey);
|
|
458
458
|
publicPacketBody = _ed25519PublicPacketBody(rawPub, creationTime);
|
|
459
|
-
} else if (keyType === "rsa"
|
|
459
|
+
} else if (keyType === "rsa") {
|
|
460
|
+
// Only rsaEncryption (keyType "rsa") keys sign here. An id-RSASSA-PSS
|
|
461
|
+
// key (keyType "rsa-pss") is padding-restricted to PSS by OpenSSL and
|
|
462
|
+
// cannot express the PKCS#1-v1.5 signature this module emits, so it is
|
|
463
|
+
// refused with a typed error below rather than crashing on the JWK
|
|
464
|
+
// export path (which refuses rsa-pss keys).
|
|
460
465
|
pubAlg = PUB_ALG_RSA;
|
|
461
466
|
hashAlg = HASH_ALG_SHA256;
|
|
462
467
|
var rsaPub = _extractRsaPublicComponents(publicKey);
|
|
@@ -811,7 +816,12 @@ function verify(opts) {
|
|
|
811
816
|
"publicKeyPem could not be parsed: " + ((e && e.message) || String(e))); }
|
|
812
817
|
|
|
813
818
|
var keyType = publicKey.asymmetricKeyType;
|
|
814
|
-
|
|
819
|
+
// Only rsaEncryption (keyType "rsa") keys verify a PKCS#1-v1.5 signature.
|
|
820
|
+
// An id-RSASSA-PSS key (keyType "rsa-pss") is PSS-padding-restricted and
|
|
821
|
+
// cannot JWK-export for component extraction; treat it as a key/algorithm
|
|
822
|
+
// mismatch and return a typed verdict rather than letting the extraction
|
|
823
|
+
// throw a raw Error out of verify().
|
|
824
|
+
if (parsed.pubAlg === PUB_ALG_RSA && keyType !== "rsa") {
|
|
815
825
|
return _fail("mail-crypto/pgp/key-alg-mismatch",
|
|
816
826
|
"signature claims RSA but provided key is " + keyType);
|
|
817
827
|
}
|
|
@@ -866,7 +876,13 @@ function verify(opts) {
|
|
|
866
876
|
|
|
867
877
|
var ok;
|
|
868
878
|
if (parsed.pubAlg === PUB_ALG_RSA) {
|
|
869
|
-
|
|
879
|
+
// A malformed / truncated signature MPI is untrusted input like any
|
|
880
|
+
// other packet field: return a verdict, don't throw. Every other
|
|
881
|
+
// bad-signature path here routes through _fail; the raw _readMpi
|
|
882
|
+
// reads did not, so a truncated MPI escaped as an exception.
|
|
883
|
+
var rsaMpi;
|
|
884
|
+
try { rsaMpi = _readMpi(parsed.sigMpisBytes, 0); }
|
|
885
|
+
catch (mpiErr) { return _fail(mpiErr.code || "mail-crypto/pgp/bad-mpi", mpiErr.message); }
|
|
870
886
|
// The signature is an integer in [0, n); when its value has one or more
|
|
871
887
|
// high zero bytes (~1/256 of signatures) the OpenPGP MPI encoding strips
|
|
872
888
|
// them (RFC 9580 §3.2), but node's RSA verify requires a signature exactly
|
|
@@ -889,9 +905,13 @@ function verify(opts) {
|
|
|
889
905
|
}
|
|
890
906
|
} else {
|
|
891
907
|
// Ed25519Legacy — two MPIs (R, S) reassemble into the 64-byte raw
|
|
892
|
-
// EdDSA signature.
|
|
893
|
-
|
|
894
|
-
var
|
|
908
|
+
// EdDSA signature. Truncated/malformed MPIs are untrusted input:
|
|
909
|
+
// return a verdict via _fail rather than throwing out of verify().
|
|
910
|
+
var rMpi, sMpi;
|
|
911
|
+
try {
|
|
912
|
+
rMpi = _readMpi(parsed.sigMpisBytes, 0);
|
|
913
|
+
sMpi = _readMpi(parsed.sigMpisBytes, rMpi.next);
|
|
914
|
+
} catch (mpiErrE) { return _fail(mpiErrE.code || "mail-crypto/pgp/bad-mpi", mpiErrE.message); }
|
|
895
915
|
function _padTo32(buf) {
|
|
896
916
|
if (buf.length === 32) return buf;
|
|
897
917
|
if (buf.length > 32) return buf.slice(buf.length - 32);
|
|
@@ -1018,6 +1038,18 @@ function experimentalEncrypt(opts) {
|
|
|
1018
1038
|
return { armored: armored, envelope: envelope };
|
|
1019
1039
|
}
|
|
1020
1040
|
|
|
1041
|
+
// Envelope length fields (recipientId / KEM-ciphertext / wrapped-key /
|
|
1042
|
+
// body lengths) are attacker-controlled: every multi-byte read and every
|
|
1043
|
+
// slice below must confirm the bytes exist before advancing `off`, or a
|
|
1044
|
+
// truncated envelope escapes as a raw RangeError instead of the typed
|
|
1045
|
+
// refusal decrypt() promises. Fail closed with mail-crypto/pgp/truncated.
|
|
1046
|
+
function _envNeed(buf, off, n) {
|
|
1047
|
+
if (off + n > buf.length) {
|
|
1048
|
+
throw new MailCryptoError("mail-crypto/pgp/truncated",
|
|
1049
|
+
"decrypt: envelope truncated (need " + n + " byte(s) at offset " + off + ")");
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1021
1053
|
function experimentalDecrypt(opts) {
|
|
1022
1054
|
opts = validateOpts.requireObject(opts, "mail.crypto.pgp.experimental.decrypt",
|
|
1023
1055
|
MailCryptoError, "mail-crypto/pgp/bad-opts");
|
|
@@ -1054,15 +1086,17 @@ function experimentalDecrypt(opts) {
|
|
|
1054
1086
|
var nRecips = envelope[off]; off += 1;
|
|
1055
1087
|
var matchedSessionKey = null;
|
|
1056
1088
|
for (var i = 0; i < nRecips; i += 1) {
|
|
1057
|
-
|
|
1058
|
-
throw new MailCryptoError("mail-crypto/pgp/truncated",
|
|
1059
|
-
"decrypt: envelope truncated at recipient " + i);
|
|
1060
|
-
}
|
|
1089
|
+
_envNeed(envelope, off, 1);
|
|
1061
1090
|
var ridLen = envelope[off]; off += 1;
|
|
1091
|
+
_envNeed(envelope, off, ridLen);
|
|
1062
1092
|
var rid = envelope.slice(off, off + ridLen); off += ridLen;
|
|
1093
|
+
_envNeed(envelope, off, 2);
|
|
1063
1094
|
var ctLen = envelope.readUInt16BE(off); off += 2; // u16-be width
|
|
1095
|
+
_envNeed(envelope, off, ctLen);
|
|
1064
1096
|
var ct = envelope.slice(off, off + ctLen); off += ctLen;
|
|
1097
|
+
_envNeed(envelope, off, 2);
|
|
1065
1098
|
var wkLen = envelope.readUInt16BE(off); off += 2; // u16-be width
|
|
1099
|
+
_envNeed(envelope, off, wkLen);
|
|
1066
1100
|
var wrappedKey = envelope.slice(off, off + wkLen); off += wkLen;
|
|
1067
1101
|
if (matchedSessionKey) continue;
|
|
1068
1102
|
if (!rid.equals(opts.recipientId)) continue;
|
|
@@ -1086,7 +1120,9 @@ function experimentalDecrypt(opts) {
|
|
|
1086
1120
|
throw new MailCryptoError("mail-crypto/pgp/no-matching-recipient",
|
|
1087
1121
|
"decrypt: no recipient in envelope matches opts.recipientId");
|
|
1088
1122
|
}
|
|
1123
|
+
_envNeed(envelope, off, 4);
|
|
1089
1124
|
var bodyLen = envelope.readUInt32BE(off); off += 4; // u32-be width
|
|
1125
|
+
_envNeed(envelope, off, bodyLen);
|
|
1090
1126
|
var body = envelope.slice(off, off + bodyLen);
|
|
1091
1127
|
var plaintext;
|
|
1092
1128
|
try { plaintext = bCrypto.decryptPacked(body, matchedSessionKey); }
|
|
@@ -247,8 +247,19 @@ function create(opts) {
|
|
|
247
247
|
var segs = path.split("/").filter(function (s) { return s.length > 0; });
|
|
248
248
|
var decoded = [];
|
|
249
249
|
for (var i = 0; i < segs.length; i++) {
|
|
250
|
-
|
|
250
|
+
var seg;
|
|
251
|
+
try { seg = decodeURIComponent(segs[i]); }
|
|
251
252
|
catch (_e) { return { principalId: null, parts: [], rejected: "malformed-uri" }; }
|
|
253
|
+
// Validate the DECODED segment. The pre-decode guard above only catches a
|
|
254
|
+
// literal ".."/"%2e%2e", so a MIXED encoding (".%2e", "%2e.") passes it and
|
|
255
|
+
// then decodes to "..". Reject any decoded segment that is "." / ".." or
|
|
256
|
+
// carries a NUL or an embedded path separator — the traversal the storage
|
|
257
|
+
// backend (getComponent/putComponent/...) would otherwise receive.
|
|
258
|
+
if (seg === "." || seg === ".." || seg.indexOf("\0") >= 0 ||
|
|
259
|
+
seg.indexOf("/") >= 0 || seg.indexOf("\\") >= 0) {
|
|
260
|
+
return { principalId: null, parts: [], rejected: "traversal" };
|
|
261
|
+
}
|
|
262
|
+
decoded.push(seg);
|
|
252
263
|
}
|
|
253
264
|
return {
|
|
254
265
|
principalId: decoded[0] || null,
|
|
@@ -551,7 +562,11 @@ function create(opts) {
|
|
|
551
562
|
_emit("mail.dav.handler_threw",
|
|
552
563
|
{ method: method, kind: "caldav",
|
|
553
564
|
error: (e && e.message) || String(e) }, "failure");
|
|
554
|
-
|
|
565
|
+
// A malformed / empty client request BODY (bad PROPFIND/REPORT XML) is a
|
|
566
|
+
// client fault → 400, mirroring the 400 that MKCALENDAR/MKCOL already return
|
|
567
|
+
// for the same input; only a genuine server-side throw is 500.
|
|
568
|
+
var isClientFault = e && /mail-dav\/bad-(propfind|report)-body/.test(e.code || "");
|
|
569
|
+
return _refuseStatus(res, isClientFault ? 400 : 500, isClientFault ? "Bad request" : "Server error");
|
|
555
570
|
}
|
|
556
571
|
}
|
|
557
572
|
|
|
@@ -889,7 +904,11 @@ function create(opts) {
|
|
|
889
904
|
_emit("mail.dav.handler_threw",
|
|
890
905
|
{ method: method, kind: "carddav",
|
|
891
906
|
error: (e && e.message) || String(e) }, "failure");
|
|
892
|
-
|
|
907
|
+
// A malformed / empty client request BODY (bad PROPFIND/REPORT XML) is a
|
|
908
|
+
// client fault → 400, mirroring the 400 that MKCALENDAR/MKCOL already return
|
|
909
|
+
// for the same input; only a genuine server-side throw is 500.
|
|
910
|
+
var isClientFault = e && /mail-dav\/bad-(propfind|report)-body/.test(e.code || "");
|
|
911
|
+
return _refuseStatus(res, isClientFault ? 400 : 500, isClientFault ? "Bad request" : "Server error");
|
|
893
912
|
}
|
|
894
913
|
}
|
|
895
914
|
|
|
@@ -134,6 +134,17 @@ function _splitHeadersBody(rfc822) {
|
|
|
134
134
|
// Headers terminated by the first empty line. Headers may use folded
|
|
135
135
|
// continuation lines (CRLF + WSP); we keep them folded and let the
|
|
136
136
|
// canonicalizer unfold relaxed-mode.
|
|
137
|
+
//
|
|
138
|
+
// RFC 5322 §2.1 — the wire format is CRLF, but a message read from a
|
|
139
|
+
// Unix file/mbox or passed through operator tooling that stripped CRs
|
|
140
|
+
// arrives bare-LF. Normalize to canonical CRLF before locating the
|
|
141
|
+
// separator (a no-op on a proper CRLF message, and identical to the
|
|
142
|
+
// LF->CRLF fold _canonBodySimple already performs) so a valid bare-LF
|
|
143
|
+
// message verifies instead of failing the separator search. A message
|
|
144
|
+
// with no empty line at all (no \n either) is genuinely separator-less
|
|
145
|
+
// and still throws below — normalization converts existing line endings,
|
|
146
|
+
// it never invents a separator.
|
|
147
|
+
rfc822 = rfc822.replace(/\r?\n/g, "\r\n");
|
|
137
148
|
var sep = rfc822.indexOf("\r\n\r\n");
|
|
138
149
|
if (sep === -1) {
|
|
139
150
|
throw new DkimError("dkim/missing-body-separator",
|
|
@@ -402,18 +413,42 @@ function create(opts) {
|
|
|
402
413
|
});
|
|
403
414
|
} catch (_e) { /* drop-silent */ }
|
|
404
415
|
}
|
|
405
|
-
// Append the unsigned DKIM-Signature header without
|
|
406
|
-
// per RFC 6376 §3.7.
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
416
|
+
// Append the unsigned DKIM-Signature header (b= value emptied) without a
|
|
417
|
+
// trailing CRLF per RFC 6376 §3.7. Under SIMPLE header canonicalization the
|
|
418
|
+
// header is signed and verified BYTE-FOR-BYTE as it appears on the wire —
|
|
419
|
+
// including its folding — so the signer must canonicalize the FOLDED form,
|
|
420
|
+
// exactly as the verifier does when it strips b= from the parsed (folded)
|
|
421
|
+
// wire header. (Relaxed unfolds on both sides, so it signs the unfolded
|
|
422
|
+
// value.) The empty-b header folds identically to the final header up to the
|
|
423
|
+
// last `b=` line (folding breaks only at "; " tag boundaries and b= is the
|
|
424
|
+
// last tag), so we can build the wire header by appending the signature to
|
|
425
|
+
// this folded empty-b header, and the verifier recovers exactly these bytes.
|
|
426
|
+
var foldedEmptyB = _foldSignatureHeader(unsignedSigValue);
|
|
427
|
+
var dkimHeaderForSigning;
|
|
428
|
+
if (canonHeader === "simple") {
|
|
429
|
+
// Simple canon is verbatim (RFC 6376 §3.4.1): the canonical form of the
|
|
430
|
+
// DKIM-Signature header (b= emptied) is the folded wire header exactly as
|
|
431
|
+
// it will appear — which is precisely foldedEmptyB ("DKIM-Signature: " +
|
|
432
|
+
// the folded, b-emptied value). No re-spacing or re-canonicalization.
|
|
433
|
+
dkimHeaderForSigning = foldedEmptyB;
|
|
434
|
+
} else {
|
|
435
|
+
dkimHeaderForSigning = _canonHeaderRelaxed("DKIM-Signature", unsignedSigValue);
|
|
436
|
+
}
|
|
410
437
|
canonicalizedHeaders += dkimHeaderForSigning.replace(/\r\n$/, "");
|
|
411
438
|
|
|
412
439
|
var signature = _signString(canonicalizedHeaders, keyObject, algorithm);
|
|
413
|
-
// Replace the empty `b=` placeholder with the actual base64 signature.
|
|
414
|
-
var finalSigValue = sigTags.slice(0, -1).concat(["b=" + signature]).join("; ");
|
|
415
440
|
|
|
416
|
-
|
|
441
|
+
// Wire header. Under simple canon, append the signature to the SAME folded
|
|
442
|
+
// empty-b header we signed, so a verifier parsing the folded wire and
|
|
443
|
+
// stripping b= reconstructs the signed bytes exactly. Under relaxed, re-fold
|
|
444
|
+
// the completed value (folding is normalized away on verify).
|
|
445
|
+
var dkimHeaderLine;
|
|
446
|
+
if (canonHeader === "simple") {
|
|
447
|
+
dkimHeaderLine = foldedEmptyB + signature + "\r\n";
|
|
448
|
+
} else {
|
|
449
|
+
var finalSigValue = sigTags.slice(0, -1).concat(["b=" + signature]).join("; ");
|
|
450
|
+
dkimHeaderLine = _foldSignatureHeader(finalSigValue) + "\r\n";
|
|
451
|
+
}
|
|
417
452
|
|
|
418
453
|
_emit("dkim.sign.success", {
|
|
419
454
|
bodyLength: body.length,
|
|
@@ -610,10 +645,21 @@ async function _safeResolveTxt(qname, operatorLookup) {
|
|
|
610
645
|
|
|
611
646
|
function _resetDkimKeyCacheForTest() { DKIM_KEY_CACHE.clear(); }
|
|
612
647
|
|
|
648
|
+
// RFC 8410 Ed25519 SubjectPublicKeyInfo header (algorithm id + BIT STRING
|
|
649
|
+
// wrapper) prepended to a raw 32-byte key to form valid SPKI DER.
|
|
650
|
+
var ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
|
|
651
|
+
|
|
613
652
|
function _pemFromB64KeyMaterial(b64) {
|
|
614
|
-
// RSA: SubjectPublicKeyInfo DER in base64. Ed25519:
|
|
615
|
-
//
|
|
616
|
-
//
|
|
653
|
+
// RSA: SubjectPublicKeyInfo DER in base64. Ed25519: RFC 8463 §3-4 publishes
|
|
654
|
+
// the RAW 32-byte key (base64'd) — the canonical form every conformant
|
|
655
|
+
// ed25519 sender uses — which is NOT valid SPKI DER; wrap it in the ed25519
|
|
656
|
+
// SPKI header first. An already-SPKI ed25519 key (44 bytes) or an RSA SPKI
|
|
657
|
+
// key (larger) is passed through unchanged.
|
|
658
|
+
var raw = null;
|
|
659
|
+
try { raw = Buffer.from(b64, "base64"); } catch (_e) { raw = null; }
|
|
660
|
+
if (raw && raw.length === 32) {
|
|
661
|
+
b64 = Buffer.concat([ED25519_SPKI_PREFIX, raw]).toString("base64");
|
|
662
|
+
}
|
|
617
663
|
var pem = "-----BEGIN PUBLIC KEY-----\n";
|
|
618
664
|
// 64-char wrap (PEM convention).
|
|
619
665
|
for (var i = 0; i < b64.length; i += 64) { // PEM wrap width
|
|
@@ -805,13 +851,23 @@ function _verifySingleSignature(rfc822, parsedHeaders, sigHeader, keyTags, sigTa
|
|
|
805
851
|
// structure instead.
|
|
806
852
|
var unsignedSigValue = _stripBTagValue(sigHeader.value);
|
|
807
853
|
// The signature header is canonicalized under its true field name (§3.7).
|
|
808
|
-
//
|
|
809
|
-
//
|
|
810
|
-
//
|
|
811
|
-
//
|
|
812
|
-
|
|
854
|
+
// Under simple canon the name is verbatim, so it must be the EXACT on-wire
|
|
855
|
+
// spelling the peer signed (sigHeader.name — _findDkimSignatureHeaders matches
|
|
856
|
+
// the field name case-insensitively and _parseHeaders preserves its casing),
|
|
857
|
+
// not a hardcoded "DKIM-Signature"; a peer that emits `dkim-signature:` signs
|
|
858
|
+
// that lowercase name and would otherwise never verify. (Relaxed canon
|
|
859
|
+
// lowercases the name, so the on-wire spelling doesn't matter there.) For the
|
|
860
|
+
// ARC reuse the header on the wire is ARC-Message-Signature, signed under that
|
|
861
|
+
// name; the synthetic renames it to DKIM-Signature only so this verifier finds
|
|
862
|
+
// it, so the canonical form must restore the real ARC name.
|
|
863
|
+
var sigCanonName = verifyOpts.arcAmsReuse ? "ARC-Message-Signature" : sigHeader.name;
|
|
864
|
+
// Simple canon is verbatim: the parsed sigHeader.value already carries the
|
|
865
|
+
// single space the wire places after the colon and its folding, so it is
|
|
866
|
+
// canonicalized as-is (b= emptied) — NOT re-spaced. (A prior `" " +` prefix
|
|
867
|
+
// here injected a spurious second space, so simple-canon signatures — ours
|
|
868
|
+
// and any RFC-compliant peer's — never matched what was signed.)
|
|
813
869
|
canonicalizedHeaders += canonHeader === "simple"
|
|
814
|
-
? _canonHeaderSimple(sigCanonName,
|
|
870
|
+
? _canonHeaderSimple(sigCanonName, unsignedSigValue).replace(/\r\n$/, "")
|
|
815
871
|
: _canonHeaderRelaxed(sigCanonName, unsignedSigValue).replace(/\r\n$/, "");
|
|
816
872
|
|
|
817
873
|
// 3. Verify the signature.
|
|
@@ -1068,18 +1124,18 @@ async function verify(rfc822, opts) {
|
|
|
1068
1124
|
errors: ["DKIM key record missing p="] });
|
|
1069
1125
|
continue;
|
|
1070
1126
|
}
|
|
1071
|
-
// RFC 6376 §3.6.1 — k= tag declares the key's algorithm family
|
|
1072
|
-
//
|
|
1073
|
-
//
|
|
1074
|
-
//
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1127
|
+
// RFC 6376 §3.6.1 — k= tag declares the key's algorithm family, DEFAULT
|
|
1128
|
+
// "rsa" when absent. If it disagrees with the signature's a= family the
|
|
1129
|
+
// operator who published the key intends a different algorithm; refuse
|
|
1130
|
+
// rather than guess. The default matters: a record `p=<raw-32-byte-key>`
|
|
1131
|
+
// with no k= is an RSA record, and must NOT be read as an Ed25519 key just
|
|
1132
|
+
// because the bytes are 32 long (a key-family confusion).
|
|
1133
|
+
var kFamily = keyTags.k !== undefined ? String(keyTags.k).toLowerCase() : "rsa";
|
|
1134
|
+
var sigFamily = String(alg || "").toLowerCase().split("-")[0];
|
|
1135
|
+
if (kFamily !== sigFamily) {
|
|
1136
|
+
results.push({ d: d, s: s, alg: alg, result: "permerror",
|
|
1137
|
+
errors: ["DKIM key k=" + kFamily + " does not match signature a=" + alg + " (RFC 6376 §3.6.1)"] });
|
|
1138
|
+
continue;
|
|
1083
1139
|
}
|
|
1084
1140
|
var rv = _verifySingleSignature(rfc822, parsedHeaders, sigHeaders[i], keyTags, sigTags, verifyOpts);
|
|
1085
1141
|
results.push(Object.assign({ d: d, s: s, alg: alg }, rv));
|
|
@@ -1265,7 +1321,17 @@ function _bootstrapSingle(algorithm, domain, selector, rsaBits) {
|
|
|
1265
1321
|
}
|
|
1266
1322
|
var publicKeyPemObj = nodeCrypto.createPublicKey({ key: keyPair.publicKey, type: "spki", format: "der" });
|
|
1267
1323
|
var publicKeyPem = publicKeyPemObj.export({ type: "spki", format: "pem" });
|
|
1268
|
-
|
|
1324
|
+
// RFC 8463 §3-4: an ed25519 DKIM key MUST be published as the RAW 32-byte key
|
|
1325
|
+
// (base64'd), not SPKI DER — the SPKI form (60 base64 chars) does not verify
|
|
1326
|
+
// at a conformant receiver. The raw key is the trailing 32 bytes of the SPKI
|
|
1327
|
+
// encoding. RSA keeps the SPKI DER form (RFC 6376).
|
|
1328
|
+
var pBase64;
|
|
1329
|
+
if (k === "ed25519") {
|
|
1330
|
+
var spkiDer = Buffer.from(keyPair.publicKey);
|
|
1331
|
+
pBase64 = spkiDer.subarray(spkiDer.length - 32).toString("base64");
|
|
1332
|
+
} else {
|
|
1333
|
+
pBase64 = Buffer.from(keyPair.publicKey).toString("base64");
|
|
1334
|
+
}
|
|
1269
1335
|
var dnsName = selector + "._domainkey." + domain;
|
|
1270
1336
|
// RFC 6376 §3.6.1 record syntax: v=DKIM1; k=<alg>; p=<base64>
|
|
1271
1337
|
// The optional t/s/g/n/h/k tags omitted (operator can re-edit
|
|
@@ -280,7 +280,12 @@ async function evaluate(ctx, opts) {
|
|
|
280
280
|
|
|
281
281
|
// Not an address-literal; must be a domain.
|
|
282
282
|
var lower = claimed.toLowerCase();
|
|
283
|
-
|
|
283
|
+
// Own-property membership test — a bare `LOCALHOST_REFUSED[lower]`
|
|
284
|
+
// walks the prototype chain, so a claim that collides with an
|
|
285
|
+
// Object.prototype key (`constructor`, `__proto__`, ...) reads the
|
|
286
|
+
// inherited value as truthy and gets mislabelled a reserved-name
|
|
287
|
+
// claim. Match the table strictly against its own keys.
|
|
288
|
+
if (Object.prototype.hasOwnProperty.call(LOCALHOST_REFUSED, lower)) {
|
|
284
289
|
return _emit(auditImpl, "reject-shape", {
|
|
285
290
|
shape: "invalid",
|
|
286
291
|
reason: "localhost-class claim '" + lower + "' refused (RFC 6761 §6.3 reserved name)",
|