@prosopo/provider 4.15.14 → 4.15.16

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 +63 -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,305 +1,242 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const common = require("@prosopo/common");
4
- const types = require("@prosopo/types");
5
- const util = require("@prosopo/util");
6
- const frictionlessTasks = require("../../../tasks/frictionless/frictionlessTasks.cjs");
7
- const frictionlessTasksUtils = require("../../../tasks/frictionless/frictionlessTasksUtils.cjs");
8
- const hashUserAgent = require("../../../utils/hashUserAgent.cjs");
9
- const metrics = require("../../metrics.cjs");
10
- const contextAwareValidation = require("../contextAwareValidation.cjs");
11
- const constants = require("./constants.cjs");
12
- const honeypotResponse = require("./honeypotResponse.cjs");
13
- const runDecisionMachine = async (input, handle) => {
14
- const {
15
- tasks,
16
- env,
17
- clientRecord,
18
- dapp,
19
- userSitekeyIpHash,
20
- flatHeaders,
21
- ipInfo
22
- } = input;
23
- const { req, res } = handle;
24
- let { botScore, scoreComponents } = input;
25
- const userAgentMismatchResponse = await runUserAgentMismatchCheck(
26
- input,
27
- handle
28
- );
29
- if (userAgentMismatchResponse) return userAgentMismatchResponse;
30
- const contextResponse = await runContextAwareValidation(input, handle);
31
- if (contextResponse) return contextResponse;
32
- const webViewTripped = clientRecord.settings.disallowWebView === true && input.webView === true;
33
- if (webViewTripped) {
34
- tasks.logger.info(() => ({ msg: "WebView detected" }));
35
- const scoreUpdate = tasks.frictionlessManager.scoreIncreaseWebView(
36
- input.baseBotScore,
37
- botScore,
38
- scoreComponents
39
- );
40
- botScore = scoreUpdate.score;
41
- scoreComponents = scoreUpdate.scoreComponents;
42
- tasks.frictionlessManager.updateScore(botScore, scoreComponents);
43
- }
44
- const timestampTripped = frictionlessTasks.FrictionlessManager.timestampTooOld(input.timestamp);
45
- if (timestampTripped) {
46
- const scoreUpdate = tasks.frictionlessManager.scoreIncreaseTimestamp(
47
- input.timestamp,
48
- input.baseBotScore,
49
- botScore,
50
- scoreComponents
51
- );
52
- botScore = scoreUpdate.score;
53
- scoreComponents = scoreUpdate.scoreComponents;
54
- tasks.frictionlessManager.updateScore(botScore, scoreComponents);
55
- }
56
- const autoBanThreshold = clientRecord.settings.autoBanScoreThreshold;
57
- if (autoBanThreshold !== void 0 && Number(botScore) >= autoBanThreshold) {
58
- req.logger.info(() => ({
59
- msg: "Frictionless decision",
60
- data: {
61
- decision: "auto_ban_score",
62
- botScore,
63
- autoBanThreshold,
64
- token: input.token
65
- }
66
- }));
67
- metrics.recordFrictionlessDecision("auto_ban_score");
68
- await tasks.frictionlessManager.registerBlockedSession({
69
- solvedImagesCount: clientRecord.settings.imageMaxRounds,
70
- userSitekeyIpHash,
71
- reason: types.FrictionlessReason.AUTO_BAN_SCORE,
72
- siteKey: dapp,
73
- ipInfo,
74
- headers: flatHeaders
75
- });
76
- return res.status(401).json({ error: "Unauthorized" });
77
- }
78
- if (webViewTripped) {
79
- req.logger.info(() => ({
80
- msg: "Frictionless decision",
81
- data: {
82
- decision: "webview_detected",
83
- captchaType: types.CaptchaType.image
84
- }
85
- }));
86
- metrics.recordFrictionlessDecision("webview_detected");
87
- honeypotResponse.attachHoneypot(res, clientRecord);
88
- return res.json(
89
- await tasks.frictionlessManager.sendImageCaptcha({
90
- solvedImagesCount: Math.min(
91
- env.config.captchas.solved.count * 2,
92
- clientRecord.settings.imageMaxRounds
93
- ),
94
- userSitekeyIpHash,
95
- reason: types.FrictionlessReason.WEBVIEW_DETECTED,
96
- siteKey: dapp,
97
- ipInfo,
98
- headers: flatHeaders
99
- })
100
- );
101
- }
102
- if (timestampTripped) {
103
- req.logger.info(() => ({
104
- msg: "Frictionless decision",
105
- data: {
106
- decision: "timestamp_too_old",
107
- captchaType: types.CaptchaType.image
108
- }
109
- }));
110
- metrics.recordFrictionlessDecision("timestamp_too_old");
111
- honeypotResponse.attachHoneypot(res, clientRecord);
112
- return res.json(
113
- await tasks.frictionlessManager.sendImageCaptcha({
114
- solvedImagesCount: frictionlessTasksUtils.timestampDecayFunction(
115
- input.timestamp,
116
- input.decryptionFailed,
117
- clientRecord.settings.imageMaxRounds
118
- ),
119
- userSitekeyIpHash,
120
- reason: types.FrictionlessReason.OLD_TIMESTAMP,
121
- siteKey: dapp,
122
- ipInfo,
123
- headers: flatHeaders
124
- })
125
- );
126
- }
127
- if (Number(botScore) > input.botThreshold) {
128
- req.logger.info(() => ({
129
- msg: "Bot score is greater than threshold",
130
- data: {
131
- botScore,
132
- botThreshold: input.botThreshold,
133
- token: input.token
134
- }
135
- }));
136
- req.logger.info(() => ({
137
- msg: "Frictionless decision",
138
- data: {
139
- decision: "bot_score_above_threshold",
140
- captchaType: types.CaptchaType.image
141
- }
142
- }));
143
- metrics.recordFrictionlessDecision("bot_score_above_threshold");
144
- honeypotResponse.attachHoneypot(res, clientRecord);
145
- return res.json(
146
- await tasks.frictionlessManager.sendImageCaptcha({
147
- solvedImagesCount: Math.min(
148
- env.config.captchas.solved.count,
149
- clientRecord.settings.imageMaxRounds
150
- ),
151
- userSitekeyIpHash,
152
- reason: types.FrictionlessReason.BOT_SCORE_ABOVE_THRESHOLD,
153
- siteKey: dapp,
154
- ipInfo,
155
- headers: flatHeaders
156
- })
157
- );
158
- }
159
- if (!input.currentUrl) {
160
- req.logger.info(() => ({
161
- msg: "Frictionless decision",
162
- data: {
163
- decision: "missing_current_url",
164
- captchaType: types.CaptchaType.image,
165
- token: input.token
166
- }
167
- }));
168
- metrics.recordFrictionlessDecision("missing_current_url");
169
- honeypotResponse.attachHoneypot(res, clientRecord);
170
- return res.json(
171
- await tasks.frictionlessManager.sendImageCaptcha({
172
- solvedImagesCount: Math.min(
173
- env.config.captchas.solved.count,
174
- clientRecord.settings.imageMaxRounds
175
- ),
176
- userSitekeyIpHash,
177
- reason: types.FrictionlessReason.MISSING_CURRENT_URL,
178
- siteKey: dapp,
179
- ipInfo,
180
- headers: flatHeaders
181
- })
182
- );
183
- }
184
- req.logger.info(() => ({
185
- msg: "Frictionless decision",
186
- data: {
187
- decision: "default_pow",
188
- captchaType: types.CaptchaType.pow
189
- }
190
- }));
191
- metrics.recordFrictionlessDecision("default_pow");
192
- honeypotResponse.attachHoneypot(res, clientRecord);
193
- return res.json(
194
- await tasks.frictionlessManager.sendPowCaptcha({
195
- userSitekeyIpHash,
196
- siteKey: dapp,
197
- ipInfo,
198
- headers: flatHeaders
199
- })
200
- );
1
+ const require_metrics = require("../../metrics.cjs");
2
+ const require_frictionlessTasks = require("../../../tasks/frictionless/frictionlessTasks.cjs");
3
+ const require_frictionlessTasksUtils = require("../../../tasks/frictionless/frictionlessTasksUtils.cjs");
4
+ const require_hashUserAgent = require("../../../utils/hashUserAgent.cjs");
5
+ const require_honeypotResponse = require("./honeypotResponse.cjs");
6
+ const require_constants = require("./constants.cjs");
7
+ const require_contextAwareValidation = require("../contextAwareValidation.cjs");
8
+ let _prosopo_common = require("@prosopo/common");
9
+ let _prosopo_types = require("@prosopo/types");
10
+ let _prosopo_util = require("@prosopo/util");
11
+ //#region src/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.ts
12
+ var runDecisionMachine = async (input, handle) => {
13
+ const { tasks, env, clientRecord, dapp, userSitekeyIpHash, flatHeaders, ipInfo } = input;
14
+ const { req, res } = handle;
15
+ let { botScore, scoreComponents } = input;
16
+ const userAgentMismatchResponse = await runUserAgentMismatchCheck(input, handle);
17
+ if (userAgentMismatchResponse) return userAgentMismatchResponse;
18
+ const contextResponse = await runContextAwareValidation(input, handle);
19
+ if (contextResponse) return contextResponse;
20
+ const webViewTripped = clientRecord.settings.disallowWebView === true && input.webView === true;
21
+ if (webViewTripped) {
22
+ tasks.logger.info(() => ({ msg: "WebView detected" }));
23
+ const scoreUpdate = tasks.frictionlessManager.scoreIncreaseWebView(input.baseBotScore, botScore, scoreComponents);
24
+ botScore = scoreUpdate.score;
25
+ scoreComponents = scoreUpdate.scoreComponents;
26
+ tasks.frictionlessManager.updateScore(botScore, scoreComponents);
27
+ }
28
+ const timestampTripped = require_frictionlessTasks.FrictionlessManager.timestampTooOld(input.timestamp);
29
+ if (timestampTripped) {
30
+ const scoreUpdate = tasks.frictionlessManager.scoreIncreaseTimestamp(input.timestamp, input.baseBotScore, botScore, scoreComponents);
31
+ botScore = scoreUpdate.score;
32
+ scoreComponents = scoreUpdate.scoreComponents;
33
+ tasks.frictionlessManager.updateScore(botScore, scoreComponents);
34
+ }
35
+ const autoBanThreshold = clientRecord.settings.autoBanScoreThreshold;
36
+ if (autoBanThreshold !== void 0 && Number(botScore) >= autoBanThreshold) {
37
+ req.logger.info(() => ({
38
+ msg: "Frictionless decision",
39
+ data: {
40
+ decision: "auto_ban_score",
41
+ botScore,
42
+ autoBanThreshold,
43
+ token: input.token
44
+ }
45
+ }));
46
+ require_metrics.recordFrictionlessDecision("auto_ban_score");
47
+ await tasks.frictionlessManager.registerBlockedSession({
48
+ solvedImagesCount: clientRecord.settings.imageMaxRounds,
49
+ userSitekeyIpHash,
50
+ reason: _prosopo_types.FrictionlessReason.AUTO_BAN_SCORE,
51
+ siteKey: dapp,
52
+ ipInfo,
53
+ headers: flatHeaders
54
+ });
55
+ return res.status(401).json({ error: "Unauthorized" });
56
+ }
57
+ if (webViewTripped) {
58
+ req.logger.info(() => ({
59
+ msg: "Frictionless decision",
60
+ data: {
61
+ decision: "webview_detected",
62
+ captchaType: _prosopo_types.CaptchaType.image
63
+ }
64
+ }));
65
+ require_metrics.recordFrictionlessDecision("webview_detected");
66
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
67
+ return res.json(await tasks.frictionlessManager.sendImageCaptcha({
68
+ solvedImagesCount: Math.min(env.config.captchas.solved.count * 2, clientRecord.settings.imageMaxRounds),
69
+ userSitekeyIpHash,
70
+ reason: _prosopo_types.FrictionlessReason.WEBVIEW_DETECTED,
71
+ siteKey: dapp,
72
+ ipInfo,
73
+ headers: flatHeaders
74
+ }));
75
+ }
76
+ if (timestampTripped) {
77
+ req.logger.info(() => ({
78
+ msg: "Frictionless decision",
79
+ data: {
80
+ decision: "timestamp_too_old",
81
+ captchaType: _prosopo_types.CaptchaType.image
82
+ }
83
+ }));
84
+ require_metrics.recordFrictionlessDecision("timestamp_too_old");
85
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
86
+ return res.json(await tasks.frictionlessManager.sendImageCaptcha({
87
+ solvedImagesCount: require_frictionlessTasksUtils.timestampDecayFunction(input.timestamp, input.decryptionFailed, clientRecord.settings.imageMaxRounds),
88
+ userSitekeyIpHash,
89
+ reason: _prosopo_types.FrictionlessReason.OLD_TIMESTAMP,
90
+ siteKey: dapp,
91
+ ipInfo,
92
+ headers: flatHeaders
93
+ }));
94
+ }
95
+ if (Number(botScore) > input.botThreshold) {
96
+ req.logger.info(() => ({
97
+ msg: "Bot score is greater than threshold",
98
+ data: {
99
+ botScore,
100
+ botThreshold: input.botThreshold,
101
+ token: input.token
102
+ }
103
+ }));
104
+ req.logger.info(() => ({
105
+ msg: "Frictionless decision",
106
+ data: {
107
+ decision: "bot_score_above_threshold",
108
+ captchaType: _prosopo_types.CaptchaType.image
109
+ }
110
+ }));
111
+ require_metrics.recordFrictionlessDecision("bot_score_above_threshold");
112
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
113
+ return res.json(await tasks.frictionlessManager.sendImageCaptcha({
114
+ solvedImagesCount: Math.min(env.config.captchas.solved.count, clientRecord.settings.imageMaxRounds),
115
+ userSitekeyIpHash,
116
+ reason: _prosopo_types.FrictionlessReason.BOT_SCORE_ABOVE_THRESHOLD,
117
+ siteKey: dapp,
118
+ ipInfo,
119
+ headers: flatHeaders
120
+ }));
121
+ }
122
+ if (!input.currentUrl) {
123
+ req.logger.info(() => ({
124
+ msg: "Frictionless decision",
125
+ data: {
126
+ decision: "missing_current_url",
127
+ captchaType: _prosopo_types.CaptchaType.image,
128
+ token: input.token
129
+ }
130
+ }));
131
+ require_metrics.recordFrictionlessDecision("missing_current_url");
132
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
133
+ return res.json(await tasks.frictionlessManager.sendImageCaptcha({
134
+ solvedImagesCount: Math.min(env.config.captchas.solved.count, clientRecord.settings.imageMaxRounds),
135
+ userSitekeyIpHash,
136
+ reason: _prosopo_types.FrictionlessReason.MISSING_CURRENT_URL,
137
+ siteKey: dapp,
138
+ ipInfo,
139
+ headers: flatHeaders
140
+ }));
141
+ }
142
+ req.logger.info(() => ({
143
+ msg: "Frictionless decision",
144
+ data: {
145
+ decision: "default_pow",
146
+ captchaType: _prosopo_types.CaptchaType.pow
147
+ }
148
+ }));
149
+ require_metrics.recordFrictionlessDecision("default_pow");
150
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
151
+ return res.json(await tasks.frictionlessManager.sendPowCaptcha({
152
+ userSitekeyIpHash,
153
+ siteKey: dapp,
154
+ ipInfo,
155
+ headers: flatHeaders
156
+ }));
201
157
  };
202
- const runUserAgentMismatchCheck = async (input, handle) => {
203
- const { req, res } = handle;
204
- const headersUserAgent = req.headers["user-agent"];
205
- const headersProsopoUser = req.headers["prosopo-user"];
206
- const hashedHeadersUserAgent = headersUserAgent ? hashUserAgent.hashUserAgent(headersUserAgent) : "";
207
- if (hashedHeadersUserAgent === input.userAgent && headersProsopoUser === input.userId) {
208
- return null;
209
- }
210
- req.logger.info(() => ({
211
- msg: "User agent or user id does not match",
212
- data: {
213
- headersUserAgent,
214
- hashedHeadersUserAgent,
215
- userAgent: input.userAgent,
216
- headersProsopoUser,
217
- userId: input.userId
218
- }
219
- }));
220
- req.logger.info(() => ({
221
- msg: "Frictionless decision",
222
- data: {
223
- decision: "user_agent_mismatch",
224
- captchaType: types.CaptchaType.image
225
- }
226
- }));
227
- metrics.recordFrictionlessDecision("user_agent_mismatch");
228
- honeypotResponse.attachHoneypot(res, input.clientRecord);
229
- return res.json(
230
- await input.tasks.frictionlessManager.sendImageCaptcha({
231
- solvedImagesCount: frictionlessTasksUtils.timestampDecayFunction(
232
- input.timestamp,
233
- input.decryptionFailed,
234
- input.clientRecord.settings.imageMaxRounds
235
- ),
236
- userSitekeyIpHash: input.userSitekeyIpHash,
237
- reason: types.FrictionlessReason.USER_AGENT_MISMATCH,
238
- siteKey: input.dapp,
239
- ipInfo: input.ipInfo,
240
- headers: input.flatHeaders
241
- })
242
- );
158
+ var runUserAgentMismatchCheck = async (input, handle) => {
159
+ const { req, res } = handle;
160
+ const headersUserAgent = req.headers["user-agent"];
161
+ const headersProsopoUser = req.headers["prosopo-user"];
162
+ const hashedHeadersUserAgent = headersUserAgent ? require_hashUserAgent.hashUserAgent(headersUserAgent) : "";
163
+ if (hashedHeadersUserAgent === input.userAgent && headersProsopoUser === input.userId) return null;
164
+ req.logger.info(() => ({
165
+ msg: "User agent or user id does not match",
166
+ data: {
167
+ headersUserAgent,
168
+ hashedHeadersUserAgent,
169
+ userAgent: input.userAgent,
170
+ headersProsopoUser,
171
+ userId: input.userId
172
+ }
173
+ }));
174
+ req.logger.info(() => ({
175
+ msg: "Frictionless decision",
176
+ data: {
177
+ decision: "user_agent_mismatch",
178
+ captchaType: _prosopo_types.CaptchaType.image
179
+ }
180
+ }));
181
+ require_metrics.recordFrictionlessDecision("user_agent_mismatch");
182
+ require_honeypotResponse.attachHoneypot(res, input.clientRecord);
183
+ return res.json(await input.tasks.frictionlessManager.sendImageCaptcha({
184
+ solvedImagesCount: require_frictionlessTasksUtils.timestampDecayFunction(input.timestamp, input.decryptionFailed, input.clientRecord.settings.imageMaxRounds),
185
+ userSitekeyIpHash: input.userSitekeyIpHash,
186
+ reason: _prosopo_types.FrictionlessReason.USER_AGENT_MISMATCH,
187
+ siteKey: input.dapp,
188
+ ipInfo: input.ipInfo,
189
+ headers: input.flatHeaders
190
+ }));
243
191
  };
244
- const runContextAwareValidation = async (input, handle) => {
245
- const { tasks, clientRecord, dapp, user } = input;
246
- const { req, res, next } = handle;
247
- if (!clientRecord.settings.contextAware?.enabled) return null;
248
- const contexts = clientRecord.settings.contextAware?.contexts || {};
249
- const hasDefault = contexts[types.ContextType.Default] !== void 0;
250
- const hasWebview = contexts[types.ContextType.Webview] !== void 0;
251
- let contextType;
252
- if (hasDefault && hasWebview) {
253
- contextType = contextAwareValidation.determineContextType(input.webView);
254
- } else if (hasDefault) {
255
- contextType = types.ContextType.Default;
256
- } else if (hasWebview) {
257
- contextType = types.ContextType.Webview;
258
- }
259
- if (!contextType) return null;
260
- const clientEntropy = await tasks.frictionlessManager.getClientContextEntropy(
261
- clientRecord.account,
262
- contextType
263
- );
264
- if (!clientEntropy) return null;
265
- if (!input.decryptedHeadHash) {
266
- tasks.logger.info(() => ({
267
- msg: "No decryptedHeadHash in session for context aware client"
268
- }));
269
- return next(
270
- new common.ProsopoApiError("API.BAD_REQUEST", {
271
- context: { code: 400, siteKey: dapp, user },
272
- i18n: req.i18n,
273
- logger: req.logger
274
- })
275
- );
276
- }
277
- const threshold = contextAwareValidation.getContextThreshold(clientRecord.settings, contextType);
278
- const sim = util.compareBinaryStrings(input.decryptedHeadHash, clientEntropy);
279
- if (sim >= threshold) return null;
280
- req.logger.info(() => ({
281
- msg: "Frictionless decision",
282
- data: {
283
- decision: "context_aware_failed",
284
- captchaType: types.CaptchaType.image,
285
- sim,
286
- threshold
287
- }
288
- }));
289
- metrics.recordFrictionlessDecision("context_aware_failed");
290
- honeypotResponse.attachHoneypot(res, clientRecord);
291
- return res.json(
292
- await tasks.frictionlessManager.sendImageCaptcha({
293
- solvedImagesCount: Math.min(
294
- constants.getRoundsFromSimScore(sim),
295
- clientRecord.settings.imageMaxRounds
296
- ),
297
- userSitekeyIpHash: input.userSitekeyIpHash,
298
- reason: types.FrictionlessReason.CONTEXT_AWARE_VALIDATION_FAILED,
299
- siteKey: dapp,
300
- ipInfo: input.ipInfo,
301
- headers: input.flatHeaders
302
- })
303
- );
192
+ var runContextAwareValidation = async (input, handle) => {
193
+ const { tasks, clientRecord, dapp, user } = input;
194
+ const { req, res, next } = handle;
195
+ if (!clientRecord.settings.contextAware?.enabled) return null;
196
+ const contexts = clientRecord.settings.contextAware?.contexts || {};
197
+ const hasDefault = contexts[_prosopo_types.ContextType.Default] !== void 0;
198
+ const hasWebview = contexts[_prosopo_types.ContextType.Webview] !== void 0;
199
+ let contextType;
200
+ if (hasDefault && hasWebview) contextType = require_contextAwareValidation.determineContextType(input.webView);
201
+ else if (hasDefault) contextType = _prosopo_types.ContextType.Default;
202
+ else if (hasWebview) contextType = _prosopo_types.ContextType.Webview;
203
+ if (!contextType) return null;
204
+ const clientEntropy = await tasks.frictionlessManager.getClientContextEntropy(clientRecord.account, contextType);
205
+ if (!clientEntropy) return null;
206
+ if (!input.decryptedHeadHash) {
207
+ tasks.logger.info(() => ({ msg: "No decryptedHeadHash in session for context aware client" }));
208
+ return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
209
+ context: {
210
+ code: 400,
211
+ siteKey: dapp,
212
+ user
213
+ },
214
+ i18n: req.i18n,
215
+ logger: req.logger
216
+ }));
217
+ }
218
+ const threshold = require_contextAwareValidation.getContextThreshold(clientRecord.settings, contextType);
219
+ const sim = (0, _prosopo_util.compareBinaryStrings)(input.decryptedHeadHash, clientEntropy);
220
+ if (sim >= threshold) return null;
221
+ req.logger.info(() => ({
222
+ msg: "Frictionless decision",
223
+ data: {
224
+ decision: "context_aware_failed",
225
+ captchaType: _prosopo_types.CaptchaType.image,
226
+ sim,
227
+ threshold
228
+ }
229
+ }));
230
+ require_metrics.recordFrictionlessDecision("context_aware_failed");
231
+ require_honeypotResponse.attachHoneypot(res, clientRecord);
232
+ return res.json(await tasks.frictionlessManager.sendImageCaptcha({
233
+ solvedImagesCount: Math.min(require_constants.getRoundsFromSimScore(sim), clientRecord.settings.imageMaxRounds),
234
+ userSitekeyIpHash: input.userSitekeyIpHash,
235
+ reason: _prosopo_types.FrictionlessReason.CONTEXT_AWARE_VALIDATION_FAILED,
236
+ siteKey: dapp,
237
+ ipInfo: input.ipInfo,
238
+ headers: input.flatHeaders
239
+ }));
304
240
  };
241
+ //#endregion
305
242
  exports.runDecisionMachine = runDecisionMachine;
@@ -1,14 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const decryptIncomingSimdReadings = async (manager, encrypted) => {
4
- if (!encrypted) return void 0;
5
- const decryptKeys = [
6
- ...await manager.getDetectorKeys(),
7
- process.env.BOT_DECRYPTION_KEY
8
- ];
9
- const decrypted = await manager.decryptSimdReadings(encrypted, decryptKeys);
10
- if (!decrypted) return void 0;
11
- const { timestamp: _ignored, ...readings } = decrypted;
12
- return readings;
1
+ //#region src/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.ts
2
+ var decryptIncomingSimdReadings = async (manager, encrypted) => {
3
+ if (!encrypted) return void 0;
4
+ const decryptKeys = [...await manager.getDetectorKeys(), process.env.BOT_DECRYPTION_KEY];
5
+ const decrypted = await manager.decryptSimdReadings(encrypted, decryptKeys);
6
+ if (!decrypted) return void 0;
7
+ const { timestamp: _ignored, ...readings } = decrypted;
8
+ return readings;
13
9
  };
10
+ //#endregion
14
11
  exports.decryptIncomingSimdReadings = decryptIncomingSimdReadings;