@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.
- package/.turbo/turbo-build$colon$cjs.log +20 -19
- package/.turbo/turbo-build$colon$tsc.log +24 -24
- package/.turbo/turbo-build.log +21 -20
- package/CHANGELOG.md +107 -0
- package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +1 -1
- package/dist/api/admin/apiAdminRoutesProvider.js +4 -1
- package/dist/api/admin/apiAdminRoutesProvider.js.map +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.d.ts +4 -1
- package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.js +31 -1
- package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.js +5 -2
- package/dist/api/blacklistRequestInspector.js.map +1 -1
- package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -1
- package/dist/api/captcha/checkSpamEmail.js +9 -1
- package/dist/api/captcha/checkSpamEmail.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +5 -5
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.js +10 -1
- package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPoWCaptchaChallenge.js +2 -2
- package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +2 -2
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/maintenanceModeResponses.d.ts +2 -1
- package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
- package/dist/api/captcha/maintenanceModeResponses.js +10 -0
- package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.js +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.js +3 -4
- package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPuzzleCaptchaSolution.js +3 -4
- package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +7 -7
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +4 -1
- package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +31 -1
- package/dist/cjs/api/blacklistRequestInspector.cjs +5 -2
- package/dist/cjs/api/captcha/checkSpamEmail.cjs +9 -1
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +5 -5
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +10 -1
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +2 -2
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +2 -2
- package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +10 -0
- package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +1 -1
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +3 -4
- package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +3 -4
- package/dist/cjs/api/verify.cjs +7 -7
- package/dist/cjs/pairs.cjs +14 -0
- package/dist/cjs/tasks/captchaManager.cjs +10 -3
- package/dist/cjs/tasks/dnsEvent/enrichDnsEvent.cjs +62 -0
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +70 -34
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +46 -17
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +46 -17
- package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +19 -2
- package/dist/cjs/tasks/tasks.cjs +1 -0
- package/dist/cjs/util/usageCounters.cjs +18 -1
- package/dist/cjs/util.cjs +11 -1
- package/dist/pairs.d.ts +4 -0
- package/dist/pairs.d.ts.map +1 -1
- package/dist/pairs.js +15 -1
- package/dist/pairs.js.map +1 -1
- package/dist/tasks/captchaManager.d.ts +2 -2
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +10 -3
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/dnsEvent/enrichDnsEvent.d.ts +8 -0
- package/dist/tasks/dnsEvent/enrichDnsEvent.d.ts.map +1 -0
- package/dist/tasks/dnsEvent/enrichDnsEvent.js +62 -0
- package/dist/tasks/dnsEvent/enrichDnsEvent.js.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +71 -35
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.js +46 -17
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js +46 -17
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.js +19 -2
- package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
- package/dist/tasks/tasks.d.ts +1 -0
- package/dist/tasks/tasks.d.ts.map +1 -1
- package/dist/tasks/tasks.js +1 -0
- package/dist/tasks/tasks.js.map +1 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +2 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js +1 -0
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
- package/dist/tests/integration/powCaptcha.integration.test.js +0 -4
- package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +37 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
- package/dist/tests/unit/pairs.unit.test.js +79 -1
- package/dist/tests/unit/pairs.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +29 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.js +94 -0
- package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +16 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +36 -3
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +8 -1
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +68 -0
- package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
- package/dist/util/usageCounters.d.ts +1 -1
- package/dist/util/usageCounters.d.ts.map +1 -1
- package/dist/util/usageCounters.js +18 -1
- package/dist/util/usageCounters.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +11 -1
- package/dist/util.js.map +1 -1
- 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
|
|
178
|
-
const
|
|
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
|
|
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: {
|
|
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 (
|
|
623
|
-
const
|
|
624
|
-
|
|
649
|
+
if (sessionRecord) {
|
|
650
|
+
const dnsAsymmetry = enrichDnsEvent.computeDnsAsymmetry(
|
|
651
|
+
enrichedDnsEvent,
|
|
652
|
+
solution.ipInfo
|
|
625
653
|
);
|
|
626
|
-
if (
|
|
627
|
-
|
|
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
|
-
|
|
630
|
-
|
|
631
|
-
|
|
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
|
|
360
|
-
|
|
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: {
|
|
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 (
|
|
494
|
-
const
|
|
495
|
-
|
|
513
|
+
if (sessionRecord) {
|
|
514
|
+
const dnsAsymmetry = enrichDnsEvent.computeDnsAsymmetry(
|
|
515
|
+
enrichedDnsEvent,
|
|
516
|
+
challengeRecord.ipInfo
|
|
496
517
|
);
|
|
497
|
-
if (
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
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
|
|
285
|
-
|
|
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: {
|
|
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 (
|
|
447
|
-
const
|
|
448
|
-
|
|
466
|
+
if (sessionRecord) {
|
|
467
|
+
const dnsAsymmetry = enrichDnsEvent.computeDnsAsymmetry(
|
|
468
|
+
enrichedDnsEvent,
|
|
469
|
+
challengeRecord.ipInfo
|
|
449
470
|
);
|
|
450
|
-
if (
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
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
|
|
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;
|
package/dist/cjs/tasks/tasks.cjs
CHANGED
|
@@ -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
|
package/dist/pairs.d.ts.map
CHANGED
|
@@ -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":"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,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;
|
|
1
|
+
{"version":3,"file":"captchaManager.d.ts","sourceRoot":"","sources":["../../src/tasks/captchaManager.ts"],"names":[],"mappings":"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"}
|