@prosopo/provider 3.12.14 → 3.13.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 (356) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/api/captcha/getFrictionlessCaptchaChallenge.js +338 -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 +337 -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 +15 -0
  20. package/dist/cjs/tasks/detection/decodePayload.cjs +379 -609
  21. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +28 -9
  22. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +8 -2
  23. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +2 -2
  24. package/dist/cjs/tasks/tasks.cjs +1 -0
  25. package/dist/cjs/utils/hashUserIp.cjs +9 -0
  26. package/dist/index.js +2 -0
  27. package/dist/schedulers/setClientEntropy.js +29 -24
  28. package/dist/tasks/captchaManager.js +2 -1
  29. package/dist/tasks/client/clientTasks.js +16 -1
  30. package/dist/tasks/detection/decodePayload.js +379 -609
  31. package/dist/tasks/detection/getBotScore.js +2 -2
  32. package/dist/tasks/frictionless/frictionlessTasks.js +29 -10
  33. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +8 -2
  34. package/dist/tasks/powCaptcha/powTasks.js +2 -2
  35. package/dist/tasks/tasks.js +1 -0
  36. package/dist/utils/hashUserIp.js +9 -0
  37. package/package.json +18 -18
  38. package/coverage/base.css +0 -224
  39. package/coverage/block-navigation.js +0 -87
  40. package/coverage/clover.xml +0 -4278
  41. package/coverage/coverage-final.json +0 -42
  42. package/coverage/favicon.png +0 -0
  43. package/coverage/index.html +0 -311
  44. package/coverage/prettify.css +0 -1
  45. package/coverage/prettify.js +0 -2
  46. package/coverage/sort-arrow-sprite.png +0 -0
  47. package/coverage/sorter.js +0 -210
  48. package/coverage/src/api/admin/apiAdminRoutesProvider.ts.html +0 -214
  49. package/coverage/src/api/admin/apiRegisterSiteKeyEndpoint.ts.html +0 -259
  50. package/coverage/src/api/admin/apiRemoveDetectorKeyEndpoint.ts.html +0 -283
  51. package/coverage/src/api/admin/apiToggleMaintenanceModeEndpoint.ts.html +0 -334
  52. package/coverage/src/api/admin/apiUpdateDetectorKeyEndpoint.ts.html +0 -298
  53. package/coverage/src/api/admin/createApiAdminRoutesProvider.ts.html +0 -163
  54. package/coverage/src/api/admin/index.html +0 -191
  55. package/coverage/src/api/blacklistRequestInspector.ts.html +0 -751
  56. package/coverage/src/api/block.ts.html +0 -187
  57. package/coverage/src/api/captcha.ts.html +0 -2803
  58. package/coverage/src/api/domainMiddleware.ts.html +0 -493
  59. package/coverage/src/api/headerCheckMiddleware.ts.html +0 -256
  60. package/coverage/src/api/ignoreMiddleware.ts.html +0 -181
  61. package/coverage/src/api/index.html +0 -266
  62. package/coverage/src/api/ja4Middleware.ts.html +0 -400
  63. package/coverage/src/api/public.ts.html +0 -343
  64. package/coverage/src/api/robotsMiddleware.ts.html +0 -157
  65. package/coverage/src/api/validateAddress.ts.html +0 -214
  66. package/coverage/src/api/verify.ts.html +0 -871
  67. package/coverage/src/compositeIpAddress.ts.html +0 -340
  68. package/coverage/src/index.html +0 -161
  69. package/coverage/src/index.ts.html +0 -175
  70. package/coverage/src/pairs.ts.html +0 -238
  71. package/coverage/src/rules/index.html +0 -116
  72. package/coverage/src/rules/lang.ts.html +0 -187
  73. package/coverage/src/schedulers/captchaScheduler.ts.html +0 -250
  74. package/coverage/src/schedulers/getClientList.ts.html +0 -271
  75. package/coverage/src/schedulers/index.html +0 -131
  76. package/coverage/src/services/index.html +0 -131
  77. package/coverage/src/services/ipComparison.ts.html +0 -685
  78. package/coverage/src/services/ipInfo.ts.html +0 -490
  79. package/coverage/src/tasks/captchaManager.ts.html +0 -865
  80. package/coverage/src/tasks/client/clientTasks.ts.html +0 -1381
  81. package/coverage/src/tasks/client/index.html +0 -116
  82. package/coverage/src/tasks/dataset/datasetTasks.ts.html +0 -268
  83. package/coverage/src/tasks/dataset/datasetTasksUtils.ts.html +0 -271
  84. package/coverage/src/tasks/dataset/index.html +0 -131
  85. package/coverage/src/tasks/detection/decodePayload.js.html +0 -127
  86. package/coverage/src/tasks/detection/getBotScore.ts.html +0 -244
  87. package/coverage/src/tasks/detection/index.html +0 -131
  88. package/coverage/src/tasks/frictionless/frictionlessTasks.ts.html +0 -1216
  89. package/coverage/src/tasks/frictionless/frictionlessTasksUtils.ts.html +0 -247
  90. package/coverage/src/tasks/frictionless/index.html +0 -131
  91. package/coverage/src/tasks/imgCaptcha/imgCaptchaTasks.ts.html +0 -1972
  92. package/coverage/src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts.html +0 -232
  93. package/coverage/src/tasks/imgCaptcha/index.html +0 -131
  94. package/coverage/src/tasks/index.html +0 -146
  95. package/coverage/src/tasks/index.ts.html +0 -127
  96. package/coverage/src/tasks/powCaptcha/index.html +0 -131
  97. package/coverage/src/tasks/powCaptcha/powTasks.ts.html +0 -961
  98. package/coverage/src/tasks/powCaptcha/powTasksUtils.ts.html +0 -244
  99. package/coverage/src/tasks/tasks.ts.html +0 -388
  100. package/coverage/src/util.ts.html +0 -1627
  101. package/coverage/src/utils/hashUserAgent.ts.html +0 -184
  102. package/coverage/src/utils/index.html +0 -116
  103. package/dist/api/admin/apiAdminRoutesProvider.d.ts +0 -9
  104. package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +0 -1
  105. package/dist/api/admin/apiAdminRoutesProvider.js.map +0 -1
  106. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts +0 -14
  107. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +0 -1
  108. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +0 -1
  109. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts +0 -23
  110. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +0 -1
  111. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +0 -1
  112. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +0 -13
  113. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +0 -1
  114. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +0 -1
  115. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts +0 -14
  116. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +0 -1
  117. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +0 -1
  118. package/dist/api/admin/createApiAdminRoutesProvider.d.ts +0 -4
  119. package/dist/api/admin/createApiAdminRoutesProvider.d.ts.map +0 -1
  120. package/dist/api/admin/createApiAdminRoutesProvider.js.map +0 -1
  121. package/dist/api/blacklistRequestInspector.d.ts +0 -19
  122. package/dist/api/blacklistRequestInspector.d.ts.map +0 -1
  123. package/dist/api/blacklistRequestInspector.js.map +0 -1
  124. package/dist/api/block.d.ts +0 -3
  125. package/dist/api/block.d.ts.map +0 -1
  126. package/dist/api/block.js.map +0 -1
  127. package/dist/api/captcha.d.ts +0 -4
  128. package/dist/api/captcha.d.ts.map +0 -1
  129. package/dist/api/captcha.js.map +0 -1
  130. package/dist/api/domainMiddleware.d.ts +0 -4
  131. package/dist/api/domainMiddleware.d.ts.map +0 -1
  132. package/dist/api/domainMiddleware.js.map +0 -1
  133. package/dist/api/headerCheckMiddleware.d.ts +0 -4
  134. package/dist/api/headerCheckMiddleware.d.ts.map +0 -1
  135. package/dist/api/headerCheckMiddleware.js.map +0 -1
  136. package/dist/api/ignoreMiddleware.d.ts +0 -3
  137. package/dist/api/ignoreMiddleware.d.ts.map +0 -1
  138. package/dist/api/ignoreMiddleware.js.map +0 -1
  139. package/dist/api/ja4Middleware.d.ts +0 -10
  140. package/dist/api/ja4Middleware.d.ts.map +0 -1
  141. package/dist/api/ja4Middleware.js.map +0 -1
  142. package/dist/api/public.d.ts +0 -4
  143. package/dist/api/public.d.ts.map +0 -1
  144. package/dist/api/public.js.map +0 -1
  145. package/dist/api/robotsMiddleware.d.ts +0 -3
  146. package/dist/api/robotsMiddleware.d.ts.map +0 -1
  147. package/dist/api/robotsMiddleware.js.map +0 -1
  148. package/dist/api/validateAddress.d.ts +0 -5
  149. package/dist/api/validateAddress.d.ts.map +0 -1
  150. package/dist/api/validateAddress.js.map +0 -1
  151. package/dist/api/verify.d.ts +0 -4
  152. package/dist/api/verify.d.ts.map +0 -1
  153. package/dist/api/verify.js.map +0 -1
  154. package/dist/compositeIpAddress.d.ts +0 -5
  155. package/dist/compositeIpAddress.d.ts.map +0 -1
  156. package/dist/compositeIpAddress.js.map +0 -1
  157. package/dist/index.d.ts +0 -17
  158. package/dist/index.d.ts.map +0 -1
  159. package/dist/index.js.map +0 -1
  160. package/dist/pairs.d.ts +0 -3
  161. package/dist/pairs.d.ts.map +0 -1
  162. package/dist/pairs.js.map +0 -1
  163. package/dist/rules/lang.d.ts +0 -3
  164. package/dist/rules/lang.d.ts.map +0 -1
  165. package/dist/rules/lang.js.map +0 -1
  166. package/dist/schedulers/captchaScheduler.d.ts +0 -4
  167. package/dist/schedulers/captchaScheduler.d.ts.map +0 -1
  168. package/dist/schedulers/captchaScheduler.js.map +0 -1
  169. package/dist/schedulers/getClientList.d.ts +0 -4
  170. package/dist/schedulers/getClientList.d.ts.map +0 -1
  171. package/dist/schedulers/getClientList.js.map +0 -1
  172. package/dist/schedulers/setClientEntropy.d.ts +0 -4
  173. package/dist/schedulers/setClientEntropy.d.ts.map +0 -1
  174. package/dist/schedulers/setClientEntropy.js.map +0 -1
  175. package/dist/services/ipComparison.d.ts +0 -3
  176. package/dist/services/ipComparison.d.ts.map +0 -1
  177. package/dist/services/ipComparison.js.map +0 -1
  178. package/dist/services/ipInfo.d.ts +0 -3
  179. package/dist/services/ipInfo.d.ts.map +0 -1
  180. package/dist/services/ipInfo.js.map +0 -1
  181. package/dist/tasks/captchaManager.d.ts +0 -34
  182. package/dist/tasks/captchaManager.d.ts.map +0 -1
  183. package/dist/tasks/captchaManager.js.map +0 -1
  184. package/dist/tasks/client/clientTasks.d.ts +0 -21
  185. package/dist/tasks/client/clientTasks.d.ts.map +0 -1
  186. package/dist/tasks/client/clientTasks.js.map +0 -1
  187. package/dist/tasks/dataset/datasetTasks.d.ts +0 -13
  188. package/dist/tasks/dataset/datasetTasks.d.ts.map +0 -1
  189. package/dist/tasks/dataset/datasetTasks.js.map +0 -1
  190. package/dist/tasks/dataset/datasetTasksUtils.d.ts +0 -3
  191. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +0 -1
  192. package/dist/tasks/dataset/datasetTasksUtils.js.map +0 -1
  193. package/dist/tasks/detection/decodePayload.d.ts +0 -5
  194. package/dist/tasks/detection/decodePayload.d.ts.map +0 -1
  195. package/dist/tasks/detection/decodePayload.js.map +0 -1
  196. package/dist/tasks/detection/getBotScore.d.ts +0 -20
  197. package/dist/tasks/detection/getBotScore.d.ts.map +0 -1
  198. package/dist/tasks/detection/getBotScore.js.map +0 -1
  199. package/dist/tasks/frictionless/frictionlessTasks.d.ts +0 -67
  200. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +0 -1
  201. package/dist/tasks/frictionless/frictionlessTasks.js.map +0 -1
  202. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts +0 -6
  203. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +0 -1
  204. package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +0 -1
  205. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +0 -30
  206. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +0 -1
  207. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +0 -1
  208. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +0 -7
  209. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +0 -1
  210. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +0 -1
  211. package/dist/tasks/index.d.ts +0 -2
  212. package/dist/tasks/index.d.ts.map +0 -1
  213. package/dist/tasks/index.js.map +0 -1
  214. package/dist/tasks/powCaptcha/powTasks.d.ts +0 -17
  215. package/dist/tasks/powCaptcha/powTasks.d.ts.map +0 -1
  216. package/dist/tasks/powCaptcha/powTasks.js.map +0 -1
  217. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +0 -3
  218. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +0 -1
  219. package/dist/tasks/powCaptcha/powTasksUtils.js.map +0 -1
  220. package/dist/tasks/tasks.d.ts +0 -25
  221. package/dist/tasks/tasks.d.ts.map +0 -1
  222. package/dist/tasks/tasks.js.map +0 -1
  223. package/dist/tests/index.d.ts +0 -2
  224. package/dist/tests/index.d.ts.map +0 -1
  225. package/dist/tests/index.js +0 -2
  226. package/dist/tests/index.js.map +0 -1
  227. package/dist/tests/integration/accessRules.integration.test.d.ts +0 -2
  228. package/dist/tests/integration/accessRules.integration.test.d.ts.map +0 -1
  229. package/dist/tests/integration/accessRules.integration.test.js +0 -588
  230. package/dist/tests/integration/accessRules.integration.test.js.map +0 -1
  231. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts +0 -2
  232. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts.map +0 -1
  233. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +0 -60
  234. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +0 -1
  235. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts +0 -2
  236. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts.map +0 -1
  237. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +0 -368
  238. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +0 -1
  239. package/dist/tests/integration/imgCaptcha.integration.test.d.ts +0 -2
  240. package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +0 -1
  241. package/dist/tests/integration/imgCaptcha.integration.test.js +0 -272
  242. package/dist/tests/integration/imgCaptcha.integration.test.js.map +0 -1
  243. package/dist/tests/integration/ipValidation.integration.test.d.ts +0 -2
  244. package/dist/tests/integration/ipValidation.integration.test.d.ts.map +0 -1
  245. package/dist/tests/integration/ipValidation.integration.test.js +0 -75
  246. package/dist/tests/integration/ipValidation.integration.test.js.map +0 -1
  247. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +0 -32
  248. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +0 -1
  249. package/dist/tests/integration/mocks/solvedTestCaptchas.js +0 -1046
  250. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +0 -1
  251. package/dist/tests/integration/powCaptcha.integration.test.d.ts +0 -2
  252. package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +0 -1
  253. package/dist/tests/integration/powCaptcha.integration.test.js +0 -308
  254. package/dist/tests/integration/powCaptcha.integration.test.js.map +0 -1
  255. package/dist/tests/integration/registerSitekey.d.ts +0 -3
  256. package/dist/tests/integration/registerSitekey.d.ts.map +0 -1
  257. package/dist/tests/integration/registerSitekey.js +0 -24
  258. package/dist/tests/integration/registerSitekey.js.map +0 -1
  259. package/dist/tests/integration/userAccessPolicy.d.ts +0 -2
  260. package/dist/tests/integration/userAccessPolicy.d.ts.map +0 -1
  261. package/dist/tests/integration/userAccessPolicy.js +0 -2
  262. package/dist/tests/integration/userAccessPolicy.js.map +0 -1
  263. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts +0 -2
  264. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts.map +0 -1
  265. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +0 -60
  266. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +0 -1
  267. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +0 -2
  268. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +0 -1
  269. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +0 -43
  270. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +0 -1
  271. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +0 -2
  272. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +0 -1
  273. package/dist/tests/unit/api/ja4Middleware.unit.test.js +0 -57
  274. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +0 -1
  275. package/dist/tests/unit/compositeIpAddress.unit.test.d.ts +0 -2
  276. package/dist/tests/unit/compositeIpAddress.unit.test.d.ts.map +0 -1
  277. package/dist/tests/unit/compositeIpAddress.unit.test.js +0 -86
  278. package/dist/tests/unit/compositeIpAddress.unit.test.js.map +0 -1
  279. package/dist/tests/unit/pairs.unit.test.d.ts +0 -2
  280. package/dist/tests/unit/pairs.unit.test.d.ts.map +0 -1
  281. package/dist/tests/unit/pairs.unit.test.js +0 -83
  282. package/dist/tests/unit/pairs.unit.test.js.map +0 -1
  283. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +0 -2
  284. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +0 -1
  285. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +0 -75
  286. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +0 -1
  287. package/dist/tests/unit/services/ipComparison.unit.test.d.ts +0 -2
  288. package/dist/tests/unit/services/ipComparison.unit.test.d.ts.map +0 -1
  289. package/dist/tests/unit/services/ipComparison.unit.test.js +0 -258
  290. package/dist/tests/unit/services/ipComparison.unit.test.js.map +0 -1
  291. package/dist/tests/unit/services/ipInfo.unit.test.d.ts +0 -2
  292. package/dist/tests/unit/services/ipInfo.unit.test.d.ts.map +0 -1
  293. package/dist/tests/unit/services/ipInfo.unit.test.js +0 -210
  294. package/dist/tests/unit/services/ipInfo.unit.test.js.map +0 -1
  295. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts +0 -2
  296. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts.map +0 -1
  297. package/dist/tests/unit/tasks/captchaManager.unit.test.js +0 -311
  298. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +0 -1
  299. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +0 -2
  300. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +0 -1
  301. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +0 -289
  302. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +0 -1
  303. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +0 -2
  304. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +0 -1
  305. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +0 -92
  306. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +0 -1
  307. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +0 -2
  308. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +0 -1
  309. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +0 -75
  310. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +0 -1
  311. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts +0 -2
  312. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts.map +0 -1
  313. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js +0 -143
  314. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js.map +0 -1
  315. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts +0 -2
  316. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts.map +0 -1
  317. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +0 -145
  318. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +0 -1
  319. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts +0 -2
  320. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts.map +0 -1
  321. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +0 -64
  322. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +0 -1
  323. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +0 -2
  324. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +0 -1
  325. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +0 -388
  326. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +0 -1
  327. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +0 -2
  328. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +0 -1
  329. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +0 -46
  330. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +0 -1
  331. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +0 -2
  332. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +0 -1
  333. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +0 -216
  334. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +0 -1
  335. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +0 -2
  336. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +0 -1
  337. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +0 -69
  338. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +0 -1
  339. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts +0 -2
  340. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts.map +0 -1
  341. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js +0 -505
  342. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js.map +0 -1
  343. package/dist/tests/unit/util.ipDistance.unit.test.d.ts +0 -2
  344. package/dist/tests/unit/util.ipDistance.unit.test.d.ts.map +0 -1
  345. package/dist/tests/unit/util.ipDistance.unit.test.js +0 -93
  346. package/dist/tests/unit/util.ipDistance.unit.test.js.map +0 -1
  347. package/dist/tests/unit/util.unit.test.d.ts +0 -2
  348. package/dist/tests/unit/util.unit.test.d.ts.map +0 -1
  349. package/dist/tests/unit/util.unit.test.js +0 -170
  350. package/dist/tests/unit/util.unit.test.js.map +0 -1
  351. package/dist/util.d.ts +0 -24
  352. package/dist/util.d.ts.map +0 -1
  353. package/dist/util.js.map +0 -1
  354. package/dist/utils/hashUserAgent.d.ts +0 -2
  355. package/dist/utils/hashUserAgent.d.ts.map +0 -1
  356. package/dist/utils/hashUserAgent.js.map +0 -1
@@ -1,715 +1,37 @@
1
1
  import { handleErrors } from "@prosopo/api-express-router";
2
- import { ProsopoApiError } from "@prosopo/common";
3
- import { parseCaptchaAssets } from "@prosopo/datasets";
4
- import { ClientApiPaths, CaptchaRequestBody, CaptchaType, ApiParams, CaptchaSolutionBody, GetPowCaptchaChallengeRequestBody, SubmitPowCaptchaSolutionBody, GetFrictionlessCaptchaChallengeRequestBody } from "@prosopo/types";
5
- import { getIPAddress, flatten } from "@prosopo/util";
2
+ import { ClientApiPaths } from "@prosopo/types";
6
3
  import express from "express";
7
- import { getCompositeIpAddress } from "../compositeIpAddress.js";
8
- import { FrictionlessManager } from "../tasks/frictionless/frictionlessTasks.js";
9
- import { timestampDecayFunction } from "../tasks/frictionless/frictionlessTasksUtils.js";
10
- import { Tasks } from "../tasks/tasks.js";
11
- import { hashUserAgent } from "../utils/hashUserAgent.js";
12
- import { getMaintenanceMode } from "./admin/apiToggleMaintenanceModeEndpoint.js";
13
- import { getRequestUserScope } from "./blacklistRequestInspector.js";
14
- import { validateSiteKey, validateAddr } from "./validateAddress.js";
15
- const DEFAULT_FRICTIONLESS_THRESHOLD = 0.5;
4
+ import getFrictionlessCaptchaChallenge from "./captcha/getFrictionlessCaptchaChallenge.js";
5
+ import getImageCaptchaChallenge from "./captcha/getImageCaptchaChallenge.js";
6
+ import getPoWCaptchaChallenge from "./captcha/getPoWCaptchaChallenge.js";
7
+ import submitImageCaptchaSolution from "./captcha/submitImageCaptchaSolution.js";
8
+ import submitPoWCaptchaSolution from "./captcha/submitPoWCaptchaSolution.js";
16
9
  function prosopoRouter(env) {
17
10
  const router = express.Router();
18
11
  const userAccessRulesStorage = env.getDb().getUserAccessRulesStorage();
19
12
  router.post(
20
13
  ClientApiPaths.GetImageCaptchaChallenge,
21
- async (req, res, next) => {
22
- const tasks = new Tasks(env, req.logger);
23
- let parsed;
24
- if (!req.ip) {
25
- return next(
26
- new ProsopoApiError("API.BAD_REQUEST", {
27
- context: { code: 400, error: "IP address not found" },
28
- i18n: req.i18n,
29
- logger: req.logger
30
- })
31
- );
32
- }
33
- const ipAddress = getIPAddress(req.ip || "");
34
- try {
35
- parsed = CaptchaRequestBody.parse(req.body);
36
- } catch (err) {
37
- return next(
38
- new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
39
- context: { code: 400, error: err },
40
- i18n: req.i18n,
41
- logger: req.logger
42
- })
43
- );
44
- }
45
- const { datasetId, user, dapp, sessionId } = parsed;
46
- validateSiteKey(dapp);
47
- validateAddr(user);
48
- try {
49
- const clientRecord = await tasks.db.getClientRecord(dapp);
50
- if (!clientRecord) {
51
- return next(
52
- new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
53
- context: { code: 400, siteKey: dapp },
54
- i18n: req.i18n,
55
- logger: req.logger
56
- })
57
- );
58
- }
59
- const userScope = getRequestUserScope(
60
- flatten(req.headers),
61
- req.ja4,
62
- req.ip,
63
- user
64
- );
65
- const userAccessPolicy = (await tasks.imgCaptchaManager.getPrioritisedAccessPolicies(
66
- userAccessRulesStorage,
67
- dapp,
68
- userScope
69
- ))[0];
70
- const {
71
- valid,
72
- reason,
73
- sessionId: validSessionId,
74
- solvedImagesCount
75
- } = await tasks.imgCaptchaManager.isValidRequest(
76
- clientRecord,
77
- CaptchaType.image,
78
- env,
79
- sessionId,
80
- userAccessPolicy,
81
- req.ip
82
- );
83
- if (!valid) {
84
- return next(
85
- new ProsopoApiError(reason || "API.BAD_REQUEST", {
86
- context: {
87
- code: 400,
88
- siteKey: dapp,
89
- user
90
- },
91
- i18n: req.i18n,
92
- logger: req.logger
93
- })
94
- );
95
- }
96
- const captchaConfig = {
97
- solved: {
98
- count: solvedImagesCount || userAccessPolicy?.solvedImagesCount || env.config.captchas.solved.count
99
- },
100
- unsolved: {
101
- count: userAccessPolicy?.unsolvedImagesCount || env.config.captchas.unsolved.count
102
- }
103
- };
104
- const taskData = await tasks.imgCaptchaManager.getRandomCaptchasAndRequestHash(
105
- datasetId,
106
- user,
107
- ipAddress,
108
- captchaConfig,
109
- clientRecord.settings.imageThreshold ?? 0.8,
110
- validSessionId
111
- );
112
- const captchaResponse = {
113
- [ApiParams.status]: "ok",
114
- [ApiParams.captchas]: taskData.captchas.map((captcha) => ({
115
- ...captcha,
116
- target: req.t(`TARGET.${captcha.target}`),
117
- items: captcha.items.map(
118
- (item) => parseCaptchaAssets(item, env.assetsResolver)
119
- )
120
- })),
121
- [ApiParams.requestHash]: taskData.requestHash,
122
- [ApiParams.timestamp]: taskData.timestamp.toString(),
123
- [ApiParams.signature]: {
124
- [ApiParams.provider]: {
125
- [ApiParams.requestHash]: taskData.signedRequestHash
126
- }
127
- }
128
- };
129
- req.logger.info(() => ({
130
- msg: "Image captcha challenge issued",
131
- data: {
132
- captchaType: CaptchaType.image,
133
- requestHash: taskData.requestHash,
134
- solvedImagesCount: captchaConfig.solved.count,
135
- user,
136
- dapp,
137
- sessionId
138
- }
139
- }));
140
- return res.json(captchaResponse);
141
- } catch (err) {
142
- req.logger.error(() => ({
143
- err,
144
- data: req.params,
145
- msg: "Error in image captcha challenge request"
146
- }));
147
- return next(
148
- new ProsopoApiError("API.BAD_REQUEST", {
149
- context: {
150
- error: err,
151
- code: 500,
152
- params: req.params,
153
- context: err
154
- },
155
- i18n: req.i18n,
156
- logger: req.logger
157
- })
158
- );
159
- }
160
- }
14
+ (req, res, next) => getImageCaptchaChallenge(env, userAccessRulesStorage)(req, res, next)
161
15
  );
162
16
  router.post(
163
17
  ClientApiPaths.SubmitImageCaptchaSolution,
164
- async (req, res, next) => {
165
- const tasks = new Tasks(env, req.logger);
166
- if (getMaintenanceMode()) {
167
- req.logger.info(() => ({
168
- msg: "Maintenance mode active - returning verified for image captcha"
169
- }));
170
- const result = {
171
- status: "ok",
172
- captchas: [],
173
- verified: true
174
- };
175
- return res.json(result);
176
- }
177
- let parsed;
178
- try {
179
- parsed = CaptchaSolutionBody.parse(req.body);
180
- } catch (err) {
181
- return next(
182
- new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
183
- context: { code: 400, error: err, body: req.body },
184
- i18n: req.i18n,
185
- logger: req.logger
186
- })
187
- );
188
- }
189
- const { user, dapp } = parsed;
190
- validateSiteKey(dapp);
191
- validateAddr(user);
192
- try {
193
- const clientRecord = await tasks.db.getClientRecord(parsed.dapp);
194
- if (!clientRecord) {
195
- return next(
196
- new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
197
- context: { code: 400, siteKey: dapp },
198
- i18n: req.i18n,
199
- logger: req.logger
200
- })
201
- );
202
- }
203
- const result = await tasks.imgCaptchaManager.dappUserSolution(
204
- user,
205
- dapp,
206
- parsed[ApiParams.requestHash],
207
- parsed[ApiParams.captchas],
208
- parsed[ApiParams.signature].user.timestamp,
209
- Number.parseInt(parsed[ApiParams.timestamp]),
210
- parsed[ApiParams.signature].provider.requestHash,
211
- getIPAddress(req.ip || ""),
212
- flatten(req.headers),
213
- req.ja4
214
- );
215
- const returnValue = {
216
- status: req.i18n.t(
217
- result.verified ? "API.CAPTCHA_PASSED" : "API.CAPTCHA_FAILED"
218
- ),
219
- ...result
220
- };
221
- return res.json(returnValue);
222
- } catch (err) {
223
- req.logger.error(() => ({
224
- err,
225
- body: req.body,
226
- msg: "Error in image captcha solution submission"
227
- }));
228
- return next(
229
- new ProsopoApiError("API.BAD_REQUEST", {
230
- context: {
231
- code: 500,
232
- siteKey: req.body.dapp,
233
- error: err
234
- },
235
- i18n: req.i18n,
236
- logger: req.logger
237
- })
238
- );
239
- }
240
- }
18
+ (req, res, next) => submitImageCaptchaSolution(env, userAccessRulesStorage)(req, res, next)
19
+ );
20
+ router.post(
21
+ ClientApiPaths.GetPowCaptchaChallenge,
22
+ (req, res, next) => getPoWCaptchaChallenge(env, userAccessRulesStorage)(req, res, next)
241
23
  );
242
- router.post(ClientApiPaths.GetPowCaptchaChallenge, async (req, res, next) => {
243
- let parsed;
244
- const tasks = new Tasks(env);
245
- tasks.setLogger(req.logger);
246
- try {
247
- parsed = GetPowCaptchaChallengeRequestBody.parse(req.body);
248
- } catch (err) {
249
- return next(
250
- new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
251
- context: { code: 400, error: err },
252
- i18n: req.i18n,
253
- logger: req.logger
254
- })
255
- );
256
- }
257
- const { user, dapp, sessionId } = parsed;
258
- validateSiteKey(dapp);
259
- validateAddr(user);
260
- try {
261
- const clientSettings = await tasks.db.getClientRecord(dapp);
262
- if (!clientSettings) {
263
- return next(
264
- new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
265
- context: { code: 400, siteKey: dapp },
266
- i18n: req.i18n,
267
- logger: req.logger
268
- })
269
- );
270
- }
271
- const userScope = getRequestUserScope(
272
- flatten(req.headers),
273
- req.ja4,
274
- req.ip,
275
- user
276
- );
277
- const userAccessPolicy = (await tasks.powCaptchaManager.getPrioritisedAccessPolicies(
278
- userAccessRulesStorage,
279
- dapp,
280
- userScope
281
- ))[0];
282
- const {
283
- valid,
284
- reason,
285
- sessionId: validSessionId,
286
- powDifficulty
287
- } = await tasks.powCaptchaManager.isValidRequest(
288
- clientSettings,
289
- CaptchaType.pow,
290
- env,
291
- sessionId,
292
- userAccessPolicy,
293
- req.ip
294
- );
295
- if (!valid) {
296
- return next(
297
- new ProsopoApiError(reason || "API.BAD_REQUEST", {
298
- context: {
299
- code: 400,
300
- siteKey: dapp,
301
- user
302
- },
303
- i18n: req.i18n,
304
- logger: req.logger
305
- })
306
- );
307
- }
308
- const origin = req.headers.origin;
309
- if (!origin) {
310
- return next(
311
- new ProsopoApiError("API.BAD_REQUEST", {
312
- context: {
313
- error: "Origin header not found",
314
- code: 400,
315
- siteKey: dapp,
316
- user
317
- },
318
- i18n: req.i18n,
319
- logger: req.logger
320
- })
321
- );
322
- }
323
- const difficulty = powDifficulty || userAccessPolicy?.powDifficulty || clientSettings?.settings?.powDifficulty;
324
- const challenge = await tasks.powCaptchaManager.getPowCaptchaChallenge(
325
- user,
326
- dapp,
327
- origin,
328
- difficulty
329
- );
330
- await tasks.db.storePowCaptchaRecord(
331
- challenge.challenge,
332
- {
333
- requestedAtTimestamp: challenge.requestedAtTimestamp,
334
- userAccount: user,
335
- dappAccount: dapp
336
- },
337
- challenge.difficulty,
338
- challenge.providerSignature,
339
- getCompositeIpAddress(req.ip || ""),
340
- flatten(req.headers),
341
- req.ja4,
342
- validSessionId
343
- );
344
- const getPowCaptchaResponse = {
345
- [ApiParams.status]: "ok",
346
- [ApiParams.challenge]: challenge.challenge,
347
- [ApiParams.difficulty]: challenge.difficulty,
348
- [ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
349
- [ApiParams.signature]: {
350
- [ApiParams.provider]: {
351
- [ApiParams.challenge]: challenge.providerSignature
352
- }
353
- }
354
- };
355
- req.logger.info(() => ({
356
- msg: "PoW captcha challenge issued",
357
- data: {
358
- captchaType: CaptchaType.pow,
359
- challenge: challenge.challenge,
360
- difficulty: challenge.difficulty,
361
- user,
362
- dapp,
363
- session: sessionId
364
- }
365
- }));
366
- return res.json(getPowCaptchaResponse);
367
- } catch (err) {
368
- req.logger.error(() => ({
369
- err,
370
- body: req.body,
371
- msg: "Error in PoW captcha challenge request"
372
- }));
373
- return next(
374
- new ProsopoApiError("API.BAD_REQUEST", {
375
- context: {
376
- code: 500,
377
- siteKey: req.body.dapp,
378
- user: req.body.user,
379
- error: err
380
- },
381
- i18n: req.i18n,
382
- logger: req.logger
383
- })
384
- );
385
- }
386
- });
387
24
  router.post(
388
25
  ClientApiPaths.SubmitPowCaptchaSolution,
389
- async (req, res, next) => {
390
- let parsed;
391
- const tasks = new Tasks(env, req.logger);
392
- if (getMaintenanceMode()) {
393
- req.logger.info(() => ({
394
- msg: "Maintenance mode active - returning verified"
395
- }));
396
- const response = {
397
- status: "ok",
398
- verified: true
399
- };
400
- return res.json(response);
401
- }
402
- try {
403
- parsed = SubmitPowCaptchaSolutionBody.parse(req.body);
404
- } catch (err) {
405
- return next(
406
- new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
407
- context: { code: 400, error: err, body: req.body },
408
- i18n: req.i18n,
409
- logger: req.logger
410
- })
411
- );
412
- }
413
- const { challenge, signature, nonce, verifiedTimeout, dapp, user } = parsed;
414
- validateSiteKey(dapp);
415
- validateAddr(user);
416
- try {
417
- const clientRecord = await tasks.db.getClientRecord(dapp);
418
- if (!clientRecord) {
419
- return next(
420
- new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
421
- context: { code: 400, siteKey: dapp },
422
- i18n: req.i18n,
423
- logger: req.logger
424
- })
425
- );
426
- }
427
- const verified = await tasks.powCaptchaManager.verifyPowCaptchaSolution(
428
- challenge,
429
- signature.provider.challenge,
430
- nonce,
431
- verifiedTimeout,
432
- signature.user.timestamp,
433
- getIPAddress(req.ip || ""),
434
- flatten(req.headers)
435
- );
436
- const response = { status: "ok", verified };
437
- return res.json(response);
438
- } catch (err) {
439
- req.logger.error(() => ({
440
- err,
441
- body: req.body,
442
- msg: "Error in PoW captcha solution submission"
443
- }));
444
- return next(
445
- new ProsopoApiError("API.BAD_REQUEST", {
446
- context: {
447
- code: 500,
448
- siteKey: req.body.dapp,
449
- error: err
450
- },
451
- i18n: req.i18n,
452
- logger: req.logger
453
- })
454
- );
455
- }
456
- }
26
+ (req, res, next) => submitPoWCaptchaSolution(env)(req, res, next)
457
27
  );
458
28
  router.post(
459
29
  ClientApiPaths.GetFrictionlessCaptchaChallenge,
460
- async (req, res, next) => {
461
- try {
462
- const tasks = new Tasks(env, req.logger);
463
- const { token, headHash, dapp, user } = GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
464
- if (getMaintenanceMode()) {
465
- req.logger.info(() => ({
466
- msg: "Maintenance mode active - storing dummy token and sending PoW captcha",
467
- data: { dapp, user }
468
- }));
469
- return res.json(
470
- await tasks.frictionlessManager.sendPowCaptcha({
471
- token,
472
- score: 0,
473
- threshold: 0.5,
474
- scoreComponents: {
475
- baseScore: 0
476
- },
477
- providerSelectEntropy: 0,
478
- ipAddress: getCompositeIpAddress(req.ip || ""),
479
- powDifficulty: void 0,
480
- webView: false,
481
- iFrame: false,
482
- decryptedHeadHash: ""
483
- })
484
- );
485
- }
486
- const existingToken = await tasks.db.getSessionRecordByToken(token);
487
- if (existingToken) {
488
- req.logger.info(() => ({
489
- token: existingToken,
490
- msg: "Token has already been used"
491
- }));
492
- return next(
493
- new ProsopoApiError("API.BAD_REQUEST", {
494
- context: {
495
- code: 400,
496
- siteKey: dapp,
497
- user
498
- },
499
- i18n: req.i18n,
500
- logger: req.logger
501
- })
502
- );
503
- }
504
- const lScore = tasks.frictionlessManager.checkLangRules(
505
- req.headers["accept-language"] || ""
506
- );
507
- const {
508
- baseBotScore,
509
- timestamp,
510
- providerSelectEntropy,
511
- userId,
512
- userAgent,
513
- webView,
514
- iFrame,
515
- decryptedHeadHash
516
- } = await tasks.frictionlessManager.decryptPayload(token, headHash);
517
- req.logger.debug(() => ({
518
- msg: "Decrypted payload",
519
- data: {
520
- baseBotScore,
521
- timestamp,
522
- providerSelectEntropy,
523
- userId,
524
- userAgent,
525
- webView
526
- }
527
- }));
528
- let botScore = baseBotScore + lScore;
529
- const clientRecord = await tasks.db.getClientRecord(dapp);
530
- if (!clientRecord) {
531
- return next(
532
- new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
533
- context: { code: 400, siteKey: dapp },
534
- i18n: req.i18n,
535
- logger: req.logger
536
- })
537
- );
538
- }
539
- const { valid, reason } = await tasks.frictionlessManager.isValidRequest(
540
- clientRecord,
541
- CaptchaType.frictionless,
542
- env
543
- );
544
- if (!valid) {
545
- return next(
546
- new ProsopoApiError(reason || "API.BAD_REQUEST", {
547
- context: {
548
- code: 400,
549
- siteKey: dapp,
550
- user
551
- },
552
- i18n: req.i18n,
553
- logger: req.logger
554
- })
555
- );
556
- }
557
- const botThreshold = clientRecord.settings?.frictionlessThreshold || DEFAULT_FRICTIONLESS_THRESHOLD;
558
- let scoreComponents = {
559
- baseScore: baseBotScore,
560
- ...lScore && { lScore }
561
- };
562
- const ipAddress = getCompositeIpAddress(req.ip || "");
563
- tasks.frictionlessManager.setSessionParams({
564
- token,
565
- score: botScore,
566
- threshold: botThreshold,
567
- scoreComponents,
568
- providerSelectEntropy,
569
- ipAddress,
570
- webView,
571
- iFrame,
572
- decryptedHeadHash
573
- });
574
- const userScope = getRequestUserScope(
575
- flatten(req.headers),
576
- req.ja4,
577
- req.ip,
578
- user
579
- );
580
- const userAccessPolicy = (await tasks.frictionlessManager.getPrioritisedAccessPolicies(
581
- userAccessRulesStorage,
582
- dapp,
583
- userScope
584
- ))[0];
585
- const headersUserAgent = req.headers["user-agent"];
586
- const hashedHeadersUserAgent = headersUserAgent ? hashUserAgent(headersUserAgent) : "";
587
- const headersProsopoUser = req.headers["prosopo-user"];
588
- if (hashedHeadersUserAgent !== userAgent || headersProsopoUser !== userId) {
589
- req.logger.info(() => ({
590
- msg: "User agent or user id does not match",
591
- data: {
592
- headersUserAgent,
593
- hashedHeadersUserAgent,
594
- userAgent,
595
- // This is the hashed user agent from the token
596
- headersProsopoUser,
597
- userId
598
- }
599
- }));
600
- return res.json(
601
- await tasks.frictionlessManager.sendImageCaptcha({
602
- solvedImagesCount: timestampDecayFunction(timestamp)
603
- })
604
- );
605
- }
606
- if (userAccessPolicy) {
607
- const scoreUpdate = tasks.frictionlessManager.scoreIncreaseAccessPolicy(
608
- userAccessPolicy,
609
- baseBotScore,
610
- botScore,
611
- scoreComponents
612
- );
613
- botScore = scoreUpdate.score;
614
- scoreComponents = scoreUpdate.scoreComponents;
615
- tasks.frictionlessManager.updateScore(botScore, scoreComponents);
616
- if (userAccessPolicy.captchaType === CaptchaType.image) {
617
- return res.json(
618
- await tasks.frictionlessManager.sendImageCaptcha({
619
- solvedImagesCount: userAccessPolicy.solvedImagesCount
620
- })
621
- );
622
- }
623
- if (userAccessPolicy.captchaType === CaptchaType.pow) {
624
- return res.json(
625
- await tasks.frictionlessManager.sendPowCaptcha({
626
- powDifficulty: void 0
627
- })
628
- );
629
- }
630
- }
631
- if (clientRecord.settings.disallowWebView && webView) {
632
- tasks.logger.info(() => ({
633
- msg: "WebView detected"
634
- }));
635
- const scoreUpdate = tasks.frictionlessManager.scoreIncreaseWebView(
636
- baseBotScore,
637
- botScore,
638
- scoreComponents
639
- );
640
- botScore = scoreUpdate.score;
641
- scoreComponents = scoreUpdate.scoreComponents;
642
- tasks.frictionlessManager.updateScore(botScore, scoreComponents);
643
- return res.json(
644
- await tasks.frictionlessManager.sendImageCaptcha({
645
- solvedImagesCount: env.config.captchas.solved.count * 2
646
- })
647
- );
648
- }
649
- if (FrictionlessManager.timestampTooOld(timestamp)) {
650
- const scoreUpdate = tasks.frictionlessManager.scoreIncreaseTimestamp(
651
- timestamp,
652
- baseBotScore,
653
- botScore,
654
- scoreComponents
655
- );
656
- botScore = scoreUpdate.score;
657
- scoreComponents = scoreUpdate.scoreComponents;
658
- tasks.frictionlessManager.updateScore(botScore, scoreComponents);
659
- return res.json(
660
- await tasks.frictionlessManager.sendImageCaptcha({
661
- solvedImagesCount: timestampDecayFunction(timestamp)
662
- })
663
- );
664
- }
665
- const hostVerified = await tasks.frictionlessManager.hostVerified(
666
- providerSelectEntropy
667
- );
668
- if (!hostVerified.verified) {
669
- const scoreUpdate = tasks.frictionlessManager.scoreIncreaseUnverifiedHost(
670
- hostVerified.domain,
671
- baseBotScore,
672
- botScore,
673
- scoreComponents
674
- );
675
- botScore = scoreUpdate.score;
676
- scoreComponents = scoreUpdate.scoreComponents;
677
- tasks.frictionlessManager.updateScore(botScore, scoreComponents);
678
- }
679
- if (Number(botScore) > botThreshold) {
680
- req.logger.info(() => ({
681
- msg: "Bot score is greater than threshold",
682
- data: {
683
- botScore,
684
- botThreshold,
685
- token
686
- }
687
- }));
688
- return res.json(
689
- await tasks.frictionlessManager.sendImageCaptcha({
690
- solvedImagesCount: env.config.captchas.solved.count
691
- })
692
- );
693
- }
694
- return res.json(
695
- await tasks.frictionlessManager.sendPowCaptcha({
696
- powDifficulty: void 0
697
- })
698
- );
699
- } catch (err) {
700
- req.logger.error(() => ({
701
- err,
702
- msg: "Error in frictionless captcha challenge"
703
- }));
704
- return next(
705
- new ProsopoApiError("API.BAD_REQUEST", {
706
- context: { code: 400, error: err },
707
- i18n: req.i18n,
708
- logger: req.logger
709
- })
710
- );
711
- }
712
- }
30
+ (req, res, next) => getFrictionlessCaptchaChallenge(env, userAccessRulesStorage)(
31
+ req,
32
+ res,
33
+ next
34
+ )
713
35
  );
714
36
  router.use(handleErrors);
715
37
  return router;