@prosopo/provider 4.15.14 → 4.15.15

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 (232) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +106 -106
  2. package/.turbo/turbo-build$colon$tsc.log +24 -24
  3. package/.turbo/turbo-build.log +107 -104
  4. package/CHANGELOG.md +49 -0
  5. package/dist/_virtual/_rolldown/runtime.js +3 -0
  6. package/dist/api/admin/apiAdminRoutesProvider.js +27 -46
  7. package/dist/api/admin/apiClearAllCountersEndpoint.js +62 -57
  8. package/dist/api/admin/apiDnsEventEndpoint.js +79 -92
  9. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js +43 -45
  10. package/dist/api/admin/apiGetDecisionMachineEndpoint.js +40 -40
  11. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +23 -22
  12. package/dist/api/admin/apiRegisterSiteKeysEndpoint.js +26 -30
  13. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js +35 -37
  14. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js +40 -40
  15. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
  16. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +29 -31
  17. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js +33 -29
  18. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js +32 -31
  19. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +43 -35
  20. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js +43 -63
  21. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +36 -35
  22. package/dist/api/admin/createApiAdminRoutesProvider.js +6 -8
  23. package/dist/api/blacklistRequestInspector.js +285 -377
  24. package/dist/api/block.js +17 -30
  25. package/dist/api/captcha/checkSpamEmail.js +88 -98
  26. package/dist/api/captcha/contextAwareValidation.js +21 -15
  27. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +126 -140
  28. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +11 -12
  29. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +236 -299
  30. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.js +10 -13
  31. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +336 -462
  32. package/dist/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.js +17 -14
  33. package/dist/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.js +27 -27
  34. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +42 -63
  35. package/dist/api/captcha/getFrictionlessCaptchaChallenge.js +2 -4
  36. package/dist/api/captcha/getImageCaptchaChallenge.js +136 -207
  37. package/dist/api/captcha/getPoWCaptchaChallenge.js +128 -198
  38. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +132 -201
  39. package/dist/api/captcha/maintenanceModeResponses.js +38 -47
  40. package/dist/api/captcha/submitImageCaptchaSolution.js +75 -101
  41. package/dist/api/captcha/submitPoWCaptchaSolution.js +137 -207
  42. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +73 -105
  43. package/dist/api/captcha.js +76 -58
  44. package/dist/api/dnsEventUrl.js +20 -22
  45. package/dist/api/domainMiddleware.js +104 -115
  46. package/dist/api/forwardVerify.js +62 -48
  47. package/dist/api/handshakeTimingMiddleware.js +43 -62
  48. package/dist/api/hardBlockVerdictCache.js +114 -117
  49. package/dist/api/headerCheckMiddleware.js +34 -34
  50. package/dist/api/ignoreMiddleware.js +13 -15
  51. package/dist/api/ipInfoMiddleware.js +17 -19
  52. package/dist/api/ja4.js +149 -188
  53. package/dist/api/ja4Middleware.js +39 -54
  54. package/dist/api/metrics.js +245 -257
  55. package/dist/api/public.js +52 -54
  56. package/dist/api/robotsMiddleware.js +10 -10
  57. package/dist/api/startProviderApi.js +205 -232
  58. package/dist/api/testSiteKey.js +16 -16
  59. package/dist/api/validateAddress.js +23 -21
  60. package/dist/api/verify.js +334 -377
  61. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  62. package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +40 -59
  63. package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +63 -58
  64. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +82 -93
  65. package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +46 -48
  66. package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +41 -41
  67. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +25 -24
  68. package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +28 -32
  69. package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +38 -40
  70. package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +41 -41
  71. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +31 -33
  72. package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +35 -31
  73. package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +34 -33
  74. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +45 -35
  75. package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +45 -65
  76. package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +38 -37
  77. package/dist/cjs/api/admin/createApiAdminRoutesProvider.cjs +7 -8
  78. package/dist/cjs/api/blacklistRequestInspector.cjs +288 -376
  79. package/dist/cjs/api/block.cjs +18 -30
  80. package/dist/cjs/api/captcha/checkSpamEmail.cjs +90 -100
  81. package/dist/cjs/api/captcha/contextAwareValidation.cjs +21 -14
  82. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +125 -140
  83. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +10 -10
  84. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +238 -301
  85. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.cjs +9 -12
  86. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +349 -473
  87. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.cjs +18 -14
  88. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.cjs +26 -26
  89. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +42 -63
  90. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge.cjs +2 -3
  91. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +138 -208
  92. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +131 -200
  93. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +135 -203
  94. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +38 -44
  95. package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +77 -102
  96. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +140 -209
  97. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +76 -107
  98. package/dist/cjs/api/captcha.cjs +79 -58
  99. package/dist/cjs/api/dnsEventUrl.cjs +20 -21
  100. package/dist/cjs/api/domainMiddleware.cjs +106 -117
  101. package/dist/cjs/api/forwardVerify.cjs +63 -49
  102. package/dist/cjs/api/handshakeTimingMiddleware.cjs +43 -61
  103. package/dist/cjs/api/hardBlockVerdictCache.cjs +114 -114
  104. package/dist/cjs/api/headerCheckMiddleware.cjs +34 -34
  105. package/dist/cjs/api/ignoreMiddleware.cjs +12 -14
  106. package/dist/cjs/api/ipInfoMiddleware.cjs +16 -18
  107. package/dist/cjs/api/ja4.cjs +149 -187
  108. package/dist/cjs/api/ja4Middleware.cjs +40 -53
  109. package/dist/cjs/api/metrics.cjs +229 -228
  110. package/dist/cjs/api/public.cjs +57 -57
  111. package/dist/cjs/api/robotsMiddleware.cjs +9 -9
  112. package/dist/cjs/api/startProviderApi.cjs +219 -237
  113. package/dist/cjs/api/testSiteKey.cjs +15 -14
  114. package/dist/cjs/api/validateAddress.cjs +24 -21
  115. package/dist/cjs/api/verify.cjs +338 -379
  116. package/dist/cjs/compositeIpAddress.cjs +40 -47
  117. package/dist/cjs/index.cjs +65 -71
  118. package/dist/cjs/pairs.cjs +31 -35
  119. package/dist/cjs/rules/lang.cjs +10 -14
  120. package/dist/cjs/schedulers/captchaScheduler.cjs +26 -32
  121. package/dist/cjs/schedulers/getClientList.cjs +35 -33
  122. package/dist/cjs/schedulers/setClientEntropy.cjs +35 -33
  123. package/dist/cjs/schedulers/updateSpamEmailDomains.cjs +39 -43
  124. package/dist/cjs/services/ipComparison.cjs +122 -119
  125. package/dist/cjs/tasks/captchaManager.cjs +407 -486
  126. package/dist/cjs/tasks/client/clientTasks.cjs +347 -470
  127. package/dist/cjs/tasks/dataset/datasetTasks.cjs +25 -29
  128. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +16 -32
  129. package/dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs +220 -307
  130. package/dist/cjs/tasks/detection/decodeBehavior.cjs +408 -317
  131. package/dist/cjs/tasks/detection/decodePayload.cjs +686 -468
  132. package/dist/cjs/tasks/detection/decodeSimd.cjs +462 -304
  133. package/dist/cjs/tasks/detection/getBotScore.cjs +37 -43
  134. package/dist/cjs/tasks/dnsEvent/enrichDnsEvent.cjs +88 -71
  135. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +348 -486
  136. package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +13 -30
  137. package/dist/cjs/tasks/frictionless/routingMachine.cjs +71 -55
  138. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +555 -806
  139. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +22 -23
  140. package/dist/cjs/tasks/index.cjs +2 -4
  141. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +491 -687
  142. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +17 -29
  143. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +422 -591
  144. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasksUtils.cjs +8 -5
  145. package/dist/cjs/tasks/spam/checkSpamEmail.cjs +133 -141
  146. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +118 -76
  147. package/dist/cjs/tasks/spam/evaluateEmailSpamRules.cjs +75 -84
  148. package/dist/cjs/tasks/spam/updateSpamEmailDomains.cjs +40 -56
  149. package/dist/cjs/tasks/tasks.cjs +107 -158
  150. package/dist/cjs/util/usageCounters.cjs +220 -211
  151. package/dist/cjs/util.cjs +329 -359
  152. package/dist/cjs/utils/devicePlatform.cjs +14 -8
  153. package/dist/cjs/utils/dns.cjs +68 -93
  154. package/dist/cjs/utils/hashUserAgent.cjs +14 -7
  155. package/dist/cjs/utils/hashUserIp.cjs +14 -6
  156. package/dist/cjs/utils/honeypot/encoders.cjs +74 -80
  157. package/dist/cjs/utils/honeypot/phraseBank.cjs +51 -44
  158. package/dist/cjs/utils/normalizeRequestIp.cjs +33 -25
  159. package/dist/compositeIpAddress.js +38 -46
  160. package/dist/index.js +12 -56
  161. package/dist/pairs.js +31 -37
  162. package/dist/rules/lang.js +11 -15
  163. package/dist/schedulers/captchaScheduler.js +25 -31
  164. package/dist/schedulers/getClientList.js +34 -32
  165. package/dist/schedulers/setClientEntropy.js +34 -32
  166. package/dist/schedulers/updateSpamEmailDomains.js +38 -42
  167. package/dist/services/ipComparison.js +122 -119
  168. package/dist/tasks/captchaManager.js +403 -483
  169. package/dist/tasks/client/clientTasks.js +343 -467
  170. package/dist/tasks/dataset/datasetTasks.js +24 -28
  171. package/dist/tasks/dataset/datasetTasksUtils.js +15 -31
  172. package/dist/tasks/decisionMachine/decisionMachineRunner.js +217 -306
  173. package/dist/tasks/detection/getBotScore.js +37 -43
  174. package/dist/tasks/dnsEvent/enrichDnsEvent.d.ts.map +1 -1
  175. package/dist/tasks/dnsEvent/enrichDnsEvent.js +88 -74
  176. package/dist/tasks/dnsEvent/enrichDnsEvent.js.map +1 -1
  177. package/dist/tasks/frictionless/frictionlessTasks.js +342 -479
  178. package/dist/tasks/frictionless/frictionlessTasksUtils.js +14 -32
  179. package/dist/tasks/frictionless/routingMachine.js +72 -56
  180. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +550 -801
  181. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +21 -22
  182. package/dist/tasks/index.js +1 -3
  183. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  184. package/dist/tasks/powCaptcha/powTasks.js +486 -682
  185. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  186. package/dist/tasks/powCaptcha/powTasksUtils.js +15 -28
  187. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  188. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +417 -586
  189. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  190. package/dist/tasks/puzzleCaptcha/puzzleTasksUtils.js +9 -6
  191. package/dist/tasks/spam/checkSpamEmail.js +133 -141
  192. package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -0
  193. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  194. package/dist/tasks/spam/checkTrafficFilter.js +117 -77
  195. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  196. package/dist/tasks/spam/evaluateEmailSpamRules.js +75 -86
  197. package/dist/tasks/spam/updateSpamEmailDomains.js +36 -54
  198. package/dist/tasks/tasks.js +98 -150
  199. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +4 -1
  200. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -1
  201. package/dist/tests/unit/api/block.unit.test.js +8 -4
  202. package/dist/tests/unit/api/block.unit.test.js.map +1 -1
  203. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +8 -6
  204. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
  205. package/dist/tests/unit/api/forwardVerify.unit.test.js +3 -1
  206. package/dist/tests/unit/api/forwardVerify.unit.test.js.map +1 -1
  207. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +15 -7
  208. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  209. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +24 -18
  210. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  211. package/dist/tests/unit/schedulers/getClientList.unit.test.js +19 -13
  212. package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -1
  213. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +19 -13
  214. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -1
  215. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  216. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +22 -16
  217. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -1
  218. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +140 -0
  219. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
  220. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +7 -7
  221. package/dist/util/usageCounters.js +220 -212
  222. package/dist/util.d.ts.map +1 -1
  223. package/dist/util.js +327 -364
  224. package/dist/util.js.map +1 -1
  225. package/dist/utils/devicePlatform.js +15 -9
  226. package/dist/utils/dns.js +64 -77
  227. package/dist/utils/hashUserAgent.js +14 -7
  228. package/dist/utils/hashUserIp.js +14 -6
  229. package/dist/utils/honeypot/encoders.js +74 -80
  230. package/dist/utils/honeypot/phraseBank.js +49 -44
  231. package/dist/utils/normalizeRequestIp.js +34 -26
  232. package/package.json +24 -24
@@ -1,384 +1,343 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const api = require("@prosopo/api");
4
- const apiExpressRouter = require("@prosopo/api-express-router");
5
- const common = require("@prosopo/common");
6
- const types = require("@prosopo/types");
7
- const utilCrypto = require("@prosopo/util-crypto");
8
- const express = require("express");
9
- const tasks = require("../tasks/tasks.cjs");
10
- const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
11
- const forwardVerify = require("./forwardVerify.cjs");
12
- const metrics = require("./metrics.cjs");
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";
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_metrics = require("./metrics.cjs");
3
+ const require_tasks = require("../tasks/tasks.cjs");
4
+ const require_apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
5
+ const require_testSiteKey = require("./testSiteKey.cjs");
6
+ const require_forwardVerify = require("./forwardVerify.cjs");
7
+ let _prosopo_common = require("@prosopo/common");
8
+ let _prosopo_types = require("@prosopo/types");
9
+ let _prosopo_util_crypto = require("@prosopo/util-crypto");
10
+ let _prosopo_api_express_router = require("@prosopo/api-express-router");
11
+ let express = require("express");
12
+ express = require_runtime.__toESM(express, 1);
13
+ let _prosopo_api = require("@prosopo/api");
14
+ //#region src/api/verify.ts
15
+ var deriveVerifySource = (body) => {
16
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) return "maintenance";
17
+ try {
18
+ const token = body?.token;
19
+ if (token) {
20
+ const { dapp } = (0, _prosopo_types.decodeProcaptchaOutput)(token);
21
+ if (require_testSiteKey.isReservedTestSiteKey(dapp)) return "test_key";
22
+ }
23
+ } catch {}
24
+ return "real";
25
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
26
+ var VERIFY_PATH_TYPE = {
27
+ [_prosopo_types.ClientApiPaths.VerifyImageCaptchaSolutionDapp]: _prosopo_types.CaptchaType.image,
28
+ [_prosopo_types.ClientApiPaths.VerifyPowCaptchaSolution]: _prosopo_types.CaptchaType.pow,
29
+ [_prosopo_types.ClientApiPaths.VerifyPuzzleCaptchaSolution]: _prosopo_types.CaptchaType.puzzle
30
30
  };
31
+ /**
32
+ * Returns a router connected to the database which can interact with the Proposo protocol
33
+ *
34
+ * @return {Router} - A middleware router that can interact with the Prosopo protocol
35
+ * @param {Environment} env - The Prosopo environment
36
+ */
31
37
  function prosopoVerifyRouter(env) {
32
- const router = express.Router();
33
- let userAccessRulesStorage;
34
- try {
35
- userAccessRulesStorage = env.getDb().getUserAccessRulesStorage();
36
- } catch (err) {
37
- env.logger.warn(() => ({
38
- msg: "User access rules storage unavailable; verify endpoints will skip access-policy checks",
39
- err
40
- }));
41
- userAccessRulesStorage = void 0;
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
- });
61
- router.post(
62
- types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
63
- async (req, res, next) => {
64
- if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
65
- req.logger.info(() => ({
66
- msg: "Maintenance mode active - returning verified for image captcha verification"
67
- }));
68
- const verificationResponse = {
69
- status: "ok",
70
- verified: true
71
- };
72
- return res.json(verificationResponse);
73
- }
74
- let parsed;
75
- try {
76
- parsed = types.VerifySolutionBody.parse(req.body);
77
- } catch (err) {
78
- return next(
79
- new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
80
- context: { code: 400, error: err, body: req.body },
81
- i18n: req.i18n,
82
- logger: req.logger
83
- })
84
- );
85
- }
86
- const { dappSignature, token, ip, maxVerifiedTime, email } = parsed;
87
- try {
88
- const { user, dapp, timestamp, commitmentId, providerUrl } = types.decodeProcaptchaOutput(token);
89
- const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
90
- if (testVerdict !== null) {
91
- const verificationResponse2 = {
92
- status: "ok",
93
- verified: testVerdict
94
- };
95
- return res.json(verificationResponse2);
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);
111
- utilCrypto.validateAddress(dapp, false, 42);
112
- utilCrypto.validateAddress(user, false, 42);
113
- const clientRecord = await tasks$1.db.getClientRecord(dapp);
114
- if (!clientRecord) {
115
- return next(
116
- new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
117
- context: { code: 400, siteKey: dapp, user },
118
- i18n: req.i18n,
119
- logger: req.logger
120
- })
121
- );
122
- }
123
- const keyPair = env.keyring.addFromAddress(dapp);
124
- apiExpressRouter.verifySignature(dappSignature, timestamp.toString(), keyPair);
125
- const response = await tasks$1.imgCaptchaManager.verifyImageCaptchaSolution(
126
- user,
127
- dapp,
128
- commitmentId,
129
- env,
130
- maxVerifiedTime,
131
- ip,
132
- clientRecord.settings.disallowWebView,
133
- clientRecord.settings.contextAware?.enabled,
134
- userAccessRulesStorage,
135
- email,
136
- clientRecord.settings.spamEmailDomainCheckEnabled,
137
- clientRecord.settings.spamFilter,
138
- clientRecord.settings.trafficFilter,
139
- clientRecord.settings.storeMetadata
140
- );
141
- req.logger.debug(() => ({ data: { response } }));
142
- const verificationResponse = tasks$1.imgCaptchaManager.getVerificationResponse(
143
- response[types.ApiParams.verified],
144
- clientRecord,
145
- req.i18n.t,
146
- response[types.ApiParams.score],
147
- response[types.ApiParams.commitmentId],
148
- response[types.ApiParams.status]
149
- );
150
- res.json(verificationResponse);
151
- } catch (err) {
152
- req.logger.error(() => ({
153
- err,
154
- msg: "Error in verifyImageCaptchaSolution",
155
- data: { body: req.body }
156
- }));
157
- return next(
158
- new common.ProsopoApiError("API.BAD_REQUEST", {
159
- context: { code: 500, siteKey: req.body.dapp, user: req.body.user },
160
- i18n: req.i18n,
161
- logger: req.logger
162
- })
163
- );
164
- }
165
- }
166
- );
167
- router.post(
168
- types.ClientApiPaths.VerifyPowCaptchaSolution,
169
- async (req, res, next) => {
170
- if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
171
- req.logger.info(() => ({
172
- msg: "Maintenance mode active - returning verified for PoW captcha verification"
173
- }));
174
- const verificationResponse = {
175
- status: "ok",
176
- verified: true
177
- };
178
- return res.json(verificationResponse);
179
- }
180
- let parsed;
181
- try {
182
- parsed = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
183
- } catch (err) {
184
- return next(
185
- new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
186
- context: { code: 400, error: err, body: req.body },
187
- i18n: req.i18n,
188
- logger: req.logger
189
- })
190
- );
191
- }
192
- try {
193
- const { token, dappSignature, ip, email } = parsed;
194
- const { dapp, user, timestamp, challenge, providerUrl } = types.decodeProcaptchaOutput(token);
195
- const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
196
- if (testVerdict !== null) {
197
- const verificationResponse2 = {
198
- status: "ok",
199
- verified: testVerdict
200
- };
201
- return res.json(verificationResponse2);
202
- }
203
- const forwarded = await forwardVerify.forwardVerifyIfNotIssuer({
204
- env,
205
- logger: req.logger,
206
- path: types.ClientApiPaths.VerifyPowCaptchaSolution,
207
- providerUrl,
208
- dapp,
209
- user,
210
- body: parsed,
211
- alreadyForwarded: req.headers[api.VERIFY_FORWARDED_HEADER] !== void 0
212
- });
213
- if (forwarded) {
214
- return res.json(forwarded);
215
- }
216
- const tasks$1 = new tasks.Tasks(env, req.logger);
217
- utilCrypto.validateAddress(dapp, false, 42);
218
- utilCrypto.validateAddress(user, false, 42);
219
- const clientRecord = await tasks$1.db.getClientRecord(dapp);
220
- if (!clientRecord) {
221
- return next(
222
- new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
223
- context: { code: 400, siteKey: dapp },
224
- i18n: req.i18n,
225
- logger: req.logger
226
- })
227
- );
228
- }
229
- if (!challenge) {
230
- const unverifiedResponse = {
231
- status: req.i18n.t("API.USER_NOT_VERIFIED"),
232
- [types.ApiParams.verified]: false
233
- };
234
- return res.json(unverifiedResponse);
235
- }
236
- const dappPair = env.keyring.addFromAddress(dapp);
237
- apiExpressRouter.verifySignature(dappSignature, timestamp.toString(), dappPair);
238
- const { verified, score, reason } = await tasks$1.powCaptchaManager.serverVerifyPowCaptchaSolution(
239
- dapp,
240
- challenge,
241
- clientRecord.settings.verifiedTimeout,
242
- env,
243
- ip,
244
- userAccessRulesStorage,
245
- email,
246
- clientRecord.settings.spamEmailDomainCheckEnabled,
247
- clientRecord.settings.spamFilter,
248
- clientRecord.settings.trafficFilter,
249
- clientRecord.settings.storeMetadata
250
- );
251
- const verificationResponse = tasks$1.powCaptchaManager.getVerificationResponse(
252
- verified,
253
- clientRecord,
254
- req.i18n.t,
255
- score,
256
- reason
257
- );
258
- return res.json(verificationResponse);
259
- } catch (err) {
260
- req.logger.error(() => ({
261
- msg: "Error in verifyPowCaptchaSolution",
262
- err,
263
- data: { body: req.body }
264
- }));
265
- return next(
266
- new common.ProsopoApiError("API.BAD_REQUEST", {
267
- context: { code: 500, error: err },
268
- i18n: req.i18n,
269
- logger: req.logger
270
- })
271
- );
272
- }
273
- }
274
- );
275
- router.post(
276
- types.ClientApiPaths.VerifyPuzzleCaptchaSolution,
277
- async (req, res, next) => {
278
- if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
279
- req.logger.info(() => ({
280
- msg: "Maintenance mode active - returning verified for puzzle captcha verification"
281
- }));
282
- const verificationResponse = {
283
- status: "ok",
284
- verified: true
285
- };
286
- return res.json(verificationResponse);
287
- }
288
- let parsed;
289
- try {
290
- parsed = types.ServerPuzzleCaptchaVerifyRequestBody.parse(req.body);
291
- } catch (err) {
292
- return next(
293
- new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
294
- context: { code: 400, error: err, body: req.body },
295
- i18n: req.i18n,
296
- logger: req.logger
297
- })
298
- );
299
- }
300
- try {
301
- const { token, dappSignature, ip, email } = parsed;
302
- const { dapp, user, timestamp, challenge, providerUrl } = types.decodeProcaptchaOutput(token);
303
- const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
304
- if (testVerdict !== null) {
305
- const verificationResponse2 = {
306
- status: "ok",
307
- verified: testVerdict
308
- };
309
- return res.json(verificationResponse2);
310
- }
311
- const forwarded = await forwardVerify.forwardVerifyIfNotIssuer({
312
- env,
313
- logger: req.logger,
314
- path: types.ClientApiPaths.VerifyPuzzleCaptchaSolution,
315
- providerUrl,
316
- dapp,
317
- user,
318
- body: parsed,
319
- alreadyForwarded: req.headers[api.VERIFY_FORWARDED_HEADER] !== void 0
320
- });
321
- if (forwarded) {
322
- return res.json(forwarded);
323
- }
324
- const tasks$1 = new tasks.Tasks(env, req.logger);
325
- utilCrypto.validateAddress(dapp, false, 42);
326
- utilCrypto.validateAddress(user, false, 42);
327
- const clientRecord = await tasks$1.db.getClientRecord(dapp);
328
- if (!clientRecord) {
329
- return next(
330
- new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
331
- context: { code: 400, siteKey: dapp },
332
- i18n: req.i18n,
333
- logger: req.logger
334
- })
335
- );
336
- }
337
- if (!challenge) {
338
- const unverifiedResponse = {
339
- status: req.i18n.t("API.USER_NOT_VERIFIED"),
340
- [types.ApiParams.verified]: false
341
- };
342
- return res.json(unverifiedResponse);
343
- }
344
- const dappPair = env.keyring.addFromAddress(dapp);
345
- apiExpressRouter.verifySignature(dappSignature, timestamp.toString(), dappPair);
346
- const { verified, score } = await tasks$1.puzzleCaptchaManager.serverVerifyPuzzleCaptchaSolution(
347
- dapp,
348
- challenge,
349
- clientRecord.settings.verifiedTimeout,
350
- env,
351
- ip,
352
- userAccessRulesStorage,
353
- email,
354
- clientRecord.settings.spamEmailDomainCheckEnabled,
355
- clientRecord.settings.trafficFilter,
356
- clientRecord.settings.storeMetadata
357
- );
358
- const verificationResponse = tasks$1.puzzleCaptchaManager.getVerificationResponse(
359
- verified,
360
- clientRecord,
361
- req.i18n.t,
362
- score
363
- );
364
- return res.json(verificationResponse);
365
- } catch (err) {
366
- req.logger.error(() => ({
367
- msg: "Error in verifyPuzzleCaptchaSolution",
368
- err,
369
- data: { body: req.body }
370
- }));
371
- return next(
372
- new common.ProsopoApiError("API.BAD_REQUEST", {
373
- context: { code: 500, error: err },
374
- i18n: req.i18n,
375
- logger: req.logger
376
- })
377
- );
378
- }
379
- }
380
- );
381
- router.use(apiExpressRouter.handleErrors);
382
- return router;
38
+ const router = express.default.Router();
39
+ let userAccessRulesStorage;
40
+ try {
41
+ userAccessRulesStorage = env.getDb().getUserAccessRulesStorage();
42
+ } catch (err) {
43
+ env.logger.warn(() => ({
44
+ msg: "User access rules storage unavailable; verify endpoints will skip access-policy checks",
45
+ err
46
+ }));
47
+ userAccessRulesStorage = void 0;
48
+ }
49
+ router.use((req, res, next) => {
50
+ if (!require_metrics.metricsEnabled()) return next();
51
+ const type = VERIFY_PATH_TYPE[req.path];
52
+ if (!type) return next();
53
+ const originalJson = res.json.bind(res);
54
+ res.json = (body) => {
55
+ if (res.statusCode < 300) {
56
+ const verified = !!(body && typeof body === "object" && body.verified);
57
+ require_metrics.recordCaptchaVerify({
58
+ type,
59
+ verified,
60
+ source: deriveVerifySource(req.body)
61
+ });
62
+ }
63
+ return originalJson(body);
64
+ };
65
+ next();
66
+ });
67
+ /**
68
+ * Verifies a dapp's solution as being approved or not
69
+ *
70
+ * @param {string} user - Dapp User AccountId
71
+ * @param {string} dapp - Dapp Contract AccountId
72
+ * @param {string} blockNumber - The block number at which the captcha was requested
73
+ * @param {string} dappUserSignature - The signature fo dapp user
74
+ * @param {string} commitmentId - The captcha solution to look up
75
+ * @param {number} maxVerifiedTime - The maximum time in milliseconds since the blockNumber
76
+ */
77
+ router.post(_prosopo_types.ClientApiPaths.VerifyImageCaptchaSolutionDapp, async (req, res, next) => {
78
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
79
+ req.logger.info(() => ({ msg: "Maintenance mode active - returning verified for image captcha verification" }));
80
+ return res.json({
81
+ status: "ok",
82
+ verified: true
83
+ });
84
+ }
85
+ let parsed;
86
+ try {
87
+ parsed = _prosopo_types.VerifySolutionBody.parse(req.body);
88
+ } catch (err) {
89
+ return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
90
+ context: {
91
+ code: 400,
92
+ error: err,
93
+ body: req.body
94
+ },
95
+ i18n: req.i18n,
96
+ logger: req.logger
97
+ }));
98
+ }
99
+ const { dappSignature, token, ip, maxVerifiedTime, email } = parsed;
100
+ try {
101
+ const { user, dapp, timestamp, commitmentId, providerUrl } = (0, _prosopo_types.decodeProcaptchaOutput)(token);
102
+ const testVerdict = require_testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
103
+ if (testVerdict !== null) {
104
+ const verificationResponse = {
105
+ status: "ok",
106
+ verified: testVerdict
107
+ };
108
+ return res.json(verificationResponse);
109
+ }
110
+ const forwarded = await require_forwardVerify.forwardVerifyIfNotIssuer({
111
+ env,
112
+ logger: req.logger,
113
+ path: _prosopo_types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
114
+ providerUrl,
115
+ dapp,
116
+ user,
117
+ body: parsed,
118
+ alreadyForwarded: req.headers[_prosopo_api.VERIFY_FORWARDED_HEADER] !== void 0
119
+ });
120
+ if (forwarded) return res.json(forwarded);
121
+ const tasks = new require_tasks.Tasks(env, req.logger);
122
+ (0, _prosopo_util_crypto.validateAddress)(dapp, false, 42);
123
+ (0, _prosopo_util_crypto.validateAddress)(user, false, 42);
124
+ const clientRecord = await tasks.db.getClientRecord(dapp);
125
+ if (!clientRecord) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
126
+ context: {
127
+ code: 400,
128
+ siteKey: dapp,
129
+ user
130
+ },
131
+ i18n: req.i18n,
132
+ logger: req.logger
133
+ }));
134
+ const keyPair = env.keyring.addFromAddress(dapp);
135
+ (0, _prosopo_api_express_router.verifySignature)(dappSignature, timestamp.toString(), keyPair);
136
+ const response = await tasks.imgCaptchaManager.verifyImageCaptchaSolution(user, dapp, commitmentId, env, maxVerifiedTime, ip, clientRecord.settings.disallowWebView, clientRecord.settings.contextAware?.enabled, userAccessRulesStorage, email, clientRecord.settings.spamEmailDomainCheckEnabled, clientRecord.settings.spamFilter, clientRecord.settings.trafficFilter, clientRecord.settings.storeMetadata);
137
+ req.logger.debug(() => ({ data: { response } }));
138
+ const verificationResponse = tasks.imgCaptchaManager.getVerificationResponse(response[_prosopo_types.ApiParams.verified], clientRecord, req.i18n.t, response[_prosopo_types.ApiParams.score], response[_prosopo_types.ApiParams.commitmentId], response[_prosopo_types.ApiParams.status]);
139
+ res.json(verificationResponse);
140
+ } catch (err) {
141
+ req.logger.error(() => ({
142
+ err,
143
+ msg: "Error in verifyImageCaptchaSolution",
144
+ data: { body: req.body }
145
+ }));
146
+ return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
147
+ context: {
148
+ code: 500,
149
+ siteKey: req.body.dapp,
150
+ user: req.body.user
151
+ },
152
+ i18n: req.i18n,
153
+ logger: req.logger
154
+ }));
155
+ }
156
+ });
157
+ /**
158
+ * Verifies a dapp's solution as being approved or not
159
+ *
160
+ * @param {string} token - Token containing dapp, blockNumber and challenge
161
+ * @param {string} dappSignature - Signed token
162
+ * @param {number} verifiedTimeout - The maximum time in milliseconds to be valid
163
+ */
164
+ router.post(_prosopo_types.ClientApiPaths.VerifyPowCaptchaSolution, async (req, res, next) => {
165
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
166
+ req.logger.info(() => ({ msg: "Maintenance mode active - returning verified for PoW captcha verification" }));
167
+ return res.json({
168
+ status: "ok",
169
+ verified: true
170
+ });
171
+ }
172
+ let parsed;
173
+ try {
174
+ parsed = _prosopo_types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
175
+ } catch (err) {
176
+ return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
177
+ context: {
178
+ code: 400,
179
+ error: err,
180
+ body: req.body
181
+ },
182
+ i18n: req.i18n,
183
+ logger: req.logger
184
+ }));
185
+ }
186
+ try {
187
+ const { token, dappSignature, ip, email } = parsed;
188
+ const { dapp, user, timestamp, challenge, providerUrl } = (0, _prosopo_types.decodeProcaptchaOutput)(token);
189
+ const testVerdict = require_testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
190
+ if (testVerdict !== null) {
191
+ const verificationResponse = {
192
+ status: "ok",
193
+ verified: testVerdict
194
+ };
195
+ return res.json(verificationResponse);
196
+ }
197
+ const forwarded = await require_forwardVerify.forwardVerifyIfNotIssuer({
198
+ env,
199
+ logger: req.logger,
200
+ path: _prosopo_types.ClientApiPaths.VerifyPowCaptchaSolution,
201
+ providerUrl,
202
+ dapp,
203
+ user,
204
+ body: parsed,
205
+ alreadyForwarded: req.headers[_prosopo_api.VERIFY_FORWARDED_HEADER] !== void 0
206
+ });
207
+ if (forwarded) return res.json(forwarded);
208
+ const tasks = new require_tasks.Tasks(env, req.logger);
209
+ (0, _prosopo_util_crypto.validateAddress)(dapp, false, 42);
210
+ (0, _prosopo_util_crypto.validateAddress)(user, false, 42);
211
+ const clientRecord = await tasks.db.getClientRecord(dapp);
212
+ if (!clientRecord) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
213
+ context: {
214
+ code: 400,
215
+ siteKey: dapp
216
+ },
217
+ i18n: req.i18n,
218
+ logger: req.logger
219
+ }));
220
+ if (!challenge) {
221
+ const unverifiedResponse = {
222
+ status: req.i18n.t("API.USER_NOT_VERIFIED"),
223
+ [_prosopo_types.ApiParams.verified]: false
224
+ };
225
+ return res.json(unverifiedResponse);
226
+ }
227
+ const dappPair = env.keyring.addFromAddress(dapp);
228
+ (0, _prosopo_api_express_router.verifySignature)(dappSignature, timestamp.toString(), dappPair);
229
+ const { verified, score, reason } = await tasks.powCaptchaManager.serverVerifyPowCaptchaSolution(dapp, challenge, clientRecord.settings.verifiedTimeout, env, ip, userAccessRulesStorage, email, clientRecord.settings.spamEmailDomainCheckEnabled, clientRecord.settings.spamFilter, clientRecord.settings.trafficFilter, clientRecord.settings.storeMetadata);
230
+ const verificationResponse = tasks.powCaptchaManager.getVerificationResponse(verified, clientRecord, req.i18n.t, score, reason);
231
+ return res.json(verificationResponse);
232
+ } catch (err) {
233
+ req.logger.error(() => ({
234
+ msg: "Error in verifyPowCaptchaSolution",
235
+ err,
236
+ data: { body: req.body }
237
+ }));
238
+ return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
239
+ context: {
240
+ code: 500,
241
+ error: err
242
+ },
243
+ i18n: req.i18n,
244
+ logger: req.logger
245
+ }));
246
+ }
247
+ });
248
+ /**
249
+ * Verifies a dapp's puzzle captcha solution as being approved or not
250
+ *
251
+ * @param {string} token - Token containing dapp, blockNumber and challenge
252
+ * @param {string} dappSignature - Signed token
253
+ * @param {number} verifiedTimeout - The maximum time in milliseconds to be valid
254
+ */
255
+ router.post(_prosopo_types.ClientApiPaths.VerifyPuzzleCaptchaSolution, async (req, res, next) => {
256
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
257
+ req.logger.info(() => ({ msg: "Maintenance mode active - returning verified for puzzle captcha verification" }));
258
+ return res.json({
259
+ status: "ok",
260
+ verified: true
261
+ });
262
+ }
263
+ let parsed;
264
+ try {
265
+ parsed = _prosopo_types.ServerPuzzleCaptchaVerifyRequestBody.parse(req.body);
266
+ } catch (err) {
267
+ return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
268
+ context: {
269
+ code: 400,
270
+ error: err,
271
+ body: req.body
272
+ },
273
+ i18n: req.i18n,
274
+ logger: req.logger
275
+ }));
276
+ }
277
+ try {
278
+ const { token, dappSignature, ip, email } = parsed;
279
+ const { dapp, user, timestamp, challenge, providerUrl } = (0, _prosopo_types.decodeProcaptchaOutput)(token);
280
+ const testVerdict = require_testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
281
+ if (testVerdict !== null) {
282
+ const verificationResponse = {
283
+ status: "ok",
284
+ verified: testVerdict
285
+ };
286
+ return res.json(verificationResponse);
287
+ }
288
+ const forwarded = await require_forwardVerify.forwardVerifyIfNotIssuer({
289
+ env,
290
+ logger: req.logger,
291
+ path: _prosopo_types.ClientApiPaths.VerifyPuzzleCaptchaSolution,
292
+ providerUrl,
293
+ dapp,
294
+ user,
295
+ body: parsed,
296
+ alreadyForwarded: req.headers[_prosopo_api.VERIFY_FORWARDED_HEADER] !== void 0
297
+ });
298
+ if (forwarded) return res.json(forwarded);
299
+ const tasks = new require_tasks.Tasks(env, req.logger);
300
+ (0, _prosopo_util_crypto.validateAddress)(dapp, false, 42);
301
+ (0, _prosopo_util_crypto.validateAddress)(user, false, 42);
302
+ const clientRecord = await tasks.db.getClientRecord(dapp);
303
+ if (!clientRecord) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
304
+ context: {
305
+ code: 400,
306
+ siteKey: dapp
307
+ },
308
+ i18n: req.i18n,
309
+ logger: req.logger
310
+ }));
311
+ if (!challenge) {
312
+ const unverifiedResponse = {
313
+ status: req.i18n.t("API.USER_NOT_VERIFIED"),
314
+ [_prosopo_types.ApiParams.verified]: false
315
+ };
316
+ return res.json(unverifiedResponse);
317
+ }
318
+ const dappPair = env.keyring.addFromAddress(dapp);
319
+ (0, _prosopo_api_express_router.verifySignature)(dappSignature, timestamp.toString(), dappPair);
320
+ const { verified, score } = await tasks.puzzleCaptchaManager.serverVerifyPuzzleCaptchaSolution(dapp, challenge, clientRecord.settings.verifiedTimeout, env, ip, userAccessRulesStorage, email, clientRecord.settings.spamEmailDomainCheckEnabled, clientRecord.settings.trafficFilter, clientRecord.settings.storeMetadata);
321
+ const verificationResponse = tasks.puzzleCaptchaManager.getVerificationResponse(verified, clientRecord, req.i18n.t, score);
322
+ return res.json(verificationResponse);
323
+ } catch (err) {
324
+ req.logger.error(() => ({
325
+ msg: "Error in verifyPuzzleCaptchaSolution",
326
+ err,
327
+ data: { body: req.body }
328
+ }));
329
+ return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
330
+ context: {
331
+ code: 500,
332
+ error: err
333
+ },
334
+ i18n: req.i18n,
335
+ logger: req.logger
336
+ }));
337
+ }
338
+ });
339
+ router.use(_prosopo_api_express_router.handleErrors);
340
+ return router;
383
341
  }
342
+ //#endregion
384
343
  exports.prosopoVerifyRouter = prosopoVerifyRouter;