@prosopo/provider 5.14.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 (303) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +62 -46
  2. package/.turbo/turbo-build$colon$tsc.log +37 -34
  3. package/.turbo/turbo-build.log +63 -50
  4. package/CHANGELOG.md +193 -0
  5. package/LICENSE +201 -0
  6. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +4 -0
  7. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
  8. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +63 -3
  9. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
  10. package/dist/api/blacklistRequestInspector.js +2 -2
  11. package/dist/api/captcha/getAudioCaptchaChallenge.d.ts +5 -0
  12. package/dist/api/captcha/getAudioCaptchaChallenge.d.ts.map +1 -0
  13. package/dist/api/captcha/getAudioCaptchaChallenge.js +37 -0
  14. package/dist/api/captcha/getAudioCaptchaChallenge.js.map +1 -0
  15. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +2 -1
  16. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
  17. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +11 -2
  18. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
  19. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +1 -1
  20. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  21. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +26 -15
  22. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  23. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts +5 -0
  24. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts.map +1 -0
  25. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js +20 -0
  26. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js.map +1 -0
  27. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
  28. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +1 -0
  29. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
  30. package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts +5 -0
  31. package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts.map +1 -0
  32. package/dist/api/captcha/getIconOrderCaptchaChallenge.js +37 -0
  33. package/dist/api/captcha/getIconOrderCaptchaChallenge.js.map +1 -0
  34. package/dist/api/captcha/getImageCaptchaChallenge.js +2 -2
  35. package/dist/api/captcha/getPoWCaptchaChallenge.js +4 -4
  36. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +1 -3
  37. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  38. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +53 -146
  39. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  40. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts +42 -0
  41. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts.map +1 -0
  42. package/dist/api/captcha/interactiveCaptchaChallenge.js +154 -0
  43. package/dist/api/captcha/interactiveCaptchaChallenge.js.map +1 -0
  44. package/dist/api/captcha/interactiveCaptchaSolution.d.ts +14 -0
  45. package/dist/api/captcha/interactiveCaptchaSolution.d.ts.map +1 -0
  46. package/dist/api/captcha/interactiveCaptchaSolution.js +77 -0
  47. package/dist/api/captcha/interactiveCaptchaSolution.js.map +1 -0
  48. package/dist/api/captcha/maintenanceModeResponses.d.ts +4 -2
  49. package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
  50. package/dist/api/captcha/maintenanceModeResponses.js +28 -1
  51. package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
  52. package/dist/api/captcha/submitAudioCaptchaSolution.d.ts +4 -0
  53. package/dist/api/captcha/submitAudioCaptchaSolution.d.ts.map +1 -0
  54. package/dist/api/captcha/submitAudioCaptchaSolution.js +11 -0
  55. package/dist/api/captcha/submitAudioCaptchaSolution.js.map +1 -0
  56. package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts +4 -0
  57. package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts.map +1 -0
  58. package/dist/api/captcha/submitIconOrderCaptchaSolution.js +11 -0
  59. package/dist/api/captcha/submitIconOrderCaptchaSolution.js.map +1 -0
  60. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts +4 -11
  61. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  62. package/dist/api/captcha/submitPoWCaptchaSolution.js +13 -18
  63. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  64. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts +1 -3
  65. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -1
  66. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +6 -73
  67. package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
  68. package/dist/api/captcha/trafficFilterRequestTime.d.ts +4 -1
  69. package/dist/api/captcha/trafficFilterRequestTime.d.ts.map +1 -1
  70. package/dist/api/captcha/trafficFilterRequestTime.js +3 -0
  71. package/dist/api/captcha/trafficFilterRequestTime.js.map +1 -1
  72. package/dist/api/captcha.d.ts.map +1 -1
  73. package/dist/api/captcha.js +8 -0
  74. package/dist/api/captcha.js.map +1 -1
  75. package/dist/api/domainMiddleware.js +1 -1
  76. package/dist/api/ja4Middleware.js +1 -1
  77. package/dist/api/rawTlsSignalsMiddleware.d.ts +14 -1
  78. package/dist/api/rawTlsSignalsMiddleware.d.ts.map +1 -1
  79. package/dist/api/rawTlsSignalsMiddleware.js +111 -23
  80. package/dist/api/rawTlsSignalsMiddleware.js.map +1 -1
  81. package/dist/api/startProviderApi.js +2 -2
  82. package/dist/api/verify.d.ts.map +1 -1
  83. package/dist/api/verify.js +153 -96
  84. package/dist/api/verify.js.map +1 -1
  85. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +65 -2
  86. package/dist/cjs/api/blacklistRequestInspector.cjs +2 -2
  87. package/dist/cjs/api/captcha/getAudioCaptchaChallenge.cjs +37 -0
  88. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +10 -0
  89. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +1 -1
  90. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +25 -14
  91. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.cjs +20 -0
  92. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +1 -0
  93. package/dist/cjs/api/captcha/getIconOrderCaptchaChallenge.cjs +37 -0
  94. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +2 -2
  95. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +4 -4
  96. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +52 -145
  97. package/dist/cjs/api/captcha/interactiveCaptchaChallenge.cjs +154 -0
  98. package/dist/cjs/api/captcha/interactiveCaptchaSolution.cjs +77 -0
  99. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +29 -0
  100. package/dist/cjs/api/captcha/submitAudioCaptchaSolution.cjs +11 -0
  101. package/dist/cjs/api/captcha/submitIconOrderCaptchaSolution.cjs +11 -0
  102. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +11 -16
  103. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +6 -73
  104. package/dist/cjs/api/captcha/trafficFilterRequestTime.cjs +3 -0
  105. package/dist/cjs/api/captcha.cjs +8 -0
  106. package/dist/cjs/api/domainMiddleware.cjs +1 -1
  107. package/dist/cjs/api/ja4Middleware.cjs +1 -1
  108. package/dist/cjs/api/rawTlsSignalsMiddleware.cjs +111 -22
  109. package/dist/cjs/api/startProviderApi.cjs +2 -2
  110. package/dist/cjs/api/verify.cjs +152 -95
  111. package/dist/cjs/compositeIpAddress.cjs +21 -7
  112. package/dist/cjs/index.cjs +1 -1
  113. package/dist/cjs/tasks/audio/audioBuffer.cjs +72 -0
  114. package/dist/cjs/tasks/audio/audioRenderer.cjs +32 -0
  115. package/dist/cjs/tasks/audioAlternative.cjs +23 -0
  116. package/dist/cjs/tasks/audioCaptcha/audioTasks.cjs +65 -0
  117. package/dist/cjs/tasks/audioCaptcha/audioTasksUtils.cjs +19 -0
  118. package/dist/cjs/tasks/captchaManager.cjs +28 -1
  119. package/dist/cjs/tasks/captchaTypeSelection.cjs +31 -3
  120. package/dist/cjs/tasks/client/clientTasks.cjs +2 -2
  121. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +49 -26
  122. package/dist/cjs/tasks/iconOrder/iconOrderRenderer.cjs +42 -0
  123. package/dist/cjs/tasks/iconOrderCaptcha/iconOrderTasks.cjs +69 -0
  124. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +10 -17
  125. package/dist/cjs/tasks/interactiveCaptcha/interactiveCaptchaManager.cjs +423 -0
  126. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +15 -19
  127. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +3 -1
  128. package/dist/cjs/tasks/puzzle/backgroundBuffer.cjs +3 -3
  129. package/dist/cjs/tasks/puzzle/nativeBackground.cjs +12 -5
  130. package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +4 -3
  131. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +40 -493
  132. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +18 -1
  133. package/dist/cjs/tasks/tasks.cjs +6 -0
  134. package/dist/cjs/util.cjs +1 -1
  135. package/dist/compositeIpAddress.d.ts.map +1 -1
  136. package/dist/compositeIpAddress.js +21 -7
  137. package/dist/compositeIpAddress.js.map +1 -1
  138. package/dist/index.js +2 -2
  139. package/dist/tasks/audio/audioBuffer.d.ts +23 -0
  140. package/dist/tasks/audio/audioBuffer.d.ts.map +1 -0
  141. package/dist/tasks/audio/audioBuffer.js +70 -0
  142. package/dist/tasks/audio/audioBuffer.js.map +1 -0
  143. package/dist/tasks/audio/audioRenderer.d.ts +11 -0
  144. package/dist/tasks/audio/audioRenderer.d.ts.map +1 -0
  145. package/dist/tasks/audio/audioRenderer.js +31 -0
  146. package/dist/tasks/audio/audioRenderer.js.map +1 -0
  147. package/dist/tasks/audioAlternative.d.ts +8 -0
  148. package/dist/tasks/audioAlternative.d.ts.map +1 -0
  149. package/dist/tasks/audioAlternative.js +20 -0
  150. package/dist/tasks/audioAlternative.js.map +1 -0
  151. package/dist/tasks/audioCaptcha/audioTasks.d.ts +19 -0
  152. package/dist/tasks/audioCaptcha/audioTasks.d.ts.map +1 -0
  153. package/dist/tasks/audioCaptcha/audioTasks.js +65 -0
  154. package/dist/tasks/audioCaptcha/audioTasks.js.map +1 -0
  155. package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts +3 -0
  156. package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts.map +1 -0
  157. package/dist/tasks/audioCaptcha/audioTasksUtils.js +18 -0
  158. package/dist/tasks/audioCaptcha/audioTasksUtils.js.map +1 -0
  159. package/dist/tasks/captchaManager.d.ts +9 -3
  160. package/dist/tasks/captchaManager.d.ts.map +1 -1
  161. package/dist/tasks/captchaManager.js +29 -2
  162. package/dist/tasks/captchaManager.js.map +1 -1
  163. package/dist/tasks/captchaTypeSelection.d.ts +4 -2
  164. package/dist/tasks/captchaTypeSelection.d.ts.map +1 -1
  165. package/dist/tasks/captchaTypeSelection.js +32 -5
  166. package/dist/tasks/captchaTypeSelection.js.map +1 -1
  167. package/dist/tasks/client/clientTasks.js +2 -2
  168. package/dist/tasks/frictionless/frictionlessTasks.d.ts +6 -1
  169. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  170. package/dist/tasks/frictionless/frictionlessTasks.js +51 -28
  171. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  172. package/dist/tasks/frictionless/routingMachine.d.ts +1 -2
  173. package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -1
  174. package/dist/tasks/frictionless/routingMachine.js.map +1 -1
  175. package/dist/tasks/iconOrder/iconOrderRenderer.d.ts +12 -0
  176. package/dist/tasks/iconOrder/iconOrderRenderer.d.ts.map +1 -0
  177. package/dist/tasks/iconOrder/iconOrderRenderer.js +40 -0
  178. package/dist/tasks/iconOrder/iconOrderRenderer.js.map +1 -0
  179. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts +22 -0
  180. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts.map +1 -0
  181. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js +69 -0
  182. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js.map +1 -0
  183. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  184. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +10 -17
  185. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  186. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts +52 -0
  187. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts.map +1 -0
  188. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js +423 -0
  189. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js.map +1 -0
  190. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  191. package/dist/tasks/powCaptcha/powTasks.js +15 -19
  192. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  193. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +1 -0
  194. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
  195. package/dist/tasks/powCaptcha/powTasksUtils.js +3 -2
  196. package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
  197. package/dist/tasks/puzzle/backgroundBuffer.d.ts +3 -2
  198. package/dist/tasks/puzzle/backgroundBuffer.d.ts.map +1 -1
  199. package/dist/tasks/puzzle/backgroundBuffer.js +3 -3
  200. package/dist/tasks/puzzle/backgroundBuffer.js.map +1 -1
  201. package/dist/tasks/puzzle/nativeBackground.d.ts +5 -1
  202. package/dist/tasks/puzzle/nativeBackground.d.ts.map +1 -1
  203. package/dist/tasks/puzzle/nativeBackground.js +12 -5
  204. package/dist/tasks/puzzle/nativeBackground.js.map +1 -1
  205. package/dist/tasks/puzzle/puzzleRenderer.d.ts +2 -0
  206. package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
  207. package/dist/tasks/puzzle/puzzleRenderer.js +4 -3
  208. package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
  209. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts +14 -16
  210. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  211. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +41 -494
  212. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  213. package/dist/tasks/spam/checkTrafficFilter.d.ts +4 -1
  214. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  215. package/dist/tasks/spam/checkTrafficFilter.js +18 -1
  216. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  217. package/dist/tasks/tasks.d.ts +4 -0
  218. package/dist/tasks/tasks.d.ts.map +1 -1
  219. package/dist/tasks/tasks.js +6 -0
  220. package/dist/tasks/tasks.js.map +1 -1
  221. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +7 -3
  222. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  223. package/dist/tests/integration/clientSettingsPersistence.integration.test.js +44 -2
  224. package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
  225. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +4 -2
  226. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
  227. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +76 -1
  228. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
  229. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +54 -2
  230. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
  231. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts +2 -0
  232. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts.map +1 -0
  233. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js +45 -0
  234. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js.map +1 -0
  235. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +20 -0
  236. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
  237. package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js +15 -1
  238. package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js.map +1 -1
  239. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +174 -0
  240. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  241. package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js +96 -1
  242. package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js.map +1 -1
  243. package/dist/tests/unit/compositeIpAddress.unit.test.js +12 -3
  244. package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -1
  245. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts +2 -0
  246. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts.map +1 -0
  247. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js +105 -0
  248. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js.map +1 -0
  249. package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts +2 -0
  250. package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts.map +1 -0
  251. package/dist/tests/unit/tasks/audioAlternative.unit.test.js +76 -0
  252. package/dist/tests/unit/tasks/audioAlternative.unit.test.js.map +1 -0
  253. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts +2 -0
  254. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts.map +1 -0
  255. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js +259 -0
  256. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js.map +1 -0
  257. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts +2 -0
  258. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts.map +1 -0
  259. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js +52 -0
  260. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js.map +1 -0
  261. package/dist/tests/unit/tasks/captchaManager.unit.test.js +171 -2
  262. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  263. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js +68 -6
  264. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js.map +1 -1
  265. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts +2 -0
  266. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts.map +1 -0
  267. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js +123 -0
  268. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js.map +1 -0
  269. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +31 -0
  270. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
  271. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts +2 -0
  272. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts.map +1 -0
  273. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js +103 -0
  274. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js.map +1 -0
  275. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js +28 -0
  276. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js.map +1 -1
  277. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts +2 -0
  278. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts.map +1 -0
  279. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js +60 -0
  280. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js.map +1 -0
  281. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts +2 -0
  282. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts.map +1 -0
  283. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js +225 -0
  284. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js.map +1 -0
  285. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +23 -1
  286. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
  287. package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js +1 -4
  288. package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js.map +1 -1
  289. package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js +10 -3
  290. package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js.map +1 -1
  291. package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts +2 -0
  292. package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts.map +1 -0
  293. package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js +35 -0
  294. package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js.map +1 -0
  295. package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts +2 -0
  296. package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts.map +1 -0
  297. package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js +49 -0
  298. package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js.map +1 -0
  299. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +17 -14
  300. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts.map +1 -1
  301. package/dist/tests/unit/testUtils/mockProviderEnv.js.map +1 -1
  302. package/dist/util.js +1 -1
  303. package/package.json +107 -103
@@ -1,29 +1,32 @@
1
- const require_metrics = require("../../metrics.cjs");
2
- const require_dnsEventUrl = require("../../dnsEventUrl.cjs");
1
+ const require_rawTlsSignalsMiddleware = require("../../rawTlsSignalsMiddleware.cjs");
3
2
  const require_compositeIpAddress = require("../../../compositeIpAddress.cjs");
4
- const require_blacklistRequestInspector = require("../../blacklistRequestInspector.cjs");
5
3
  const require_devicePlatform = require("../../../utils/devicePlatform.cjs");
4
+ const require_metrics = require("../../metrics.cjs");
5
+ const require_blacklistRequestInspector = require("../../blacklistRequestInspector.cjs");
6
+ const require_audioAlternative = require("../../../tasks/audioAlternative.cjs");
7
+ const require_dnsEventUrl = require("../../dnsEventUrl.cjs");
8
+ const require_captchaTypeSelection = require("../../../tasks/captchaTypeSelection.cjs");
6
9
  const require_tasks = require("../../../tasks/tasks.cjs");
7
10
  const require_apiToggleMaintenanceModeEndpoint = require("../../admin/apiToggleMaintenanceModeEndpoint.cjs");
8
11
  const require_testSiteKey = require("../../testSiteKey.cjs");
9
12
  const require_normalizeRequestIp = require("../../../utils/normalizeRequestIp.cjs");
13
+ const require_trafficFilterRequestTime = require("../trafficFilterRequestTime.cjs");
14
+ const require_maintenanceModeResponses = require("../maintenanceModeResponses.cjs");
10
15
  const require_hashUserAgent = require("../../../utils/hashUserAgent.cjs");
11
16
  const require_hashUserIp = require("../../../utils/hashUserIp.cjs");
12
- const require_rawTlsSignalsMiddleware = require("../../rawTlsSignalsMiddleware.cjs");
13
- const require_maintenanceModeResponses = require("../maintenanceModeResponses.cjs");
14
- const require_trafficFilterRequestTime = require("../trafficFilterRequestTime.cjs");
15
17
  const require_honeypotResponse = require("./honeypotResponse.cjs");
16
18
  const require_accessPolicy = require("./accessPolicy.cjs");
17
19
  const require_constants = require("./constants.cjs");
18
20
  const require_decisionMachine = require("./decisionMachine.cjs");
19
21
  const require_decryptSimdReadings = require("./decryptSimdReadings.cjs");
22
+ const require_refreshLineage = require("./refreshLineage.cjs");
20
23
  const require_sessionDedup = require("./sessionDedup.cjs");
21
24
  const require_shortCircuit = require("./shortCircuit.cjs");
22
25
  let _prosopo_common = require("@prosopo/common");
23
26
  let _prosopo_types = require("@prosopo/types");
27
+ let _prosopo_user_access_policy = require("@prosopo/user-access-policy");
24
28
  let _prosopo_util = require("@prosopo/util");
25
29
  let uuid = require("uuid");
26
- let _prosopo_user_access_policy = require("@prosopo/user-access-policy");
27
30
  let _prosopo_web_bot_auth = require("@prosopo/web-bot-auth");
28
31
  //#region src/api/captcha/getFrictionlessCaptchaChallenge/handler.ts
29
32
  var handler_default = (env, userAccessRulesStorage) => async (req, res, next) => {
@@ -38,7 +41,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
38
41
  }
39
42
  }));
40
43
  });
41
- const { token, headHash, dapp, user, mode, simdReadings, detectorSessionId, currentUrl: reportedCurrentUrl, iframeUrl: reportedIframeUrl, clientSessionId } = _prosopo_types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
44
+ const { token, headHash, dapp, user, mode, simdReadings, detectorSessionId, currentUrl: reportedCurrentUrl, iframeUrl: reportedIframeUrl, clientSessionId, refreshOf } = _prosopo_types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
42
45
  const currentUrl = (0, _prosopo_util.sanitisePageUrl)(reportedCurrentUrl);
43
46
  const iframeUrl = (0, _prosopo_util.sanitisePageUrl)(reportedIframeUrl);
44
47
  const isProtect = (0, _prosopo_util.isProtectDeployment)(currentUrl, iframeUrl);
@@ -108,6 +111,10 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
108
111
  i18n: req.i18n,
109
112
  logger: req.logger
110
113
  }));
114
+ const audioAlternativeEnabled = require_audioAlternative.isAudioAlternativeEnabled(clientRecord.settings);
115
+ tasks.frictionlessManager.setAudioAlternativeEnabled(audioAlternativeEnabled);
116
+ const allowedCaptchaTypes = require_constants.resolveSiteAllowedCaptchaTypes(clientRecord.settings);
117
+ tasks.frictionlessManager.setAllowedCaptchaTypes(allowedCaptchaTypes);
111
118
  if (dedup) {
112
119
  const dedupCountryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
113
120
  const dedupAsn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
@@ -144,16 +151,17 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
144
151
  ...dedupTrafficPolicies && { trafficPolicies: dedupTrafficPolicies }
145
152
  }
146
153
  }) : { captchaType: cachedCaptchaType };
147
- const dedupConflictsWithRouting = dedupRouted.captchaType !== cachedCaptchaType;
154
+ const dedupConflictsWithRouting = require_captchaTypeSelection.coerceToEnabledCaptchaType(dedupRouted.captchaType, allowedCaptchaTypes) !== cachedCaptchaType;
155
+ const dedupConflictsWithAllowedTypes = require_captchaTypeSelection.coerceToEnabledCaptchaType(cachedCaptchaType, allowedCaptchaTypes) !== cachedCaptchaType;
148
156
  let dedupConflictsWithBundle = false;
149
157
  let dedupIncomingBundleId;
150
158
  if (detectorSessionId && dedup.session.bundleId) {
151
159
  dedupIncomingBundleId = (await tasks.frictionlessManager.resolveBundleByDetectorSession(detectorSessionId))?.bundleId;
152
160
  if (dedupIncomingBundleId !== void 0 && dedupIncomingBundleId !== dedup.session.bundleId) dedupConflictsWithBundle = true;
153
161
  }
154
- if (dedupConflictsWithPolicy || dedupConflictsWithRouting) {
162
+ if (dedupConflictsWithPolicy || dedupConflictsWithRouting || dedupConflictsWithAllowedTypes) {
155
163
  req.logger.info(() => ({
156
- msg: "Evicting reused session: cached captchaType conflicts with access policy or routing machine",
164
+ msg: "Evicting reused session: cached captchaType conflicts with access policy, routing machine or allowed types",
157
165
  data: {
158
166
  userSitekeyIpHash,
159
167
  sessionId: dedup.sessionId,
@@ -162,7 +170,8 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
162
170
  policyType: dedupAccessPolicy?.type,
163
171
  policyCaptchaType: dedupAccessPolicy?.captchaType
164
172
  },
165
- ...dedupConflictsWithRouting && { routedCaptchaType: dedupRouted.captchaType }
173
+ ...dedupConflictsWithRouting && { routedCaptchaType: dedupRouted.captchaType },
174
+ ...dedupConflictsWithAllowedTypes && { allowedCaptchaTypes }
166
175
  }
167
176
  }));
168
177
  await tasks.db.checkAndRemoveSession(dedup.sessionId);
@@ -202,7 +211,8 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
202
211
  [_prosopo_types.ApiParams.captchaType]: dedup.captchaType,
203
212
  [_prosopo_types.ApiParams.sessionId]: dedup.sessionId,
204
213
  [_prosopo_types.ApiParams.status]: "ok",
205
- dns_url: require_dnsEventUrl.buildDnsEventUrl(dedup.sessionId)
214
+ dns_url: require_dnsEventUrl.buildDnsEventUrl(dedup.sessionId),
215
+ ...require_audioAlternative.offersAudioAlternative(dedup.captchaType, audioAlternativeEnabled) && { audioAlternativeAvailable: true }
206
216
  });
207
217
  }
208
218
  }
@@ -306,6 +316,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
306
316
  ...triggeredDetectors && triggeredDetectors.length > 0 && { triggeredDetectors },
307
317
  ...shadowDomPenalty !== void 0 && { shadowDomPenalty }
308
318
  };
319
+ const refreshLineage = await require_refreshLineage.resolveRefreshLineage(tasks.db, refreshOf, dapp, /* @__PURE__ */ new Date());
309
320
  tasks.frictionlessManager.setSessionParams({
310
321
  token: sessionToken,
311
322
  score: botScore,
@@ -326,6 +337,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
326
337
  ...decodedSimdReadings && { simdReadings: decodedSimdReadings },
327
338
  ...d !== void 0 && { d },
328
339
  ...clientSessionId && { clientMetaData: { clientSessionId } },
340
+ ...refreshLineage,
329
341
  ...req.tcpToChelloUs !== void 0 && { tcpToChelloUs: req.tcpToChelloUs },
330
342
  ...req.chelloToHandshakeUs !== void 0 && { chelloToHandshakeUs: req.chelloToHandshakeUs },
331
343
  ...require_rawTlsSignalsMiddleware.rawTlsSignalsForSession(req)
@@ -341,7 +353,6 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
341
353
  score: botScore,
342
354
  imageMaxRounds: clientRecord.settings.imageMaxRounds,
343
355
  imageMinRounds: clientRecord.settings.imageMinRounds,
344
- frictionlessTypes: clientRecord.settings.frictionlessTypes,
345
356
  baseImageRounds: env.config.captchas.solved.count,
346
357
  puzzleMaxDifficulty: clientRecord.settings.puzzleMaxDifficulty,
347
358
  platform: require_devicePlatform.derivePlatform(requestUserAgent, webView, { ...typeof ipInfoMobile === "boolean" && { isMobile: ipInfoMobile } }),
@@ -0,0 +1,20 @@
1
+ //#region src/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.ts
2
+ /**
3
+ * Work out where a refresh sits in its chain from the session it replaced.
4
+ *
5
+ * An unknown session, or one from another site, is ignored rather than
6
+ * rejected: the request then mints an ordinary session, which is all a client
7
+ * that never sent `refreshOf` would have got.
8
+ */
9
+ var resolveRefreshLineage = async (db, refreshOf, siteKey, now) => {
10
+ if (!refreshOf) return void 0;
11
+ const replaced = await db.getSessionRecordBySessionId(refreshOf);
12
+ if (!replaced || replaced.siteKey !== siteKey) return void 0;
13
+ return {
14
+ refreshOf,
15
+ refreshCount: (replaced.refreshCount ?? 0) + 1,
16
+ refreshedAfterMs: Math.max(0, now.getTime() - new Date(replaced.createdAt).getTime())
17
+ };
18
+ };
19
+ //#endregion
20
+ exports.resolveRefreshLineage = resolveRefreshLineage;
@@ -68,6 +68,7 @@ var runConfiguredCaptchaTypeShortCircuit = async (input, res) => {
68
68
  }));
69
69
  case _prosopo_types.CaptchaType.pow: return res.json(await input.tasks.frictionlessManager.sendPowCaptcha(sessionParams));
70
70
  case _prosopo_types.CaptchaType.puzzle: return res.json(await input.tasks.frictionlessManager.sendPuzzleCaptcha(sessionParams));
71
+ case _prosopo_types.CaptchaType.iconOrder: return res.json(await input.tasks.frictionlessManager.sendIconOrderCaptcha(sessionParams));
71
72
  default: throw new Error(`Unhandled configured captchaType in /frictionless short-circuit: ${configuredType}`);
72
73
  }
73
74
  };
@@ -0,0 +1,37 @@
1
+ const require_iconOrderRenderer = require("../../tasks/iconOrder/iconOrderRenderer.cjs");
2
+ const require_interactiveCaptchaChallenge = require("./interactiveCaptchaChallenge.cjs");
3
+ const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
4
+ let _prosopo_types = require("@prosopo/types");
5
+ //#region src/api/captcha/getIconOrderCaptchaChallenge.ts
6
+ var issueIconOrderChallenge = async ({ tasks, user, dapp, clientSettings, sessionRecord, trafficVerdict, provenance }) => {
7
+ const challengeVerdict = trafficVerdict.kind === "challenge" ? trafficVerdict : void 0;
8
+ const tolerance = challengeVerdict?.iconOrderTolerance ?? sessionRecord?.iconOrderTolerance ?? clientSettings?.settings?.iconOrderTolerance;
9
+ const renderSettings = require_iconOrderRenderer.resolveIconOrderRenderSettings(clientSettings?.settings?.iconOrder, challengeVerdict?.iconOrderSettings ?? sessionRecord?.iconOrder);
10
+ const challenge = await tasks.iconOrderCaptchaManager.getIconOrderCaptchaChallenge(user, dapp, tolerance, () => require_iconOrderRenderer.renderIconOrderImages(renderSettings));
11
+ await tasks.db.storeIconOrderCaptchaRecord(challenge.challenge, {
12
+ requestedAtTimestamp: challenge.requestedAtTimestamp,
13
+ userAccount: user,
14
+ dappAccount: dapp
15
+ }, challenge.targets, challenge.tolerance, challenge.providerSignature, provenance.ipAddress, provenance.headers, provenance.ja4, provenance.sessionId, provenance.ipInfo);
16
+ return {
17
+ logData: { tolerance: challenge.tolerance },
18
+ response: {
19
+ [_prosopo_types.ApiParams.status]: "ok",
20
+ [_prosopo_types.ApiParams.challenge]: challenge.challenge,
21
+ [_prosopo_types.ApiParams.background]: challenge.images.background,
22
+ [_prosopo_types.ApiParams.legend]: challenge.images.legend,
23
+ [_prosopo_types.ApiParams.legendIconSize]: challenge.images.legendIconSize,
24
+ [_prosopo_types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
25
+ [_prosopo_types.ApiParams.signature]: { [_prosopo_types.ApiParams.provider]: { [_prosopo_types.ApiParams.challenge]: challenge.providerSignature } }
26
+ }
27
+ };
28
+ };
29
+ var getIconOrderCaptchaChallenge_default = (env, userAccessRulesStorage) => require_interactiveCaptchaChallenge.interactiveChallengeHandler(env, userAccessRulesStorage, {
30
+ captchaType: _prosopo_types.CaptchaType.iconOrder,
31
+ label: "icon-order",
32
+ manager: (tasks) => tasks.iconOrderCaptchaManager,
33
+ maintenanceResponse: require_maintenanceModeResponses.buildIconOrderMaintenanceResponse,
34
+ issue: issueIconOrderChallenge
35
+ });
36
+ //#endregion
37
+ exports.default = getIconOrderCaptchaChallenge_default;
@@ -1,12 +1,12 @@
1
- const require_validateAddress = require("../validateAddress.cjs");
2
1
  const require_metrics = require("../metrics.cjs");
3
2
  const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
3
+ const require_validateAddress = require("../validateAddress.cjs");
4
4
  const require_tasks = require("../../tasks/tasks.cjs");
5
5
  const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
6
6
  const require_testSiteKey = require("../testSiteKey.cjs");
7
7
  const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
8
- const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
9
8
  const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
9
+ const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
10
10
  const require_sealedAssetsResolver = require("./sealedAssetsResolver.cjs");
11
11
  const require_signedAssetsResolver = require("./signedAssetsResolver.cjs");
12
12
  let _prosopo_common = require("@prosopo/common");
@@ -1,14 +1,14 @@
1
- const require_validateAddress = require("../validateAddress.cjs");
2
- const require_metrics = require("../metrics.cjs");
3
1
  const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
2
+ const require_metrics = require("../metrics.cjs");
4
3
  const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
4
+ const require_validateAddress = require("../validateAddress.cjs");
5
5
  const require_tasks = require("../../tasks/tasks.cjs");
6
6
  const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
7
7
  const require_testSiteKey = require("../testSiteKey.cjs");
8
8
  const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
9
- const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
10
- const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
11
9
  const require_requestBodySummary = require("../requestBodySummary.cjs");
10
+ const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
11
+ const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
12
12
  let _prosopo_common = require("@prosopo/common");
13
13
  let _prosopo_types = require("@prosopo/types");
14
14
  let _prosopo_util = require("@prosopo/util");
@@ -1,120 +1,51 @@
1
- const require_validateAddress = require("../validateAddress.cjs");
2
- const require_metrics = require("../metrics.cjs");
3
- const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
4
- const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
5
1
  const require_puzzleRenderer = require("../../tasks/puzzle/puzzleRenderer.cjs");
6
- const require_tasks = require("../../tasks/tasks.cjs");
7
- const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
8
- const require_testSiteKey = require("../testSiteKey.cjs");
9
- const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
2
+ const require_interactiveCaptchaChallenge = require("./interactiveCaptchaChallenge.cjs");
10
3
  const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
11
- const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
12
- const require_requestBodySummary = require("../requestBodySummary.cjs");
13
- let _prosopo_common = require("@prosopo/common");
14
4
  let _prosopo_types = require("@prosopo/types");
15
- let _prosopo_util = require("@prosopo/util");
5
+ let _prosopo_puzzle_assets = require("@prosopo/puzzle-assets");
16
6
  //#region src/api/captcha/getPuzzleCaptchaChallenge.ts
17
- var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (req, res, next) => {
18
- let parsed;
19
- try {
20
- parsed = _prosopo_types.GetPuzzleCaptchaChallengeRequestBody.parse(req.body);
21
- } catch (err) {
22
- return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
23
- context: {
24
- code: 400,
25
- error: err
26
- },
27
- i18n: req.i18n,
28
- logger: req.logger
7
+ var issuePuzzleChallenge = async ({ tasks, user, dapp, origin, clientSettings, sessionRecord, trafficVerdict, provenance }) => {
8
+ const challengeVerdict = trafficVerdict.kind === "challenge" ? trafficVerdict : void 0;
9
+ const tolerance = challengeVerdict?.puzzleTolerance ?? sessionRecord?.puzzleTolerance ?? clientSettings?.settings?.puzzleTolerance;
10
+ const routedPuzzleSettings = challengeVerdict?.puzzleSettings ?? sessionRecord?.puzzle;
11
+ const effectivePuzzleSettings = require_puzzleRenderer.resolvePuzzleRenderSettings(clientSettings?.settings?.puzzle, routedPuzzleSettings);
12
+ const effectivePieceSize = require_puzzleRenderer.resolvePuzzlePieceSize(clientSettings?.settings?.puzzle, routedPuzzleSettings);
13
+ const challenge = await tasks.puzzleCaptchaManager.getPuzzleCaptchaChallenge(user, dapp, origin, tolerance);
14
+ await tasks.db.storePuzzleCaptchaRecord(challenge.challenge, {
15
+ requestedAtTimestamp: challenge.requestedAtTimestamp,
16
+ userAccount: user,
17
+ dappAccount: dapp
18
+ }, challenge.targetX, challenge.targetY, challenge.originX, challenge.originY, challenge.tolerance, challenge.providerSignature, provenance.ipAddress, provenance.headers, provenance.ja4, provenance.sessionId, provenance.ipInfo);
19
+ const images = await require_puzzleRenderer.renderPuzzleImages({
20
+ targetX: challenge.targetX,
21
+ targetY: challenge.targetY
22
+ }, effectivePuzzleSettings, effectivePieceSize);
23
+ await tasks.db.updatePuzzleCaptchaRecord(challenge.challenge, { render: {
24
+ ...sessionRecord?.puzzleLevel !== void 0 && { level: sessionRecord.puzzleLevel },
25
+ pieceSize: images.pieceSize,
26
+ geometry: {
27
+ width: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.width,
28
+ height: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.height,
29
+ notchSize: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.notchSize
30
+ },
31
+ settings: {
32
+ decoyCount: effectivePuzzleSettings.decoyCount,
33
+ decoyEdgeDarkness: effectivePuzzleSettings.decoyEdgeDarkness,
34
+ decoyBodyBrightness: effectivePuzzleSettings.decoyBodyBrightness,
35
+ holeDarken: effectivePuzzleSettings.holeDarken,
36
+ decoyHoleDarken: effectivePuzzleSettings.decoyHoleDarken
37
+ },
38
+ backgroundSeed: images.backgroundSeed,
39
+ renderSeed: images.renderSeed
40
+ } }).catch((updateErr) => {
41
+ tasks.logger.warn(() => ({
42
+ err: updateErr,
43
+ msg: "Failed to patch puzzle render inputs onto the challenge record"
29
44
  }));
30
- }
31
- const { user, dapp, sessionId, simdReadings } = parsed;
32
- require_validateAddress.validateSiteKey(dapp);
33
- require_validateAddress.validateAddr(user);
34
- if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
35
- req.logger.info(() => ({
36
- msg: "Maintenance mode active - returning dummy puzzle challenge",
37
- data: {
38
- dapp,
39
- user,
40
- sessionId
41
- }
42
- }));
43
- return res.json(await require_maintenanceModeResponses.buildPuzzleMaintenanceResponse(user, dapp));
44
- }
45
- if (require_testSiteKey.isReservedTestSiteKey(dapp)) {
46
- req.logger.warn(() => ({
47
- msg: "Reserved TEST site key - returning dummy puzzle challenge",
48
- data: {
49
- dapp,
50
- user,
51
- sessionId
52
- }
53
- }));
54
- return res.json(await require_maintenanceModeResponses.buildPuzzleMaintenanceResponse(user, dapp));
55
- }
56
- const tasks = new require_tasks.Tasks(env, req.logger);
57
- try {
58
- const clientSettings = await tasks.db.getClientRecord(dapp);
59
- if (!clientSettings) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
60
- context: {
61
- code: 400,
62
- siteKey: dapp
63
- },
64
- i18n: req.i18n,
65
- logger: req.logger
66
- }));
67
- const normalizedIp = require_normalizeRequestIp.normalizeRequestIp(req.ip, req.logger);
68
- if (!normalizedIp) req.logger.warn(() => ({ msg: "Request missing IP; geoblocking will be skipped" }));
69
- const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
70
- const asn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
71
- const sessionRecord = sessionId ? await tasks.db.getSessionRecordBySessionId(sessionId) : void 0;
72
- const userScope = require_blacklistRequestInspector.getRequestUserScope((0, _prosopo_util.flatten)(req.headers), req.ja4, normalizedIp, user, sessionRecord?.decryptedHeadHash, void 0, countryCode, asn);
73
- const userAccessPolicy = (await tasks.puzzleCaptchaManager.getPrioritisedAccessPolicies(userAccessRulesStorage, dapp, userScope, require_blacklistRequestInspector.normalizeHeadersForMatching(req.headers))).find((p) => !p.deferToVerify);
74
- const { valid, reason, sessionId: validSessionId } = await tasks.puzzleCaptchaManager.isValidRequest(clientSettings, _prosopo_types.CaptchaType.puzzle, env, sessionId, userAccessPolicy, normalizedIp);
75
- if (!valid) return next(new _prosopo_common.ProsopoApiError(reason || "API.BAD_REQUEST", {
76
- context: {
77
- code: 400,
78
- siteKey: dapp,
79
- user
80
- },
81
- i18n: req.i18n,
82
- logger: req.logger
83
- }));
84
- const origin = req.headers.origin;
85
- if (!origin) return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
86
- context: {
87
- error: "Origin header not found",
88
- code: 400,
89
- siteKey: dapp,
90
- user
91
- },
92
- i18n: req.i18n,
93
- logger: req.logger
94
- }));
95
- const trafficVerdict = require_trafficFilterRequestTime.applyTrafficFilterAtRequestTime(req.ipInfo, clientSettings.settings?.trafficFilter, req.logger);
96
- const tolerance = (trafficVerdict.kind === "challenge" ? trafficVerdict.puzzleTolerance : void 0) ?? sessionRecord?.puzzleTolerance ?? clientSettings?.settings?.puzzleTolerance;
97
- const routedPuzzleSettings = (trafficVerdict.kind === "challenge" ? trafficVerdict.puzzleSettings : void 0) ?? sessionRecord?.puzzle;
98
- const effectivePuzzleSettings = require_puzzleRenderer.resolvePuzzleRenderSettings(clientSettings?.settings?.puzzle, routedPuzzleSettings);
99
- const effectivePieceSize = require_puzzleRenderer.resolvePuzzlePieceSize(clientSettings?.settings?.puzzle, routedPuzzleSettings);
100
- const challenge = await tasks.puzzleCaptchaManager.getPuzzleCaptchaChallenge(user, dapp, origin, tolerance);
101
- if (validSessionId && simdReadings) await tasks.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(validSessionId, simdReadings, _prosopo_types.SimdReadingsStage.challenge).catch((updateErr) => {
102
- req.logger.warn(() => ({
103
- err: updateErr,
104
- msg: "Failed to patch session with SIMD readings on puzzle challenge"
105
- }));
106
- });
107
- await tasks.db.storePuzzleCaptchaRecord(challenge.challenge, {
108
- requestedAtTimestamp: challenge.requestedAtTimestamp,
109
- userAccount: user,
110
- dappAccount: dapp
111
- }, challenge.targetX, challenge.targetY, challenge.originX, challenge.originY, challenge.tolerance, challenge.providerSignature, require_compositeIpAddress.getCompositeIpAddress(normalizedIp), (0, _prosopo_util.flatten)(req.headers), req.ja4, validSessionId, req.ipInfo);
112
- const images = await require_puzzleRenderer.renderPuzzleImages({
113
- targetX: challenge.targetX,
114
- targetY: challenge.targetY
115
- }, effectivePuzzleSettings, effectivePieceSize);
116
- const padBytes = trafficVerdict.padBytes;
117
- const getPuzzleCaptchaResponse = {
45
+ });
46
+ return {
47
+ logData: { tolerance: challenge.tolerance },
48
+ response: {
118
49
  [_prosopo_types.ApiParams.status]: "ok",
119
50
  [_prosopo_types.ApiParams.challenge]: challenge.challenge,
120
51
  [_prosopo_types.ApiParams.background]: images.background,
@@ -124,39 +55,15 @@ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (
124
55
  [_prosopo_types.ApiParams.originY]: challenge.originY,
125
56
  [_prosopo_types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
126
57
  [_prosopo_types.ApiParams.signature]: { [_prosopo_types.ApiParams.provider]: { [_prosopo_types.ApiParams.challenge]: challenge.providerSignature } }
127
- };
128
- req.logger.info(() => ({
129
- msg: "Puzzle captcha challenge issued",
130
- data: {
131
- captchaType: _prosopo_types.CaptchaType.puzzle,
132
- challenge: challenge.challenge,
133
- tolerance: challenge.tolerance,
134
- user,
135
- dapp,
136
- session: sessionId
137
- }
138
- }));
139
- res.locals.padBytes = padBytes;
140
- require_metrics.recordCaptchaIssued(_prosopo_types.CaptchaType.puzzle);
141
- return res.json(getPuzzleCaptchaResponse);
142
- } catch (err) {
143
- require_metrics.recordCaptchaIssueError(_prosopo_types.CaptchaType.puzzle);
144
- req.logger.error(() => ({
145
- err,
146
- body: require_requestBodySummary.summariseRequestBody(req),
147
- msg: "Error in puzzle captcha challenge request"
148
- }));
149
- return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
150
- context: {
151
- code: 500,
152
- siteKey: req.body.dapp,
153
- user: req.body.user,
154
- error: err
155
- },
156
- i18n: req.i18n,
157
- logger: req.logger
158
- }));
159
- }
58
+ }
59
+ };
160
60
  };
61
+ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => require_interactiveCaptchaChallenge.interactiveChallengeHandler(env, userAccessRulesStorage, {
62
+ captchaType: _prosopo_types.CaptchaType.puzzle,
63
+ label: "puzzle",
64
+ manager: (tasks) => tasks.puzzleCaptchaManager,
65
+ maintenanceResponse: require_maintenanceModeResponses.buildPuzzleMaintenanceResponse,
66
+ issue: issuePuzzleChallenge
67
+ });
161
68
  //#endregion
162
69
  exports.default = getPuzzleCaptchaChallenge_default;
@@ -0,0 +1,154 @@
1
+ const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
2
+ const require_metrics = require("../metrics.cjs");
3
+ const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
4
+ const require_validateAddress = require("../validateAddress.cjs");
5
+ const require_tasks = require("../../tasks/tasks.cjs");
6
+ const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
7
+ const require_testSiteKey = require("../testSiteKey.cjs");
8
+ const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
9
+ const require_requestBodySummary = require("../requestBodySummary.cjs");
10
+ const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
11
+ let _prosopo_common = require("@prosopo/common");
12
+ let _prosopo_types = require("@prosopo/types");
13
+ let _prosopo_util = require("@prosopo/util");
14
+ //#region src/api/captcha/interactiveCaptchaChallenge.ts
15
+ var capitalise = (text) => text.charAt(0).toUpperCase() + text.slice(1);
16
+ /** Request handling shared by the challenge endpoints of the interactive types. */
17
+ var interactiveChallengeHandler = (env, userAccessRulesStorage, spec) => async (req, res, next) => {
18
+ const { captchaType, label } = spec;
19
+ let parsed;
20
+ try {
21
+ parsed = _prosopo_types.GetPuzzleCaptchaChallengeRequestBody.parse(req.body);
22
+ } catch (err) {
23
+ return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
24
+ context: {
25
+ code: 400,
26
+ error: err
27
+ },
28
+ i18n: req.i18n,
29
+ logger: req.logger
30
+ }));
31
+ }
32
+ const { user, dapp, sessionId, simdReadings } = parsed;
33
+ require_validateAddress.validateSiteKey(dapp);
34
+ require_validateAddress.validateAddr(user);
35
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
36
+ req.logger.info(() => ({
37
+ msg: `Maintenance mode active - returning dummy ${label} challenge`,
38
+ data: {
39
+ dapp,
40
+ user,
41
+ sessionId
42
+ }
43
+ }));
44
+ return res.json(await spec.maintenanceResponse(user, dapp));
45
+ }
46
+ if (require_testSiteKey.isReservedTestSiteKey(dapp)) {
47
+ req.logger.warn(() => ({
48
+ msg: `Reserved TEST site key - returning dummy ${label} challenge`,
49
+ data: {
50
+ dapp,
51
+ user,
52
+ sessionId
53
+ }
54
+ }));
55
+ return res.json(await spec.maintenanceResponse(user, dapp));
56
+ }
57
+ const tasks = new require_tasks.Tasks(env, req.logger);
58
+ const manager = spec.manager(tasks);
59
+ try {
60
+ const clientSettings = await tasks.db.getClientRecord(dapp);
61
+ if (!clientSettings) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
62
+ context: {
63
+ code: 400,
64
+ siteKey: dapp
65
+ },
66
+ i18n: req.i18n,
67
+ logger: req.logger
68
+ }));
69
+ const normalizedIp = require_normalizeRequestIp.normalizeRequestIp(req.ip, req.logger);
70
+ if (!normalizedIp) req.logger.warn(() => ({ msg: "Request missing IP; geoblocking will be skipped" }));
71
+ const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
72
+ const asn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
73
+ const sessionRecord = sessionId ? await tasks.db.getSessionRecordBySessionId(sessionId) : void 0;
74
+ const userScope = require_blacklistRequestInspector.getRequestUserScope((0, _prosopo_util.flatten)(req.headers), req.ja4, normalizedIp, user, sessionRecord?.decryptedHeadHash, void 0, countryCode, asn);
75
+ const userAccessPolicy = (await manager.getPrioritisedAccessPolicies(userAccessRulesStorage, dapp, userScope, require_blacklistRequestInspector.normalizeHeadersForMatching(req.headers))).find((p) => !p.deferToVerify);
76
+ const { valid, reason, sessionId: validSessionId } = await manager.isValidRequest(clientSettings, captchaType, env, sessionId, userAccessPolicy, normalizedIp);
77
+ if (!valid) return next(new _prosopo_common.ProsopoApiError(reason || "API.BAD_REQUEST", {
78
+ context: {
79
+ code: 400,
80
+ siteKey: dapp,
81
+ user
82
+ },
83
+ i18n: req.i18n,
84
+ logger: req.logger
85
+ }));
86
+ const origin = req.headers.origin;
87
+ if (!origin) return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
88
+ context: {
89
+ error: "Origin header not found",
90
+ code: 400,
91
+ siteKey: dapp,
92
+ user
93
+ },
94
+ i18n: req.i18n,
95
+ logger: req.logger
96
+ }));
97
+ const trafficVerdict = require_trafficFilterRequestTime.applyTrafficFilterAtRequestTime(req.ipInfo, clientSettings.settings?.trafficFilter, req.logger);
98
+ if (validSessionId && simdReadings) await tasks.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(validSessionId, simdReadings, _prosopo_types.SimdReadingsStage.challenge).catch((updateErr) => {
99
+ req.logger.warn(() => ({
100
+ err: updateErr,
101
+ msg: `Failed to patch session with SIMD readings on ${label} challenge`
102
+ }));
103
+ });
104
+ const { response, logData } = await spec.issue({
105
+ tasks,
106
+ user,
107
+ dapp,
108
+ origin,
109
+ clientSettings,
110
+ sessionRecord,
111
+ trafficVerdict,
112
+ provenance: {
113
+ ipAddress: require_compositeIpAddress.getCompositeIpAddress(normalizedIp),
114
+ headers: (0, _prosopo_util.flatten)(req.headers),
115
+ ja4: req.ja4,
116
+ sessionId: validSessionId,
117
+ ipInfo: req.ipInfo
118
+ }
119
+ });
120
+ req.logger.info(() => ({
121
+ msg: `${capitalise(label)} captcha challenge issued`,
122
+ data: {
123
+ captchaType,
124
+ challenge: response.challenge,
125
+ ...logData,
126
+ user,
127
+ dapp,
128
+ session: sessionId
129
+ }
130
+ }));
131
+ res.locals.padBytes = trafficVerdict.padBytes;
132
+ require_metrics.recordCaptchaIssued(captchaType);
133
+ return res.json(response);
134
+ } catch (err) {
135
+ require_metrics.recordCaptchaIssueError(captchaType);
136
+ req.logger.error(() => ({
137
+ err,
138
+ body: require_requestBodySummary.summariseRequestBody(req),
139
+ msg: `Error in ${label} captcha challenge request`
140
+ }));
141
+ return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
142
+ context: {
143
+ code: 500,
144
+ siteKey: req.body.dapp,
145
+ user: req.body.user,
146
+ error: err
147
+ },
148
+ i18n: req.i18n,
149
+ logger: req.logger
150
+ }));
151
+ }
152
+ };
153
+ //#endregion
154
+ exports.interactiveChallengeHandler = interactiveChallengeHandler;