@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,63 +1,84 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const apiExpressRouter = require("@prosopo/api-express-router");
4
- const types = require("@prosopo/types");
5
- const express = require("express");
6
- const checkSpamEmail = require("./captcha/checkSpamEmail.cjs");
7
- require("./captcha/getFrictionlessCaptchaChallenge.cjs");
8
- const getImageCaptchaChallenge = require("./captcha/getImageCaptchaChallenge.cjs");
9
- const getPoWCaptchaChallenge = require("./captcha/getPoWCaptchaChallenge.cjs");
10
- const getPuzzleCaptchaChallenge = require("./captcha/getPuzzleCaptchaChallenge.cjs");
11
- const submitImageCaptchaSolution = require("./captcha/submitImageCaptchaSolution.cjs");
12
- const submitPoWCaptchaSolution = require("./captcha/submitPoWCaptchaSolution.cjs");
13
- const submitPuzzleCaptchaSolution = require("./captcha/submitPuzzleCaptchaSolution.cjs");
14
- const handler = require("./captcha/getFrictionlessCaptchaChallenge/handler.cjs");
15
- const asyncHandler = (handler2) => (req, res, next) => {
16
- Promise.resolve().then(() => handler2(req, res, next)).catch(next);
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_checkSpamEmail = require("./captcha/checkSpamEmail.cjs");
3
+ const require_handler = require("./captcha/getFrictionlessCaptchaChallenge/handler.cjs");
4
+ const require_getImageCaptchaChallenge = require("./captcha/getImageCaptchaChallenge.cjs");
5
+ const require_getPoWCaptchaChallenge = require("./captcha/getPoWCaptchaChallenge.cjs");
6
+ const require_getPuzzleCaptchaChallenge = require("./captcha/getPuzzleCaptchaChallenge.cjs");
7
+ const require_submitImageCaptchaSolution = require("./captcha/submitImageCaptchaSolution.cjs");
8
+ const require_submitPoWCaptchaSolution = require("./captcha/submitPoWCaptchaSolution.cjs");
9
+ const require_submitPuzzleCaptchaSolution = require("./captcha/submitPuzzleCaptchaSolution.cjs");
10
+ let _prosopo_types = require("@prosopo/types");
11
+ let _prosopo_api_express_router = require("@prosopo/api-express-router");
12
+ let express = require("express");
13
+ express = require_runtime.__toESM(express, 1);
14
+ //#region src/api/captcha.ts
15
+ /**
16
+ * Wraps an async route handler so that any rejection - including synchronous
17
+ * throws (e.g. from validateSiteKey/validateAddr) that become rejected
18
+ * promises inside the async handler - is forwarded to Express's error handler.
19
+ * Without this, Express 4 does not observe the rejection and the request hangs
20
+ * instead of returning the intended 4xx response.
21
+ *
22
+ * The handler is invoked inside `Promise.resolve().then(...)` so that even a
23
+ * truly synchronous throw (from a non-async handler) is captured as a rejected
24
+ * promise and forwarded to `next`, rather than propagating synchronously.
25
+ */
26
+ var asyncHandler = (handler) => (req, res, next) => {
27
+ Promise.resolve().then(() => handler(req, res, next)).catch(next);
17
28
  };
29
+ /**
30
+ * Returns a router connected to the database which can interact with the Proposo protocol
31
+ *
32
+ * @return {Router} - A middleware router that can interact with the Prosopo protocol
33
+ * @param {ProviderEnvironment} env - The Prosopo environment
34
+ */
18
35
  function prosopoRouter(env) {
19
- const router = express.Router();
20
- let userAccessRulesStorage;
21
- try {
22
- userAccessRulesStorage = env.getDb().getUserAccessRulesStorage();
23
- } catch (err) {
24
- env.logger.warn(() => ({
25
- msg: "User access rules storage unavailable; captcha endpoints will skip access-policy checks",
26
- err
27
- }));
28
- userAccessRulesStorage = void 0;
29
- }
30
- router.post(
31
- types.ClientApiPaths.GetImageCaptchaChallenge,
32
- asyncHandler(getImageCaptchaChallenge(env, userAccessRulesStorage))
33
- );
34
- router.post(
35
- types.ClientApiPaths.SubmitImageCaptchaSolution,
36
- asyncHandler(submitImageCaptchaSolution(env))
37
- );
38
- router.post(
39
- types.ClientApiPaths.GetPowCaptchaChallenge,
40
- asyncHandler(getPoWCaptchaChallenge(env, userAccessRulesStorage))
41
- );
42
- router.post(
43
- types.ClientApiPaths.SubmitPowCaptchaSolution,
44
- asyncHandler(submitPoWCaptchaSolution.default(env))
45
- );
46
- router.post(
47
- types.ClientApiPaths.GetFrictionlessCaptchaChallenge,
48
- asyncHandler(handler(env, userAccessRulesStorage))
49
- );
50
- router.post(
51
- types.ClientApiPaths.GetPuzzleCaptchaChallenge,
52
- asyncHandler(getPuzzleCaptchaChallenge(env, userAccessRulesStorage))
53
- );
54
- router.post(
55
- types.ClientApiPaths.SubmitPuzzleCaptchaSolution,
56
- asyncHandler(submitPuzzleCaptchaSolution(env))
57
- );
58
- router.post(types.ClientApiPaths.CheckSpamEmail, asyncHandler(checkSpamEmail(env)));
59
- router.use(apiExpressRouter.handleErrors);
60
- return router;
36
+ const router = express.default.Router();
37
+ let userAccessRulesStorage;
38
+ try {
39
+ userAccessRulesStorage = env.getDb().getUserAccessRulesStorage();
40
+ } catch (err) {
41
+ env.logger.warn(() => ({
42
+ msg: "User access rules storage unavailable; captcha endpoints will skip access-policy checks",
43
+ err
44
+ }));
45
+ userAccessRulesStorage = void 0;
46
+ }
47
+ /**
48
+ * Provides a Captcha puzzle to a Dapp User
49
+ */
50
+ router.post(_prosopo_types.ClientApiPaths.GetImageCaptchaChallenge, asyncHandler(require_getImageCaptchaChallenge.default(env, userAccessRulesStorage)));
51
+ /**
52
+ * Receives solved CAPTCHA challenges from the user, stores to database, and checks against solution commitment
53
+ */
54
+ router.post(_prosopo_types.ClientApiPaths.SubmitImageCaptchaSolution, asyncHandler(require_submitImageCaptchaSolution.default(env)));
55
+ /**
56
+ * Supplies a PoW challenge to a Dapp User
57
+ */
58
+ router.post(_prosopo_types.ClientApiPaths.GetPowCaptchaChallenge, asyncHandler(require_getPoWCaptchaChallenge.default(env, userAccessRulesStorage)));
59
+ /**
60
+ * Verifies a user's PoW solution as being approved or not
61
+ */
62
+ router.post(_prosopo_types.ClientApiPaths.SubmitPowCaptchaSolution, asyncHandler(require_submitPoWCaptchaSolution.default(env)));
63
+ /**
64
+ * Gets a frictionless captcha challenge
65
+ */
66
+ router.post(_prosopo_types.ClientApiPaths.GetFrictionlessCaptchaChallenge, asyncHandler(require_handler.default(env, userAccessRulesStorage)));
67
+ /**
68
+ * Supplies a Puzzle challenge to a Dapp User
69
+ */
70
+ router.post(_prosopo_types.ClientApiPaths.GetPuzzleCaptchaChallenge, asyncHandler(require_getPuzzleCaptchaChallenge.default(env, userAccessRulesStorage)));
71
+ /**
72
+ * Verifies a user's Puzzle solution as being approved or not
73
+ */
74
+ router.post(_prosopo_types.ClientApiPaths.SubmitPuzzleCaptchaSolution, asyncHandler(require_submitPuzzleCaptchaSolution.default(env)));
75
+ /**
76
+ * Checks if an email domain is spam
77
+ */
78
+ router.post(_prosopo_types.ClientApiPaths.CheckSpamEmail, asyncHandler(require_checkSpamEmail.default(env)));
79
+ router.use(_prosopo_api_express_router.handleErrors);
80
+ return router;
61
81
  }
82
+ //#endregion
62
83
  exports.asyncHandler = asyncHandler;
63
84
  exports.prosopoRouter = prosopoRouter;
@@ -1,25 +1,24 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const node_crypto = require("node:crypto");
4
- const EXTENSIONS = ["gif", "png", "webp"];
5
- const buildDnsEventUrl = (sessionId) => {
6
- const subzone = process.env.DNS_EVENT_SUBZONE;
7
- const secret = process.env.DNS_EVENT_HMAC_SECRET;
8
- if (!subzone || !secret) {
9
- return void 0;
10
- }
11
- const path = derivePath(sessionId, secret);
12
- const port = process.env.DNS_EVENT_PORT;
13
- const host = port ? `${sessionId}.${subzone}:${port}` : `${sessionId}.${subzone}`;
14
- return `https://${host}${path}?sid=${sessionId}`;
1
+ let node_crypto = require("node:crypto");
2
+ //#region src/api/dnsEventUrl.ts
3
+ var EXTENSIONS = [
4
+ "gif",
5
+ "png",
6
+ "webp"
7
+ ];
8
+ var buildDnsEventUrl = (sessionId) => {
9
+ const subzone = process.env.DNS_EVENT_SUBZONE;
10
+ const secret = process.env.DNS_EVENT_HMAC_SECRET;
11
+ if (!subzone || !secret) return;
12
+ const path = derivePath(sessionId, secret);
13
+ const port = process.env.DNS_EVENT_PORT;
14
+ return `https://${port ? `${sessionId}.${subzone}:${port}` : `${sessionId}.${subzone}`}${path}?sid=${sessionId}`;
15
15
  };
16
- const derivePath = (sessionId, secret) => {
17
- const mac = node_crypto.createHmac("sha256", secret);
18
- mac.update(sessionId);
19
- const digest = mac.digest();
20
- const name = digest.subarray(0, 8).toString("hex");
21
- const ext = EXTENSIONS[(digest.at(8) ?? 0) % EXTENSIONS.length];
22
- return `/${name}.${ext}`;
16
+ var derivePath = (sessionId, secret) => {
17
+ const mac = (0, node_crypto.createHmac)("sha256", secret);
18
+ mac.update(sessionId);
19
+ const digest = mac.digest();
20
+ return `/${digest.subarray(0, 8).toString("hex")}.${EXTENSIONS[(digest.at(8) ?? 0) % EXTENSIONS.length]}`;
23
21
  };
22
+ //#endregion
24
23
  exports.buildDnsEventUrl = buildDnsEventUrl;
25
24
  exports.derivePath = derivePath;
@@ -1,124 +1,113 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const apiExpressRouter = require("@prosopo/api-express-router");
4
- const common = require("@prosopo/common");
5
- const util = require("@prosopo/util");
6
- const utilCrypto = require("@prosopo/util-crypto");
7
- const zod = require("zod");
8
- require("../tasks/index.cjs");
9
- const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
10
- const metrics = require("./metrics.cjs");
11
- const testSiteKey = require("./testSiteKey.cjs");
12
- const tasks = require("../tasks/tasks.cjs");
13
- const domainMiddleware = (env) => {
14
- let cachedTasks;
15
- return async (req, res, next) => {
16
- try {
17
- if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
18
- req.logger.info(() => ({
19
- msg: "Maintenance mode active - skipping domain validation"
20
- }));
21
- next();
22
- return;
23
- }
24
- if (!cachedTasks) {
25
- cachedTasks = new tasks.Tasks(env);
26
- }
27
- const tasks$1 = cachedTasks;
28
- const siteKey = req.headers["prosopo-site-key"];
29
- if (!siteKey)
30
- throw siteKeyNotRegisteredError(
31
- req.i18n,
32
- "No sitekey provided",
33
- req.logger
34
- );
35
- try {
36
- utilCrypto.validateAddress(siteKey, false, 42);
37
- } catch (err) {
38
- throw invalidSiteKeyError(req.i18n, siteKey, req.logger);
39
- }
40
- if (testSiteKey.isReservedTestSiteKey(siteKey)) {
41
- metrics.recordDomainValidation("test_key");
42
- next();
43
- return;
44
- }
45
- const clientSettings = await tasks$1.db.getClientRecord(siteKey);
46
- if (!clientSettings)
47
- throw siteKeyNotRegisteredError(req.i18n, siteKey, req.logger);
48
- const allowedDomains = clientSettings.settings?.domains;
49
- if (!allowedDomains)
50
- throw siteKeyInvalidDomainError(
51
- req.i18n,
52
- siteKey,
53
- req.hostname,
54
- req.logger
55
- );
56
- const origin = req.headers.origin;
57
- if (!origin)
58
- throw unauthorizedOriginError(req.i18n, void 0, req.logger);
59
- const candidateOrigins = [origin, ...googleTranslateOrigins(origin)];
60
- for (const candidate of candidateOrigins) {
61
- for (const domain of allowedDomains) {
62
- if (tasks$1.clientTaskManager.domainPatternMatcher(candidate, domain)) {
63
- metrics.recordDomainValidation("allowed");
64
- next();
65
- return;
66
- }
67
- }
68
- }
69
- throw unauthorizedOriginError(req.i18n, origin, req.logger);
70
- } catch (err) {
71
- metrics.recordDomainValidation("rejected");
72
- if (err instanceof common.ProsopoApiError || err instanceof zod.ZodError || err instanceof SyntaxError) {
73
- apiExpressRouter.handleErrors(err, req, res, next);
74
- } else {
75
- res.status(401).json({ error: "Unauthorized", message: err });
76
- return;
77
- }
78
- }
79
- };
1
+ const require_metrics = require("./metrics.cjs");
2
+ const require_tasks = require("../tasks/tasks.cjs");
3
+ const require_apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
4
+ const require_testSiteKey = require("./testSiteKey.cjs");
5
+ let _prosopo_common = require("@prosopo/common");
6
+ let _prosopo_util = require("@prosopo/util");
7
+ let _prosopo_util_crypto = require("@prosopo/util-crypto");
8
+ let zod = require("zod");
9
+ let _prosopo_api_express_router = require("@prosopo/api-express-router");
10
+ //#region src/api/domainMiddleware.ts
11
+ var domainMiddleware = (env) => {
12
+ let cachedTasks;
13
+ return async (req, res, next) => {
14
+ try {
15
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
16
+ req.logger.info(() => ({ msg: "Maintenance mode active - skipping domain validation" }));
17
+ next();
18
+ return;
19
+ }
20
+ if (!cachedTasks) cachedTasks = new require_tasks.Tasks(env);
21
+ const tasks = cachedTasks;
22
+ const siteKey = req.headers["prosopo-site-key"];
23
+ if (!siteKey) throw siteKeyNotRegisteredError(req.i18n, "No sitekey provided", req.logger);
24
+ try {
25
+ (0, _prosopo_util_crypto.validateAddress)(siteKey, false, 42);
26
+ } catch (err) {
27
+ throw invalidSiteKeyError(req.i18n, siteKey, req.logger);
28
+ }
29
+ if (require_testSiteKey.isReservedTestSiteKey(siteKey)) {
30
+ require_metrics.recordDomainValidation("test_key");
31
+ next();
32
+ return;
33
+ }
34
+ const clientSettings = await tasks.db.getClientRecord(siteKey);
35
+ if (!clientSettings) throw siteKeyNotRegisteredError(req.i18n, siteKey, req.logger);
36
+ const allowedDomains = clientSettings.settings?.domains;
37
+ if (!allowedDomains) throw siteKeyInvalidDomainError(req.i18n, siteKey, req.hostname, req.logger);
38
+ const origin = req.headers.origin;
39
+ if (!origin) throw unauthorizedOriginError(req.i18n, void 0, req.logger);
40
+ const candidateOrigins = [origin, ...googleTranslateOrigins(origin)];
41
+ for (const candidate of candidateOrigins) for (const domain of allowedDomains) if (tasks.clientTaskManager.domainPatternMatcher(candidate, domain)) {
42
+ require_metrics.recordDomainValidation("allowed");
43
+ next();
44
+ return;
45
+ }
46
+ throw unauthorizedOriginError(req.i18n, origin, req.logger);
47
+ } catch (err) {
48
+ require_metrics.recordDomainValidation("rejected");
49
+ if (err instanceof _prosopo_common.ProsopoApiError || err instanceof zod.ZodError || err instanceof SyntaxError) (0, _prosopo_api_express_router.handleErrors)(err, req, res, next);
50
+ else {
51
+ res.status(401).json({
52
+ error: "Unauthorized",
53
+ message: err
54
+ });
55
+ return;
56
+ }
57
+ }
58
+ };
80
59
  };
81
- const googleTranslateOrigins = (origin) => {
82
- try {
83
- const url = util.parseUrl(origin);
84
- const decodedHost = util.decodeGoogleTranslateHost(url.hostname);
85
- if (!decodedHost) return [];
86
- return [`${url.protocol}//${decodedHost}`];
87
- } catch {
88
- return [];
89
- }
60
+ var googleTranslateOrigins = (origin) => {
61
+ try {
62
+ const url = (0, _prosopo_util.parseUrl)(origin);
63
+ const decodedHost = (0, _prosopo_util.decodeGoogleTranslateHost)(url.hostname);
64
+ if (!decodedHost) return [];
65
+ return [`${url.protocol}//${decodedHost}`];
66
+ } catch {
67
+ return [];
68
+ }
90
69
  };
91
- const siteKeyNotRegisteredError = (i18n, dapp, logger) => {
92
- return new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
93
- context: { code: 400, siteKey: dapp },
94
- i18n,
95
- logger
96
- });
70
+ var siteKeyNotRegisteredError = (i18n, dapp, logger) => {
71
+ return new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
72
+ context: {
73
+ code: 400,
74
+ siteKey: dapp
75
+ },
76
+ i18n,
77
+ logger
78
+ });
97
79
  };
98
- const invalidSiteKeyError = (i18n, siteKey, logger) => {
99
- return new common.ProsopoApiError("API.INVALID_SITE_KEY", {
100
- context: { code: 400, siteKey },
101
- i18n,
102
- logger
103
- });
80
+ var invalidSiteKeyError = (i18n, siteKey, logger) => {
81
+ return new _prosopo_common.ProsopoApiError("API.INVALID_SITE_KEY", {
82
+ context: {
83
+ code: 400,
84
+ siteKey
85
+ },
86
+ i18n,
87
+ logger
88
+ });
104
89
  };
105
- const unauthorizedOriginError = (i18n, origin, logger) => {
106
- return new common.ProsopoApiError("API.UNAUTHORIZED_ORIGIN_URL", {
107
- context: { code: 400, origin },
108
- i18n,
109
- logger
110
- });
90
+ var unauthorizedOriginError = (i18n, origin, logger) => {
91
+ return new _prosopo_common.ProsopoApiError("API.UNAUTHORIZED_ORIGIN_URL", {
92
+ context: {
93
+ code: 400,
94
+ origin
95
+ },
96
+ i18n,
97
+ logger
98
+ });
111
99
  };
112
- const siteKeyInvalidDomainError = (i18n, dapp, domain, logger) => {
113
- return new common.ProsopoApiError("API.UNAUTHORIZED_ORIGIN_URL", {
114
- context: {
115
- code: 400,
116
- message: "No domains are allowed for this site key. Please fix in the Procaptcha Portal",
117
- siteKey: dapp,
118
- domain
119
- },
120
- i18n,
121
- logger
122
- });
100
+ var siteKeyInvalidDomainError = (i18n, dapp, domain, logger) => {
101
+ return new _prosopo_common.ProsopoApiError("API.UNAUTHORIZED_ORIGIN_URL", {
102
+ context: {
103
+ code: 400,
104
+ message: "No domains are allowed for this site key. Please fix in the Procaptcha Portal",
105
+ siteKey: dapp,
106
+ domain
107
+ },
108
+ i18n,
109
+ logger
110
+ });
123
111
  };
112
+ //#endregion
124
113
  exports.domainMiddleware = domainMiddleware;
@@ -1,54 +1,68 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const api = require("@prosopo/api");
4
- const loadBalancer = require("@prosopo/load-balancer");
1
+ let _prosopo_api = require("@prosopo/api");
2
+ let _prosopo_load_balancer = require("@prosopo/load-balancer");
3
+ //#region src/api/forwardVerify.ts
4
+ /**
5
+ * A client can send a verify request to *any* pronode, not necessarily the
6
+ * provider that issued the token. This determines the issuing provider from the
7
+ * `providerUrl` embedded in the token and, when it is a *different* provider to
8
+ * this one, forwards the verification request to it and returns its response —
9
+ * mirroring the AWS Lambda verify endpoint, but running on a provider.
10
+ *
11
+ * Returns `null` when this provider is the issuer (or the issuer cannot be
12
+ * determined), signalling the caller to verify locally as before.
13
+ *
14
+ * @param env - The provider environment
15
+ * @param logger - Request-scoped logger
16
+ * @param path - The verify path to forward to (kept identical, so the issuer
17
+ * routes the request to the correct captcha-type verification)
18
+ * @param providerUrl - The issuing provider url, decoded from the token
19
+ * @param dapp - The site key (used as the `Prosopo-Site-Key` header)
20
+ * @param user - The user account (used as the `Prosopo-User` header)
21
+ * @param body - The original, already-parsed request body, forwarded verbatim
22
+ */
5
23
  function normalizeProviderUrl(url) {
6
- try {
7
- const parsed = new URL(url);
8
- parsed.hostname = parsed.hostname.replace(/^(ipv4|ipv6)\./, "");
9
- return parsed.toString().replace(/\/$/, "");
10
- } catch {
11
- return url.replace(/\/$/, "");
12
- }
24
+ try {
25
+ const parsed = new URL(url);
26
+ parsed.hostname = parsed.hostname.replace(/^(ipv4|ipv6)\./, "");
27
+ return parsed.toString().replace(/\/$/, "");
28
+ } catch {
29
+ return url.replace(/\/$/, "");
30
+ }
13
31
  }
14
32
  async function forwardVerifyIfNotIssuer(args) {
15
- const { env, logger, path, providerUrl, dapp, user, body, alreadyForwarded } = args;
16
- if (alreadyForwarded) {
17
- return null;
18
- }
19
- if (!providerUrl) {
20
- return null;
21
- }
22
- let providers;
23
- try {
24
- providers = await loadBalancer.getProviders(env.defaultEnvironment);
25
- } catch (error) {
26
- logger.warn(() => ({
27
- msg: "Failed to load provider list; verifying locally",
28
- err: error instanceof Error ? error : new Error(String(error)),
29
- data: { providerUrl }
30
- }));
31
- return null;
32
- }
33
- const normalizedProviderUrl = normalizeProviderUrl(providerUrl);
34
- const issuer = providers.find(
35
- (provider) => normalizeProviderUrl(provider.url) === normalizedProviderUrl
36
- );
37
- if (!issuer) {
38
- logger.warn(() => ({
39
- msg: "Token providerUrl is not a known provider; verifying locally",
40
- data: { providerUrl }
41
- }));
42
- return null;
43
- }
44
- if (env.pair?.address && issuer.address === env.pair.address) {
45
- return null;
46
- }
47
- logger.info(() => ({
48
- msg: "Forwarding verify request to issuing provider",
49
- data: { providerUrl, path, dapp }
50
- }));
51
- const providerApi = new api.ProviderApi(issuer.url, dapp);
52
- return providerApi.forwardVerify(path, body, user);
33
+ const { env, logger, path, providerUrl, dapp, user, body, alreadyForwarded } = args;
34
+ if (alreadyForwarded) return null;
35
+ if (!providerUrl) return null;
36
+ let providers;
37
+ try {
38
+ providers = await (0, _prosopo_load_balancer.getProviders)(env.defaultEnvironment);
39
+ } catch (error) {
40
+ logger.warn(() => ({
41
+ msg: "Failed to load provider list; verifying locally",
42
+ err: error instanceof Error ? error : new Error(String(error)),
43
+ data: { providerUrl }
44
+ }));
45
+ return null;
46
+ }
47
+ const normalizedProviderUrl = normalizeProviderUrl(providerUrl);
48
+ const issuer = providers.find((provider) => normalizeProviderUrl(provider.url) === normalizedProviderUrl);
49
+ if (!issuer) {
50
+ logger.warn(() => ({
51
+ msg: "Token providerUrl is not a known provider; verifying locally",
52
+ data: { providerUrl }
53
+ }));
54
+ return null;
55
+ }
56
+ if (env.pair?.address && issuer.address === env.pair.address) return null;
57
+ logger.info(() => ({
58
+ msg: "Forwarding verify request to issuing provider",
59
+ data: {
60
+ providerUrl,
61
+ path,
62
+ dapp
63
+ }
64
+ }));
65
+ return new _prosopo_api.ProviderApi(issuer.url, dapp).forwardVerify(path, body, user);
53
66
  }
67
+ //#endregion
54
68
  exports.forwardVerifyIfNotIssuer = forwardVerifyIfNotIssuer;