@prosopo/provider 5.15.0 → 5.16.0

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 (224) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +50 -32
  2. package/.turbo/turbo-build$colon$tsc.log +36 -30
  3. package/.turbo/turbo-build.log +51 -33
  4. package/CHANGELOG.md +65 -0
  5. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +4 -0
  6. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
  7. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +63 -3
  8. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
  9. package/dist/api/blacklistRequestInspector.js +2 -2
  10. package/dist/api/captcha/getAudioCaptchaChallenge.d.ts +5 -0
  11. package/dist/api/captcha/getAudioCaptchaChallenge.d.ts.map +1 -0
  12. package/dist/api/captcha/getAudioCaptchaChallenge.js +37 -0
  13. package/dist/api/captcha/getAudioCaptchaChallenge.js.map +1 -0
  14. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +1 -1
  15. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  16. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +11 -7
  17. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  18. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
  19. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +1 -0
  20. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
  21. package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts +5 -0
  22. package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts.map +1 -0
  23. package/dist/api/captcha/getIconOrderCaptchaChallenge.js +37 -0
  24. package/dist/api/captcha/getIconOrderCaptchaChallenge.js.map +1 -0
  25. package/dist/api/captcha/getImageCaptchaChallenge.js +2 -2
  26. package/dist/api/captcha/getPoWCaptchaChallenge.js +4 -4
  27. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +1 -3
  28. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  29. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +52 -169
  30. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  31. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts +42 -0
  32. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts.map +1 -0
  33. package/dist/api/captcha/interactiveCaptchaChallenge.js +154 -0
  34. package/dist/api/captcha/interactiveCaptchaChallenge.js.map +1 -0
  35. package/dist/api/captcha/interactiveCaptchaSolution.d.ts +14 -0
  36. package/dist/api/captcha/interactiveCaptchaSolution.d.ts.map +1 -0
  37. package/dist/api/captcha/interactiveCaptchaSolution.js +77 -0
  38. package/dist/api/captcha/interactiveCaptchaSolution.js.map +1 -0
  39. package/dist/api/captcha/maintenanceModeResponses.d.ts +4 -2
  40. package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
  41. package/dist/api/captcha/maintenanceModeResponses.js +28 -1
  42. package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
  43. package/dist/api/captcha/submitAudioCaptchaSolution.d.ts +4 -0
  44. package/dist/api/captcha/submitAudioCaptchaSolution.d.ts.map +1 -0
  45. package/dist/api/captcha/submitAudioCaptchaSolution.js +11 -0
  46. package/dist/api/captcha/submitAudioCaptchaSolution.js.map +1 -0
  47. package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts +4 -0
  48. package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts.map +1 -0
  49. package/dist/api/captcha/submitIconOrderCaptchaSolution.js +11 -0
  50. package/dist/api/captcha/submitIconOrderCaptchaSolution.js.map +1 -0
  51. package/dist/api/captcha/submitPoWCaptchaSolution.js +2 -2
  52. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts +1 -3
  53. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -1
  54. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +6 -73
  55. package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
  56. package/dist/api/captcha/trafficFilterRequestTime.d.ts +4 -1
  57. package/dist/api/captcha/trafficFilterRequestTime.d.ts.map +1 -1
  58. package/dist/api/captcha/trafficFilterRequestTime.js +3 -0
  59. package/dist/api/captcha/trafficFilterRequestTime.js.map +1 -1
  60. package/dist/api/captcha.d.ts.map +1 -1
  61. package/dist/api/captcha.js +8 -0
  62. package/dist/api/captcha.js.map +1 -1
  63. package/dist/api/domainMiddleware.js +1 -1
  64. package/dist/api/ja4Middleware.js +1 -1
  65. package/dist/api/startProviderApi.js +1 -1
  66. package/dist/api/verify.d.ts.map +1 -1
  67. package/dist/api/verify.js +153 -96
  68. package/dist/api/verify.js.map +1 -1
  69. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +65 -2
  70. package/dist/cjs/api/blacklistRequestInspector.cjs +2 -2
  71. package/dist/cjs/api/captcha/getAudioCaptchaChallenge.cjs +37 -0
  72. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +1 -1
  73. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +11 -7
  74. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +1 -0
  75. package/dist/cjs/api/captcha/getIconOrderCaptchaChallenge.cjs +37 -0
  76. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +2 -2
  77. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +4 -4
  78. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +51 -168
  79. package/dist/cjs/api/captcha/interactiveCaptchaChallenge.cjs +154 -0
  80. package/dist/cjs/api/captcha/interactiveCaptchaSolution.cjs +77 -0
  81. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +29 -0
  82. package/dist/cjs/api/captcha/submitAudioCaptchaSolution.cjs +11 -0
  83. package/dist/cjs/api/captcha/submitIconOrderCaptchaSolution.cjs +11 -0
  84. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +2 -2
  85. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +6 -73
  86. package/dist/cjs/api/captcha/trafficFilterRequestTime.cjs +3 -0
  87. package/dist/cjs/api/captcha.cjs +8 -0
  88. package/dist/cjs/api/domainMiddleware.cjs +1 -1
  89. package/dist/cjs/api/ja4Middleware.cjs +1 -1
  90. package/dist/cjs/api/startProviderApi.cjs +1 -1
  91. package/dist/cjs/api/verify.cjs +152 -95
  92. package/dist/cjs/index.cjs +1 -1
  93. package/dist/cjs/tasks/audio/audioBuffer.cjs +72 -0
  94. package/dist/cjs/tasks/audio/audioRenderer.cjs +32 -0
  95. package/dist/cjs/tasks/audioAlternative.cjs +23 -0
  96. package/dist/cjs/tasks/audioCaptcha/audioTasks.cjs +65 -0
  97. package/dist/cjs/tasks/audioCaptcha/audioTasksUtils.cjs +19 -0
  98. package/dist/cjs/tasks/captchaManager.cjs +14 -2
  99. package/dist/cjs/tasks/captchaTypeSelection.cjs +10 -3
  100. package/dist/cjs/tasks/client/clientTasks.cjs +2 -2
  101. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +26 -6
  102. package/dist/cjs/tasks/iconOrder/iconOrderRenderer.cjs +42 -0
  103. package/dist/cjs/tasks/iconOrderCaptcha/iconOrderTasks.cjs +69 -0
  104. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +8 -8
  105. package/dist/cjs/tasks/interactiveCaptcha/interactiveCaptchaManager.cjs +423 -0
  106. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +8 -8
  107. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +1 -1
  108. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +40 -486
  109. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +18 -1
  110. package/dist/cjs/tasks/tasks.cjs +6 -0
  111. package/dist/cjs/util.cjs +1 -1
  112. package/dist/index.js +2 -2
  113. package/dist/tasks/audio/audioBuffer.d.ts +23 -0
  114. package/dist/tasks/audio/audioBuffer.d.ts.map +1 -0
  115. package/dist/tasks/audio/audioBuffer.js +70 -0
  116. package/dist/tasks/audio/audioBuffer.js.map +1 -0
  117. package/dist/tasks/audio/audioRenderer.d.ts +11 -0
  118. package/dist/tasks/audio/audioRenderer.d.ts.map +1 -0
  119. package/dist/tasks/audio/audioRenderer.js +31 -0
  120. package/dist/tasks/audio/audioRenderer.js.map +1 -0
  121. package/dist/tasks/audioAlternative.d.ts +8 -0
  122. package/dist/tasks/audioAlternative.d.ts.map +1 -0
  123. package/dist/tasks/audioAlternative.js +20 -0
  124. package/dist/tasks/audioAlternative.js.map +1 -0
  125. package/dist/tasks/audioCaptcha/audioTasks.d.ts +19 -0
  126. package/dist/tasks/audioCaptcha/audioTasks.d.ts.map +1 -0
  127. package/dist/tasks/audioCaptcha/audioTasks.js +65 -0
  128. package/dist/tasks/audioCaptcha/audioTasks.js.map +1 -0
  129. package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts +3 -0
  130. package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts.map +1 -0
  131. package/dist/tasks/audioCaptcha/audioTasksUtils.js +18 -0
  132. package/dist/tasks/audioCaptcha/audioTasksUtils.js.map +1 -0
  133. package/dist/tasks/captchaManager.d.ts +9 -3
  134. package/dist/tasks/captchaManager.d.ts.map +1 -1
  135. package/dist/tasks/captchaManager.js +15 -3
  136. package/dist/tasks/captchaManager.js.map +1 -1
  137. package/dist/tasks/captchaTypeSelection.d.ts +1 -1
  138. package/dist/tasks/captchaTypeSelection.d.ts.map +1 -1
  139. package/dist/tasks/captchaTypeSelection.js +11 -4
  140. package/dist/tasks/captchaTypeSelection.js.map +1 -1
  141. package/dist/tasks/client/clientTasks.js +2 -2
  142. package/dist/tasks/frictionless/frictionlessTasks.d.ts +3 -0
  143. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  144. package/dist/tasks/frictionless/frictionlessTasks.js +26 -6
  145. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  146. package/dist/tasks/iconOrder/iconOrderRenderer.d.ts +12 -0
  147. package/dist/tasks/iconOrder/iconOrderRenderer.d.ts.map +1 -0
  148. package/dist/tasks/iconOrder/iconOrderRenderer.js +40 -0
  149. package/dist/tasks/iconOrder/iconOrderRenderer.js.map +1 -0
  150. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts +22 -0
  151. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts.map +1 -0
  152. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js +69 -0
  153. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js.map +1 -0
  154. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +8 -8
  155. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts +52 -0
  156. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts.map +1 -0
  157. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js +423 -0
  158. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js.map +1 -0
  159. package/dist/tasks/powCaptcha/powTasks.js +8 -8
  160. package/dist/tasks/powCaptcha/powTasksUtils.js +1 -1
  161. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts +14 -16
  162. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  163. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +41 -487
  164. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  165. package/dist/tasks/spam/checkTrafficFilter.d.ts +4 -1
  166. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  167. package/dist/tasks/spam/checkTrafficFilter.js +18 -1
  168. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  169. package/dist/tasks/tasks.d.ts +4 -0
  170. package/dist/tasks/tasks.d.ts.map +1 -1
  171. package/dist/tasks/tasks.js +6 -0
  172. package/dist/tasks/tasks.js.map +1 -1
  173. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +7 -3
  174. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  175. package/dist/tests/integration/clientSettingsPersistence.integration.test.js +43 -3
  176. package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
  177. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +4 -2
  178. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
  179. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +76 -1
  180. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
  181. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +27 -8
  182. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
  183. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +20 -0
  184. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
  185. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +28 -2
  186. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  187. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts +2 -0
  188. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts.map +1 -0
  189. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js +105 -0
  190. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js.map +1 -0
  191. package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts +2 -0
  192. package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts.map +1 -0
  193. package/dist/tests/unit/tasks/audioAlternative.unit.test.js +76 -0
  194. package/dist/tests/unit/tasks/audioAlternative.unit.test.js.map +1 -0
  195. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts +2 -0
  196. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts.map +1 -0
  197. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js +259 -0
  198. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js.map +1 -0
  199. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts +2 -0
  200. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts.map +1 -0
  201. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js +52 -0
  202. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js.map +1 -0
  203. package/dist/tests/unit/tasks/captchaManager.unit.test.js +120 -2
  204. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  205. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js +48 -5
  206. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js.map +1 -1
  207. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js +29 -0
  208. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js.map +1 -1
  209. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +31 -0
  210. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
  211. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js +1 -1
  212. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js.map +1 -1
  213. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js +28 -0
  214. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js.map +1 -1
  215. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts +2 -0
  216. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts.map +1 -0
  217. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js +60 -0
  218. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js.map +1 -0
  219. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts +2 -0
  220. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts.map +1 -0
  221. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js +225 -0
  222. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js.map +1 -0
  223. package/dist/util.js +1 -1
  224. package/package.json +19 -17
@@ -20,16 +20,18 @@ let _prosopo_types = require("@prosopo/types");
20
20
  *
21
21
  * Pass `allowedTypes` from `resolveAllowedCaptchaTypes`, so Prosopo's
22
22
  * per-site captcha type feature flags are applied alongside the site owner's
23
- * own `frictionlessTypes`. Absent means every type is allowed.
23
+ * own `frictionlessTypes`. Absent means the defaults for both, so icon-order
24
+ * stays off.
24
25
  *
25
26
  * Coercion only ever narrows. A disabled type falls back to the other
26
27
  * interactive type if that is permitted, and to PoW otherwise — never the
27
28
  * reverse, so this can't hand a user a harder challenge than was asked for.
28
29
  */
29
30
  var coerceToEnabledCaptchaType = (requested, allowedTypes, logger) => {
30
- const types = (0, _prosopo_types.resolveFrictionlessTypes)(allowedTypes);
31
+ const types = allowedTypes ? (0, _prosopo_types.resolveFrictionlessTypes)(allowedTypes) : (0, _prosopo_types.resolveAllowedCaptchaTypes)(void 0);
31
32
  const puzzleAllowed = types.puzzle && require_puzzleRenderer.isPuzzleRenderAvailable();
32
33
  const imageAllowed = types.image;
34
+ const iconOrderAllowed = types.iconOrder;
33
35
  const resolved = (() => {
34
36
  switch (requested) {
35
37
  case _prosopo_types.CaptchaType.pow: return _prosopo_types.CaptchaType.pow;
@@ -39,6 +41,10 @@ var coerceToEnabledCaptchaType = (requested, allowedTypes, logger) => {
39
41
  case _prosopo_types.CaptchaType.image:
40
42
  if (imageAllowed) return _prosopo_types.CaptchaType.image;
41
43
  return puzzleAllowed ? _prosopo_types.CaptchaType.puzzle : _prosopo_types.CaptchaType.pow;
44
+ case _prosopo_types.CaptchaType.iconOrder:
45
+ if (iconOrderAllowed) return _prosopo_types.CaptchaType.iconOrder;
46
+ if (puzzleAllowed) return _prosopo_types.CaptchaType.puzzle;
47
+ return imageAllowed ? _prosopo_types.CaptchaType.image : _prosopo_types.CaptchaType.pow;
42
48
  }
43
49
  })();
44
50
  if (resolved !== requested) logger?.info(() => ({
@@ -48,7 +54,8 @@ var coerceToEnabledCaptchaType = (requested, allowedTypes, logger) => {
48
54
  served: resolved,
49
55
  imageEnabled: types.image,
50
56
  puzzleEnabled: types.puzzle,
51
- puzzleRenderable: require_puzzleRenderer.isPuzzleRenderAvailable()
57
+ puzzleRenderable: require_puzzleRenderer.isPuzzleRenderAvailable(),
58
+ iconOrderEnabled: types.iconOrder
52
59
  }
53
60
  }));
54
61
  return resolved;
@@ -1,10 +1,10 @@
1
- const require_validateAddress = require("../../api/validateAddress.cjs");
2
1
  const require_decisionMachineRunner = require("../decisionMachine/decisionMachineRunner.cjs");
2
+ const require_validateAddress = require("../../api/validateAddress.cjs");
3
3
  let _prosopo_common = require("@prosopo/common");
4
4
  let _prosopo_database = require("@prosopo/database");
5
5
  let _prosopo_types = require("@prosopo/types");
6
- require("node:crypto");
7
6
  let _prosopo_util = require("@prosopo/util");
7
+ require("node:crypto");
8
8
  /**
9
9
  * Matches `text` against a pattern where `*` matches any run of characters.
10
10
  * Greedy two-pointer match, retrying from the last `*` on mismatch, so time
@@ -1,10 +1,11 @@
1
1
  const require_usageCounters = require("../../util/usageCounters.cjs");
2
- const require_decisionMachineRunner = require("../decisionMachine/decisionMachineRunner.cjs");
3
- const require_dnsEventUrl = require("../../api/dnsEventUrl.cjs");
4
2
  const require_rawTlsSignalsMiddleware = require("../../api/rawTlsSignalsMiddleware.cjs");
5
- const require_lang = require("../../rules/lang.cjs");
6
3
  const require_clientMetaData = require("../../utils/clientMetaData.cjs");
4
+ const require_audioAlternative = require("../audioAlternative.cjs");
7
5
  const require_captchaManager = require("../captchaManager.cjs");
6
+ const require_decisionMachineRunner = require("../decisionMachine/decisionMachineRunner.cjs");
7
+ const require_dnsEventUrl = require("../../api/dnsEventUrl.cjs");
8
+ const require_lang = require("../../rules/lang.cjs");
8
9
  const require_captchaTypeSelection = require("../captchaTypeSelection.cjs");
9
10
  const require_getBotScore = require("../detection/getBotScore.cjs");
10
11
  const require_puzzleDifficulty = require("../puzzle/puzzleDifficulty.cjs");
@@ -21,6 +22,7 @@ var getSessionIDPrefix = (host) => {
21
22
  var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
22
23
  constructor(db, pair, config, logger, writeQueue, decisionMachineRunner, usageCounters) {
23
24
  super(db, pair, config, logger, writeQueue);
25
+ this.audioAlternativeEnabled = false;
24
26
  this.config = config;
25
27
  this.decisionMachineRunner = decisionMachineRunner ?? new require_decisionMachineRunner.DecisionMachineRunner(db);
26
28
  this.usageCounters = usageCounters ?? null;
@@ -33,11 +35,15 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
33
35
  setRoutingContext(ctx) {
34
36
  this.routingContext = ctx;
35
37
  }
38
+ /** Separate from `setSessionParams`, which the short-circuit path bypasses. */
39
+ setAudioAlternativeEnabled(enabled) {
40
+ this.audioAlternativeEnabled = enabled;
41
+ }
36
42
  /**
37
43
  * The types this site may be served, from `resolveAllowedCaptchaTypes`.
38
44
  * Set before any path can mint a session, including the short-circuits
39
45
  * that skip routing, so the site's feature flags hold on every path.
40
- * Unset means every type is allowed.
46
+ * Unset means the default flags and preferences.
41
47
  */
42
48
  setAllowedCaptchaTypes(allowed) {
43
49
  this.allowedCaptchaTypes = allowed;
@@ -96,7 +102,7 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
96
102
  return require_lang.checkLangRules(this.config, acceptLanguage);
97
103
  }
98
104
  async createSession(input) {
99
- const { token, score, threshold, scoreComponents, ipAddress, captchaType, siteKey, mode, solvedImagesCount, powDifficulty, userSitekeyIpHash, reason, blocked, deleted, ipInfo, headers, bundleId, currentUrl, iframeUrl, d, tcpToChelloUs, chelloToHandshakeUs, simdReadings, puzzleTolerance, puzzle, isEscalation, originSessionId, refreshOf, refreshCount, refreshedAfterMs, isProtect, matchedRule, clientMetaData, webView = false, iFrame = false, decryptedHeadHash = "" } = input;
105
+ const { token, score, threshold, scoreComponents, ipAddress, captchaType, siteKey, mode, solvedImagesCount, powDifficulty, userSitekeyIpHash, reason, blocked, deleted, ipInfo, headers, bundleId, currentUrl, iframeUrl, d, tcpToChelloUs, chelloToHandshakeUs, simdReadings, puzzleTolerance, puzzle, iconOrderTolerance, iconOrder, isEscalation, originSessionId, refreshOf, refreshCount, refreshedAfterMs, isProtect, matchedRule, clientMetaData, webView = false, iFrame = false, decryptedHeadHash = "" } = input;
100
106
  const sessionRecord = {
101
107
  sessionId: `${getSessionIDPrefix(this.config.host)}-${(0, uuid.v4)()}`,
102
108
  createdAt: /* @__PURE__ */ new Date(),
@@ -111,6 +117,8 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
111
117
  powDifficulty,
112
118
  ...puzzleTolerance !== void 0 && { puzzleTolerance },
113
119
  ...puzzle && { puzzle },
120
+ ...iconOrderTolerance !== void 0 && { iconOrderTolerance },
121
+ ...iconOrder && { iconOrder },
114
122
  userSitekeyIpHash,
115
123
  webView,
116
124
  iFrame,
@@ -235,6 +243,9 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
235
243
  async sendPuzzleCaptcha(params) {
236
244
  return this.sendCaptcha(_prosopo_types.CaptchaType.puzzle, params);
237
245
  }
246
+ async sendIconOrderCaptcha(params) {
247
+ return this.sendCaptcha(_prosopo_types.CaptchaType.iconOrder, params);
248
+ }
238
249
  async sendCaptcha(captchaType, params) {
239
250
  const effectiveParams = {
240
251
  ...this.sessionParams,
@@ -270,6 +281,10 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
270
281
  ...difficulty !== void 0 && { puzzleLevel: difficulty.level }
271
282
  };
272
283
  })() : {};
284
+ const finalIconOrderOverrides = finalCaptchaType === _prosopo_types.CaptchaType.iconOrder ? {
285
+ ...routed.iconOrderTolerance !== void 0 && { iconOrderTolerance: routed.iconOrderTolerance },
286
+ ...routed.iconOrder && { iconOrder: routed.iconOrder }
287
+ } : {};
273
288
  const blocked = finalCaptchaType === _prosopo_types.CaptchaType.image ? effectiveParams.blocked : void 0;
274
289
  const sessionRecord = await this.createSession({
275
290
  ...effectiveParams,
@@ -286,6 +301,8 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
286
301
  blocked,
287
302
  puzzleTolerance: finalPuzzleOverrides.puzzleTolerance,
288
303
  puzzle: finalPuzzleOverrides.puzzle,
304
+ iconOrderTolerance: finalIconOrderOverrides.iconOrderTolerance,
305
+ iconOrder: finalIconOrderOverrides.iconOrder,
289
306
  deleted: void 0,
290
307
  isEscalation: void 0,
291
308
  originSessionId: void 0
@@ -295,7 +312,8 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
295
312
  [_prosopo_types.ApiParams.captchaType]: finalCaptchaType,
296
313
  [_prosopo_types.ApiParams.sessionId]: sessionRecord.sessionId,
297
314
  [_prosopo_types.ApiParams.status]: "ok",
298
- dns_url: require_dnsEventUrl.buildDnsEventUrl(sessionRecord.sessionId)
315
+ dns_url: require_dnsEventUrl.buildDnsEventUrl(sessionRecord.sessionId),
316
+ ...require_audioAlternative.offersAudioAlternative(finalCaptchaType, this.audioAlternativeEnabled) && { audioAlternativeAvailable: true }
299
317
  };
300
318
  }
301
319
  async registerBlockedSession(params) {
@@ -318,6 +336,8 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
318
336
  deleted: true,
319
337
  puzzleTolerance: void 0,
320
338
  puzzle: void 0,
339
+ iconOrderTolerance: void 0,
340
+ iconOrder: void 0,
321
341
  isEscalation: void 0,
322
342
  originSessionId: void 0
323
343
  });
@@ -0,0 +1,42 @@
1
+ let _prosopo_types = require("@prosopo/types");
2
+ let _prosopo_puzzle_assets = require("@prosopo/puzzle-assets");
3
+ let _prosopo_icon_order_assets = require("@prosopo/icon-order-assets");
4
+ //#region src/tasks/iconOrder/iconOrderRenderer.ts
5
+ /** Layers partial overrides onto the asset defaults; later sources win. */
6
+ var resolveIconOrderRenderSettings = (...overrides) => {
7
+ let resolved = { ..._prosopo_icon_order_assets.DEFAULT_RENDER_SETTINGS };
8
+ for (const override of overrides) resolved = {
9
+ targetCount: override?.targetCount ?? resolved.targetCount,
10
+ decoyCount: override?.decoyCount ?? resolved.decoyCount,
11
+ strokeWidth: override?.strokeWidth ?? resolved.strokeWidth,
12
+ iconOpacity: override?.iconOpacity ?? resolved.iconOpacity,
13
+ haloOpacity: override?.haloOpacity ?? resolved.haloOpacity,
14
+ backgroundClutter: override?.backgroundClutter ?? resolved.backgroundClutter
15
+ };
16
+ const decoyBudget = _prosopo_types.ICON_ORDER_GLYPH_VOCABULARY - resolved.targetCount;
17
+ if (resolved.decoyCount > decoyBudget) resolved = {
18
+ ...resolved,
19
+ decoyCount: Math.max(0, decoyBudget)
20
+ };
21
+ return resolved;
22
+ };
23
+ /** Drops the render-only fields (rotation, hue); grading needs none of them. */
24
+ var toStoredTargets = (targets) => targets.map((target) => ({
25
+ x: target.x,
26
+ y: target.y,
27
+ size: target.size,
28
+ kind: target.kind
29
+ }));
30
+ var renderIconOrderImages = async (settings = _prosopo_icon_order_assets.DEFAULT_RENDER_SETTINGS) => {
31
+ const rendered = await (0, _prosopo_icon_order_assets.renderIconOrder)(_prosopo_icon_order_assets.DEFAULT_GEOMETRY, settings);
32
+ return {
33
+ background: (0, _prosopo_puzzle_assets.toDataUri)(rendered.background),
34
+ legend: (0, _prosopo_puzzle_assets.toDataUri)(rendered.legend),
35
+ legendIconSize: rendered.legendIconSize,
36
+ targets: rendered.targets
37
+ };
38
+ };
39
+ //#endregion
40
+ exports.renderIconOrderImages = renderIconOrderImages;
41
+ exports.resolveIconOrderRenderSettings = resolveIconOrderRenderSettings;
42
+ exports.toStoredTargets = toStoredTargets;
@@ -0,0 +1,69 @@
1
+ const require_interactiveCaptchaManager = require("../interactiveCaptcha/interactiveCaptchaManager.cjs");
2
+ const require_iconOrderRenderer = require("../iconOrder/iconOrderRenderer.cjs");
3
+ let _prosopo_types = require("@prosopo/types");
4
+ let _prosopo_icon_order_assets = require("@prosopo/icon-order-assets");
5
+ //#region src/tasks/iconOrderCaptcha/iconOrderTasks.ts
6
+ var IconOrderCaptchaManager = class extends require_interactiveCaptchaManager.InteractiveCaptchaManager {
7
+ constructor(..._args) {
8
+ super(..._args);
9
+ this.captchaType = _prosopo_types.CaptchaType.iconOrder;
10
+ this.logLabel = "icon-order";
11
+ }
12
+ getRecordByChallenge(challenge) {
13
+ return this.db.getIconOrderCaptchaRecordByChallenge(challenge);
14
+ }
15
+ updateRecord(challenge, updates) {
16
+ return this.db.updateIconOrderCaptchaRecord(challenge, updates);
17
+ }
18
+ updateSubmissionResult(challenge, result, userSignature, coords) {
19
+ return this.db.updateIconOrderCaptchaRecordResult(challenge, result, false, true, userSignature, coords);
20
+ }
21
+ /**
22
+ * An atomic claim rather than a read of `userSubmitted`: concurrent
23
+ * submissions would all read it unset and each get a verdict, enough to
24
+ * enumerate the ordering of a handful of icons.
25
+ */
26
+ claimSubmission(record) {
27
+ return this.db.claimIconOrderCaptchaSubmission(record.challenge);
28
+ }
29
+ markRecordChecked(challenge) {
30
+ return this.db.markIconOrderCaptchaRecordChecked(challenge);
31
+ }
32
+ decisionMachineEventFields(record) {
33
+ return { iconOrderEvents: record.iconOrderEvents };
34
+ }
35
+ /**
36
+ * The renderer decides where the icons land, so the answer only exists
37
+ * once the imagery does; the caller must store `targets` before responding.
38
+ */
39
+ async getIconOrderCaptchaChallenge(userAccount, dappAccount, tolerance, renderImages) {
40
+ const minted = this.mintChallenge(userAccount, dappAccount);
41
+ const { targets, ...images } = await renderImages();
42
+ return {
43
+ ...minted,
44
+ targets: require_iconOrderRenderer.toStoredTargets(targets),
45
+ tolerance: tolerance ?? _prosopo_types.iconOrderToleranceDefault,
46
+ images
47
+ };
48
+ }
49
+ async verifyIconOrderCaptchaSolution(challenge, providerChallengeSignature, clicks, iconOrderEvents, timeout, userTimestampSignature, ipAddress, behavioralData, salt, simdReadings, clientMetaData) {
50
+ return this.submitInteractiveCaptchaSolution({
51
+ challenge,
52
+ providerChallengeSignature,
53
+ timeout,
54
+ userTimestampSignature,
55
+ ipAddress,
56
+ behavioralData,
57
+ salt,
58
+ simdReadings,
59
+ clientMetaData,
60
+ isCorrect: (record) => (0, _prosopo_icon_order_assets.gradeClicks)(record.targets, clicks, record.tolerance),
61
+ persistInteraction: () => this.db.updateIconOrderCaptchaRecord(challenge, {
62
+ clicks,
63
+ iconOrderEvents
64
+ })
65
+ });
66
+ }
67
+ };
68
+ //#endregion
69
+ exports.IconOrderCaptchaManager = IconOrderCaptchaManager;
@@ -1,24 +1,24 @@
1
1
  const require_usageCounters = require("../../util/usageCounters.cjs");
2
- const require_decisionMachineRunner = require("../decisionMachine/decisionMachineRunner.cjs");
3
2
  const require_rawTlsSignalsMiddleware = require("../../api/rawTlsSignalsMiddleware.cjs");
4
- const require_lang = require("../../rules/lang.cjs");
5
- const require_clientMetaData = require("../../utils/clientMetaData.cjs");
6
3
  const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
7
- const require_enrichDnsEvent = require("../dnsEvent/enrichDnsEvent.cjs");
8
- const require_captchaManager = require("../captchaManager.cjs");
9
- const require_pairs = require("../../pairs.cjs");
10
4
  const require_util = require("../../util.cjs");
5
+ const require_clientMetaData = require("../../utils/clientMetaData.cjs");
11
6
  const require_devicePlatform = require("../../utils/devicePlatform.cjs");
7
+ const require_enrichDnsEvent = require("../dnsEvent/enrichDnsEvent.cjs");
8
+ const require_captchaManager = require("../captchaManager.cjs");
9
+ const require_decisionMachineRunner = require("../decisionMachine/decisionMachineRunner.cjs");
12
10
  const require_frictionlessTasksUtils = require("../frictionless/frictionlessTasksUtils.cjs");
13
11
  const require_evaluateEmailSpamRules = require("../spam/evaluateEmailSpamRules.cjs");
12
+ const require_lang = require("../../rules/lang.cjs");
13
+ const require_pairs = require("../../pairs.cjs");
14
14
  const require_imgCaptchaTasksUtils = require("./imgCaptchaTasksUtils.cjs");
15
15
  let _prosopo_common = require("@prosopo/common");
16
16
  let _prosopo_types = require("@prosopo/types");
17
+ let _polkadot_util = require("@polkadot/util");
18
+ let _prosopo_user_access_policy = require("@prosopo/user-access-policy");
17
19
  let _prosopo_util = require("@prosopo/util");
18
20
  let _prosopo_util_crypto = require("@prosopo/util-crypto");
19
21
  let _prosopo_datasets = require("@prosopo/datasets");
20
- let _prosopo_user_access_policy = require("@prosopo/user-access-policy");
21
- let _polkadot_util = require("@polkadot/util");
22
22
  //#region src/tasks/imgCaptcha/imgCaptchaTasks.ts
23
23
  var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
24
24
  constructor(db, pair, config, logger, writeQueue, usageCounters) {