@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,201 +1,132 @@
1
- "use strict";
2
- const common = require("@prosopo/common");
3
- const types = require("@prosopo/types");
4
- const util = require("@prosopo/util");
5
- const compositeIpAddress = require("../../compositeIpAddress.cjs");
6
- require("../../tasks/index.cjs");
7
- const normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
8
- const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
9
- const blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
10
- const metrics = require("../metrics.cjs");
11
- const validateAddress = require("../validateAddress.cjs");
12
- const maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
13
- const tasks = require("../../tasks/tasks.cjs");
14
- const getPoWCaptchaChallenge = (env, userAccessRulesStorage) => async (req, res, next) => {
15
- let parsed;
16
- try {
17
- parsed = types.GetPowCaptchaChallengeRequestBody.parse(req.body);
18
- } catch (err) {
19
- return next(
20
- new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
21
- context: { code: 400, error: err },
22
- i18n: req.i18n,
23
- logger: req.logger
24
- })
25
- );
26
- }
27
- const { user, dapp, sessionId, simdReadings } = parsed;
28
- validateAddress.validateSiteKey(dapp);
29
- validateAddress.validateAddr(user);
30
- if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
31
- req.logger.info(() => ({
32
- msg: "Maintenance mode active - returning dummy PoW challenge",
33
- data: { dapp, user, sessionId }
34
- }));
35
- return res.json(maintenanceModeResponses.buildPowMaintenanceResponse(user, dapp));
36
- }
37
- const tasks$1 = new tasks.Tasks(env, req.logger);
38
- try {
39
- const clientSettings = await tasks$1.db.getClientRecord(dapp);
40
- if (!clientSettings) {
41
- return next(
42
- new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
43
- context: { code: 400, siteKey: dapp },
44
- i18n: req.i18n,
45
- logger: req.logger
46
- })
47
- );
48
- }
49
- const normalizedIp = normalizeRequestIp.normalizeRequestIp(req.ip, req.logger);
50
- if (!normalizedIp) {
51
- req.logger.warn(() => ({
52
- msg: "Request missing IP; geoblocking will be skipped"
53
- }));
54
- }
55
- const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
56
- const asn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
57
- const userScope = blacklistRequestInspector.getRequestUserScope(
58
- util.flatten(req.headers),
59
- req.ja4,
60
- normalizedIp,
61
- user,
62
- void 0,
63
- // headHash
64
- void 0,
65
- // coords
66
- countryCode,
67
- asn
68
- );
69
- const userAccessPolicy = (await tasks$1.powCaptchaManager.getPrioritisedAccessPolicies(
70
- userAccessRulesStorage,
71
- dapp,
72
- userScope
73
- )).find((p) => !p.deferToVerify);
74
- const {
75
- valid,
76
- reason,
77
- sessionId: validSessionId,
78
- powDifficulty
79
- } = await tasks$1.powCaptchaManager.isValidRequest(
80
- clientSettings,
81
- types.CaptchaType.pow,
82
- env,
83
- sessionId,
84
- userAccessPolicy,
85
- normalizedIp
86
- );
87
- if (!valid) {
88
- return next(
89
- new common.ProsopoApiError(reason || "API.BAD_REQUEST", {
90
- context: {
91
- code: 400,
92
- siteKey: dapp,
93
- user
94
- },
95
- i18n: req.i18n,
96
- logger: req.logger
97
- })
98
- );
99
- }
100
- const origin = req.headers.origin;
101
- if (!origin) {
102
- return next(
103
- new common.ProsopoApiError("API.BAD_REQUEST", {
104
- context: {
105
- error: "Origin header not found",
106
- code: 400,
107
- siteKey: dapp,
108
- user
109
- },
110
- i18n: req.i18n,
111
- logger: req.logger
112
- })
113
- );
114
- }
115
- const difficulty = powDifficulty || userAccessPolicy?.powDifficulty || clientSettings?.settings?.powDifficulty;
116
- const challenge = await tasks$1.powCaptchaManager.getPowCaptchaChallenge(
117
- user,
118
- dapp,
119
- origin,
120
- difficulty
121
- );
122
- if (validSessionId && simdReadings) {
123
- await tasks$1.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(
124
- validSessionId,
125
- simdReadings,
126
- types.SimdReadingsStage.challenge
127
- ).catch((updateErr) => {
128
- req.logger.warn(() => ({
129
- err: updateErr,
130
- msg: "Failed to patch session with SIMD readings on PoW challenge"
131
- }));
132
- });
133
- }
134
- await tasks$1.db.storePowCaptchaRecord(
135
- challenge.challenge,
136
- {
137
- requestedAtTimestamp: challenge.requestedAtTimestamp,
138
- userAccount: user,
139
- dappAccount: dapp
140
- },
141
- challenge.difficulty,
142
- challenge.providerSignature,
143
- compositeIpAddress.getCompositeIpAddress(normalizedIp),
144
- util.flatten(req.headers),
145
- req.ja4,
146
- validSessionId,
147
- void 0,
148
- void 0,
149
- void 0,
150
- // Persist the full ipinfo payload — consumers (portal,
151
- // anomaly detection, CHECK_IP_INFO backfill) read the
152
- // individual flags off this object instead of separate
153
- // flat fields.
154
- req.ipInfo
155
- );
156
- const getPowCaptchaResponse = {
157
- [types.ApiParams.status]: "ok",
158
- [types.ApiParams.challenge]: challenge.challenge,
159
- [types.ApiParams.difficulty]: challenge.difficulty,
160
- [types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
161
- [types.ApiParams.signature]: {
162
- [types.ApiParams.provider]: {
163
- [types.ApiParams.challenge]: challenge.providerSignature
164
- }
165
- }
166
- };
167
- req.logger.info(() => ({
168
- msg: "PoW captcha challenge issued",
169
- data: {
170
- captchaType: types.CaptchaType.pow,
171
- challenge: challenge.challenge,
172
- difficulty: challenge.difficulty,
173
- user,
174
- dapp,
175
- session: sessionId
176
- }
177
- }));
178
- metrics.recordCaptchaIssued(types.CaptchaType.pow);
179
- return res.json(getPowCaptchaResponse);
180
- } catch (err) {
181
- metrics.recordCaptchaIssueError(types.CaptchaType.pow);
182
- req.logger.error(() => ({
183
- err,
184
- body: req.body,
185
- msg: "Error in PoW captcha challenge request"
186
- }));
187
- return next(
188
- new common.ProsopoApiError("API.BAD_REQUEST", {
189
- context: {
190
- code: 500,
191
- siteKey: req.body.dapp,
192
- user: req.body.user,
193
- error: err
194
- },
195
- i18n: req.i18n,
196
- logger: req.logger
197
- })
198
- );
199
- }
1
+ const require_validateAddress = require("../validateAddress.cjs");
2
+ const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
3
+ const require_metrics = require("../metrics.cjs");
4
+ const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
5
+ const require_tasks = require("../../tasks/tasks.cjs");
6
+ const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
7
+ const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
8
+ const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
9
+ let _prosopo_common = require("@prosopo/common");
10
+ let _prosopo_types = require("@prosopo/types");
11
+ let _prosopo_util = require("@prosopo/util");
12
+ //#region src/api/captcha/getPoWCaptchaChallenge.ts
13
+ var getPoWCaptchaChallenge_default = (env, userAccessRulesStorage) => async (req, res, next) => {
14
+ let parsed;
15
+ try {
16
+ parsed = _prosopo_types.GetPowCaptchaChallengeRequestBody.parse(req.body);
17
+ } catch (err) {
18
+ return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
19
+ context: {
20
+ code: 400,
21
+ error: err
22
+ },
23
+ i18n: req.i18n,
24
+ logger: req.logger
25
+ }));
26
+ }
27
+ const { user, dapp, sessionId, simdReadings } = parsed;
28
+ require_validateAddress.validateSiteKey(dapp);
29
+ require_validateAddress.validateAddr(user);
30
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
31
+ req.logger.info(() => ({
32
+ msg: "Maintenance mode active - returning dummy PoW challenge",
33
+ data: {
34
+ dapp,
35
+ user,
36
+ sessionId
37
+ }
38
+ }));
39
+ return res.json(require_maintenanceModeResponses.buildPowMaintenanceResponse(user, dapp));
40
+ }
41
+ const tasks = new require_tasks.Tasks(env, req.logger);
42
+ try {
43
+ const clientSettings = await tasks.db.getClientRecord(dapp);
44
+ if (!clientSettings) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
45
+ context: {
46
+ code: 400,
47
+ siteKey: dapp
48
+ },
49
+ i18n: req.i18n,
50
+ logger: req.logger
51
+ }));
52
+ const normalizedIp = require_normalizeRequestIp.normalizeRequestIp(req.ip, req.logger);
53
+ if (!normalizedIp) req.logger.warn(() => ({ msg: "Request missing IP; geoblocking will be skipped" }));
54
+ const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
55
+ const asn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
56
+ const userScope = require_blacklistRequestInspector.getRequestUserScope((0, _prosopo_util.flatten)(req.headers), req.ja4, normalizedIp, user, void 0, void 0, countryCode, asn);
57
+ const userAccessPolicy = (await tasks.powCaptchaManager.getPrioritisedAccessPolicies(userAccessRulesStorage, dapp, userScope)).find((p) => !p.deferToVerify);
58
+ const { valid, reason, sessionId: validSessionId, powDifficulty } = await tasks.powCaptchaManager.isValidRequest(clientSettings, _prosopo_types.CaptchaType.pow, env, sessionId, userAccessPolicy, normalizedIp);
59
+ if (!valid) return next(new _prosopo_common.ProsopoApiError(reason || "API.BAD_REQUEST", {
60
+ context: {
61
+ code: 400,
62
+ siteKey: dapp,
63
+ user
64
+ },
65
+ i18n: req.i18n,
66
+ logger: req.logger
67
+ }));
68
+ const origin = req.headers.origin;
69
+ if (!origin) return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
70
+ context: {
71
+ error: "Origin header not found",
72
+ code: 400,
73
+ siteKey: dapp,
74
+ user
75
+ },
76
+ i18n: req.i18n,
77
+ logger: req.logger
78
+ }));
79
+ const difficulty = powDifficulty || userAccessPolicy?.powDifficulty || clientSettings?.settings?.powDifficulty;
80
+ const challenge = await tasks.powCaptchaManager.getPowCaptchaChallenge(user, dapp, origin, difficulty);
81
+ if (validSessionId && simdReadings) await tasks.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(validSessionId, simdReadings, _prosopo_types.SimdReadingsStage.challenge).catch((updateErr) => {
82
+ req.logger.warn(() => ({
83
+ err: updateErr,
84
+ msg: "Failed to patch session with SIMD readings on PoW challenge"
85
+ }));
86
+ });
87
+ await tasks.db.storePowCaptchaRecord(challenge.challenge, {
88
+ requestedAtTimestamp: challenge.requestedAtTimestamp,
89
+ userAccount: user,
90
+ dappAccount: dapp
91
+ }, challenge.difficulty, challenge.providerSignature, require_compositeIpAddress.getCompositeIpAddress(normalizedIp), (0, _prosopo_util.flatten)(req.headers), req.ja4, validSessionId, void 0, void 0, void 0, req.ipInfo);
92
+ const getPowCaptchaResponse = {
93
+ [_prosopo_types.ApiParams.status]: "ok",
94
+ [_prosopo_types.ApiParams.challenge]: challenge.challenge,
95
+ [_prosopo_types.ApiParams.difficulty]: challenge.difficulty,
96
+ [_prosopo_types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
97
+ [_prosopo_types.ApiParams.signature]: { [_prosopo_types.ApiParams.provider]: { [_prosopo_types.ApiParams.challenge]: challenge.providerSignature } }
98
+ };
99
+ req.logger.info(() => ({
100
+ msg: "PoW captcha challenge issued",
101
+ data: {
102
+ captchaType: _prosopo_types.CaptchaType.pow,
103
+ challenge: challenge.challenge,
104
+ difficulty: challenge.difficulty,
105
+ user,
106
+ dapp,
107
+ session: sessionId
108
+ }
109
+ }));
110
+ require_metrics.recordCaptchaIssued(_prosopo_types.CaptchaType.pow);
111
+ return res.json(getPowCaptchaResponse);
112
+ } catch (err) {
113
+ require_metrics.recordCaptchaIssueError(_prosopo_types.CaptchaType.pow);
114
+ req.logger.error(() => ({
115
+ err,
116
+ body: req.body,
117
+ msg: "Error in PoW captcha challenge request"
118
+ }));
119
+ return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
120
+ context: {
121
+ code: 500,
122
+ siteKey: req.body.dapp,
123
+ user: req.body.user,
124
+ error: err
125
+ },
126
+ i18n: req.i18n,
127
+ logger: req.logger
128
+ }));
129
+ }
200
130
  };
201
- module.exports = getPoWCaptchaChallenge;
131
+ //#endregion
132
+ exports.default = getPoWCaptchaChallenge_default;