@prosopo/provider 3.3.0 → 3.12.14

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 (377) hide show
  1. package/CHANGELOG.md +718 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +4278 -0
  5. package/coverage/coverage-final.json +42 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +311 -0
  8. package/coverage/prettify.css +1 -0
  9. package/coverage/prettify.js +2 -0
  10. package/coverage/sort-arrow-sprite.png +0 -0
  11. package/coverage/sorter.js +210 -0
  12. package/coverage/src/api/admin/apiAdminRoutesProvider.ts.html +214 -0
  13. package/coverage/src/api/admin/apiRegisterSiteKeyEndpoint.ts.html +259 -0
  14. package/coverage/src/api/admin/apiRemoveDetectorKeyEndpoint.ts.html +283 -0
  15. package/coverage/src/api/admin/apiToggleMaintenanceModeEndpoint.ts.html +334 -0
  16. package/coverage/src/api/admin/apiUpdateDetectorKeyEndpoint.ts.html +298 -0
  17. package/coverage/src/api/admin/createApiAdminRoutesProvider.ts.html +163 -0
  18. package/coverage/src/api/admin/index.html +191 -0
  19. package/coverage/src/api/blacklistRequestInspector.ts.html +751 -0
  20. package/coverage/src/api/block.ts.html +187 -0
  21. package/coverage/src/api/captcha.ts.html +2803 -0
  22. package/coverage/src/api/domainMiddleware.ts.html +493 -0
  23. package/coverage/src/api/headerCheckMiddleware.ts.html +256 -0
  24. package/coverage/src/api/ignoreMiddleware.ts.html +181 -0
  25. package/coverage/src/api/index.html +266 -0
  26. package/coverage/src/api/ja4Middleware.ts.html +400 -0
  27. package/coverage/src/api/public.ts.html +343 -0
  28. package/coverage/src/api/robotsMiddleware.ts.html +157 -0
  29. package/coverage/src/api/validateAddress.ts.html +214 -0
  30. package/coverage/src/api/verify.ts.html +871 -0
  31. package/coverage/src/compositeIpAddress.ts.html +340 -0
  32. package/coverage/src/index.html +161 -0
  33. package/coverage/src/index.ts.html +175 -0
  34. package/coverage/src/pairs.ts.html +238 -0
  35. package/coverage/src/rules/index.html +116 -0
  36. package/coverage/src/rules/lang.ts.html +187 -0
  37. package/coverage/src/schedulers/captchaScheduler.ts.html +250 -0
  38. package/coverage/src/schedulers/getClientList.ts.html +271 -0
  39. package/coverage/src/schedulers/index.html +131 -0
  40. package/coverage/src/services/index.html +131 -0
  41. package/coverage/src/services/ipComparison.ts.html +685 -0
  42. package/coverage/src/services/ipInfo.ts.html +490 -0
  43. package/coverage/src/tasks/captchaManager.ts.html +865 -0
  44. package/coverage/src/tasks/client/clientTasks.ts.html +1381 -0
  45. package/coverage/src/tasks/client/index.html +116 -0
  46. package/coverage/src/tasks/dataset/datasetTasks.ts.html +268 -0
  47. package/coverage/src/tasks/dataset/datasetTasksUtils.ts.html +271 -0
  48. package/coverage/src/tasks/dataset/index.html +131 -0
  49. package/coverage/src/tasks/detection/decodePayload.js.html +127 -0
  50. package/coverage/src/tasks/detection/getBotScore.ts.html +244 -0
  51. package/coverage/src/tasks/detection/index.html +131 -0
  52. package/coverage/src/tasks/frictionless/frictionlessTasks.ts.html +1216 -0
  53. package/coverage/src/tasks/frictionless/frictionlessTasksUtils.ts.html +247 -0
  54. package/coverage/src/tasks/frictionless/index.html +131 -0
  55. package/coverage/src/tasks/imgCaptcha/imgCaptchaTasks.ts.html +1972 -0
  56. package/coverage/src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts.html +232 -0
  57. package/coverage/src/tasks/imgCaptcha/index.html +131 -0
  58. package/coverage/src/tasks/index.html +146 -0
  59. package/coverage/src/tasks/index.ts.html +127 -0
  60. package/coverage/src/tasks/powCaptcha/index.html +131 -0
  61. package/coverage/src/tasks/powCaptcha/powTasks.ts.html +961 -0
  62. package/coverage/src/tasks/powCaptcha/powTasksUtils.ts.html +244 -0
  63. package/coverage/src/tasks/tasks.ts.html +388 -0
  64. package/coverage/src/util.ts.html +1627 -0
  65. package/coverage/src/utils/hashUserAgent.ts.html +184 -0
  66. package/coverage/src/utils/index.html +116 -0
  67. package/dist/api/admin/apiAdminRoutesProvider.d.ts +9 -0
  68. package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +1 -0
  69. package/dist/api/admin/apiAdminRoutesProvider.js +13 -18
  70. package/dist/api/admin/apiAdminRoutesProvider.js.map +1 -0
  71. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts +14 -0
  72. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -0
  73. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -0
  74. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts +23 -0
  75. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -0
  76. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +7 -4
  77. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -0
  78. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +13 -0
  79. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -0
  80. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +40 -0
  81. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -0
  82. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts +14 -0
  83. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +1 -0
  84. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -0
  85. package/dist/api/admin/createApiAdminRoutesProvider.d.ts +4 -0
  86. package/dist/api/admin/createApiAdminRoutesProvider.d.ts.map +1 -0
  87. package/dist/api/admin/createApiAdminRoutesProvider.js.map +1 -0
  88. package/dist/api/blacklistRequestInspector.d.ts +19 -0
  89. package/dist/api/blacklistRequestInspector.d.ts.map +1 -0
  90. package/dist/api/blacklistRequestInspector.js +14 -12
  91. package/dist/api/blacklistRequestInspector.js.map +1 -0
  92. package/dist/api/block.d.ts +3 -0
  93. package/dist/api/block.d.ts.map +1 -0
  94. package/dist/api/block.js.map +1 -0
  95. package/dist/api/captcha.d.ts +4 -0
  96. package/dist/api/captcha.d.ts.map +1 -0
  97. package/dist/api/captcha.js +226 -48
  98. package/dist/api/captcha.js.map +1 -0
  99. package/dist/api/domainMiddleware.d.ts +4 -0
  100. package/dist/api/domainMiddleware.d.ts.map +1 -0
  101. package/dist/api/domainMiddleware.js +8 -8
  102. package/dist/api/domainMiddleware.js.map +1 -0
  103. package/dist/api/headerCheckMiddleware.d.ts +4 -0
  104. package/dist/api/headerCheckMiddleware.d.ts.map +1 -0
  105. package/dist/api/headerCheckMiddleware.js +4 -0
  106. package/dist/api/headerCheckMiddleware.js.map +1 -0
  107. package/dist/api/ignoreMiddleware.d.ts +3 -0
  108. package/dist/api/ignoreMiddleware.d.ts.map +1 -0
  109. package/dist/api/ignoreMiddleware.js +4 -1
  110. package/dist/api/ignoreMiddleware.js.map +1 -0
  111. package/dist/api/ja4Middleware.d.ts +10 -0
  112. package/dist/api/ja4Middleware.d.ts.map +1 -0
  113. package/dist/api/ja4Middleware.js +5 -23
  114. package/dist/api/ja4Middleware.js.map +1 -0
  115. package/dist/api/public.d.ts +4 -0
  116. package/dist/api/public.d.ts.map +1 -0
  117. package/dist/api/public.js +26 -3
  118. package/dist/api/public.js.map +1 -0
  119. package/dist/api/robotsMiddleware.d.ts +3 -0
  120. package/dist/api/robotsMiddleware.d.ts.map +1 -0
  121. package/dist/api/robotsMiddleware.js.map +1 -0
  122. package/dist/api/validateAddress.d.ts +5 -0
  123. package/dist/api/validateAddress.d.ts.map +1 -0
  124. package/dist/api/validateAddress.js.map +1 -0
  125. package/dist/api/verify.d.ts +4 -0
  126. package/dist/api/verify.d.ts.map +1 -0
  127. package/dist/api/verify.js +27 -3
  128. package/dist/api/verify.js.map +1 -0
  129. package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +13 -18
  130. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +2 -1
  131. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +9 -5
  132. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +41 -0
  133. package/dist/cjs/api/blacklistRequestInspector.cjs +13 -11
  134. package/dist/cjs/api/captcha.cjs +226 -48
  135. package/dist/cjs/api/domainMiddleware.cjs +8 -8
  136. package/dist/cjs/api/headerCheckMiddleware.cjs +4 -0
  137. package/dist/cjs/api/ignoreMiddleware.cjs +3 -0
  138. package/dist/cjs/api/ja4Middleware.cjs +6 -23
  139. package/dist/cjs/api/public.cjs +26 -3
  140. package/dist/cjs/api/verify.cjs +27 -3
  141. package/dist/cjs/compositeIpAddress.cjs +53 -0
  142. package/dist/cjs/index.cjs +7 -0
  143. package/dist/cjs/pairs.cjs +27 -0
  144. package/dist/cjs/services/ipComparison.cjs +123 -0
  145. package/dist/cjs/services/ipInfo.cjs +87 -0
  146. package/dist/cjs/tasks/captchaManager.cjs +41 -10
  147. package/dist/cjs/tasks/client/clientTasks.cjs +31 -43
  148. package/dist/cjs/tasks/detection/decodePayload.cjs +616 -281
  149. package/dist/cjs/tasks/detection/getBotScore.cjs +28 -4
  150. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +227 -36
  151. package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +17 -0
  152. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +78 -30
  153. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +49 -21
  154. package/dist/cjs/util.cjs +262 -17
  155. package/dist/cjs/utils/hashUserAgent.cjs +10 -0
  156. package/dist/compositeIpAddress.d.ts +5 -0
  157. package/dist/compositeIpAddress.d.ts.map +1 -0
  158. package/dist/compositeIpAddress.js +53 -0
  159. package/dist/compositeIpAddress.js.map +1 -0
  160. package/dist/index.d.ts +17 -0
  161. package/dist/index.d.ts.map +1 -0
  162. package/dist/index.js +8 -1
  163. package/dist/index.js.map +1 -0
  164. package/dist/pairs.d.ts +3 -0
  165. package/dist/pairs.d.ts.map +1 -0
  166. package/dist/pairs.js +27 -0
  167. package/dist/pairs.js.map +1 -0
  168. package/dist/rules/lang.d.ts +3 -0
  169. package/dist/rules/lang.d.ts.map +1 -0
  170. package/dist/rules/lang.js.map +1 -0
  171. package/dist/schedulers/captchaScheduler.d.ts +4 -0
  172. package/dist/schedulers/captchaScheduler.d.ts.map +1 -0
  173. package/dist/schedulers/captchaScheduler.js.map +1 -0
  174. package/dist/schedulers/getClientList.d.ts +4 -0
  175. package/dist/schedulers/getClientList.d.ts.map +1 -0
  176. package/dist/schedulers/getClientList.js.map +1 -0
  177. package/dist/schedulers/setClientEntropy.d.ts +4 -0
  178. package/dist/schedulers/setClientEntropy.d.ts.map +1 -0
  179. package/dist/schedulers/setClientEntropy.js +31 -0
  180. package/dist/schedulers/setClientEntropy.js.map +1 -0
  181. package/dist/services/ipComparison.d.ts +3 -0
  182. package/dist/services/ipComparison.d.ts.map +1 -0
  183. package/dist/services/ipComparison.js +123 -0
  184. package/dist/services/ipComparison.js.map +1 -0
  185. package/dist/services/ipInfo.d.ts +3 -0
  186. package/dist/services/ipInfo.d.ts.map +1 -0
  187. package/dist/services/ipInfo.js +87 -0
  188. package/dist/services/ipInfo.js.map +1 -0
  189. package/dist/tasks/captchaManager.d.ts +34 -0
  190. package/dist/tasks/captchaManager.d.ts.map +1 -0
  191. package/dist/tasks/captchaManager.js +39 -9
  192. package/dist/tasks/captchaManager.js.map +1 -0
  193. package/dist/tasks/client/clientTasks.d.ts +21 -0
  194. package/dist/tasks/client/clientTasks.d.ts.map +1 -0
  195. package/dist/tasks/client/clientTasks.js +31 -43
  196. package/dist/tasks/client/clientTasks.js.map +1 -0
  197. package/dist/tasks/dataset/datasetTasks.d.ts +13 -0
  198. package/dist/tasks/dataset/datasetTasks.d.ts.map +1 -0
  199. package/dist/tasks/dataset/datasetTasks.js.map +1 -0
  200. package/dist/tasks/dataset/datasetTasksUtils.d.ts +3 -0
  201. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -0
  202. package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -0
  203. package/dist/tasks/detection/decodePayload.d.ts +5 -0
  204. package/dist/tasks/detection/decodePayload.d.ts.map +1 -0
  205. package/dist/tasks/detection/decodePayload.js +616 -281
  206. package/dist/tasks/detection/decodePayload.js.map +1 -0
  207. package/dist/tasks/detection/getBotScore.d.ts +20 -0
  208. package/dist/tasks/detection/getBotScore.d.ts.map +1 -0
  209. package/dist/tasks/detection/getBotScore.js +29 -5
  210. package/dist/tasks/detection/getBotScore.js.map +1 -0
  211. package/dist/tasks/frictionless/frictionlessTasks.d.ts +67 -0
  212. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -0
  213. package/dist/tasks/frictionless/frictionlessTasks.js +227 -36
  214. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -0
  215. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts +6 -0
  216. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +1 -0
  217. package/dist/tasks/frictionless/frictionlessTasksUtils.js +18 -1
  218. package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +1 -0
  219. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +30 -0
  220. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -0
  221. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +80 -32
  222. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -0
  223. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +7 -0
  224. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +1 -0
  225. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -0
  226. package/dist/tasks/index.d.ts +2 -0
  227. package/dist/tasks/index.d.ts.map +1 -0
  228. package/dist/tasks/index.js.map +1 -0
  229. package/dist/tasks/powCaptcha/powTasks.d.ts +17 -0
  230. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -0
  231. package/dist/tasks/powCaptcha/powTasks.js +50 -22
  232. package/dist/tasks/powCaptcha/powTasks.js.map +1 -0
  233. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +3 -0
  234. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -0
  235. package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -0
  236. package/dist/tasks/tasks.d.ts +25 -0
  237. package/dist/tasks/tasks.d.ts.map +1 -0
  238. package/dist/tasks/tasks.js.map +1 -0
  239. package/dist/tests/index.d.ts +2 -0
  240. package/dist/tests/index.d.ts.map +1 -0
  241. package/dist/tests/index.js +2 -0
  242. package/dist/tests/index.js.map +1 -0
  243. package/dist/tests/integration/accessRules.integration.test.d.ts +2 -0
  244. package/dist/tests/integration/accessRules.integration.test.d.ts.map +1 -0
  245. package/dist/tests/integration/accessRules.integration.test.js +588 -0
  246. package/dist/tests/integration/accessRules.integration.test.js.map +1 -0
  247. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts +2 -0
  248. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts.map +1 -0
  249. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +60 -0
  250. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -0
  251. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts +2 -0
  252. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts.map +1 -0
  253. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +368 -0
  254. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -0
  255. package/dist/tests/integration/imgCaptcha.integration.test.d.ts +2 -0
  256. package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +1 -0
  257. package/dist/tests/integration/imgCaptcha.integration.test.js +272 -0
  258. package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -0
  259. package/dist/tests/integration/ipValidation.integration.test.d.ts +2 -0
  260. package/dist/tests/integration/ipValidation.integration.test.d.ts.map +1 -0
  261. package/dist/tests/integration/ipValidation.integration.test.js +75 -0
  262. package/dist/tests/integration/ipValidation.integration.test.js.map +1 -0
  263. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +32 -0
  264. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +1 -0
  265. package/dist/tests/integration/mocks/solvedTestCaptchas.js +1046 -0
  266. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +1 -0
  267. package/dist/tests/integration/powCaptcha.integration.test.d.ts +2 -0
  268. package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +1 -0
  269. package/dist/tests/integration/powCaptcha.integration.test.js +308 -0
  270. package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -0
  271. package/dist/tests/integration/registerSitekey.d.ts +3 -0
  272. package/dist/tests/integration/registerSitekey.d.ts.map +1 -0
  273. package/dist/tests/integration/registerSitekey.js +24 -0
  274. package/dist/tests/integration/registerSitekey.js.map +1 -0
  275. package/dist/tests/integration/userAccessPolicy.d.ts +2 -0
  276. package/dist/tests/integration/userAccessPolicy.d.ts.map +1 -0
  277. package/dist/tests/integration/userAccessPolicy.js +2 -0
  278. package/dist/tests/integration/userAccessPolicy.js.map +1 -0
  279. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts +2 -0
  280. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts.map +1 -0
  281. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +60 -0
  282. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -0
  283. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +2 -0
  284. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +1 -0
  285. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +43 -0
  286. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +1 -0
  287. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +2 -0
  288. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +1 -0
  289. package/dist/tests/unit/api/ja4Middleware.unit.test.js +57 -0
  290. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -0
  291. package/dist/tests/unit/compositeIpAddress.unit.test.d.ts +2 -0
  292. package/dist/tests/unit/compositeIpAddress.unit.test.d.ts.map +1 -0
  293. package/dist/tests/unit/compositeIpAddress.unit.test.js +86 -0
  294. package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -0
  295. package/dist/tests/unit/pairs.unit.test.d.ts +2 -0
  296. package/dist/tests/unit/pairs.unit.test.d.ts.map +1 -0
  297. package/dist/tests/unit/pairs.unit.test.js +83 -0
  298. package/dist/tests/unit/pairs.unit.test.js.map +1 -0
  299. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +2 -0
  300. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +1 -0
  301. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +75 -0
  302. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -0
  303. package/dist/tests/unit/services/ipComparison.unit.test.d.ts +2 -0
  304. package/dist/tests/unit/services/ipComparison.unit.test.d.ts.map +1 -0
  305. package/dist/tests/unit/services/ipComparison.unit.test.js +258 -0
  306. package/dist/tests/unit/services/ipComparison.unit.test.js.map +1 -0
  307. package/dist/tests/unit/services/ipInfo.unit.test.d.ts +2 -0
  308. package/dist/tests/unit/services/ipInfo.unit.test.d.ts.map +1 -0
  309. package/dist/tests/unit/services/ipInfo.unit.test.js +210 -0
  310. package/dist/tests/unit/services/ipInfo.unit.test.js.map +1 -0
  311. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts +2 -0
  312. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts.map +1 -0
  313. package/dist/tests/unit/tasks/captchaManager.unit.test.js +311 -0
  314. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -0
  315. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +2 -0
  316. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +1 -0
  317. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +289 -0
  318. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -0
  319. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +2 -0
  320. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +1 -0
  321. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +92 -0
  322. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -0
  323. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +2 -0
  324. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +1 -0
  325. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +75 -0
  326. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -0
  327. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts +2 -0
  328. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts.map +1 -0
  329. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js +143 -0
  330. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js.map +1 -0
  331. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts +2 -0
  332. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts.map +1 -0
  333. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +145 -0
  334. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -0
  335. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts +2 -0
  336. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts.map +1 -0
  337. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +64 -0
  338. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +1 -0
  339. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +2 -0
  340. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +1 -0
  341. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +388 -0
  342. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -0
  343. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +2 -0
  344. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +1 -0
  345. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +46 -0
  346. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -0
  347. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +2 -0
  348. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +1 -0
  349. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +216 -0
  350. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -0
  351. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +2 -0
  352. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +1 -0
  353. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +69 -0
  354. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -0
  355. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts +2 -0
  356. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts.map +1 -0
  357. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js +505 -0
  358. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js.map +1 -0
  359. package/dist/tests/unit/util.ipDistance.unit.test.d.ts +2 -0
  360. package/dist/tests/unit/util.ipDistance.unit.test.d.ts.map +1 -0
  361. package/dist/tests/unit/util.ipDistance.unit.test.js +93 -0
  362. package/dist/tests/unit/util.ipDistance.unit.test.js.map +1 -0
  363. package/dist/tests/unit/util.unit.test.d.ts +2 -0
  364. package/dist/tests/unit/util.unit.test.d.ts.map +1 -0
  365. package/dist/tests/unit/util.unit.test.js +170 -0
  366. package/dist/tests/unit/util.unit.test.js.map +1 -0
  367. package/dist/util.d.ts +24 -0
  368. package/dist/util.d.ts.map +1 -0
  369. package/dist/util.js +263 -18
  370. package/dist/util.js.map +1 -0
  371. package/dist/utils/hashUserAgent.d.ts +2 -0
  372. package/dist/utils/hashUserAgent.d.ts.map +1 -0
  373. package/dist/utils/hashUserAgent.js +10 -0
  374. package/dist/utils/hashUserAgent.js.map +1 -0
  375. package/package.json +31 -29
  376. package/vite.test.config.ts +3 -2
  377. package/vite.threads.test.config.ts +33 -0
@@ -1,13 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const decodePayload = require("./decodePayload.cjs");
4
- const getBotScore = async (payload, privateKeyString) => {
5
- const result = await decodePayload(payload, privateKeyString);
4
+ const DEFAULT_ENTROPY = 13837;
5
+ const getBotScore = async (payload, headHash, privateKeyString) => {
6
+ const result = await decodePayload(
7
+ payload,
8
+ headHash,
9
+ privateKeyString
10
+ );
6
11
  const baseBotScore = result.score;
7
12
  const timestamp = result.timestamp;
13
+ const providerSelectEntropy = result.providerSelectEntropy;
14
+ const userId = result.userId;
15
+ const userAgent = result.userAgent;
16
+ const isWebView = result.isWebView ?? false;
17
+ const isIframe = result.isIframe ?? false;
18
+ const decryptedHeadHash = result.decryptedHeadHash;
8
19
  if (baseBotScore === void 0) {
9
- return { baseBotScore: 1, timestamp: 0 };
20
+ return {
21
+ baseBotScore: 1,
22
+ timestamp: 0,
23
+ providerSelectEntropy: DEFAULT_ENTROPY
24
+ };
10
25
  }
11
- return { baseBotScore, timestamp };
26
+ return {
27
+ baseBotScore,
28
+ timestamp,
29
+ providerSelectEntropy,
30
+ userId,
31
+ userAgent,
32
+ isWebView,
33
+ isIframe,
34
+ decryptedHeadHash
35
+ };
12
36
  };
13
37
  exports.getBotScore = getBotScore;
@@ -1,93 +1,223 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const loadBalancer = require("@prosopo/load-balancer");
3
4
  const types = require("@prosopo/types");
4
5
  const uuid = require("uuid");
5
6
  const lang = require("../../rules/lang.cjs");
6
7
  const captchaManager = require("../captchaManager.cjs");
7
8
  const getBotScore = require("../detection/getBotScore.cjs");
9
+ const getDefaultEntropy = () => {
10
+ if (process.env.PROSOPO_ENTROPY) {
11
+ const parsed = Number.parseInt(process.env.PROSOPO_ENTROPY);
12
+ if (!Number.isNaN(parsed)) {
13
+ return parsed;
14
+ }
15
+ }
16
+ return 13337;
17
+ };
8
18
  const DEFAULT_MAX_TIMESTAMP_AGE = 60 * 10 * 1e3;
19
+ const DEFAULT_ENTROPY = getDefaultEntropy();
9
20
  class FrictionlessManager extends captchaManager.CaptchaManager {
10
21
  constructor(db, pair, config, logger) {
11
22
  super(db, pair, logger);
12
23
  this.config = config;
13
24
  }
25
+ setSessionParams(params) {
26
+ this.sessionParams = {
27
+ token: params.token,
28
+ score: params.score,
29
+ threshold: params.threshold,
30
+ scoreComponents: params.scoreComponents,
31
+ providerSelectEntropy: params.providerSelectEntropy,
32
+ ipAddress: params.ipAddress,
33
+ webView: params.webView ?? false,
34
+ iFrame: params.iFrame ?? false,
35
+ decryptedHeadHash: params.decryptedHeadHash
36
+ };
37
+ }
38
+ updateScore(score, scoreComponents) {
39
+ if (this.sessionParams) {
40
+ this.sessionParams.score = score;
41
+ this.sessionParams.scoreComponents = scoreComponents;
42
+ }
43
+ }
14
44
  checkLangRules(acceptLanguage) {
15
45
  return lang.checkLangRules(this.config, acceptLanguage);
16
46
  }
17
- async createSession(tokenId, captchaType) {
47
+ async createSession(token, score, threshold, scoreComponents, providerSelectEntropy, ipAddress, captchaType, solvedImagesCount, powDifficulty, webView = false, iFrame = false, decryptedHeadHash = "") {
18
48
  const sessionRecord = {
19
49
  sessionId: uuid.v4(),
20
50
  createdAt: /* @__PURE__ */ new Date(),
21
- tokenId,
22
- captchaType
51
+ token,
52
+ score,
53
+ threshold,
54
+ scoreComponents,
55
+ providerSelectEntropy,
56
+ ipAddress,
57
+ captchaType,
58
+ solvedImagesCount,
59
+ powDifficulty,
60
+ webView,
61
+ iFrame,
62
+ decryptedHeadHash
23
63
  };
24
64
  await this.db.storeSessionRecord(sessionRecord);
25
65
  return sessionRecord;
26
66
  }
27
- async sendImageCaptcha(tokenId) {
28
- const sessionRecord = await this.createSession(tokenId, types.CaptchaType.image);
67
+ async hostVerified(entropy) {
68
+ const chosen = await loadBalancer.getRandomActiveProvider(
69
+ this.config.defaultEnvironment,
70
+ entropy
71
+ );
72
+ const domain = new URL(chosen.provider.url).hostname;
73
+ this.logger.info(() => ({
74
+ data: { entropy, host: this.config.host, domain }
75
+ }));
76
+ if (domain !== this.config.host) {
77
+ this.logger.info(() => ({
78
+ msg: "Host mismatch",
79
+ data: { expected: this.config.host, got: domain, entropy }
80
+ }));
81
+ return { verified: false, domain };
82
+ }
83
+ return { verified: true, domain };
84
+ }
85
+ async sendImageCaptcha(params) {
86
+ const effectiveParams = { ...this.sessionParams, ...params };
87
+ if (!effectiveParams.token || effectiveParams.score === void 0 || effectiveParams.threshold === void 0 || !effectiveParams.scoreComponents || effectiveParams.providerSelectEntropy === void 0 || !effectiveParams.ipAddress) {
88
+ throw new Error(
89
+ "Session parameters must be set before calling sendImageCaptcha"
90
+ );
91
+ }
92
+ const sessionRecord = await this.createSession(
93
+ effectiveParams.token,
94
+ effectiveParams.score,
95
+ effectiveParams.threshold,
96
+ effectiveParams.scoreComponents,
97
+ effectiveParams.providerSelectEntropy,
98
+ effectiveParams.ipAddress,
99
+ types.CaptchaType.image,
100
+ params?.solvedImagesCount,
101
+ void 0,
102
+ effectiveParams.webView ?? false,
103
+ effectiveParams.iFrame ?? false,
104
+ effectiveParams.decryptedHeadHash
105
+ );
29
106
  return {
30
107
  [types.ApiParams.captchaType]: types.CaptchaType.image,
31
108
  [types.ApiParams.sessionId]: sessionRecord.sessionId,
32
109
  [types.ApiParams.status]: "ok"
33
110
  };
34
111
  }
35
- async sendPowCaptcha(tokenId) {
36
- const sessionRecord = await this.createSession(tokenId, types.CaptchaType.pow);
112
+ async sendPowCaptcha(params) {
113
+ const effectiveParams = { ...this.sessionParams, ...params };
114
+ if (!effectiveParams.token || effectiveParams.score === void 0 || effectiveParams.threshold === void 0 || !effectiveParams.scoreComponents || effectiveParams.providerSelectEntropy === void 0 || !effectiveParams.ipAddress) {
115
+ throw new Error(
116
+ "Session parameters must be set before calling sendPowCaptcha"
117
+ );
118
+ }
119
+ const sessionRecord = await this.createSession(
120
+ effectiveParams.token,
121
+ effectiveParams.score,
122
+ effectiveParams.threshold,
123
+ effectiveParams.scoreComponents,
124
+ effectiveParams.providerSelectEntropy,
125
+ effectiveParams.ipAddress,
126
+ types.CaptchaType.pow,
127
+ void 0,
128
+ params?.powDifficulty,
129
+ effectiveParams.webView ?? false,
130
+ effectiveParams.iFrame ?? false,
131
+ effectiveParams.decryptedHeadHash
132
+ );
37
133
  return {
38
134
  [types.ApiParams.captchaType]: types.CaptchaType.pow,
39
135
  [types.ApiParams.sessionId]: sessionRecord.sessionId,
40
136
  [types.ApiParams.status]: "ok"
41
137
  };
42
138
  }
43
- async scoreIncreaseAccessPolicy(accessPolicy, baseBotScore, botScore, tokenId) {
139
+ scoreIncreaseAccessPolicy(accessPolicy, baseBotScore, botScore, scoreComponents) {
44
140
  const accessPolicyPenalty = accessPolicy?.frictionlessScore || this.config.penalties.PENALTY_ACCESS_RULE;
45
141
  botScore += accessPolicyPenalty;
46
- await this.db.updateFrictionlessTokenRecord(tokenId, {
142
+ return {
47
143
  score: botScore,
48
144
  scoreComponents: {
49
- baseScore: baseBotScore,
145
+ ...scoreComponents,
50
146
  accessPolicy: accessPolicyPenalty
51
147
  }
52
- });
53
- return botScore;
148
+ };
54
149
  }
55
- async scoreIncreaseTimestamp(timestamp, baseBotScore, botScore, tokenId) {
150
+ scoreIncreaseUnverifiedHost(host, baseBotScore, botScore, scoreComponents) {
151
+ this.logger.info(() => ({
152
+ msg: "Host not verified",
153
+ data: { requested: this.config.host, selected: host }
154
+ }));
155
+ botScore += this.config.penalties.PENALTY_UNVERIFIED_HOST;
156
+ return {
157
+ score: botScore,
158
+ scoreComponents: {
159
+ ...scoreComponents,
160
+ unverifiedHost: this.config.penalties.PENALTY_UNVERIFIED_HOST
161
+ }
162
+ };
163
+ }
164
+ scoreIncreaseWebView(baseBotScore, botScore, scoreComponents) {
165
+ this.logger.debug(() => ({
166
+ msg: "WebView detected"
167
+ }));
168
+ botScore += this.config.penalties.PENALTY_WEBVIEW;
169
+ return {
170
+ score: botScore,
171
+ scoreComponents: {
172
+ ...scoreComponents,
173
+ webView: this.config.penalties.PENALTY_WEBVIEW
174
+ }
175
+ };
176
+ }
177
+ scoreIncreaseTimestamp(timestamp, baseBotScore, botScore, scoreComponents) {
56
178
  this.logger.info(() => ({
57
179
  msg: "Timestamp is older than 10 minutes",
58
180
  data: { timestamp: new Date(timestamp) }
59
181
  }));
60
182
  botScore += this.config.penalties.PENALTY_OLD_TIMESTAMP;
61
- await this.db.updateFrictionlessTokenRecord(tokenId, {
183
+ return {
62
184
  score: botScore,
63
185
  scoreComponents: {
64
- baseScore: baseBotScore,
186
+ ...scoreComponents,
65
187
  timeout: this.config.penalties.PENALTY_OLD_TIMESTAMP
66
188
  }
67
- });
68
- return botScore;
189
+ };
69
190
  }
70
191
  static timestampTooOld(timestamp) {
71
192
  const now = Date.now();
72
193
  const diff = now - timestamp;
73
194
  return diff > DEFAULT_MAX_TIMESTAMP_AGE;
74
195
  }
75
- async decryptPayload(token) {
196
+ /**
197
+ * Redacts a key for logging purposes by showing only the first 5, middle 10, and last 5 characters
198
+ * @param key - The key to redact
199
+ * @returns Redacted key string or empty string if key is falsy
200
+ */
201
+ redactKeyForLogging(key) {
202
+ if (!key) return "";
203
+ const start = key.slice(0, 5);
204
+ const middle = key.slice(
205
+ Math.floor(key.length / 2) - 5,
206
+ Math.floor(key.length / 2) + 5
207
+ );
208
+ const end = key.slice(-5);
209
+ return `${start}...${middle}...${end}`;
210
+ }
211
+ async decryptPayload(token, headHash) {
76
212
  const decryptKeys = [
77
- process.env.BOT_DECRYPTION_KEY,
78
- ...await this.getDetectorKeys()
213
+ // Process DB keys first, then env var key last as env key will likely be invalid
214
+ ...await this.getDetectorKeys(),
215
+ process.env.BOT_DECRYPTION_KEY
79
216
  ].filter((k) => k);
80
217
  this.logger.debug(() => {
81
- const loggedKeys = decryptKeys.map((key) => {
82
- if (!key) return "";
83
- const start = key.slice(0, 5);
84
- const middle = key.slice(
85
- Math.floor(key.length / 2) - 5,
86
- Math.floor(key.length / 2) + 5
87
- );
88
- const end = key.slice(-5);
89
- return `${start}...${middle}...${end}`;
90
- });
218
+ const loggedKeys = decryptKeys.map(
219
+ (key) => this.redactKeyForLogging(key)
220
+ );
91
221
  return {
92
222
  msg: "Decrypting score",
93
223
  data: {
@@ -98,19 +228,49 @@ class FrictionlessManager extends captchaManager.CaptchaManager {
98
228
  });
99
229
  let baseBotScore;
100
230
  let timestamp;
231
+ let providerSelectEntropy;
232
+ let userId;
233
+ let userAgent;
234
+ let webView;
235
+ let iFrame;
236
+ let decryptedHeadHash = "";
101
237
  for (const [keyIndex, key] of decryptKeys.entries()) {
102
238
  try {
103
- const { baseBotScore: s, timestamp: t } = await getBotScore.getBotScore(token, key);
104
239
  this.logger.info(() => ({
240
+ msg: "Attempting to decrypt score",
241
+ data: {
242
+ key: this.redactKeyForLogging(key)
243
+ }
244
+ }));
245
+ const decrypted = await getBotScore.getBotScore(token, headHash, key);
246
+ decryptedHeadHash = decrypted.decryptedHeadHash || "";
247
+ const s = decrypted.baseBotScore;
248
+ const t = decrypted.timestamp;
249
+ const p = decrypted.providerSelectEntropy;
250
+ const a = decrypted.userId;
251
+ const u = decrypted.userAgent;
252
+ const w = decrypted.isWebView;
253
+ const i = decrypted.isIframe;
254
+ this.logger.debug(() => ({
105
255
  msg: "Successfully decrypted score",
106
256
  data: {
107
- key: key ? `${key.slice(0, 5)}...${key.slice(-5)}` : "",
257
+ key: this.redactKeyForLogging(key),
108
258
  baseBotScore: s,
109
- timestamp: t
259
+ timestamp: t,
260
+ entropy: p,
261
+ userId: a,
262
+ userAgent: u,
263
+ webView: w,
264
+ iFrame: i
110
265
  }
111
266
  }));
112
267
  baseBotScore = s;
113
268
  timestamp = t;
269
+ providerSelectEntropy = p;
270
+ userId = a;
271
+ userAgent = u;
272
+ webView = w;
273
+ iFrame = i;
114
274
  break;
115
275
  } catch (err) {
116
276
  if (keyIndex === decryptKeys.length - 1) {
@@ -119,17 +279,48 @@ class FrictionlessManager extends captchaManager.CaptchaManager {
119
279
  }));
120
280
  baseBotScore = 1;
121
281
  timestamp = 0;
282
+ providerSelectEntropy = DEFAULT_ENTROPY + 1;
283
+ decryptedHeadHash = "";
122
284
  }
123
285
  }
124
286
  }
125
- if (baseBotScore === void 0 || timestamp === void 0) {
287
+ const baseBotScoreUndefined = baseBotScore === void 0;
288
+ const timestampUndefined = timestamp === void 0;
289
+ const providerSelectEntropyUndefined = providerSelectEntropy === void 0;
290
+ const undefinedCount = Number(baseBotScoreUndefined) + Number(timestampUndefined) + Number(providerSelectEntropyUndefined);
291
+ if (undefinedCount > 0) {
126
292
  this.logger.error(() => ({
127
- msg: "Error decrypting score: baseBotScore or timestamp is undefined"
293
+ msg: "Error decrypting score: baseBotScore or timestamp or providerSelectEntropy is undefined"
128
294
  }));
129
295
  baseBotScore = 1;
130
296
  timestamp = 0;
297
+ providerSelectEntropy = DEFAULT_ENTROPY - undefinedCount;
298
+ decryptedHeadHash = "";
131
299
  }
132
- return { baseBotScore, timestamp };
300
+ this.logger.info(() => ({
301
+ msg: "decryptPayload result",
302
+ data: {
303
+ baseBotScore,
304
+ timestamp,
305
+ entropy: providerSelectEntropy,
306
+ userId,
307
+ userAgent,
308
+ webView,
309
+ iFrame,
310
+ decryptedHeadHash
311
+ }
312
+ }));
313
+ return {
314
+ baseBotScore: Number(baseBotScore),
315
+ timestamp: Number(timestamp),
316
+ providerSelectEntropy: Number(providerSelectEntropy),
317
+ userId,
318
+ userAgent,
319
+ webView,
320
+ iFrame,
321
+ decryptedHeadHash
322
+ };
133
323
  }
134
324
  }
325
+ exports.DEFAULT_ENTROPY = DEFAULT_ENTROPY;
135
326
  exports.FrictionlessManager = FrictionlessManager;
@@ -8,4 +8,21 @@ const computeFrictionlessScore = (scoreComponents) => {
8
8
  ).toFixed(2)
9
9
  );
10
10
  };
11
+ const timestampDecayFunction = (timestamp) => {
12
+ const max = (/* @__PURE__ */ new Date()).getTime();
13
+ if (max - timestamp > 36e5) {
14
+ return 12;
15
+ }
16
+ const min = 1e3;
17
+ const age = max - timestamp;
18
+ const decay = Math.log10(2e3) / max;
19
+ const bigScore = max * (1 - (1 - Math.exp(decay * age) ** 24));
20
+ return Math.max(
21
+ 2,
22
+ Math.round(
23
+ (Math.log(bigScore) - Math.log(min)) / (Math.log(max) - Math.log(min)) * 2.5
24
+ )
25
+ );
26
+ };
11
27
  exports.computeFrictionlessScore = computeFrictionlessScore;
28
+ exports.timestampDecayFunction = timestampDecayFunction;
@@ -6,6 +6,8 @@ const datasets = require("@prosopo/datasets");
6
6
  const types = require("@prosopo/types");
7
7
  const util$2 = require("@prosopo/util");
8
8
  const utilCrypto = require("@prosopo/util-crypto");
9
+ const compositeIpAddress = require("../../compositeIpAddress.cjs");
10
+ const pairs = require("../../pairs.cjs");
9
11
  const lang = require("../../rules/lang.cjs");
10
12
  const util = require("../../util.cjs");
11
13
  const captchaManager = require("../captchaManager.cjs");
@@ -30,7 +32,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
30
32
  }
31
33
  return captchaDocs;
32
34
  }
33
- async getRandomCaptchasAndRequestHash(datasetId, userAccount, ipAddress, captchaConfig, threshold, frictionlessTokenId) {
35
+ async getRandomCaptchasAndRequestHash(datasetId, userAccount, ipAddress, captchaConfig, threshold, sessionId) {
34
36
  const dataset = await this.db.getDatasetDetails(datasetId);
35
37
  if (!dataset) {
36
38
  throw new common.ProsopoEnvError("DATABASE.DATASET_GET_FAILED", {
@@ -78,9 +80,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
78
80
  salt,
79
81
  deadlineTs,
80
82
  currentTime,
81
- ipAddress.bigInt(),
83
+ compositeIpAddress.getCompositeIpAddress(ipAddress),
82
84
  threshold,
83
- frictionlessTokenId
85
+ sessionId
84
86
  );
85
87
  return {
86
88
  captchas,
@@ -100,7 +102,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
100
102
  * @param providerRequestHashSignature
101
103
  * @param ipAddress
102
104
  * @param headers
103
- * @param threshold the percentage of captchas that must be correct to return true
105
+ * @param ja4
104
106
  * @return {Promise<DappUserSolutionResult>} result containing the contract event
105
107
  */
106
108
  async dappUserSolution(userAccount, dappAccount, requestHash, captchas, userTimestampSignature, timestamp, providerRequestHashSignature, ipAddress, headers, ja4) {
@@ -152,6 +154,8 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
152
154
  );
153
155
  if (pendingRequest) {
154
156
  const { storedCaptchas, receivedCaptchas, captchaIds } = await this.validateReceivedCaptchasAgainstStoredCaptchas(captchas);
157
+ const flat = receivedCaptchas.map((c) => util$2.extractData(c.salt));
158
+ const pairs$1 = flat.map((list) => pairs.constructPairList(list));
155
159
  const { tree, commitmentId } = imgCaptchaTasksUtils.buildTreeAndGetCommitmentId(receivedCaptchas);
156
160
  const datasetId = util$2.at(storedCaptchas, 0).datasetId;
157
161
  if (!datasetId) {
@@ -170,10 +174,10 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
170
174
  userSignature: userTimestampSignature,
171
175
  userSubmitted: true,
172
176
  serverChecked: false,
173
- requestedAtTimestamp: timestamp,
174
- ipAddress,
177
+ requestedAtTimestamp: new Date(timestamp),
178
+ ipAddress: compositeIpAddress.getCompositeIpAddress(ipAddress),
175
179
  headers,
176
- frictionlessTokenId: pendingRecord.frictionlessTokenId,
180
+ sessionId: pendingRecord.sessionId,
177
181
  ja4
178
182
  };
179
183
  await this.db.storeUserImageCaptchaSolution(receivedCaptchas, commit);
@@ -191,6 +195,21 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
191
195
  })
192
196
  );
193
197
  const totalImages = storedCaptchas[0]?.items.length || 0;
198
+ if (pairs.containsIdenticalPairs(pairs$1)) {
199
+ await this.db.disapproveDappUserCommitment(
200
+ commitmentId,
201
+ "CAPTCHA.INVALID_SOLUTION",
202
+ pairs$1
203
+ );
204
+ response = {
205
+ captchas: captchaIds.map((id) => ({
206
+ captchaId: id,
207
+ proof: [[]]
208
+ })),
209
+ verified: false
210
+ };
211
+ return response;
212
+ }
194
213
  if (datasets.compareCaptchaSolutions(
195
214
  receivedCaptchas,
196
215
  solutionRecords,
@@ -204,11 +223,12 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
204
223
  })),
205
224
  verified: true
206
225
  };
207
- await this.db.approveDappUserCommitment(commitmentId);
226
+ await this.db.approveDappUserCommitment(commitmentId, pairs$1);
208
227
  } else {
209
228
  await this.db.disapproveDappUserCommitment(
210
229
  commitmentId,
211
- "CAPTCHA.INVALID_SOLUTION"
230
+ "CAPTCHA.INVALID_SOLUTION",
231
+ pairs$1
212
232
  );
213
233
  response = {
214
234
  captchas: captchaIds.map((id) => ({
@@ -314,7 +334,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
314
334
  }
315
335
  return void 0;
316
336
  }
317
- async verifyImageCaptchaSolution(user, dapp, commitmentId, maxVerifiedTime, ip) {
337
+ async verifyImageCaptchaSolution(user, dapp, commitmentId, env, maxVerifiedTime, ip, disallowWebView) {
318
338
  const solution = await (commitmentId ? this.getDappUserCommitmentById(commitmentId) : this.getDappUserCommitmentByAccount(user, dapp));
319
339
  if (!solution) {
320
340
  this.logger.debug(() => ({
@@ -322,10 +342,6 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
322
342
  }));
323
343
  return { status: "API.USER_NOT_VERIFIED_NO_SOLUTION", verified: false };
324
344
  }
325
- const ipValidation = util.validateIpAddress(ip, solution.ipAddress, this.logger);
326
- if (!ipValidation.isValid) {
327
- return { status: "API.USER_NOT_VERIFIED", verified: false };
328
- }
329
345
  if (solution.serverChecked) {
330
346
  return { status: "API.USER_ALREADY_VERIFIED", verified: false };
331
347
  }
@@ -334,33 +350,65 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
334
350
  return { status: "API.USER_NOT_VERIFIED", verified: false };
335
351
  }
336
352
  maxVerifiedTime = maxVerifiedTime || 60 * 1e3;
337
- if (maxVerifiedTime) {
338
- const currentTime = Date.now();
339
- const timeSinceCompletion = currentTime - solution.requestedAtTimestamp;
340
- if (timeSinceCompletion > maxVerifiedTime) {
341
- this.logger.debug(() => ({
342
- msg: "Not verified - timed out"
353
+ const currentTime = Date.now();
354
+ const timeSinceCompletion = currentTime - solution.requestedAtTimestamp.getTime();
355
+ if (timeSinceCompletion > maxVerifiedTime) {
356
+ this.logger.debug(() => ({
357
+ msg: "Not verified - timed out"
358
+ }));
359
+ return {
360
+ status: "API.USER_NOT_VERIFIED_TIME_EXPIRED",
361
+ verified: false
362
+ };
363
+ }
364
+ if (ip) {
365
+ const solutionIpAddress = compositeIpAddress.getIpAddressFromComposite(solution.ipAddress);
366
+ const clientRecord = await this.db.getClientRecord(dapp);
367
+ const ipValidationRules = clientRecord?.settings?.ipValidationRules;
368
+ await this.db.updateDappUserCommitment(solution.id, {
369
+ providedIp: compositeIpAddress.getCompositeIpAddress(ip)
370
+ });
371
+ const ipValidation = await util.deepValidateIpAddress(
372
+ ip,
373
+ solutionIpAddress,
374
+ this.logger,
375
+ env.config.ipApi.apiKey,
376
+ env.config.ipApi.baseUrl,
377
+ ipValidationRules
378
+ );
379
+ if (!ipValidation.isValid) {
380
+ this.logger.error(() => ({
381
+ msg: "IP validation failed for image captcha",
382
+ data: {
383
+ ip,
384
+ solutionIp: solutionIpAddress.address,
385
+ error: ipValidation.errorMessage,
386
+ distanceKm: ipValidation.distanceKm
387
+ }
343
388
  }));
344
- return {
345
- status: "API.USER_NOT_VERIFIED_TIME_EXPIRED",
346
- verified: false
347
- };
389
+ return { status: "API.USER_NOT_VERIFIED", verified: false };
348
390
  }
349
391
  }
350
392
  const isApproved = solution.result.status === types.CaptchaStatus.approved;
351
393
  let score;
352
- if (solution.frictionlessTokenId) {
353
- const tokenRecord = await this.db.getFrictionlessTokenRecordByTokenId(
354
- solution.frictionlessTokenId
394
+ if (solution.sessionId) {
395
+ const sessionRecord = await this.db.getSessionRecordBySessionId(
396
+ solution.sessionId
355
397
  );
356
- if (tokenRecord) {
357
- score = frictionlessTasksUtils.computeFrictionlessScore(tokenRecord?.scoreComponents);
398
+ if (sessionRecord) {
399
+ score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
358
400
  this.logger.info(() => ({
359
401
  data: {
360
- tscoreComponents: tokenRecord?.scoreComponents,
402
+ scoreComponents: sessionRecord?.scoreComponents,
361
403
  score
362
404
  }
363
405
  }));
406
+ if (disallowWebView === true && (sessionRecord.scoreComponents.webView || 0) > 0) {
407
+ this.logger.info(() => ({
408
+ msg: "Disallowing webview access - user not verified"
409
+ }));
410
+ return { status: "API.USER_NOT_VERIFIED", verified: false };
411
+ }
364
412
  }
365
413
  }
366
414
  return {