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