@prosopo/provider 5.2.1 → 5.3.0
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 +16 -12
- package/.turbo/turbo-build$colon$tsc.log +27 -24
- package/.turbo/turbo-build.log +17 -13
- package/CHANGELOG.md +48 -0
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +11 -4
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/maintenanceModeResponses.d.ts +1 -1
- package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
- package/dist/api/captcha/maintenanceModeResponses.js +11 -6
- package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.js +4 -2
- package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/trafficFilterRequestTime.d.ts +2 -1
- package/dist/api/captcha/trafficFilterRequestTime.d.ts.map +1 -1
- package/dist/api/captcha/trafficFilterRequestTime.js +1 -0
- package/dist/api/captcha/trafficFilterRequestTime.js.map +1 -1
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +11 -4
- package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +11 -6
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +4 -2
- package/dist/cjs/api/captcha/trafficFilterRequestTime.cjs +1 -0
- package/dist/cjs/tasks/dnsEvent/enrichDnsEvent.cjs +17 -11
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +2 -1
- package/dist/cjs/tasks/puzzle/backgroundBuffer.cjs +39 -0
- package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +78 -0
- package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +62 -31
- package/dist/tasks/dnsEvent/enrichDnsEvent.d.ts.map +1 -1
- package/dist/tasks/dnsEvent/enrichDnsEvent.js +17 -11
- package/dist/tasks/dnsEvent/enrichDnsEvent.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +2 -1
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
- package/dist/tasks/puzzle/backgroundBuffer.d.ts +21 -0
- package/dist/tasks/puzzle/backgroundBuffer.d.ts.map +1 -0
- package/dist/tasks/puzzle/backgroundBuffer.js +37 -0
- package/dist/tasks/puzzle/backgroundBuffer.js.map +1 -0
- package/dist/tasks/puzzle/puzzleRenderer.d.ts +13 -0
- package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -0
- package/dist/tasks/puzzle/puzzleRenderer.js +75 -0
- package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -0
- package/dist/tasks/spam/checkTrafficFilter.d.ts +3 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.js +62 -32
- package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
- package/dist/tests/unit/api/captcha/maintenanceModeResponses.unit.test.js +8 -7
- package/dist/tests/unit/api/captcha/maintenanceModeResponses.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +1 -1
- package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/trafficFilterRequestTime.unit.test.js +2 -1
- package/dist/tests/unit/api/captcha/trafficFilterRequestTime.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/dnsEvent/enrichDnsEvent.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js +84 -0
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +66 -4
- package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
- package/package.json +14 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trafficFilterRequestTime.d.ts","sourceRoot":"","sources":["../../../src/api/captcha/trafficFilterRequestTime.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACN,WAAW,EAEX,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EACN,KAAK,uBAAuB,EAG5B,MAAM,wCAAwC,CAAC;AAEhD,MAAM,MAAM,yBAAyB,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IACA,IAAI,EAAE,WAAW,CAAC;IAGlB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"trafficFilterRequestTime.d.ts","sourceRoot":"","sources":["../../../src/api/captcha/trafficFilterRequestTime.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACN,WAAW,EAEX,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EACN,KAAK,uBAAuB,EAG5B,MAAM,wCAAwC,CAAC;AAEhD,MAAM,MAAM,yBAAyB,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IACA,IAAI,EAAE,WAAW,CAAC;IAGlB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IAKzB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,gBAAgB,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;CAC7D,CAAC;AAeL,eAAO,MAAM,+BAA+B,WACnC,cAAc,GAAG,SAAS,iBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,WACzC,MAAM,KACb,yBAiCF,CAAC;AAEF,MAAM,MAAM,gCAAgC,GACzC;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAClB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEzC,MAAM,MAAM,8BAA8B,GAAG;IAC5C,OAAO,EAAE,yBAAyB,CAAC;IACnC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAWF,eAAO,MAAM,+BAA+B,UACpC,8BAA8B,OAChC,QAAQ,KACX,OAAO,CAAC,gCAAgC,CAyD1C,CAAC"}
|
|
@@ -34,6 +34,7 @@ var applyTrafficFilterAtRequestTime = (ipInfo, trafficFilter, logger) => {
|
|
|
34
34
|
powDifficulty: resolved.powDifficulty,
|
|
35
35
|
solvedImagesCount: resolved.solvedImagesCount,
|
|
36
36
|
puzzleTolerance: resolved.puzzleTolerance,
|
|
37
|
+
puzzleSettings: resolved.puzzleSettings,
|
|
37
38
|
sourceCategories: resolved.sourceCategories
|
|
38
39
|
};
|
|
39
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trafficFilterRequestTime.js","sourceRoot":"","sources":["../../../src/api/captcha/trafficFilterRequestTime.ts"],"names":[],"mappings":"AAeA,OAAO,EACN,WAAW,
|
|
1
|
+
{"version":3,"file":"trafficFilterRequestTime.js","sourceRoot":"","sources":["../../../src/api/captcha/trafficFilterRequestTime.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ const require_validateAddress = require("../validateAddress.cjs");
|
|
|
2
2
|
const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
|
|
3
3
|
const require_metrics = require("../metrics.cjs");
|
|
4
4
|
const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
|
|
5
|
+
const require_puzzleRenderer = require("../../tasks/puzzle/puzzleRenderer.cjs");
|
|
5
6
|
const require_tasks = require("../../tasks/tasks.cjs");
|
|
6
7
|
const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
7
8
|
const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
|
|
@@ -37,7 +38,7 @@ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (
|
|
|
37
38
|
sessionId
|
|
38
39
|
}
|
|
39
40
|
}));
|
|
40
|
-
return res.json(require_maintenanceModeResponses.buildPuzzleMaintenanceResponse(user, dapp));
|
|
41
|
+
return res.json(await require_maintenanceModeResponses.buildPuzzleMaintenanceResponse(user, dapp));
|
|
41
42
|
}
|
|
42
43
|
const tasks = new require_tasks.Tasks(env, req.logger);
|
|
43
44
|
try {
|
|
@@ -80,6 +81,8 @@ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (
|
|
|
80
81
|
}));
|
|
81
82
|
const trafficVerdict = require_trafficFilterRequestTime.applyTrafficFilterAtRequestTime(req.ipInfo, clientSettings.settings?.trafficFilter, req.logger);
|
|
82
83
|
const tolerance = (trafficVerdict.kind === "challenge" ? trafficVerdict.puzzleTolerance : void 0) ?? clientSettings?.settings?.puzzleTolerance;
|
|
84
|
+
const trafficPuzzleSettings = trafficVerdict.kind === "challenge" ? trafficVerdict.puzzleSettings : void 0;
|
|
85
|
+
const effectivePuzzleSettings = require_puzzleRenderer.resolvePuzzleRenderSettings(clientSettings?.settings?.puzzle, trafficPuzzleSettings);
|
|
83
86
|
const challenge = await tasks.puzzleCaptchaManager.getPuzzleCaptchaChallenge(user, dapp, origin, tolerance);
|
|
84
87
|
if (validSessionId && simdReadings) await tasks.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(validSessionId, simdReadings, _prosopo_types.SimdReadingsStage.challenge).catch((updateErr) => {
|
|
85
88
|
req.logger.warn(() => ({
|
|
@@ -92,14 +95,18 @@ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (
|
|
|
92
95
|
userAccount: user,
|
|
93
96
|
dappAccount: dapp
|
|
94
97
|
}, challenge.targetX, challenge.targetY, challenge.originX, challenge.originY, challenge.tolerance, challenge.providerSignature, require_compositeIpAddress.getCompositeIpAddress(normalizedIp), (0, _prosopo_util.flatten)(req.headers), req.ja4, validSessionId, req.ipInfo);
|
|
98
|
+
const images = await require_puzzleRenderer.renderPuzzleImages({
|
|
99
|
+
targetX: challenge.targetX,
|
|
100
|
+
targetY: challenge.targetY
|
|
101
|
+
}, effectivePuzzleSettings);
|
|
95
102
|
const getPuzzleCaptchaResponse = {
|
|
96
103
|
[_prosopo_types.ApiParams.status]: "ok",
|
|
97
104
|
[_prosopo_types.ApiParams.challenge]: challenge.challenge,
|
|
98
|
-
[_prosopo_types.ApiParams.
|
|
99
|
-
[_prosopo_types.ApiParams.
|
|
105
|
+
[_prosopo_types.ApiParams.background]: images.background,
|
|
106
|
+
[_prosopo_types.ApiParams.piece]: images.piece,
|
|
107
|
+
[_prosopo_types.ApiParams.pieceSize]: images.pieceSize,
|
|
100
108
|
[_prosopo_types.ApiParams.originX]: challenge.originX,
|
|
101
109
|
[_prosopo_types.ApiParams.originY]: challenge.originY,
|
|
102
|
-
[_prosopo_types.ApiParams.tolerance]: challenge.tolerance,
|
|
103
110
|
[_prosopo_types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
|
|
104
111
|
[_prosopo_types.ApiParams.signature]: { [_prosopo_types.ApiParams.provider]: { [_prosopo_types.ApiParams.challenge]: challenge.providerSignature } }
|
|
105
112
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const require_puzzleRenderer = require("../../tasks/puzzle/puzzleRenderer.cjs");
|
|
1
2
|
let _prosopo_types = require("@prosopo/types");
|
|
2
3
|
let node_crypto = require("node:crypto");
|
|
3
4
|
//#region src/api/captcha/maintenanceModeResponses.ts
|
|
@@ -30,16 +31,20 @@ var buildImageMaintenanceResponse = () => ({
|
|
|
30
31
|
[_prosopo_types.ApiParams.timestamp]: Date.now().toString(),
|
|
31
32
|
[_prosopo_types.ApiParams.signature]: { [_prosopo_types.ApiParams.provider]: { [_prosopo_types.ApiParams.requestHash]: "" } }
|
|
32
33
|
});
|
|
33
|
-
var buildPuzzleMaintenanceResponse = (user, dapp) => {
|
|
34
|
+
var buildPuzzleMaintenanceResponse = async (user, dapp) => {
|
|
34
35
|
const timestamp = Date.now();
|
|
36
|
+
const images = await require_puzzleRenderer.renderPuzzleImages({
|
|
37
|
+
targetX: 200,
|
|
38
|
+
targetY: 100
|
|
39
|
+
});
|
|
35
40
|
return {
|
|
36
41
|
[_prosopo_types.ApiParams.status]: "ok",
|
|
37
42
|
[_prosopo_types.ApiParams.challenge]: buildChallenge(user, dapp),
|
|
38
|
-
[_prosopo_types.ApiParams.
|
|
39
|
-
[_prosopo_types.ApiParams.
|
|
40
|
-
[_prosopo_types.ApiParams.
|
|
41
|
-
[_prosopo_types.ApiParams.
|
|
42
|
-
[_prosopo_types.ApiParams.
|
|
43
|
+
[_prosopo_types.ApiParams.background]: images.background,
|
|
44
|
+
[_prosopo_types.ApiParams.piece]: images.piece,
|
|
45
|
+
[_prosopo_types.ApiParams.pieceSize]: images.pieceSize,
|
|
46
|
+
[_prosopo_types.ApiParams.originX]: 60,
|
|
47
|
+
[_prosopo_types.ApiParams.originY]: 100,
|
|
43
48
|
[_prosopo_types.ApiParams.timestamp]: timestamp.toString(),
|
|
44
49
|
[_prosopo_types.ApiParams.signature]: { [_prosopo_types.ApiParams.provider]: { [_prosopo_types.ApiParams.challenge]: "" } }
|
|
45
50
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const require_validateAddress = require("../validateAddress.cjs");
|
|
2
|
+
const require_puzzleRenderer = require("../../tasks/puzzle/puzzleRenderer.cjs");
|
|
2
3
|
const require_tasks = require("../../tasks/tasks.cjs");
|
|
3
4
|
const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
4
5
|
const require_devicePlatform = require("../../utils/devicePlatform.cjs");
|
|
@@ -130,11 +131,12 @@ var buildEscalation = async (tasks, result, challenge, handshakeTiming) => {
|
|
|
130
131
|
const originSession = await tasks.db.getSessionRecordBySessionId(powRecord.sessionId);
|
|
131
132
|
if (!originSession) return void 0;
|
|
132
133
|
const routed = result.routingOutput;
|
|
134
|
+
const escalatedType = require_puzzleRenderer.downgradePuzzleIfUnavailable(routed.captchaType);
|
|
133
135
|
const selectionReason = routed.reason ?? originSession.reason;
|
|
134
|
-
const newSession = await tasks.frictionlessManager.createSession(originSession.token, originSession.score, originSession.threshold, originSession.scoreComponents, originSession.ipAddress,
|
|
136
|
+
const newSession = await tasks.frictionlessManager.createSession(originSession.token, originSession.score, originSession.threshold, originSession.scoreComponents, originSession.ipAddress, escalatedType, originSession.siteKey ?? powRecord.dappAccount, escalatedType === _prosopo_types.CaptchaType.image ? routed.solvedImagesCount ?? originSession.solvedImagesCount : void 0, void 0, originSession.userSitekeyIpHash, originSession.webView, originSession.iFrame, originSession.decryptedHeadHash, selectionReason, void 0, void 0, originSession.ipInfo, originSession.headers, originSession.mode, originSession.simdReadings, originSession.entropyMathRandomFingerprint, originSession.entropyCryptoFingerprint, originSession.entropyWallClockOffsetMs, originSession.entropyMathRandomFirst, originSession.bundleId, originSession.currentUrl, handshakeTiming?.tcpToChelloUs, handshakeTiming?.chelloToHandshakeUs, true, originSession.iframeUrl, originSession.isProtect, originSession.sessionId, originSession.g, void 0, originSession.i, originSession.sw, originSession.md, originSession.bn, originSession.fs);
|
|
135
137
|
if (tasks.writeQueue) await tasks.writeQueue.cacheSessionEscalation(powRecord.sessionId, newSession.sessionId);
|
|
136
138
|
return {
|
|
137
|
-
captchaType:
|
|
139
|
+
captchaType: escalatedType,
|
|
138
140
|
sessionId: newSession.sessionId
|
|
139
141
|
};
|
|
140
142
|
};
|
|
@@ -35,6 +35,7 @@ var applyTrafficFilterAtRequestTime = (ipInfo, trafficFilter, logger) => {
|
|
|
35
35
|
powDifficulty: resolved.powDifficulty,
|
|
36
36
|
solvedImagesCount: resolved.solvedImagesCount,
|
|
37
37
|
puzzleTolerance: resolved.puzzleTolerance,
|
|
38
|
+
puzzleSettings: resolved.puzzleSettings,
|
|
38
39
|
sourceCategories: resolved.sourceCategories
|
|
39
40
|
};
|
|
40
41
|
};
|
|
@@ -45,18 +45,24 @@ var extraIpInfosFromEnrichedDnsEvent = (enriched) => {
|
|
|
45
45
|
* - resolver / peer classified `isAbuser`
|
|
46
46
|
* - client IP is a consumer ISP but resolver is datacenter (compound)
|
|
47
47
|
*
|
|
48
|
-
* When `trafficFilter` is supplied, the datacenter
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
48
|
+
* When `trafficFilter` is supplied, the datacenter contribution is gated
|
|
49
|
+
* on operator-policy-aware shielding, *not* on the strict per-IP precedence
|
|
50
|
+
* chain the client-IP path uses. DNS resolvers are legitimately often on
|
|
51
|
+
* datacenter ranges (Google/Cloudflare/consumer-VPN DNS), so signal
|
|
52
|
+
* counting has to consider the operator's stance:
|
|
52
53
|
*
|
|
53
|
-
* - datacenter category must be configured;
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* -
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
54
|
+
* - datacenter category must be configured; `providerType === "isp"`
|
|
55
|
+
* short-circuits; `datacenterNameAllowlist` skips; `datacenterNameDenylist`
|
|
56
|
+
* forces the signal through (denylist wins over all other exemptions)
|
|
57
|
+
* - a higher-precedence flag the operator has left **unconfigured** (VPN,
|
|
58
|
+
* proxy, Tor, crawler) on the same resolver IP shields the datacenter
|
|
59
|
+
* signal — the flag "explains" the DC status and the operator has said
|
|
60
|
+
* they don't care about that category. Flags that are configured (block
|
|
61
|
+
* or challenge) do *not* shield, because the operator is treating that
|
|
62
|
+
* category as suspicious in its own right.
|
|
63
|
+
* - abuser is not shielded by any other category: its signal counts
|
|
64
|
+
* whenever the abuser category is configured and the score meets the
|
|
65
|
+
* threshold.
|
|
60
66
|
*
|
|
61
67
|
* `pathValid` is a protocol signal, not a category — it always contributes
|
|
62
68
|
* regardless of trafficFilter. When `trafficFilter` is omitted, all
|
|
@@ -4,6 +4,7 @@ const require_dnsEventUrl = require("../../api/dnsEventUrl.cjs");
|
|
|
4
4
|
const require_lang = require("../../rules/lang.cjs");
|
|
5
5
|
const require_captchaManager = require("../captchaManager.cjs");
|
|
6
6
|
const require_getBotScore = require("../detection/getBotScore.cjs");
|
|
7
|
+
const require_puzzleRenderer = require("../puzzle/puzzleRenderer.cjs");
|
|
7
8
|
const require_routingMachine = require("./routingMachine.cjs");
|
|
8
9
|
let _prosopo_types = require("@prosopo/types");
|
|
9
10
|
let uuid = require("uuid");
|
|
@@ -177,7 +178,7 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
|
|
|
177
178
|
powDifficulty: captchaType === _prosopo_types.CaptchaType.pow ? effectiveParams.powDifficulty : void 0
|
|
178
179
|
};
|
|
179
180
|
const routed = this.routingContext ? await require_routingMachine.applyRouter(this.decisionMachineRunner, this.usageCounters, baseline, this.routingContext, this.logger) : baseline;
|
|
180
|
-
const finalCaptchaType = routed.captchaType;
|
|
181
|
+
const finalCaptchaType = require_puzzleRenderer.downgradePuzzleIfUnavailable(routed.captchaType, this.logger);
|
|
181
182
|
const finalSolvedImagesCount = finalCaptchaType === _prosopo_types.CaptchaType.image ? routed.solvedImagesCount ?? effectiveParams.solvedImagesCount : void 0;
|
|
182
183
|
const finalPowDifficulty = finalCaptchaType === _prosopo_types.CaptchaType.pow ? routed.powDifficulty ?? effectiveParams.powDifficulty : void 0;
|
|
183
184
|
const blocked = finalCaptchaType === _prosopo_types.CaptchaType.image ? effectiveParams.blocked : void 0;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
let _prosopo_puzzle_assets = require("@prosopo/puzzle-assets");
|
|
2
|
+
var createPuzzleBackgroundBuffer = (options = {}) => {
|
|
3
|
+
const capacity = options.capacity ?? 16;
|
|
4
|
+
const refillIntervalMs = options.refillIntervalMs ?? 250;
|
|
5
|
+
const refillBatch = options.refillBatch ?? 4;
|
|
6
|
+
const geometry = options.geometry ?? _prosopo_puzzle_assets.DEFAULT_GEOMETRY;
|
|
7
|
+
const ready = [];
|
|
8
|
+
let starved = 0;
|
|
9
|
+
const topUp = (limit) => {
|
|
10
|
+
for (let i = 0; i < limit && ready.length < capacity; i++) ready.push((0, _prosopo_puzzle_assets.createBackground)(geometry));
|
|
11
|
+
};
|
|
12
|
+
topUp(capacity);
|
|
13
|
+
const timer = setInterval(() => topUp(refillBatch), refillIntervalMs);
|
|
14
|
+
timer.unref?.();
|
|
15
|
+
return {
|
|
16
|
+
take() {
|
|
17
|
+
const image = ready.pop();
|
|
18
|
+
if (!image) {
|
|
19
|
+
starved++;
|
|
20
|
+
return (0, _prosopo_puzzle_assets.createBackground)(geometry);
|
|
21
|
+
}
|
|
22
|
+
return image;
|
|
23
|
+
},
|
|
24
|
+
depth: () => ready.length,
|
|
25
|
+
starvations: () => starved,
|
|
26
|
+
stop: () => clearInterval(timer)
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
var globalBuffer = null;
|
|
30
|
+
var initPuzzleBackgroundBuffer = (options = {}) => {
|
|
31
|
+
globalBuffer?.stop();
|
|
32
|
+
globalBuffer = createPuzzleBackgroundBuffer(options);
|
|
33
|
+
return globalBuffer;
|
|
34
|
+
};
|
|
35
|
+
var getPuzzleBackgroundBuffer = () => globalBuffer;
|
|
36
|
+
//#endregion
|
|
37
|
+
exports.createPuzzleBackgroundBuffer = createPuzzleBackgroundBuffer;
|
|
38
|
+
exports.getPuzzleBackgroundBuffer = getPuzzleBackgroundBuffer;
|
|
39
|
+
exports.initPuzzleBackgroundBuffer = initPuzzleBackgroundBuffer;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const require_backgroundBuffer = require("./backgroundBuffer.cjs");
|
|
2
|
+
let _prosopo_types = require("@prosopo/types");
|
|
3
|
+
let _prosopo_puzzle_assets = require("@prosopo/puzzle-assets");
|
|
4
|
+
//#region src/tasks/puzzle/puzzleRenderer.ts
|
|
5
|
+
/**
|
|
6
|
+
* Merge zero or more partial-override sources on top of the asset package
|
|
7
|
+
* defaults. Later sources win, matching the tolerance-resolution order in
|
|
8
|
+
* `getPuzzleCaptchaChallenge`: traffic-filter policy overrides the
|
|
9
|
+
* client-record setting, which in turn overrides the built-in default.
|
|
10
|
+
*/
|
|
11
|
+
var resolvePuzzleRenderSettings = (...overrides) => {
|
|
12
|
+
let resolved = { ..._prosopo_puzzle_assets.DEFAULT_RENDER_SETTINGS };
|
|
13
|
+
for (const override of overrides) {
|
|
14
|
+
if (!override) continue;
|
|
15
|
+
if (override.decoyCount !== void 0) resolved = {
|
|
16
|
+
...resolved,
|
|
17
|
+
decoyCount: override.decoyCount
|
|
18
|
+
};
|
|
19
|
+
if (override.decoyEdgeDarkness !== void 0) resolved = {
|
|
20
|
+
...resolved,
|
|
21
|
+
decoyEdgeDarkness: override.decoyEdgeDarkness
|
|
22
|
+
};
|
|
23
|
+
if (override.decoyBodyBrightness !== void 0) resolved = {
|
|
24
|
+
...resolved,
|
|
25
|
+
decoyBodyBrightness: override.decoyBodyBrightness
|
|
26
|
+
};
|
|
27
|
+
if (override.holeDarken !== void 0) resolved = {
|
|
28
|
+
...resolved,
|
|
29
|
+
holeDarken: override.holeDarken
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return resolved;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Whether this provider can render puzzle imagery right now.
|
|
36
|
+
*
|
|
37
|
+
* Checked where a captchaType is *chosen*, not where the challenge is served:
|
|
38
|
+
* `/captcha/puzzle` cannot answer with an image captcha, because the response
|
|
39
|
+
* shapes are unrelated and the puzzle widget cannot render one. Minting a
|
|
40
|
+
* puzzle session this provider cannot fulfil would strand the user on
|
|
41
|
+
* INCORRECT_CAPTCHA_TYPE, so the decision has to happen before the session is
|
|
42
|
+
* written. See the two mint sites in frictionlessTasks and buildEscalation.
|
|
43
|
+
*/
|
|
44
|
+
var isPuzzleRenderAvailable = () => {
|
|
45
|
+
return true;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Substitute `image` for `puzzle` when this provider cannot render imagery.
|
|
49
|
+
*
|
|
50
|
+
* Call this at every point a session's captchaType is decided, never at the
|
|
51
|
+
* point one is served. Returns other types untouched.
|
|
52
|
+
*/
|
|
53
|
+
var downgradePuzzleIfUnavailable = (captchaType, logger) => {
|
|
54
|
+
if (captchaType !== _prosopo_types.CaptchaType.puzzle || isPuzzleRenderAvailable()) return captchaType;
|
|
55
|
+
logger?.warn(() => ({
|
|
56
|
+
msg: "Puzzle rendering unavailable - downgrading session to image",
|
|
57
|
+
data: {
|
|
58
|
+
requested: captchaType,
|
|
59
|
+
served: _prosopo_types.CaptchaType.image
|
|
60
|
+
}
|
|
61
|
+
}));
|
|
62
|
+
return _prosopo_types.CaptchaType.image;
|
|
63
|
+
};
|
|
64
|
+
var renderPuzzleImages = async (placement, settings = _prosopo_puzzle_assets.DEFAULT_RENDER_SETTINGS) => {
|
|
65
|
+
const background = (require_backgroundBuffer.getPuzzleBackgroundBuffer() ?? require_backgroundBuffer.initPuzzleBackgroundBuffer()).take();
|
|
66
|
+
if (!background) throw new Error("puzzle renderer: no background available");
|
|
67
|
+
const rendered = await (0, _prosopo_puzzle_assets.renderPuzzle)(background, placement, _prosopo_puzzle_assets.DEFAULT_GEOMETRY, settings);
|
|
68
|
+
return {
|
|
69
|
+
background: (0, _prosopo_puzzle_assets.toDataUri)(rendered.background),
|
|
70
|
+
piece: (0, _prosopo_puzzle_assets.toDataUri)(rendered.piece),
|
|
71
|
+
pieceSize: rendered.pieceSize
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
//#endregion
|
|
75
|
+
exports.downgradePuzzleIfUnavailable = downgradePuzzleIfUnavailable;
|
|
76
|
+
exports.isPuzzleRenderAvailable = isPuzzleRenderAvailable;
|
|
77
|
+
exports.renderPuzzleImages = renderPuzzleImages;
|
|
78
|
+
exports.resolvePuzzleRenderSettings = resolvePuzzleRenderSettings;
|
|
@@ -10,7 +10,6 @@ var CATEGORY_TO_REASON = {
|
|
|
10
10
|
crawler: _prosopo_types.ResultReason.CRAWLER_BLOCKED
|
|
11
11
|
};
|
|
12
12
|
var categoryToReason = (category) => CATEGORY_TO_REASON[category];
|
|
13
|
-
var isActive = (policy) => policy !== void 0;
|
|
14
13
|
var matchesDatacenterNameList = (ipInfo, list) => {
|
|
15
14
|
if (!list || list.length === 0) return false;
|
|
16
15
|
const candidates = [];
|
|
@@ -29,6 +28,11 @@ var matchesDatacenterNameList = (ipInfo, list) => {
|
|
|
29
28
|
};
|
|
30
29
|
var isDatacenterAllowlisted = (ipInfo, allowlist) => matchesDatacenterNameList(ipInfo, allowlist);
|
|
31
30
|
var isDatacenterDenylisted = (ipInfo, denylist) => matchesDatacenterNameList(ipInfo, denylist);
|
|
31
|
+
var isEffectivelyDatacenter = (ipInfo, trafficFilter) => {
|
|
32
|
+
if (!ipInfo.isDatacenter) return false;
|
|
33
|
+
if (isDatacenterDenylisted(ipInfo, trafficFilter.datacenterNameDenylist)) return true;
|
|
34
|
+
return ipInfo.providerType !== "isp" && !isDatacenterAllowlisted(ipInfo, trafficFilter.datacenterNameAllowlist);
|
|
35
|
+
};
|
|
32
36
|
var push = (matches, category, policy) => {
|
|
33
37
|
if (policy) matches.push({
|
|
34
38
|
category,
|
|
@@ -38,21 +42,41 @@ var push = (matches, category, policy) => {
|
|
|
38
42
|
var evaluateIpInfo = (ipInfo, trafficFilter, isDnsExtra = false) => {
|
|
39
43
|
const matches = [];
|
|
40
44
|
if (!ipInfo || !ipInfo.isValid) return matches;
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
if (ipInfo.isTor) {
|
|
46
|
+
push(matches, "tor", trafficFilter.tor);
|
|
47
|
+
return matches;
|
|
48
|
+
}
|
|
49
|
+
if (ipInfo.isVPN) {
|
|
50
|
+
push(matches, "vpn", trafficFilter.vpn);
|
|
51
|
+
return matches;
|
|
52
|
+
}
|
|
53
|
+
if (ipInfo.isProxy) {
|
|
54
|
+
push(matches, "proxy", trafficFilter.proxy);
|
|
55
|
+
return matches;
|
|
56
|
+
}
|
|
57
|
+
if (isEffectivelyDatacenter(ipInfo, trafficFilter)) {
|
|
58
|
+
push(matches, "datacenter", trafficFilter.datacenter);
|
|
59
|
+
return matches;
|
|
60
|
+
}
|
|
61
|
+
if (ipInfo.isAbuser) {
|
|
45
62
|
const threshold = trafficFilter.abuserScoreThreshold ?? _prosopo_types.trafficFilterAbuserScoreThresholdDefault;
|
|
46
|
-
if (Math.max(ipInfo.abuserScore ?? 0, ipInfo.companyAbuserScore ?? 0) >= threshold)
|
|
63
|
+
if (Math.max(ipInfo.abuserScore ?? 0, ipInfo.companyAbuserScore ?? 0) >= threshold) {
|
|
64
|
+
push(matches, "abuser", trafficFilter.abuser);
|
|
65
|
+
return matches;
|
|
66
|
+
}
|
|
47
67
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
68
|
+
if (ipInfo.isCrawler && !isDnsExtra) {
|
|
69
|
+
push(matches, "crawler", trafficFilter.crawler);
|
|
70
|
+
return matches;
|
|
71
|
+
}
|
|
72
|
+
if (ipInfo.isSatellite) {
|
|
73
|
+
push(matches, "satellite", trafficFilter.satellite);
|
|
74
|
+
return matches;
|
|
75
|
+
}
|
|
76
|
+
if (ipInfo.isMobile) {
|
|
77
|
+
push(matches, "mobile", trafficFilter.mobile);
|
|
78
|
+
return matches;
|
|
52
79
|
}
|
|
53
|
-
if (isActive(trafficFilter.mobile) && ipInfo.isMobile) push(matches, "mobile", trafficFilter.mobile);
|
|
54
|
-
if (isActive(trafficFilter.satellite) && ipInfo.isSatellite) push(matches, "satellite", trafficFilter.satellite);
|
|
55
|
-
if (!isDnsExtra && isActive(trafficFilter.crawler) && ipInfo.isCrawler) push(matches, "crawler", trafficFilter.crawler);
|
|
56
80
|
return matches;
|
|
57
81
|
};
|
|
58
82
|
/**
|
|
@@ -61,26 +85,26 @@ var evaluateIpInfo = (ipInfo, trafficFilter, isDnsExtra = false) => {
|
|
|
61
85
|
* carries the policy `action` — `block` fires at submit time; `challenge`
|
|
62
86
|
* fires at request time to override captcha type + params.
|
|
63
87
|
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* Extras-only rule: the crawler check is skipped on DNS extras. Public
|
|
71
|
-
* DNS resolvers share IP space with search crawlers.
|
|
72
|
-
*
|
|
73
|
-
* The datacenter rule also honours `datacenterNameAllowlist`: consumer
|
|
74
|
-
* relays route through datacenter ranges and are reported as
|
|
75
|
-
* `is_datacenter=true` by upstream but the exiting users are real humans.
|
|
88
|
+
* Per-IP precedence: within a single IP, the highest-precedence flag set on
|
|
89
|
+
* that IP wins and is the only category that emits a match. Order (highest
|
|
90
|
+
* first): Tor, VPN, proxy, datacenter, abuser, crawler, satellite, mobile.
|
|
91
|
+
* If the operator hasn't configured a policy for that top flag, the IP
|
|
92
|
+
* passes cleanly — lower flags are not consulted. So an IP that's flagged
|
|
93
|
+
* as both VPN and proxy is only acted on if the operator has a VPN policy.
|
|
76
94
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
95
|
+
* Qualifying conditions: a flag that fails its qualifier does not "own"
|
|
96
|
+
* the IP and evaluation falls through to the next flag. The abuser flag
|
|
97
|
+
* needs `abuserScore` (or `companyAbuserScore`) at or above
|
|
98
|
+
* `abuserScoreThreshold`; the datacenter flag needs the IP to not be an
|
|
99
|
+
* ISP (`providerType !== "isp"`) or to be on `datacenterNameDenylist`,
|
|
100
|
+
* and to not be on `datacenterNameAllowlist`; the crawler flag is skipped
|
|
101
|
+
* on DNS extras because public DNS resolvers share IP space with search
|
|
102
|
+
* crawlers.
|
|
81
103
|
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
104
|
+
* Datacenter name lists: `datacenterNameAllowlist` lets operators opt named
|
|
105
|
+
* consumer relays (e.g. iCloud Private Relay) out of the datacenter rule;
|
|
106
|
+
* `datacenterNameDenylist` opts named providers back in even when the ISP
|
|
107
|
+
* heuristic would exempt them.
|
|
84
108
|
*
|
|
85
109
|
* When `trafficFilter.skipExtrasOnValidDnsPath` is on and the catcher
|
|
86
110
|
* confirmed the DNS path matched the connection path (`pathValid: true`),
|
|
@@ -128,16 +152,22 @@ var resolveChallengePolicy = (matches) => {
|
|
|
128
152
|
let powDifficulty;
|
|
129
153
|
let solvedImagesCount;
|
|
130
154
|
let puzzleTolerance;
|
|
155
|
+
let puzzleSettings;
|
|
131
156
|
for (const m of challenges) {
|
|
132
157
|
if (m.policy.powDifficulty !== void 0) powDifficulty = powDifficulty === void 0 ? m.policy.powDifficulty : Math.max(powDifficulty, m.policy.powDifficulty);
|
|
133
158
|
if (m.policy.solvedImagesCount !== void 0) solvedImagesCount = solvedImagesCount === void 0 ? m.policy.solvedImagesCount : Math.max(solvedImagesCount, m.policy.solvedImagesCount);
|
|
134
159
|
if (m.policy.puzzleTolerance !== void 0) puzzleTolerance = puzzleTolerance === void 0 ? m.policy.puzzleTolerance : Math.min(puzzleTolerance, m.policy.puzzleTolerance);
|
|
160
|
+
if (m.policy.puzzle) puzzleSettings = {
|
|
161
|
+
...puzzleSettings ?? {},
|
|
162
|
+
...m.policy.puzzle
|
|
163
|
+
};
|
|
135
164
|
}
|
|
136
165
|
return {
|
|
137
166
|
captchaType: winningCaptchaType,
|
|
138
167
|
powDifficulty,
|
|
139
168
|
solvedImagesCount,
|
|
140
169
|
puzzleTolerance,
|
|
170
|
+
puzzleSettings,
|
|
141
171
|
sourceCategories: challenges.map((m) => m.category)
|
|
142
172
|
};
|
|
143
173
|
};
|
|
@@ -146,4 +176,5 @@ exports.categoryToReason = categoryToReason;
|
|
|
146
176
|
exports.checkTrafficFilter = checkTrafficFilter;
|
|
147
177
|
exports.isDatacenterAllowlisted = isDatacenterAllowlisted;
|
|
148
178
|
exports.isDatacenterDenylisted = isDatacenterDenylisted;
|
|
179
|
+
exports.isEffectivelyDatacenter = isEffectivelyDatacenter;
|
|
149
180
|
exports.resolveChallengePolicy = resolveChallengePolicy;
|
|
@@ -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;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;
|
|
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;AAmCF,eAAO,MAAM,mBAAmB,aACrB,gBAAgB,GAAG,SAAS,gBACxB,cAAc,GAAG,SAAS,kBACxB,OAAO,CAAC,cAAc,CAAC,KACrC,MAwDF,CAAC"}
|
|
@@ -45,18 +45,24 @@ var extraIpInfosFromEnrichedDnsEvent = (enriched) => {
|
|
|
45
45
|
* - resolver / peer classified `isAbuser`
|
|
46
46
|
* - client IP is a consumer ISP but resolver is datacenter (compound)
|
|
47
47
|
*
|
|
48
|
-
* When `trafficFilter` is supplied, the datacenter
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
48
|
+
* When `trafficFilter` is supplied, the datacenter contribution is gated
|
|
49
|
+
* on operator-policy-aware shielding, *not* on the strict per-IP precedence
|
|
50
|
+
* chain the client-IP path uses. DNS resolvers are legitimately often on
|
|
51
|
+
* datacenter ranges (Google/Cloudflare/consumer-VPN DNS), so signal
|
|
52
|
+
* counting has to consider the operator's stance:
|
|
52
53
|
*
|
|
53
|
-
* - datacenter category must be configured;
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* -
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
54
|
+
* - datacenter category must be configured; `providerType === "isp"`
|
|
55
|
+
* short-circuits; `datacenterNameAllowlist` skips; `datacenterNameDenylist`
|
|
56
|
+
* forces the signal through (denylist wins over all other exemptions)
|
|
57
|
+
* - a higher-precedence flag the operator has left **unconfigured** (VPN,
|
|
58
|
+
* proxy, Tor, crawler) on the same resolver IP shields the datacenter
|
|
59
|
+
* signal — the flag "explains" the DC status and the operator has said
|
|
60
|
+
* they don't care about that category. Flags that are configured (block
|
|
61
|
+
* or challenge) do *not* shield, because the operator is treating that
|
|
62
|
+
* category as suspicious in its own right.
|
|
63
|
+
* - abuser is not shielded by any other category: its signal counts
|
|
64
|
+
* whenever the abuser category is configured and the score meets the
|
|
65
|
+
* threshold.
|
|
60
66
|
*
|
|
61
67
|
* `pathValid` is a protocol signal, not a category — it always contributes
|
|
62
68
|
* regardless of trafficFilter. When `trafficFilter` is omitted, all
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"enrichDnsEvent.js","sourceRoot":"","sources":["../../../src/tasks/dnsEvent/enrichDnsEvent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frictionlessTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/frictionless/frictionlessTasks.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAEN,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,kBAAkB,EAClB,KAAK,8BAA8B,EACnC,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,OAAO,EAEZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EACN,KAAK,aAAa,EAElB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"frictionlessTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/frictionless/frictionlessTasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { buildDnsEventUrl } from "../../api/dnsEventUrl.js";
|
|
|
4
4
|
import { checkLangRules } from "../../rules/lang.js";
|
|
5
5
|
import { CaptchaManager } from "../captchaManager.js";
|
|
6
6
|
import { getBotScore } from "../detection/getBotScore.js";
|
|
7
|
+
import { downgradePuzzleIfUnavailable } from "../puzzle/puzzleRenderer.js";
|
|
7
8
|
import { applyRouter } from "./routingMachine.js";
|
|
8
9
|
import { ApiParams, CaptchaType, FrictionlessReason as FrictionlessReason$1, SimdReadingsStage } from "@prosopo/types";
|
|
9
10
|
import { v4 } from "uuid";
|
|
@@ -177,7 +178,7 @@ var FrictionlessManager = class extends CaptchaManager {
|
|
|
177
178
|
powDifficulty: captchaType === CaptchaType.pow ? effectiveParams.powDifficulty : void 0
|
|
178
179
|
};
|
|
179
180
|
const routed = this.routingContext ? await applyRouter(this.decisionMachineRunner, this.usageCounters, baseline, this.routingContext, this.logger) : baseline;
|
|
180
|
-
const finalCaptchaType = routed.captchaType;
|
|
181
|
+
const finalCaptchaType = downgradePuzzleIfUnavailable(routed.captchaType, this.logger);
|
|
181
182
|
const finalSolvedImagesCount = finalCaptchaType === CaptchaType.image ? routed.solvedImagesCount ?? effectiveParams.solvedImagesCount : void 0;
|
|
182
183
|
const finalPowDifficulty = finalCaptchaType === CaptchaType.pow ? routed.powDifficulty ?? effectiveParams.powDifficulty : void 0;
|
|
183
184
|
const blocked = finalCaptchaType === CaptchaType.image ? effectiveParams.blocked : void 0;
|