@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
@@ -57,7 +57,8 @@ function prosopoVerifyRouter(env) {
57
57
  env,
58
58
  maxVerifiedTime,
59
59
  ip,
60
- clientRecord.settings.disallowWebView
60
+ clientRecord.settings.disallowWebView,
61
+ clientRecord.settings.contextAware?.enabled
61
62
  );
62
63
  req.logger.debug(() => ({ data: { response } }));
63
64
  const verificationResponse = tasks.imgCaptchaManager.getVerificationResponse(
@@ -0,0 +1,344 @@
1
+ "use strict";
2
+ const common = require("@prosopo/common");
3
+ const types = require("@prosopo/types");
4
+ const util = require("@prosopo/util");
5
+ const compositeIpAddress = require("../../compositeIpAddress.cjs");
6
+ const frictionlessTasks = require("../../tasks/frictionless/frictionlessTasks.cjs");
7
+ const frictionlessTasksUtils = require("../../tasks/frictionless/frictionlessTasksUtils.cjs");
8
+ require("../../tasks/index.cjs");
9
+ const hashUserAgent = require("../../utils/hashUserAgent.cjs");
10
+ const hashUserIp = require("../../utils/hashUserIp.cjs");
11
+ const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
12
+ const blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
13
+ const tasks = require("../../tasks/tasks.cjs");
14
+ const DEFAULT_FRICTIONLESS_THRESHOLD = 0.5;
15
+ const getRoundsFromSimScore = (simScore) => {
16
+ if (simScore >= 0.9) return 0;
17
+ if (simScore >= 0.8) return 3;
18
+ if (simScore >= 0.7) return 4;
19
+ if (simScore >= 0.6) return 6;
20
+ if (simScore >= 0.5) return 7;
21
+ return 8;
22
+ };
23
+ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (req, res, next) => {
24
+ try {
25
+ const tasks$1 = new tasks.Tasks(env, req.logger);
26
+ const { token, headHash, dapp, user } = types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
27
+ if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
28
+ req.logger.info(() => ({
29
+ msg: "Maintenance mode active - storing dummy token and sending PoW captcha",
30
+ data: { dapp, user }
31
+ }));
32
+ return res.json(
33
+ await tasks$1.frictionlessManager.sendPowCaptcha({
34
+ token,
35
+ score: 0,
36
+ threshold: 0.5,
37
+ scoreComponents: {
38
+ baseScore: 0
39
+ },
40
+ providerSelectEntropy: 0,
41
+ ipAddress: compositeIpAddress.getCompositeIpAddress(req.ip || ""),
42
+ webView: false,
43
+ iFrame: false,
44
+ decryptedHeadHash: ""
45
+ })
46
+ );
47
+ }
48
+ const existingToken = await tasks$1.db.getSessionRecordByToken(token);
49
+ if (existingToken) {
50
+ req.logger.info(() => ({
51
+ token: existingToken,
52
+ msg: "Token has already been used"
53
+ }));
54
+ return next(
55
+ new common.ProsopoApiError("API.BAD_REQUEST", {
56
+ context: {
57
+ code: 400,
58
+ siteKey: dapp,
59
+ user
60
+ },
61
+ i18n: req.i18n,
62
+ logger: req.logger
63
+ })
64
+ );
65
+ }
66
+ const userSitekeyIpHash = hashUserIp.hashUserIp(user, req.ip || "", dapp);
67
+ const existingSession = await tasks$1.db.getSessionByuserSitekeyIpHash(userSitekeyIpHash);
68
+ if (existingSession) {
69
+ req.logger.info(() => ({
70
+ msg: "Reusing existing session for user-IP-sitekey combination",
71
+ data: {
72
+ userSitekeyIpHash,
73
+ sessionId: existingSession.sessionId,
74
+ captchaType: existingSession.captchaType
75
+ }
76
+ }));
77
+ return res.json({
78
+ [types.ApiParams.captchaType]: existingSession.captchaType,
79
+ [types.ApiParams.sessionId]: existingSession.sessionId,
80
+ [types.ApiParams.status]: "ok"
81
+ });
82
+ }
83
+ const lScore = tasks$1.frictionlessManager.checkLangRules(
84
+ req.headers["accept-language"] || ""
85
+ );
86
+ const {
87
+ baseBotScore,
88
+ timestamp,
89
+ providerSelectEntropy,
90
+ userId,
91
+ userAgent,
92
+ webView,
93
+ iFrame,
94
+ decryptedHeadHash,
95
+ decryptionFailed
96
+ } = await tasks$1.frictionlessManager.decryptPayload(token, headHash);
97
+ req.logger.debug(() => ({
98
+ msg: "Decrypted payload",
99
+ data: {
100
+ baseBotScore,
101
+ timestamp,
102
+ providerSelectEntropy,
103
+ userId,
104
+ userAgent,
105
+ webView
106
+ }
107
+ }));
108
+ let botScore = baseBotScore + lScore;
109
+ const clientRecord = await tasks$1.db.getClientRecord(dapp);
110
+ if (!clientRecord) {
111
+ return next(
112
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
113
+ context: { code: 400, siteKey: dapp },
114
+ i18n: req.i18n,
115
+ logger: req.logger
116
+ })
117
+ );
118
+ }
119
+ const { valid, reason } = await tasks$1.frictionlessManager.isValidRequest(
120
+ clientRecord,
121
+ types.CaptchaType.frictionless,
122
+ env
123
+ );
124
+ if (!valid) {
125
+ return next(
126
+ new common.ProsopoApiError(reason || "API.BAD_REQUEST", {
127
+ context: {
128
+ code: 400,
129
+ siteKey: dapp,
130
+ user
131
+ },
132
+ i18n: req.i18n,
133
+ logger: req.logger
134
+ })
135
+ );
136
+ }
137
+ const botThreshold = clientRecord.settings?.frictionlessThreshold || DEFAULT_FRICTIONLESS_THRESHOLD;
138
+ let scoreComponents = {
139
+ baseScore: baseBotScore,
140
+ ...lScore && { lScore }
141
+ };
142
+ const ipAddress = compositeIpAddress.getCompositeIpAddress(req.ip || "");
143
+ tasks$1.frictionlessManager.setSessionParams({
144
+ token,
145
+ score: botScore,
146
+ threshold: botThreshold,
147
+ scoreComponents,
148
+ providerSelectEntropy,
149
+ ipAddress,
150
+ webView,
151
+ iFrame,
152
+ decryptedHeadHash
153
+ });
154
+ const userScope = blacklistRequestInspector.getRequestUserScope(
155
+ util.flatten(req.headers),
156
+ req.ja4,
157
+ req.ip,
158
+ user
159
+ );
160
+ const userAccessPolicy = (await tasks$1.frictionlessManager.getPrioritisedAccessPolicies(
161
+ userAccessRulesStorage,
162
+ dapp,
163
+ userScope
164
+ ))[0];
165
+ if (userAccessPolicy) {
166
+ const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseAccessPolicy(
167
+ userAccessPolicy,
168
+ baseBotScore,
169
+ botScore,
170
+ scoreComponents
171
+ );
172
+ botScore = scoreUpdate.score;
173
+ scoreComponents = scoreUpdate.scoreComponents;
174
+ tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
175
+ if (userAccessPolicy.captchaType === types.CaptchaType.image) {
176
+ return res.json(
177
+ await tasks$1.frictionlessManager.sendImageCaptcha({
178
+ solvedImagesCount: userAccessPolicy.solvedImagesCount,
179
+ userSitekeyIpHash,
180
+ reason: frictionlessTasks.FrictionlessReason.USER_ACCESS_POLICY
181
+ })
182
+ );
183
+ }
184
+ if (userAccessPolicy.captchaType === types.CaptchaType.pow) {
185
+ return res.json(
186
+ await tasks$1.frictionlessManager.sendPowCaptcha({
187
+ userSitekeyIpHash,
188
+ reason: frictionlessTasks.FrictionlessReason.USER_ACCESS_POLICY
189
+ })
190
+ );
191
+ }
192
+ }
193
+ const headersUserAgent = req.headers["user-agent"];
194
+ const hashedHeadersUserAgent = headersUserAgent ? hashUserAgent.hashUserAgent(headersUserAgent) : "";
195
+ const headersProsopoUser = req.headers["prosopo-user"];
196
+ if (hashedHeadersUserAgent !== userAgent || headersProsopoUser !== userId) {
197
+ req.logger.info(() => ({
198
+ msg: "User agent or user id does not match",
199
+ data: {
200
+ headersUserAgent,
201
+ hashedHeadersUserAgent,
202
+ userAgent,
203
+ // This is the hashed user agent from the token
204
+ headersProsopoUser,
205
+ userId
206
+ }
207
+ }));
208
+ return res.json(
209
+ await tasks$1.frictionlessManager.sendImageCaptcha({
210
+ solvedImagesCount: frictionlessTasksUtils.timestampDecayFunction(
211
+ timestamp,
212
+ decryptionFailed
213
+ ),
214
+ userSitekeyIpHash,
215
+ reason: frictionlessTasks.FrictionlessReason.USER_AGENT_MISMATCH
216
+ })
217
+ );
218
+ }
219
+ if (clientRecord.settings.contextAware?.enabled) {
220
+ const clientEntropy = await tasks$1.frictionlessManager.getClientEntropy(
221
+ clientRecord.account
222
+ );
223
+ if (clientEntropy) {
224
+ if (!decryptedHeadHash) {
225
+ tasks$1.logger.info(() => ({
226
+ msg: "No decryptedHeadHash in session for context aware client"
227
+ }));
228
+ return next(
229
+ new common.ProsopoApiError("API.BAD_REQUEST", {
230
+ context: {
231
+ code: 400,
232
+ siteKey: dapp,
233
+ user
234
+ },
235
+ i18n: req.i18n,
236
+ logger: req.logger
237
+ })
238
+ );
239
+ }
240
+ const sim = util.compareBinaryStrings(decryptedHeadHash, clientEntropy);
241
+ const isValidContext = sim >= clientRecord.settings.contextAware.threshold;
242
+ if (!isValidContext) {
243
+ return res.json(
244
+ await tasks$1.frictionlessManager.sendImageCaptcha({
245
+ solvedImagesCount: getRoundsFromSimScore(sim),
246
+ userSitekeyIpHash,
247
+ reason: frictionlessTasks.FrictionlessReason.CONTEXT_AWARE_VALIDATION_FAILED
248
+ })
249
+ );
250
+ }
251
+ }
252
+ }
253
+ if (clientRecord.settings.disallowWebView && webView) {
254
+ tasks$1.logger.info(() => ({
255
+ msg: "WebView detected"
256
+ }));
257
+ const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseWebView(
258
+ baseBotScore,
259
+ botScore,
260
+ scoreComponents
261
+ );
262
+ botScore = scoreUpdate.score;
263
+ scoreComponents = scoreUpdate.scoreComponents;
264
+ tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
265
+ return res.json(
266
+ await tasks$1.frictionlessManager.sendImageCaptcha({
267
+ solvedImagesCount: env.config.captchas.solved.count * 2,
268
+ userSitekeyIpHash,
269
+ reason: frictionlessTasks.FrictionlessReason.WEBVIEW_DETECTED
270
+ })
271
+ );
272
+ }
273
+ if (frictionlessTasks.FrictionlessManager.timestampTooOld(timestamp)) {
274
+ const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseTimestamp(
275
+ timestamp,
276
+ baseBotScore,
277
+ botScore,
278
+ scoreComponents
279
+ );
280
+ botScore = scoreUpdate.score;
281
+ scoreComponents = scoreUpdate.scoreComponents;
282
+ tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
283
+ return res.json(
284
+ await tasks$1.frictionlessManager.sendImageCaptcha({
285
+ solvedImagesCount: frictionlessTasksUtils.timestampDecayFunction(
286
+ timestamp,
287
+ decryptionFailed
288
+ ),
289
+ userSitekeyIpHash,
290
+ reason: frictionlessTasks.FrictionlessReason.OLD_TIMESTAMP
291
+ })
292
+ );
293
+ }
294
+ const hostVerified = await tasks$1.frictionlessManager.hostVerified(
295
+ providerSelectEntropy
296
+ );
297
+ if (!hostVerified.verified) {
298
+ const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseUnverifiedHost(
299
+ hostVerified.domain,
300
+ baseBotScore,
301
+ botScore,
302
+ scoreComponents
303
+ );
304
+ botScore = scoreUpdate.score;
305
+ scoreComponents = scoreUpdate.scoreComponents;
306
+ tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
307
+ }
308
+ if (Number(botScore) > botThreshold) {
309
+ req.logger.info(() => ({
310
+ msg: "Bot score is greater than threshold",
311
+ data: {
312
+ botScore,
313
+ botThreshold,
314
+ token
315
+ }
316
+ }));
317
+ return res.json(
318
+ await tasks$1.frictionlessManager.sendImageCaptcha({
319
+ solvedImagesCount: env.config.captchas.solved.count,
320
+ userSitekeyIpHash,
321
+ reason: frictionlessTasks.FrictionlessReason.BOT_SCORE_ABOVE_THRESHOLD
322
+ })
323
+ );
324
+ }
325
+ return res.json(
326
+ await tasks$1.frictionlessManager.sendPowCaptcha({
327
+ userSitekeyIpHash
328
+ })
329
+ );
330
+ } catch (err) {
331
+ req.logger.error(() => ({
332
+ err,
333
+ msg: "Error in frictionless captcha challenge"
334
+ }));
335
+ return next(
336
+ new common.ProsopoApiError("API.BAD_REQUEST", {
337
+ context: { code: 400, error: err },
338
+ i18n: req.i18n,
339
+ logger: req.logger
340
+ })
341
+ );
342
+ }
343
+ };
344
+ module.exports = getFrictionlessCaptchaChallenge;
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ const common = require("@prosopo/common");
3
+ const datasets = require("@prosopo/datasets");
4
+ const types = require("@prosopo/types");
5
+ const util = require("@prosopo/util");
6
+ require("../../tasks/index.cjs");
7
+ const blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
8
+ const validateAddress = require("../validateAddress.cjs");
9
+ const tasks = require("../../tasks/tasks.cjs");
10
+ const getImageCaptchaChallenge = (env, userAccessRulesStorage) => async (req, res, next) => {
11
+ const tasks$1 = new tasks.Tasks(env, req.logger);
12
+ let parsed;
13
+ if (!req.ip) {
14
+ return next(
15
+ new common.ProsopoApiError("API.BAD_REQUEST", {
16
+ context: { code: 400, error: "IP address not found" },
17
+ i18n: req.i18n,
18
+ logger: req.logger
19
+ })
20
+ );
21
+ }
22
+ const ipAddress = util.getIPAddress(req.ip || "");
23
+ try {
24
+ parsed = types.CaptchaRequestBody.parse(req.body);
25
+ } catch (err) {
26
+ return next(
27
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
28
+ context: { code: 400, error: err },
29
+ i18n: req.i18n,
30
+ logger: req.logger
31
+ })
32
+ );
33
+ }
34
+ const { datasetId, user, dapp, sessionId } = parsed;
35
+ validateAddress.validateSiteKey(dapp);
36
+ validateAddress.validateAddr(user);
37
+ try {
38
+ const clientRecord = await tasks$1.db.getClientRecord(dapp);
39
+ if (!clientRecord) {
40
+ return next(
41
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
42
+ context: { code: 400, siteKey: dapp },
43
+ i18n: req.i18n,
44
+ logger: req.logger
45
+ })
46
+ );
47
+ }
48
+ const userScope = blacklistRequestInspector.getRequestUserScope(
49
+ util.flatten(req.headers),
50
+ req.ja4,
51
+ req.ip,
52
+ user
53
+ );
54
+ const userAccessPolicy = (await tasks$1.imgCaptchaManager.getPrioritisedAccessPolicies(
55
+ userAccessRulesStorage,
56
+ dapp,
57
+ userScope
58
+ ))[0];
59
+ const {
60
+ valid,
61
+ reason,
62
+ sessionId: validSessionId,
63
+ solvedImagesCount
64
+ } = await tasks$1.imgCaptchaManager.isValidRequest(
65
+ clientRecord,
66
+ types.CaptchaType.image,
67
+ env,
68
+ sessionId,
69
+ userAccessPolicy,
70
+ req.ip
71
+ );
72
+ if (!valid) {
73
+ return next(
74
+ new common.ProsopoApiError(reason || "API.BAD_REQUEST", {
75
+ context: {
76
+ code: 400,
77
+ siteKey: dapp,
78
+ user
79
+ },
80
+ i18n: req.i18n,
81
+ logger: req.logger
82
+ })
83
+ );
84
+ }
85
+ const captchaConfig = {
86
+ solved: {
87
+ count: solvedImagesCount || userAccessPolicy?.solvedImagesCount || env.config.captchas.solved.count
88
+ },
89
+ unsolved: {
90
+ count: userAccessPolicy?.unsolvedImagesCount || env.config.captchas.unsolved.count
91
+ }
92
+ };
93
+ const taskData = await tasks$1.imgCaptchaManager.getRandomCaptchasAndRequestHash(
94
+ datasetId,
95
+ user,
96
+ ipAddress,
97
+ captchaConfig,
98
+ clientRecord.settings.imageThreshold ?? 0.8,
99
+ validSessionId
100
+ );
101
+ const captchaResponse = {
102
+ [types.ApiParams.status]: "ok",
103
+ [types.ApiParams.captchas]: taskData.captchas.map((captcha) => ({
104
+ ...captcha,
105
+ target: req.t(`TARGET.${captcha.target}`),
106
+ items: captcha.items.map(
107
+ (item) => datasets.parseCaptchaAssets(item, env.assetsResolver)
108
+ )
109
+ })),
110
+ [types.ApiParams.requestHash]: taskData.requestHash,
111
+ [types.ApiParams.timestamp]: taskData.timestamp.toString(),
112
+ [types.ApiParams.signature]: {
113
+ [types.ApiParams.provider]: {
114
+ [types.ApiParams.requestHash]: taskData.signedRequestHash
115
+ }
116
+ }
117
+ };
118
+ req.logger.info(() => ({
119
+ msg: "Image captcha challenge issued",
120
+ data: {
121
+ captchaType: types.CaptchaType.image,
122
+ requestHash: taskData.requestHash,
123
+ solvedImagesCount: captchaConfig.solved.count,
124
+ user,
125
+ dapp,
126
+ sessionId
127
+ }
128
+ }));
129
+ return res.json(captchaResponse);
130
+ } catch (err) {
131
+ req.logger.error(() => ({
132
+ err,
133
+ data: req.params,
134
+ msg: "Error in image captcha challenge request"
135
+ }));
136
+ return next(
137
+ new common.ProsopoApiError("API.BAD_REQUEST", {
138
+ context: {
139
+ error: err,
140
+ code: 500,
141
+ params: req.params
142
+ },
143
+ i18n: req.i18n,
144
+ logger: req.logger
145
+ })
146
+ );
147
+ }
148
+ };
149
+ module.exports = getImageCaptchaChallenge;
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ const common = require("@prosopo/common");
3
+ const types = require("@prosopo/types");
4
+ const util = require("@prosopo/util");
5
+ const compositeIpAddress = require("../../compositeIpAddress.cjs");
6
+ require("../../tasks/index.cjs");
7
+ const blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
8
+ const validateAddress = require("../validateAddress.cjs");
9
+ const tasks = require("../../tasks/tasks.cjs");
10
+ const getPoWCaptchaChallenge = (env, userAccessRulesStorage) => async (req, res, next) => {
11
+ let parsed;
12
+ const tasks$1 = new tasks.Tasks(env);
13
+ tasks$1.setLogger(req.logger);
14
+ try {
15
+ parsed = types.GetPowCaptchaChallengeRequestBody.parse(req.body);
16
+ } catch (err) {
17
+ return next(
18
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
19
+ context: { code: 400, error: err },
20
+ i18n: req.i18n,
21
+ logger: req.logger
22
+ })
23
+ );
24
+ }
25
+ const { user, dapp, sessionId } = parsed;
26
+ validateAddress.validateSiteKey(dapp);
27
+ validateAddress.validateAddr(user);
28
+ try {
29
+ const clientSettings = await tasks$1.db.getClientRecord(dapp);
30
+ if (!clientSettings) {
31
+ return next(
32
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
33
+ context: { code: 400, siteKey: dapp },
34
+ i18n: req.i18n,
35
+ logger: req.logger
36
+ })
37
+ );
38
+ }
39
+ const userScope = blacklistRequestInspector.getRequestUserScope(
40
+ util.flatten(req.headers),
41
+ req.ja4,
42
+ req.ip,
43
+ user
44
+ );
45
+ const userAccessPolicy = (await tasks$1.powCaptchaManager.getPrioritisedAccessPolicies(
46
+ userAccessRulesStorage,
47
+ dapp,
48
+ userScope
49
+ ))[0];
50
+ const {
51
+ valid,
52
+ reason,
53
+ sessionId: validSessionId,
54
+ powDifficulty
55
+ } = await tasks$1.powCaptchaManager.isValidRequest(
56
+ clientSettings,
57
+ types.CaptchaType.pow,
58
+ env,
59
+ sessionId,
60
+ userAccessPolicy,
61
+ req.ip
62
+ );
63
+ if (!valid) {
64
+ return next(
65
+ new common.ProsopoApiError(reason || "API.BAD_REQUEST", {
66
+ context: {
67
+ code: 400,
68
+ siteKey: dapp,
69
+ user
70
+ },
71
+ i18n: req.i18n,
72
+ logger: req.logger
73
+ })
74
+ );
75
+ }
76
+ const origin = req.headers.origin;
77
+ if (!origin) {
78
+ return next(
79
+ new common.ProsopoApiError("API.BAD_REQUEST", {
80
+ context: {
81
+ error: "Origin header not found",
82
+ code: 400,
83
+ siteKey: dapp,
84
+ user
85
+ },
86
+ i18n: req.i18n,
87
+ logger: req.logger
88
+ })
89
+ );
90
+ }
91
+ const difficulty = powDifficulty || userAccessPolicy?.powDifficulty || clientSettings?.settings?.powDifficulty;
92
+ const challenge = await tasks$1.powCaptchaManager.getPowCaptchaChallenge(
93
+ user,
94
+ dapp,
95
+ origin,
96
+ difficulty
97
+ );
98
+ await tasks$1.db.storePowCaptchaRecord(
99
+ challenge.challenge,
100
+ {
101
+ requestedAtTimestamp: challenge.requestedAtTimestamp,
102
+ userAccount: user,
103
+ dappAccount: dapp
104
+ },
105
+ challenge.difficulty,
106
+ challenge.providerSignature,
107
+ compositeIpAddress.getCompositeIpAddress(req.ip || ""),
108
+ util.flatten(req.headers),
109
+ req.ja4,
110
+ validSessionId
111
+ );
112
+ const getPowCaptchaResponse = {
113
+ [types.ApiParams.status]: "ok",
114
+ [types.ApiParams.challenge]: challenge.challenge,
115
+ [types.ApiParams.difficulty]: challenge.difficulty,
116
+ [types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
117
+ [types.ApiParams.signature]: {
118
+ [types.ApiParams.provider]: {
119
+ [types.ApiParams.challenge]: challenge.providerSignature
120
+ }
121
+ }
122
+ };
123
+ req.logger.info(() => ({
124
+ msg: "PoW captcha challenge issued",
125
+ data: {
126
+ captchaType: types.CaptchaType.pow,
127
+ challenge: challenge.challenge,
128
+ difficulty: challenge.difficulty,
129
+ user,
130
+ dapp,
131
+ session: sessionId
132
+ }
133
+ }));
134
+ return res.json(getPowCaptchaResponse);
135
+ } catch (err) {
136
+ req.logger.error(() => ({
137
+ err,
138
+ body: req.body,
139
+ msg: "Error in PoW captcha challenge request"
140
+ }));
141
+ return next(
142
+ new common.ProsopoApiError("API.BAD_REQUEST", {
143
+ context: {
144
+ code: 500,
145
+ siteKey: req.body.dapp,
146
+ user: req.body.user,
147
+ error: err
148
+ },
149
+ i18n: req.i18n,
150
+ logger: req.logger
151
+ })
152
+ );
153
+ }
154
+ };
155
+ module.exports = getPoWCaptchaChallenge;