@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
@@ -1,671 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // Copyright (c) blamejs contributors
3
- "use strict";
4
- /**
5
- * b.auth.saml.sp — branch-coverage sweep for the SAML 2.0 SP primitive.
6
- *
7
- * The existing SAML suites cover the SubjectConfirmation NotBefore /
8
- * NotOnOrAfter fail-closed windows, the SLO HTTP-Redirect signing round-trip,
9
- * and the MDQ signature-wrapping defense. This file closes the remaining
10
- * unit-testable branches driven through the shipped consumer path
11
- * (b.auth.saml.sp.create + the returned SP methods, b.auth.saml.fetchMdq):
12
- *
13
- * - create() config-time validation (missing required fields, unknown opt,
14
- * bad clockSkew) — each throws through the AuthError codes it advertises;
15
- * - buildAuthnRequest / metadata XML-attribute escaping (RFC 3741) so a
16
- * hostile ACS / entityId / nameIdFormat cannot break out of its context;
17
- * - verifyResponse pre-signature structural refusals: non-string / non-XML
18
- * input, wrong root, non-Success Status, the XSW duplicate-element shapes
19
- * (Status / StatusCode / Assertion / EncryptedAssertion), the unsigned
20
- * refusal, and EncryptedAssertion-without-SP-key;
21
- * - verifyResponse signed-path refusals that fire only after XMLDSig
22
- * verification succeeds (wrong Issuer, audience-confusion, expired
23
- * Conditions, the duplicate-Subject XSW), plus the happy path returning
24
- * nameId / sessionIndex / attributes;
25
- * - the SLO redirect + HTTP-POST + SOAP build/parse validation surface.
26
- *
27
- * Signed fixtures mint a self-signed RSA IdP cert and compute the digest +
28
- * SignatureValue through the framework's own b.xmlC14n so verifyResponse's
29
- * recomputation matches exactly — there is no test bypass of the signature
30
- * check (a wrong-key negative control proves the signature gate is live).
31
- */
32
-
33
- var helpers = require("../helpers");
34
- var check = helpers.check;
35
- var b = helpers.b;
36
- var nodeCrypto = require("node:crypto");
37
- var c14n = require("../../lib/xml-c14n");
38
- var pq = require("../../lib/pqc-software");
39
-
40
- var DS = "http://www.w3.org/2000/09/xmldsig#";
41
- var EXC = "http://www.w3.org/2001/10/xml-exc-c14n#";
42
-
43
- var IDP_ENTITY_ID = "https://idp.example";
44
- var SP_ENTITY_ID = "https://sp.example";
45
- var ACS_URL = "https://sp.example/saml/acs";
46
- var IDP_SSO_URL = "https://idp.example/sso";
47
- var IDP_SLO_URL = "https://idp.example/slo";
48
- var FAKE_CERT = "-----BEGIN CERTIFICATE-----\nx\n-----END CERTIFICATE-----";
49
-
50
- var BEARER = "urn:oasis:names:tc:SAML:2.0:cm:bearer";
51
- var SUCCESS = "urn:oasis:names:tc:SAML:2.0:status:Success";
52
-
53
- function iso(ms) { return new Date(Date.now() + ms).toISOString(); }
54
- function b64(xml) { return Buffer.from(xml, "utf8").toString("base64"); }
55
-
56
- // Mint a self-signed RSA cert via the vendored @peculiar/x509 bundle — the
57
- // same shape the SubjectConfirmation / MDQ suites use. verifyResponse parses
58
- // idpCertPem with nodeCrypto.createPublicKey and verifies an rsa-sha256 PKCS1
59
- // signature, so a real RSA keypair is required.
60
- async function _mintRsaCert(cn) {
61
- var pki = require("../../lib/vendor/pki.cjs");
62
- var x509 = pki.x509;
63
- var keys = await nodeCrypto.webcrypto.subtle.generateKey(
64
- { name: "RSASSA-PKCS1-v1_5", modulusLength: 2048, // allow:raw-byte-literal — RFC 8301 §3.1 RSA bit floor
65
- publicExponent: new Uint8Array([1, 0, 1]), hash: "SHA-256" },
66
- true, ["sign", "verify"]);
67
- var now = new Date();
68
- var cert = await x509.X509CertificateGenerator.createSelfSigned({
69
- serialNumber: "01",
70
- name: "CN=" + cn,
71
- notBefore: now,
72
- notAfter: new Date(now.getTime() + 365 * 24 * 3600 * 1000), // allow:raw-time-literal — 1y fixture validity
73
- signingAlgorithm: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
74
- keys: keys,
75
- });
76
- var pkcs8 = await nodeCrypto.webcrypto.subtle.exportKey("pkcs8", keys.privateKey);
77
- var keyPem = "-----BEGIN PRIVATE KEY-----\n" +
78
- Buffer.from(pkcs8).toString("base64").match(/.{1,64}/g).join("\n") +
79
- "\n-----END PRIVATE KEY-----\n";
80
- return { certPem: cert.toString("pem"), keyPem: keyPem };
81
- }
82
-
83
- // An SP with a placeholder cert — for branches that throw BEFORE any real
84
- // signature verification (all the input-validation / XSW-structural refusals),
85
- // where idpCertPem is stored but never parsed.
86
- function _fakeSp(extra) {
87
- var opts = {
88
- entityId: SP_ENTITY_ID,
89
- assertionConsumerServiceUrl: ACS_URL,
90
- idpEntityId: IDP_ENTITY_ID,
91
- idpSsoUrl: IDP_SSO_URL,
92
- idpSloUrl: IDP_SLO_URL,
93
- idpCertPem: FAKE_CERT,
94
- };
95
- if (extra) { for (var k in extra) { opts[k] = extra[k]; } }
96
- return b.auth.saml.sp.create(opts);
97
- }
98
-
99
- // An SP whose trust anchor is a minted RSA cert — for the signed-path branches.
100
- function _realSp(idp, extra) {
101
- var opts = {
102
- entityId: SP_ENTITY_ID,
103
- assertionConsumerServiceUrl: ACS_URL,
104
- idpEntityId: IDP_ENTITY_ID,
105
- idpSsoUrl: IDP_SSO_URL,
106
- idpCertPem: idp.certPem,
107
- };
108
- if (extra) { for (var k in extra) { opts[k] = extra[k]; } }
109
- return b.auth.saml.sp.create(opts);
110
- }
111
-
112
- function _codeOf(fn) {
113
- try { fn(); return "NO-THROW"; }
114
- catch (e) { return e.code || e.message; }
115
- }
116
- function _verifyCode(sp, xmlB64, vopts) {
117
- return _codeOf(function () { sp.verifyResponse(xmlB64, vopts || {}); });
118
- }
119
-
120
- // Build a SAML Response with an Assertion-level enveloped XMLDSig signature.
121
- // The Assertion's Signature child is stripped before the digest (the
122
- // enveloped-signature transform); both the digest and the SignedInfo are
123
- // canonicalized through b.xmlC14n so the verifier's recomputation matches.
124
- // `o` overrides: issuer, subjectXml, conditions, audience, attrStmt, scd.
125
- function _buildSignedResponse(idp, o) {
126
- o = o || {};
127
- var assertionId = "_assertion-" + o.tag;
128
- var responseId = "_response-" + o.tag;
129
- var issueInstant = iso(0);
130
-
131
- var issuer = o.issuer !== undefined ? o.issuer : IDP_ENTITY_ID;
132
- var issuerXml = issuer === null ? "" : "<saml:Issuer>" + issuer + "</saml:Issuer>";
133
-
134
- var scd = o.scd !== undefined ? o.scd :
135
- "<saml:SubjectConfirmationData NotOnOrAfter=\"" + iso(5 * 60 * 1000) + "\"" + // allow:raw-time-literal — 5m otherwise-valid window
136
- " Recipient=\"" + ACS_URL + "\"" +
137
- (o.inResponseTo ? " InResponseTo=\"" + o.inResponseTo + "\"" : "") + "/>";
138
- var subjectXml = o.subjectXml !== undefined ? o.subjectXml :
139
- "<saml:Subject>" +
140
- "<saml:NameID Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress\">" +
141
- (o.nameId || "alice@example.com") + "</saml:NameID>" +
142
- "<saml:SubjectConfirmation Method=\"" + BEARER + "\">" + scd +
143
- "</saml:SubjectConfirmation></saml:Subject>";
144
-
145
- var conditions = o.conditions !== undefined ? o.conditions :
146
- "<saml:Conditions NotBefore=\"" + iso(-5 * 60 * 1000) + // allow:raw-time-literal — 5m skew window
147
- "\" NotOnOrAfter=\"" + iso(5 * 60 * 1000) + "\">" + // allow:raw-time-literal — 5m skew window
148
- "<saml:AudienceRestriction><saml:Audience>" + (o.audience || SP_ENTITY_ID) +
149
- "</saml:Audience></saml:AudienceRestriction></saml:Conditions>";
150
-
151
- var authnStmt = "<saml:AuthnStatement SessionIndex=\"_sess-1\" AuthnInstant=\"" + issueInstant +
152
- "\"><saml:AuthnContext><saml:AuthnContextClassRef>" +
153
- "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" +
154
- "</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement>";
155
- var attrStmt = o.attrStmt || "";
156
-
157
- var open = "<saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" " +
158
- "ID=\"" + assertionId + "\" Version=\"2.0\" IssueInstant=\"" + issueInstant + "\">";
159
- var close = "</saml:Assertion>";
160
- var inner = issuerXml + "SIGNATURE_PLACEHOLDER" + subjectXml + conditions + authnStmt + attrStmt;
161
-
162
- var noSig = open + inner.replace("SIGNATURE_PLACEHOLDER", "") + close;
163
- var digest = nodeCrypto.createHash("sha256").update(c14n.canonicalize(noSig)).digest("base64");
164
-
165
- var signedInfo =
166
- "<ds:SignedInfo xmlns:ds=\"" + DS + "\">" +
167
- "<ds:CanonicalizationMethod Algorithm=\"" + EXC + "\"></ds:CanonicalizationMethod>" +
168
- "<ds:SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"></ds:SignatureMethod>" +
169
- "<ds:Reference URI=\"#" + assertionId + "\">" +
170
- "<ds:Transforms>" +
171
- "<ds:Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"></ds:Transform>" +
172
- "<ds:Transform Algorithm=\"" + EXC + "\"></ds:Transform>" +
173
- "</ds:Transforms>" +
174
- "<ds:DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"></ds:DigestMethod>" +
175
- "<ds:DigestValue>" + digest + "</ds:DigestValue>" +
176
- "</ds:Reference></ds:SignedInfo>";
177
- var priv = nodeCrypto.createPrivateKey({ key: idp.keyPem, format: "pem" });
178
- var sigValue = nodeCrypto.sign("sha256", c14n.canonicalize(signedInfo),
179
- { key: priv, padding: nodeCrypto.constants.RSA_PKCS1_PADDING }).toString("base64");
180
- var signatureXml = "<ds:Signature xmlns:ds=\"" + DS + "\">" + signedInfo +
181
- "<ds:SignatureValue>" + sigValue + "</ds:SignatureValue></ds:Signature>";
182
-
183
- var assertionFull = open + inner.replace("SIGNATURE_PLACEHOLDER", signatureXml) + close;
184
- var response =
185
- "<samlp:Response xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" " +
186
- "xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" " +
187
- "ID=\"" + responseId + "\" Version=\"2.0\" IssueInstant=\"" + issueInstant + "\" " +
188
- "Destination=\"" + ACS_URL + "\">" +
189
- "<saml:Issuer>" + IDP_ENTITY_ID + "</saml:Issuer>" +
190
- "<samlp:Status><samlp:StatusCode Value=\"" + SUCCESS + "\"/></samlp:Status>" +
191
- assertionFull + "</samlp:Response>";
192
- return b64(response);
193
- }
194
-
195
- // A bare (unsigned) Response envelope for the pre-signature structural cases.
196
- var P_NS = "xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" " +
197
- "xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\"";
198
- var STATUS_OK = "<samlp:Status><samlp:StatusCode Value=\"" + SUCCESS + "\"/></samlp:Status>";
199
- function _response(inner) { return "<samlp:Response " + P_NS + " ID=\"_r\">" + inner + "</samlp:Response>"; }
200
-
201
- // ---------------------------------------------------------------------------
202
- // create() config-time validation
203
- // ---------------------------------------------------------------------------
204
-
205
- function testCreateRequiredFields() {
206
- var base = {
207
- entityId: SP_ENTITY_ID, assertionConsumerServiceUrl: ACS_URL,
208
- idpEntityId: IDP_ENTITY_ID, idpSsoUrl: IDP_SSO_URL, idpCertPem: FAKE_CERT,
209
- };
210
- function omit(k) { var c = Object.assign({}, base); delete c[k]; return _codeOf(function () { b.auth.saml.sp.create(c); }); }
211
- check("create: missing entityId → no-entity-id", omit("entityId") === "auth-saml/no-entity-id");
212
- check("create: missing ACS → no-acs", omit("assertionConsumerServiceUrl") === "auth-saml/no-acs");
213
- check("create: missing idpEntityId → no-idp-entity-id", omit("idpEntityId") === "auth-saml/no-idp-entity-id");
214
- check("create: missing idpSsoUrl → no-idp-sso", omit("idpSsoUrl") === "auth-saml/no-idp-sso");
215
- check("create: missing idpCertPem → no-idp-cert", omit("idpCertPem") === "auth-saml/no-idp-cert");
216
- }
217
-
218
- function testCreateRejectsBadOpts() {
219
- var base = {
220
- entityId: SP_ENTITY_ID, assertionConsumerServiceUrl: ACS_URL,
221
- idpEntityId: IDP_ENTITY_ID, idpSsoUrl: IDP_SSO_URL, idpCertPem: FAKE_CERT,
222
- };
223
- function withOpt(o) { return _codeOf(function () { b.auth.saml.sp.create(Object.assign({}, base, o)); }); }
224
-
225
- var unknown = null;
226
- try { b.auth.saml.sp.create(Object.assign({}, base, { bogusKey: 1 })); }
227
- catch (e) { unknown = e; }
228
- check("create: unknown opt is refused", unknown !== null && unknown.code === "BAD_OPT");
229
- check("create: unknown-opt message names the key", unknown && /bogusKey/.test(unknown.message));
230
-
231
- // clockSkewSec must be a finite, non-negative number — a negative, Infinity,
232
- // or string value is refused at config time (an Infinity that slipped
233
- // through would disable the freshness windows downstream).
234
- check("create: negative clockSkewSec refused", withOpt({ clockSkewSec: -1 }) === "BAD_OPT");
235
- check("create: Infinity clockSkewSec refused", withOpt({ clockSkewSec: Infinity }) === "BAD_OPT");
236
- check("create: string clockSkewSec refused", withOpt({ clockSkewSec: "60" }) === "BAD_OPT");
237
-
238
- check("create: non-object opts refused", _codeOf(function () { b.auth.saml.sp.create("nope"); }) === "BAD_OPT");
239
- check("create: null opts refused", _codeOf(function () { b.auth.saml.sp.create(null); }) === "BAD_OPT");
240
- }
241
-
242
- // ---------------------------------------------------------------------------
243
- // buildAuthnRequest — shape + RFC 3741 XML escaping + redirect assembly
244
- // ---------------------------------------------------------------------------
245
-
246
- function testAuthnRequestShapeAndRelayState() {
247
- var sp = _fakeSp();
248
- var ar = sp.buildAuthnRequest({ relayState: "/dash&x=1" });
249
- check("authn: id is an underscore-prefixed token", typeof ar.id === "string" && ar.id.charAt(0) === "_");
250
- check("authn: redirectUrl starts at the IdP SSO URL", ar.redirectUrl.indexOf(IDP_SSO_URL) === 0);
251
- check("authn: redirectUrl carries SAMLRequest param", ar.redirectUrl.indexOf("SAMLRequest=") !== -1);
252
- check("authn: RelayState is URL-encoded",
253
- ar.redirectUrl.indexOf("RelayState=" + encodeURIComponent("/dash&x=1")) !== -1);
254
- check("authn: raw is a samlp:AuthnRequest", ar.raw.indexOf("<samlp:AuthnRequest") === 0);
255
- }
256
-
257
- function testAuthnRequestNameIdPolicy() {
258
- var without = _fakeSp().buildAuthnRequest().raw;
259
- check("authn: no NameIDPolicy when nameIdFormat unset", without.indexOf("NameIDPolicy") === -1);
260
- var withFmt = _fakeSp({ nameIdFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" })
261
- .buildAuthnRequest().raw;
262
- check("authn: NameIDPolicy present when nameIdFormat set", withFmt.indexOf("<samlp:NameIDPolicy") !== -1);
263
- }
264
-
265
- function testAuthnRequestQuerySeparator() {
266
- // When the IdP SSO URL already carries a query, the SAMLRequest param is
267
- // appended with & (not a second ?), so the redirect stays a valid URL.
268
- var sp = _fakeSp({ idpSsoUrl: IDP_SSO_URL + "?foo=1" });
269
- var url = sp.buildAuthnRequest().redirectUrl;
270
- check("authn: pre-existing query gets &SAMLRequest", url.indexOf("?foo=1&SAMLRequest=") !== -1);
271
- }
272
-
273
- function testAuthnRequestAttributeEscaping() {
274
- // A hostile ACS carrying a quote + angle brackets must be escaped inside the
275
- // AssertionConsumerServiceURL attribute — it cannot break out of the
276
- // attribute and inject unsigned markup (RFC 3741 §1.3.2).
277
- var sp = _fakeSp({
278
- entityId: "https://sp.example/e<vil",
279
- assertionConsumerServiceUrl: "https://sp.example/acs\"><evil>&",
280
- });
281
- var raw = sp.buildAuthnRequest().raw;
282
- check("authn: hostile ACS cannot break out of the attribute", raw.indexOf("\"><evil>") === -1);
283
- check("authn: quote in ACS is escaped to &quot;", raw.indexOf("&quot;") !== -1);
284
- check("authn: '<' in entityId Issuer text is escaped",
285
- raw.indexOf("e&lt;vil") !== -1 && raw.indexOf("e<vil") === -1);
286
- }
287
-
288
- // ---------------------------------------------------------------------------
289
- // metadata()
290
- // ---------------------------------------------------------------------------
291
-
292
- function testMetadata() {
293
- var sp = _fakeSp();
294
- var meta = sp.metadata();
295
- check("metadata: is an EntityDescriptor", meta.indexOf("<md:EntityDescriptor") !== -1);
296
- check("metadata: carries the SP entityID", meta.indexOf("entityID=\"" + SP_ENTITY_ID + "\"") !== -1);
297
- check("metadata: advertises the ACS location", meta.indexOf(ACS_URL) !== -1);
298
- check("metadata: WantAssertionsSigned is true", meta.indexOf("WantAssertionsSigned=\"true\"") !== -1);
299
- check("metadata: no SingleLogoutService when unconfigured", meta.indexOf("SingleLogoutService") === -1);
300
- }
301
-
302
- function testMetadataSlo() {
303
- var configured = _fakeSp({ singleLogoutServiceUrl: "https://sp.example/slo" }).metadata();
304
- check("metadata: SLO service emitted when configured on create",
305
- configured.indexOf("SingleLogoutService") !== -1 && configured.indexOf("https://sp.example/slo") !== -1);
306
- var override = _fakeSp().metadata({ singleLogoutServiceUrl: "https://sp.example/slo2" });
307
- check("metadata: metaOpts singleLogoutServiceUrl override honored",
308
- override.indexOf("https://sp.example/slo2") !== -1);
309
- // Hostile SLO URL is attribute-escaped.
310
- var hostile = _fakeSp().metadata({ singleLogoutServiceUrl: "https://sp.example/x\"><evil>" });
311
- check("metadata: hostile SLO URL cannot break out of the attribute",
312
- hostile.indexOf("\"><evil>") === -1 && hostile.indexOf("&quot;") !== -1);
313
- }
314
-
315
- // ---------------------------------------------------------------------------
316
- // verifyResponse — pre-signature input validation + XSW structural refusals
317
- // ---------------------------------------------------------------------------
318
-
319
- function testVerifyResponseInputValidation() {
320
- var sp = _fakeSp();
321
- check("verify: non-string SAMLResponse → no-response",
322
- _verifyCode(sp, 12345) === "auth-saml/no-response");
323
- check("verify: empty SAMLResponse → no-response",
324
- _verifyCode(sp, "") === "auth-saml/no-response");
325
- check("verify: base64 that decodes to non-XML → bad-response-decode",
326
- _verifyCode(sp, b64("no-angle-brackets-here")) === "auth-saml/bad-response-decode");
327
- check("verify: wrong root element → wrong-root",
328
- _verifyCode(sp, b64("<samlp:Foo " + P_NS + "/>")) === "auth-saml/wrong-root");
329
- }
330
-
331
- function testVerifyResponseStatus() {
332
- var sp = _fakeSp();
333
- var reqStatus = "<samlp:Status><samlp:StatusCode Value=\"urn:oasis:names:tc:SAML:2.0:status:Requester\"/></samlp:Status>";
334
- check("verify: non-Success Status → bad-status",
335
- _verifyCode(sp, b64(_response(reqStatus))) === "auth-saml/bad-status");
336
- check("verify: absent Status → bad-status",
337
- _verifyCode(sp, b64(_response(""))) === "auth-saml/bad-status");
338
- }
339
-
340
- function testVerifyResponseXswStructural() {
341
- var sp = _fakeSp();
342
- check("verify: duplicate <Status> → duplicate-status (XSW)",
343
- _verifyCode(sp, b64(_response(STATUS_OK + STATUS_OK))) === "auth-saml/duplicate-status");
344
- check("verify: duplicate <StatusCode> → duplicate-status-code (XSW)",
345
- _verifyCode(sp, b64(_response(
346
- "<samlp:Status><samlp:StatusCode Value=\"" + SUCCESS + "\"/><samlp:StatusCode Value=\"x\"/></samlp:Status>"
347
- ))) === "auth-saml/duplicate-status-code");
348
- check("verify: duplicate <Assertion> → duplicate-assertion (XSW)",
349
- _verifyCode(sp, b64(_response(STATUS_OK + "<saml:Assertion ID=\"_a1\"/><saml:Assertion ID=\"_a2\"/>")))
350
- === "auth-saml/duplicate-assertion");
351
- check("verify: duplicate <EncryptedAssertion> → duplicate-encrypted-assertion (XSW)",
352
- _verifyCode(sp, b64(_response(STATUS_OK + "<saml:EncryptedAssertion/><saml:EncryptedAssertion/>")))
353
- === "auth-saml/duplicate-encrypted-assertion");
354
- }
355
-
356
- function testVerifyResponseNoAssertionAndUnsigned() {
357
- var sp = _fakeSp();
358
- check("verify: Success but no Assertion → no-assertion",
359
- _verifyCode(sp, b64(_response(STATUS_OK))) === "auth-saml/no-assertion");
360
- check("verify: single Assertion with no Signature → unsigned",
361
- _verifyCode(sp, b64(_response(STATUS_OK +
362
- "<saml:Assertion ID=\"_a1\"><saml:Issuer>" + IDP_ENTITY_ID + "</saml:Issuer></saml:Assertion>")))
363
- === "auth-saml/unsigned");
364
- }
365
-
366
- function testVerifyResponseEncryptedWithoutKey() {
367
- var sp = _fakeSp();
368
- check("verify: EncryptedAssertion without spPrivateKeyPem → encrypted-no-sp-key",
369
- _verifyCode(sp, b64(_response(STATUS_OK +
370
- "<saml:EncryptedAssertion><xenc:EncryptedData xmlns:xenc=\"http://www.w3.org/2001/04/xmlenc#\"/></saml:EncryptedAssertion>")))
371
- === "auth-saml/encrypted-no-sp-key");
372
- }
373
-
374
- // ---------------------------------------------------------------------------
375
- // verifyResponse — signed-path branches (fire only after XMLDSig verify)
376
- // ---------------------------------------------------------------------------
377
-
378
- async function testVerifyResponseHappyPath() {
379
- var idp = await _mintRsaCert("idp.example");
380
- var sp = _realSp(idp);
381
- var attrStmt =
382
- "<saml:AttributeStatement>" +
383
- "<saml:Attribute Name=\"email\"><saml:AttributeValue>alice@example.com</saml:AttributeValue></saml:Attribute>" +
384
- "<saml:Attribute Name=\"roles\">" +
385
- "<saml:AttributeValue>admin</saml:AttributeValue><saml:AttributeValue>ops</saml:AttributeValue></saml:Attribute>" +
386
- "</saml:AttributeStatement>";
387
- var info = sp.verifyResponse(_buildSignedResponse(idp, { tag: "happy", attrStmt: attrStmt }));
388
- check("verify happy: nameId returned", info.nameId === "alice@example.com");
389
- check("verify happy: nameIdFormat returned",
390
- info.nameIdFormat === "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress");
391
- check("verify happy: sessionIndex from AuthnStatement", info.sessionIndex === "_sess-1");
392
- check("verify happy: issuer echoed", info.issuer === IDP_ENTITY_ID);
393
- check("verify happy: single-valued attribute is a scalar", info.attributes.email === "alice@example.com");
394
- check("verify happy: multi-valued attribute is an array",
395
- Array.isArray(info.attributes.roles) && info.attributes.roles.join(",") === "admin,ops");
396
- check("verify happy: audience defaults to entityId", info.audience === SP_ENTITY_ID);
397
- }
398
-
399
- async function testVerifyResponseInResponseTo() {
400
- var idp = await _mintRsaCert("idp.example");
401
- var sp = _realSp(idp);
402
- var rt = "_req-abc";
403
- var okB64 = _buildSignedResponse(idp, { tag: "irt-ok", inResponseTo: rt });
404
- var info = sp.verifyResponse(okB64, { expectedInResponseTo: rt });
405
- check("verify: matching InResponseTo is captured", info.inResponseTo === rt);
406
- var mismatchCode = _verifyCode(sp,
407
- _buildSignedResponse(idp, { tag: "irt-bad", inResponseTo: "_other" }),
408
- { expectedInResponseTo: rt });
409
- check("verify: InResponseTo mismatch → bad-in-response-to (replay defense)",
410
- mismatchCode === "auth-saml/bad-in-response-to");
411
- }
412
-
413
- async function testVerifyResponseWrongIssuer() {
414
- var idp = await _mintRsaCert("idp.example");
415
- var sp = _realSp(idp);
416
- check("verify: Issuer != configured idpEntityId → wrong-issuer",
417
- _verifyCode(sp, _buildSignedResponse(idp, { tag: "wi", issuer: "https://evil.example" }))
418
- === "auth-saml/wrong-issuer");
419
- }
420
-
421
- async function testVerifyResponseAudience() {
422
- var idp = await _mintRsaCert("idp.example");
423
- var sp = _realSp(idp);
424
- var noRestriction = "<saml:Conditions NotBefore=\"" + iso(-5 * 60 * 1000) + // allow:raw-time-literal — 5m skew window
425
- "\" NotOnOrAfter=\"" + iso(5 * 60 * 1000) + "\"></saml:Conditions>"; // allow:raw-time-literal — 5m skew window
426
- check("verify: no AudienceRestriction → no-audience-restriction (audience-confusion defense)",
427
- _verifyCode(sp, _buildSignedResponse(idp, { tag: "na", conditions: noRestriction }))
428
- === "auth-saml/no-audience-restriction");
429
- check("verify: AudienceRestriction for a different SP → wrong-audience",
430
- _verifyCode(sp, _buildSignedResponse(idp, { tag: "wa", audience: "https://other.example" }))
431
- === "auth-saml/wrong-audience");
432
-
433
- // requireAudienceRestriction:false opts out of the binding requirement.
434
- var info = sp.verifyResponse(
435
- _buildSignedResponse(idp, { tag: "opt", conditions: noRestriction }),
436
- { requireAudienceRestriction: false });
437
- check("verify: requireAudienceRestriction:false accepts a missing binding", info.nameId === "alice@example.com");
438
- }
439
-
440
- async function testVerifyResponseConditionsExpired() {
441
- var idp = await _mintRsaCert("idp.example");
442
- var sp = _realSp(idp);
443
- var expired = "<saml:Conditions NotOnOrAfter=\"" + iso(-60 * 60 * 1000) + "\">" + // allow:raw-time-literal — 1h in the past
444
- "<saml:AudienceRestriction><saml:Audience>" + SP_ENTITY_ID +
445
- "</saml:Audience></saml:AudienceRestriction></saml:Conditions>";
446
- check("verify: expired Conditions/NotOnOrAfter → conditions-expired",
447
- _verifyCode(sp, _buildSignedResponse(idp, { tag: "ce", conditions: expired }))
448
- === "auth-saml/conditions-expired");
449
- var future = "<saml:Conditions NotBefore=\"" + iso(60 * 60 * 1000) + "\">" + // allow:raw-time-literal — 1h in the future
450
- "<saml:AudienceRestriction><saml:Audience>" + SP_ENTITY_ID +
451
- "</saml:Audience></saml:AudienceRestriction></saml:Conditions>";
452
- check("verify: future Conditions/NotBefore → conditions-not-yet-valid",
453
- _verifyCode(sp, _buildSignedResponse(idp, { tag: "cf", conditions: future }))
454
- === "auth-saml/conditions-not-yet-valid");
455
- }
456
-
457
- async function testVerifyResponseDuplicateSubjectXsw() {
458
- var idp = await _mintRsaCert("idp.example");
459
- var sp = _realSp(idp);
460
- var twoSubjects =
461
- "<saml:Subject>" +
462
- "<saml:NameID Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress\">alice@example.com</saml:NameID>" +
463
- "<saml:SubjectConfirmation Method=\"" + BEARER + "\">" +
464
- "<saml:SubjectConfirmationData NotOnOrAfter=\"" + iso(5 * 60 * 1000) + // allow:raw-time-literal — 5m window
465
- "\" Recipient=\"" + ACS_URL + "\"/></saml:SubjectConfirmation></saml:Subject>" +
466
- "<saml:Subject><saml:NameID>attacker@evil.example</saml:NameID></saml:Subject>";
467
- check("verify: duplicate <Subject> in a signed Assertion → duplicate-subject (XSW)",
468
- _verifyCode(sp, _buildSignedResponse(idp, { tag: "ds", subjectXml: twoSubjects }))
469
- === "auth-saml/duplicate-subject");
470
- }
471
-
472
- async function testVerifyResponseTamperedDigest() {
473
- // A validly-signed assertion whose signed bytes are then mutated must be
474
- // refused: the recomputed digest no longer matches the signed DigestValue.
475
- var idp = await _mintRsaCert("idp.example");
476
- var sp = _realSp(idp);
477
- var goodB64 = _buildSignedResponse(idp, { tag: "tamper", nameId: "alice@example.com" });
478
- var xml = Buffer.from(goodB64, "base64").toString("utf8").replace("alice@example.com", "mallory@evil.example");
479
- var code = _verifyCode(sp, b64(xml));
480
- check("verify: tampering signed content → digest-mismatch",
481
- code === "auth-saml/digest-mismatch");
482
- }
483
-
484
- // ---------------------------------------------------------------------------
485
- // SLO — HTTP-Redirect build/parse validation
486
- // ---------------------------------------------------------------------------
487
-
488
- function testLogoutRequestValidation() {
489
- var sp = _fakeSp();
490
- check("buildLogoutRequest: missing nameId → no-nameid",
491
- _codeOf(function () { sp.buildLogoutRequest({ sessionIndex: "_s" }); }) === "auth-saml/no-nameid");
492
- check("buildLogoutRequest: non-object opts → bad-opts",
493
- _codeOf(function () { sp.buildLogoutRequest("nope"); }) === "auth-saml/bad-opts");
494
- var unknownCode = _codeOf(function () { sp.buildLogoutRequest({ nameId: "a", bogus: 1 }); });
495
- check("buildLogoutRequest: unknown opt is refused", /unknown option/.test(unknownCode));
496
- }
497
-
498
- function testLogoutResponseValidation() {
499
- var sp = _fakeSp();
500
- check("buildLogoutResponse: missing inResponseTo → no-in-response-to",
501
- _codeOf(function () { sp.buildLogoutResponse({ destination: IDP_SLO_URL }); }) === "auth-saml/no-in-response-to");
502
- check("buildLogoutResponse: missing destination → no-destination",
503
- _codeOf(function () { sp.buildLogoutResponse({ inResponseTo: "_x" }); }) === "auth-saml/no-destination");
504
- }
505
-
506
- function testParseLogoutRequestValidation() {
507
- var sp = _fakeSp();
508
- check("parseLogoutRequest: non-string input → no-saml-request",
509
- _codeOf(function () { sp.parseLogoutRequest(123); }) === "auth-saml/no-saml-request");
510
- check("parseLogoutRequest: undeflatable base64 → bad-saml-request",
511
- _codeOf(function () { sp.parseLogoutRequest(b64("this is not deflate-raw data")); }) === "auth-saml/bad-saml-request");
512
- }
513
-
514
- function testLogoutResponseRoundTrip() {
515
- var sp = _fakeSp();
516
- // buildLogoutResponse produces the redirect; extract + parse the SAMLResponse.
517
- var built = sp.buildLogoutResponse({ inResponseTo: "_orig-1", destination: IDP_SLO_URL });
518
- var samlResp = decodeURIComponent(built.redirectUrl.split("?")[1].split("&")[0].slice("SAMLResponse=".length));
519
- var parsed = sp.parseLogoutResponse(samlResp, { expectedInResponseTo: "_orig-1" });
520
- check("parseLogoutResponse: default status → success true", parsed.success === true);
521
- check("parseLogoutResponse: InResponseTo round-trips", parsed.inResponseTo === "_orig-1");
522
- check("parseLogoutResponse: issuer is the SP entityId", parsed.issuer === SP_ENTITY_ID);
523
-
524
- check("parseLogoutResponse: non-string input → no-saml-response",
525
- _codeOf(function () { sp.parseLogoutResponse(null); }) === "auth-saml/no-saml-response");
526
- check("parseLogoutResponse: expectedInResponseTo mismatch → inresponseto-mismatch",
527
- _codeOf(function () { sp.parseLogoutResponse(samlResp, { expectedInResponseTo: "_different" }); })
528
- === "auth-saml/inresponseto-mismatch");
529
-
530
- // A non-Success statusCode surfaces success=false.
531
- var failBuilt = sp.buildLogoutResponse({
532
- inResponseTo: "_orig-2", destination: IDP_SLO_URL,
533
- statusCode: "urn:oasis:names:tc:SAML:2.0:status:Requester",
534
- });
535
- var failResp = decodeURIComponent(failBuilt.redirectUrl.split("?")[1].split("&")[0].slice("SAMLResponse=".length));
536
- check("parseLogoutResponse: non-Success statusCode → success false",
537
- sp.parseLogoutResponse(failResp).success === false);
538
- }
539
-
540
- // ---------------------------------------------------------------------------
541
- // SLO — HTTP-POST + SOAP bindings (embedded XMLDSig)
542
- // ---------------------------------------------------------------------------
543
-
544
- function testLogoutRequestPostRoundTrip() {
545
- var sp = _fakeSp();
546
- var kp = pq.ml_dsa_65.keygen();
547
- var post = sp.buildLogoutRequestPost({
548
- nameId: "alice@idp", sessionIndex: "_s-9", signingKey: kp.secretKey, signingAlg: "ml-dsa-65",
549
- });
550
- check("buildLogoutRequestPost: action is the IdP SLO URL", post.action === IDP_SLO_URL);
551
- check("buildLogoutRequestPost: formHtml auto-submits SAMLRequest",
552
- post.formHtml.indexOf("name=\"SAMLRequest\"") !== -1 && post.formHtml.indexOf("document.forms[0].submit()") !== -1);
553
- var parsed = sp.parseLogoutRequestPost(post.samlRequest, {
554
- idpVerifyKey: kp.publicKey, idpVerifyAlg: "ml-dsa-65",
555
- });
556
- check("POST SLO round-trip: nameId recovered", parsed.nameId === "alice@idp");
557
- check("POST SLO round-trip: sessionIndex recovered", parsed.sessionIndex === "_s-9");
558
- check("POST SLO round-trip: id recovered", parsed.id === post.id);
559
-
560
- // Negative control — a different verify key refuses (the embedded XMLDSig
561
- // gate is live), proving the round-trip pass above is a real verification.
562
- check("POST SLO: wrong verify key → bad-signature",
563
- _codeOf(function () {
564
- sp.parseLogoutRequestPost(post.samlRequest, {
565
- idpVerifyKey: pq.ml_dsa_65.keygen().publicKey, idpVerifyAlg: "ml-dsa-65",
566
- });
567
- }) === "auth-saml/bad-signature");
568
- }
569
-
570
- function testParseLogoutRequestPostValidation() {
571
- var sp = _fakeSp();
572
- check("parseLogoutRequestPost: non-string input → bad-input",
573
- _codeOf(function () { sp.parseLogoutRequestPost(42); }) === "auth-saml/bad-input");
574
- check("parseLogoutRequestPost: wrong root element → wrong-root",
575
- _codeOf(function () { sp.parseLogoutRequestPost(b64("<samlp:Foo " + P_NS + "/>")); }) === "auth-saml/wrong-root");
576
- }
577
-
578
- function testLogoutRequestSoapShape() {
579
- var sp = _fakeSp();
580
- var soap = sp.buildLogoutRequestSoap({ nameId: "a@idp" });
581
- check("buildLogoutRequestSoap: action is the IdP SLO URL", soap.action === IDP_SLO_URL);
582
- check("buildLogoutRequestSoap: body is a SOAP envelope wrapping the LogoutRequest",
583
- soap.body.indexOf("soapenv:Envelope") !== -1 &&
584
- soap.body.indexOf("soapenv:Body") !== -1 &&
585
- soap.body.indexOf("<samlp:LogoutRequest") !== -1);
586
- }
587
-
588
- function testParseLogoutResponseSoap() {
589
- var sp = _fakeSp();
590
- // Build a LogoutResponse XML (via buildLogoutResponse.raw) and wrap it in a
591
- // SOAP envelope, then drive the public parse path.
592
- var lr = sp.buildLogoutResponse({ inResponseTo: "_orig-soap", destination: IDP_SLO_URL });
593
- var envelope = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
594
- "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
595
- "<soapenv:Body>" + lr.raw + "</soapenv:Body></soapenv:Envelope>";
596
- var parsed = sp.parseLogoutResponseSoap(envelope);
597
- check("parseLogoutResponseSoap: unwraps Body + reports success", parsed.success === true);
598
- check("parseLogoutResponseSoap: InResponseTo recovered", parsed.inResponseTo === "_orig-soap");
599
-
600
- check("parseLogoutResponseSoap: non-string input → bad-input",
601
- _codeOf(function () { sp.parseLogoutResponseSoap(0); }) === "auth-saml/bad-input");
602
- check("parseLogoutResponseSoap: non-Envelope root → bad-soap",
603
- _codeOf(function () { sp.parseLogoutResponseSoap("<foo/>"); }) === "auth-saml/bad-soap");
604
- check("parseLogoutResponseSoap: empty Body → bad-soap",
605
- _codeOf(function () {
606
- sp.parseLogoutResponseSoap("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
607
- "<soapenv:Body></soapenv:Body></soapenv:Envelope>");
608
- }) === "auth-saml/bad-soap");
609
- }
610
-
611
- // ---------------------------------------------------------------------------
612
- // fetchMdq — synchronous input validation (throws before any network I/O)
613
- // ---------------------------------------------------------------------------
614
-
615
- async function testFetchMdqInputValidation() {
616
- async function mdqCode(o) {
617
- try { await b.auth.saml.fetchMdq(o); return "NO-THROW"; }
618
- catch (e) { return e.code || e.message; }
619
- }
620
- check("fetchMdq: non-object opts refused", (await mdqCode(null)) === "BAD_OPT");
621
- check("fetchMdq: missing baseUrl → no-mdq-base", (await mdqCode({ entityId: IDP_ENTITY_ID })) === "auth-saml/no-mdq-base");
622
- check("fetchMdq: missing entityId → no-mdq-entity", (await mdqCode({ baseUrl: "https://mdq.example" })) === "auth-saml/no-mdq-entity");
623
- }
624
-
625
- async function run() {
626
- // create()
627
- testCreateRequiredFields();
628
- testCreateRejectsBadOpts();
629
- // buildAuthnRequest
630
- testAuthnRequestShapeAndRelayState();
631
- testAuthnRequestNameIdPolicy();
632
- testAuthnRequestQuerySeparator();
633
- testAuthnRequestAttributeEscaping();
634
- // metadata
635
- testMetadata();
636
- testMetadataSlo();
637
- // verifyResponse — pre-signature
638
- testVerifyResponseInputValidation();
639
- testVerifyResponseStatus();
640
- testVerifyResponseXswStructural();
641
- testVerifyResponseNoAssertionAndUnsigned();
642
- testVerifyResponseEncryptedWithoutKey();
643
- // verifyResponse — signed path
644
- await testVerifyResponseHappyPath();
645
- await testVerifyResponseInResponseTo();
646
- await testVerifyResponseWrongIssuer();
647
- await testVerifyResponseAudience();
648
- await testVerifyResponseConditionsExpired();
649
- await testVerifyResponseDuplicateSubjectXsw();
650
- await testVerifyResponseTamperedDigest();
651
- // SLO redirect
652
- testLogoutRequestValidation();
653
- testLogoutResponseValidation();
654
- testParseLogoutRequestValidation();
655
- testLogoutResponseRoundTrip();
656
- // SLO POST / SOAP
657
- testLogoutRequestPostRoundTrip();
658
- testParseLogoutRequestPostValidation();
659
- testLogoutRequestSoapShape();
660
- testParseLogoutResponseSoap();
661
- // fetchMdq
662
- await testFetchMdqInputValidation();
663
- }
664
-
665
- if (require.main === module) {
666
- run().then(function () {
667
- console.log("OK — " + helpers.getChecks() + " checks passed");
668
- process.exit(0);
669
- }).catch(function (e) { console.error(e && e.stack || e); process.exit(1); });
670
- }
671
- module.exports = { run: run };