@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,45 +1,39 @@
1
1
  import m_dwIw from "./decodePayload.js";
2
- const getBotScore = async (payload, headHash, privateKeyString) => {
3
- const result = await m_dwIw(
4
- payload,
5
- headHash,
6
- privateKeyString
7
- );
8
- const baseBotScore = result.score;
9
- const timestamp = result.timestamp;
10
- const userId = result.userId;
11
- const userAgent = result.userAgent;
12
- const isWebView = result.isWebView ?? false;
13
- const isIframe = result.isIframe ?? false;
14
- const decryptedHeadHash = result.decryptedHeadHash;
15
- const triggeredDetectors = result.triggeredDetectors;
16
- const shadowDomPenalty = result.shadowDomPenalty;
17
- const entropyMathRandomFingerprint = result.entropyMathRandomFingerprint;
18
- const entropyCryptoFingerprint = result.entropyCryptoFingerprint;
19
- const entropyWallClockOffsetMs = result.entropyWallClockOffsetMs;
20
- const entropyMathRandomFirst = result.entropyMathRandomFirst;
21
- if (baseBotScore === void 0 || Number.isNaN(baseBotScore)) {
22
- return {
23
- baseBotScore: 1,
24
- timestamp: 0
25
- };
26
- }
27
- return {
28
- baseBotScore,
29
- timestamp,
30
- userId,
31
- userAgent,
32
- isWebView,
33
- isIframe,
34
- decryptedHeadHash,
35
- triggeredDetectors,
36
- shadowDomPenalty,
37
- entropyMathRandomFingerprint,
38
- entropyCryptoFingerprint,
39
- entropyWallClockOffsetMs,
40
- entropyMathRandomFirst
41
- };
42
- };
43
- export {
44
- getBotScore
2
+ //#region src/tasks/detection/getBotScore.ts
3
+ var getBotScore = async (payload, headHash, privateKeyString) => {
4
+ const result = await m_dwIw(payload, headHash, privateKeyString);
5
+ const baseBotScore = result.score;
6
+ const timestamp = result.timestamp;
7
+ const userId = result.userId;
8
+ const userAgent = result.userAgent;
9
+ const isWebView = result.isWebView ?? false;
10
+ const isIframe = result.isIframe ?? false;
11
+ const decryptedHeadHash = result.decryptedHeadHash;
12
+ const triggeredDetectors = result.triggeredDetectors;
13
+ const shadowDomPenalty = result.shadowDomPenalty;
14
+ const entropyMathRandomFingerprint = result.entropyMathRandomFingerprint;
15
+ const entropyCryptoFingerprint = result.entropyCryptoFingerprint;
16
+ const entropyWallClockOffsetMs = result.entropyWallClockOffsetMs;
17
+ const entropyMathRandomFirst = result.entropyMathRandomFirst;
18
+ if (baseBotScore === void 0 || Number.isNaN(baseBotScore)) return {
19
+ baseBotScore: 1,
20
+ timestamp: 0
21
+ };
22
+ return {
23
+ baseBotScore,
24
+ timestamp,
25
+ userId,
26
+ userAgent,
27
+ isWebView,
28
+ isIframe,
29
+ decryptedHeadHash,
30
+ triggeredDetectors,
31
+ shadowDomPenalty,
32
+ entropyMathRandomFingerprint,
33
+ entropyCryptoFingerprint,
34
+ entropyWallClockOffsetMs,
35
+ entropyMathRandomFirst
36
+ };
45
37
  };
38
+ //#endregion
39
+ export { getBotScore };
@@ -1 +1 @@
1
- {"version":3,"file":"enrichDnsEvent.d.ts","sourceRoot":"","sources":["../../../src/tasks/dnsEvent/enrichDnsEvent.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACX,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,OAAO,EACP,MAAM,gBAAgB,CAAC;AAIxB,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,eAAO,MAAM,cAAc,aAChB,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,iBAC1B,cAAc,cACjB,MAAM,KAChB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CA8BtC,CAAC;AAEF,eAAO,MAAM,YAAY,SAClB,cAAc,GAAG,SAAS,KAC9B,MAAM,GAAG,SAAyD,CAAC;AAEtE,eAAO,MAAM,gCAAgC,aAClC,gBAAgB,GAAG,SAAS,KACpC,cAAc,EAMhB,CAAC;AA2BF,eAAO,MAAM,mBAAmB,aACrB,gBAAgB,GAAG,SAAS,gBACxB,cAAc,GAAG,SAAS,kBACxB,OAAO,CAAC,cAAc,CAAC,KACrC,MA+CF,CAAC"}
1
+ {"version":3,"file":"enrichDnsEvent.d.ts","sourceRoot":"","sources":["../../../src/tasks/dnsEvent/enrichDnsEvent.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACX,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,OAAO,EACP,MAAM,gBAAgB,CAAC;AAOxB,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,eAAO,MAAM,cAAc,aAChB,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,iBAC1B,cAAc,cACjB,MAAM,KAChB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CA8BtC,CAAC;AAEF,eAAO,MAAM,YAAY,SAClB,cAAc,GAAG,SAAS,KAC9B,MAAM,GAAG,SAAyD,CAAC;AAEtE,eAAO,MAAM,gCAAgC,aAClC,gBAAgB,GAAG,SAAS,KACpC,cAAc,EAMhB,CAAC;AA2BF,eAAO,MAAM,mBAAmB,aACrB,gBAAgB,GAAG,SAAS,gBACxB,cAAc,GAAG,SAAS,kBACxB,OAAO,CAAC,cAAc,CAAC,KACrC,MAqDF,CAAC"}
@@ -1,78 +1,92 @@
1
+ import { isDatacenterAllowlisted, isDatacenterDenylisted } from "../spam/checkTrafficFilter.js";
1
2
  import { trafficFilterAbuserScoreThresholdDefault } from "@prosopo/types";
2
- import { isDatacenterAllowlisted } from "../spam/checkTrafficFilter.js";
3
- const enrichDnsEvent = async (dnsEvent, ipInfoService, primaryIp) => {
4
- if (!dnsEvent) {
5
- return void 0;
6
- }
7
- const enriched = {
8
- peerIp: dnsEvent.peerIp,
9
- resolverIp: dnsEvent.resolverIp,
10
- pathValid: dnsEvent.pathValid
11
- };
12
- const lookups = [];
13
- const kinds = [];
14
- if (dnsEvent.peerIp && dnsEvent.peerIp !== primaryIp) {
15
- lookups.push(ipInfoService.lookup(dnsEvent.peerIp));
16
- kinds.push("peer");
17
- }
18
- if (dnsEvent.resolverIp && dnsEvent.resolverIp !== primaryIp) {
19
- lookups.push(ipInfoService.lookup(dnsEvent.resolverIp));
20
- kinds.push("resolver");
21
- }
22
- if (lookups.length === 0) {
23
- return enriched;
24
- }
25
- const results = await Promise.all(lookups);
26
- kinds.forEach((k, i) => {
27
- const info = results[i];
28
- if (!info) return;
29
- if (k === "peer") enriched.peerIpInfo = info;
30
- else enriched.resolverIpInfo = info;
31
- });
32
- return enriched;
3
+ //#region src/tasks/dnsEvent/enrichDnsEvent.ts
4
+ var enrichDnsEvent = async (dnsEvent, ipInfoService, primaryIp) => {
5
+ if (!dnsEvent) return;
6
+ const enriched = {
7
+ peerIp: dnsEvent.peerIp,
8
+ resolverIp: dnsEvent.resolverIp,
9
+ pathValid: dnsEvent.pathValid
10
+ };
11
+ const lookups = [];
12
+ const kinds = [];
13
+ if (dnsEvent.peerIp && dnsEvent.peerIp !== primaryIp) {
14
+ lookups.push(ipInfoService.lookup(dnsEvent.peerIp));
15
+ kinds.push("peer");
16
+ }
17
+ if (dnsEvent.resolverIp && dnsEvent.resolverIp !== primaryIp) {
18
+ lookups.push(ipInfoService.lookup(dnsEvent.resolverIp));
19
+ kinds.push("resolver");
20
+ }
21
+ if (lookups.length === 0) return enriched;
22
+ const results = await Promise.all(lookups);
23
+ kinds.forEach((k, i) => {
24
+ const info = results[i];
25
+ if (!info) return;
26
+ if (k === "peer") enriched.peerIpInfo = info;
27
+ else enriched.resolverIpInfo = info;
28
+ });
29
+ return enriched;
33
30
  };
34
- const getIpInfoAsn = (info) => info?.isValid ? info.asnNumber : void 0;
35
- const extraIpInfosFromEnrichedDnsEvent = (enriched) => {
36
- if (!enriched) return [];
37
- const out = [];
38
- if (enriched.peerIpInfo) out.push(enriched.peerIpInfo);
39
- if (enriched.resolverIpInfo) out.push(enriched.resolverIpInfo);
40
- return out;
31
+ var getIpInfoAsn = (info) => info?.isValid ? info.asnNumber : void 0;
32
+ var extraIpInfosFromEnrichedDnsEvent = (enriched) => {
33
+ if (!enriched) return [];
34
+ const out = [];
35
+ if (enriched.peerIpInfo) out.push(enriched.peerIpInfo);
36
+ if (enriched.resolverIpInfo) out.push(enriched.resolverIpInfo);
37
+ return out;
41
38
  };
42
- const computeDnsAsymmetry = (enriched, clientIpInfo, trafficFilter) => {
43
- if (!enriched) return 0;
44
- let score = 0;
45
- if (enriched.pathValid === false) score += 0.3;
46
- const countDc = (ip) => {
47
- if (!ip?.isValid || !ip.isDatacenter) return false;
48
- if (!trafficFilter) return true;
49
- if (ip.isVPN && trafficFilter.blockVpn !== true || ip.isProxy && trafficFilter.blockProxy !== true || ip.isTor && trafficFilter.blockTor !== true || ip.isCrawler && trafficFilter.blockCrawler !== true) {
50
- return false;
51
- }
52
- if (trafficFilter.blockDatacenter !== true) return false;
53
- if (ip.providerType === "isp") return false;
54
- return !isDatacenterAllowlisted(ip, trafficFilter.datacenterNameAllowlist);
55
- };
56
- const countAbuser = (ip) => {
57
- if (!ip?.isValid || !ip.isAbuser) return false;
58
- if (!trafficFilter) return true;
59
- if (trafficFilter.blockAbuser === false) return false;
60
- const threshold = trafficFilter.abuserScoreThreshold ?? trafficFilterAbuserScoreThresholdDefault;
61
- const maxScore = Math.max(ip.abuserScore ?? 0, ip.companyAbuserScore ?? 0);
62
- return maxScore >= threshold;
63
- };
64
- if (countDc(enriched.resolverIpInfo)) score += 0.3;
65
- if (countAbuser(enriched.resolverIpInfo)) score += 0.2;
66
- if (countDc(enriched.peerIpInfo)) score += 0.2;
67
- if (countAbuser(enriched.peerIpInfo)) score += 0.2;
68
- if (clientIpInfo?.isValid && clientIpInfo.providerType === "isp" && countDc(enriched.resolverIpInfo)) {
69
- score += 0.2;
70
- }
71
- return Math.min(score, 1);
72
- };
73
- export {
74
- computeDnsAsymmetry,
75
- enrichDnsEvent,
76
- extraIpInfosFromEnrichedDnsEvent,
77
- getIpInfoAsn
39
+ /**
40
+ * Score the DNS path for asymmetry between the client's DNS resolver / peer
41
+ * IPs and its connection IP. The score sums four kinds of signal:
42
+ *
43
+ * - `pathValid=false` (protocol-layer failure — always counted)
44
+ * - resolver / peer classified `isDatacenter`
45
+ * - resolver / peer classified `isAbuser`
46
+ * - client IP is a consumer ISP but resolver is datacenter (compound)
47
+ *
48
+ * When `trafficFilter` is supplied, the datacenter and abuser contributions
49
+ * are gated on the same rules `checkTrafficFilter` uses for the client IP:
50
+ *
51
+ * - `blockDatacenter` must be opted in (default off); IPs whose
52
+ * `providerType === "isp"` short-circuit; named allowlist skips
53
+ * - `blockAbuser` opt-in (default on) with the abuser-score threshold
54
+ * - cross-category suppression: VPN / proxy / Tor / crawler IPs that also
55
+ * carry `isDatacenter=true` are NOT counted as datacenter when the
56
+ * operator hasn't opted into blocking that more specific category —
57
+ * mirrors the `datacenterSuppressedByCategory` rule in evaluateIpInfo.
58
+ *
59
+ * `pathValid` is a protocol signal, not a category — it always contributes
60
+ * regardless of trafficFilter. When `trafficFilter` is omitted, all
61
+ * datacenter / abuser flags count (preserves the pre-gating behaviour for
62
+ * admin / diagnostic recompute callers).
63
+ */
64
+ var computeDnsAsymmetry = (enriched, clientIpInfo, trafficFilter) => {
65
+ if (!enriched) return 0;
66
+ let score = 0;
67
+ if (enriched.pathValid === false) score += .3;
68
+ const countDc = (ip) => {
69
+ if (!ip?.isValid || !ip.isDatacenter) return false;
70
+ if (!trafficFilter) return true;
71
+ if (trafficFilter.blockDatacenter !== true) return false;
72
+ if (isDatacenterDenylisted(ip, trafficFilter.datacenterNameDenylist)) return true;
73
+ if (ip.isVPN && trafficFilter.blockVpn !== true || ip.isProxy && trafficFilter.blockProxy !== true || ip.isTor && trafficFilter.blockTor !== true || ip.isCrawler && trafficFilter.blockCrawler !== true) return false;
74
+ if (ip.providerType === "isp") return false;
75
+ return !isDatacenterAllowlisted(ip, trafficFilter.datacenterNameAllowlist);
76
+ };
77
+ const countAbuser = (ip) => {
78
+ if (!ip?.isValid || !ip.isAbuser) return false;
79
+ if (!trafficFilter) return true;
80
+ if (trafficFilter.blockAbuser === false) return false;
81
+ const threshold = trafficFilter.abuserScoreThreshold ?? trafficFilterAbuserScoreThresholdDefault;
82
+ return Math.max(ip.abuserScore ?? 0, ip.companyAbuserScore ?? 0) >= threshold;
83
+ };
84
+ if (countDc(enriched.resolverIpInfo)) score += .3;
85
+ if (countAbuser(enriched.resolverIpInfo)) score += .2;
86
+ if (countDc(enriched.peerIpInfo)) score += .2;
87
+ if (countAbuser(enriched.peerIpInfo)) score += .2;
88
+ if (clientIpInfo?.isValid && clientIpInfo.providerType === "isp" && countDc(enriched.resolverIpInfo)) score += .2;
89
+ return Math.min(score, 1);
78
90
  };
91
+ //#endregion
92
+ export { computeDnsAsymmetry, enrichDnsEvent, extraIpInfosFromEnrichedDnsEvent, getIpInfoAsn };
@@ -1 +1 @@
1
- {"version":3,"file":"enrichDnsEvent.js","sourceRoot":"","sources":["../../../src/tasks/dnsEvent/enrichDnsEvent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"enrichDnsEvent.js","sourceRoot":"","sources":["../../../src/tasks/dnsEvent/enrichDnsEvent.ts"],"names":[],"mappings":"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"}