@prosopo/provider 4.8.1 → 4.9.1

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 (133) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +20 -19
  2. package/.turbo/turbo-build$colon$tsc.log +24 -24
  3. package/.turbo/turbo-build.log +21 -20
  4. package/CHANGELOG.md +107 -0
  5. package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +1 -1
  6. package/dist/api/admin/apiAdminRoutesProvider.js +4 -1
  7. package/dist/api/admin/apiAdminRoutesProvider.js.map +1 -1
  8. package/dist/api/admin/apiDnsEventEndpoint.d.ts +4 -1
  9. package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
  10. package/dist/api/admin/apiDnsEventEndpoint.js +31 -1
  11. package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
  12. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
  13. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  14. package/dist/api/blacklistRequestInspector.js +5 -2
  15. package/dist/api/blacklistRequestInspector.js.map +1 -1
  16. package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -1
  17. package/dist/api/captcha/checkSpamEmail.js +9 -1
  18. package/dist/api/captcha/checkSpamEmail.js.map +1 -1
  19. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  20. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +5 -5
  21. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  22. package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
  23. package/dist/api/captcha/getImageCaptchaChallenge.js +10 -1
  24. package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
  25. package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
  26. package/dist/api/captcha/getPoWCaptchaChallenge.js +2 -2
  27. package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
  28. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  29. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +2 -2
  30. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  31. package/dist/api/captcha/maintenanceModeResponses.d.ts +2 -1
  32. package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
  33. package/dist/api/captcha/maintenanceModeResponses.js +10 -0
  34. package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
  35. package/dist/api/captcha/submitImageCaptchaSolution.d.ts.map +1 -1
  36. package/dist/api/captcha/submitImageCaptchaSolution.js +1 -1
  37. package/dist/api/captcha/submitImageCaptchaSolution.js.map +1 -1
  38. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  39. package/dist/api/captcha/submitPoWCaptchaSolution.js +3 -4
  40. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  41. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -1
  42. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +3 -4
  43. package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
  44. package/dist/api/verify.d.ts.map +1 -1
  45. package/dist/api/verify.js +7 -7
  46. package/dist/api/verify.js.map +1 -1
  47. package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +4 -1
  48. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +31 -1
  49. package/dist/cjs/api/blacklistRequestInspector.cjs +5 -2
  50. package/dist/cjs/api/captcha/checkSpamEmail.cjs +9 -1
  51. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +5 -5
  52. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +10 -1
  53. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +2 -2
  54. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +2 -2
  55. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +10 -0
  56. package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +1 -1
  57. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +3 -4
  58. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +3 -4
  59. package/dist/cjs/api/verify.cjs +7 -7
  60. package/dist/cjs/pairs.cjs +14 -0
  61. package/dist/cjs/tasks/captchaManager.cjs +10 -3
  62. package/dist/cjs/tasks/dnsEvent/enrichDnsEvent.cjs +62 -0
  63. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +70 -34
  64. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +46 -17
  65. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +46 -17
  66. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +19 -2
  67. package/dist/cjs/tasks/tasks.cjs +1 -0
  68. package/dist/cjs/util/usageCounters.cjs +18 -1
  69. package/dist/cjs/util.cjs +11 -1
  70. package/dist/pairs.d.ts +4 -0
  71. package/dist/pairs.d.ts.map +1 -1
  72. package/dist/pairs.js +15 -1
  73. package/dist/pairs.js.map +1 -1
  74. package/dist/tasks/captchaManager.d.ts +2 -2
  75. package/dist/tasks/captchaManager.d.ts.map +1 -1
  76. package/dist/tasks/captchaManager.js +10 -3
  77. package/dist/tasks/captchaManager.js.map +1 -1
  78. package/dist/tasks/dnsEvent/enrichDnsEvent.d.ts +8 -0
  79. package/dist/tasks/dnsEvent/enrichDnsEvent.d.ts.map +1 -0
  80. package/dist/tasks/dnsEvent/enrichDnsEvent.js +62 -0
  81. package/dist/tasks/dnsEvent/enrichDnsEvent.js.map +1 -0
  82. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  83. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +71 -35
  84. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  85. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  86. package/dist/tasks/powCaptcha/powTasks.js +46 -17
  87. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  88. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  89. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +46 -17
  90. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  91. package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -1
  92. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  93. package/dist/tasks/spam/checkTrafficFilter.js +19 -2
  94. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  95. package/dist/tasks/tasks.d.ts +1 -0
  96. package/dist/tasks/tasks.d.ts.map +1 -1
  97. package/dist/tasks/tasks.js +1 -0
  98. package/dist/tasks/tasks.js.map +1 -1
  99. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +2 -0
  100. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  101. package/dist/tests/integration/clientSettingsPersistence.integration.test.js +1 -0
  102. package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
  103. package/dist/tests/integration/powCaptcha.integration.test.js +0 -4
  104. package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -1
  105. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +1 -0
  106. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
  107. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +37 -0
  108. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  109. package/dist/tests/unit/pairs.unit.test.js +79 -1
  110. package/dist/tests/unit/pairs.unit.test.js.map +1 -1
  111. package/dist/tests/unit/tasks/captchaManager.unit.test.js +29 -0
  112. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  113. package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.d.ts +2 -0
  114. package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.d.ts.map +1 -0
  115. package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.js +94 -0
  116. package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.js.map +1 -0
  117. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +16 -0
  118. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  119. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +36 -3
  120. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  121. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +8 -1
  122. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
  123. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +68 -0
  124. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
  125. package/dist/util/usageCounters.d.ts +1 -1
  126. package/dist/util/usageCounters.d.ts.map +1 -1
  127. package/dist/util/usageCounters.js +18 -1
  128. package/dist/util/usageCounters.js.map +1 -1
  129. package/dist/util.d.ts +1 -1
  130. package/dist/util.d.ts.map +1 -1
  131. package/dist/util.js +11 -1
  132. package/dist/util.js.map +1 -1
  133. package/package.json +13 -12
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
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;
33
+ };
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;
41
+ };
42
+ const computeDnsAsymmetry = (enriched, clientIpInfo) => {
43
+ if (!enriched) return 0;
44
+ let score = 0;
45
+ if (enriched.pathValid === false) score += 0.3;
46
+ if (enriched.resolverIpInfo?.isValid) {
47
+ if (enriched.resolverIpInfo.isDatacenter) score += 0.3;
48
+ if (enriched.resolverIpInfo.isAbuser) score += 0.2;
49
+ }
50
+ if (enriched.peerIpInfo?.isValid) {
51
+ if (enriched.peerIpInfo.isDatacenter) score += 0.2;
52
+ if (enriched.peerIpInfo.isAbuser) score += 0.2;
53
+ }
54
+ if (clientIpInfo?.isValid && clientIpInfo.providerType === "isp" && enriched.resolverIpInfo?.isValid && enriched.resolverIpInfo.isDatacenter) {
55
+ score += 0.2;
56
+ }
57
+ return Math.min(score, 1);
58
+ };
59
+ exports.computeDnsAsymmetry = computeDnsAsymmetry;
60
+ exports.enrichDnsEvent = enrichDnsEvent;
61
+ exports.extraIpInfosFromEnrichedDnsEvent = extraIpInfosFromEnrichedDnsEvent;
62
+ exports.getIpInfoAsn = getIpInfoAsn;
@@ -13,6 +13,7 @@ const util = require("../../util.cjs");
13
13
  const usageCounters = require("../../util/usageCounters.cjs");
14
14
  const captchaManager = require("../captchaManager.cjs");
15
15
  const decisionMachineRunner = require("../decisionMachine/decisionMachineRunner.cjs");
16
+ const enrichDnsEvent = require("../dnsEvent/enrichDnsEvent.cjs");
16
17
  require("../frictionless/frictionlessTasks.cjs");
17
18
  const frictionlessTasksUtils = require("../frictionless/frictionlessTasksUtils.cjs");
18
19
  const evaluateEmailSpamRules = require("../spam/evaluateEmailSpamRules.cjs");
@@ -174,8 +175,13 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
174
175
  );
175
176
  if (pendingRequest) {
176
177
  const { storedCaptchas, receivedCaptchas, captchaIds } = await this.validateReceivedCaptchasAgainstStoredCaptchas(captchas);
177
- const flat = receivedCaptchas.map((c) => util$2.extractData(c.salt));
178
- const pairs$1 = flat.map((list) => pairs.constructPairList(list));
178
+ const rawFlat = receivedCaptchas.map((c) => util$2.extractData(c.salt));
179
+ const { checkbox: checkboxCoordPair, flat } = pairs.peelCheckboxPrefix(
180
+ rawFlat,
181
+ receivedCaptchas.map((c) => c.solution.length)
182
+ );
183
+ const shapePairs = flat.map((list) => pairs.constructPairList(list));
184
+ const pairs$1 = checkboxCoordPair ? [[checkboxCoordPair], ...shapePairs] : shapePairs;
179
185
  const { tree, commitmentId } = imgCaptchaTasksUtils.buildTreeAndGetCommitmentId(receivedCaptchas);
180
186
  const datasetId = util$2.at(storedCaptchas, 0).datasetId;
181
187
  if (!datasetId) {
@@ -236,6 +242,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
236
242
  userSubmitted: true,
237
243
  serverChecked: false,
238
244
  requestedAtTimestamp: new Date(timestamp),
245
+ submittedAtTimestamp: /* @__PURE__ */ new Date(),
239
246
  ipAddress: compositeIpAddress.getCompositeIpAddress(ipAddress),
240
247
  headers,
241
248
  sessionId: pendingRecord.sessionId,
@@ -474,7 +481,8 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
474
481
  }
475
482
  maxVerifiedTime = maxVerifiedTime || 60 * 1e3;
476
483
  const currentTime = Date.now();
477
- const timeSinceCompletion = currentTime - solution.requestedAtTimestamp.getTime();
484
+ const submittedAt = solution.submittedAtTimestamp;
485
+ const timeSinceCompletion = submittedAt instanceof Date ? currentTime - submittedAt.getTime() : Number.POSITIVE_INFINITY;
478
486
  if (timeSinceCompletion > maxVerifiedTime) {
479
487
  this.logger.debug(() => ({
480
488
  msg: "Not verified - timed out"
@@ -555,17 +563,34 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
555
563
  failStatus = types.ResultReason.SPAM_EMAIL_RULE;
556
564
  }
557
565
  }
566
+ const sessionRecord = solution.sessionId ? await this.db.getSessionRecordBySessionId(solution.sessionId) : void 0;
567
+ const enrichedDnsEvent = await enrichDnsEvent.enrichDnsEvent(
568
+ sessionRecord?.dnsEvent,
569
+ env.ipInfoService,
570
+ ip ?? solution.ipInfo?.ip
571
+ );
558
572
  if (!failStatus) {
559
573
  const check = await this.resolveTrafficFilterCheck(
560
574
  env,
561
575
  solution.ipInfo,
562
576
  trafficFilter,
563
- ip
577
+ ip,
578
+ enrichedDnsEvent
564
579
  );
565
580
  if (check.isBlocked) {
566
581
  this.logger.info(() => ({
567
582
  msg: "Traffic filter rejected request",
568
- data: { commitmentId, dapp, ip, reason: check.reason }
583
+ data: {
584
+ commitmentId,
585
+ dapp,
586
+ ip,
587
+ reason: check.reason,
588
+ dnsPeerIp: enrichedDnsEvent?.peerIp,
589
+ dnsResolverIp: enrichedDnsEvent?.resolverIp,
590
+ dnsPeerAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.peerIpInfo),
591
+ dnsResolverAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.resolverIpInfo),
592
+ dnsPathValid: enrichedDnsEvent?.pathValid
593
+ }
569
594
  }));
570
595
  commitmentUpdates.result = {
571
596
  status: types.CaptchaStatus.disapproved,
@@ -588,7 +613,8 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
588
613
  solutionIpAddress,
589
614
  this.logger,
590
615
  env.ipInfoService,
591
- ipValidationRules
616
+ ipValidationRules,
617
+ enrichedDnsEvent?.peerIp
592
618
  );
593
619
  if (!ipValidation.isValid) {
594
620
  this.logger.error(() => ({
@@ -614,40 +640,48 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
614
640
  "solved",
615
641
  types.CaptchaType.image,
616
642
  ipValue,
617
- solution.userAccount
643
+ solution.userAccount,
644
+ enrichedDnsEvent?.peerIp
618
645
  )
619
646
  );
620
647
  }
621
648
  let score;
622
- if (solution.sessionId) {
623
- const sessionRecord = await this.db.getSessionRecordBySessionId(
624
- solution.sessionId
649
+ if (sessionRecord) {
650
+ const dnsAsymmetry = enrichDnsEvent.computeDnsAsymmetry(
651
+ enrichedDnsEvent,
652
+ solution.ipInfo
625
653
  );
626
- if (sessionRecord) {
627
- score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
654
+ if (dnsAsymmetry > 0) {
655
+ sessionRecord.scoreComponents = {
656
+ ...sessionRecord.scoreComponents,
657
+ dnsAsymmetry
658
+ };
659
+ }
660
+ score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
661
+ this.logger.info(() => ({
662
+ data: {
663
+ scoreComponents: sessionRecord?.scoreComponents,
664
+ score,
665
+ dnsPeerAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.peerIpInfo),
666
+ dnsResolverAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.resolverIpInfo)
667
+ }
668
+ }));
669
+ if (!failStatus && disallowWebView === true && (sessionRecord.webView === true || (sessionRecord.scoreComponents.webView || 0) > 0)) {
628
670
  this.logger.info(() => ({
629
- data: {
630
- scoreComponents: sessionRecord?.scoreComponents,
631
- score
632
- }
671
+ msg: "Disallowing webview access - user not verified"
672
+ }));
673
+ commitmentUpdates.result = {
674
+ status: types.CaptchaStatus.disapproved,
675
+ reason: types.ResultReason.DISALLOWED_WEBVIEW
676
+ };
677
+ failStatus = types.ResultReason.DISALLOWED_WEBVIEW;
678
+ isApproved = false;
679
+ failureStatus = types.ResultReason.DISALLOWED_WEBVIEW;
680
+ }
681
+ if (contextAwareEnabled && sessionRecord.reason === types.FrictionlessReason.CONTEXT_AWARE_VALIDATION_FAILED) {
682
+ this.logger.info(() => ({
683
+ msg: "Context aware validation failed"
633
684
  }));
634
- if (!failStatus && disallowWebView === true && (sessionRecord.webView === true || (sessionRecord.scoreComponents.webView || 0) > 0)) {
635
- this.logger.info(() => ({
636
- msg: "Disallowing webview access - user not verified"
637
- }));
638
- commitmentUpdates.result = {
639
- status: types.CaptchaStatus.disapproved,
640
- reason: types.ResultReason.DISALLOWED_WEBVIEW
641
- };
642
- failStatus = types.ResultReason.DISALLOWED_WEBVIEW;
643
- isApproved = false;
644
- failureStatus = types.ResultReason.DISALLOWED_WEBVIEW;
645
- }
646
- if (contextAwareEnabled && sessionRecord.reason === types.FrictionlessReason.CONTEXT_AWARE_VALIDATION_FAILED) {
647
- this.logger.info(() => ({
648
- msg: "Context aware validation failed"
649
- }));
650
- }
651
685
  }
652
686
  }
653
687
  if (isApproved) {
@@ -657,7 +691,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
657
691
  captchaResult: "passed",
658
692
  headers: solution.headers,
659
693
  captchaType: types.CaptchaType.image,
660
- countryCode: solution.ipInfo?.isValid ? solution.ipInfo.countryCode : void 0
694
+ countryCode: solution.ipInfo?.isValid ? solution.ipInfo.countryCode : void 0,
695
+ ipInfo: solution.ipInfo,
696
+ dnsEvent: enrichedDnsEvent
661
697
  };
662
698
  try {
663
699
  const decision = await this.decisionMachineRunner.decide(
@@ -9,6 +9,7 @@ const util$2 = require("../../util.cjs");
9
9
  const usageCounters = require("../../util/usageCounters.cjs");
10
10
  const captchaManager = require("../captchaManager.cjs");
11
11
  const decisionMachineRunner = require("../decisionMachine/decisionMachineRunner.cjs");
12
+ const enrichDnsEvent = require("../dnsEvent/enrichDnsEvent.cjs");
12
13
  const frictionlessTasksUtils = require("../frictionless/frictionlessTasksUtils.cjs");
13
14
  const routingMachine = require("../frictionless/routingMachine.cjs");
14
15
  const evaluateEmailSpamRules = require("../spam/evaluateEmailSpamRules.cjs");
@@ -356,8 +357,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
356
357
  const powRecordUpdates = {};
357
358
  let failResult;
358
359
  let failReason;
359
- const recent = util$1.verifyRecency(challenge, timeout);
360
- if (!recent) {
360
+ const submittedAt = challengeRecord.submittedAtTimestamp;
361
+ const submitToVerifyMs = submittedAt instanceof Date ? Date.now() - submittedAt.getTime() : Number.POSITIVE_INFINITY;
362
+ if (submitToVerifyMs > timeout) {
361
363
  failResult = {
362
364
  status: types.CaptchaStatus.disapproved,
363
365
  reason: types.ResultReason.TIMESTAMP_TOO_OLD
@@ -434,17 +436,34 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
434
436
  failReason = "API.SPAM_EMAIL_RULE";
435
437
  }
436
438
  }
439
+ const sessionRecord = challengeRecord.sessionId ? await this.db.getSessionRecordBySessionId(challengeRecord.sessionId) : void 0;
440
+ const enrichedDnsEvent = await enrichDnsEvent.enrichDnsEvent(
441
+ sessionRecord?.dnsEvent,
442
+ env.ipInfoService,
443
+ ip ?? challengeRecord.ipInfo?.ip
444
+ );
437
445
  if (!failResult) {
438
446
  const check = await this.resolveTrafficFilterCheck(
439
447
  env,
440
448
  challengeRecord.ipInfo,
441
449
  trafficFilter,
442
- ip
450
+ ip,
451
+ enrichedDnsEvent
443
452
  );
444
453
  if (check.isBlocked) {
445
454
  this.logger.info(() => ({
446
455
  msg: "Traffic filter rejected request in PoW verification",
447
- data: { challenge, dappAccount, ip, reason: check.reason }
456
+ data: {
457
+ challenge,
458
+ dappAccount,
459
+ ip,
460
+ reason: check.reason,
461
+ dnsPeerIp: enrichedDnsEvent?.peerIp,
462
+ dnsResolverIp: enrichedDnsEvent?.resolverIp,
463
+ dnsPeerAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.peerIpInfo),
464
+ dnsResolverAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.resolverIpInfo),
465
+ dnsPathValid: enrichedDnsEvent?.pathValid
466
+ }
448
467
  }));
449
468
  failResult = {
450
469
  status: types.CaptchaStatus.disapproved,
@@ -469,7 +488,8 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
469
488
  challengeIpAddress,
470
489
  this.logger,
471
490
  env.ipInfoService,
472
- ipValidationRules
491
+ ipValidationRules,
492
+ enrichedDnsEvent?.peerIp
473
493
  );
474
494
  if (!ipValidation.isValid) {
475
495
  this.logger.error(() => ({
@@ -490,19 +510,26 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
490
510
  }
491
511
  }
492
512
  let score;
493
- if (challengeRecord.sessionId) {
494
- const sessionRecord = await this.db.getSessionRecordBySessionId(
495
- challengeRecord.sessionId
513
+ if (sessionRecord) {
514
+ const dnsAsymmetry = enrichDnsEvent.computeDnsAsymmetry(
515
+ enrichedDnsEvent,
516
+ challengeRecord.ipInfo
496
517
  );
497
- if (sessionRecord) {
498
- score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
499
- this.logger.info(() => ({
500
- data: {
501
- scoreComponents: { ...sessionRecord?.scoreComponents || {} },
502
- score
503
- }
504
- }));
518
+ if (dnsAsymmetry > 0) {
519
+ sessionRecord.scoreComponents = {
520
+ ...sessionRecord.scoreComponents,
521
+ dnsAsymmetry
522
+ };
505
523
  }
524
+ score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
525
+ this.logger.info(() => ({
526
+ data: {
527
+ scoreComponents: { ...sessionRecord?.scoreComponents || {} },
528
+ score,
529
+ dnsPeerAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.peerIpInfo),
530
+ dnsResolverAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.resolverIpInfo)
531
+ }
532
+ }));
506
533
  }
507
534
  if (!failResult) {
508
535
  try {
@@ -514,7 +541,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
514
541
  captchaType: types.CaptchaType.pow,
515
542
  behavioralDataPacked: challengeRecord.behavioralDataPacked,
516
543
  deviceCapability: challengeRecord.deviceCapability,
517
- countryCode: challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.countryCode : void 0
544
+ countryCode: challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.countryCode : void 0,
545
+ ipInfo: challengeRecord.ipInfo,
546
+ dnsEvent: enrichedDnsEvent
518
547
  };
519
548
  const decision = await this.decisionMachineRunner.decide(
520
549
  decisionInput,
@@ -9,6 +9,7 @@ const util$2 = require("../../util.cjs");
9
9
  const usageCounters = require("../../util/usageCounters.cjs");
10
10
  const captchaManager = require("../captchaManager.cjs");
11
11
  const decisionMachineRunner = require("../decisionMachine/decisionMachineRunner.cjs");
12
+ const enrichDnsEvent = require("../dnsEvent/enrichDnsEvent.cjs");
12
13
  const frictionlessTasksUtils = require("../frictionless/frictionlessTasksUtils.cjs");
13
14
  const powTasksUtils = require("../powCaptcha/powTasksUtils.cjs");
14
15
  const puzzleTasksUtils = require("./puzzleTasksUtils.cjs");
@@ -281,8 +282,9 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
281
282
  serverChecked: true,
282
283
  lastUpdatedTimestamp: /* @__PURE__ */ new Date()
283
284
  });
284
- const recent = util$1.verifyRecency(challenge, timeout);
285
- if (!recent) {
285
+ const submittedAt = challengeRecord.submittedAtTimestamp;
286
+ const submitToVerifyMs = submittedAt instanceof Date ? Date.now() - submittedAt.getTime() : Number.POSITIVE_INFINITY;
287
+ if (submitToVerifyMs > timeout) {
286
288
  const disapprovedResult = {
287
289
  status: types.CaptchaStatus.disapproved,
288
290
  reason: types.ResultReason.TIMESTAMP_TOO_OLD
@@ -365,17 +367,34 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
365
367
  }));
366
368
  }
367
369
  }
370
+ const sessionRecord = challengeRecord.sessionId ? await this.db.getSessionRecordBySessionId(challengeRecord.sessionId) : void 0;
371
+ const enrichedDnsEvent = await enrichDnsEvent.enrichDnsEvent(
372
+ sessionRecord?.dnsEvent,
373
+ env.ipInfoService,
374
+ ip ?? challengeRecord.ipInfo?.ip
375
+ );
368
376
  {
369
377
  const check = await this.resolveTrafficFilterCheck(
370
378
  env,
371
379
  challengeRecord.ipInfo,
372
380
  trafficFilter,
373
- ip
381
+ ip,
382
+ enrichedDnsEvent
374
383
  );
375
384
  if (check.isBlocked) {
376
385
  this.logger.info(() => ({
377
386
  msg: "Traffic filter rejected request in puzzle verification",
378
- data: { challenge, dappAccount, ip, reason: check.reason }
387
+ data: {
388
+ challenge,
389
+ dappAccount,
390
+ ip,
391
+ reason: check.reason,
392
+ dnsPeerIp: enrichedDnsEvent?.peerIp,
393
+ dnsResolverIp: enrichedDnsEvent?.resolverIp,
394
+ dnsPeerAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.peerIpInfo),
395
+ dnsResolverAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.resolverIpInfo),
396
+ dnsPathValid: enrichedDnsEvent?.pathValid
397
+ }
379
398
  }));
380
399
  const blockedResult = {
381
400
  status: types.CaptchaStatus.disapproved,
@@ -413,7 +432,8 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
413
432
  challengeIpAddress,
414
433
  this.logger,
415
434
  env.ipInfoService,
416
- ipValidationRules
435
+ ipValidationRules,
436
+ enrichedDnsEvent?.peerIp
417
437
  );
418
438
  if (!ipValidation.isValid) {
419
439
  this.logger.error(() => ({
@@ -443,19 +463,26 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
443
463
  }
444
464
  }
445
465
  let score;
446
- if (challengeRecord.sessionId) {
447
- const sessionRecord = await this.db.getSessionRecordBySessionId(
448
- challengeRecord.sessionId
466
+ if (sessionRecord) {
467
+ const dnsAsymmetry = enrichDnsEvent.computeDnsAsymmetry(
468
+ enrichedDnsEvent,
469
+ challengeRecord.ipInfo
449
470
  );
450
- if (sessionRecord) {
451
- score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
452
- this.logger.info(() => ({
453
- data: {
454
- scoreComponents: { ...sessionRecord?.scoreComponents || {} },
455
- score
456
- }
457
- }));
471
+ if (dnsAsymmetry > 0) {
472
+ sessionRecord.scoreComponents = {
473
+ ...sessionRecord.scoreComponents,
474
+ dnsAsymmetry
475
+ };
458
476
  }
477
+ score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
478
+ this.logger.info(() => ({
479
+ data: {
480
+ scoreComponents: { ...sessionRecord?.scoreComponents || {} },
481
+ score,
482
+ dnsPeerAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.peerIpInfo),
483
+ dnsResolverAsn: enrichDnsEvent.getIpInfoAsn(enrichedDnsEvent?.resolverIpInfo)
484
+ }
485
+ }));
459
486
  }
460
487
  try {
461
488
  const decisionInput = {
@@ -466,7 +493,9 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
466
493
  captchaType: types.CaptchaType.puzzle,
467
494
  behavioralDataPacked: challengeRecord.behavioralDataPacked,
468
495
  deviceCapability: challengeRecord.deviceCapability,
469
- countryCode: challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.countryCode : void 0
496
+ countryCode: challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.countryCode : void 0,
497
+ ipInfo: challengeRecord.ipInfo,
498
+ dnsEvent: enrichedDnsEvent
470
499
  };
471
500
  const decision = await this.decisionMachineRunner.decide(
472
501
  decisionInput,
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const types = require("@prosopo/types");
4
- const checkTrafficFilter = (ipInfo, trafficFilter) => {
4
+ const evaluateIpInfo = (ipInfo, trafficFilter, options) => {
5
5
  if (!ipInfo || !ipInfo.isValid) {
6
6
  return { isBlocked: false };
7
7
  }
@@ -24,7 +24,7 @@ const checkTrafficFilter = (ipInfo, trafficFilter) => {
24
24
  return { isBlocked: true, reason: types.ResultReason.ABUSER_BLOCKED };
25
25
  }
26
26
  }
27
- if (trafficFilter.blockDatacenter && ipInfo.isDatacenter && !(ipInfo.isVPN && !trafficFilter.blockVpn)) {
27
+ if (trafficFilter.blockDatacenter && ipInfo.isDatacenter && !(options.suppressVpnDatacenterInteraction && ipInfo.isVPN && !trafficFilter.blockVpn)) {
28
28
  return { isBlocked: true, reason: types.ResultReason.DATACENTER_BLOCKED };
29
29
  }
30
30
  if (trafficFilter.blockMobile && ipInfo.isMobile) {
@@ -38,4 +38,21 @@ const checkTrafficFilter = (ipInfo, trafficFilter) => {
38
38
  }
39
39
  return { isBlocked: false };
40
40
  };
41
+ const checkTrafficFilter = (ipInfo, trafficFilter, extraIpInfos) => {
42
+ const primary = evaluateIpInfo(ipInfo, trafficFilter, {
43
+ suppressVpnDatacenterInteraction: true
44
+ });
45
+ if (primary.isBlocked) {
46
+ return primary;
47
+ }
48
+ for (const extra of extraIpInfos ?? []) {
49
+ const result = evaluateIpInfo(extra, trafficFilter, {
50
+ suppressVpnDatacenterInteraction: false
51
+ });
52
+ if (result.isBlocked) {
53
+ return result;
54
+ }
55
+ }
56
+ return { isBlocked: false };
57
+ };
41
58
  exports.checkTrafficFilter = checkTrafficFilter;
@@ -15,6 +15,7 @@ let globalWriteQueue = null;
15
15
  let flushStarted = false;
16
16
  class Tasks {
17
17
  constructor(env, logger$1) {
18
+ this.env = env;
18
19
  this.config = env.config;
19
20
  this.db = env.getDb();
20
21
  this.captchaConfig = env.config.captchas;
@@ -160,7 +160,7 @@ class UsageCounters {
160
160
  }
161
161
  }
162
162
  }
163
- const buildAllWindowIncrements = (kind, captchaType, ip, userAccount) => {
163
+ const buildAllWindowIncrements = (kind, captchaType, ip, userAccount, peerIp) => {
164
164
  const out = [];
165
165
  for (const window of [
166
166
  "1m",
@@ -177,6 +177,12 @@ const buildAllWindowIncrements = (kind, captchaType, ip, userAccount) => {
177
177
  value: userAccount
178
178
  }
179
179
  );
180
+ if (peerIp && peerIp !== ip) {
181
+ out.push({
182
+ spec: { kind, captchaType, dimension: "peerIp", window },
183
+ value: peerIp
184
+ });
185
+ }
180
186
  if (captchaType !== "any") {
181
187
  out.push(
182
188
  {
@@ -193,6 +199,17 @@ const buildAllWindowIncrements = (kind, captchaType, ip, userAccount) => {
193
199
  value: userAccount
194
200
  }
195
201
  );
202
+ if (peerIp && peerIp !== ip) {
203
+ out.push({
204
+ spec: {
205
+ kind,
206
+ captchaType: "any",
207
+ dimension: "peerIp",
208
+ window
209
+ },
210
+ value: peerIp
211
+ });
212
+ }
196
213
  }
197
214
  }
198
215
  return out;
package/dist/cjs/util.cjs CHANGED
@@ -224,7 +224,17 @@ const evaluateIpValidationRules = (comparison, rules, logger) => {
224
224
  shouldFlag
225
225
  };
226
226
  };
227
- const deepValidateIpAddress = async (ip, challengeIpAddress, logger, ipInfoService, ipValidationRules) => {
227
+ const deepValidateIpAddress = async (ip, challengeIpAddress, logger, ipInfoService, ipValidationRules, dnsPeerIp) => {
228
+ if (ipValidationRules?.forceConsistentIp === true && dnsPeerIp && dnsPeerIp !== ip) {
229
+ logger.info(() => ({
230
+ msg: "IP validation failed - dnsEvent.peerIp does not match client IP",
231
+ data: { clientIp: ip, dnsPeerIp }
232
+ }));
233
+ return {
234
+ isValid: false,
235
+ errorMessage: `Client IP ${ip} does not match dnsEvent.peerIp ${dnsPeerIp}`
236
+ };
237
+ }
228
238
  const standardValidation = validateIpAddress(ip, challengeIpAddress, logger);
229
239
  if (!standardValidation.isValid) {
230
240
  if (standardValidation.errorMessage?.includes("Invalid IP address")) {
package/dist/pairs.d.ts CHANGED
@@ -1,3 +1,7 @@
1
1
  export declare const constructPairList: (list: number[]) => [number, number][];
2
+ export declare const peelCheckboxPrefix: (flat: number[][], solutionLengths: number[]) => {
3
+ checkbox?: [number, number];
4
+ flat: number[][];
5
+ };
2
6
  export declare const containsIdenticalPairs: (pairsLists: [number, number][][]) => boolean;
3
7
  //# sourceMappingURL=pairs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pairs.d.ts","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,iBAAiB,SAAU,MAAM,EAAE,KAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAWlE,CAAC;AAMF,eAAO,MAAM,sBAAsB,eAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,YActE,CAAC"}
1
+ {"version":3,"file":"pairs.d.ts","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,iBAAiB,SAAU,MAAM,EAAE,KAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAWlE,CAAC;AAEF,eAAO,MAAM,kBAAkB,SACxB,MAAM,EAAE,EAAE,mBACC,MAAM,EAAE,KACvB;IAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;CAYjD,CAAC;AAMF,eAAO,MAAM,sBAAsB,eAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,YActE,CAAC"}
package/dist/pairs.js CHANGED
@@ -9,6 +9,19 @@ const constructPairList = (list) => {
9
9
  }
10
10
  return pairList;
11
11
  };
12
+ const peelCheckboxPrefix = (flat, solutionLengths) => {
13
+ const firstFlat = flat[0];
14
+ const firstLen = solutionLengths[0];
15
+ if (firstFlat === void 0 || firstLen === void 0) {
16
+ return { flat };
17
+ }
18
+ if (firstFlat.length === 2 * firstLen + 2) {
19
+ const checkbox = [at(firstFlat, 0), at(firstFlat, 1)];
20
+ const stripped = [firstFlat.slice(2), ...flat.slice(1)];
21
+ return { checkbox, flat: stripped };
22
+ }
23
+ return { flat };
24
+ };
12
25
  const containsIdenticalPairs = (pairsLists) => {
13
26
  const set = /* @__PURE__ */ new Set();
14
27
  for (const pairList of pairsLists) {
@@ -23,5 +36,6 @@ const containsIdenticalPairs = (pairsLists) => {
23
36
  };
24
37
  export {
25
38
  constructPairList,
26
- containsIdenticalPairs
39
+ containsIdenticalPairs,
40
+ peelCheckboxPrefix
27
41
  };
package/dist/pairs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pairs.js","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAKnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAsB,EAAE;IAEvE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,UAAgC,EAAE,EAAE;IAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAGD,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACzD,CAAC,CAAC"}
1
+ {"version":3,"file":"pairs.js","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAKnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAsB,EAAE;IAEvE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,IAAgB,EAChB,eAAyB,EAC2B,EAAE;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,SAAS,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,CAAC;IACjB,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,UAAgC,EAAE,EAAE;IAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAGD,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACzD,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { RedisWriteQueue } from "@prosopo/database";
2
2
  import type { TranslationKey } from "@prosopo/locale";
3
3
  import { type Logger } from "@prosopo/logger";
4
- import { type CaptchaType, type IPInfoResponse, type ITrafficFilter, type KeyringPair, type ProsopoConfigOutput, type RequestHeaders, type Session, type SimdReadingsStage, Tier, type UserCommitment } from "@prosopo/types";
4
+ import { type CaptchaType, type EnrichedDnsEvent, type IPInfoResponse, type ITrafficFilter, type KeyringPair, type ProsopoConfigOutput, type RequestHeaders, type Session, type SimdReadingsStage, Tier, type UserCommitment } from "@prosopo/types";
5
5
  import type { ClientRecord, IProviderDatabase, IUserDataSlim, PoWCaptchaRecord, PuzzleCaptchaRecord } from "@prosopo/types-database";
6
6
  import type { ProviderEnvironment } from "@prosopo/types-env";
7
7
  import { type AccessPolicy, type AccessRulesStorage, type UserScope, type UserScopeRecord } from "@prosopo/user-access-policy";
@@ -46,7 +46,7 @@ export declare class CaptchaManager {
46
46
  decryptBehavioralData(encryptedData: string, decryptKeys: (string | undefined)[]): Promise<BehavioralDataResult | null>;
47
47
  checkForHardBlock(userAccessRulesStorage: AccessRulesStorage, challengeRecord: PoWCaptchaRecord | PuzzleCaptchaRecord | UserCommitment, userAccount: string, headers: RequestHeaders, coords?: [number, number][][], countryCode?: string, asn?: number): Promise<AccessPolicy | undefined>;
48
48
  checkSpamEmail(email: string): Promise<boolean>;
49
- resolveTrafficFilterCheck(env: ProviderEnvironment, recordIpInfo: IPInfoResponse | undefined, trafficFilter: Partial<ITrafficFilter> | undefined, currentIp?: string): Promise<TrafficCheckResult>;
49
+ resolveTrafficFilterCheck(env: ProviderEnvironment, recordIpInfo: IPInfoResponse | undefined, trafficFilter: Partial<ITrafficFilter> | undefined, currentIp?: string, enrichedDnsEvent?: EnrichedDnsEvent): Promise<TrafficCheckResult>;
50
50
  static canClientSeeScore(tier: Tier, score?: number): boolean | 0 | undefined;
51
51
  }
52
52
  //# sourceMappingURL=captchaManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"captchaManager.d.ts","sourceRoot":"","sources":["../../src/tasks/captchaManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"captchaManager.d.ts","sourceRoot":"","sources":["../../src/tasks/captchaManager.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAEN,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EAEnB,KAAK,OAAO,EACZ,KAAK,iBAAiB,EACtB,IAAI,EACJ,KAAK,cAAc,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACN,KAAK,YAAY,EAEjB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,MAAM,6BAA6B,CAAC;AAMrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,OAAO,EACN,KAAK,kBAAkB,EAEvB,MAAM,8BAA8B,CAAC;AA0BtC,qBAAa,cAAc;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,iBAAiB,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;gBAGlC,EAAE,EAAE,iBAAiB,EACrB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI;IAqBvB,4BAA4B,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACzB,eAAe,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC,IAAI,CAAC;IAiBH,4BAA4B,CACxC,sBAAsB,EAAE,MAAM,GAC5B,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS,CAAC;IAe/C,oCAAoC,CAChD,SAAS,EAAE,MAAM,EACjB,sBAAsB,EAAE,MAAM,EAC9B,KAAK,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC;IAgBH,0CAA0C,CACtD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAC9C,KAAK,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC;IAgBT,0BAA0B,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACzB,eAAe,CAAC,EAAE,OAAO,GACvB,IAAI;IAqBA,+BAA+B,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAC9C,KAAK,EAAE,iBAAiB,GACtB,IAAI;IAYD,iBAAiB,CACtB,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;IAMjD,cAAc,CACnB,cAAc,EAAE,YAAY,GAAG,aAAa,EAC5C,oBAAoB,EAAE,WAAW,EACjC,GAAG,EAAE,mBAAmB,EACxB,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,YAAY,EAC/B,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QACV,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,WAAW,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAI3B,MAAM,CAAC,EAAE,cAAc,CAAC;KACxB,CAAC;IAkLF,uBAAuB,CACtB,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACpC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM;;;;;;IAkBV,4BAA4B,CACjC,sBAAsB,EAAE,kBAAkB,EAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,GAAG,eAAe;IASjC,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYpC,mBAAmB,CACxB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GACjC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAkC/B,qBAAqB,CAC1B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GACjC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAsEjC,iBAAiB,CACtB,sBAAsB,EAAE,kBAAkB,EAC1C,eAAe,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,cAAc,EACxE,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAC7B,WAAW,CAAC,EAAE,MAAM,EACpB,GAAG,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA0C9B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB/C,yBAAyB,CAC9B,GAAG,EAAE,mBAAmB,EACxB,YAAY,EAAE,cAAc,GAAG,SAAS,EACxC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,EAClD,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,gBAAgB,GACjC,OAAO,CAAC,kBAAkB,CAAC;IAkB9B,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM;CAGnD"}