@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
@@ -6,12 +6,23 @@ const types = require("@prosopo/types");
6
6
  const utilCrypto = require("@prosopo/util-crypto");
7
7
  const express = require("express");
8
8
  const tasks = require("../tasks/tasks.cjs");
9
+ const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
9
10
  function prosopoVerifyRouter(env) {
10
11
  const router = express.Router();
11
12
  router.post(
12
13
  types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
13
14
  async (req, res, next) => {
14
15
  const tasks$1 = new tasks.Tasks(env, req.logger);
16
+ if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
17
+ req.logger.info(() => ({
18
+ msg: "Maintenance mode active - returning verified for image captcha verification"
19
+ }));
20
+ const verificationResponse = {
21
+ status: "ok",
22
+ verified: true
23
+ };
24
+ return res.json(verificationResponse);
25
+ }
15
26
  let parsed;
16
27
  try {
17
28
  parsed = types.VerifySolutionBody.parse(req.body);
@@ -24,7 +35,7 @@ function prosopoVerifyRouter(env) {
24
35
  })
25
36
  );
26
37
  }
27
- const { dappSignature, token, ip } = parsed;
38
+ const { dappSignature, token, ip, maxVerifiedTime } = parsed;
28
39
  try {
29
40
  const { user, dapp, timestamp, commitmentId } = types.decodeProcaptchaOutput(token);
30
41
  utilCrypto.validateAddress(dapp, false, 42);
@@ -45,8 +56,10 @@ function prosopoVerifyRouter(env) {
45
56
  user,
46
57
  dapp,
47
58
  commitmentId,
48
- parsed.maxVerifiedTime,
49
- ip
59
+ env,
60
+ maxVerifiedTime,
61
+ ip,
62
+ clientRecord.settings.disallowWebView
50
63
  );
51
64
  req.logger.debug(() => ({ data: { response } }));
52
65
  const verificationResponse = tasks$1.imgCaptchaManager.getVerificationResponse(
@@ -73,6 +86,16 @@ function prosopoVerifyRouter(env) {
73
86
  types.ClientApiPaths.VerifyPowCaptchaSolution,
74
87
  async (req, res, next) => {
75
88
  const tasks$1 = new tasks.Tasks(env, req.logger);
89
+ if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
90
+ req.logger.info(() => ({
91
+ msg: "Maintenance mode active - returning verified for PoW captcha verification"
92
+ }));
93
+ const verificationResponse = {
94
+ status: "ok",
95
+ verified: true
96
+ };
97
+ return res.json(verificationResponse);
98
+ }
76
99
  let parsed;
77
100
  try {
78
101
  parsed = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
@@ -113,6 +136,7 @@ function prosopoVerifyRouter(env) {
113
136
  dapp,
114
137
  challenge,
115
138
  verifiedTimeout,
139
+ env,
116
140
  ip
117
141
  );
118
142
  const verificationResponse = tasks$1.powCaptchaManager.getVerificationResponse(
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const typesDatabase = require("@prosopo/types-database");
4
+ const util = require("@prosopo/util");
5
+ const ipAddress = require("ip-address");
6
+ const V6_SHIFT = 64n;
7
+ const v6_LOWER_MASK = (1n << V6_SHIFT) - 1n;
8
+ const getCompositeIpAddress = (ip) => {
9
+ let ipAddress2;
10
+ try {
11
+ ipAddress2 = "string" === typeof ip ? util.getIPAddress(ip) : ip;
12
+ } catch (e) {
13
+ return {
14
+ lower: 0n,
15
+ type: typesDatabase.IpAddressType.v4
16
+ };
17
+ }
18
+ return getCompositeFromIpAddress(ipAddress2);
19
+ };
20
+ const getCompositeFromIpAddress = (ipAddress$1) => {
21
+ const numericIp = ipAddress$1.bigInt();
22
+ if (ipAddress$1 instanceof ipAddress.Address4) {
23
+ return {
24
+ lower: numericIp,
25
+ type: typesDatabase.IpAddressType.v4
26
+ };
27
+ }
28
+ ipAddress$1;
29
+ return {
30
+ lower: numericIp & v6_LOWER_MASK,
31
+ upper: numericIp >> V6_SHIFT,
32
+ type: typesDatabase.IpAddressType.v6
33
+ };
34
+ };
35
+ const getIpAddressFromComposite = (compositeIpAddress) => {
36
+ switch (compositeIpAddress.type) {
37
+ case typesDatabase.IpAddressType.v4:
38
+ return ipAddress.Address4.fromBigInt(getBigInt(compositeIpAddress.lower));
39
+ case typesDatabase.IpAddressType.v6:
40
+ return ipAddress.Address6.fromBigInt(
41
+ getBigInt(compositeIpAddress.upper) << V6_SHIFT | getBigInt(compositeIpAddress.lower) & v6_LOWER_MASK
42
+ );
43
+ default:
44
+ never();
45
+ return ipAddress.Address4.fromBigInt(0n);
46
+ }
47
+ };
48
+ const getBigInt = (number) => BigInt(number || 0n);
49
+ const never = () => {
50
+ throw new Error("Unhandled type");
51
+ };
52
+ exports.getCompositeIpAddress = getCompositeIpAddress;
53
+ exports.getIpAddressFromComposite = getIpAddressFromComposite;
@@ -14,9 +14,13 @@ const headerCheckMiddleware = require("./api/headerCheckMiddleware.cjs");
14
14
  const createApiAdminRoutesProvider = require("./api/admin/createApiAdminRoutesProvider.cjs");
15
15
  const ignoreMiddleware = require("./api/ignoreMiddleware.cjs");
16
16
  const robotsMiddleware = require("./api/robotsMiddleware.cjs");
17
+ const compositeIpAddress = require("./compositeIpAddress.cjs");
18
+ const ipComparison = require("./services/ipComparison.cjs");
17
19
  const tasks = require("./tasks/tasks.cjs");
18
20
  exports.checkIfTaskIsRunning = util.checkIfTaskIsRunning;
21
+ exports.deepValidateIpAddress = util.deepValidateIpAddress;
19
22
  exports.encodeStringAddress = util.encodeStringAddress;
23
+ exports.evaluateIpValidationRules = util.evaluateIpValidationRules;
20
24
  exports.getIPAddress = util.getIPAddress;
21
25
  exports.getIPAddressFromBigInt = util.getIPAddressFromBigInt;
22
26
  exports.shuffleArray = util.shuffleArray;
@@ -35,4 +39,7 @@ exports.headerCheckMiddleware = headerCheckMiddleware.headerCheckMiddleware;
35
39
  exports.createApiAdminRoutesProvider = createApiAdminRoutesProvider.createApiAdminRoutesProvider;
36
40
  exports.ignoreMiddleware = ignoreMiddleware.ignoreMiddleware;
37
41
  exports.robotsMiddleware = robotsMiddleware.robotsMiddleware;
42
+ exports.getCompositeIpAddress = compositeIpAddress.getCompositeIpAddress;
43
+ exports.getIpAddressFromComposite = compositeIpAddress.getIpAddressFromComposite;
44
+ exports.compareIPs = ipComparison.compareIPs;
38
45
  exports.Tasks = tasks.Tasks;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const util = require("@prosopo/util");
4
+ const constructPairList = (list) => {
5
+ if (list.length % 2 !== 0) {
6
+ throw new Error("Invalid pairs length");
7
+ }
8
+ const pairList = [];
9
+ for (let i = 0; i < list.length; i += 2) {
10
+ pairList.push([util.at(list, i), util.at(list, i + 1)]);
11
+ }
12
+ return pairList;
13
+ };
14
+ const containsIdenticalPairs = (pairsLists) => {
15
+ const set = /* @__PURE__ */ new Set();
16
+ for (const pairList of pairsLists) {
17
+ for (const pair of pairList) {
18
+ const x = util.at(pair, 0);
19
+ const y = util.at(pair, 1);
20
+ const coordString = `${x},${y}`;
21
+ set.add(coordString);
22
+ }
23
+ }
24
+ return set.size !== pairsLists.flat().flat().length / 2;
25
+ };
26
+ exports.constructPairList = constructPairList;
27
+ exports.containsIdenticalPairs = containsIdenticalPairs;
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const geolib = require("geolib");
4
+ const ipInfo = require("./ipInfo.cjs");
5
+ async function compareIPs(ip1, ip2, apiKey, apiUrl) {
6
+ try {
7
+ if (!ip1 || !ip2 || typeof ip1 !== "string" || typeof ip2 !== "string") {
8
+ return {
9
+ error: "Invalid IP addresses provided",
10
+ ip1: ip1 || "undefined",
11
+ ip2: ip2 || "undefined"
12
+ };
13
+ }
14
+ if (ip1 === ip2) {
15
+ return {
16
+ ipsMatch: true,
17
+ ip1,
18
+ ip2
19
+ };
20
+ }
21
+ const [ip1Info, ip2Info] = await Promise.all([
22
+ ipInfo.getIPInfo(ip1, apiUrl, apiKey),
23
+ ipInfo.getIPInfo(ip2, apiUrl, apiKey)
24
+ ]);
25
+ if (!ip1Info.isValid && !ip2Info.isValid) {
26
+ return {
27
+ error: "Failed to lookup both IP addresses",
28
+ ip1,
29
+ ip2,
30
+ ip1Error: ip1Info.error,
31
+ ip2Error: ip2Info.error
32
+ };
33
+ }
34
+ if (!ip1Info.isValid) {
35
+ return {
36
+ error: "Failed to lookup first IP address",
37
+ ip1,
38
+ ip2,
39
+ ip1Error: ip1Info.error
40
+ };
41
+ }
42
+ if (!ip2Info.isValid) {
43
+ return {
44
+ error: "Failed to lookup second IP address",
45
+ ip1,
46
+ ip2,
47
+ ip2Error: ip2Info.error
48
+ };
49
+ }
50
+ const determineConnectionType = (ipInfo2) => {
51
+ if (ipInfo2.isMobile) return "mobile";
52
+ if (ipInfo2.isDatacenter) return "datacenter";
53
+ if (ipInfo2.isSatellite) return "satellite";
54
+ if (ipInfo2.providerType === "isp") return "residential";
55
+ switch (ipInfo2.providerType) {
56
+ case "hosting":
57
+ return "datacenter";
58
+ case "business":
59
+ case "education":
60
+ case "government":
61
+ case "banking":
62
+ return "residential";
63
+ default:
64
+ return "unknown";
65
+ }
66
+ };
67
+ const ip1ConnectionType = determineConnectionType(ip1Info);
68
+ const ip2ConnectionType = determineConnectionType(ip2Info);
69
+ const differentConnectionTypes = ip1ConnectionType !== ip2ConnectionType;
70
+ const ip1Provider = ip1Info.providerName || ip1Info.asnOrganization || "Unknown";
71
+ const ip2Provider = ip2Info.providerName || ip2Info.asnOrganization || "Unknown";
72
+ const differentProviders = ip1Provider !== ip2Provider;
73
+ let distanceKm;
74
+ if (ip1Info.latitude !== void 0 && ip1Info.longitude !== void 0 && ip2Info.latitude !== void 0 && ip2Info.longitude !== void 0) {
75
+ const distanceMeters = geolib.getDistance(
76
+ { latitude: ip1Info.latitude, longitude: ip1Info.longitude },
77
+ { latitude: ip2Info.latitude, longitude: ip2Info.longitude }
78
+ );
79
+ distanceKm = distanceMeters / 1e3;
80
+ }
81
+ const ip1IsVpnOrProxy = ip1Info.isVPN || ip1Info.isProxy || ip1Info.isTor;
82
+ const ip2IsVpnOrProxy = ip2Info.isVPN || ip2Info.isProxy || ip2Info.isTor;
83
+ const anyVpnOrProxy = ip1IsVpnOrProxy || ip2IsVpnOrProxy;
84
+ const ip1Coordinates = ip1Info.latitude !== void 0 && ip1Info.longitude !== void 0 ? { latitude: ip1Info.latitude, longitude: ip1Info.longitude } : void 0;
85
+ const ip2Coordinates = ip2Info.latitude !== void 0 && ip2Info.longitude !== void 0 ? { latitude: ip2Info.latitude, longitude: ip2Info.longitude } : void 0;
86
+ return {
87
+ ipsMatch: false,
88
+ ip1,
89
+ ip2,
90
+ comparison: {
91
+ differentProviders,
92
+ differentConnectionTypes,
93
+ distanceKm,
94
+ anyVpnOrProxy,
95
+ ip1Details: {
96
+ provider: ip1Provider,
97
+ connectionType: ip1ConnectionType,
98
+ isVpnOrProxy: ip1IsVpnOrProxy,
99
+ country: ip1Info.country,
100
+ countryCode: ip1Info.countryCode,
101
+ city: ip1Info.city,
102
+ coordinates: ip1Coordinates
103
+ },
104
+ ip2Details: {
105
+ provider: ip2Provider,
106
+ connectionType: ip2ConnectionType,
107
+ isVpnOrProxy: ip2IsVpnOrProxy,
108
+ country: ip2Info.country,
109
+ countryCode: ip2Info.countryCode,
110
+ city: ip2Info.city,
111
+ coordinates: ip2Coordinates
112
+ }
113
+ }
114
+ };
115
+ } catch (error) {
116
+ return {
117
+ error: `Comparison failed: ${error instanceof Error ? error.message : String(error)}`,
118
+ ip1,
119
+ ip2
120
+ };
121
+ }
122
+ }
123
+ exports.compareIPs = compareIPs;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ async function getIPInfo(ip, apiUrl, apiKey, includeRawResponse = false) {
4
+ try {
5
+ if (!ip || typeof ip !== "string") {
6
+ return {
7
+ isValid: false,
8
+ error: "Invalid IP address provided",
9
+ ip: ip || "undefined"
10
+ };
11
+ }
12
+ const url = apiUrl;
13
+ const body = { q: ip };
14
+ if (apiKey) {
15
+ body.key = apiKey;
16
+ }
17
+ const response = await fetch(url, {
18
+ method: "POST",
19
+ headers: {
20
+ "Content-Type": "application/json",
21
+ Accept: "application/json"
22
+ },
23
+ body: JSON.stringify(body)
24
+ });
25
+ if (!response.ok) {
26
+ return {
27
+ isValid: false,
28
+ error: `API request failed with status ${response.status}: ${response.statusText}`,
29
+ ip
30
+ };
31
+ }
32
+ const data = await response.json();
33
+ if (data.is_bogon) {
34
+ return {
35
+ isValid: false,
36
+ error: "IP address is bogon (non-routable)",
37
+ ip
38
+ };
39
+ }
40
+ const result = {
41
+ ip: data.ip,
42
+ isValid: true,
43
+ // Threat indicators
44
+ isVPN: data.is_vpn,
45
+ isTor: data.is_tor,
46
+ isProxy: data.is_proxy,
47
+ isDatacenter: data.is_datacenter,
48
+ isAbuser: data.is_abuser,
49
+ isMobile: data.is_mobile,
50
+ isSatellite: data.is_satellite,
51
+ // Provider information
52
+ providerName: data.company?.name || data.datacenter?.datacenter,
53
+ providerType: data.company?.type || data.asn?.type,
54
+ asnNumber: data.asn?.asn,
55
+ asnOrganization: data.asn?.org,
56
+ // Geolocation
57
+ country: data.location?.country,
58
+ countryCode: data.location?.country_code,
59
+ region: data.location?.state,
60
+ city: data.location?.city,
61
+ latitude: data.location?.latitude,
62
+ longitude: data.location?.longitude,
63
+ timezone: data.location?.timezone,
64
+ // VPN specific details
65
+ vpnService: data.vpn?.service,
66
+ vpnType: data.vpn?.type,
67
+ // Risk scoring
68
+ abuserScore: Number.parseFloat(
69
+ data.asn?.abuser_score.split(" ")[0] || "0"
70
+ ),
71
+ companyAbuserScore: Number.parseFloat(
72
+ data.company?.abuser_score.split(" ")[0] || "0"
73
+ )
74
+ };
75
+ if (includeRawResponse) {
76
+ result.rawResponse = data;
77
+ }
78
+ return result;
79
+ } catch (error) {
80
+ return {
81
+ isValid: false,
82
+ error: `Network or parsing error: ${error instanceof Error ? error.message : String(error)}`,
83
+ ip
84
+ };
85
+ }
86
+ }
87
+ exports.getIPInfo = getIPInfo;
@@ -3,19 +3,17 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const common = require("@prosopo/common");
4
4
  const types = require("@prosopo/types");
5
5
  const blacklistRequestInspector = require("../api/blacklistRequestInspector.cjs");
6
+ var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
6
7
  class CaptchaManager {
7
8
  constructor(db, pair, logger) {
8
9
  this.pair = pair;
9
10
  this.db = db;
10
- this.logger = logger || common.getLogger("info", module);
11
+ this.logger = logger || common.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("tasks/captchaManager.cjs", document.baseURI).href);
11
12
  }
12
- async getFrictionlessTokenIdFromSession(sessionRecord) {
13
- const tokenRecord = await this.db.getFrictionlessTokenRecordByTokenId(
14
- sessionRecord.tokenId
15
- );
16
- return tokenRecord ? tokenRecord._id : void 0;
13
+ async validateSessionIP(sessionRecord, currentIP, env) {
14
+ return { valid: true };
17
15
  }
18
- async isValidRequest(clientSettings, requestedCaptchaType, sessionId, userAccessPolicy) {
16
+ async isValidRequest(clientSettings, requestedCaptchaType, env, sessionId, userAccessPolicy, currentIP) {
19
17
  this.logger.debug(() => ({
20
18
  msg: "Validating request",
21
19
  data: {
@@ -54,11 +52,44 @@ class CaptchaManager {
54
52
  type: requestedCaptchaType
55
53
  };
56
54
  }
57
- const frictionlessTokenId = await this.getFrictionlessTokenIdFromSession(sessionRecord);
55
+ if (currentIP) {
56
+ const ipValidation = await this.validateSessionIP(
57
+ sessionRecord,
58
+ currentIP,
59
+ env
60
+ );
61
+ if (!ipValidation.valid) {
62
+ return {
63
+ valid: false,
64
+ reason: ipValidation.reason,
65
+ type: requestedCaptchaType
66
+ };
67
+ }
68
+ }
69
+ if (sessionRecord.captchaType !== requestedCaptchaType) {
70
+ this.logger.warn(() => ({
71
+ msg: "Invalid frictionless request",
72
+ data: {
73
+ account: clientSettings.account,
74
+ sessionId
75
+ }
76
+ }));
77
+ return {
78
+ valid: false,
79
+ reason: "CAPTCHA.NO_SESSION_FOUND",
80
+ type: requestedCaptchaType
81
+ };
82
+ }
58
83
  return {
59
84
  valid: true,
60
- frictionlessTokenId,
61
- type: requestedCaptchaType
85
+ sessionId: sessionRecord.sessionId,
86
+ type: requestedCaptchaType,
87
+ ...sessionRecord.powDifficulty && {
88
+ powDifficulty: sessionRecord.powDifficulty
89
+ },
90
+ ...sessionRecord.solvedImagesCount && {
91
+ solvedImagesCount: sessionRecord.solvedImagesCount
92
+ }
62
93
  };
63
94
  }
64
95
  this.logger.warn(() => ({
@@ -102,39 +102,8 @@ class ClientTaskManager {
102
102
  async (skip) => await this.providerDB.getUnstoredSessionRecords(BATCH_SIZE, skip),
103
103
  async (batch) => {
104
104
  const filteredBatch = lastTask?.updated ? batch.filter((record) => this.isRecordUpdated(record)) : batch;
105
- const frictionlessTokenRecords = await this.providerDB.getFrictionlessTokenRecordsByTokenIds(
106
- filteredBatch.map((record) => record.tokenId)
107
- );
108
- this.logger.info(() => ({
109
- msg: `Frictionless token records: ${frictionlessTokenRecords.length}`
110
- }));
111
- const filteredBatchWithScores = filteredBatch.map((record) => {
112
- const tokenRecord = frictionlessTokenRecords.find(
113
- (tokenRecord2) => tokenRecord2._id?.toString() === record.tokenId.toString()
114
- );
115
- if (!tokenRecord) {
116
- this.logger.error(() => ({
117
- msg: "No token record found",
118
- data: { tokenId: record.tokenId }
119
- }));
120
- return {
121
- ...record,
122
- score: 0,
123
- scoreComponents: {
124
- baseScore: 0
125
- },
126
- threshold: 0
127
- };
128
- }
129
- return {
130
- ...record,
131
- score: tokenRecord?.score || 0,
132
- scoreComponents: tokenRecord?.scoreComponents,
133
- threshold: tokenRecord?.threshold || 0
134
- };
135
- });
136
105
  if (filteredBatch.length > 0) {
137
- await captchaDB.saveCaptchas(filteredBatchWithScores, [], []);
106
+ await captchaDB.saveCaptchas(filteredBatch, [], []);
138
107
  await this.providerDB.markSessionRecordsStored(
139
108
  filteredBatch.map((record) => record.sessionId)
140
109
  );
@@ -194,7 +163,7 @@ class ClientTaskManager {
194
163
  this.logger
195
164
  );
196
165
  const tenMinuteWindow = 10 * 60 * 1e3;
197
- const updatedAtTimestamp = lastTask?.updated ? lastTask.updated - tenMinuteWindow || 0 : 0;
166
+ const updatedAtTimestamp = lastTask?.updated ? lastTask.updated.getTime() - tenMinuteWindow || 0 : 0;
198
167
  this.logger.info(() => ({
199
168
  msg: `Getting updated client records since ${new Date(updatedAtTimestamp).toDateString()}`
200
169
  }));
@@ -248,25 +217,44 @@ class ClientTaskManager {
248
217
  const activeDetectorKeys = await this.providerDB.getDetectorKeys();
249
218
  return activeDetectorKeys;
250
219
  }
251
- async removeDetectorKey(detectorKey) {
220
+ async removeDetectorKey(detectorKey, expirationInSeconds) {
252
221
  if (!isValidPrivateKey(detectorKey)) {
253
222
  throw new common.ProsopoApiError("INVALID_DETECTOR_KEY", {
254
223
  context: { detectorKey },
255
224
  logger: this.logger
256
225
  });
257
226
  }
258
- await this.providerDB.removeDetectorKey(detectorKey);
227
+ await this.providerDB.removeDetectorKey(detectorKey, expirationInSeconds);
259
228
  }
260
- isSubdomainOrExactMatch(referrer, clientDomain) {
229
+ /**
230
+ * Matches a request referrer against an allowed domain pattern.
231
+ * Supports global '*', subdomain '*.example.com', glob '*example*',
232
+ * plain domains (exact or subdomain), and 'localhost'.
233
+ */
234
+ domainPatternMatcher(referrer, clientDomain) {
261
235
  if (!referrer || !clientDomain) return false;
262
- if (clientDomain === "*") return true;
263
236
  try {
264
- const referrerDomain = util.parseUrl(referrer).hostname.replace(/\.$/, "");
265
- const allowedDomain = util.parseUrl(clientDomain).hostname.replace(/\.$/, "");
266
- return referrerDomain === allowedDomain || referrerDomain.endsWith(`.${allowedDomain}`);
267
- } catch {
237
+ const referrerHost = util.parseUrl(referrer).hostname.replace(/\.$/, "");
238
+ const pattern = clientDomain.trim().toLowerCase();
239
+ if (pattern === "*") return true;
240
+ if (pattern === "localhost") {
241
+ return referrerHost === "localhost" || referrerHost.startsWith("localhost:");
242
+ }
243
+ if (pattern.startsWith("*.")) {
244
+ const suffix = pattern.slice(2);
245
+ const allowed = util.parseUrl(suffix).hostname.replace(/\.$/, "");
246
+ return referrerHost.endsWith(`.${allowed}`) || referrerHost === allowed;
247
+ }
248
+ if (pattern.includes("*")) {
249
+ const escaped = pattern.replace(/[.+?^${}()|\[\]\\]/g, "\\$&").replace(/\*/g, ".*");
250
+ const regex = new RegExp(`^${escaped}$`, "i");
251
+ return regex.test(referrerHost);
252
+ }
253
+ const allowedHost = util.parseUrl(pattern).hostname.replace(/\.$/, "");
254
+ return referrerHost === allowedHost || referrerHost.endsWith(`.${allowedHost}`);
255
+ } catch (e) {
268
256
  this.logger.error(() => ({
269
- msg: "Error in isSubdomainOrExactMatch",
257
+ msg: "Error in domainPatternMatcher",
270
258
  data: { referrer, clientDomain }
271
259
  }));
272
260
  return false;
@@ -274,7 +262,7 @@ class ClientTaskManager {
274
262
  }
275
263
  isRecordUpdated(record) {
276
264
  const { lastUpdatedTimestamp, storedAtTimestamp } = record;
277
- return !lastUpdatedTimestamp || !storedAtTimestamp || lastUpdatedTimestamp > storedAtTimestamp;
265
+ return !lastUpdatedTimestamp || !storedAtTimestamp || lastUpdatedTimestamp.getTime() > storedAtTimestamp.getTime();
278
266
  }
279
267
  async processBatchesWithCursor(fetchBatch, processBatch) {
280
268
  let skip = 0;