@prosopo/provider 4.15.13 → 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 (236) 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 +78 -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/powCaptcha/powTasks.unit.test.js +6 -0
  219. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  220. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +60 -1
  221. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
  222. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +140 -0
  223. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
  224. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +7 -7
  225. package/dist/util/usageCounters.js +220 -212
  226. package/dist/util.d.ts.map +1 -1
  227. package/dist/util.js +327 -364
  228. package/dist/util.js.map +1 -1
  229. package/dist/utils/devicePlatform.js +15 -9
  230. package/dist/utils/dns.js +64 -77
  231. package/dist/utils/hashUserAgent.js +14 -7
  232. package/dist/utils/hashUserIp.js +14 -6
  233. package/dist/utils/honeypot/encoders.js +74 -80
  234. package/dist/utils/honeypot/phraseBank.js +49 -44
  235. package/dist/utils/normalizeRequestIp.js +34 -26
  236. 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":"AAqBA,OAAO,EAAE,wCAAwC,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACN,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,+BAA+B,CAAC;AAIvC,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAClC,QAAyC,EACzC,aAA6B,EAC7B,SAAkB,EACsB,EAAE;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,QAAQ,GAAqB;QAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC7B,CAAC;IACF,MAAM,OAAO,GAA0C,EAAE,CAAC;IAC1D,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,KAAK,MAAM;YAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC;;YACxC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,IAAgC,EACX,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC/C,QAAsC,EACnB,EAAE;IACrB,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,IAAI,QAAQ,CAAC,UAAU;QAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,cAAc;QAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC/D,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AA2BF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAClC,QAAsC,EACtC,YAAwC,EACxC,aAAuC,EAC9B,EAAE;IACX,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,CAAC;IACxB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,CAAC,SAAS,KAAK,KAAK;QAAE,KAAK,IAAI,GAAG,CAAC;IAE/C,MAAM,OAAO,GAAG,CAAC,EAA8B,EAAW,EAAE;QAC3D,IAAI,CAAC,EAAE,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QACnD,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,aAAa,CAAC,eAAe,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAIzD,IAAI,sBAAsB,CAAC,EAAE,EAAE,aAAa,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC;QACb,CAAC;QAGD,IACC,CAAC,EAAE,CAAC,KAAK,IAAI,aAAa,CAAC,QAAQ,KAAK,IAAI,CAAC;YAC7C,CAAC,EAAE,CAAC,OAAO,IAAI,aAAa,CAAC,UAAU,KAAK,IAAI,CAAC;YACjD,CAAC,EAAE,CAAC,KAAK,IAAI,aAAa,CAAC,QAAQ,KAAK,IAAI,CAAC;YAC7C,CAAC,EAAE,CAAC,SAAS,IAAI,aAAa,CAAC,YAAY,KAAK,IAAI,CAAC,EACpD,CAAC;YACF,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,EAAE,CAAC,YAAY,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAC5C,OAAO,CAAC,uBAAuB,CAAC,EAAE,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;IAC5E,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,EAA8B,EAAW,EAAE;QAC/D,IAAI,CAAC,EAAE,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,aAAa,CAAC,WAAW,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,SAAS,GACd,aAAa,CAAC,oBAAoB;YAClC,wCAAwC,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,IAAI,CAAC,CAAC,CAAC;QAC3E,OAAO,QAAQ,IAAI,SAAS,CAAC;IAC9B,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,KAAK,IAAI,GAAG,CAAC;IACnD,IAAI,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,KAAK,IAAI,GAAG,CAAC;IACvD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,KAAK,IAAI,GAAG,CAAC;IAC/C,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,KAAK,IAAI,GAAG,CAAC;IAEnD,IACC,YAAY,EAAE,OAAO;QACrB,YAAY,CAAC,YAAY,KAAK,KAAK;QACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAC/B,CAAC;QACF,KAAK,IAAI,GAAG,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC"}