@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.
Files changed (521) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/lib/asset-manifest.json +1 -1
  3. package/lib/vendor/MANIFEST.json +632 -416
  4. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
  5. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
  6. package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
  7. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
  8. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
  9. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
  10. package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
  11. package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
  12. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
  13. package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
  14. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
  15. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
  16. package/lib/vendor/blamejs/.gitignore +2 -0
  17. package/lib/vendor/blamejs/CHANGELOG.md +122 -0
  18. package/lib/vendor/blamejs/NOTICE +26 -1
  19. package/lib/vendor/blamejs/SECURITY.md +1 -1
  20. package/lib/vendor/blamejs/api-snapshot.json +207 -5
  21. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
  22. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
  23. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
  24. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
  25. package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
  26. package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
  27. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
  28. package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
  29. package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
  30. package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
  31. package/lib/vendor/blamejs/index.js +6 -0
  32. package/lib/vendor/blamejs/lib/a2a.js +4 -4
  33. package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
  34. package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
  35. package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
  36. package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
  37. package/lib/vendor/blamejs/lib/archive-read.js +8 -0
  38. package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
  39. package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
  40. package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
  41. package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
  42. package/lib/vendor/blamejs/lib/audit.js +71 -8
  43. package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
  44. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
  45. package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
  46. package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
  47. package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
  48. package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
  49. package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
  50. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
  51. package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
  52. package/lib/vendor/blamejs/lib/backup/index.js +16 -5
  53. package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
  54. package/lib/vendor/blamejs/lib/base32.js +21 -0
  55. package/lib/vendor/blamejs/lib/break-glass.js +19 -10
  56. package/lib/vendor/blamejs/lib/bundler.js +5 -1
  57. package/lib/vendor/blamejs/lib/cache-status.js +3 -7
  58. package/lib/vendor/blamejs/lib/calendar.js +21 -1
  59. package/lib/vendor/blamejs/lib/cbor.js +12 -1
  60. package/lib/vendor/blamejs/lib/cert.js +29 -11
  61. package/lib/vendor/blamejs/lib/cli.js +94 -24
  62. package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
  63. package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
  64. package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
  65. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
  66. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
  67. package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
  68. package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
  69. package/lib/vendor/blamejs/lib/content-digest.js +2 -1
  70. package/lib/vendor/blamejs/lib/cookies.js +13 -3
  71. package/lib/vendor/blamejs/lib/cose.js +31 -16
  72. package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
  73. package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
  74. package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
  75. package/lib/vendor/blamejs/lib/crypto.js +314 -19
  76. package/lib/vendor/blamejs/lib/csp.js +11 -3
  77. package/lib/vendor/blamejs/lib/daemon.js +270 -24
  78. package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
  79. package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
  80. package/lib/vendor/blamejs/lib/db-query.js +34 -7
  81. package/lib/vendor/blamejs/lib/db.js +18 -6
  82. package/lib/vendor/blamejs/lib/dbsc.js +17 -0
  83. package/lib/vendor/blamejs/lib/dev.js +21 -2
  84. package/lib/vendor/blamejs/lib/dsr.js +157 -102
  85. package/lib/vendor/blamejs/lib/external-db.js +41 -2
  86. package/lib/vendor/blamejs/lib/file-upload.js +25 -7
  87. package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
  88. package/lib/vendor/blamejs/lib/forms.js +113 -27
  89. package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
  90. package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
  91. package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
  92. package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
  93. package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
  94. package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
  95. package/lib/vendor/blamejs/lib/guard-html.js +26 -53
  96. package/lib/vendor/blamejs/lib/guard-image.js +24 -5
  97. package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
  98. package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
  99. package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
  100. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
  101. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
  102. package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
  103. package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
  104. package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
  105. package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
  106. package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
  107. package/lib/vendor/blamejs/lib/guard-time.js +1 -1
  108. package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
  109. package/lib/vendor/blamejs/lib/html-balance.js +3 -3
  110. package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
  111. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
  112. package/lib/vendor/blamejs/lib/http-client.js +39 -7
  113. package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
  114. package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
  115. package/lib/vendor/blamejs/lib/i18n.js +35 -21
  116. package/lib/vendor/blamejs/lib/incident-report.js +8 -1
  117. package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
  118. package/lib/vendor/blamejs/lib/json-path.js +23 -1
  119. package/lib/vendor/blamejs/lib/jwk.js +20 -3
  120. package/lib/vendor/blamejs/lib/link-header.js +2 -1
  121. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
  122. package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
  123. package/lib/vendor/blamejs/lib/log-stream.js +8 -3
  124. package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
  125. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  126. package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
  127. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
  128. package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
  129. package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
  130. package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
  131. package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
  132. package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
  133. package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
  134. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
  135. package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
  136. package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
  137. package/lib/vendor/blamejs/lib/mail.js +15 -5
  138. package/lib/vendor/blamejs/lib/metrics.js +268 -63
  139. package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
  140. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
  141. package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
  142. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
  143. package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
  144. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
  145. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
  146. package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
  147. package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
  148. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
  149. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
  150. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
  151. package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
  152. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
  153. package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
  154. package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
  155. package/lib/vendor/blamejs/lib/network-dns.js +21 -2
  156. package/lib/vendor/blamejs/lib/network-tls.js +69 -7
  157. package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
  158. package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
  159. package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
  160. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
  161. package/lib/vendor/blamejs/lib/outbox.js +1 -1
  162. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
  163. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
  164. package/lib/vendor/blamejs/lib/permissions.js +6 -3
  165. package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
  166. package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
  167. package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
  168. package/lib/vendor/blamejs/lib/pubsub.js +20 -9
  169. package/lib/vendor/blamejs/lib/queue-local.js +8 -1
  170. package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
  171. package/lib/vendor/blamejs/lib/redact.js +54 -0
  172. package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
  173. package/lib/vendor/blamejs/lib/restore.js +19 -0
  174. package/lib/vendor/blamejs/lib/retention.js +12 -4
  175. package/lib/vendor/blamejs/lib/router.js +60 -6
  176. package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
  177. package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
  178. package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
  179. package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
  180. package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
  181. package/lib/vendor/blamejs/lib/safe-object.js +80 -0
  182. package/lib/vendor/blamejs/lib/safe-path.js +52 -4
  183. package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
  184. package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
  185. package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
  186. package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
  187. package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
  188. package/lib/vendor/blamejs/lib/scheduler.js +8 -1
  189. package/lib/vendor/blamejs/lib/security-assert.js +6 -6
  190. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
  191. package/lib/vendor/blamejs/lib/self-update.js +517 -87
  192. package/lib/vendor/blamejs/lib/server-timing.js +2 -4
  193. package/lib/vendor/blamejs/lib/session.js +34 -12
  194. package/lib/vendor/blamejs/lib/sql.js +15 -1
  195. package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
  196. package/lib/vendor/blamejs/lib/static.js +55 -13
  197. package/lib/vendor/blamejs/lib/storage.js +8 -2
  198. package/lib/vendor/blamejs/lib/subject.js +6 -1
  199. package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
  200. package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
  201. package/lib/vendor/blamejs/lib/tsa.js +34 -13
  202. package/lib/vendor/blamejs/lib/uri-template.js +8 -1
  203. package/lib/vendor/blamejs/lib/vault/index.js +13 -0
  204. package/lib/vendor/blamejs/lib/vc.js +44 -5
  205. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
  206. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
  207. package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
  208. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
  209. package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
  210. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
  211. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
  212. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
  213. package/lib/vendor/blamejs/lib/watcher.js +89 -17
  214. package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
  215. package/lib/vendor/blamejs/lib/webhook.js +12 -2
  216. package/lib/vendor/blamejs/lib/ws-client.js +32 -1
  217. package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
  218. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
  219. package/lib/vendor/blamejs/package-lock.json +2 -2
  220. package/lib/vendor/blamejs/package.json +1 -1
  221. package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
  222. package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
  223. package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
  224. package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
  225. package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
  226. package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
  227. package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
  228. package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
  229. package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
  230. package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
  231. package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
  232. package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
  233. package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
  234. package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
  235. package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
  236. package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
  237. package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
  238. package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
  239. package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
  240. package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
  241. package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
  242. package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
  243. package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
  244. package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
  245. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
  246. package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
  247. package/lib/vendor/blamejs/socket.yml +94 -0
  248. package/lib/vendor/blamejs/test/00-primitives.js +605 -0
  249. package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
  250. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
  251. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
  252. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
  253. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
  254. package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
  255. package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
  256. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
  257. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
  258. package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
  259. package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
  260. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
  262. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
  263. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
  264. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
  267. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
  268. package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
  269. package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
  270. package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
  271. package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
  275. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
  276. package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
  277. package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
  278. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
  282. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
  283. package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
  284. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
  285. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
  286. package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
  287. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
  288. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
  293. package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
  294. package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
  295. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
  296. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
  302. package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
  303. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
  307. package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
  308. package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
  309. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
  315. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
  317. package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
  318. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
  319. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
  320. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
  321. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
  322. package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
  323. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
  324. package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
  325. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
  326. package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
  327. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
  328. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
  329. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
  330. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
  331. package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
  332. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
  333. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
  334. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
  335. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
  336. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
  337. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
  338. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
  339. package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
  340. package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
  341. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
  342. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
  343. package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
  344. package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
  345. package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
  346. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
  347. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
  348. package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
  349. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
  350. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
  351. package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
  352. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  353. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
  354. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
  355. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
  356. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
  357. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
  358. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
  359. package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
  360. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
  361. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
  362. package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
  363. package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
  364. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
  365. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
  366. package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
  367. package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
  368. package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
  369. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
  370. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
  371. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
  372. package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
  373. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
  374. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
  375. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
  376. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
  377. package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
  378. package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
  379. package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
  380. package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
  381. package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
  382. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
  383. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  384. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
  385. package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
  386. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
  387. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
  388. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
  389. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
  390. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
  391. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
  392. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
  393. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
  394. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
  395. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
  396. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
  397. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
  398. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
  399. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
  400. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
  401. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
  402. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
  403. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
  404. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
  405. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
  406. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
  407. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
  408. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
  409. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
  410. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
  411. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
  412. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
  413. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
  414. package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
  415. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
  416. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
  417. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
  418. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
  419. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
  420. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
  421. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
  422. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
  423. package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
  424. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
  425. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
  426. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
  427. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
  428. package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
  429. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
  430. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
  431. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
  432. package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
  433. package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
  434. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
  435. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
  436. package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
  437. package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
  438. package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
  439. package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
  440. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
  441. package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
  442. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
  443. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
  444. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
  445. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
  446. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
  447. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
  448. package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
  449. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
  450. package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
  451. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
  452. package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
  453. package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
  454. package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
  455. package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
  456. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
  457. package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
  458. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
  459. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
  460. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
  461. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
  462. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
  463. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
  464. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
  465. package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
  466. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
  467. package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
  468. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
  469. package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
  470. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
  471. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
  472. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
  473. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
  474. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
  475. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
  476. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
  477. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
  478. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
  479. package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
  480. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
  481. package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
  482. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
  483. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
  484. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
  485. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
  486. package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
  487. package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
  488. package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
  489. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
  490. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
  491. package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
  492. package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
  493. package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
  494. package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
  495. package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
  496. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
  497. package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
  498. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
  499. package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
  500. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
  501. package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
  502. package/lib/vendor/blamejs/test/smoke.js +2 -0
  503. package/package.json +1 -1
  504. package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
  505. package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
  506. package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
  507. package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
  508. package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
  509. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
  510. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
  511. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
  512. package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
  513. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
  514. package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
  515. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
  516. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
  517. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
  518. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
  519. package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
  520. package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
  521. 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 += ' reason="' + r.reason.replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"';
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); returns
2872
- // "temperror" on ENODATA / ENOTFOUND / lookup failure (the receiver
2873
- // retries on transient DNS faults). Pure-DNS no operator state.
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
- if (fcode === "ETIMEOUT" || fcode === "ESERVFAIL") {
2954
- return { result: "temperror", ip: ip,
2955
- ptr: ptr, forward: [], fcrdns: false,
2956
- explanation: "forward lookup transient failure: " + fcode };
2957
- }
2958
- // Anything else propagate as temperror; Node DNS surfaces some
2959
- // non-RFC error codes via the platform resolver. Permerror only
2960
- // for definitive negative answers above.
2961
- throw new MailAuthError("mail-auth/iprev-temperror",
2962
- "iprev.verify: forward lookup of " + ptr + " threw: " +
2963
- ((e && e.message) || String(e)));
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
- var ipLc = ip.toLowerCase();
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
- if (String(forward[i]).toLowerCase() === ipLc) { fcrdns = true; break; }
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[name]) {
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" || keyType === "rsa-pss") {
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
- if (parsed.pubAlg === PUB_ALG_RSA && !(keyType === "rsa" || keyType === "rsa-pss")) {
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
- var rsaMpi = _readMpi(parsed.sigMpisBytes, 0);
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
- var rMpi = _readMpi(parsed.sigMpisBytes, 0);
894
- var sMpi = _readMpi(parsed.sigMpisBytes, rMpi.next);
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
- if (off >= envelope.length) {
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
- try { decoded.push(decodeURIComponent(segs[i])); }
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
- return _refuseStatus(res, 500, "Server error");
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
- return _refuseStatus(res, 500, "Server error");
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 trailing CRLF
406
- // per RFC 6376 §3.7.
407
- var dkimHeaderForSigning = canonHeader === "simple"
408
- ? _canonHeaderSimple("DKIM-Signature", " " + unsignedSigValue)
409
- : _canonHeaderRelaxed("DKIM-Signature", unsignedSigValue);
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
- var dkimHeaderLine = _foldSignatureHeader(finalSigValue) + "\r\n";
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: raw 32-byte key
615
- // OR SPKI DER. Wrap in PEM markers so node:crypto.createPublicKey
616
- // accepts it.
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
- // For the ARC reuse the header on the wire is ARC-Message-Signature, signed
809
- // under that name; the synthetic renames it to DKIM-Signature only so this
810
- // verifier finds it, so the canonical form must restore the real name or the
811
- // b= value never matches what the relay signed.
812
- var sigCanonName = verifyOpts.arcAmsReuse ? "ARC-Message-Signature" : "DKIM-Signature";
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, " " + unsignedSigValue).replace(/\r\n$/, "")
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
- // Default is "rsa" when absent. If the key's k= disagrees with the
1073
- // signature's a= family, the operator who published the key intends
1074
- // a different algorithm; refuse rather than guess.
1075
- if (keyTags.k !== undefined) {
1076
- var kFamily = String(keyTags.k).toLowerCase();
1077
- var sigFamily = String(alg || "").toLowerCase().split("-")[0];
1078
- if (kFamily !== sigFamily) {
1079
- results.push({ d: d, s: s, alg: alg, result: "permerror",
1080
- errors: ["DKIM key k=" + kFamily + " does not match signature a=" + alg + " (RFC 6376 §3.6.1)"] });
1081
- continue;
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
- var pBase64 = Buffer.from(keyPair.publicKey).toString("base64");
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
- if (LOCALHOST_REFUSED[lower]) {
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)",