@prosopo/provider 5.13.1 → 5.13.3
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 +25 -23
- package/.turbo/turbo-build$colon$tsc.log +27 -27
- package/.turbo/turbo-build.log +26 -24
- package/CHANGELOG.md +95 -0
- package/dist/api/admin/apiDnsEventEndpoint.d.ts +2 -2
- package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.js +28 -5
- package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +1 -1
- 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 +2 -0
- 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 +4 -1
- 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 +4 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.js +3 -2
- 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 -2
- 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 -2
- package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/trafficFilterRequestTime.d.ts +2 -0
- package/dist/api/captcha/trafficFilterRequestTime.d.ts.map +1 -1
- package/dist/api/captcha/trafficFilterRequestTime.js +9 -3
- package/dist/api/captcha/trafficFilterRequestTime.js.map +1 -1
- package/dist/api/captcha.d.ts.map +1 -1
- package/dist/api/captcha.js +2 -0
- package/dist/api/captcha.js.map +1 -1
- package/dist/api/hardBlockVerdictCache.d.ts +1 -0
- package/dist/api/hardBlockVerdictCache.d.ts.map +1 -1
- package/dist/api/hardBlockVerdictCache.js +4 -1
- package/dist/api/hardBlockVerdictCache.js.map +1 -1
- package/dist/api/requestBodySummary.d.ts +14 -0
- package/dist/api/requestBodySummary.d.ts.map +1 -0
- package/dist/api/requestBodySummary.js +47 -0
- package/dist/api/requestBodySummary.js.map +1 -0
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +9 -8
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +27 -4
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +1 -1
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +2 -0
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +4 -1
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +4 -1
- package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +3 -2
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +3 -2
- package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +3 -2
- package/dist/cjs/api/captcha/trafficFilterRequestTime.cjs +6 -1
- package/dist/cjs/api/captcha.cjs +2 -0
- package/dist/cjs/api/hardBlockVerdictCache.cjs +4 -1
- package/dist/cjs/api/requestBodySummary.cjs +47 -0
- package/dist/cjs/api/verify.cjs +9 -8
- package/dist/cjs/pairs.cjs +70 -6
- package/dist/cjs/tasks/captchaManager.cjs +15 -0
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +4 -1
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +17 -6
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +5 -1
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +1 -4
- package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +11 -0
- package/dist/cjs/tasks/tasks.cjs +1 -37
- package/dist/cjs/utils/tarpitPadding.cjs +23 -0
- package/dist/pairs.d.ts +6 -1
- package/dist/pairs.d.ts.map +1 -1
- package/dist/pairs.js +67 -7
- package/dist/pairs.js.map +1 -1
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +15 -0
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +4 -1
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +20 -8
- 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 +5 -1
- 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 +1 -4
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -0
- package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.js +11 -1
- package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
- package/dist/tasks/tasks.d.ts +0 -1
- package/dist/tasks/tasks.d.ts.map +1 -1
- package/dist/tasks/tasks.js +1 -37
- package/dist/tasks/tasks.js.map +1 -1
- package/dist/tests/integration/authenticatedVerifyClaim.integration.test.d.ts +2 -0
- package/dist/tests/integration/authenticatedVerifyClaim.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/authenticatedVerifyClaim.integration.test.js +81 -0
- package/dist/tests/integration/authenticatedVerifyClaim.integration.test.js.map +1 -0
- package/dist/tests/integration/imgCaptcha.integration.test.js +37 -1
- package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +39 -3
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/domainMiddleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/domainMiddleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/domainMiddleware.unit.test.js +167 -0
- package/dist/tests/unit/api/domainMiddleware.unit.test.js.map +1 -0
- package/dist/tests/unit/api/hardBlockVerdictCache.unit.test.js +32 -0
- package/dist/tests/unit/api/hardBlockVerdictCache.unit.test.js.map +1 -1
- package/dist/tests/unit/api/requestBodySummary.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/requestBodySummary.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/requestBodySummary.unit.test.js +172 -0
- package/dist/tests/unit/api/requestBodySummary.unit.test.js.map +1 -0
- package/dist/tests/unit/pairs.unit.test.js +126 -1
- package/dist/tests/unit/pairs.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +38 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +104 -8
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +232 -17
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +66 -14
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +21 -1
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/tasksBackgroundWork.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/tasksBackgroundWork.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/tasksBackgroundWork.unit.test.js +34 -0
- package/dist/tests/unit/tasks/tasksBackgroundWork.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/writeQueueIntegration.unit.test.js +0 -49
- package/dist/tests/unit/tasks/writeQueueIntegration.unit.test.js.map +1 -1
- package/dist/tests/unit/util/redisCache.unit.test.js +1 -104
- package/dist/tests/unit/util/redisCache.unit.test.js.map +1 -1
- package/dist/utils/tarpitPadding.d.ts +3 -0
- package/dist/utils/tarpitPadding.d.ts.map +1 -0
- package/dist/utils/tarpitPadding.js +24 -0
- package/dist/utils/tarpitPadding.js.map +1 -0
- package/package.json +24 -24
package/dist/cjs/api/verify.cjs
CHANGED
|
@@ -4,6 +4,7 @@ const require_tasks = require("../tasks/tasks.cjs");
|
|
|
4
4
|
const require_apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
5
5
|
const require_testSiteKey = require("./testSiteKey.cjs");
|
|
6
6
|
const require_maintenanceModeResponses = require("./captcha/maintenanceModeResponses.cjs");
|
|
7
|
+
const require_requestBodySummary = require("./requestBodySummary.cjs");
|
|
7
8
|
const require_forwardVerify = require("./forwardVerify.cjs");
|
|
8
9
|
let _prosopo_common = require("@prosopo/common");
|
|
9
10
|
let _prosopo_types = require("@prosopo/types");
|
|
@@ -89,7 +90,7 @@ function prosopoVerifyRouter(env) {
|
|
|
89
90
|
context: {
|
|
90
91
|
code: 400,
|
|
91
92
|
error: err,
|
|
92
|
-
body: req
|
|
93
|
+
body: require_requestBodySummary.summariseRequestBody(req)
|
|
93
94
|
},
|
|
94
95
|
i18n: req.i18n,
|
|
95
96
|
logger: req.logger
|
|
@@ -140,7 +141,7 @@ function prosopoVerifyRouter(env) {
|
|
|
140
141
|
req.logger.error(() => ({
|
|
141
142
|
err,
|
|
142
143
|
msg: "Error in verifyImageCaptchaSolution",
|
|
143
|
-
data: { body: req
|
|
144
|
+
data: { body: require_requestBodySummary.summariseRequestBody(req) }
|
|
144
145
|
}));
|
|
145
146
|
return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
|
|
146
147
|
context: {
|
|
@@ -174,7 +175,7 @@ function prosopoVerifyRouter(env) {
|
|
|
174
175
|
context: {
|
|
175
176
|
code: 400,
|
|
176
177
|
error: err,
|
|
177
|
-
body: req
|
|
178
|
+
body: require_requestBodySummary.summariseRequestBody(req)
|
|
178
179
|
},
|
|
179
180
|
i18n: req.i18n,
|
|
180
181
|
logger: req.logger
|
|
@@ -230,7 +231,7 @@ function prosopoVerifyRouter(env) {
|
|
|
230
231
|
req.logger.error(() => ({
|
|
231
232
|
msg: "Error in verifyPowCaptchaSolution",
|
|
232
233
|
err,
|
|
233
|
-
data: { body: req
|
|
234
|
+
data: { body: require_requestBodySummary.summariseRequestBody(req) }
|
|
234
235
|
}));
|
|
235
236
|
return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
|
|
236
237
|
context: {
|
|
@@ -263,7 +264,7 @@ function prosopoVerifyRouter(env) {
|
|
|
263
264
|
context: {
|
|
264
265
|
code: 400,
|
|
265
266
|
error: err,
|
|
266
|
-
body: req
|
|
267
|
+
body: require_requestBodySummary.summariseRequestBody(req)
|
|
267
268
|
},
|
|
268
269
|
i18n: req.i18n,
|
|
269
270
|
logger: req.logger
|
|
@@ -319,7 +320,7 @@ function prosopoVerifyRouter(env) {
|
|
|
319
320
|
req.logger.error(() => ({
|
|
320
321
|
msg: "Error in verifyPuzzleCaptchaSolution",
|
|
321
322
|
err,
|
|
322
|
-
data: { body: req
|
|
323
|
+
data: { body: require_requestBodySummary.summariseRequestBody(req) }
|
|
323
324
|
}));
|
|
324
325
|
return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
|
|
325
326
|
context: {
|
|
@@ -352,7 +353,7 @@ function prosopoVerifyRouter(env) {
|
|
|
352
353
|
context: {
|
|
353
354
|
code: 400,
|
|
354
355
|
error: err,
|
|
355
|
-
body: req
|
|
356
|
+
body: require_requestBodySummary.summariseRequestBody(req)
|
|
356
357
|
},
|
|
357
358
|
i18n: req.i18n,
|
|
358
359
|
logger: req.logger
|
|
@@ -401,7 +402,7 @@ function prosopoVerifyRouter(env) {
|
|
|
401
402
|
req.logger.error(() => ({
|
|
402
403
|
err,
|
|
403
404
|
msg: "Error in verifyAuthenticatedSession",
|
|
404
|
-
data: { body: req
|
|
405
|
+
data: { body: require_requestBodySummary.summariseRequestBody(req) }
|
|
405
406
|
}));
|
|
406
407
|
return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
|
|
407
408
|
context: {
|
package/dist/cjs/pairs.cjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
let _prosopo_types = require("@prosopo/types");
|
|
1
2
|
let _prosopo_util = require("@prosopo/util");
|
|
2
3
|
//#region src/pairs.ts
|
|
3
4
|
/** Construct list of pairs from flat list
|
|
@@ -20,18 +21,81 @@ var peelCheckboxPrefix = (flat, solutionLengths) => {
|
|
|
20
21
|
return { flat };
|
|
21
22
|
};
|
|
22
23
|
/**
|
|
23
|
-
*
|
|
24
|
+
* The input method of every coordinate pair embedded in each captcha's salt.
|
|
25
|
+
* A captcha that declares none gets pointer for every pair, which keeps
|
|
26
|
+
* requests from older widgets under the full repeated-position check.
|
|
27
|
+
* Returns `undefined` when a captcha declares a different number of methods
|
|
28
|
+
* than it has pairs: the official widget never sends that.
|
|
29
|
+
* @param flat the coordinates extracted from each captcha's salt
|
|
30
|
+
* @param declared the input methods each captcha declared, if any
|
|
31
|
+
*/
|
|
32
|
+
var resolveInputMethods = (flat, declared) => {
|
|
33
|
+
const resolved = [];
|
|
34
|
+
for (const [index, list] of flat.entries()) {
|
|
35
|
+
const pairCount = list.length / 2;
|
|
36
|
+
const methods = declared[index];
|
|
37
|
+
if (methods === void 0) resolved.push(new Array(pairCount).fill(_prosopo_types.InputMethod.pointer));
|
|
38
|
+
else if (methods.length === pairCount) resolved.push([...methods]);
|
|
39
|
+
else return;
|
|
40
|
+
}
|
|
41
|
+
return resolved;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Give the checkbox's input method its own list, as `peelCheckboxPrefix` does
|
|
45
|
+
* for its coordinates, so the result lines up with the pair lists.
|
|
46
|
+
* @param methods the input methods of each captcha, checkbox first
|
|
47
|
+
*/
|
|
48
|
+
var peelCheckboxInputMethod = (methods) => {
|
|
49
|
+
const [first, ...rest] = methods;
|
|
50
|
+
if (first === void 0 || first.length === 0) return methods;
|
|
51
|
+
return [
|
|
52
|
+
first.slice(0, 1),
|
|
53
|
+
first.slice(1),
|
|
54
|
+
...rest
|
|
55
|
+
];
|
|
56
|
+
};
|
|
57
|
+
var isKeyboard = (inputMethods, listIndex, pairIndex) => inputMethods?.[listIndex]?.[pairIndex] === _prosopo_types.InputMethod.keyboard;
|
|
58
|
+
/**
|
|
59
|
+
* Whether any keyboard selection carries a pointer position. Keyboard
|
|
60
|
+
* activation has none, and the widget sends (0, 0) for it, so a position here
|
|
61
|
+
* means the request did not come from the widget.
|
|
24
62
|
* @param pairsLists
|
|
63
|
+
* @param inputMethods the same shape as `pairsLists`
|
|
25
64
|
*/
|
|
26
|
-
var
|
|
27
|
-
|
|
28
|
-
|
|
65
|
+
var keyboardSelectionHasPosition = (pairsLists, inputMethods) => pairsLists.some((pairList, listIndex) => pairList.some(([x, y], pairIndex) => isKeyboard(inputMethods, listIndex, pairIndex) && (x !== 0 || y !== 0)));
|
|
66
|
+
/**
|
|
67
|
+
* Check whether any pointer position repeats across the lists of pairs. A
|
|
68
|
+
* person selecting the same tile in two rounds almost never lands on the same
|
|
69
|
+
* pixel twice, whereas a script clicking each element's centre does. Keyboard
|
|
70
|
+
* selections have no position and are left out; without `inputMethods` every
|
|
71
|
+
* pair is a pointer selection.
|
|
72
|
+
* @param pairsLists
|
|
73
|
+
* @param inputMethods the same shape as `pairsLists`
|
|
74
|
+
*/
|
|
75
|
+
var containsIdenticalPairs = (pairsLists, inputMethods) => {
|
|
76
|
+
const seen = /* @__PURE__ */ new Set();
|
|
77
|
+
for (const [listIndex, pairList] of pairsLists.entries()) for (const [pairIndex, pair] of pairList.entries()) {
|
|
78
|
+
if (isKeyboard(inputMethods, listIndex, pairIndex)) continue;
|
|
29
79
|
const coordString = `${(0, _prosopo_util.at)(pair, 0)},${(0, _prosopo_util.at)(pair, 1)}`;
|
|
30
|
-
|
|
80
|
+
if (seen.has(coordString)) return true;
|
|
81
|
+
seen.add(coordString);
|
|
31
82
|
}
|
|
32
|
-
return
|
|
83
|
+
return false;
|
|
33
84
|
};
|
|
85
|
+
/**
|
|
86
|
+
* Whether the selections point to a script rather than a person: the declared
|
|
87
|
+
* input methods do not line up with the coordinates, a keyboard selection
|
|
88
|
+
* carries a position, or a pointer position repeats.
|
|
89
|
+
* @param pairsLists
|
|
90
|
+
* @param inputMethods the same shape as `pairsLists`, or `undefined` when the
|
|
91
|
+
* declared methods did not line up with the coordinates
|
|
92
|
+
*/
|
|
93
|
+
var selectionsLookScripted = (pairsLists, inputMethods) => inputMethods === void 0 || keyboardSelectionHasPosition(pairsLists, inputMethods) || containsIdenticalPairs(pairsLists, inputMethods);
|
|
34
94
|
//#endregion
|
|
35
95
|
exports.constructPairList = constructPairList;
|
|
36
96
|
exports.containsIdenticalPairs = containsIdenticalPairs;
|
|
97
|
+
exports.keyboardSelectionHasPosition = keyboardSelectionHasPosition;
|
|
98
|
+
exports.peelCheckboxInputMethod = peelCheckboxInputMethod;
|
|
37
99
|
exports.peelCheckboxPrefix = peelCheckboxPrefix;
|
|
100
|
+
exports.resolveInputMethods = resolveInputMethods;
|
|
101
|
+
exports.selectionsLookScripted = selectionsLookScripted;
|
|
@@ -294,6 +294,21 @@ var CaptchaManager = class CaptchaManager {
|
|
|
294
294
|
}
|
|
295
295
|
sessionId = resolvedSessionId;
|
|
296
296
|
if (this.writeQueue) await Promise.all([this.writeQueue.invalidateCachedSession(sessionId), sessionRecord.userSitekeyIpHash ? this.writeQueue.invalidateCachedSessionByHash(sessionRecord.userSitekeyIpHash) : Promise.resolve()]);
|
|
297
|
+
if (sessionRecord.siteKey !== void 0 && sessionRecord.siteKey !== clientSettings.account) {
|
|
298
|
+
this.logger.warn(() => ({
|
|
299
|
+
msg: "Session was issued for a different site key",
|
|
300
|
+
data: {
|
|
301
|
+
account: clientSettings.account,
|
|
302
|
+
sessionId,
|
|
303
|
+
sessionSiteKey: sessionRecord.siteKey
|
|
304
|
+
}
|
|
305
|
+
}));
|
|
306
|
+
return {
|
|
307
|
+
valid: false,
|
|
308
|
+
reason: _prosopo_types.ResultReason.CAPTCHA_NO_SESSION_FOUND,
|
|
309
|
+
type: requestedCaptchaType
|
|
310
|
+
};
|
|
311
|
+
}
|
|
297
312
|
if (currentIP) {
|
|
298
313
|
const ipValidation = await this.validateSessionIP(sessionRecord, currentIP, env);
|
|
299
314
|
if (!ipValidation.valid) return {
|
|
@@ -217,7 +217,10 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
|
|
|
217
217
|
verified: false,
|
|
218
218
|
status: "API.CLIENT_SESSION_MISMATCH"
|
|
219
219
|
};
|
|
220
|
-
await this.db.
|
|
220
|
+
if (!await this.db.claimSessionServerCheck(sessionId)) return {
|
|
221
|
+
verified: false,
|
|
222
|
+
status: "API.USER_ALREADY_VERIFIED"
|
|
223
|
+
};
|
|
221
224
|
return {
|
|
222
225
|
verified: true,
|
|
223
226
|
status: "API.USER_VERIFIED"
|
|
@@ -124,10 +124,16 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
|
|
|
124
124
|
const { checkbox: checkboxCoordPair, flat } = require_pairs.peelCheckboxPrefix(rawFlat, receivedCaptchas.map((c) => c.solution.length));
|
|
125
125
|
const shapePairs = flat.map((list) => require_pairs.constructPairList(list));
|
|
126
126
|
const pairs = checkboxCoordPair ? [[checkboxCoordPair], ...shapePairs] : shapePairs;
|
|
127
|
+
const rawInputMethods = require_pairs.resolveInputMethods(rawFlat, receivedCaptchas.map((c) => c.inputMethods));
|
|
128
|
+
const inputMethods = rawInputMethods && checkboxCoordPair ? require_pairs.peelCheckboxInputMethod(rawInputMethods) : rawInputMethods;
|
|
129
|
+
const inputMethodsDeclared = receivedCaptchas.some((c) => c.inputMethods !== void 0);
|
|
127
130
|
const { tree, commitmentId } = require_imgCaptchaTasksUtils.buildTreeAndGetCommitmentId(receivedCaptchas);
|
|
128
131
|
const datasetId = (0, _prosopo_util.at)(storedCaptchas, 0).datasetId;
|
|
129
132
|
if (!datasetId) throw new _prosopo_common.ProsopoEnvError("CAPTCHA.ID_MISMATCH", { context: { failedFuncName: this.dappUserSolution.name } });
|
|
130
|
-
await this.db.updatePendingImageCommitmentStatus(requestHash)
|
|
133
|
+
if (!await this.db.updatePendingImageCommitmentStatus(requestHash)) {
|
|
134
|
+
this.logger.info(() => ({ msg: "Request hash already consumed by a concurrent submission" }));
|
|
135
|
+
return response;
|
|
136
|
+
}
|
|
131
137
|
let behavioralDataPacked;
|
|
132
138
|
let deviceCapability;
|
|
133
139
|
if (behavioralData) try {
|
|
@@ -185,7 +191,8 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
|
|
|
185
191
|
deadlineTimestamp: pendingRecord.deadlineTimestamp,
|
|
186
192
|
...behavioralDataPacked && { behavioralDataPacked },
|
|
187
193
|
...deviceCapability && { deviceCapability },
|
|
188
|
-
...storedClientMetaData && { clientMetaData: storedClientMetaData }
|
|
194
|
+
...storedClientMetaData && { clientMetaData: storedClientMetaData },
|
|
195
|
+
...inputMethodsDeclared && inputMethods && { inputMethods }
|
|
189
196
|
};
|
|
190
197
|
await this.db.storeUserImageCaptchaSolution(receivedCaptchas, commit);
|
|
191
198
|
const solutionRecords = await Promise.all(storedCaptchas.map(async (captcha) => {
|
|
@@ -194,7 +201,7 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
|
|
|
194
201
|
return solutionRecord;
|
|
195
202
|
}));
|
|
196
203
|
const totalImages = storedCaptchas[0]?.items.length || 0;
|
|
197
|
-
if (require_pairs.
|
|
204
|
+
if (require_pairs.selectionsLookScripted(pairs, inputMethods) && process.env.NODE_ENV !== "test") {
|
|
198
205
|
const writePromises = [this.db.disapproveDappUserCommitment(commitmentId, "CAPTCHA.INVALID_SOLUTION", pairs)];
|
|
199
206
|
if (pendingRecord.sessionId) {
|
|
200
207
|
writePromises.push(this.updateSessionRecordWithCache(pendingRecord.sessionId, {
|
|
@@ -219,9 +226,9 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
|
|
|
219
226
|
}
|
|
220
227
|
if ((0, _prosopo_datasets.compareCaptchaSolutions)(receivedCaptchas, solutionRecords, totalImages, pendingRecord.threshold)) {
|
|
221
228
|
response = {
|
|
222
|
-
captchas: captchaIds.map((id) => ({
|
|
229
|
+
captchas: captchaIds.map((id, index) => ({
|
|
223
230
|
captchaId: id,
|
|
224
|
-
proof: tree.proof(
|
|
231
|
+
proof: tree.proof((0, _prosopo_util.at)(tree.leaves, index).hash)
|
|
225
232
|
})),
|
|
226
233
|
verified: true
|
|
227
234
|
};
|
|
@@ -335,7 +342,11 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
|
|
|
335
342
|
verified: false,
|
|
336
343
|
...solution.sessionId && { sessionId: solution.sessionId }
|
|
337
344
|
};
|
|
338
|
-
await this.db.markDappUserCommitmentsChecked([solution.id])
|
|
345
|
+
if (await this.db.markDappUserCommitmentsChecked([solution.id]) === 0) return {
|
|
346
|
+
status: "API.USER_ALREADY_VERIFIED",
|
|
347
|
+
verified: false,
|
|
348
|
+
...solution.sessionId && { sessionId: solution.sessionId }
|
|
349
|
+
};
|
|
339
350
|
if (solution.result.status === _prosopo_types.CaptchaStatus.disapproved) return {
|
|
340
351
|
status: solution.result.reason || "API.USER_NOT_VERIFIED",
|
|
341
352
|
verified: false,
|
|
@@ -75,6 +75,10 @@ var PowCaptchaManager = class extends require_captchaManager.CaptchaManager {
|
|
|
75
75
|
this.logger.debug(() => ({ msg: `No record of this challenge: ${challenge}` }));
|
|
76
76
|
return { verified: false };
|
|
77
77
|
}
|
|
78
|
+
if (challengeRecord.userSubmitted) {
|
|
79
|
+
this.logger.debug(() => ({ msg: `Challenge already submitted: ${challenge}` }));
|
|
80
|
+
return { verified: false };
|
|
81
|
+
}
|
|
78
82
|
const difficulty = challengeRecord.difficulty;
|
|
79
83
|
let coords;
|
|
80
84
|
let saltDecodeError;
|
|
@@ -314,7 +318,7 @@ var PowCaptchaManager = class extends require_captchaManager.CaptchaManager {
|
|
|
314
318
|
dappAccount,
|
|
315
319
|
challengeDappAccount
|
|
316
320
|
} });
|
|
317
|
-
await this.db.markDappUserPoWCommitmentsChecked([challengeRecord.challenge]);
|
|
321
|
+
if (await this.db.markDappUserPoWCommitmentsChecked([challengeRecord.challenge]) === 0) return notVerified("API.USER_ALREADY_VERIFIED", challengeRecord.sessionId);
|
|
318
322
|
const powRecordUpdates = {};
|
|
319
323
|
let failResult;
|
|
320
324
|
let failReason;
|
|
@@ -229,10 +229,7 @@ var PuzzleCaptchaManager = class extends require_captchaManager.CaptchaManager {
|
|
|
229
229
|
dappAccount,
|
|
230
230
|
challengeDappAccount
|
|
231
231
|
} });
|
|
232
|
-
await this.db.
|
|
233
|
-
serverChecked: true,
|
|
234
|
-
lastUpdatedTimestamp: /* @__PURE__ */ new Date()
|
|
235
|
-
});
|
|
232
|
+
if (!await this.db.markPuzzleCaptchaRecordChecked(challengeRecord.challenge)) return notVerifiedResponse;
|
|
236
233
|
const submittedAt = challengeRecord.submittedAtTimestamp;
|
|
237
234
|
if ((submittedAt instanceof Date ? Date.now() - submittedAt.getTime() : Number.POSITIVE_INFINITY) > timeout) {
|
|
238
235
|
const disapprovedResult = {
|
|
@@ -165,6 +165,16 @@ var resolveChallengePolicy = (matches) => {
|
|
|
165
165
|
sourceCategories: challenges.map((m) => m.category)
|
|
166
166
|
};
|
|
167
167
|
};
|
|
168
|
+
/**
|
|
169
|
+
* Largest `padBytes` across all matched categories, block or challenge. A
|
|
170
|
+
* blocked category still resolves to a deferred challenge at request time, so
|
|
171
|
+
* padding it burns the caller's bandwidth on the way to being blocked.
|
|
172
|
+
*/
|
|
173
|
+
var resolvePadBytes = (matches) => {
|
|
174
|
+
let padBytes;
|
|
175
|
+
for (const m of matches) if (m.policy.padBytes !== void 0) padBytes = padBytes === void 0 ? m.policy.padBytes : Math.max(padBytes, m.policy.padBytes);
|
|
176
|
+
return padBytes;
|
|
177
|
+
};
|
|
168
178
|
//#endregion
|
|
169
179
|
exports.categoryToReason = categoryToReason;
|
|
170
180
|
exports.checkTrafficFilter = checkTrafficFilter;
|
|
@@ -172,3 +182,4 @@ exports.isDatacenterAllowlisted = isDatacenterAllowlisted;
|
|
|
172
182
|
exports.isDatacenterDenylisted = isDatacenterDenylisted;
|
|
173
183
|
exports.isEffectivelyDatacenter = isEffectivelyDatacenter;
|
|
174
184
|
exports.resolveChallengePolicy = resolveChallengePolicy;
|
|
185
|
+
exports.resolvePadBytes = resolvePadBytes;
|
package/dist/cjs/tasks/tasks.cjs
CHANGED
|
@@ -10,16 +10,11 @@ let _prosopo_common = require("@prosopo/common");
|
|
|
10
10
|
let _prosopo_database = require("@prosopo/database");
|
|
11
11
|
let _prosopo_logger = require("@prosopo/logger");
|
|
12
12
|
//#region src/tasks/tasks.ts
|
|
13
|
-
/**
|
|
14
|
-
* Singleton write queue manager.
|
|
15
|
-
* Ensures only one flush timer exists across all Tasks instances.
|
|
16
|
-
*/
|
|
17
13
|
var globalWriteQueue = null;
|
|
18
|
-
var flushStarted = false;
|
|
19
14
|
/**
|
|
20
15
|
* @description Tasks that are shared by the API and CLI
|
|
21
16
|
*/
|
|
22
|
-
var Tasks = class
|
|
17
|
+
var Tasks = class {
|
|
23
18
|
constructor(env, logger) {
|
|
24
19
|
this.env = env;
|
|
25
20
|
this.config = env.config;
|
|
@@ -57,43 +52,12 @@ var Tasks = class Tasks {
|
|
|
57
52
|
try {
|
|
58
53
|
const redisConnection = this.db.getRedisConnection();
|
|
59
54
|
globalWriteQueue = new _prosopo_database.RedisWriteQueue(redisConnection, this.logger);
|
|
60
|
-
if (!flushStarted) {
|
|
61
|
-
flushStarted = true;
|
|
62
|
-
const db = this.db;
|
|
63
|
-
const logger = this.logger;
|
|
64
|
-
globalWriteQueue.startPeriodicFlush(async (queue) => {
|
|
65
|
-
await Tasks.flushWriteQueue(queue, db, logger);
|
|
66
|
-
}, 1e4);
|
|
67
|
-
}
|
|
68
55
|
return globalWriteQueue;
|
|
69
56
|
} catch {
|
|
70
57
|
this.logger.debug(() => ({ msg: "Redis not available for write queue - falling back to direct writes" }));
|
|
71
58
|
return null;
|
|
72
59
|
}
|
|
73
60
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Flush queued session records from Redis to MongoDB in bulk.
|
|
76
|
-
* Called periodically by the write queue timer.
|
|
77
|
-
*
|
|
78
|
-
* Note: PoW challenge and pending image commitment records are written
|
|
79
|
-
* directly to MongoDB (not queued) because verification endpoints need
|
|
80
|
-
* to read them immediately after creation. Session records are safe to
|
|
81
|
-
* queue because they are not read in the immediate request path.
|
|
82
|
-
*/
|
|
83
|
-
static async flushWriteQueue(queue, db, logger) {
|
|
84
|
-
const sessionRecords = await queue.drainSessionRecords();
|
|
85
|
-
if (sessionRecords.length > 0) {
|
|
86
|
-
logger.info(() => ({ msg: `Flushing ${sessionRecords.length} queued session records to MongoDB` }));
|
|
87
|
-
for (const { record } of sessionRecords) try {
|
|
88
|
-
await db.storeSessionRecord(record);
|
|
89
|
-
} catch (error) {
|
|
90
|
-
logger.error(() => ({
|
|
91
|
-
msg: "Failed to flush queued session record",
|
|
92
|
-
err: error
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
61
|
setLogger(logger) {
|
|
98
62
|
this.logger = logger;
|
|
99
63
|
this.powCaptchaManager.logger = logger;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
let _prosopo_types = require("@prosopo/types");
|
|
2
|
+
//#region src/utils/tarpitPadding.ts
|
|
3
|
+
var POOL = (0, require("node:crypto").randomBytes)(Math.ceil(_prosopo_types.MAX_PAD_BYTES * 3 / 4)).toString("base64");
|
|
4
|
+
var clampPadBytes = (padBytes) => padBytes && padBytes > 0 ? Math.min(Math.floor(padBytes), _prosopo_types.MAX_PAD_BYTES) : 0;
|
|
5
|
+
var streamWithPad = (res, body, n) => {
|
|
6
|
+
const offset = Math.floor(Math.random() * (POOL.length - n + 1));
|
|
7
|
+
const rest = JSON.stringify(body);
|
|
8
|
+
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
9
|
+
res.write("{\"pad\":\"");
|
|
10
|
+
res.write(POOL.slice(offset, offset + n));
|
|
11
|
+
res.write(`",${rest.slice(1)}`);
|
|
12
|
+
return res.end();
|
|
13
|
+
};
|
|
14
|
+
var padResponseMiddleware = (_req, res, next) => {
|
|
15
|
+
const originalJson = res.json.bind(res);
|
|
16
|
+
res.json = (body) => {
|
|
17
|
+
const n = clampPadBytes(res.locals.padBytes);
|
|
18
|
+
return n === 0 ? originalJson(body) : streamWithPad(res, body, n);
|
|
19
|
+
};
|
|
20
|
+
next();
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.padResponseMiddleware = padResponseMiddleware;
|
package/dist/pairs.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { InputMethod } from "@prosopo/types";
|
|
1
2
|
export declare const constructPairList: (list: number[]) => [number, number][];
|
|
2
3
|
export declare const peelCheckboxPrefix: (flat: number[][], solutionLengths: number[]) => {
|
|
3
4
|
checkbox?: [number, number];
|
|
4
5
|
flat: number[][];
|
|
5
6
|
};
|
|
6
|
-
export declare const
|
|
7
|
+
export declare const resolveInputMethods: (flat: number[][], declared: (readonly InputMethod[] | undefined)[]) => InputMethod[][] | undefined;
|
|
8
|
+
export declare const peelCheckboxInputMethod: (methods: InputMethod[][]) => InputMethod[][];
|
|
9
|
+
export declare const keyboardSelectionHasPosition: (pairsLists: [number, number][][], inputMethods: InputMethod[][]) => boolean;
|
|
10
|
+
export declare const containsIdenticalPairs: (pairsLists: [number, number][][], inputMethods?: InputMethod[][]) => boolean;
|
|
11
|
+
export declare const selectionsLookScripted: (pairsLists: [number, number][][], inputMethods: InputMethod[][] | undefined) => boolean;
|
|
7
12
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"pairs.d.ts","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,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;AAWF,eAAO,MAAM,mBAAmB,SACzB,MAAM,EAAE,EAAE,YACN,CAAC,SAAS,WAAW,EAAE,GAAG,SAAS,CAAC,EAAE,KAC9C,WAAW,EAAE,EAAE,GAAG,SAgBpB,CAAC;AAOF,eAAO,MAAM,uBAAuB,YAC1B,WAAW,EAAE,EAAE,KACtB,WAAW,EAAE,EAMf,CAAC;AAeF,eAAO,MAAM,4BAA4B,eAC5B,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,gBAClB,WAAW,EAAE,EAAE,KAC3B,OAMD,CAAC;AAWH,eAAO,MAAM,sBAAsB,eACtB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,iBACjB,WAAW,EAAE,EAAE,KAC5B,OAeF,CAAC;AAUF,eAAO,MAAM,sBAAsB,eACtB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,gBAClB,WAAW,EAAE,EAAE,GAAG,SAAS,KACvC,OAG8C,CAAC"}
|
package/dist/pairs.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { InputMethod } from "@prosopo/types";
|
|
1
2
|
import { at } from "@prosopo/util";
|
|
2
3
|
//#region src/pairs.ts
|
|
3
4
|
/** Construct list of pairs from flat list
|
|
@@ -20,16 +21,75 @@ var peelCheckboxPrefix = (flat, solutionLengths) => {
|
|
|
20
21
|
return { flat };
|
|
21
22
|
};
|
|
22
23
|
/**
|
|
23
|
-
*
|
|
24
|
+
* The input method of every coordinate pair embedded in each captcha's salt.
|
|
25
|
+
* A captcha that declares none gets pointer for every pair, which keeps
|
|
26
|
+
* requests from older widgets under the full repeated-position check.
|
|
27
|
+
* Returns `undefined` when a captcha declares a different number of methods
|
|
28
|
+
* than it has pairs: the official widget never sends that.
|
|
29
|
+
* @param flat the coordinates extracted from each captcha's salt
|
|
30
|
+
* @param declared the input methods each captcha declared, if any
|
|
31
|
+
*/
|
|
32
|
+
var resolveInputMethods = (flat, declared) => {
|
|
33
|
+
const resolved = [];
|
|
34
|
+
for (const [index, list] of flat.entries()) {
|
|
35
|
+
const pairCount = list.length / 2;
|
|
36
|
+
const methods = declared[index];
|
|
37
|
+
if (methods === void 0) resolved.push(new Array(pairCount).fill(InputMethod.pointer));
|
|
38
|
+
else if (methods.length === pairCount) resolved.push([...methods]);
|
|
39
|
+
else return;
|
|
40
|
+
}
|
|
41
|
+
return resolved;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Give the checkbox's input method its own list, as `peelCheckboxPrefix` does
|
|
45
|
+
* for its coordinates, so the result lines up with the pair lists.
|
|
46
|
+
* @param methods the input methods of each captcha, checkbox first
|
|
47
|
+
*/
|
|
48
|
+
var peelCheckboxInputMethod = (methods) => {
|
|
49
|
+
const [first, ...rest] = methods;
|
|
50
|
+
if (first === void 0 || first.length === 0) return methods;
|
|
51
|
+
return [
|
|
52
|
+
first.slice(0, 1),
|
|
53
|
+
first.slice(1),
|
|
54
|
+
...rest
|
|
55
|
+
];
|
|
56
|
+
};
|
|
57
|
+
var isKeyboard = (inputMethods, listIndex, pairIndex) => inputMethods?.[listIndex]?.[pairIndex] === InputMethod.keyboard;
|
|
58
|
+
/**
|
|
59
|
+
* Whether any keyboard selection carries a pointer position. Keyboard
|
|
60
|
+
* activation has none, and the widget sends (0, 0) for it, so a position here
|
|
61
|
+
* means the request did not come from the widget.
|
|
24
62
|
* @param pairsLists
|
|
63
|
+
* @param inputMethods the same shape as `pairsLists`
|
|
25
64
|
*/
|
|
26
|
-
var
|
|
27
|
-
|
|
28
|
-
|
|
65
|
+
var keyboardSelectionHasPosition = (pairsLists, inputMethods) => pairsLists.some((pairList, listIndex) => pairList.some(([x, y], pairIndex) => isKeyboard(inputMethods, listIndex, pairIndex) && (x !== 0 || y !== 0)));
|
|
66
|
+
/**
|
|
67
|
+
* Check whether any pointer position repeats across the lists of pairs. A
|
|
68
|
+
* person selecting the same tile in two rounds almost never lands on the same
|
|
69
|
+
* pixel twice, whereas a script clicking each element's centre does. Keyboard
|
|
70
|
+
* selections have no position and are left out; without `inputMethods` every
|
|
71
|
+
* pair is a pointer selection.
|
|
72
|
+
* @param pairsLists
|
|
73
|
+
* @param inputMethods the same shape as `pairsLists`
|
|
74
|
+
*/
|
|
75
|
+
var containsIdenticalPairs = (pairsLists, inputMethods) => {
|
|
76
|
+
const seen = /* @__PURE__ */ new Set();
|
|
77
|
+
for (const [listIndex, pairList] of pairsLists.entries()) for (const [pairIndex, pair] of pairList.entries()) {
|
|
78
|
+
if (isKeyboard(inputMethods, listIndex, pairIndex)) continue;
|
|
29
79
|
const coordString = `${at(pair, 0)},${at(pair, 1)}`;
|
|
30
|
-
|
|
80
|
+
if (seen.has(coordString)) return true;
|
|
81
|
+
seen.add(coordString);
|
|
31
82
|
}
|
|
32
|
-
return
|
|
83
|
+
return false;
|
|
33
84
|
};
|
|
85
|
+
/**
|
|
86
|
+
* Whether the selections point to a script rather than a person: the declared
|
|
87
|
+
* input methods do not line up with the coordinates, a keyboard selection
|
|
88
|
+
* carries a position, or a pointer position repeats.
|
|
89
|
+
* @param pairsLists
|
|
90
|
+
* @param inputMethods the same shape as `pairsLists`, or `undefined` when the
|
|
91
|
+
* declared methods did not line up with the coordinates
|
|
92
|
+
*/
|
|
93
|
+
var selectionsLookScripted = (pairsLists, inputMethods) => inputMethods === void 0 || keyboardSelectionHasPosition(pairsLists, inputMethods) || containsIdenticalPairs(pairsLists, inputMethods);
|
|
34
94
|
//#endregion
|
|
35
|
-
export { constructPairList, containsIdenticalPairs, peelCheckboxPrefix };
|
|
95
|
+
export { constructPairList, containsIdenticalPairs, keyboardSelectionHasPosition, peelCheckboxInputMethod, peelCheckboxPrefix, resolveInputMethods, selectionsLookScripted };
|
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;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;
|
|
1
|
+
{"version":3,"file":"pairs.js","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
|
@@ -294,6 +294,21 @@ var CaptchaManager = class CaptchaManager {
|
|
|
294
294
|
}
|
|
295
295
|
sessionId = resolvedSessionId;
|
|
296
296
|
if (this.writeQueue) await Promise.all([this.writeQueue.invalidateCachedSession(sessionId), sessionRecord.userSitekeyIpHash ? this.writeQueue.invalidateCachedSessionByHash(sessionRecord.userSitekeyIpHash) : Promise.resolve()]);
|
|
297
|
+
if (sessionRecord.siteKey !== void 0 && sessionRecord.siteKey !== clientSettings.account) {
|
|
298
|
+
this.logger.warn(() => ({
|
|
299
|
+
msg: "Session was issued for a different site key",
|
|
300
|
+
data: {
|
|
301
|
+
account: clientSettings.account,
|
|
302
|
+
sessionId,
|
|
303
|
+
sessionSiteKey: sessionRecord.siteKey
|
|
304
|
+
}
|
|
305
|
+
}));
|
|
306
|
+
return {
|
|
307
|
+
valid: false,
|
|
308
|
+
reason: ResultReason.CAPTCHA_NO_SESSION_FOUND,
|
|
309
|
+
type: requestedCaptchaType
|
|
310
|
+
};
|
|
311
|
+
}
|
|
297
312
|
if (currentIP) {
|
|
298
313
|
const ipValidation = await this.validateSessionIP(sessionRecord, currentIP, env);
|
|
299
314
|
if (!ipValidation.valid) return {
|