@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,8 +6,12 @@ const datasets = require("@prosopo/datasets");
6
6
  const types = require("@prosopo/types");
7
7
  const util = require("@prosopo/util");
8
8
  const express = require("express");
9
+ const compositeIpAddress = require("../compositeIpAddress.cjs");
9
10
  const frictionlessTasks = require("../tasks/frictionless/frictionlessTasks.cjs");
11
+ const frictionlessTasksUtils = require("../tasks/frictionless/frictionlessTasksUtils.cjs");
10
12
  const tasks = require("../tasks/tasks.cjs");
13
+ const hashUserAgent = require("../utils/hashUserAgent.cjs");
14
+ const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
11
15
  const blacklistRequestInspector = require("./blacklistRequestInspector.cjs");
12
16
  const validateAddress = require("./validateAddress.cjs");
13
17
  const DEFAULT_FRICTIONLESS_THRESHOLD = 0.5;
@@ -65,11 +69,18 @@ function prosopoRouter(env) {
65
69
  dapp,
66
70
  userScope
67
71
  ))[0];
68
- const { valid, reason, frictionlessTokenId } = await tasks$1.imgCaptchaManager.isValidRequest(
72
+ const {
73
+ valid,
74
+ reason,
75
+ sessionId: validSessionId,
76
+ solvedImagesCount
77
+ } = await tasks$1.imgCaptchaManager.isValidRequest(
69
78
  clientRecord,
70
79
  types.CaptchaType.image,
80
+ env,
71
81
  sessionId,
72
- userAccessPolicy
82
+ userAccessPolicy,
83
+ req.ip
73
84
  );
74
85
  if (!valid) {
75
86
  return next(
@@ -86,7 +97,7 @@ function prosopoRouter(env) {
86
97
  }
87
98
  const captchaConfig = {
88
99
  solved: {
89
- count: userAccessPolicy?.solvedImagesCount || env.config.captchas.solved.count
100
+ count: solvedImagesCount || userAccessPolicy?.solvedImagesCount || env.config.captchas.solved.count
90
101
  },
91
102
  unsolved: {
92
103
  count: userAccessPolicy?.unsolvedImagesCount || env.config.captchas.unsolved.count
@@ -98,7 +109,7 @@ function prosopoRouter(env) {
98
109
  ipAddress,
99
110
  captchaConfig,
100
111
  clientRecord.settings.imageThreshold ?? 0.8,
101
- frictionlessTokenId
112
+ validSessionId
102
113
  );
103
114
  const captchaResponse = {
104
115
  [types.ApiParams.status]: "ok",
@@ -117,12 +128,23 @@ function prosopoRouter(env) {
117
128
  }
118
129
  }
119
130
  };
131
+ req.logger.info(() => ({
132
+ msg: "Image captcha challenge issued",
133
+ data: {
134
+ captchaType: types.CaptchaType.image,
135
+ requestHash: taskData.requestHash,
136
+ solvedImagesCount: captchaConfig.solved.count,
137
+ user,
138
+ dapp,
139
+ sessionId
140
+ }
141
+ }));
120
142
  return res.json(captchaResponse);
121
143
  } catch (err) {
122
144
  req.logger.error(() => ({
123
145
  err,
124
146
  data: req.params,
125
- msg: "Error in PoW captcha solution submission"
147
+ msg: "Error in image captcha challenge request"
126
148
  }));
127
149
  return next(
128
150
  new common.ProsopoApiError("API.BAD_REQUEST", {
@@ -143,6 +165,17 @@ function prosopoRouter(env) {
143
165
  types.ClientApiPaths.SubmitImageCaptchaSolution,
144
166
  async (req, res, next) => {
145
167
  const tasks$1 = new tasks.Tasks(env, req.logger);
168
+ if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
169
+ req.logger.info(() => ({
170
+ msg: "Maintenance mode active - returning verified for image captcha"
171
+ }));
172
+ const result = {
173
+ status: "ok",
174
+ captchas: [],
175
+ verified: true
176
+ };
177
+ return res.json(result);
178
+ }
146
179
  let parsed;
147
180
  try {
148
181
  parsed = types.CaptchaSolutionBody.parse(req.body);
@@ -177,7 +210,7 @@ function prosopoRouter(env) {
177
210
  parsed[types.ApiParams.signature].user.timestamp,
178
211
  Number.parseInt(parsed[types.ApiParams.timestamp]),
179
212
  parsed[types.ApiParams.signature].provider.requestHash,
180
- util.getIPAddress(req.ip || "").bigInt(),
213
+ util.getIPAddress(req.ip || ""),
181
214
  util.flatten(req.headers),
182
215
  req.ja4
183
216
  );
@@ -192,7 +225,7 @@ function prosopoRouter(env) {
192
225
  req.logger.error(() => ({
193
226
  err,
194
227
  body: req.body,
195
- msg: "Error in PoW captcha solution submission"
228
+ msg: "Error in image captcha solution submission"
196
229
  }));
197
230
  return next(
198
231
  new common.ProsopoApiError("API.BAD_REQUEST", {
@@ -248,11 +281,18 @@ function prosopoRouter(env) {
248
281
  dapp,
249
282
  userScope
250
283
  ))[0];
251
- const { valid, reason, frictionlessTokenId } = await tasks$1.powCaptchaManager.isValidRequest(
284
+ const {
285
+ valid,
286
+ reason,
287
+ sessionId: validSessionId,
288
+ powDifficulty
289
+ } = await tasks$1.powCaptchaManager.isValidRequest(
252
290
  clientSettings,
253
291
  types.CaptchaType.pow,
292
+ env,
254
293
  sessionId,
255
- userAccessPolicy
294
+ userAccessPolicy,
295
+ req.ip
256
296
  );
257
297
  if (!valid) {
258
298
  return next(
@@ -282,11 +322,12 @@ function prosopoRouter(env) {
282
322
  })
283
323
  );
284
324
  }
325
+ const difficulty = powDifficulty || userAccessPolicy?.powDifficulty || clientSettings?.settings?.powDifficulty;
285
326
  const challenge = await tasks$1.powCaptchaManager.getPowCaptchaChallenge(
286
327
  user,
287
328
  dapp,
288
329
  origin,
289
- userAccessPolicy?.powDifficulty || clientSettings?.settings?.powDifficulty
330
+ difficulty
290
331
  );
291
332
  await tasks$1.db.storePowCaptchaRecord(
292
333
  challenge.challenge,
@@ -297,10 +338,10 @@ function prosopoRouter(env) {
297
338
  },
298
339
  challenge.difficulty,
299
340
  challenge.providerSignature,
300
- util.getIPAddress(req.ip || "").bigInt(),
341
+ compositeIpAddress.getCompositeIpAddress(req.ip || ""),
301
342
  util.flatten(req.headers),
302
343
  req.ja4,
303
- frictionlessTokenId
344
+ validSessionId
304
345
  );
305
346
  const getPowCaptchaResponse = {
306
347
  [types.ApiParams.status]: "ok",
@@ -313,12 +354,23 @@ function prosopoRouter(env) {
313
354
  }
314
355
  }
315
356
  };
357
+ req.logger.info(() => ({
358
+ msg: "PoW captcha challenge issued",
359
+ data: {
360
+ captchaType: types.CaptchaType.pow,
361
+ challenge: challenge.challenge,
362
+ difficulty: challenge.difficulty,
363
+ user,
364
+ dapp,
365
+ session: sessionId
366
+ }
367
+ }));
316
368
  return res.json(getPowCaptchaResponse);
317
369
  } catch (err) {
318
370
  req.logger.error(() => ({
319
371
  err,
320
372
  body: req.body,
321
- msg: "Error in PoW captcha solution submission"
373
+ msg: "Error in PoW captcha challenge request"
322
374
  }));
323
375
  return next(
324
376
  new common.ProsopoApiError("API.BAD_REQUEST", {
@@ -339,6 +391,16 @@ function prosopoRouter(env) {
339
391
  async (req, res, next) => {
340
392
  let parsed;
341
393
  const tasks$1 = new tasks.Tasks(env, req.logger);
394
+ if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
395
+ req.logger.info(() => ({
396
+ msg: "Maintenance mode active - returning verified"
397
+ }));
398
+ const response = {
399
+ status: "ok",
400
+ verified: true
401
+ };
402
+ return res.json(response);
403
+ }
342
404
  try {
343
405
  parsed = types.SubmitPowCaptchaSolutionBody.parse(req.body);
344
406
  } catch (err) {
@@ -350,15 +412,7 @@ function prosopoRouter(env) {
350
412
  })
351
413
  );
352
414
  }
353
- const {
354
- challenge,
355
- difficulty,
356
- signature,
357
- nonce,
358
- verifiedTimeout,
359
- dapp,
360
- user
361
- } = parsed;
415
+ const { challenge, signature, nonce, verifiedTimeout, dapp, user } = parsed;
362
416
  validateAddress.validateSiteKey(dapp);
363
417
  validateAddress.validateAddr(user);
364
418
  try {
@@ -374,7 +428,6 @@ function prosopoRouter(env) {
374
428
  }
375
429
  const verified = await tasks$1.powCaptchaManager.verifyPowCaptchaSolution(
376
430
  challenge,
377
- difficulty,
378
431
  signature.provider.challenge,
379
432
  nonce,
380
433
  verifiedTimeout,
@@ -409,24 +462,72 @@ function prosopoRouter(env) {
409
462
  async (req, res, next) => {
410
463
  try {
411
464
  const tasks$1 = new tasks.Tasks(env, req.logger);
412
- const { token, dapp, user } = types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
413
- const existingToken = await tasks$1.db.getFrictionlessTokenRecordByToken(token);
465
+ const { token, headHash, dapp, user } = types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
466
+ if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
467
+ req.logger.info(() => ({
468
+ msg: "Maintenance mode active - storing dummy token and sending PoW captcha",
469
+ data: { dapp, user }
470
+ }));
471
+ return res.json(
472
+ await tasks$1.frictionlessManager.sendPowCaptcha({
473
+ token,
474
+ score: 0,
475
+ threshold: 0.5,
476
+ scoreComponents: {
477
+ baseScore: 0
478
+ },
479
+ providerSelectEntropy: 0,
480
+ ipAddress: compositeIpAddress.getCompositeIpAddress(req.ip || ""),
481
+ powDifficulty: void 0,
482
+ webView: false,
483
+ iFrame: false,
484
+ decryptedHeadHash: ""
485
+ })
486
+ );
487
+ }
488
+ const existingToken = await tasks$1.db.getSessionRecordByToken(token);
414
489
  if (existingToken) {
415
490
  req.logger.info(() => ({
416
491
  token: existingToken,
417
492
  msg: "Token has already been used"
418
493
  }));
419
- return res.json(
420
- await tasks$1.frictionlessManager.sendImageCaptcha(
421
- existingToken._id
422
- )
494
+ return next(
495
+ new common.ProsopoApiError("API.BAD_REQUEST", {
496
+ context: {
497
+ code: 400,
498
+ siteKey: dapp,
499
+ user
500
+ },
501
+ i18n: req.i18n,
502
+ logger: req.logger
503
+ })
423
504
  );
424
505
  }
425
506
  const lScore = tasks$1.frictionlessManager.checkLangRules(
426
507
  req.headers["accept-language"] || ""
427
508
  );
428
- const { baseBotScore, timestamp } = await tasks$1.frictionlessManager.decryptPayload(token);
429
- const botScore = baseBotScore + lScore;
509
+ const {
510
+ baseBotScore,
511
+ timestamp,
512
+ providerSelectEntropy,
513
+ userId,
514
+ userAgent,
515
+ webView,
516
+ iFrame,
517
+ decryptedHeadHash
518
+ } = await tasks$1.frictionlessManager.decryptPayload(token, headHash);
519
+ req.logger.debug(() => ({
520
+ msg: "Decrypted payload",
521
+ data: {
522
+ baseBotScore,
523
+ timestamp,
524
+ providerSelectEntropy,
525
+ userId,
526
+ userAgent,
527
+ webView
528
+ }
529
+ }));
530
+ let botScore = baseBotScore + lScore;
430
531
  const clientRecord = await tasks$1.db.getClientRecord(dapp);
431
532
  if (!clientRecord) {
432
533
  return next(
@@ -439,7 +540,8 @@ function prosopoRouter(env) {
439
540
  }
440
541
  const { valid, reason } = await tasks$1.frictionlessManager.isValidRequest(
441
542
  clientRecord,
442
- types.CaptchaType.frictionless
543
+ types.CaptchaType.frictionless,
544
+ env
443
545
  );
444
546
  if (!valid) {
445
547
  return next(
@@ -455,14 +557,21 @@ function prosopoRouter(env) {
455
557
  );
456
558
  }
457
559
  const botThreshold = clientRecord.settings?.frictionlessThreshold || DEFAULT_FRICTIONLESS_THRESHOLD;
458
- const tokenId = await tasks$1.db.storeFrictionlessTokenRecord({
560
+ let scoreComponents = {
561
+ baseScore: baseBotScore,
562
+ ...lScore && { lScore }
563
+ };
564
+ const ipAddress = compositeIpAddress.getCompositeIpAddress(req.ip || "");
565
+ tasks$1.frictionlessManager.setSessionParams({
459
566
  token,
460
567
  score: botScore,
461
568
  threshold: botThreshold,
462
- scoreComponents: {
463
- baseScore: baseBotScore,
464
- ...lScore && { lScore }
465
- }
569
+ scoreComponents,
570
+ providerSelectEntropy,
571
+ ipAddress,
572
+ webView,
573
+ iFrame,
574
+ decryptedHeadHash
466
575
  });
467
576
  const userScope = blacklistRequestInspector.getRequestUserScope(
468
577
  util.flatten(req.headers),
@@ -475,50 +584,119 @@ function prosopoRouter(env) {
475
584
  dapp,
476
585
  userScope
477
586
  ))[0];
587
+ const headersUserAgent = req.headers["user-agent"];
588
+ const hashedHeadersUserAgent = headersUserAgent ? hashUserAgent.hashUserAgent(headersUserAgent) : "";
589
+ const headersProsopoUser = req.headers["prosopo-user"];
590
+ if (hashedHeadersUserAgent !== userAgent || headersProsopoUser !== userId) {
591
+ req.logger.info(() => ({
592
+ msg: "User agent or user id does not match",
593
+ data: {
594
+ headersUserAgent,
595
+ hashedHeadersUserAgent,
596
+ userAgent,
597
+ // This is the hashed user agent from the token
598
+ headersProsopoUser,
599
+ userId
600
+ }
601
+ }));
602
+ return res.json(
603
+ await tasks$1.frictionlessManager.sendImageCaptcha({
604
+ solvedImagesCount: frictionlessTasksUtils.timestampDecayFunction(timestamp)
605
+ })
606
+ );
607
+ }
478
608
  if (userAccessPolicy) {
479
- await tasks$1.frictionlessManager.scoreIncreaseAccessPolicy(
609
+ const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseAccessPolicy(
480
610
  userAccessPolicy,
481
611
  baseBotScore,
482
612
  botScore,
483
- tokenId
613
+ scoreComponents
484
614
  );
615
+ botScore = scoreUpdate.score;
616
+ scoreComponents = scoreUpdate.scoreComponents;
617
+ tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
485
618
  if (userAccessPolicy.captchaType === types.CaptchaType.image) {
486
619
  return res.json(
487
- await tasks$1.frictionlessManager.sendImageCaptcha(tokenId)
620
+ await tasks$1.frictionlessManager.sendImageCaptcha({
621
+ solvedImagesCount: userAccessPolicy.solvedImagesCount
622
+ })
488
623
  );
489
624
  }
490
625
  if (userAccessPolicy.captchaType === types.CaptchaType.pow) {
491
626
  return res.json(
492
- await tasks$1.frictionlessManager.sendPowCaptcha(tokenId)
627
+ await tasks$1.frictionlessManager.sendPowCaptcha({
628
+ powDifficulty: void 0
629
+ })
493
630
  );
494
631
  }
495
632
  }
633
+ if (clientRecord.settings.disallowWebView && webView) {
634
+ tasks$1.logger.info(() => ({
635
+ msg: "WebView detected"
636
+ }));
637
+ const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseWebView(
638
+ baseBotScore,
639
+ botScore,
640
+ scoreComponents
641
+ );
642
+ botScore = scoreUpdate.score;
643
+ scoreComponents = scoreUpdate.scoreComponents;
644
+ tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
645
+ return res.json(
646
+ await tasks$1.frictionlessManager.sendImageCaptcha({
647
+ solvedImagesCount: env.config.captchas.solved.count * 2
648
+ })
649
+ );
650
+ }
496
651
  if (frictionlessTasks.FrictionlessManager.timestampTooOld(timestamp)) {
497
- await tasks$1.frictionlessManager.scoreIncreaseTimestamp(
652
+ const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseTimestamp(
498
653
  timestamp,
499
654
  baseBotScore,
500
655
  botScore,
501
- tokenId
656
+ scoreComponents
502
657
  );
658
+ botScore = scoreUpdate.score;
659
+ scoreComponents = scoreUpdate.scoreComponents;
660
+ tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
503
661
  return res.json(
504
- await tasks$1.frictionlessManager.sendImageCaptcha(tokenId)
662
+ await tasks$1.frictionlessManager.sendImageCaptcha({
663
+ solvedImagesCount: frictionlessTasksUtils.timestampDecayFunction(timestamp)
664
+ })
665
+ );
666
+ }
667
+ const hostVerified = await tasks$1.frictionlessManager.hostVerified(
668
+ providerSelectEntropy
669
+ );
670
+ if (!hostVerified.verified) {
671
+ const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseUnverifiedHost(
672
+ hostVerified.domain,
673
+ baseBotScore,
674
+ botScore,
675
+ scoreComponents
505
676
  );
677
+ botScore = scoreUpdate.score;
678
+ scoreComponents = scoreUpdate.scoreComponents;
679
+ tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
506
680
  }
507
681
  if (Number(botScore) > botThreshold) {
508
682
  req.logger.info(() => ({
509
- message: "Bot score is greater than threshold",
683
+ msg: "Bot score is greater than threshold",
510
684
  data: {
511
685
  botScore,
512
686
  botThreshold,
513
- tokenId
687
+ token
514
688
  }
515
689
  }));
516
690
  return res.json(
517
- await tasks$1.frictionlessManager.sendImageCaptcha(tokenId)
691
+ await tasks$1.frictionlessManager.sendImageCaptcha({
692
+ solvedImagesCount: env.config.captchas.solved.count
693
+ })
518
694
  );
519
695
  }
520
696
  return res.json(
521
- await tasks$1.frictionlessManager.sendPowCaptcha(tokenId)
697
+ await tasks$1.frictionlessManager.sendPowCaptcha({
698
+ powDifficulty: void 0
699
+ })
522
700
  );
523
701
  } catch (err) {
524
702
  req.logger.error(() => ({
@@ -10,26 +10,26 @@ const domainMiddleware = (env) => {
10
10
  const tasks$1 = new tasks.Tasks(env);
11
11
  return async (req, res, next) => {
12
12
  try {
13
- const dapp = req.headers["prosopo-site-key"];
14
- if (!dapp)
13
+ const siteKey = req.headers["prosopo-site-key"];
14
+ if (!siteKey)
15
15
  throw siteKeyNotRegisteredError(
16
16
  req.i18n,
17
17
  "No sitekey provided",
18
18
  req.logger
19
19
  );
20
20
  try {
21
- utilCrypto.validateAddress(dapp, false, 42);
21
+ utilCrypto.validateAddress(siteKey, false, 42);
22
22
  } catch (err) {
23
- throw invalidSiteKeyError(req.i18n, dapp, req.logger);
23
+ throw invalidSiteKeyError(req.i18n, siteKey, req.logger);
24
24
  }
25
- const clientSettings = await tasks$1.db.getClientRecord(dapp);
25
+ const clientSettings = await tasks$1.db.getClientRecord(siteKey);
26
26
  if (!clientSettings)
27
- throw siteKeyNotRegisteredError(req.i18n, dapp, req.logger);
27
+ throw siteKeyNotRegisteredError(req.i18n, siteKey, req.logger);
28
28
  const allowedDomains = clientSettings.settings?.domains;
29
29
  if (!allowedDomains)
30
30
  throw siteKeyInvalidDomainError(
31
31
  req.i18n,
32
- dapp,
32
+ siteKey,
33
33
  req.hostname,
34
34
  req.logger
35
35
  );
@@ -37,7 +37,7 @@ const domainMiddleware = (env) => {
37
37
  if (!origin)
38
38
  throw unauthorizedOriginError(req.i18n, void 0, req.logger);
39
39
  for (const domain of allowedDomains) {
40
- if (tasks$1.clientTaskManager.isSubdomainOrExactMatch(origin, domain)) {
40
+ if (tasks$1.clientTaskManager.domainPatternMatcher(origin, domain)) {
41
41
  next();
42
42
  return;
43
43
  }
@@ -19,6 +19,10 @@ const headerCheckMiddleware = (env) => {
19
19
  validateAddress.validateAddr(user, void 0, req.logger);
20
20
  req.user = user;
21
21
  req.siteKey = siteKey;
22
+ req.logger = req.logger.with({
23
+ user,
24
+ siteKey
25
+ });
22
26
  next();
23
27
  } catch (err) {
24
28
  return apiExpressRouter.handleErrors(err, req, res, next);
@@ -3,6 +3,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const types = require("@prosopo/types");
4
4
  function ignoreMiddleware() {
5
5
  return (req, res, next) => {
6
+ if (req.originalUrl.indexOf(types.PublicApiPaths.Healthz) !== -1) {
7
+ return next();
8
+ }
6
9
  if (req.originalUrl.indexOf(types.ApiPrefix) === -1) {
7
10
  res.statusCode = 404;
8
11
  res.send("Not Found");
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const node_crypto = require("node:crypto");
4
3
  const node_stream = require("node:stream");
5
4
  const apiExpressRouter = require("@prosopo/api-express-router");
6
5
  const common = require("@prosopo/common");
7
6
  const utilCrypto = require("@prosopo/util-crypto");
8
7
  const readTlsClientHello = require("read-tls-client-hello");
8
+ var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
9
9
  const DEFAULT_JA4 = "ja4";
10
10
  const getJA4 = async (headers, logger) => {
11
- logger = logger || common.getLogger("info", module);
11
+ logger = logger || common.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/ja4Middleware.cjs", document.baseURI).href);
12
12
  if (process.env.NODE_ENV === "development") {
13
13
  return {
14
14
  ja4PlusFingerprint: `${DEFAULT_JA4}${utilCrypto.randomAsHex().slice(28, 32)}`
@@ -17,7 +17,6 @@ const getJA4 = async (headers, logger) => {
17
17
  try {
18
18
  const xTlsClientHello = (headers["x-tls-clienthello"] || "").toString();
19
19
  const xTlsVersion = (headers["x-tls-version"] || "").toString().toLowerCase();
20
- const xTlsServerName = (headers["x-tls-server-name"] || "").toString();
21
20
  const clientHelloBuffer = Buffer.from(xTlsClientHello, "base64");
22
21
  logger.debug(() => ({
23
22
  msg: "ClientHello First Bytes:",
@@ -33,32 +32,13 @@ const getJA4 = async (headers, logger) => {
33
32
  msg: "Headers TLS Version:",
34
33
  data: { xTlsVersion }
35
34
  }));
36
- const tlsVersion = xTlsVersion.replace(/(tls)|\./g, "");
37
35
  const readableStream = new node_stream.Readable({
38
36
  read() {
39
37
  this.push(clientHelloBuffer);
40
38
  }
41
39
  });
42
40
  const clientHello = await readTlsClientHello.readTlsClientHello(readableStream);
43
- const { alpnProtocols } = clientHello;
44
- const [_tlsVersion, cipherSuites, extensions] = clientHello.fingerprintData;
45
- const transport = "t";
46
- const sniIndicator = xTlsServerName ? "d" : "i";
47
- const validCipherSuites = cipherSuites.filter(
48
- (cs) => (cs & 3855) !== 2570
49
- );
50
- const cipherCount = validCipherSuites.length;
51
- const validExtensions = extensions.filter(
52
- (ext) => (ext & 3855) !== 2570
53
- );
54
- const extensionCount = validExtensions.length;
55
- const alpn = alpnProtocols?.length ? alpnProtocols[0] : "";
56
- const alpnLabel = alpn ? `${alpn[0]}${alpn[alpn.length - 1]}` : "00";
57
- const sortedCiphers = validCipherSuites.map((cs) => cs.toString(16).padStart(4, "0")).sort().join(",");
58
- const cipherHash = node_crypto.createHash("sha256").update(sortedCiphers).digest("hex").slice(0, 12);
59
- const decimalString = extensions.sort((a, b) => a - b).map((ext) => ext.toString(10)).join("-");
60
- const extensionHash = node_crypto.createHash("sha256").update(decimalString).digest("hex").slice(0, 12);
61
- const ja4PlusFingerprint = `${transport}${tlsVersion}${sniIndicator}${cipherCount}${extensionCount}${alpnLabel}_${cipherHash}_${extensionHash}`;
41
+ const ja4PlusFingerprint = readTlsClientHello.calculateJa4FromHelloData(clientHello);
62
42
  return { ja4PlusFingerprint };
63
43
  } catch (e) {
64
44
  logger.error(() => ({
@@ -74,6 +54,9 @@ const ja4Middleware = (env) => {
74
54
  req.logger.debug(() => ({ data: { url: req.url } }));
75
55
  const ja4 = await getJA4(req.headers, req.logger);
76
56
  req.ja4 = ja4.ja4PlusFingerprint || "";
57
+ req.logger = req.logger.with({
58
+ ja4: req.ja4
59
+ });
77
60
  next();
78
61
  } catch (err) {
79
62
  return apiExpressRouter.handleErrors(err, req, res, next);
@@ -5,16 +5,39 @@ const common = require("@prosopo/common");
5
5
  const types = require("@prosopo/types");
6
6
  const util = require("@prosopo/util");
7
7
  const express = require("express");
8
- function publicRouter() {
8
+ function publicRouter(env) {
9
9
  const router = express.Router();
10
10
  router.get(types.PublicApiPaths.Healthz, (req, res) => {
11
11
  res.status(200).send("OK");
12
12
  });
13
13
  router.get(types.PublicApiPaths.GetProviderDetails, async (req, res, next) => {
14
14
  try {
15
- return res.json({ version: util.version, ...{ message: "Provider online" } });
15
+ const db = env.getDb();
16
+ const redisConnection = db.getRedisConnection();
17
+ const redisAccessRulesConnection = db.getRedisAccessRulesConnection();
18
+ const response = {
19
+ version: util.version,
20
+ message: "Provider online",
21
+ redis: [
22
+ {
23
+ actor: "General",
24
+ isReady: redisConnection.isReady(),
25
+ awaitingTimeSeconds: Math.ceil(
26
+ redisConnection.getAwaitingTimeMs() / 1e3
27
+ )
28
+ },
29
+ {
30
+ actor: "UAP",
31
+ isReady: redisAccessRulesConnection.isReady(),
32
+ awaitingTimeSeconds: Math.ceil(
33
+ redisAccessRulesConnection.getAwaitingTimeMs() / 1e3
34
+ )
35
+ }
36
+ ]
37
+ };
38
+ return res.json(response);
16
39
  } catch (err) {
17
- req.logger.error(() => ({
40
+ env.logger.error(() => ({
18
41
  err,
19
42
  data: { reqParams: req.params },
20
43
  msg: "Error getting provider details"