@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// Copyright (c) blamejs contributors
|
|
3
3
|
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.mail.server.managesieve — create() opts validation plus command-handler
|
|
6
|
+
* and error-branch tests driven over a real localhost listener (RFC 5804):
|
|
7
|
+
* the wire-protocol dispatch (CAPABILITY / NOOP / STARTTLS / LOGOUT /
|
|
8
|
+
* AUTHENTICATE / HAVESPACE / PUTSCRIPT / LISTSCRIPTS / SETACTIVE / GETSCRIPT /
|
|
9
|
+
* DELETESCRIPT / RENAMESCRIPT) plus its wrong-state / malformed / not-found /
|
|
10
|
+
* backend-failure / rate-limit / idle-timeout branches. Every wire assertion
|
|
11
|
+
* drives the public API over a socket; the STARTTLS upgrade trusts the test
|
|
12
|
+
* CA via `ca:` (never rejectUnauthorized:false).
|
|
13
|
+
*
|
|
14
|
+
* Run standalone: node test/layer-0-primitives/mail-server-managesieve.test.js
|
|
15
|
+
*/
|
|
4
16
|
|
|
5
17
|
var helpers = require("../helpers");
|
|
6
|
-
var
|
|
18
|
+
var b = helpers.b;
|
|
19
|
+
var check = helpers.check;
|
|
7
20
|
var mailServerManageSieve = require("../../lib/mail-server-managesieve");
|
|
8
21
|
|
|
22
|
+
var nodeNet = require("node:net");
|
|
23
|
+
var nodeTls = require("node:tls");
|
|
24
|
+
|
|
9
25
|
function _stubMailStore() {
|
|
10
26
|
return {
|
|
11
27
|
sieveScripts: {
|
|
@@ -111,7 +127,423 @@ function testHandleSurface() {
|
|
|
111
127
|
check("handle.close is a function", typeof handle.close === "function");
|
|
112
128
|
}
|
|
113
129
|
|
|
114
|
-
|
|
130
|
+
var NUL = String.fromCharCode(0);
|
|
131
|
+
|
|
132
|
+
// ---- socket read helpers -------------------------------------------------
|
|
133
|
+
|
|
134
|
+
// A ManageSieve response block ends with a line beginning OK / NO / BYE
|
|
135
|
+
// (RFC 5804 §1.2). Data lines (capability tuples, LISTSCRIPTS entries,
|
|
136
|
+
// GETSCRIPT literals) begin with `"` or `{`, so the terminal line is
|
|
137
|
+
// unambiguous for the fixtures this suite drives.
|
|
138
|
+
function _isTerminal(buf) {
|
|
139
|
+
return /(?:^|\r\n)(?:OK|NO|BYE)(?: [^\r\n]*)?\r\n$/.test(buf);
|
|
140
|
+
}
|
|
141
|
+
function _read(sock) {
|
|
142
|
+
return new Promise(function (resolve) {
|
|
143
|
+
var buf = "";
|
|
144
|
+
function onData(chunk) { buf += chunk.toString("utf8"); if (_isTerminal(buf)) done(); }
|
|
145
|
+
function onClose() { done(); }
|
|
146
|
+
function done() {
|
|
147
|
+
sock.removeListener("data", onData);
|
|
148
|
+
sock.removeListener("close", onClose);
|
|
149
|
+
sock.removeListener("error", onClose);
|
|
150
|
+
resolve(buf);
|
|
151
|
+
}
|
|
152
|
+
sock.on("data", onData);
|
|
153
|
+
sock.once("close", onClose);
|
|
154
|
+
sock.once("error", onClose);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// Attach the reader BEFORE writing so no response bytes are missed.
|
|
158
|
+
function _cmd(sock, line) {
|
|
159
|
+
var p = _read(sock);
|
|
160
|
+
sock.write(line + "\r\n");
|
|
161
|
+
return p;
|
|
162
|
+
}
|
|
163
|
+
function _connect(port) {
|
|
164
|
+
var sock = nodeNet.connect(port, "127.0.0.1");
|
|
165
|
+
sock.on("error", function () {});
|
|
166
|
+
return sock;
|
|
167
|
+
}
|
|
168
|
+
function _b64(s) { return Buffer.from(s, "utf8").toString("base64"); }
|
|
169
|
+
|
|
170
|
+
// ---- TLS + store fixtures ------------------------------------------------
|
|
171
|
+
|
|
172
|
+
async function _makeTestTlsContext() {
|
|
173
|
+
var ca = await b.mtlsEngine.generateCa({ name: "managesieve-test-ca" });
|
|
174
|
+
var leaf = await b.mtlsEngine.signClientCert({
|
|
175
|
+
cn: "managesieve.test", caCertPem: ca.caCertPem, caKeyPem: ca.caKeyPem,
|
|
176
|
+
usage: "server", sans: ["DNS:localhost", "IP:127.0.0.1"], validityDays: 1,
|
|
177
|
+
});
|
|
178
|
+
return { ctx: nodeTls.createSecureContext({ key: leaf.key, cert: leaf.cert }), caPem: ca.caCertPem };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// A SASL verify that decodes a base64 PLAIN blob (authzid NUL authcid NUL
|
|
182
|
+
// passwd) and accepts passwd === "good"; EXTERNAL always succeeds; a
|
|
183
|
+
// username of "throw" makes verify reject (exercises the catch path).
|
|
184
|
+
function _verify(mech, creds) {
|
|
185
|
+
if (mech === "EXTERNAL") return { ok: true, actor: { username: "ext", tenantId: "t-ext" } };
|
|
186
|
+
var cr = creds.clientResponse;
|
|
187
|
+
if (!cr) return { ok: false };
|
|
188
|
+
var parts = Buffer.from(cr, "base64").toString("utf8").split(NUL);
|
|
189
|
+
if (parts[1] === "throw") throw new Error("verify blew up");
|
|
190
|
+
return parts[2] === "good"
|
|
191
|
+
? { ok: true, actor: { username: parts[1], tenantId: "t1" } }
|
|
192
|
+
: { ok: false };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function _richStore() {
|
|
196
|
+
var listCall = 0;
|
|
197
|
+
return { sieveScripts: {
|
|
198
|
+
put: async function () { return; },
|
|
199
|
+
list: async function () {
|
|
200
|
+
listCall += 1;
|
|
201
|
+
// First call returns an array (with an ACTIVE entry + a name that
|
|
202
|
+
// needs quote-escaping); second call returns a non-array to exercise
|
|
203
|
+
// the `Array.isArray(...) ? ... : []` defensive branch.
|
|
204
|
+
return listCall === 1
|
|
205
|
+
? [{ name: 'a"b', active: true }, { name: "two", active: false }]
|
|
206
|
+
: null;
|
|
207
|
+
},
|
|
208
|
+
get: async function (actor, name) {
|
|
209
|
+
if (name === "exists") return { body: "keep;\r\n" }; // already CRLF-terminated
|
|
210
|
+
if (name === "nocrlf") return { body: "keep;" }; // server must append CRLF
|
|
211
|
+
return null; // NONEXISTENT
|
|
212
|
+
},
|
|
213
|
+
setActive: async function () { return; },
|
|
214
|
+
delete: async function () { return; },
|
|
215
|
+
rename: async function () { return; },
|
|
216
|
+
haveSpace: async function (actor, name) {
|
|
217
|
+
if (name === "full") return { ok: false, reason: "over quota" };
|
|
218
|
+
if (name === "noreason") return { ok: false }; // reason-less → "no space" fallback
|
|
219
|
+
return { ok: true };
|
|
220
|
+
},
|
|
221
|
+
} };
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function _rejectStore() {
|
|
225
|
+
function boom() { return Promise.reject(new Error("backend down")); }
|
|
226
|
+
return { sieveScripts: {
|
|
227
|
+
put: boom, list: boom, get: boom, setActive: boom, delete: boom, rename: boom, haveSpace: boom,
|
|
228
|
+
} };
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
var VALID_SIEVE = 'require ["fileinto"];\r\nkeep;\r\n';
|
|
232
|
+
var INVALID_SIEVE = 'require ["nope-cap"];\r\nkeep;\r\n'; // unknown capability → safeSieve rejects
|
|
233
|
+
|
|
234
|
+
// ==========================================================================
|
|
235
|
+
// 0. create() guard rails (drive the throw branches directly)
|
|
236
|
+
// ==========================================================================
|
|
237
|
+
function testCreateValidation() {
|
|
238
|
+
function caught(fn) { try { fn(); return null; } catch (e) { return e; } }
|
|
239
|
+
var e1 = caught(function () { b.mail.server.managesieve.create({ mailStore: _richStore() }); });
|
|
240
|
+
check("create refuses missing tlsContext", e1 && e1.code === "mail-server-managesieve/no-tls-context");
|
|
241
|
+
var e2 = caught(function () { b.mail.server.managesieve.create({ allowPlaintext: true }); });
|
|
242
|
+
check("create refuses missing mailStore", e2 && e2.code === "mail-server-managesieve/no-mail-store");
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// ==========================================================================
|
|
246
|
+
// 1. plaintext, no auth: dispatch + wrong-state + malformed + not-found
|
|
247
|
+
// ==========================================================================
|
|
248
|
+
async function testPlaintextNoAuth() {
|
|
249
|
+
var srv = b.mail.server.managesieve.create({
|
|
250
|
+
allowPlaintext: true, profile: "permissive", mailStore: _richStore(),
|
|
251
|
+
// no auth config → SASL "" advertised, AUTHENTICATE refused as not-configured
|
|
252
|
+
});
|
|
253
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
254
|
+
var sock = _connect(info.port);
|
|
255
|
+
try {
|
|
256
|
+
var greeting = await _read(sock);
|
|
257
|
+
check("greeting emits capability banner", /"IMPLEMENTATION" "blamejs"/.test(greeting));
|
|
258
|
+
check("greeting ends with OK ready", /OK "blamejs ManageSieve ready"/.test(greeting));
|
|
259
|
+
check("no-auth advertises empty SASL", /"SASL" ""/.test(greeting));
|
|
260
|
+
check("plaintext listener omits STARTTLS", !/"STARTTLS"/.test(greeting));
|
|
261
|
+
|
|
262
|
+
check("CAPABILITY re-emits banner + OK", /OK "Capability completed"/.test(await _cmd(sock, "CAPABILITY")));
|
|
263
|
+
check("NOOP → OK", /OK "NOOP completed"/.test(await _cmd(sock, "NOOP")));
|
|
264
|
+
check("NOOP with tag echoes TAG", /OK \(TAG "hi"\) "NOOP completed"/.test(await _cmd(sock, 'NOOP "hi"')));
|
|
265
|
+
check("STARTTLS unavailable w/o context", /NO "STARTTLS unavailable/.test(await _cmd(sock, "STARTTLS")));
|
|
266
|
+
check("AUTHENTICATE not configured", /NO "AUTHENTICATE not configured/.test(await _cmd(sock, 'AUTHENTICATE "EXTERNAL"')));
|
|
267
|
+
check("HAVESPACE before auth refused", /NO "AUTHENTICATE first"/.test(await _cmd(sock, 'HAVESPACE "s" 100')));
|
|
268
|
+
check("PUTSCRIPT before auth refused", /NO "AUTHENTICATE first"/.test(await _cmd(sock, 'PUTSCRIPT "s" {5+}')));
|
|
269
|
+
check("unknown verb refused (guard)", /NO "[^"]*unknown verb/.test(await _cmd(sock, "FLOOP")));
|
|
270
|
+
check("empty command line refused", /NO "[^"]*empty command line/.test(await _cmd(sock, "")));
|
|
271
|
+
check("LOGOUT → OK + close", /OK "Logout completed"/.test(await _cmd(sock, "LOGOUT")));
|
|
272
|
+
} finally { sock.destroy(); await srv.close(); }
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// ==========================================================================
|
|
276
|
+
// 2. STARTTLS upgrade + AUTHENTICATE state machine over TLS (strict)
|
|
277
|
+
// ==========================================================================
|
|
278
|
+
async function testStartTlsAndAuth() {
|
|
279
|
+
var tls = await _makeTestTlsContext();
|
|
280
|
+
var srv = b.mail.server.managesieve.create({
|
|
281
|
+
tlsContext: tls.ctx, profile: "strict", mailStore: _richStore(),
|
|
282
|
+
auth: { mechanisms: ["PLAIN", "EXTERNAL"], verify: async function (m, c) { return _verify(m, c); } },
|
|
283
|
+
});
|
|
284
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
285
|
+
var sock = _connect(info.port);
|
|
286
|
+
var tsock = null;
|
|
287
|
+
try {
|
|
288
|
+
var greeting = await _read(sock);
|
|
289
|
+
check("strict+TLS advertises STARTTLS", /"STARTTLS"/.test(greeting));
|
|
290
|
+
check("advertises configured SASL mechs", /"SASL" "PLAIN EXTERNAL"/.test(greeting));
|
|
291
|
+
|
|
292
|
+
check("PLAIN pre-TLS refused (cleartext)", /NO "[^"]*cleartext/.test(await _cmd(sock, 'AUTHENTICATE "PLAIN"')));
|
|
293
|
+
check("STARTTLS → begin negotiation", /OK "Begin TLS negotiation now"/.test(await _cmd(sock, "STARTTLS")));
|
|
294
|
+
|
|
295
|
+
tsock = nodeTls.connect({ socket: sock, ca: tls.caPem, servername: "localhost" });
|
|
296
|
+
tsock.on("error", function () {});
|
|
297
|
+
await new Promise(function (r, j) { tsock.once("secureConnect", r); tsock.once("error", j); });
|
|
298
|
+
|
|
299
|
+
check("post-TLS re-emits caps + success", /OK "TLS negotiation successful"/.test(await _read(tsock)));
|
|
300
|
+
check("STARTTLS again refused (already)", /NO "STARTTLS already negotiated"/.test(await _cmd(tsock, "STARTTLS")));
|
|
301
|
+
check("mechanism not advertised refused", /NO "Mechanism 'SCRAM-SHA-256' not advertised"/.test(await _cmd(tsock, 'AUTHENTICATE "SCRAM-SHA-256"')));
|
|
302
|
+
check("PLAIN w/o initial-response fails", /NO "Authentication failed"/.test(await _cmd(tsock, 'AUTHENTICATE "PLAIN"')));
|
|
303
|
+
|
|
304
|
+
// Synchronizing literal IR (bad creds) — server sends a bare OK
|
|
305
|
+
// continuation, then we stream the IR in two chunks to exercise the
|
|
306
|
+
// partial-literal drain branch.
|
|
307
|
+
var badIr = Buffer.from(_b64(NUL + "alice" + NUL + "bad"), "utf8");
|
|
308
|
+
var pCont = _read(tsock);
|
|
309
|
+
tsock.write('AUTHENTICATE "PLAIN" {' + badIr.length + '}\r\n');
|
|
310
|
+
check("sync literal → OK continuation", /^OK\r\n$/.test(await pCont));
|
|
311
|
+
var pAuth = _read(tsock);
|
|
312
|
+
tsock.write(badIr.subarray(0, 3));
|
|
313
|
+
await helpers.passiveObserve(40, "managesieve: auth-IR partial drain");
|
|
314
|
+
tsock.write(badIr.subarray(3));
|
|
315
|
+
check("bad creds → Authentication failed", /NO "Authentication failed"/.test(await pAuth));
|
|
316
|
+
|
|
317
|
+
// Non-synchronizing literal IR (LITERAL+, good creds) → success.
|
|
318
|
+
var goodIr = Buffer.from(_b64(NUL + "alice" + NUL + "good"), "utf8");
|
|
319
|
+
var pOk = _read(tsock);
|
|
320
|
+
tsock.write('AUTHENTICATE "PLAIN" {' + goodIr.length + '+}\r\n');
|
|
321
|
+
tsock.write(goodIr);
|
|
322
|
+
check("LITERAL+ good creds authenticates", /OK "Authenticated"/.test(await pOk));
|
|
323
|
+
|
|
324
|
+
check("AUTHENTICATE after auth refused", /NO "[^"]*NOT-AUTHENTICATED"/.test(await _cmd(tsock, 'AUTHENTICATE "PLAIN"')));
|
|
325
|
+
check("HAVESPACE over TLS → Have space", /OK "Have space"/.test(await _cmd(tsock, 'HAVESPACE "s" 100')));
|
|
326
|
+
check("post-auth CAPABILITY omits STARTTLS", !/"STARTTLS"/.test(await _cmd(tsock, "CAPABILITY")));
|
|
327
|
+
check("LOGOUT over TLS → OK", /OK "Logout completed"/.test(await _cmd(tsock, "LOGOUT")));
|
|
328
|
+
} finally { if (tsock) tsock.destroy(); sock.destroy(); await srv.close(); }
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// ==========================================================================
|
|
332
|
+
// 2b. STARTTLS handshake failure → starttls_handshake_failed + close
|
|
333
|
+
// ==========================================================================
|
|
334
|
+
async function testStartTlsHandshakeFailure() {
|
|
335
|
+
var tls = await _makeTestTlsContext();
|
|
336
|
+
var srv = b.mail.server.managesieve.create({
|
|
337
|
+
tlsContext: tls.ctx, profile: "strict", mailStore: _richStore(),
|
|
338
|
+
auth: { mechanisms: ["PLAIN"], verify: async function (m, c) { return _verify(m, c); } },
|
|
339
|
+
});
|
|
340
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
341
|
+
var sock = _connect(info.port);
|
|
342
|
+
try {
|
|
343
|
+
await _read(sock); // greeting
|
|
344
|
+
check("STARTTLS → begin negotiation", /OK "Begin TLS negotiation now"/.test(await _cmd(sock, "STARTTLS")));
|
|
345
|
+
var closed = false;
|
|
346
|
+
sock.once("close", function () { closed = true; });
|
|
347
|
+
// Feed bytes that are not a valid TLS ClientHello → the server's
|
|
348
|
+
// TLSSocket handshake errors → onError → close.
|
|
349
|
+
sock.write(Buffer.from([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]));
|
|
350
|
+
await helpers.waitUntil(function () { return closed; },
|
|
351
|
+
{ timeoutMs: 5000, label: "managesieve: STARTTLS handshake-failure closes connection" });
|
|
352
|
+
check("handshake failure tears down socket", closed === true);
|
|
353
|
+
} finally { sock.destroy(); await srv.close(); }
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// ==========================================================================
|
|
357
|
+
// 3. authenticated command handlers (happy + variants) over plaintext
|
|
358
|
+
// ==========================================================================
|
|
359
|
+
async function testAuthenticatedHandlers() {
|
|
360
|
+
var srv = b.mail.server.managesieve.create({
|
|
361
|
+
allowPlaintext: true, profile: "permissive", mailStore: _richStore(),
|
|
362
|
+
auth: { mechanisms: ["EXTERNAL"], verify: async function (m, c) { return _verify(m, c); } },
|
|
363
|
+
});
|
|
364
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
365
|
+
var sock = _connect(info.port);
|
|
366
|
+
try {
|
|
367
|
+
await _read(sock); // greeting
|
|
368
|
+
check("EXTERNAL (no IR) authenticates", /OK "Authenticated"/.test(await _cmd(sock, 'AUTHENTICATE "EXTERNAL"')));
|
|
369
|
+
|
|
370
|
+
check("HAVESPACE ok:true → Have space", /OK "Have space"/.test(await _cmd(sock, 'HAVESPACE "s" 100')));
|
|
371
|
+
check("HAVESPACE ok:false → QUOTA/MAXSIZE", /NO "\(QUOTA\/MAXSIZE\) over quota"/.test(await _cmd(sock, 'HAVESPACE "full" 100')));
|
|
372
|
+
check("HAVESPACE reason-less → no space", /NO "\(QUOTA\/MAXSIZE\) no space"/.test(await _cmd(sock, 'HAVESPACE "noreason" 100')));
|
|
373
|
+
|
|
374
|
+
// PUTSCRIPT via synchronizing literal, body streamed in two chunks
|
|
375
|
+
// (partial-literal drain branch), valid script → accepted.
|
|
376
|
+
var body = Buffer.from(VALID_SIEVE, "utf8");
|
|
377
|
+
var pCont = _read(sock);
|
|
378
|
+
sock.write('PUTSCRIPT "v" {' + body.length + '}\r\n');
|
|
379
|
+
check("PUTSCRIPT sync → OK continuation", /^OK\r\n$/.test(await pCont));
|
|
380
|
+
var pPut = _read(sock);
|
|
381
|
+
sock.write(body.subarray(0, 6));
|
|
382
|
+
await helpers.passiveObserve(40, "managesieve: putscript partial drain");
|
|
383
|
+
sock.write(body.subarray(6));
|
|
384
|
+
check("PUTSCRIPT valid script accepted", /OK "PUTSCRIPT completed"/.test(await pPut));
|
|
385
|
+
|
|
386
|
+
// PUTSCRIPT via LITERAL+ with an invalid script → refused.
|
|
387
|
+
var bad = Buffer.from(INVALID_SIEVE, "utf8");
|
|
388
|
+
var pBad = _read(sock);
|
|
389
|
+
sock.write('PUTSCRIPT "bad" {' + bad.length + '+}\r\n');
|
|
390
|
+
sock.write(bad);
|
|
391
|
+
check("PUTSCRIPT invalid script refused", /NO "Script validation failed/.test(await pBad));
|
|
392
|
+
|
|
393
|
+
var listReply = await _cmd(sock, "LISTSCRIPTS");
|
|
394
|
+
check("LISTSCRIPTS lists + ACTIVE flag", /"a\\"b" ACTIVE\r\n"two"\r\nOK "LISTSCRIPTS completed"/.test(listReply));
|
|
395
|
+
check("LISTSCRIPTS non-array → OK count-0", /OK "LISTSCRIPTS completed"/.test(await _cmd(sock, "LISTSCRIPTS")));
|
|
396
|
+
|
|
397
|
+
check("SETACTIVE name → OK", /OK "SETACTIVE completed"/.test(await _cmd(sock, 'SETACTIVE "s"')));
|
|
398
|
+
check("SETACTIVE empty (deactivate) → OK", /OK "SETACTIVE completed"/.test(await _cmd(sock, 'SETACTIVE ""')));
|
|
399
|
+
|
|
400
|
+
var g1 = await _cmd(sock, 'GETSCRIPT "exists"');
|
|
401
|
+
check("GETSCRIPT returns literal + body", /\{7\}\r\nkeep;\r\nOK "GETSCRIPT completed"/.test(g1));
|
|
402
|
+
var g2 = await _cmd(sock, 'GETSCRIPT "nocrlf"');
|
|
403
|
+
check("GETSCRIPT appends CRLF when absent", /\{5\}\r\nkeep;\r\nOK "GETSCRIPT completed"/.test(g2));
|
|
404
|
+
check("GETSCRIPT missing → NONEXISTENT", /NO "\(NONEXISTENT\) Script not found"/.test(await _cmd(sock, 'GETSCRIPT "missing"')));
|
|
405
|
+
|
|
406
|
+
check("DELETESCRIPT → OK", /OK "DELETESCRIPT completed"/.test(await _cmd(sock, 'DELETESCRIPT "s"')));
|
|
407
|
+
check("RENAMESCRIPT → OK", /OK "RENAMESCRIPT completed"/.test(await _cmd(sock, 'RENAMESCRIPT "a" "bb"')));
|
|
408
|
+
check("NOOP authenticated → OK", /OK "NOOP completed"/.test(await _cmd(sock, "NOOP")));
|
|
409
|
+
check("STARTTLS post-auth → pre-AUTH only", /NO "STARTTLS only valid pre-AUTH/.test(await _cmd(sock, "STARTTLS")));
|
|
410
|
+
check("LOGOUT → OK", /OK "Logout completed"/.test(await _cmd(sock, "LOGOUT")));
|
|
411
|
+
} finally { sock.destroy(); await srv.close(); }
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// ==========================================================================
|
|
415
|
+
// 4. backend-failure branches — every handler's .catch → NO
|
|
416
|
+
// ==========================================================================
|
|
417
|
+
async function testBackendFailures() {
|
|
418
|
+
var srv = b.mail.server.managesieve.create({
|
|
419
|
+
allowPlaintext: true, profile: "permissive", mailStore: _rejectStore(),
|
|
420
|
+
auth: { mechanisms: ["EXTERNAL"], verify: async function (m, c) { return _verify(m, c); } },
|
|
421
|
+
});
|
|
422
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
423
|
+
var sock = _connect(info.port);
|
|
424
|
+
try {
|
|
425
|
+
await _read(sock);
|
|
426
|
+
await _cmd(sock, 'AUTHENTICATE "EXTERNAL"');
|
|
427
|
+
check("HAVESPACE backend reject → NO", /NO "backend down"/.test(await _cmd(sock, 'HAVESPACE "s" 100')));
|
|
428
|
+
|
|
429
|
+
var body = Buffer.from(VALID_SIEVE, "utf8");
|
|
430
|
+
var pPut = _read(sock);
|
|
431
|
+
sock.write('PUTSCRIPT "v" {' + body.length + '+}\r\n');
|
|
432
|
+
sock.write(body);
|
|
433
|
+
check("PUTSCRIPT put reject → NO", /NO "backend down"/.test(await pPut));
|
|
434
|
+
|
|
435
|
+
check("LISTSCRIPTS backend reject → NO", /NO "backend down"/.test(await _cmd(sock, "LISTSCRIPTS")));
|
|
436
|
+
check("SETACTIVE backend reject → NO", /NO "backend down"/.test(await _cmd(sock, 'SETACTIVE "s"')));
|
|
437
|
+
check("GETSCRIPT backend reject → NO", /NO "backend down"/.test(await _cmd(sock, 'GETSCRIPT "s"')));
|
|
438
|
+
check("DELETESCRIPT backend reject → NO", /NO "backend down"/.test(await _cmd(sock, 'DELETESCRIPT "s"')));
|
|
439
|
+
check("RENAMESCRIPT backend reject → NO", /NO "backend down"/.test(await _cmd(sock, 'RENAMESCRIPT "a" "bb"')));
|
|
440
|
+
} finally { sock.destroy(); await srv.close(); }
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// ==========================================================================
|
|
444
|
+
// 5. AUTH failure branch + verify-throw catch + AUTH-failure rate limit
|
|
445
|
+
// ==========================================================================
|
|
446
|
+
async function testAuthFailureRateLimit() {
|
|
447
|
+
var srv = b.mail.server.managesieve.create({
|
|
448
|
+
allowPlaintext: true, profile: "permissive", mailStore: _richStore(),
|
|
449
|
+
rateLimit: { authFailuresPerIpPer15Min: 2 },
|
|
450
|
+
auth: { mechanisms: ["PLAIN"], verify: async function (m, c) { return _verify(m, c); } },
|
|
451
|
+
});
|
|
452
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
453
|
+
var sock = _connect(info.port);
|
|
454
|
+
try {
|
|
455
|
+
await _read(sock);
|
|
456
|
+
async function authPlain(blob) {
|
|
457
|
+
var ir = Buffer.from(_b64(blob), "utf8");
|
|
458
|
+
var p = _read(sock);
|
|
459
|
+
sock.write('AUTHENTICATE "PLAIN" {' + ir.length + '+}\r\n');
|
|
460
|
+
sock.write(ir);
|
|
461
|
+
return p;
|
|
462
|
+
}
|
|
463
|
+
check("bad creds → verify-fail branch", /NO "Authentication failed"/.test(await authPlain(NUL + "u" + NUL + "bad")));
|
|
464
|
+
check("verify throw → catch → failed", /NO "Authentication failed"/.test(await authPlain(NUL + "throw" + NUL + "x")));
|
|
465
|
+
check("AUTH-failure budget exhausted → NO", /NO "Too many AUTH failures from your IP"/.test(await authPlain(NUL + "u" + NUL + "bad")));
|
|
466
|
+
} finally { sock.destroy(); await srv.close(); }
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// ==========================================================================
|
|
470
|
+
// 6. per-IP concurrent-connection rate limit (admitConnection refusal)
|
|
471
|
+
// ==========================================================================
|
|
472
|
+
async function testConnectionRateLimit() {
|
|
473
|
+
var srv = b.mail.server.managesieve.create({
|
|
474
|
+
allowPlaintext: true, profile: "permissive", mailStore: _richStore(),
|
|
475
|
+
rateLimit: { maxConcurrentConnectionsPerIp: 1 },
|
|
476
|
+
});
|
|
477
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
478
|
+
var first = _connect(info.port);
|
|
479
|
+
var second = null;
|
|
480
|
+
try {
|
|
481
|
+
await _read(first); // holds the single concurrent slot open
|
|
482
|
+
second = _connect(info.port);
|
|
483
|
+
check("2nd concurrent connection refused", /NO "Too many connections from your IP"/.test(await _read(second)));
|
|
484
|
+
} finally { first.destroy(); if (second) second.destroy(); await srv.close(); }
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// ==========================================================================
|
|
488
|
+
// 7. line-too-long (no CRLF, exceeds cap) → NO + close
|
|
489
|
+
// ==========================================================================
|
|
490
|
+
async function testLineTooLong() {
|
|
491
|
+
var srv = b.mail.server.managesieve.create({
|
|
492
|
+
allowPlaintext: true, profile: "permissive", mailStore: _richStore(),
|
|
493
|
+
maxLineBytes: b.constants.BYTES.bytes(64),
|
|
494
|
+
});
|
|
495
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
496
|
+
var sock = _connect(info.port);
|
|
497
|
+
try {
|
|
498
|
+
await _read(sock);
|
|
499
|
+
var p = _read(sock);
|
|
500
|
+
sock.write(new Array(200).join("A")); // 199 bytes, no CRLF → exceeds 64-byte cap
|
|
501
|
+
check("overlong line (no CRLF) → NO", /NO "Line too long/.test(await p));
|
|
502
|
+
} finally { sock.destroy(); await srv.close(); }
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// ==========================================================================
|
|
506
|
+
// 8. idle timeout → BYE + close
|
|
507
|
+
// ==========================================================================
|
|
508
|
+
async function testIdleTimeout() {
|
|
509
|
+
var srv = b.mail.server.managesieve.create({
|
|
510
|
+
// profile omitted → exercises the `opts.profile || "strict"` default
|
|
511
|
+
allowPlaintext: true, mailStore: _richStore(),
|
|
512
|
+
idleTimeoutMs: b.constants.TIME.seconds(0.3),
|
|
513
|
+
});
|
|
514
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
515
|
+
var sock = _connect(info.port);
|
|
516
|
+
try {
|
|
517
|
+
await _read(sock); // greeting
|
|
518
|
+
check("idle timeout emits BYE", /BYE "Idle timeout"/.test(await _read(sock)));
|
|
519
|
+
} finally { sock.destroy(); await srv.close(); }
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// ==========================================================================
|
|
523
|
+
// 9. handler faults — sync throw (handler_threw) + async reject
|
|
524
|
+
// (handler_rejected) via operator overrides
|
|
525
|
+
// ==========================================================================
|
|
526
|
+
async function testHandlerFaults() {
|
|
527
|
+
var budget = { maxHandlerBytes: b.constants.BYTES.kib(8), maxHandlerMs: b.constants.TIME.seconds(5) };
|
|
528
|
+
var srv = b.mail.server.managesieve.create({
|
|
529
|
+
allowPlaintext: true, profile: "permissive", mailStore: _richStore(),
|
|
530
|
+
overrides: {
|
|
531
|
+
NOOP: { fn: function () { throw new Error("sync boom"); },
|
|
532
|
+
maxHandlerBytes: budget.maxHandlerBytes, maxHandlerMs: budget.maxHandlerMs },
|
|
533
|
+
CAPABILITY: { fn: function () { return Promise.reject(new Error("async boom")); },
|
|
534
|
+
maxHandlerBytes: budget.maxHandlerBytes, maxHandlerMs: budget.maxHandlerMs },
|
|
535
|
+
},
|
|
536
|
+
});
|
|
537
|
+
var info = await srv.listen({ port: 0, address: "127.0.0.1" });
|
|
538
|
+
var sock = _connect(info.port);
|
|
539
|
+
try {
|
|
540
|
+
await _read(sock);
|
|
541
|
+
check("handler sync-throw → Internal error", /NO "Internal error"/.test(await _cmd(sock, "NOOP")));
|
|
542
|
+
check("handler async-reject → Internal error",/NO "Internal error"/.test(await _cmd(sock, "CAPABILITY")));
|
|
543
|
+
} finally { sock.destroy(); await srv.close(); }
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
async function run() {
|
|
115
547
|
testSurface();
|
|
116
548
|
testRequiresTlsContext();
|
|
117
549
|
testAllowPlaintextOpt();
|
|
@@ -120,13 +552,24 @@ function run() {
|
|
|
120
552
|
testBadBoundsRefused();
|
|
121
553
|
testRefusesNonObjectOpts();
|
|
122
554
|
testHandleSurface();
|
|
555
|
+
testCreateValidation();
|
|
556
|
+
await testPlaintextNoAuth();
|
|
557
|
+
await testStartTlsAndAuth();
|
|
558
|
+
await testStartTlsHandshakeFailure();
|
|
559
|
+
await testAuthenticatedHandlers();
|
|
560
|
+
await testBackendFailures();
|
|
561
|
+
await testAuthFailureRateLimit();
|
|
562
|
+
await testConnectionRateLimit();
|
|
563
|
+
await testLineTooLong();
|
|
564
|
+
await testIdleTimeout();
|
|
565
|
+
await testHandlerFaults();
|
|
123
566
|
}
|
|
124
567
|
|
|
125
568
|
module.exports = { run: run };
|
|
126
569
|
|
|
127
570
|
if (require.main === module) {
|
|
128
|
-
|
|
129
|
-
|
|
571
|
+
run().then(
|
|
572
|
+
function () { console.log("[mail-server-managesieve] OK — " + helpers.getChecks() + " checks"); },
|
|
573
|
+
function (e) { process.stderr.write("FAIL: " + (e && e.stack || e) + "\n"); process.exit(1); }
|
|
574
|
+
);
|
|
130
575
|
}
|
|
131
|
-
|
|
132
|
-
void helpers;
|