@prosopo/provider 3.12.14 → 3.13.6

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 (358) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/dist/api/captcha/getFrictionlessCaptchaChallenge.js +345 -0
  3. package/dist/api/captcha/getImageCaptchaChallenge.js +150 -0
  4. package/dist/api/captcha/getPoWCaptchaChallenge.js +156 -0
  5. package/dist/api/captcha/submitImageCaptchaSolution.js +87 -0
  6. package/dist/api/captcha/submitPoWCaptchaSolution.js +77 -0
  7. package/dist/api/captcha.js +18 -696
  8. package/dist/api/verify.js +2 -1
  9. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge.cjs +344 -0
  10. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +149 -0
  11. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +155 -0
  12. package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +86 -0
  13. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +76 -0
  14. package/dist/cjs/api/captcha.cjs +17 -695
  15. package/dist/cjs/api/verify.cjs +2 -1
  16. package/dist/cjs/index.cjs +2 -0
  17. package/dist/cjs/schedulers/setClientEntropy.cjs +36 -0
  18. package/dist/cjs/tasks/captchaManager.cjs +2 -1
  19. package/dist/cjs/tasks/client/clientTasks.cjs +54 -1
  20. package/dist/cjs/tasks/detection/decodePayload.cjs +379 -609
  21. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +35 -11
  22. package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +4 -1
  23. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +8 -2
  24. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +2 -2
  25. package/dist/cjs/tasks/tasks.cjs +1 -0
  26. package/dist/cjs/utils/hashUserIp.cjs +9 -0
  27. package/dist/index.js +2 -0
  28. package/dist/schedulers/setClientEntropy.js +29 -24
  29. package/dist/tasks/captchaManager.js +2 -1
  30. package/dist/tasks/client/clientTasks.js +55 -2
  31. package/dist/tasks/detection/decodePayload.js +379 -609
  32. package/dist/tasks/detection/getBotScore.js +2 -2
  33. package/dist/tasks/frictionless/frictionlessTasks.js +36 -12
  34. package/dist/tasks/frictionless/frictionlessTasksUtils.js +4 -1
  35. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +8 -2
  36. package/dist/tasks/powCaptcha/powTasks.js +2 -2
  37. package/dist/tasks/tasks.js +1 -0
  38. package/dist/utils/hashUserIp.js +9 -0
  39. package/package.json +20 -20
  40. package/coverage/base.css +0 -224
  41. package/coverage/block-navigation.js +0 -87
  42. package/coverage/clover.xml +0 -4278
  43. package/coverage/coverage-final.json +0 -42
  44. package/coverage/favicon.png +0 -0
  45. package/coverage/index.html +0 -311
  46. package/coverage/prettify.css +0 -1
  47. package/coverage/prettify.js +0 -2
  48. package/coverage/sort-arrow-sprite.png +0 -0
  49. package/coverage/sorter.js +0 -210
  50. package/coverage/src/api/admin/apiAdminRoutesProvider.ts.html +0 -214
  51. package/coverage/src/api/admin/apiRegisterSiteKeyEndpoint.ts.html +0 -259
  52. package/coverage/src/api/admin/apiRemoveDetectorKeyEndpoint.ts.html +0 -283
  53. package/coverage/src/api/admin/apiToggleMaintenanceModeEndpoint.ts.html +0 -334
  54. package/coverage/src/api/admin/apiUpdateDetectorKeyEndpoint.ts.html +0 -298
  55. package/coverage/src/api/admin/createApiAdminRoutesProvider.ts.html +0 -163
  56. package/coverage/src/api/admin/index.html +0 -191
  57. package/coverage/src/api/blacklistRequestInspector.ts.html +0 -751
  58. package/coverage/src/api/block.ts.html +0 -187
  59. package/coverage/src/api/captcha.ts.html +0 -2803
  60. package/coverage/src/api/domainMiddleware.ts.html +0 -493
  61. package/coverage/src/api/headerCheckMiddleware.ts.html +0 -256
  62. package/coverage/src/api/ignoreMiddleware.ts.html +0 -181
  63. package/coverage/src/api/index.html +0 -266
  64. package/coverage/src/api/ja4Middleware.ts.html +0 -400
  65. package/coverage/src/api/public.ts.html +0 -343
  66. package/coverage/src/api/robotsMiddleware.ts.html +0 -157
  67. package/coverage/src/api/validateAddress.ts.html +0 -214
  68. package/coverage/src/api/verify.ts.html +0 -871
  69. package/coverage/src/compositeIpAddress.ts.html +0 -340
  70. package/coverage/src/index.html +0 -161
  71. package/coverage/src/index.ts.html +0 -175
  72. package/coverage/src/pairs.ts.html +0 -238
  73. package/coverage/src/rules/index.html +0 -116
  74. package/coverage/src/rules/lang.ts.html +0 -187
  75. package/coverage/src/schedulers/captchaScheduler.ts.html +0 -250
  76. package/coverage/src/schedulers/getClientList.ts.html +0 -271
  77. package/coverage/src/schedulers/index.html +0 -131
  78. package/coverage/src/services/index.html +0 -131
  79. package/coverage/src/services/ipComparison.ts.html +0 -685
  80. package/coverage/src/services/ipInfo.ts.html +0 -490
  81. package/coverage/src/tasks/captchaManager.ts.html +0 -865
  82. package/coverage/src/tasks/client/clientTasks.ts.html +0 -1381
  83. package/coverage/src/tasks/client/index.html +0 -116
  84. package/coverage/src/tasks/dataset/datasetTasks.ts.html +0 -268
  85. package/coverage/src/tasks/dataset/datasetTasksUtils.ts.html +0 -271
  86. package/coverage/src/tasks/dataset/index.html +0 -131
  87. package/coverage/src/tasks/detection/decodePayload.js.html +0 -127
  88. package/coverage/src/tasks/detection/getBotScore.ts.html +0 -244
  89. package/coverage/src/tasks/detection/index.html +0 -131
  90. package/coverage/src/tasks/frictionless/frictionlessTasks.ts.html +0 -1216
  91. package/coverage/src/tasks/frictionless/frictionlessTasksUtils.ts.html +0 -247
  92. package/coverage/src/tasks/frictionless/index.html +0 -131
  93. package/coverage/src/tasks/imgCaptcha/imgCaptchaTasks.ts.html +0 -1972
  94. package/coverage/src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts.html +0 -232
  95. package/coverage/src/tasks/imgCaptcha/index.html +0 -131
  96. package/coverage/src/tasks/index.html +0 -146
  97. package/coverage/src/tasks/index.ts.html +0 -127
  98. package/coverage/src/tasks/powCaptcha/index.html +0 -131
  99. package/coverage/src/tasks/powCaptcha/powTasks.ts.html +0 -961
  100. package/coverage/src/tasks/powCaptcha/powTasksUtils.ts.html +0 -244
  101. package/coverage/src/tasks/tasks.ts.html +0 -388
  102. package/coverage/src/util.ts.html +0 -1627
  103. package/coverage/src/utils/hashUserAgent.ts.html +0 -184
  104. package/coverage/src/utils/index.html +0 -116
  105. package/dist/api/admin/apiAdminRoutesProvider.d.ts +0 -9
  106. package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +0 -1
  107. package/dist/api/admin/apiAdminRoutesProvider.js.map +0 -1
  108. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts +0 -14
  109. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +0 -1
  110. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +0 -1
  111. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts +0 -23
  112. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +0 -1
  113. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +0 -1
  114. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +0 -13
  115. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +0 -1
  116. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +0 -1
  117. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts +0 -14
  118. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +0 -1
  119. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +0 -1
  120. package/dist/api/admin/createApiAdminRoutesProvider.d.ts +0 -4
  121. package/dist/api/admin/createApiAdminRoutesProvider.d.ts.map +0 -1
  122. package/dist/api/admin/createApiAdminRoutesProvider.js.map +0 -1
  123. package/dist/api/blacklistRequestInspector.d.ts +0 -19
  124. package/dist/api/blacklistRequestInspector.d.ts.map +0 -1
  125. package/dist/api/blacklistRequestInspector.js.map +0 -1
  126. package/dist/api/block.d.ts +0 -3
  127. package/dist/api/block.d.ts.map +0 -1
  128. package/dist/api/block.js.map +0 -1
  129. package/dist/api/captcha.d.ts +0 -4
  130. package/dist/api/captcha.d.ts.map +0 -1
  131. package/dist/api/captcha.js.map +0 -1
  132. package/dist/api/domainMiddleware.d.ts +0 -4
  133. package/dist/api/domainMiddleware.d.ts.map +0 -1
  134. package/dist/api/domainMiddleware.js.map +0 -1
  135. package/dist/api/headerCheckMiddleware.d.ts +0 -4
  136. package/dist/api/headerCheckMiddleware.d.ts.map +0 -1
  137. package/dist/api/headerCheckMiddleware.js.map +0 -1
  138. package/dist/api/ignoreMiddleware.d.ts +0 -3
  139. package/dist/api/ignoreMiddleware.d.ts.map +0 -1
  140. package/dist/api/ignoreMiddleware.js.map +0 -1
  141. package/dist/api/ja4Middleware.d.ts +0 -10
  142. package/dist/api/ja4Middleware.d.ts.map +0 -1
  143. package/dist/api/ja4Middleware.js.map +0 -1
  144. package/dist/api/public.d.ts +0 -4
  145. package/dist/api/public.d.ts.map +0 -1
  146. package/dist/api/public.js.map +0 -1
  147. package/dist/api/robotsMiddleware.d.ts +0 -3
  148. package/dist/api/robotsMiddleware.d.ts.map +0 -1
  149. package/dist/api/robotsMiddleware.js.map +0 -1
  150. package/dist/api/validateAddress.d.ts +0 -5
  151. package/dist/api/validateAddress.d.ts.map +0 -1
  152. package/dist/api/validateAddress.js.map +0 -1
  153. package/dist/api/verify.d.ts +0 -4
  154. package/dist/api/verify.d.ts.map +0 -1
  155. package/dist/api/verify.js.map +0 -1
  156. package/dist/compositeIpAddress.d.ts +0 -5
  157. package/dist/compositeIpAddress.d.ts.map +0 -1
  158. package/dist/compositeIpAddress.js.map +0 -1
  159. package/dist/index.d.ts +0 -17
  160. package/dist/index.d.ts.map +0 -1
  161. package/dist/index.js.map +0 -1
  162. package/dist/pairs.d.ts +0 -3
  163. package/dist/pairs.d.ts.map +0 -1
  164. package/dist/pairs.js.map +0 -1
  165. package/dist/rules/lang.d.ts +0 -3
  166. package/dist/rules/lang.d.ts.map +0 -1
  167. package/dist/rules/lang.js.map +0 -1
  168. package/dist/schedulers/captchaScheduler.d.ts +0 -4
  169. package/dist/schedulers/captchaScheduler.d.ts.map +0 -1
  170. package/dist/schedulers/captchaScheduler.js.map +0 -1
  171. package/dist/schedulers/getClientList.d.ts +0 -4
  172. package/dist/schedulers/getClientList.d.ts.map +0 -1
  173. package/dist/schedulers/getClientList.js.map +0 -1
  174. package/dist/schedulers/setClientEntropy.d.ts +0 -4
  175. package/dist/schedulers/setClientEntropy.d.ts.map +0 -1
  176. package/dist/schedulers/setClientEntropy.js.map +0 -1
  177. package/dist/services/ipComparison.d.ts +0 -3
  178. package/dist/services/ipComparison.d.ts.map +0 -1
  179. package/dist/services/ipComparison.js.map +0 -1
  180. package/dist/services/ipInfo.d.ts +0 -3
  181. package/dist/services/ipInfo.d.ts.map +0 -1
  182. package/dist/services/ipInfo.js.map +0 -1
  183. package/dist/tasks/captchaManager.d.ts +0 -34
  184. package/dist/tasks/captchaManager.d.ts.map +0 -1
  185. package/dist/tasks/captchaManager.js.map +0 -1
  186. package/dist/tasks/client/clientTasks.d.ts +0 -21
  187. package/dist/tasks/client/clientTasks.d.ts.map +0 -1
  188. package/dist/tasks/client/clientTasks.js.map +0 -1
  189. package/dist/tasks/dataset/datasetTasks.d.ts +0 -13
  190. package/dist/tasks/dataset/datasetTasks.d.ts.map +0 -1
  191. package/dist/tasks/dataset/datasetTasks.js.map +0 -1
  192. package/dist/tasks/dataset/datasetTasksUtils.d.ts +0 -3
  193. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +0 -1
  194. package/dist/tasks/dataset/datasetTasksUtils.js.map +0 -1
  195. package/dist/tasks/detection/decodePayload.d.ts +0 -5
  196. package/dist/tasks/detection/decodePayload.d.ts.map +0 -1
  197. package/dist/tasks/detection/decodePayload.js.map +0 -1
  198. package/dist/tasks/detection/getBotScore.d.ts +0 -20
  199. package/dist/tasks/detection/getBotScore.d.ts.map +0 -1
  200. package/dist/tasks/detection/getBotScore.js.map +0 -1
  201. package/dist/tasks/frictionless/frictionlessTasks.d.ts +0 -67
  202. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +0 -1
  203. package/dist/tasks/frictionless/frictionlessTasks.js.map +0 -1
  204. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts +0 -6
  205. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +0 -1
  206. package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +0 -1
  207. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +0 -30
  208. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +0 -1
  209. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +0 -1
  210. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +0 -7
  211. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +0 -1
  212. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +0 -1
  213. package/dist/tasks/index.d.ts +0 -2
  214. package/dist/tasks/index.d.ts.map +0 -1
  215. package/dist/tasks/index.js.map +0 -1
  216. package/dist/tasks/powCaptcha/powTasks.d.ts +0 -17
  217. package/dist/tasks/powCaptcha/powTasks.d.ts.map +0 -1
  218. package/dist/tasks/powCaptcha/powTasks.js.map +0 -1
  219. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +0 -3
  220. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +0 -1
  221. package/dist/tasks/powCaptcha/powTasksUtils.js.map +0 -1
  222. package/dist/tasks/tasks.d.ts +0 -25
  223. package/dist/tasks/tasks.d.ts.map +0 -1
  224. package/dist/tasks/tasks.js.map +0 -1
  225. package/dist/tests/index.d.ts +0 -2
  226. package/dist/tests/index.d.ts.map +0 -1
  227. package/dist/tests/index.js +0 -2
  228. package/dist/tests/index.js.map +0 -1
  229. package/dist/tests/integration/accessRules.integration.test.d.ts +0 -2
  230. package/dist/tests/integration/accessRules.integration.test.d.ts.map +0 -1
  231. package/dist/tests/integration/accessRules.integration.test.js +0 -588
  232. package/dist/tests/integration/accessRules.integration.test.js.map +0 -1
  233. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts +0 -2
  234. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts.map +0 -1
  235. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +0 -60
  236. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +0 -1
  237. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts +0 -2
  238. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts.map +0 -1
  239. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +0 -368
  240. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +0 -1
  241. package/dist/tests/integration/imgCaptcha.integration.test.d.ts +0 -2
  242. package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +0 -1
  243. package/dist/tests/integration/imgCaptcha.integration.test.js +0 -272
  244. package/dist/tests/integration/imgCaptcha.integration.test.js.map +0 -1
  245. package/dist/tests/integration/ipValidation.integration.test.d.ts +0 -2
  246. package/dist/tests/integration/ipValidation.integration.test.d.ts.map +0 -1
  247. package/dist/tests/integration/ipValidation.integration.test.js +0 -75
  248. package/dist/tests/integration/ipValidation.integration.test.js.map +0 -1
  249. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +0 -32
  250. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +0 -1
  251. package/dist/tests/integration/mocks/solvedTestCaptchas.js +0 -1046
  252. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +0 -1
  253. package/dist/tests/integration/powCaptcha.integration.test.d.ts +0 -2
  254. package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +0 -1
  255. package/dist/tests/integration/powCaptcha.integration.test.js +0 -308
  256. package/dist/tests/integration/powCaptcha.integration.test.js.map +0 -1
  257. package/dist/tests/integration/registerSitekey.d.ts +0 -3
  258. package/dist/tests/integration/registerSitekey.d.ts.map +0 -1
  259. package/dist/tests/integration/registerSitekey.js +0 -24
  260. package/dist/tests/integration/registerSitekey.js.map +0 -1
  261. package/dist/tests/integration/userAccessPolicy.d.ts +0 -2
  262. package/dist/tests/integration/userAccessPolicy.d.ts.map +0 -1
  263. package/dist/tests/integration/userAccessPolicy.js +0 -2
  264. package/dist/tests/integration/userAccessPolicy.js.map +0 -1
  265. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts +0 -2
  266. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts.map +0 -1
  267. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +0 -60
  268. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +0 -1
  269. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +0 -2
  270. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +0 -1
  271. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +0 -43
  272. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +0 -1
  273. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +0 -2
  274. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +0 -1
  275. package/dist/tests/unit/api/ja4Middleware.unit.test.js +0 -57
  276. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +0 -1
  277. package/dist/tests/unit/compositeIpAddress.unit.test.d.ts +0 -2
  278. package/dist/tests/unit/compositeIpAddress.unit.test.d.ts.map +0 -1
  279. package/dist/tests/unit/compositeIpAddress.unit.test.js +0 -86
  280. package/dist/tests/unit/compositeIpAddress.unit.test.js.map +0 -1
  281. package/dist/tests/unit/pairs.unit.test.d.ts +0 -2
  282. package/dist/tests/unit/pairs.unit.test.d.ts.map +0 -1
  283. package/dist/tests/unit/pairs.unit.test.js +0 -83
  284. package/dist/tests/unit/pairs.unit.test.js.map +0 -1
  285. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +0 -2
  286. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +0 -1
  287. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +0 -75
  288. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +0 -1
  289. package/dist/tests/unit/services/ipComparison.unit.test.d.ts +0 -2
  290. package/dist/tests/unit/services/ipComparison.unit.test.d.ts.map +0 -1
  291. package/dist/tests/unit/services/ipComparison.unit.test.js +0 -258
  292. package/dist/tests/unit/services/ipComparison.unit.test.js.map +0 -1
  293. package/dist/tests/unit/services/ipInfo.unit.test.d.ts +0 -2
  294. package/dist/tests/unit/services/ipInfo.unit.test.d.ts.map +0 -1
  295. package/dist/tests/unit/services/ipInfo.unit.test.js +0 -210
  296. package/dist/tests/unit/services/ipInfo.unit.test.js.map +0 -1
  297. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts +0 -2
  298. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts.map +0 -1
  299. package/dist/tests/unit/tasks/captchaManager.unit.test.js +0 -311
  300. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +0 -1
  301. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +0 -2
  302. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +0 -1
  303. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +0 -289
  304. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +0 -1
  305. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +0 -2
  306. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +0 -1
  307. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +0 -92
  308. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +0 -1
  309. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +0 -2
  310. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +0 -1
  311. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +0 -75
  312. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +0 -1
  313. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts +0 -2
  314. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts.map +0 -1
  315. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js +0 -143
  316. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js.map +0 -1
  317. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts +0 -2
  318. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts.map +0 -1
  319. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +0 -145
  320. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +0 -1
  321. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts +0 -2
  322. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts.map +0 -1
  323. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +0 -64
  324. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +0 -1
  325. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +0 -2
  326. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +0 -1
  327. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +0 -388
  328. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +0 -1
  329. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +0 -2
  330. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +0 -1
  331. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +0 -46
  332. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +0 -1
  333. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +0 -2
  334. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +0 -1
  335. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +0 -216
  336. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +0 -1
  337. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +0 -2
  338. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +0 -1
  339. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +0 -69
  340. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +0 -1
  341. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts +0 -2
  342. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts.map +0 -1
  343. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js +0 -505
  344. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js.map +0 -1
  345. package/dist/tests/unit/util.ipDistance.unit.test.d.ts +0 -2
  346. package/dist/tests/unit/util.ipDistance.unit.test.d.ts.map +0 -1
  347. package/dist/tests/unit/util.ipDistance.unit.test.js +0 -93
  348. package/dist/tests/unit/util.ipDistance.unit.test.js.map +0 -1
  349. package/dist/tests/unit/util.unit.test.d.ts +0 -2
  350. package/dist/tests/unit/util.unit.test.d.ts.map +0 -1
  351. package/dist/tests/unit/util.unit.test.js +0 -170
  352. package/dist/tests/unit/util.unit.test.js.map +0 -1
  353. package/dist/util.d.ts +0 -24
  354. package/dist/util.d.ts.map +0 -1
  355. package/dist/util.js.map +0 -1
  356. package/dist/utils/hashUserAgent.d.ts +0 -2
  357. package/dist/utils/hashUserAgent.d.ts.map +0 -1
  358. package/dist/utils/hashUserAgent.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,144 @@
1
1
  # @prosopo/provider
2
2
 
3
+ ## 3.13.6
4
+ ### Patch Changes
5
+
6
+ - 93d92a7: little bump for publish all
7
+ - Updated dependencies [93d92a7]
8
+ - @prosopo/api@3.1.36
9
+ - @prosopo/api-express-router@3.0.39
10
+ - @prosopo/api-route@2.6.33
11
+ - @prosopo/common@3.1.25
12
+ - @prosopo/database@3.5.5
13
+ - @prosopo/datasets@3.0.48
14
+ - @prosopo/env@3.2.27
15
+ - @prosopo/keyring@2.8.39
16
+ - @prosopo/load-balancer@2.8.12
17
+ - @prosopo/locale@3.1.25
18
+ - @prosopo/types@3.6.3
19
+ - @prosopo/types-database@4.0.5
20
+ - @prosopo/types-env@2.7.52
21
+ - @prosopo/user-access-policy@3.5.31
22
+ - @prosopo/util@3.2.3
23
+ - @prosopo/util-crypto@13.5.27
24
+
25
+ ## 3.13.5
26
+ ### Patch Changes
27
+
28
+ - 8ee8434: bump node engines to 24 and npm version to 11
29
+ - cfee479: make @prosopo/config a dev dep
30
+ - e843e62: Adding more sensible punishment for invalid decryption key
31
+ - Updated dependencies [8ee8434]
32
+ - Updated dependencies [cfee479]
33
+ - @prosopo/api-express-router@3.0.38
34
+ - @prosopo/user-access-policy@3.5.30
35
+ - @prosopo/types-database@4.0.4
36
+ - @prosopo/load-balancer@2.8.11
37
+ - @prosopo/util-crypto@13.5.26
38
+ - @prosopo/api-route@2.6.32
39
+ - @prosopo/types-env@2.7.51
40
+ - @prosopo/database@3.5.4
41
+ - @prosopo/datasets@3.0.47
42
+ - @prosopo/keyring@2.8.38
43
+ - @prosopo/common@3.1.24
44
+ - @prosopo/locale@3.1.24
45
+ - @prosopo/types@3.6.2
46
+ - @prosopo/util@3.2.2
47
+ - @prosopo/api@3.1.35
48
+ - @prosopo/env@3.2.26
49
+
50
+ ## 3.13.4
51
+ ### Patch Changes
52
+
53
+ - e926831: mega mini bump for all to trigger publish all
54
+ - Updated dependencies [e926831]
55
+ - @prosopo/config@3.1.23
56
+ - @prosopo/api@3.1.34
57
+ - @prosopo/api-express-router@3.0.37
58
+ - @prosopo/api-route@2.6.31
59
+ - @prosopo/common@3.1.23
60
+ - @prosopo/database@3.5.3
61
+ - @prosopo/datasets@3.0.46
62
+ - @prosopo/env@3.2.25
63
+ - @prosopo/keyring@2.8.37
64
+ - @prosopo/load-balancer@2.8.10
65
+ - @prosopo/locale@3.1.23
66
+ - @prosopo/types@3.6.1
67
+ - @prosopo/types-database@4.0.3
68
+ - @prosopo/types-env@2.7.50
69
+ - @prosopo/user-access-policy@3.5.29
70
+ - @prosopo/util@3.2.1
71
+ - @prosopo/util-crypto@13.5.25
72
+
73
+ ## 3.13.3
74
+ ### Patch Changes
75
+
76
+ - 3be9174: Create scheduled task status
77
+ - Updated dependencies [0a9887c]
78
+ - @prosopo/types-database@4.0.2
79
+ - @prosopo/database@3.5.2
80
+ - @prosopo/datasets@3.0.45
81
+ - @prosopo/types-env@2.7.49
82
+ - @prosopo/env@3.2.24
83
+ - @prosopo/api-express-router@3.0.36
84
+
85
+ ## 3.13.2
86
+ ### Patch Changes
87
+
88
+ - Updated dependencies [3e5d80a]
89
+ - @prosopo/types-database@4.0.1
90
+ - @prosopo/database@3.5.1
91
+ - @prosopo/datasets@3.0.44
92
+ - @prosopo/types-env@2.7.48
93
+ - @prosopo/env@3.2.23
94
+ - @prosopo/api-express-router@3.0.35
95
+
96
+ ## 3.13.1
97
+ ### Patch Changes
98
+
99
+ - 447179c: Fix config and client getter
100
+
101
+ ## 3.13.0
102
+ ### Minor Changes
103
+
104
+ - bb5f41c: Context awareness
105
+
106
+ ### Patch Changes
107
+
108
+ - fdef625: fix maint mode
109
+ - 55a64c6: stop refresh image to pow
110
+ - aa8216a: bump
111
+ - 8ce9205: Change engine requirements
112
+ - 6ac5367: Less drastic reaction to bad sim score
113
+ - b6e98b2: Run npm audit
114
+ - 55a64c6: Persist sessions for user ip combinations
115
+ - Updated dependencies [8ce9205]
116
+ - Updated dependencies [15ae7cf]
117
+ - Updated dependencies [bb5f41c]
118
+ - Updated dependencies [55a64c6]
119
+ - Updated dependencies [8ce9205]
120
+ - Updated dependencies [df79c03]
121
+ - Updated dependencies [8f22479]
122
+ - Updated dependencies [b6e98b2]
123
+ - Updated dependencies [55a64c6]
124
+ - @prosopo/user-access-policy@3.5.28
125
+ - @prosopo/types@3.6.0
126
+ - @prosopo/types-database@4.0.0
127
+ - @prosopo/database@3.5.0
128
+ - @prosopo/util@3.2.0
129
+ - @prosopo/api-express-router@3.0.34
130
+ - @prosopo/load-balancer@2.8.9
131
+ - @prosopo/util-crypto@13.5.24
132
+ - @prosopo/api-route@2.6.30
133
+ - @prosopo/types-env@2.7.47
134
+ - @prosopo/datasets@3.0.43
135
+ - @prosopo/keyring@2.8.36
136
+ - @prosopo/common@3.1.22
137
+ - @prosopo/locale@3.1.22
138
+ - @prosopo/api@3.1.33
139
+ - @prosopo/env@3.2.22
140
+ - @prosopo/config@3.1.22
141
+
3
142
  ## 3.12.14
4
143
  ### Patch Changes
5
144
 
@@ -0,0 +1,345 @@
1
+ import { ProsopoApiError } from "@prosopo/common";
2
+ import { GetFrictionlessCaptchaChallengeRequestBody, ApiParams, CaptchaType } from "@prosopo/types";
3
+ import { flatten, compareBinaryStrings } from "@prosopo/util";
4
+ import { getCompositeIpAddress } from "../../compositeIpAddress.js";
5
+ import { FrictionlessReason, FrictionlessManager } from "../../tasks/frictionless/frictionlessTasks.js";
6
+ import { timestampDecayFunction } from "../../tasks/frictionless/frictionlessTasksUtils.js";
7
+ import "../../tasks/index.js";
8
+ import { hashUserAgent } from "../../utils/hashUserAgent.js";
9
+ import { hashUserIp } from "../../utils/hashUserIp.js";
10
+ import { getMaintenanceMode } from "../admin/apiToggleMaintenanceModeEndpoint.js";
11
+ import { getRequestUserScope } from "../blacklistRequestInspector.js";
12
+ import { Tasks } from "../../tasks/tasks.js";
13
+ const DEFAULT_FRICTIONLESS_THRESHOLD = 0.5;
14
+ const getRoundsFromSimScore = (simScore) => {
15
+ if (simScore >= 0.9) return 0;
16
+ if (simScore >= 0.8) return 3;
17
+ if (simScore >= 0.7) return 4;
18
+ if (simScore >= 0.6) return 6;
19
+ if (simScore >= 0.5) return 7;
20
+ return 8;
21
+ };
22
+ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (req, res, next) => {
23
+ try {
24
+ const tasks = new Tasks(env, req.logger);
25
+ const { token, headHash, dapp, user } = GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
26
+ if (getMaintenanceMode()) {
27
+ req.logger.info(() => ({
28
+ msg: "Maintenance mode active - storing dummy token and sending PoW captcha",
29
+ data: { dapp, user }
30
+ }));
31
+ return res.json(
32
+ await tasks.frictionlessManager.sendPowCaptcha({
33
+ token,
34
+ score: 0,
35
+ threshold: 0.5,
36
+ scoreComponents: {
37
+ baseScore: 0
38
+ },
39
+ providerSelectEntropy: 0,
40
+ ipAddress: getCompositeIpAddress(req.ip || ""),
41
+ webView: false,
42
+ iFrame: false,
43
+ decryptedHeadHash: ""
44
+ })
45
+ );
46
+ }
47
+ const existingToken = await tasks.db.getSessionRecordByToken(token);
48
+ if (existingToken) {
49
+ req.logger.info(() => ({
50
+ token: existingToken,
51
+ msg: "Token has already been used"
52
+ }));
53
+ return next(
54
+ new ProsopoApiError("API.BAD_REQUEST", {
55
+ context: {
56
+ code: 400,
57
+ siteKey: dapp,
58
+ user
59
+ },
60
+ i18n: req.i18n,
61
+ logger: req.logger
62
+ })
63
+ );
64
+ }
65
+ const userSitekeyIpHash = hashUserIp(user, req.ip || "", dapp);
66
+ const existingSession = await tasks.db.getSessionByuserSitekeyIpHash(userSitekeyIpHash);
67
+ if (existingSession) {
68
+ req.logger.info(() => ({
69
+ msg: "Reusing existing session for user-IP-sitekey combination",
70
+ data: {
71
+ userSitekeyIpHash,
72
+ sessionId: existingSession.sessionId,
73
+ captchaType: existingSession.captchaType
74
+ }
75
+ }));
76
+ return res.json({
77
+ [ApiParams.captchaType]: existingSession.captchaType,
78
+ [ApiParams.sessionId]: existingSession.sessionId,
79
+ [ApiParams.status]: "ok"
80
+ });
81
+ }
82
+ const lScore = tasks.frictionlessManager.checkLangRules(
83
+ req.headers["accept-language"] || ""
84
+ );
85
+ const {
86
+ baseBotScore,
87
+ timestamp,
88
+ providerSelectEntropy,
89
+ userId,
90
+ userAgent,
91
+ webView,
92
+ iFrame,
93
+ decryptedHeadHash,
94
+ decryptionFailed
95
+ } = await tasks.frictionlessManager.decryptPayload(token, headHash);
96
+ req.logger.debug(() => ({
97
+ msg: "Decrypted payload",
98
+ data: {
99
+ baseBotScore,
100
+ timestamp,
101
+ providerSelectEntropy,
102
+ userId,
103
+ userAgent,
104
+ webView
105
+ }
106
+ }));
107
+ let botScore = baseBotScore + lScore;
108
+ const clientRecord = await tasks.db.getClientRecord(dapp);
109
+ if (!clientRecord) {
110
+ return next(
111
+ new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
112
+ context: { code: 400, siteKey: dapp },
113
+ i18n: req.i18n,
114
+ logger: req.logger
115
+ })
116
+ );
117
+ }
118
+ const { valid, reason } = await tasks.frictionlessManager.isValidRequest(
119
+ clientRecord,
120
+ CaptchaType.frictionless,
121
+ env
122
+ );
123
+ if (!valid) {
124
+ return next(
125
+ new ProsopoApiError(reason || "API.BAD_REQUEST", {
126
+ context: {
127
+ code: 400,
128
+ siteKey: dapp,
129
+ user
130
+ },
131
+ i18n: req.i18n,
132
+ logger: req.logger
133
+ })
134
+ );
135
+ }
136
+ const botThreshold = clientRecord.settings?.frictionlessThreshold || DEFAULT_FRICTIONLESS_THRESHOLD;
137
+ let scoreComponents = {
138
+ baseScore: baseBotScore,
139
+ ...lScore && { lScore }
140
+ };
141
+ const ipAddress = getCompositeIpAddress(req.ip || "");
142
+ tasks.frictionlessManager.setSessionParams({
143
+ token,
144
+ score: botScore,
145
+ threshold: botThreshold,
146
+ scoreComponents,
147
+ providerSelectEntropy,
148
+ ipAddress,
149
+ webView,
150
+ iFrame,
151
+ decryptedHeadHash
152
+ });
153
+ const userScope = getRequestUserScope(
154
+ flatten(req.headers),
155
+ req.ja4,
156
+ req.ip,
157
+ user
158
+ );
159
+ const userAccessPolicy = (await tasks.frictionlessManager.getPrioritisedAccessPolicies(
160
+ userAccessRulesStorage,
161
+ dapp,
162
+ userScope
163
+ ))[0];
164
+ if (userAccessPolicy) {
165
+ const scoreUpdate = tasks.frictionlessManager.scoreIncreaseAccessPolicy(
166
+ userAccessPolicy,
167
+ baseBotScore,
168
+ botScore,
169
+ scoreComponents
170
+ );
171
+ botScore = scoreUpdate.score;
172
+ scoreComponents = scoreUpdate.scoreComponents;
173
+ tasks.frictionlessManager.updateScore(botScore, scoreComponents);
174
+ if (userAccessPolicy.captchaType === CaptchaType.image) {
175
+ return res.json(
176
+ await tasks.frictionlessManager.sendImageCaptcha({
177
+ solvedImagesCount: userAccessPolicy.solvedImagesCount,
178
+ userSitekeyIpHash,
179
+ reason: FrictionlessReason.USER_ACCESS_POLICY
180
+ })
181
+ );
182
+ }
183
+ if (userAccessPolicy.captchaType === CaptchaType.pow) {
184
+ return res.json(
185
+ await tasks.frictionlessManager.sendPowCaptcha({
186
+ userSitekeyIpHash,
187
+ reason: FrictionlessReason.USER_ACCESS_POLICY
188
+ })
189
+ );
190
+ }
191
+ }
192
+ const headersUserAgent = req.headers["user-agent"];
193
+ const hashedHeadersUserAgent = headersUserAgent ? hashUserAgent(headersUserAgent) : "";
194
+ const headersProsopoUser = req.headers["prosopo-user"];
195
+ if (hashedHeadersUserAgent !== userAgent || headersProsopoUser !== userId) {
196
+ req.logger.info(() => ({
197
+ msg: "User agent or user id does not match",
198
+ data: {
199
+ headersUserAgent,
200
+ hashedHeadersUserAgent,
201
+ userAgent,
202
+ // This is the hashed user agent from the token
203
+ headersProsopoUser,
204
+ userId
205
+ }
206
+ }));
207
+ return res.json(
208
+ await tasks.frictionlessManager.sendImageCaptcha({
209
+ solvedImagesCount: timestampDecayFunction(
210
+ timestamp,
211
+ decryptionFailed
212
+ ),
213
+ userSitekeyIpHash,
214
+ reason: FrictionlessReason.USER_AGENT_MISMATCH
215
+ })
216
+ );
217
+ }
218
+ if (clientRecord.settings.contextAware?.enabled) {
219
+ const clientEntropy = await tasks.frictionlessManager.getClientEntropy(
220
+ clientRecord.account
221
+ );
222
+ if (clientEntropy) {
223
+ if (!decryptedHeadHash) {
224
+ tasks.logger.info(() => ({
225
+ msg: "No decryptedHeadHash in session for context aware client"
226
+ }));
227
+ return next(
228
+ new ProsopoApiError("API.BAD_REQUEST", {
229
+ context: {
230
+ code: 400,
231
+ siteKey: dapp,
232
+ user
233
+ },
234
+ i18n: req.i18n,
235
+ logger: req.logger
236
+ })
237
+ );
238
+ }
239
+ const sim = compareBinaryStrings(decryptedHeadHash, clientEntropy);
240
+ const isValidContext = sim >= clientRecord.settings.contextAware.threshold;
241
+ if (!isValidContext) {
242
+ return res.json(
243
+ await tasks.frictionlessManager.sendImageCaptcha({
244
+ solvedImagesCount: getRoundsFromSimScore(sim),
245
+ userSitekeyIpHash,
246
+ reason: FrictionlessReason.CONTEXT_AWARE_VALIDATION_FAILED
247
+ })
248
+ );
249
+ }
250
+ }
251
+ }
252
+ if (clientRecord.settings.disallowWebView && webView) {
253
+ tasks.logger.info(() => ({
254
+ msg: "WebView detected"
255
+ }));
256
+ const scoreUpdate = tasks.frictionlessManager.scoreIncreaseWebView(
257
+ baseBotScore,
258
+ botScore,
259
+ scoreComponents
260
+ );
261
+ botScore = scoreUpdate.score;
262
+ scoreComponents = scoreUpdate.scoreComponents;
263
+ tasks.frictionlessManager.updateScore(botScore, scoreComponents);
264
+ return res.json(
265
+ await tasks.frictionlessManager.sendImageCaptcha({
266
+ solvedImagesCount: env.config.captchas.solved.count * 2,
267
+ userSitekeyIpHash,
268
+ reason: FrictionlessReason.WEBVIEW_DETECTED
269
+ })
270
+ );
271
+ }
272
+ if (FrictionlessManager.timestampTooOld(timestamp)) {
273
+ const scoreUpdate = tasks.frictionlessManager.scoreIncreaseTimestamp(
274
+ timestamp,
275
+ baseBotScore,
276
+ botScore,
277
+ scoreComponents
278
+ );
279
+ botScore = scoreUpdate.score;
280
+ scoreComponents = scoreUpdate.scoreComponents;
281
+ tasks.frictionlessManager.updateScore(botScore, scoreComponents);
282
+ return res.json(
283
+ await tasks.frictionlessManager.sendImageCaptcha({
284
+ solvedImagesCount: timestampDecayFunction(
285
+ timestamp,
286
+ decryptionFailed
287
+ ),
288
+ userSitekeyIpHash,
289
+ reason: FrictionlessReason.OLD_TIMESTAMP
290
+ })
291
+ );
292
+ }
293
+ const hostVerified = await tasks.frictionlessManager.hostVerified(
294
+ providerSelectEntropy
295
+ );
296
+ if (!hostVerified.verified) {
297
+ const scoreUpdate = tasks.frictionlessManager.scoreIncreaseUnverifiedHost(
298
+ hostVerified.domain,
299
+ baseBotScore,
300
+ botScore,
301
+ scoreComponents
302
+ );
303
+ botScore = scoreUpdate.score;
304
+ scoreComponents = scoreUpdate.scoreComponents;
305
+ tasks.frictionlessManager.updateScore(botScore, scoreComponents);
306
+ }
307
+ if (Number(botScore) > botThreshold) {
308
+ req.logger.info(() => ({
309
+ msg: "Bot score is greater than threshold",
310
+ data: {
311
+ botScore,
312
+ botThreshold,
313
+ token
314
+ }
315
+ }));
316
+ return res.json(
317
+ await tasks.frictionlessManager.sendImageCaptcha({
318
+ solvedImagesCount: env.config.captchas.solved.count,
319
+ userSitekeyIpHash,
320
+ reason: FrictionlessReason.BOT_SCORE_ABOVE_THRESHOLD
321
+ })
322
+ );
323
+ }
324
+ return res.json(
325
+ await tasks.frictionlessManager.sendPowCaptcha({
326
+ userSitekeyIpHash
327
+ })
328
+ );
329
+ } catch (err) {
330
+ req.logger.error(() => ({
331
+ err,
332
+ msg: "Error in frictionless captcha challenge"
333
+ }));
334
+ return next(
335
+ new ProsopoApiError("API.BAD_REQUEST", {
336
+ context: { code: 400, error: err },
337
+ i18n: req.i18n,
338
+ logger: req.logger
339
+ })
340
+ );
341
+ }
342
+ };
343
+ export {
344
+ getFrictionlessCaptchaChallenge as default
345
+ };
@@ -0,0 +1,150 @@
1
+ import { ProsopoApiError } from "@prosopo/common";
2
+ import { parseCaptchaAssets } from "@prosopo/datasets";
3
+ import { CaptchaRequestBody, CaptchaType, ApiParams } from "@prosopo/types";
4
+ import { getIPAddress, flatten } from "@prosopo/util";
5
+ import "../../tasks/index.js";
6
+ import { getRequestUserScope } from "../blacklistRequestInspector.js";
7
+ import { validateSiteKey, validateAddr } from "../validateAddress.js";
8
+ import { Tasks } from "../../tasks/tasks.js";
9
+ const getImageCaptchaChallenge = (env, userAccessRulesStorage) => async (req, res, next) => {
10
+ const tasks = new Tasks(env, req.logger);
11
+ let parsed;
12
+ if (!req.ip) {
13
+ return next(
14
+ new ProsopoApiError("API.BAD_REQUEST", {
15
+ context: { code: 400, error: "IP address not found" },
16
+ i18n: req.i18n,
17
+ logger: req.logger
18
+ })
19
+ );
20
+ }
21
+ const ipAddress = getIPAddress(req.ip || "");
22
+ try {
23
+ parsed = CaptchaRequestBody.parse(req.body);
24
+ } catch (err) {
25
+ return next(
26
+ new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
27
+ context: { code: 400, error: err },
28
+ i18n: req.i18n,
29
+ logger: req.logger
30
+ })
31
+ );
32
+ }
33
+ const { datasetId, user, dapp, sessionId } = parsed;
34
+ validateSiteKey(dapp);
35
+ validateAddr(user);
36
+ try {
37
+ const clientRecord = await tasks.db.getClientRecord(dapp);
38
+ if (!clientRecord) {
39
+ return next(
40
+ new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
41
+ context: { code: 400, siteKey: dapp },
42
+ i18n: req.i18n,
43
+ logger: req.logger
44
+ })
45
+ );
46
+ }
47
+ const userScope = getRequestUserScope(
48
+ flatten(req.headers),
49
+ req.ja4,
50
+ req.ip,
51
+ user
52
+ );
53
+ const userAccessPolicy = (await tasks.imgCaptchaManager.getPrioritisedAccessPolicies(
54
+ userAccessRulesStorage,
55
+ dapp,
56
+ userScope
57
+ ))[0];
58
+ const {
59
+ valid,
60
+ reason,
61
+ sessionId: validSessionId,
62
+ solvedImagesCount
63
+ } = await tasks.imgCaptchaManager.isValidRequest(
64
+ clientRecord,
65
+ CaptchaType.image,
66
+ env,
67
+ sessionId,
68
+ userAccessPolicy,
69
+ req.ip
70
+ );
71
+ if (!valid) {
72
+ return next(
73
+ new ProsopoApiError(reason || "API.BAD_REQUEST", {
74
+ context: {
75
+ code: 400,
76
+ siteKey: dapp,
77
+ user
78
+ },
79
+ i18n: req.i18n,
80
+ logger: req.logger
81
+ })
82
+ );
83
+ }
84
+ const captchaConfig = {
85
+ solved: {
86
+ count: solvedImagesCount || userAccessPolicy?.solvedImagesCount || env.config.captchas.solved.count
87
+ },
88
+ unsolved: {
89
+ count: userAccessPolicy?.unsolvedImagesCount || env.config.captchas.unsolved.count
90
+ }
91
+ };
92
+ const taskData = await tasks.imgCaptchaManager.getRandomCaptchasAndRequestHash(
93
+ datasetId,
94
+ user,
95
+ ipAddress,
96
+ captchaConfig,
97
+ clientRecord.settings.imageThreshold ?? 0.8,
98
+ validSessionId
99
+ );
100
+ const captchaResponse = {
101
+ [ApiParams.status]: "ok",
102
+ [ApiParams.captchas]: taskData.captchas.map((captcha) => ({
103
+ ...captcha,
104
+ target: req.t(`TARGET.${captcha.target}`),
105
+ items: captcha.items.map(
106
+ (item) => parseCaptchaAssets(item, env.assetsResolver)
107
+ )
108
+ })),
109
+ [ApiParams.requestHash]: taskData.requestHash,
110
+ [ApiParams.timestamp]: taskData.timestamp.toString(),
111
+ [ApiParams.signature]: {
112
+ [ApiParams.provider]: {
113
+ [ApiParams.requestHash]: taskData.signedRequestHash
114
+ }
115
+ }
116
+ };
117
+ req.logger.info(() => ({
118
+ msg: "Image captcha challenge issued",
119
+ data: {
120
+ captchaType: CaptchaType.image,
121
+ requestHash: taskData.requestHash,
122
+ solvedImagesCount: captchaConfig.solved.count,
123
+ user,
124
+ dapp,
125
+ sessionId
126
+ }
127
+ }));
128
+ return res.json(captchaResponse);
129
+ } catch (err) {
130
+ req.logger.error(() => ({
131
+ err,
132
+ data: req.params,
133
+ msg: "Error in image captcha challenge request"
134
+ }));
135
+ return next(
136
+ new ProsopoApiError("API.BAD_REQUEST", {
137
+ context: {
138
+ error: err,
139
+ code: 500,
140
+ params: req.params
141
+ },
142
+ i18n: req.i18n,
143
+ logger: req.logger
144
+ })
145
+ );
146
+ }
147
+ };
148
+ export {
149
+ getImageCaptchaChallenge as default
150
+ };