@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,32 +1,20 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
4
- const blacklistRequestInspector = require("./blacklistRequestInspector.cjs");
5
- const blockMiddleware = (providerEnvironment) => {
6
- let blacklistRequestInspector$1;
7
- const environmentReadinessWaiter = providerEnvironment.isReady.bind(providerEnvironment);
8
- return (req, res, next) => {
9
- if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
10
- return next();
11
- }
12
- if (!blacklistRequestInspector$1) {
13
- try {
14
- const db = providerEnvironment.getDb();
15
- const userAccessRulesStorage = db.getUserAccessRulesStorage();
16
- blacklistRequestInspector$1 = new blacklistRequestInspector.BlacklistRequestInspector(
17
- userAccessRulesStorage,
18
- environmentReadinessWaiter,
19
- db
20
- );
21
- } catch {
22
- return next();
23
- }
24
- }
25
- return blacklistRequestInspector$1.abortRequestForBlockedUsers(
26
- req,
27
- res,
28
- next
29
- );
30
- };
1
+ const require_blacklistRequestInspector = require("./blacklistRequestInspector.cjs");
2
+ const require_apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
3
+ //#region src/api/block.ts
4
+ var blockMiddleware = (providerEnvironment) => {
5
+ let blacklistRequestInspector;
6
+ const environmentReadinessWaiter = providerEnvironment.isReady.bind(providerEnvironment);
7
+ return (req, res, next) => {
8
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) return next();
9
+ if (!blacklistRequestInspector) try {
10
+ const db = providerEnvironment.getDb();
11
+ const userAccessRulesStorage = db.getUserAccessRulesStorage();
12
+ blacklistRequestInspector = new require_blacklistRequestInspector.BlacklistRequestInspector(userAccessRulesStorage, environmentReadinessWaiter, db);
13
+ } catch {
14
+ return next();
15
+ }
16
+ return blacklistRequestInspector.abortRequestForBlockedUsers(req, res, next);
17
+ };
31
18
  };
19
+ //#endregion
32
20
  exports.blockMiddleware = blockMiddleware;
@@ -1,102 +1,92 @@
1
- "use strict";
2
- const common = require("@prosopo/common");
3
- const types = require("@prosopo/types");
4
- const util = require("@prosopo/util");
5
- const zod = require("zod");
6
- require("../../tasks/index.cjs");
7
- const checkSpamEmail$1 = require("../../tasks/spam/checkSpamEmail.cjs");
8
- const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
9
- const metrics = require("../metrics.cjs");
10
- const tasks = require("../../tasks/tasks.cjs");
11
- const CheckSpamEmailRequestBody = zod.object({
12
- email: types.safeLine(types.INPUT_LIMITS.EMAIL),
13
- dapp: types.safeLine(types.INPUT_LIMITS.ID)
1
+ const require_metrics = require("../metrics.cjs");
2
+ const require_checkSpamEmail = require("../../tasks/spam/checkSpamEmail.cjs");
3
+ const require_tasks = require("../../tasks/tasks.cjs");
4
+ const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
5
+ let _prosopo_common = require("@prosopo/common");
6
+ let _prosopo_types = require("@prosopo/types");
7
+ let _prosopo_util = require("@prosopo/util");
8
+ //#region src/api/captcha/checkSpamEmail.ts
9
+ var CheckSpamEmailRequestBody = (0, require("zod").object)({
10
+ email: (0, _prosopo_types.safeLine)(_prosopo_types.INPUT_LIMITS.EMAIL),
11
+ dapp: (0, _prosopo_types.safeLine)(_prosopo_types.INPUT_LIMITS.ID)
14
12
  });
15
- const checkSpamEmail = (env) => async (req, res, next) => {
16
- let email;
17
- let dapp;
18
- try {
19
- ({ email, dapp } = CheckSpamEmailRequestBody.parse(req.body));
20
- } catch (err) {
21
- return next(
22
- new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
23
- context: { code: 400, error: err },
24
- i18n: req.i18n,
25
- logger: req.logger
26
- })
27
- );
28
- }
29
- try {
30
- const emailDomain = util.extractDomainFromEmail(email);
31
- req.logger.info(() => ({
32
- msg: "Check spam email handler entry",
33
- data: {
34
- emailDomain,
35
- path: req.path,
36
- method: req.method
37
- }
38
- }));
39
- if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
40
- req.logger.info(() => ({
41
- msg: "Maintenance mode active - returning isSpam=false",
42
- data: { emailDomain }
43
- }));
44
- return res.json({ isSpam: false, emailDomain });
45
- }
46
- const tasks$1 = new tasks.Tasks(env, req.logger);
47
- const clientRecord = await tasks$1.db.getClientRecord(dapp);
48
- if (!clientRecord) {
49
- return next(
50
- new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
51
- context: { code: 400, siteKey: dapp },
52
- i18n: req.i18n,
53
- logger: req.logger
54
- })
55
- );
56
- }
57
- const valid = clientRecord.settings.spamEmailDomainCheckEnabled;
58
- if (!valid) {
59
- return next(
60
- new common.ProsopoApiError("API.BAD_REQUEST", {
61
- context: {
62
- code: 400,
63
- siteKey: dapp
64
- },
65
- i18n: req.i18n,
66
- logger: req.logger
67
- })
68
- );
69
- }
70
- const isSpam = await checkSpamEmail$1.checkSpamEmail(
71
- email,
72
- tasks$1.db,
73
- env.config,
74
- req.logger
75
- );
76
- req.logger.info(() => ({
77
- msg: "Spam email check result",
78
- data: {
79
- emailDomain,
80
- isSpam
81
- }
82
- }));
83
- metrics.recordSpamEmail(isSpam ? "spam" : "ham");
84
- return res.json({
85
- isSpam,
86
- emailDomain
87
- });
88
- } catch (error) {
89
- req.logger.error(() => ({
90
- msg: "Error in check spam email handler",
91
- error
92
- }));
93
- return next(
94
- new common.ProsopoApiError("API.INTERNAL_SERVER_ERROR", {
95
- context: { code: 500 },
96
- i18n: req.i18n,
97
- logger: req.logger
98
- })
99
- );
100
- }
13
+ var checkSpamEmail_default = (env) => async (req, res, next) => {
14
+ let email;
15
+ let dapp;
16
+ try {
17
+ ({email, dapp} = CheckSpamEmailRequestBody.parse(req.body));
18
+ } catch (err) {
19
+ return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
20
+ context: {
21
+ code: 400,
22
+ error: err
23
+ },
24
+ i18n: req.i18n,
25
+ logger: req.logger
26
+ }));
27
+ }
28
+ try {
29
+ const emailDomain = (0, _prosopo_util.extractDomainFromEmail)(email);
30
+ req.logger.info(() => ({
31
+ msg: "Check spam email handler entry",
32
+ data: {
33
+ emailDomain,
34
+ path: req.path,
35
+ method: req.method
36
+ }
37
+ }));
38
+ if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
39
+ req.logger.info(() => ({
40
+ msg: "Maintenance mode active - returning isSpam=false",
41
+ data: { emailDomain }
42
+ }));
43
+ return res.json({
44
+ isSpam: false,
45
+ emailDomain
46
+ });
47
+ }
48
+ const tasks = new require_tasks.Tasks(env, req.logger);
49
+ const clientRecord = await tasks.db.getClientRecord(dapp);
50
+ if (!clientRecord) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
51
+ context: {
52
+ code: 400,
53
+ siteKey: dapp
54
+ },
55
+ i18n: req.i18n,
56
+ logger: req.logger
57
+ }));
58
+ if (!clientRecord.settings.spamEmailDomainCheckEnabled) return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
59
+ context: {
60
+ code: 400,
61
+ siteKey: dapp
62
+ },
63
+ i18n: req.i18n,
64
+ logger: req.logger
65
+ }));
66
+ const isSpam = await require_checkSpamEmail.checkSpamEmail(email, tasks.db, env.config, req.logger);
67
+ req.logger.info(() => ({
68
+ msg: "Spam email check result",
69
+ data: {
70
+ emailDomain,
71
+ isSpam
72
+ }
73
+ }));
74
+ require_metrics.recordSpamEmail(isSpam ? "spam" : "ham");
75
+ return res.json({
76
+ isSpam,
77
+ emailDomain
78
+ });
79
+ } catch (error) {
80
+ req.logger.error(() => ({
81
+ msg: "Error in check spam email handler",
82
+ error
83
+ }));
84
+ return next(new _prosopo_common.ProsopoApiError("API.INTERNAL_SERVER_ERROR", {
85
+ context: { code: 500 },
86
+ i18n: req.i18n,
87
+ logger: req.logger
88
+ }));
89
+ }
101
90
  };
102
- module.exports = checkSpamEmail;
91
+ //#endregion
92
+ exports.default = checkSpamEmail_default;
@@ -1,20 +1,27 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const types = require("@prosopo/types");
1
+ let _prosopo_types = require("@prosopo/types");
2
+ //#region src/api/captcha/contextAwareValidation.ts
3
+ /**
4
+ * Determines the context type based on the webView flag
5
+ * @param webView - Whether the request is from a WebView
6
+ * @returns The context type (Webview or Default)
7
+ */
4
8
  function determineContextType(webView) {
5
- return webView ? types.ContextType.Webview : types.ContextType.Default;
9
+ return webView ? _prosopo_types.ContextType.Webview : _prosopo_types.ContextType.Default;
6
10
  }
11
+ /**
12
+ * Gets the threshold for a specific context type from client settings
13
+ * @param settings - Client settings
14
+ * @param contextType - The context type to get the threshold for
15
+ * @returns The threshold for the context type, or the global threshold if not configured
16
+ */
7
17
  function getContextThreshold(settings, contextType) {
8
- const contextAware = settings.contextAware;
9
- if (contextAware === void 0) {
10
- return types.contextAwareThresholdDefault;
11
- }
12
- const contexts = contextAware.contexts;
13
- let contextConfig;
14
- if (contexts !== void 0) {
15
- contextConfig = contexts[contextType];
16
- }
17
- return contextConfig?.threshold ?? types.contextAwareThresholdDefault;
18
+ const contextAware = settings.contextAware;
19
+ if (contextAware === void 0) return _prosopo_types.contextAwareThresholdDefault;
20
+ const contexts = contextAware.contexts;
21
+ let contextConfig;
22
+ if (contexts !== void 0) contextConfig = contexts[contextType];
23
+ return contextConfig?.threshold ?? _prosopo_types.contextAwareThresholdDefault;
18
24
  }
25
+ //#endregion
19
26
  exports.determineContextType = determineContextType;
20
27
  exports.getContextThreshold = getContextThreshold;
@@ -1,142 +1,127 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const types = require("@prosopo/types");
4
- require("../../../tasks/frictionless/frictionlessTasks.cjs");
5
- const honeypotResponse = require("./honeypotResponse.cjs");
6
- const handleAccessPolicy = async (input, res) => {
7
- if (!input.userAccessPolicy) {
8
- return {
9
- handled: false,
10
- botScore: input.botScore,
11
- scoreComponents: input.scoreComponents
12
- };
13
- }
14
- const { tasks, clientRecord, userAccessPolicy, logger } = input;
15
- logger.info(() => ({
16
- msg: "User access policy matched",
17
- data: {
18
- policy: userAccessPolicy,
19
- captchaType: userAccessPolicy.captchaType,
20
- userScope: input.userScope
21
- }
22
- }));
23
- const scoreUpdate = tasks.frictionlessManager.scoreIncreaseAccessPolicy(
24
- userAccessPolicy,
25
- input.baseBotScore,
26
- input.botScore,
27
- input.scoreComponents
28
- );
29
- const botScore = scoreUpdate.score;
30
- const scoreComponents = scoreUpdate.scoreComponents;
31
- tasks.frictionlessManager.updateScore(botScore, scoreComponents);
32
- if (userAccessPolicy.type === "block") {
33
- logger.info(() => ({
34
- msg: "Frictionless decision",
35
- data: {
36
- decision: "block",
37
- captchaType: types.CaptchaType.image
38
- }
39
- }));
40
- await tasks.frictionlessManager.registerBlockedSession({
41
- solvedImagesCount: clientRecord.settings.imageMaxRounds,
42
- userSitekeyIpHash: input.userSitekeyIpHash,
43
- reason: types.FrictionlessReason.ACCESS_POLICY_BLOCK,
44
- siteKey: input.dapp,
45
- ipInfo: input.ipInfo,
46
- headers: input.flatHeaders
47
- });
48
- return {
49
- handled: true,
50
- response: res.status(401).json({ error: "Unauthorized" })
51
- };
52
- }
53
- const autoBanThreshold = clientRecord.settings.autoBanScoreThreshold;
54
- if (autoBanThreshold !== void 0 && Number(botScore) >= autoBanThreshold) {
55
- logger.info(() => ({
56
- msg: "Frictionless decision",
57
- data: {
58
- decision: "auto_ban_score",
59
- botScore,
60
- autoBanThreshold,
61
- captchaType: userAccessPolicy.captchaType
62
- }
63
- }));
64
- await tasks.frictionlessManager.registerBlockedSession({
65
- solvedImagesCount: clientRecord.settings.imageMaxRounds,
66
- userSitekeyIpHash: input.userSitekeyIpHash,
67
- reason: types.FrictionlessReason.AUTO_BAN_SCORE,
68
- siteKey: input.dapp,
69
- ipInfo: input.ipInfo,
70
- headers: input.flatHeaders
71
- });
72
- return {
73
- handled: true,
74
- response: res.status(401).json({ error: "Unauthorized" })
75
- };
76
- }
77
- const captchaTypeBaseParams = {
78
- userSitekeyIpHash: input.userSitekeyIpHash,
79
- reason: types.FrictionlessReason.USER_ACCESS_POLICY,
80
- siteKey: input.dapp,
81
- ipInfo: input.ipInfo,
82
- headers: input.flatHeaders
83
- };
84
- if (userAccessPolicy.captchaType === types.CaptchaType.image) {
85
- logger.info(() => ({
86
- msg: "Frictionless decision",
87
- data: {
88
- decision: "user_access_policy",
89
- captchaType: types.CaptchaType.image
90
- }
91
- }));
92
- honeypotResponse.attachHoneypot(res, clientRecord);
93
- return {
94
- handled: true,
95
- response: res.json(
96
- await tasks.frictionlessManager.sendImageCaptcha({
97
- ...captchaTypeBaseParams,
98
- solvedImagesCount: userAccessPolicy.solvedImagesCount ? Math.min(
99
- userAccessPolicy.solvedImagesCount,
100
- clientRecord.settings.imageMaxRounds
101
- ) : clientRecord.settings.imageMaxRounds
102
- })
103
- )
104
- };
105
- }
106
- if (userAccessPolicy.captchaType === types.CaptchaType.pow) {
107
- logger.info(() => ({
108
- msg: "Frictionless decision",
109
- data: {
110
- decision: "user_access_policy",
111
- captchaType: types.CaptchaType.pow
112
- }
113
- }));
114
- honeypotResponse.attachHoneypot(res, clientRecord);
115
- return {
116
- handled: true,
117
- response: res.json(
118
- await tasks.frictionlessManager.sendPowCaptcha(captchaTypeBaseParams)
119
- )
120
- };
121
- }
122
- if (userAccessPolicy.captchaType === types.CaptchaType.puzzle) {
123
- logger.info(() => ({
124
- msg: "Frictionless decision",
125
- data: {
126
- decision: "user_access_policy",
127
- captchaType: types.CaptchaType.puzzle
128
- }
129
- }));
130
- honeypotResponse.attachHoneypot(res, clientRecord);
131
- return {
132
- handled: true,
133
- response: res.json(
134
- await tasks.frictionlessManager.sendPuzzleCaptcha(
135
- captchaTypeBaseParams
136
- )
137
- )
138
- };
139
- }
140
- return { handled: false, botScore, scoreComponents };
1
+ const require_honeypotResponse = require("./honeypotResponse.cjs");
2
+ let _prosopo_types = require("@prosopo/types");
3
+ //#region src/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.ts
4
+ var handleAccessPolicy = async (input, res) => {
5
+ if (!input.userAccessPolicy) return {
6
+ handled: false,
7
+ botScore: input.botScore,
8
+ scoreComponents: input.scoreComponents
9
+ };
10
+ const { tasks, clientRecord, userAccessPolicy, logger } = input;
11
+ logger.info(() => ({
12
+ msg: "User access policy matched",
13
+ data: {
14
+ policy: userAccessPolicy,
15
+ captchaType: userAccessPolicy.captchaType,
16
+ userScope: input.userScope
17
+ }
18
+ }));
19
+ const scoreUpdate = tasks.frictionlessManager.scoreIncreaseAccessPolicy(userAccessPolicy, input.baseBotScore, input.botScore, input.scoreComponents);
20
+ const botScore = scoreUpdate.score;
21
+ const scoreComponents = scoreUpdate.scoreComponents;
22
+ tasks.frictionlessManager.updateScore(botScore, scoreComponents);
23
+ if (userAccessPolicy.type === "block") {
24
+ logger.info(() => ({
25
+ msg: "Frictionless decision",
26
+ data: {
27
+ decision: "block",
28
+ captchaType: _prosopo_types.CaptchaType.image
29
+ }
30
+ }));
31
+ await tasks.frictionlessManager.registerBlockedSession({
32
+ solvedImagesCount: clientRecord.settings.imageMaxRounds,
33
+ userSitekeyIpHash: input.userSitekeyIpHash,
34
+ reason: _prosopo_types.FrictionlessReason.ACCESS_POLICY_BLOCK,
35
+ siteKey: input.dapp,
36
+ ipInfo: input.ipInfo,
37
+ headers: input.flatHeaders
38
+ });
39
+ return {
40
+ handled: true,
41
+ response: res.status(401).json({ error: "Unauthorized" })
42
+ };
43
+ }
44
+ const autoBanThreshold = clientRecord.settings.autoBanScoreThreshold;
45
+ if (autoBanThreshold !== void 0 && Number(botScore) >= autoBanThreshold) {
46
+ logger.info(() => ({
47
+ msg: "Frictionless decision",
48
+ data: {
49
+ decision: "auto_ban_score",
50
+ botScore,
51
+ autoBanThreshold,
52
+ captchaType: userAccessPolicy.captchaType
53
+ }
54
+ }));
55
+ await tasks.frictionlessManager.registerBlockedSession({
56
+ solvedImagesCount: clientRecord.settings.imageMaxRounds,
57
+ userSitekeyIpHash: input.userSitekeyIpHash,
58
+ reason: _prosopo_types.FrictionlessReason.AUTO_BAN_SCORE,
59
+ siteKey: input.dapp,
60
+ ipInfo: input.ipInfo,
61
+ headers: input.flatHeaders
62
+ });
63
+ return {
64
+ handled: true,
65
+ response: res.status(401).json({ error: "Unauthorized" })
66
+ };
67
+ }
68
+ const captchaTypeBaseParams = {
69
+ userSitekeyIpHash: input.userSitekeyIpHash,
70
+ reason: _prosopo_types.FrictionlessReason.USER_ACCESS_POLICY,
71
+ siteKey: input.dapp,
72
+ ipInfo: input.ipInfo,
73
+ headers: input.flatHeaders
74
+ };
75
+ if (userAccessPolicy.captchaType === _prosopo_types.CaptchaType.image) {
76
+ logger.info(() => ({
77
+ msg: "Frictionless decision",
78
+ data: {
79
+ decision: "user_access_policy",
80
+ captchaType: _prosopo_types.CaptchaType.image
81
+ }
82
+ }));
83
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
84
+ return {
85
+ handled: true,
86
+ response: res.json(await tasks.frictionlessManager.sendImageCaptcha({
87
+ ...captchaTypeBaseParams,
88
+ solvedImagesCount: userAccessPolicy.solvedImagesCount ? Math.min(userAccessPolicy.solvedImagesCount, clientRecord.settings.imageMaxRounds) : clientRecord.settings.imageMaxRounds
89
+ }))
90
+ };
91
+ }
92
+ if (userAccessPolicy.captchaType === _prosopo_types.CaptchaType.pow) {
93
+ logger.info(() => ({
94
+ msg: "Frictionless decision",
95
+ data: {
96
+ decision: "user_access_policy",
97
+ captchaType: _prosopo_types.CaptchaType.pow
98
+ }
99
+ }));
100
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
101
+ return {
102
+ handled: true,
103
+ response: res.json(await tasks.frictionlessManager.sendPowCaptcha(captchaTypeBaseParams))
104
+ };
105
+ }
106
+ if (userAccessPolicy.captchaType === _prosopo_types.CaptchaType.puzzle) {
107
+ logger.info(() => ({
108
+ msg: "Frictionless decision",
109
+ data: {
110
+ decision: "user_access_policy",
111
+ captchaType: _prosopo_types.CaptchaType.puzzle
112
+ }
113
+ }));
114
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
115
+ return {
116
+ handled: true,
117
+ response: res.json(await tasks.frictionlessManager.sendPuzzleCaptcha(captchaTypeBaseParams))
118
+ };
119
+ }
120
+ return {
121
+ handled: false,
122
+ botScore,
123
+ scoreComponents
124
+ };
141
125
  };
126
+ //#endregion
142
127
  exports.handleAccessPolicy = handleAccessPolicy;
@@ -1,13 +1,13 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const DEFAULT_FRICTIONLESS_THRESHOLD = 0.5;
4
- const getRoundsFromSimScore = (simScore) => {
5
- if (simScore >= 0.9) return 0;
6
- if (simScore >= 0.8) return 3;
7
- if (simScore >= 0.7) return 4;
8
- if (simScore >= 0.6) return 6;
9
- if (simScore >= 0.5) return 7;
10
- return 8;
1
+ //#region src/api/captcha/getFrictionlessCaptchaChallenge/constants.ts
2
+ var DEFAULT_FRICTIONLESS_THRESHOLD = .5;
3
+ var getRoundsFromSimScore = (simScore) => {
4
+ if (simScore >= .9) return 0;
5
+ if (simScore >= .8) return 3;
6
+ if (simScore >= .7) return 4;
7
+ if (simScore >= .6) return 6;
8
+ if (simScore >= .5) return 7;
9
+ return 8;
11
10
  };
11
+ //#endregion
12
12
  exports.DEFAULT_FRICTIONLESS_THRESHOLD = DEFAULT_FRICTIONLESS_THRESHOLD;
13
13
  exports.getRoundsFromSimScore = getRoundsFromSimScore;