@prosopo/provider 4.12.0 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +41 -38
  2. package/.turbo/turbo-build$colon$tsc.log +24 -24
  3. package/.turbo/turbo-build.log +42 -39
  4. package/CHANGELOG.md +84 -0
  5. package/dist/api/admin/apiClearAllCountersEndpoint.d.ts.map +1 -1
  6. package/dist/api/admin/apiClearAllCountersEndpoint.js +1 -1
  7. package/dist/api/admin/apiClearAllCountersEndpoint.js.map +1 -1
  8. package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
  9. package/dist/api/admin/apiDnsEventEndpoint.js +1 -1
  10. package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
  11. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.d.ts.map +1 -1
  12. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js +1 -1
  13. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js.map +1 -1
  14. package/dist/api/admin/apiGetDecisionMachineEndpoint.d.ts.map +1 -1
  15. package/dist/api/admin/apiGetDecisionMachineEndpoint.js +1 -1
  16. package/dist/api/admin/apiGetDecisionMachineEndpoint.js.map +1 -1
  17. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -1
  18. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +1 -1
  19. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -1
  20. package/dist/api/admin/apiRegisterSiteKeysEndpoint.d.ts.map +1 -1
  21. package/dist/api/admin/apiRegisterSiteKeysEndpoint.js +1 -1
  22. package/dist/api/admin/apiRegisterSiteKeysEndpoint.js.map +1 -1
  23. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.d.ts.map +1 -1
  24. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js +1 -1
  25. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js.map +1 -1
  26. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.d.ts.map +1 -1
  27. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js +1 -1
  28. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js.map +1 -1
  29. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
  30. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +1 -2
  31. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -1
  32. package/dist/api/admin/apiRemoveSiteKeyEndpoint.d.ts.map +1 -1
  33. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js +1 -1
  34. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js.map +1 -1
  35. package/dist/api/admin/apiRemoveSiteKeysEndpoint.d.ts.map +1 -1
  36. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js +1 -1
  37. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js.map +1 -1
  38. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
  39. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +3 -1
  40. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
  41. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.d.ts.map +1 -1
  42. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js +1 -1
  43. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js.map +1 -1
  44. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +1 -2
  45. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -1
  46. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  47. package/dist/api/blacklistRequestInspector.js +7 -3
  48. package/dist/api/blacklistRequestInspector.js.map +1 -1
  49. package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -1
  50. package/dist/api/captcha/checkSpamEmail.js +19 -4
  51. package/dist/api/captcha/checkSpamEmail.js.map +1 -1
  52. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts +0 -1
  53. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts.map +1 -1
  54. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +1 -7
  55. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js.map +1 -1
  56. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -1
  57. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +8 -7
  58. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
  59. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts +1 -1
  60. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  61. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +68 -28
  62. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  63. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts +0 -1
  64. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
  65. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +0 -1
  66. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
  67. package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
  68. package/dist/api/captcha/getImageCaptchaChallenge.js +3 -0
  69. package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
  70. package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
  71. package/dist/api/captcha/getPoWCaptchaChallenge.js +3 -0
  72. package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
  73. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  74. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +3 -0
  75. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  76. package/dist/api/captcha.d.ts +2 -1
  77. package/dist/api/captcha.d.ts.map +1 -1
  78. package/dist/api/captcha.js +12 -15
  79. package/dist/api/captcha.js.map +1 -1
  80. package/dist/api/domainMiddleware.d.ts.map +1 -1
  81. package/dist/api/domainMiddleware.js +4 -0
  82. package/dist/api/domainMiddleware.js.map +1 -1
  83. package/dist/api/forwardVerify.d.ts +14 -0
  84. package/dist/api/forwardVerify.d.ts.map +1 -0
  85. package/dist/api/forwardVerify.js +54 -0
  86. package/dist/api/forwardVerify.js.map +1 -0
  87. package/dist/api/headerCheckMiddleware.d.ts.map +1 -1
  88. package/dist/api/headerCheckMiddleware.js +7 -4
  89. package/dist/api/headerCheckMiddleware.js.map +1 -1
  90. package/dist/api/ja4.d.ts +5 -0
  91. package/dist/api/ja4.d.ts.map +1 -0
  92. package/dist/api/ja4.js +203 -0
  93. package/dist/api/ja4.js.map +1 -0
  94. package/dist/api/ja4Middleware.d.ts.map +1 -1
  95. package/dist/api/ja4Middleware.js +9 -18
  96. package/dist/api/ja4Middleware.js.map +1 -1
  97. package/dist/api/metrics.d.ts +40 -0
  98. package/dist/api/metrics.d.ts.map +1 -0
  99. package/dist/api/metrics.js +260 -0
  100. package/dist/api/metrics.js.map +1 -0
  101. package/dist/api/public.d.ts.map +1 -1
  102. package/dist/api/public.js +4 -0
  103. package/dist/api/public.js.map +1 -1
  104. package/dist/api/startProviderApi.d.ts.map +1 -1
  105. package/dist/api/startProviderApi.js +3 -1
  106. package/dist/api/startProviderApi.js.map +1 -1
  107. package/dist/api/verify.d.ts.map +1 -1
  108. package/dist/api/verify.js +85 -8
  109. package/dist/api/verify.js.map +1 -1
  110. package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +1 -1
  111. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +1 -2
  112. package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +1 -1
  113. package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +1 -1
  114. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +1 -2
  115. package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +1 -2
  116. package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +1 -1
  117. package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +1 -1
  118. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +1 -3
  119. package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +1 -2
  120. package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +1 -2
  121. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +3 -2
  122. package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +1 -1
  123. package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +1 -2
  124. package/dist/cjs/api/blacklistRequestInspector.cjs +7 -3
  125. package/dist/cjs/api/captcha/checkSpamEmail.cjs +18 -3
  126. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +1 -7
  127. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +8 -7
  128. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +70 -30
  129. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +0 -1
  130. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +3 -0
  131. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +3 -0
  132. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +3 -0
  133. package/dist/cjs/api/captcha.cjs +12 -15
  134. package/dist/cjs/api/domainMiddleware.cjs +4 -0
  135. package/dist/cjs/api/forwardVerify.cjs +54 -0
  136. package/dist/cjs/api/headerCheckMiddleware.cjs +7 -4
  137. package/dist/cjs/api/ja4.cjs +203 -0
  138. package/dist/cjs/api/ja4Middleware.cjs +11 -21
  139. package/dist/cjs/api/metrics.cjs +260 -0
  140. package/dist/cjs/api/public.cjs +4 -0
  141. package/dist/cjs/api/startProviderApi.cjs +3 -1
  142. package/dist/cjs/api/verify.cjs +83 -6
  143. package/dist/cjs/index.cjs +1 -0
  144. package/dist/cjs/tasks/captchaManager.cjs +1 -2
  145. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +20 -22
  146. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +17 -23
  147. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +15 -21
  148. package/dist/index.js +2 -1
  149. package/dist/tasks/captchaManager.js +1 -1
  150. package/dist/tasks/captchaManager.js.map +1 -1
  151. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  152. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +20 -22
  153. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  154. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  155. package/dist/tasks/powCaptcha/powTasks.js +17 -23
  156. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  157. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  158. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +15 -21
  159. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  160. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js +1 -0
  161. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js.map +1 -1
  162. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +5 -1
  163. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -1
  164. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +1 -0
  165. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
  166. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js +1 -0
  167. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js.map +1 -1
  168. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js +1 -0
  169. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js.map +1 -1
  170. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +1 -0
  171. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
  172. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js +1 -0
  173. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js.map +1 -1
  174. package/dist/tests/unit/api/adminRoutes.unit.test.js +1 -0
  175. package/dist/tests/unit/api/adminRoutes.unit.test.js.map +1 -1
  176. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +43 -0
  177. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  178. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts +2 -0
  179. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts.map +1 -0
  180. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js +62 -0
  181. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js.map +1 -0
  182. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js +0 -1
  183. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js.map +1 -1
  184. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js +0 -1
  185. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js.map +1 -1
  186. package/dist/tests/unit/api/captcha.unit.test.js +31 -1
  187. package/dist/tests/unit/api/captcha.unit.test.js.map +1 -1
  188. package/dist/tests/unit/api/forwardVerify.unit.test.d.ts +2 -0
  189. package/dist/tests/unit/api/forwardVerify.unit.test.d.ts.map +1 -0
  190. package/dist/tests/unit/api/forwardVerify.unit.test.js +151 -0
  191. package/dist/tests/unit/api/forwardVerify.unit.test.js.map +1 -0
  192. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +68 -0
  193. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  194. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +2 -2
  195. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -1
  196. package/dist/tests/unit/api/ja4.unit.test.d.ts +2 -0
  197. package/dist/tests/unit/api/ja4.unit.test.d.ts.map +1 -0
  198. package/dist/tests/unit/api/ja4.unit.test.js +233 -0
  199. package/dist/tests/unit/api/ja4.unit.test.js.map +1 -0
  200. package/dist/tests/unit/api/ja4Middleware.unit.test.js +11 -8
  201. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -1
  202. package/dist/tests/unit/api/public.unit.test.js +72 -0
  203. package/dist/tests/unit/api/public.unit.test.js.map +1 -1
  204. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +1 -1
  205. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  206. package/dist/tests/unit/schedulers/getClientList.unit.test.js +1 -1
  207. package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -1
  208. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +1 -1
  209. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -1
  210. package/dist/tests/unit/tasks/captchaManager.unit.test.js +1 -1
  211. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  212. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +1 -1
  213. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  214. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +1 -1
  215. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
  216. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +4 -1
  217. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  218. package/package.json +23 -23
@@ -5,12 +5,16 @@ 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
+ const metrics = require("./metrics.cjs");
8
9
  function publicRouter(env) {
9
10
  const router = express.Router();
10
11
  router.get(types.PublicApiPaths.Healthz, (req, res) => {
11
12
  const host = env.config.host && env.config.host.length > 0 ? env.config.host : req.hostname;
12
13
  return res.status(200).json({ ok: true, host });
13
14
  });
15
+ if (metrics.metricsEnabled()) {
16
+ router.get(types.PublicApiPaths.Metrics, metrics.metricsHandler(env));
17
+ }
14
18
  router.get(types.PublicApiPaths.GetProviderDetails, async (req, res, next) => {
15
19
  try {
16
20
  const db = env.getDb();
@@ -20,6 +20,7 @@ const headerCheckMiddleware = require("./headerCheckMiddleware.cjs");
20
20
  const ignoreMiddleware = require("./ignoreMiddleware.cjs");
21
21
  const ipInfoMiddleware = require("./ipInfoMiddleware.cjs");
22
22
  const ja4Middleware = require("./ja4Middleware.cjs");
23
+ const metrics = require("./metrics.cjs");
23
24
  const _public = require("./public.cjs");
24
25
  const robotsMiddleware = require("./robotsMiddleware.cjs");
25
26
  const verify = require("./verify.cjs");
@@ -102,8 +103,9 @@ async function startProviderApi(env, admin = false, port) {
102
103
  maxAge: 86400
103
104
  })
104
105
  );
105
- apiApp.use(express.json({ limit: "50mb" }));
106
+ apiApp.use(express.json({ limit: "1mb" }));
106
107
  apiApp.use(_public.publicRouter(env));
108
+ apiApp.use(metrics.metricsMiddleware());
107
109
  const isTestOrDevelopmentEnv = process.env.NODE_ENV === "test" || env.config.defaultEnvironment === "development";
108
110
  if (!isTestOrDevelopmentEnv) {
109
111
  const configRateLimits = env.config.rateLimits;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const api = require("@prosopo/api");
3
4
  const apiExpressRouter = require("@prosopo/api-express-router");
4
5
  const common = require("@prosopo/common");
5
6
  const types = require("@prosopo/types");
@@ -7,7 +8,26 @@ const utilCrypto = require("@prosopo/util-crypto");
7
8
  const express = require("express");
8
9
  const tasks = require("../tasks/tasks.cjs");
9
10
  const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
11
+ const forwardVerify = require("./forwardVerify.cjs");
12
+ const metrics = require("./metrics.cjs");
10
13
  const testSiteKey = require("./testSiteKey.cjs");
14
+ const deriveVerifySource = (body) => {
15
+ if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) return "maintenance";
16
+ try {
17
+ const token = body?.token;
18
+ if (token) {
19
+ const { dapp } = types.decodeProcaptchaOutput(token);
20
+ if (testSiteKey.isReservedTestSiteKey(dapp)) return "test_key";
21
+ }
22
+ } catch {
23
+ }
24
+ return "real";
25
+ };
26
+ const VERIFY_PATH_TYPE = {
27
+ [types.ClientApiPaths.VerifyImageCaptchaSolutionDapp]: types.CaptchaType.image,
28
+ [types.ClientApiPaths.VerifyPowCaptchaSolution]: types.CaptchaType.pow,
29
+ [types.ClientApiPaths.VerifyPuzzleCaptchaSolution]: types.CaptchaType.puzzle
30
+ };
11
31
  function prosopoVerifyRouter(env) {
12
32
  const router = express.Router();
13
33
  let userAccessRulesStorage;
@@ -20,6 +40,24 @@ function prosopoVerifyRouter(env) {
20
40
  }));
21
41
  userAccessRulesStorage = void 0;
22
42
  }
43
+ router.use((req, res, next) => {
44
+ if (!metrics.metricsEnabled()) return next();
45
+ const type = VERIFY_PATH_TYPE[req.path];
46
+ if (!type) return next();
47
+ const originalJson = res.json.bind(res);
48
+ res.json = (body) => {
49
+ if (res.statusCode < 300) {
50
+ const verified = !!(body && typeof body === "object" && body.verified);
51
+ metrics.recordCaptchaVerify({
52
+ type,
53
+ verified,
54
+ source: deriveVerifySource(req.body)
55
+ });
56
+ }
57
+ return originalJson(body);
58
+ };
59
+ next();
60
+ });
23
61
  router.post(
24
62
  types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
25
63
  async (req, res, next) => {
@@ -33,7 +71,6 @@ function prosopoVerifyRouter(env) {
33
71
  };
34
72
  return res.json(verificationResponse);
35
73
  }
36
- const tasks$1 = new tasks.Tasks(env, req.logger);
37
74
  let parsed;
38
75
  try {
39
76
  parsed = types.VerifySolutionBody.parse(req.body);
@@ -48,7 +85,7 @@ function prosopoVerifyRouter(env) {
48
85
  }
49
86
  const { dappSignature, token, ip, maxVerifiedTime, email } = parsed;
50
87
  try {
51
- const { user, dapp, timestamp, commitmentId } = types.decodeProcaptchaOutput(token);
88
+ const { user, dapp, timestamp, commitmentId, providerUrl } = types.decodeProcaptchaOutput(token);
52
89
  const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
53
90
  if (testVerdict !== null) {
54
91
  const verificationResponse2 = {
@@ -57,6 +94,20 @@ function prosopoVerifyRouter(env) {
57
94
  };
58
95
  return res.json(verificationResponse2);
59
96
  }
97
+ const forwarded = await forwardVerify.forwardVerifyIfNotIssuer({
98
+ env,
99
+ logger: req.logger,
100
+ path: types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
101
+ providerUrl,
102
+ dapp,
103
+ user,
104
+ body: parsed,
105
+ alreadyForwarded: req.headers[api.VERIFY_FORWARDED_HEADER] !== void 0
106
+ });
107
+ if (forwarded) {
108
+ return res.json(forwarded);
109
+ }
110
+ const tasks$1 = new tasks.Tasks(env, req.logger);
60
111
  utilCrypto.validateAddress(dapp, false, 42);
61
112
  utilCrypto.validateAddress(user, false, 42);
62
113
  const clientRecord = await tasks$1.db.getClientRecord(dapp);
@@ -122,7 +173,6 @@ function prosopoVerifyRouter(env) {
122
173
  };
123
174
  return res.json(verificationResponse);
124
175
  }
125
- const tasks$1 = new tasks.Tasks(env, req.logger);
126
176
  let parsed;
127
177
  try {
128
178
  parsed = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
@@ -137,7 +187,7 @@ function prosopoVerifyRouter(env) {
137
187
  }
138
188
  try {
139
189
  const { token, dappSignature, ip, email } = parsed;
140
- const { dapp, user, timestamp, challenge } = types.decodeProcaptchaOutput(token);
190
+ const { dapp, user, timestamp, challenge, providerUrl } = types.decodeProcaptchaOutput(token);
141
191
  const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
142
192
  if (testVerdict !== null) {
143
193
  const verificationResponse2 = {
@@ -146,6 +196,20 @@ function prosopoVerifyRouter(env) {
146
196
  };
147
197
  return res.json(verificationResponse2);
148
198
  }
199
+ const forwarded = await forwardVerify.forwardVerifyIfNotIssuer({
200
+ env,
201
+ logger: req.logger,
202
+ path: types.ClientApiPaths.VerifyPowCaptchaSolution,
203
+ providerUrl,
204
+ dapp,
205
+ user,
206
+ body: parsed,
207
+ alreadyForwarded: req.headers[api.VERIFY_FORWARDED_HEADER] !== void 0
208
+ });
209
+ if (forwarded) {
210
+ return res.json(forwarded);
211
+ }
212
+ const tasks$1 = new tasks.Tasks(env, req.logger);
149
213
  utilCrypto.validateAddress(dapp, false, 42);
150
214
  utilCrypto.validateAddress(user, false, 42);
151
215
  const clientRecord = await tasks$1.db.getClientRecord(dapp);
@@ -217,7 +281,6 @@ function prosopoVerifyRouter(env) {
217
281
  };
218
282
  return res.json(verificationResponse);
219
283
  }
220
- const tasks$1 = new tasks.Tasks(env, req.logger);
221
284
  let parsed;
222
285
  try {
223
286
  parsed = types.ServerPuzzleCaptchaVerifyRequestBody.parse(req.body);
@@ -232,7 +295,7 @@ function prosopoVerifyRouter(env) {
232
295
  }
233
296
  try {
234
297
  const { token, dappSignature, ip, email } = parsed;
235
- const { dapp, user, timestamp, challenge } = types.decodeProcaptchaOutput(token);
298
+ const { dapp, user, timestamp, challenge, providerUrl } = types.decodeProcaptchaOutput(token);
236
299
  const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
237
300
  if (testVerdict !== null) {
238
301
  const verificationResponse2 = {
@@ -241,6 +304,20 @@ function prosopoVerifyRouter(env) {
241
304
  };
242
305
  return res.json(verificationResponse2);
243
306
  }
307
+ const forwarded = await forwardVerify.forwardVerifyIfNotIssuer({
308
+ env,
309
+ logger: req.logger,
310
+ path: types.ClientApiPaths.VerifyPuzzleCaptchaSolution,
311
+ providerUrl,
312
+ dapp,
313
+ user,
314
+ body: parsed,
315
+ alreadyForwarded: req.headers[api.VERIFY_FORWARDED_HEADER] !== void 0
316
+ });
317
+ if (forwarded) {
318
+ return res.json(forwarded);
319
+ }
320
+ const tasks$1 = new tasks.Tasks(env, req.logger);
244
321
  utilCrypto.validateAddress(dapp, false, 42);
245
322
  utilCrypto.validateAddress(user, false, 42);
246
323
  const clientRecord = await tasks$1.db.getClientRecord(dapp);
@@ -34,6 +34,7 @@ exports.getIPAddressFromBigInt = util.getIPAddressFromBigInt;
34
34
  exports.shuffleArray = util.shuffleArray;
35
35
  exports.validateIpAddress = util.validateIpAddress;
36
36
  exports.blockMiddleware = block.blockMiddleware;
37
+ exports.asyncHandler = captcha.asyncHandler;
37
38
  exports.prosopoRouter = captcha.prosopoRouter;
38
39
  exports.prosopoVerifyRouter = verify.prosopoVerifyRouter;
39
40
  exports.DEFAULT_JA4 = ja4Middleware.DEFAULT_JA4;
@@ -8,7 +8,6 @@ const compositeIpAddress = require("../compositeIpAddress.cjs");
8
8
  const enrichDnsEvent = require("./dnsEvent/enrichDnsEvent.cjs");
9
9
  const checkSpamEmail = require("./spam/checkSpamEmail.cjs");
10
10
  const checkTrafficFilter = require("./spam/checkTrafficFilter.cjs");
11
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
12
11
  const findHardBlockPolicy = (accessPolicies) => {
13
12
  return accessPolicies.find(
14
13
  (policy) => policy.type === userAccessPolicy.AccessPolicyType.Block && (policy.deferToVerify || !policy.captchaType)
@@ -19,7 +18,7 @@ class CaptchaManager {
19
18
  this.pair = pair;
20
19
  this.db = db;
21
20
  this.config = config;
22
- this.logger = logger$1 || logger.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);
21
+ this.logger = logger$1 || logger.getLogger("info", "provider:captcha-manager");
23
22
  this.writeQueue = writeQueue ?? null;
24
23
  }
25
24
  /**
@@ -456,9 +456,10 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
456
456
  return void 0;
457
457
  }
458
458
  async verifyImageCaptchaSolution(user, dapp, commitmentId, env, maxVerifiedTime, ip, disallowWebView, contextAwareEnabled = false, userAccessRulesStorage, email, spamEmailDomainCheckingEnabled = false, spamFilter, trafficFilter, storeMetadata = false) {
459
+ const logger = this.logger.with({ commitmentId, dapp });
459
460
  const solution = await (commitmentId ? this.getDappUserCommitmentById(commitmentId) : this.getDappUserCommitmentByAccount(user, dapp));
460
461
  if (!solution) {
461
- this.logger.debug(() => ({
462
+ logger.debug(() => ({
462
463
  msg: "Not verified - no solution found"
463
464
  }));
464
465
  return {
@@ -484,7 +485,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
484
485
  const submittedAt = solution.submittedAtTimestamp;
485
486
  const timeSinceCompletion = submittedAt instanceof Date ? currentTime - submittedAt.getTime() : Number.POSITIVE_INFINITY;
486
487
  if (timeSinceCompletion > maxVerifiedTime) {
487
- this.logger.debug(() => ({
488
+ logger.debug(() => ({
488
489
  msg: "Not verified - timed out"
489
490
  }));
490
491
  return {
@@ -506,7 +507,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
506
507
  solution.ipInfo?.isValid ? solution.ipInfo.asnNumber : void 0
507
508
  );
508
509
  if (blockPolicy) {
509
- this.logger.info(() => ({
510
+ logger.info(() => ({
510
511
  msg: "User blocked by access policy in server image verification",
511
512
  data: {
512
513
  userAccount: solution.userAccount,
@@ -521,8 +522,8 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
521
522
  failStatus = types.ResultReason.ACCESS_POLICY_BLOCK;
522
523
  }
523
524
  } catch (error) {
524
- this.logger.warn(() => ({
525
- msg: "Failed to check user access policies in server Image verification",
525
+ logger.warn(() => ({
526
+ msg: "Failed to check user access policies in server image verification",
526
527
  error
527
528
  }));
528
529
  }
@@ -532,9 +533,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
532
533
  const isSpam = await this.checkSpamEmail(email);
533
534
  if (isSpam) {
534
535
  const emailDomain = email.split("@")[1] || "unknown";
535
- this.logger.info(() => ({
536
+ logger.info(() => ({
536
537
  msg: "Spam email domain detected in server image verification",
537
- data: { commitmentId, dapp, emailDomain }
538
+ data: { emailDomain }
538
539
  }));
539
540
  commitmentUpdates.result = {
540
541
  status: types.CaptchaStatus.disapproved,
@@ -543,7 +544,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
543
544
  failStatus = types.ResultReason.SPAM_EMAIL_DOMAIN;
544
545
  }
545
546
  } catch (error) {
546
- this.logger.warn(() => ({
547
+ logger.warn(() => ({
547
548
  msg: "Failed to check spam email domain in server image verification",
548
549
  error
549
550
  }));
@@ -552,9 +553,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
552
553
  if (!failStatus && spamFilter?.enabled && spamFilter.emailRules?.enabled && email) {
553
554
  const result = evaluateEmailSpamRules.evaluateEmailSpamRules(email, spamFilter.emailRules);
554
555
  if (result.isSpam) {
555
- this.logger.info(() => ({
556
+ logger.info(() => ({
556
557
  msg: "Spam filter rejected email in image verification",
557
- data: { commitmentId, dapp, reason: result.reason }
558
+ data: { reason: result.reason }
558
559
  }));
559
560
  commitmentUpdates.result = {
560
561
  status: types.CaptchaStatus.disapproved,
@@ -578,11 +579,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
578
579
  enrichedDnsEvent
579
580
  );
580
581
  if (check.isBlocked) {
581
- this.logger.info(() => ({
582
+ logger.info(() => ({
582
583
  msg: "Traffic filter rejected request",
583
584
  data: {
584
- commitmentId,
585
- dapp,
586
585
  ip,
587
586
  reason: check.reason,
588
587
  dnsPeerIp: enrichedDnsEvent?.peerIp,
@@ -611,13 +610,13 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
611
610
  const ipValidation = await util.deepValidateIpAddress(
612
611
  ip,
613
612
  solutionIpAddress,
614
- this.logger,
613
+ logger,
615
614
  env.ipInfoService,
616
615
  ipValidationRules,
617
616
  enrichedDnsEvent?.peerIp
618
617
  );
619
618
  if (!ipValidation.isValid) {
620
- this.logger.error(() => ({
619
+ logger.error(() => ({
621
620
  msg: "IP validation failed for image captcha",
622
621
  data: {
623
622
  ip,
@@ -658,7 +657,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
658
657
  };
659
658
  }
660
659
  score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
661
- this.logger.info(() => ({
660
+ logger.info(() => ({
662
661
  data: {
663
662
  scoreComponents: sessionRecord?.scoreComponents,
664
663
  score,
@@ -667,7 +666,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
667
666
  }
668
667
  }));
669
668
  if (!failStatus && disallowWebView === true && (sessionRecord.webView === true || (sessionRecord.scoreComponents.webView || 0) > 0)) {
670
- this.logger.info(() => ({
669
+ logger.info(() => ({
671
670
  msg: "Disallowing webview access - user not verified"
672
671
  }));
673
672
  commitmentUpdates.result = {
@@ -679,7 +678,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
679
678
  failureStatus = types.ResultReason.DISALLOWED_WEBVIEW;
680
679
  }
681
680
  if (contextAwareEnabled && sessionRecord.reason === types.FrictionlessReason.CONTEXT_AWARE_VALIDATION_FAILED) {
682
- this.logger.info(() => ({
681
+ logger.info(() => ({
683
682
  msg: "Context aware validation failed"
684
683
  }));
685
684
  }
@@ -708,14 +707,13 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
708
707
  try {
709
708
  const decision = await this.decisionMachineRunner.decide(
710
709
  decisionInput,
711
- this.logger
710
+ logger
712
711
  );
713
712
  if (decision.decision === types.DecisionMachineDecision.Deny) {
714
713
  const dmReason = decision.reason || types.ResultReason.CAPTCHA_DECISION_MACHINE_DENIED;
715
- this.logger?.info(() => ({
714
+ logger.info(() => ({
716
715
  msg: "Decision machine denied user verification",
717
716
  data: {
718
- commitmentId,
719
717
  reason: decision.reason
720
718
  }
721
719
  }));
@@ -727,7 +725,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
727
725
  failureStatus = dmReason;
728
726
  }
729
727
  } catch (error) {
730
- this.logger?.error(() => ({
728
+ logger.error(() => ({
731
729
  msg: "Failed to process decision machine",
732
730
  err: error
733
731
  }));
@@ -363,9 +363,10 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
363
363
  verified: false,
364
364
  reason
365
365
  });
366
+ const logger = this.logger.with({ challenge, dappAccount });
366
367
  const challengeRecord = await this.db.getPowCaptchaRecordByChallenge(challenge);
367
368
  if (!challengeRecord) {
368
- this.logger.debug(() => ({
369
+ logger.debug(() => ({
369
370
  msg: `No record of this challenge: ${challenge}`
370
371
  }));
371
372
  return notVerified("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND");
@@ -417,12 +418,10 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
417
418
  challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.asnNumber : void 0
418
419
  );
419
420
  if (blockPolicy) {
420
- this.logger.info(() => ({
421
+ logger.info(() => ({
421
422
  msg: "User blocked by access policy in server PoW verification",
422
423
  data: {
423
- challenge,
424
424
  userAccount: challengeRecord.userAccount,
425
- dappAccount,
426
425
  policy: blockPolicy
427
426
  }
428
427
  }));
@@ -433,7 +432,7 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
433
432
  failReason = "API.ACCESS_POLICY_BLOCK";
434
433
  }
435
434
  } catch (error) {
436
- this.logger.warn(() => ({
435
+ logger.warn(() => ({
437
436
  msg: "Failed to check user access policies in server PoW verification",
438
437
  error
439
438
  }));
@@ -444,9 +443,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
444
443
  const isSpam = await this.checkSpamEmail(email);
445
444
  if (isSpam) {
446
445
  const emailDomain = email.split("@")[1] || "unknown";
447
- this.logger.info(() => ({
446
+ logger.info(() => ({
448
447
  msg: "Spam email domain detected in server PoW verification",
449
- data: { challenge, dappAccount, emailDomain }
448
+ data: { emailDomain }
450
449
  }));
451
450
  failResult = {
452
451
  status: types.CaptchaStatus.disapproved,
@@ -455,7 +454,7 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
455
454
  failReason = "API.SPAM_EMAIL_DOMAIN";
456
455
  }
457
456
  } catch (error) {
458
- this.logger.warn(() => ({
457
+ logger.warn(() => ({
459
458
  msg: "Failed to check spam email domain in server PoW verification",
460
459
  error
461
460
  }));
@@ -464,9 +463,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
464
463
  if (!failResult && spamFilter?.enabled && spamFilter.emailRules?.enabled && email) {
465
464
  const result = evaluateEmailSpamRules.evaluateEmailSpamRules(email, spamFilter.emailRules);
466
465
  if (result.isSpam) {
467
- this.logger.info(() => ({
466
+ logger.info(() => ({
468
467
  msg: "Spam filter rejected email in PoW verification",
469
- data: { challenge, dappAccount, reason: result.reason }
468
+ data: { reason: result.reason }
470
469
  }));
471
470
  failResult = {
472
471
  status: types.CaptchaStatus.disapproved,
@@ -490,11 +489,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
490
489
  enrichedDnsEvent
491
490
  );
492
491
  if (check.isBlocked) {
493
- this.logger.info(() => ({
492
+ logger.info(() => ({
494
493
  msg: "Traffic filter rejected request in PoW verification",
495
494
  data: {
496
- challenge,
497
- dappAccount,
498
495
  ip,
499
496
  reason: check.reason,
500
497
  dnsPeerIp: enrichedDnsEvent?.peerIp,
@@ -525,13 +522,13 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
525
522
  const ipValidation = await util$2.deepValidateIpAddress(
526
523
  ip,
527
524
  challengeIpAddress,
528
- this.logger,
525
+ logger,
529
526
  env.ipInfoService,
530
527
  ipValidationRules,
531
528
  enrichedDnsEvent?.peerIp
532
529
  );
533
530
  if (!ipValidation.isValid) {
534
- this.logger.error(() => ({
531
+ logger.error(() => ({
535
532
  msg: "IP validation failed for PoW captcha",
536
533
  data: {
537
534
  ip,
@@ -561,7 +558,7 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
561
558
  };
562
559
  }
563
560
  score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
564
- this.logger.info(() => ({
561
+ logger.info(() => ({
565
562
  data: {
566
563
  scoreComponents: { ...sessionRecord?.scoreComponents || {} },
567
564
  score,
@@ -596,15 +593,13 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
596
593
  };
597
594
  const decision = await this.decisionMachineRunner.decide(
598
595
  decisionInput,
599
- this.logger
596
+ logger
600
597
  );
601
598
  if (decision.decision === types.DecisionMachineDecision.Deny) {
602
- this.logger.info(() => ({
599
+ logger.info(() => ({
603
600
  msg: "Decision machine denied PoW captcha in server verification",
604
601
  data: {
605
- challenge,
606
602
  userAccount: challengeRecord.userAccount,
607
- dappAccount,
608
603
  reason: decision.reason,
609
604
  score: decision.score,
610
605
  tags: decision.tags
@@ -617,10 +612,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
617
612
  };
618
613
  failReason = dmReason;
619
614
  } else {
620
- this.logger.debug(() => ({
615
+ logger.debug(() => ({
621
616
  msg: "Decision machine allowed PoW captcha",
622
617
  data: {
623
- challenge,
624
618
  reason: decision.reason,
625
619
  score: decision.score,
626
620
  tags: decision.tags
@@ -628,7 +622,7 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
628
622
  }));
629
623
  }
630
624
  } catch (error) {
631
- this.logger?.error(() => ({
625
+ logger.error(() => ({
632
626
  msg: "Failed to run decision machine in server PoW verification",
633
627
  err: error
634
628
  }));
@@ -282,9 +282,10 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
282
282
  */
283
283
  async serverVerifyPuzzleCaptchaSolution(dappAccount, challenge, timeout, env, ip, userAccessRulesStorage, email, spamEmailDomainCheckingEnabled = false, trafficFilter, storeMetadata = false) {
284
284
  const notVerifiedResponse = { verified: false };
285
+ const logger = this.logger.with({ challenge, dappAccount });
285
286
  const challengeRecord = await this.db.getPuzzleCaptchaRecordByChallenge(challenge);
286
287
  if (!challengeRecord) {
287
- this.logger.debug(() => ({
288
+ logger.debug(() => ({
288
289
  msg: `No record of this challenge: ${challenge}`
289
290
  }));
290
291
  return notVerifiedResponse;
@@ -342,12 +343,10 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
342
343
  challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.asnNumber : void 0
343
344
  );
344
345
  if (blockPolicy) {
345
- this.logger.info(() => ({
346
+ logger.info(() => ({
346
347
  msg: "User blocked by access policy in server puzzle verification",
347
348
  data: {
348
- challenge,
349
349
  userAccount: challengeRecord.userAccount,
350
- dappAccount,
351
350
  policy: blockPolicy
352
351
  }
353
352
  }));
@@ -367,7 +366,7 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
367
366
  return notVerifiedResponse;
368
367
  }
369
368
  } catch (error) {
370
- this.logger.warn(() => ({
369
+ logger.warn(() => ({
371
370
  msg: "Failed to check user access policies in server puzzle verification",
372
371
  error
373
372
  }));
@@ -378,9 +377,9 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
378
377
  const isSpam = await this.checkSpamEmail(email);
379
378
  if (isSpam) {
380
379
  const emailDomain = email.split("@")[1] || "unknown";
381
- this.logger.info(() => ({
380
+ logger.info(() => ({
382
381
  msg: "Spam email domain detected in server puzzle verification",
383
- data: { challenge, dappAccount, emailDomain }
382
+ data: { emailDomain }
384
383
  }));
385
384
  await this.db.updatePuzzleCaptchaRecord(challengeRecord.challenge, {
386
385
  result: {
@@ -391,7 +390,7 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
391
390
  return notVerifiedResponse;
392
391
  }
393
392
  } catch (error) {
394
- this.logger.warn(() => ({
393
+ logger.warn(() => ({
395
394
  msg: "Failed to check spam email domain in server puzzle verification",
396
395
  error
397
396
  }));
@@ -412,11 +411,9 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
412
411
  enrichedDnsEvent
413
412
  );
414
413
  if (check.isBlocked) {
415
- this.logger.info(() => ({
414
+ logger.info(() => ({
416
415
  msg: "Traffic filter rejected request in puzzle verification",
417
416
  data: {
418
- challenge,
419
- dappAccount,
420
417
  ip,
421
418
  reason: check.reason,
422
419
  dnsPeerIp: enrichedDnsEvent?.peerIp,
@@ -460,13 +457,13 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
460
457
  const ipValidation = await util$2.deepValidateIpAddress(
461
458
  ip,
462
459
  challengeIpAddress,
463
- this.logger,
460
+ logger,
464
461
  env.ipInfoService,
465
462
  ipValidationRules,
466
463
  enrichedDnsEvent?.peerIp
467
464
  );
468
465
  if (!ipValidation.isValid) {
469
- this.logger.error(() => ({
466
+ logger.error(() => ({
470
467
  msg: "IP validation failed for puzzle captcha",
471
468
  data: {
472
469
  ip,
@@ -505,7 +502,7 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
505
502
  };
506
503
  }
507
504
  score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
508
- this.logger.info(() => ({
505
+ logger.info(() => ({
509
506
  data: {
510
507
  scoreComponents: { ...sessionRecord?.scoreComponents || {} },
511
508
  score,
@@ -539,15 +536,13 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
539
536
  };
540
537
  const decision = await this.decisionMachineRunner.decide(
541
538
  decisionInput,
542
- this.logger
539
+ logger
543
540
  );
544
541
  if (decision.decision === types.DecisionMachineDecision.Deny) {
545
- this.logger.info(() => ({
542
+ logger.info(() => ({
546
543
  msg: "Decision machine denied puzzle captcha in server verification",
547
544
  data: {
548
- challenge,
549
545
  userAccount: challengeRecord.userAccount,
550
- dappAccount,
551
546
  reason: decision.reason,
552
547
  score: decision.score,
553
548
  tags: decision.tags
@@ -568,17 +563,16 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
568
563
  }
569
564
  return notVerifiedResponse;
570
565
  }
571
- this.logger.debug(() => ({
566
+ logger.debug(() => ({
572
567
  msg: "Decision machine allowed puzzle captcha",
573
568
  data: {
574
- challenge,
575
569
  reason: decision.reason,
576
570
  score: decision.score,
577
571
  tags: decision.tags
578
572
  }
579
573
  }));
580
574
  } catch (error) {
581
- this.logger?.error(() => ({
575
+ logger.error(() => ({
582
576
  msg: "Failed to run decision machine in server puzzle verification",
583
577
  err: error
584
578
  }));
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import "./tasks/index.js";
2
2
  import { updateSpamEmailDomains } from "./tasks/spam/updateSpamEmailDomains.js";
3
3
  import { checkIfTaskIsRunning, deepValidateIpAddress, encodeStringAddress, evaluateIpValidationRules, getIPAddress, getIPAddressFromBigInt, shuffleArray, validateIpAddress } from "./util.js";
4
4
  import { blockMiddleware } from "./api/block.js";
5
- import { prosopoRouter } from "./api/captcha.js";
5
+ import { asyncHandler, prosopoRouter } from "./api/captcha.js";
6
6
  import { prosopoVerifyRouter } from "./api/verify.js";
7
7
  import { DEFAULT_JA4, getJA4, ja4Middleware } from "./api/ja4Middleware.js";
8
8
  import { publicRouter } from "./api/public.js";
@@ -27,6 +27,7 @@ export {
27
27
  DEFAULT_JA4,
28
28
  FrictionlessReason,
29
29
  Tasks,
30
+ asyncHandler,
30
31
  blockMiddleware,
31
32
  checkIfTaskIsRunning,
32
33
  compareIPs,