@prosopo/provider 5.14.0 → 5.15.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 +20 -22
- package/.turbo/turbo-build$colon$tsc.log +27 -30
- package/.turbo/turbo-build.log +21 -26
- package/CHANGELOG.md +128 -0
- package/LICENSE +201 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +2 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +11 -2
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +15 -8
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts +5 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts.map +1 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js +20 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js.map +1 -0
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +24 -0
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts +4 -11
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.js +12 -17
- package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
- package/dist/api/rawTlsSignalsMiddleware.d.ts +14 -1
- package/dist/api/rawTlsSignalsMiddleware.d.ts.map +1 -1
- package/dist/api/rawTlsSignalsMiddleware.js +111 -23
- package/dist/api/rawTlsSignalsMiddleware.js.map +1 -1
- package/dist/api/startProviderApi.js +2 -2
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +10 -0
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +14 -7
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.cjs +20 -0
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +24 -0
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +10 -15
- package/dist/cjs/api/rawTlsSignalsMiddleware.cjs +111 -22
- package/dist/cjs/api/startProviderApi.cjs +2 -2
- package/dist/cjs/compositeIpAddress.cjs +21 -7
- package/dist/cjs/tasks/captchaManager.cjs +15 -0
- package/dist/cjs/tasks/captchaTypeSelection.cjs +23 -2
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +26 -23
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +2 -9
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +7 -11
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +2 -0
- package/dist/cjs/tasks/puzzle/backgroundBuffer.cjs +3 -3
- package/dist/cjs/tasks/puzzle/nativeBackground.cjs +12 -5
- package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +4 -3
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +2 -9
- package/dist/compositeIpAddress.d.ts.map +1 -1
- package/dist/compositeIpAddress.js +21 -7
- package/dist/compositeIpAddress.js.map +1 -1
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +16 -1
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/captchaTypeSelection.d.ts +3 -1
- package/dist/tasks/captchaTypeSelection.d.ts.map +1 -1
- package/dist/tasks/captchaTypeSelection.js +23 -3
- package/dist/tasks/captchaTypeSelection.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts +3 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +28 -25
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
- package/dist/tasks/frictionless/routingMachine.d.ts +1 -2
- package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -1
- package/dist/tasks/frictionless/routingMachine.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +2 -9
- 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 +8 -12
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js +2 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
- package/dist/tasks/puzzle/backgroundBuffer.d.ts +3 -2
- package/dist/tasks/puzzle/backgroundBuffer.d.ts.map +1 -1
- package/dist/tasks/puzzle/backgroundBuffer.js +3 -3
- package/dist/tasks/puzzle/backgroundBuffer.js.map +1 -1
- package/dist/tasks/puzzle/nativeBackground.d.ts +5 -1
- package/dist/tasks/puzzle/nativeBackground.d.ts.map +1 -1
- package/dist/tasks/puzzle/nativeBackground.js +12 -5
- package/dist/tasks/puzzle/nativeBackground.js.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.d.ts +2 -0
- package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.js +4 -3
- package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js +2 -9
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js +2 -0
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +35 -2
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js +45 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js.map +1 -0
- package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js +15 -1
- package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js.map +1 -1
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +148 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js +96 -1
- package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js.map +1 -1
- package/dist/tests/unit/compositeIpAddress.unit.test.js +12 -3
- package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +51 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js +20 -1
- package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js +94 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js +103 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +23 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js +1 -4
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js +10 -3
- package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js +35 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js +49 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js.map +1 -0
- package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +17 -14
- package/dist/tests/unit/testUtils/mockProviderEnv.d.ts.map +1 -1
- package/dist/tests/unit/testUtils/mockProviderEnv.js.map +1 -1
- package/package.json +105 -103
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { validateAddr, validateSiteKey } from "../validateAddress.js";
|
|
2
|
+
import { rawTlsSignalsForSession, rawTlsSignalsFromRecord } from "../rawTlsSignalsMiddleware.js";
|
|
2
3
|
import { coerceToEnabledCaptchaType } from "../../tasks/captchaTypeSelection.js";
|
|
3
4
|
import { samplePuzzleDifficulty } from "../../tasks/puzzle/puzzleDifficulty.js";
|
|
4
5
|
import { derivePlatform, deriveTrafficPolicies } from "../../utils/devicePlatform.js";
|
|
5
6
|
import { Tasks } from "../../tasks/tasks.js";
|
|
6
7
|
import { getMaintenanceMode } from "../admin/apiToggleMaintenanceModeEndpoint.js";
|
|
7
8
|
import { resolveTestSiteKeyVerdict } from "../testSiteKey.js";
|
|
8
|
-
import { rawTlsSignalsForSession } from "../rawTlsSignalsMiddleware.js";
|
|
9
9
|
import { summariseRequestBody } from "../requestBodySummary.js";
|
|
10
10
|
import { ProsopoApiError } from "@prosopo/common";
|
|
11
|
-
import { CaptchaType, SubmitPowCaptchaSolutionBody, imageMaxRoundsDefault } from "@prosopo/types";
|
|
11
|
+
import { CaptchaType, SubmitPowCaptchaSolutionBody, imageMaxRoundsDefault, resolveAllowedCaptchaTypes } from "@prosopo/types";
|
|
12
12
|
import { flatten, getIPAddress } from "@prosopo/util";
|
|
13
|
-
import { severityToPuzzleDifficulty } from "@prosopo/captcha-severity";
|
|
13
|
+
import { resolveMaxEscalationLevel, severityToPuzzleDifficulty } from "@prosopo/captcha-severity";
|
|
14
14
|
import { DEFAULT_RENDER_SETTINGS } from "@prosopo/puzzle-assets";
|
|
15
15
|
//#region src/api/captcha/submitPoWCaptchaSolution.ts
|
|
16
16
|
var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
@@ -100,8 +100,9 @@ var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
|
100
100
|
chelloToHandshakeUs: req.chelloToHandshakeUs,
|
|
101
101
|
...rawTlsSignalsForSession(req)
|
|
102
102
|
}, {
|
|
103
|
-
|
|
104
|
-
imageMaxRounds: clientRecord.settings?.imageMaxRounds
|
|
103
|
+
allowedCaptchaTypes: resolveAllowedCaptchaTypes(clientRecord.settings),
|
|
104
|
+
imageMaxRounds: clientRecord.settings?.imageMaxRounds,
|
|
105
|
+
puzzleMaxDifficulty: clientRecord.settings?.puzzleMaxDifficulty
|
|
105
106
|
});
|
|
106
107
|
const response = {
|
|
107
108
|
status: "ok",
|
|
@@ -144,17 +145,19 @@ var buildEscalation = async (tasks, result, challenge, perConnectionSignals, sit
|
|
|
144
145
|
const originSession = await tasks.db.getSessionRecordBySessionId(powRecord.sessionId);
|
|
145
146
|
if (!originSession) return void 0;
|
|
146
147
|
const routed = result.routingOutput;
|
|
147
|
-
const escalatedType = coerceToEnabledCaptchaType(routed.captchaType, siteConstraints?.
|
|
148
|
+
const escalatedType = coerceToEnabledCaptchaType(routed.captchaType, siteConstraints?.allowedCaptchaTypes);
|
|
148
149
|
if (escalatedType === CaptchaType.pow) return void 0;
|
|
149
150
|
const imageMaxRounds = siteConstraints?.imageMaxRounds ?? imageMaxRoundsDefault;
|
|
150
151
|
const escalationPuzzleOverrides = (() => {
|
|
151
152
|
if (escalatedType !== CaptchaType.puzzle) return void 0;
|
|
152
|
-
const
|
|
153
|
+
const { isMobile } = derivePlatform(originSession.headers?.["user-agent"] ?? "", originSession.webView);
|
|
154
|
+
const level = severityToPuzzleDifficulty(routed.solvedImagesCount ?? originSession.solvedImagesCount, tasks.config.captchas.solved.count, resolveMaxEscalationLevel(siteConstraints?.puzzleMaxDifficulty, isMobile));
|
|
153
155
|
if (level === 0) return void 0;
|
|
154
156
|
const difficulty = samplePuzzleDifficulty(level, DEFAULT_RENDER_SETTINGS.holeDarken);
|
|
155
157
|
return {
|
|
156
158
|
puzzleTolerance: difficulty.tolerance,
|
|
157
|
-
puzzle: difficulty.puzzle
|
|
159
|
+
puzzle: difficulty.puzzle,
|
|
160
|
+
puzzleLevel: difficulty.level
|
|
158
161
|
};
|
|
159
162
|
})();
|
|
160
163
|
const selectionReason = routed.reason ?? originSession.reason;
|
|
@@ -185,15 +188,7 @@ var buildEscalation = async (tasks, result, challenge, perConnectionSignals, sit
|
|
|
185
188
|
originSessionId: originSession.sessionId,
|
|
186
189
|
tcpToChelloUs: perConnectionSignals?.tcpToChelloUs,
|
|
187
190
|
chelloToHandshakeUs: perConnectionSignals?.chelloToHandshakeUs,
|
|
188
|
-
|
|
189
|
-
synackNs: perConnectionSignals?.synackNs,
|
|
190
|
-
ackNs: perConnectionSignals?.ackNs,
|
|
191
|
-
observedTtl: perConnectionSignals?.observedTtl,
|
|
192
|
-
tcpMss: perConnectionSignals?.tcpMss,
|
|
193
|
-
tcpWscale: perConnectionSignals?.tcpWscale,
|
|
194
|
-
tcpOptsFlags: perConnectionSignals?.tcpOptsFlags,
|
|
195
|
-
tcpOptsOrder: perConnectionSignals?.tcpOptsOrder,
|
|
196
|
-
tcpWindow: perConnectionSignals?.tcpWindow,
|
|
191
|
+
...rawTlsSignalsFromRecord(perConnectionSignals),
|
|
197
192
|
puzzleTolerance: escalationPuzzleOverrides?.puzzleTolerance,
|
|
198
193
|
puzzle: escalationPuzzleOverrides?.puzzle,
|
|
199
194
|
clientMetaData: originSession.clientMetaData
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submitPoWCaptchaSolution.js","sourceRoot":"","sources":["../../../src/api/captcha/submitPoWCaptchaSolution.ts"],"names":[],"mappings":"AAaA,OAAO,
|
|
1
|
+
{"version":3,"file":"submitPoWCaptchaSolution.js","sourceRoot":"","sources":["../../../src/api/captcha/submitPoWCaptchaSolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,11 +9,24 @@ export interface RawTlsSignals {
|
|
|
9
9
|
observedTtl?: number;
|
|
10
10
|
tcpMss?: number;
|
|
11
11
|
tcpWscale?: number;
|
|
12
|
+
tcpWindow?: number;
|
|
13
|
+
tcpOptsKinds?: number[];
|
|
14
|
+
tcpOptsPresent?: number;
|
|
15
|
+
tcpOptsCount?: number;
|
|
16
|
+
tcpTsval?: number;
|
|
17
|
+
tcpTsecr?: number;
|
|
18
|
+
tcpFlags?: number;
|
|
19
|
+
tcpDataOffsetResv?: number;
|
|
20
|
+
tcpUrgPtr?: number;
|
|
21
|
+
ipIdent?: number;
|
|
22
|
+
ipTotalLen?: number;
|
|
23
|
+
ipFragFlags?: number;
|
|
24
|
+
ipTos?: number;
|
|
12
25
|
tcpOptsFlags?: number;
|
|
13
26
|
tcpOptsOrder?: number;
|
|
14
|
-
tcpWindow?: number;
|
|
15
27
|
}
|
|
16
28
|
export declare const getRawTlsSignals: (headers: IncomingHttpHeaders, logger?: Logger) => RawTlsSignals;
|
|
17
29
|
export declare const rawTlsSignalsForSession: (req: Pick<Request, keyof RawTlsSignals>) => Partial<RawTlsSignals>;
|
|
30
|
+
export declare const rawTlsSignalsFromRecord: (record: Partial<RawTlsSignals> | undefined | null) => Partial<RawTlsSignals>;
|
|
18
31
|
export declare const rawTlsSignalsMiddleware: (env: ProviderEnvironment) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
19
32
|
//# sourceMappingURL=rawTlsSignalsMiddleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rawTlsSignalsMiddleware.d.ts","sourceRoot":"","sources":["../../src/api/rawTlsSignalsMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"rawTlsSignalsMiddleware.d.ts","sourceRoot":"","sources":["../../src/api/rawTlsSignalsMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA2C/D,MAAM,WAAW,aAAa;IAM7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAKf,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAcnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAKxB,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,YAAY,CAAC,EAAE,MAAM,CAAC;IAQtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,KAAK,CAAC,EAAE,MAAM,CAAC;IAMf,YAAY,CAAC,EAAE,MAAM,CAAC;IAMtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAwID,eAAO,MAAM,gBAAgB,YACnB,mBAAmB,WACnB,MAAM,KACb,aA8GF,CAAC;AAQF,eAAO,MAAM,uBAAuB,QAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,aAAa,CAAC,KACrC,OAAO,CAAC,aAAa,CAAiC,CAAC;AAW1D,eAAO,MAAM,uBAAuB,WAC3B,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,GAAG,IAAI,KAC/C,OAAO,CAAC,aAAa,CAYvB,CAAC;AAMF,eAAO,MAAM,uBAAuB,QAAS,mBAAmB,WAC5C,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBAmB7D,CAAC"}
|
|
@@ -7,9 +7,44 @@ var HEADER_ACK_NS = "x-tls-ack-ns";
|
|
|
7
7
|
var HEADER_OBSERVED_TTL = "x-tls-observed-ttl";
|
|
8
8
|
var HEADER_TCP_MSS = "x-tls-tcp-mss";
|
|
9
9
|
var HEADER_TCP_WSCALE = "x-tls-tcp-wscale";
|
|
10
|
+
var HEADER_TCP_WINDOW = "x-tls-tcp-window";
|
|
11
|
+
var HEADER_TCP_OPTS_KINDS = "x-tls-tcp-opts-kinds";
|
|
12
|
+
var HEADER_TCP_OPTS_PRESENT = "x-tls-tcp-opts-present";
|
|
13
|
+
var HEADER_TCP_OPTS_COUNT = "x-tls-tcp-opts-count";
|
|
14
|
+
var HEADER_TCP_TSVAL = "x-tls-tcp-tsval";
|
|
15
|
+
var HEADER_TCP_TSECR = "x-tls-tcp-tsecr";
|
|
16
|
+
var HEADER_TCP_FLAGS = "x-tls-tcp-flags";
|
|
17
|
+
var HEADER_TCP_DATA_OFFSET_RESV = "x-tls-tcp-data-offset-resv";
|
|
18
|
+
var HEADER_TCP_URG_PTR = "x-tls-tcp-urg-ptr";
|
|
19
|
+
var HEADER_IP_IDENT = "x-tls-ip-ident";
|
|
20
|
+
var HEADER_IP_TOTAL_LEN = "x-tls-ip-total-len";
|
|
21
|
+
var HEADER_IP_FRAG_FLAGS = "x-tls-ip-frag-flags";
|
|
22
|
+
var HEADER_IP_TOS = "x-tls-ip-tos";
|
|
10
23
|
var HEADER_TCP_OPTS_FLAGS = "x-tls-tcp-opts-flags";
|
|
11
24
|
var HEADER_TCP_OPTS_ORDER = "x-tls-tcp-opts-order";
|
|
12
|
-
var
|
|
25
|
+
var RAW_TLS_SIGNAL_KEYS = [
|
|
26
|
+
"synNs",
|
|
27
|
+
"synackNs",
|
|
28
|
+
"ackNs",
|
|
29
|
+
"observedTtl",
|
|
30
|
+
"tcpMss",
|
|
31
|
+
"tcpWscale",
|
|
32
|
+
"tcpWindow",
|
|
33
|
+
"tcpOptsKinds",
|
|
34
|
+
"tcpOptsPresent",
|
|
35
|
+
"tcpOptsCount",
|
|
36
|
+
"tcpTsval",
|
|
37
|
+
"tcpTsecr",
|
|
38
|
+
"tcpFlags",
|
|
39
|
+
"tcpDataOffsetResv",
|
|
40
|
+
"tcpUrgPtr",
|
|
41
|
+
"ipIdent",
|
|
42
|
+
"ipTotalLen",
|
|
43
|
+
"ipFragFlags",
|
|
44
|
+
"ipTos",
|
|
45
|
+
"tcpOptsFlags",
|
|
46
|
+
"tcpOptsOrder"
|
|
47
|
+
];
|
|
13
48
|
var parseIntHeader = (raw, logger, headerName, max) => {
|
|
14
49
|
if (raw === void 0) return;
|
|
15
50
|
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
@@ -31,6 +66,46 @@ var MAX_NS = 2 ** 63;
|
|
|
31
66
|
var MAX_U8 = 255;
|
|
32
67
|
var MAX_U16 = 65535;
|
|
33
68
|
var MAX_U32 = 4294967295;
|
|
69
|
+
var OPTS_KINDS_SLOTS = 8;
|
|
70
|
+
var MAX_U64 = (1n << 64n) - 1n;
|
|
71
|
+
var parseOptsKindsHeader = (raw, logger) => {
|
|
72
|
+
if (raw === void 0) return;
|
|
73
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
74
|
+
if (value === void 0 || !/^\d+$/.test(value)) {
|
|
75
|
+
if (value !== void 0) logger.debug(() => ({
|
|
76
|
+
msg: "Ignoring malformed raw TLS signal header",
|
|
77
|
+
data: {
|
|
78
|
+
header: HEADER_TCP_OPTS_KINDS,
|
|
79
|
+
raw: value
|
|
80
|
+
}
|
|
81
|
+
}));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
let packed;
|
|
85
|
+
try {
|
|
86
|
+
packed = BigInt(value);
|
|
87
|
+
} catch {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (packed > MAX_U64) {
|
|
91
|
+
logger.debug(() => ({
|
|
92
|
+
msg: "Ignoring out-of-range raw TLS signal header",
|
|
93
|
+
data: {
|
|
94
|
+
header: HEADER_TCP_OPTS_KINDS,
|
|
95
|
+
raw: value
|
|
96
|
+
}
|
|
97
|
+
}));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (packed === 0n) return;
|
|
101
|
+
const kinds = [];
|
|
102
|
+
for (let slot = 0; slot < OPTS_KINDS_SLOTS; slot++) {
|
|
103
|
+
const kind = Number(packed >> BigInt(slot * 8) & 255n);
|
|
104
|
+
if (kind === 0) break;
|
|
105
|
+
kinds.push(kind);
|
|
106
|
+
}
|
|
107
|
+
return kinds.length > 0 ? kinds : void 0;
|
|
108
|
+
};
|
|
34
109
|
var getRawTlsSignals = (headers, logger) => {
|
|
35
110
|
const log = logger ?? getLogger("info", "provider:raw-tls-signals");
|
|
36
111
|
return {
|
|
@@ -40,37 +115,50 @@ var getRawTlsSignals = (headers, logger) => {
|
|
|
40
115
|
observedTtl: parseIntHeader(headers[HEADER_OBSERVED_TTL], log, HEADER_OBSERVED_TTL, MAX_U8),
|
|
41
116
|
tcpMss: parseIntHeader(headers[HEADER_TCP_MSS], log, HEADER_TCP_MSS, MAX_U16),
|
|
42
117
|
tcpWscale: parseIntHeader(headers[HEADER_TCP_WSCALE], log, HEADER_TCP_WSCALE, MAX_U8),
|
|
118
|
+
tcpWindow: parseIntHeader(headers[HEADER_TCP_WINDOW], log, HEADER_TCP_WINDOW, MAX_U16),
|
|
119
|
+
tcpOptsKinds: parseOptsKindsHeader(headers[HEADER_TCP_OPTS_KINDS], log),
|
|
120
|
+
tcpOptsPresent: parseIntHeader(headers[HEADER_TCP_OPTS_PRESENT], log, HEADER_TCP_OPTS_PRESENT, MAX_U16),
|
|
121
|
+
tcpOptsCount: parseIntHeader(headers[HEADER_TCP_OPTS_COUNT], log, HEADER_TCP_OPTS_COUNT, MAX_U8),
|
|
122
|
+
tcpTsval: parseIntHeader(headers[HEADER_TCP_TSVAL], log, HEADER_TCP_TSVAL, MAX_U32),
|
|
123
|
+
tcpTsecr: parseIntHeader(headers[HEADER_TCP_TSECR], log, HEADER_TCP_TSECR, MAX_U32),
|
|
124
|
+
tcpFlags: parseIntHeader(headers[HEADER_TCP_FLAGS], log, HEADER_TCP_FLAGS, MAX_U8),
|
|
125
|
+
tcpDataOffsetResv: parseIntHeader(headers[HEADER_TCP_DATA_OFFSET_RESV], log, HEADER_TCP_DATA_OFFSET_RESV, MAX_U8),
|
|
126
|
+
tcpUrgPtr: parseIntHeader(headers[HEADER_TCP_URG_PTR], log, HEADER_TCP_URG_PTR, MAX_U16),
|
|
127
|
+
ipIdent: parseIntHeader(headers[HEADER_IP_IDENT], log, HEADER_IP_IDENT, MAX_U16),
|
|
128
|
+
ipTotalLen: parseIntHeader(headers[HEADER_IP_TOTAL_LEN], log, HEADER_IP_TOTAL_LEN, MAX_U16),
|
|
129
|
+
ipFragFlags: parseIntHeader(headers[HEADER_IP_FRAG_FLAGS], log, HEADER_IP_FRAG_FLAGS, MAX_U16),
|
|
130
|
+
ipTos: parseIntHeader(headers[HEADER_IP_TOS], log, HEADER_IP_TOS, MAX_U8),
|
|
43
131
|
tcpOptsFlags: parseIntHeader(headers[HEADER_TCP_OPTS_FLAGS], log, HEADER_TCP_OPTS_FLAGS, MAX_U8),
|
|
44
|
-
tcpOptsOrder: parseIntHeader(headers[HEADER_TCP_OPTS_ORDER], log, HEADER_TCP_OPTS_ORDER, MAX_U32)
|
|
45
|
-
tcpWindow: parseIntHeader(headers[HEADER_TCP_WINDOW], log, HEADER_TCP_WINDOW, MAX_U16)
|
|
132
|
+
tcpOptsOrder: parseIntHeader(headers[HEADER_TCP_OPTS_ORDER], log, HEADER_TCP_OPTS_ORDER, MAX_U32)
|
|
46
133
|
};
|
|
47
134
|
};
|
|
48
|
-
var rawTlsSignalsForSession = (req) =>
|
|
135
|
+
var rawTlsSignalsForSession = (req) => rawTlsSignalsFromRecord(req);
|
|
136
|
+
/**
|
|
137
|
+
* Pull the raw TLS signals out of a persisted Session — or anything shaped
|
|
138
|
+
* like one — for a decision machine's `raw` bag, or to carry forward onto a
|
|
139
|
+
* new Session record.
|
|
140
|
+
*
|
|
141
|
+
* Six call sites used to name every field by hand, so adding one to the
|
|
142
|
+
* probe meant remembering six places; the fields that were forgotten read as
|
|
143
|
+
* `undefined` and the rules gating on them silently never fired.
|
|
144
|
+
*/
|
|
145
|
+
var rawTlsSignalsFromRecord = (record) => {
|
|
49
146
|
const out = {};
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (req.tcpWscale !== void 0) out.tcpWscale = req.tcpWscale;
|
|
56
|
-
if (req.tcpOptsFlags !== void 0) out.tcpOptsFlags = req.tcpOptsFlags;
|
|
57
|
-
if (req.tcpOptsOrder !== void 0) out.tcpOptsOrder = req.tcpOptsOrder;
|
|
58
|
-
if (req.tcpWindow !== void 0) out.tcpWindow = req.tcpWindow;
|
|
147
|
+
if (!record) return out;
|
|
148
|
+
for (const key of RAW_TLS_SIGNAL_KEYS) {
|
|
149
|
+
const value = record[key];
|
|
150
|
+
if (value !== void 0) Object.assign(out, { [key]: value });
|
|
151
|
+
}
|
|
59
152
|
return out;
|
|
60
153
|
};
|
|
61
154
|
var rawTlsSignalsMiddleware = (env) => {
|
|
62
155
|
return async (req, res, next) => {
|
|
63
156
|
try {
|
|
64
157
|
const signals = getRawTlsSignals(req.headers, req.logger);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (signals.tcpMss !== void 0) req.tcpMss = signals.tcpMss;
|
|
70
|
-
if (signals.tcpWscale !== void 0) req.tcpWscale = signals.tcpWscale;
|
|
71
|
-
if (signals.tcpOptsFlags !== void 0) req.tcpOptsFlags = signals.tcpOptsFlags;
|
|
72
|
-
if (signals.tcpOptsOrder !== void 0) req.tcpOptsOrder = signals.tcpOptsOrder;
|
|
73
|
-
if (signals.tcpWindow !== void 0) req.tcpWindow = signals.tcpWindow;
|
|
158
|
+
for (const key of RAW_TLS_SIGNAL_KEYS) {
|
|
159
|
+
const value = signals[key];
|
|
160
|
+
if (value !== void 0) Object.assign(req, { [key]: value });
|
|
161
|
+
}
|
|
74
162
|
if (Object.values(signals).some((v) => v !== void 0)) req.logger = req.logger.with(signals, "rawTlsSignals");
|
|
75
163
|
next();
|
|
76
164
|
} catch (err) {
|
|
@@ -79,4 +167,4 @@ var rawTlsSignalsMiddleware = (env) => {
|
|
|
79
167
|
};
|
|
80
168
|
};
|
|
81
169
|
//#endregion
|
|
82
|
-
export { getRawTlsSignals, rawTlsSignalsForSession, rawTlsSignalsMiddleware };
|
|
170
|
+
export { getRawTlsSignals, rawTlsSignalsForSession, rawTlsSignalsFromRecord, rawTlsSignalsMiddleware };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rawTlsSignalsMiddleware.js","sourceRoot":"","sources":["../../src/api/rawTlsSignalsMiddleware.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAczD,MAAM,aAAa,GAAG,cAAc,CAAC;AACrC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAC3C,MAAM,aAAa,GAAG,cAAc,CAAC;AACrC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AACjD,MAAM,cAAc,GAAG,eAAe,CAAC;AACvC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAC7C,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AACrD,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AACrD,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"rawTlsSignalsMiddleware.js","sourceRoot":"","sources":["../../src/api/rawTlsSignalsMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { metricsMiddleware } from "./metrics.js";
|
|
2
|
+
import { rawTlsSignalsMiddleware } from "./rawTlsSignalsMiddleware.js";
|
|
2
3
|
import { getVerdictCache } from "./blacklistRequestInspector.js";
|
|
3
4
|
import { initDetectorBundlePool } from "../tasks/detection/bundlePool.js";
|
|
4
5
|
import { blockMiddleware } from "./block.js";
|
|
5
|
-
import { rawTlsSignalsMiddleware } from "./rawTlsSignalsMiddleware.js";
|
|
6
6
|
import { prosopoRouter } from "./captcha.js";
|
|
7
7
|
import { prosopoVerifyRouter } from "./verify.js";
|
|
8
8
|
import { ja4Middleware } from "./ja4Middleware.js";
|
|
@@ -19,10 +19,10 @@ import { ipInfoMiddleware } from "./ipInfoMiddleware.js";
|
|
|
19
19
|
import { robotsMiddleware } from "./robotsMiddleware.js";
|
|
20
20
|
import { parseLogLevel } from "@prosopo/logger";
|
|
21
21
|
import { AdminApiPaths, ClientApiPaths } from "@prosopo/types";
|
|
22
|
+
import { apiExpressRouterFactory, authMiddleware, createApiExpressDefaultEndpointAdapter, requestLoggerMiddleware } from "@prosopo/api-express-router";
|
|
22
23
|
import fs from "node:fs";
|
|
23
24
|
import path from "node:path";
|
|
24
25
|
import https from "node:https";
|
|
25
|
-
import { apiExpressRouterFactory, authMiddleware, createApiExpressDefaultEndpointAdapter, requestLoggerMiddleware } from "@prosopo/api-express-router";
|
|
26
26
|
import express from "express";
|
|
27
27
|
import { fileURLToPath } from "node:url";
|
|
28
28
|
import { i18nMiddleware } from "@prosopo/locale";
|
|
@@ -13,6 +13,15 @@ var resolveScoreLadder = (configured) => {
|
|
|
13
13
|
};
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
|
+
* The types any session minted by /frictionless may be. The owner's
|
|
17
|
+
* `frictionlessTypes` only governs the frictionless flow, so a site pinned to
|
|
18
|
+
* a concrete `captchaType` is held to the feature flags alone.
|
|
19
|
+
*/
|
|
20
|
+
var resolveSiteAllowedCaptchaTypes = (settings) => (0, _prosopo_types.resolveAllowedCaptchaTypes)({
|
|
21
|
+
captchaTypeFeatureFlags: settings.captchaTypeFeatureFlags,
|
|
22
|
+
...(!settings.captchaType || settings.captchaType === _prosopo_types.CaptchaType.frictionless) && { frictionlessTypes: settings.frictionlessTypes }
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
16
25
|
* Size an image challenge by how much was actually found. `base` is the
|
|
17
26
|
* sitekey's ordinary image round count; each triggered signal adds a round,
|
|
18
27
|
* capped by `MAX_DETECTOR_EXTRA_IMAGE_ROUNDS`. A session with nothing
|
|
@@ -24,3 +33,4 @@ var getRoundsFromTriggeredDetectors = (base, triggeredDetectors) => base + Math.
|
|
|
24
33
|
//#endregion
|
|
25
34
|
exports.getRoundsFromTriggeredDetectors = getRoundsFromTriggeredDetectors;
|
|
26
35
|
exports.resolveScoreLadder = resolveScoreLadder;
|
|
36
|
+
exports.resolveSiteAllowedCaptchaTypes = resolveSiteAllowedCaptchaTypes;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
const require_metrics = require("../../metrics.cjs");
|
|
2
2
|
const require_dnsEventUrl = require("../../dnsEventUrl.cjs");
|
|
3
|
+
const require_rawTlsSignalsMiddleware = require("../../rawTlsSignalsMiddleware.cjs");
|
|
3
4
|
const require_compositeIpAddress = require("../../../compositeIpAddress.cjs");
|
|
4
5
|
const require_blacklistRequestInspector = require("../../blacklistRequestInspector.cjs");
|
|
6
|
+
const require_captchaTypeSelection = require("../../../tasks/captchaTypeSelection.cjs");
|
|
5
7
|
const require_devicePlatform = require("../../../utils/devicePlatform.cjs");
|
|
6
8
|
const require_tasks = require("../../../tasks/tasks.cjs");
|
|
7
9
|
const require_apiToggleMaintenanceModeEndpoint = require("../../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
@@ -9,7 +11,6 @@ const require_testSiteKey = require("../../testSiteKey.cjs");
|
|
|
9
11
|
const require_normalizeRequestIp = require("../../../utils/normalizeRequestIp.cjs");
|
|
10
12
|
const require_hashUserAgent = require("../../../utils/hashUserAgent.cjs");
|
|
11
13
|
const require_hashUserIp = require("../../../utils/hashUserIp.cjs");
|
|
12
|
-
const require_rawTlsSignalsMiddleware = require("../../rawTlsSignalsMiddleware.cjs");
|
|
13
14
|
const require_maintenanceModeResponses = require("../maintenanceModeResponses.cjs");
|
|
14
15
|
const require_trafficFilterRequestTime = require("../trafficFilterRequestTime.cjs");
|
|
15
16
|
const require_honeypotResponse = require("./honeypotResponse.cjs");
|
|
@@ -17,6 +18,7 @@ const require_accessPolicy = require("./accessPolicy.cjs");
|
|
|
17
18
|
const require_constants = require("./constants.cjs");
|
|
18
19
|
const require_decisionMachine = require("./decisionMachine.cjs");
|
|
19
20
|
const require_decryptSimdReadings = require("./decryptSimdReadings.cjs");
|
|
21
|
+
const require_refreshLineage = require("./refreshLineage.cjs");
|
|
20
22
|
const require_sessionDedup = require("./sessionDedup.cjs");
|
|
21
23
|
const require_shortCircuit = require("./shortCircuit.cjs");
|
|
22
24
|
let _prosopo_common = require("@prosopo/common");
|
|
@@ -38,7 +40,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
38
40
|
}
|
|
39
41
|
}));
|
|
40
42
|
});
|
|
41
|
-
const { token, headHash, dapp, user, mode, simdReadings, detectorSessionId, currentUrl: reportedCurrentUrl, iframeUrl: reportedIframeUrl, clientSessionId } = _prosopo_types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
|
|
43
|
+
const { token, headHash, dapp, user, mode, simdReadings, detectorSessionId, currentUrl: reportedCurrentUrl, iframeUrl: reportedIframeUrl, clientSessionId, refreshOf } = _prosopo_types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
|
|
42
44
|
const currentUrl = (0, _prosopo_util.sanitisePageUrl)(reportedCurrentUrl);
|
|
43
45
|
const iframeUrl = (0, _prosopo_util.sanitisePageUrl)(reportedIframeUrl);
|
|
44
46
|
const isProtect = (0, _prosopo_util.isProtectDeployment)(currentUrl, iframeUrl);
|
|
@@ -108,6 +110,8 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
108
110
|
i18n: req.i18n,
|
|
109
111
|
logger: req.logger
|
|
110
112
|
}));
|
|
113
|
+
const allowedCaptchaTypes = require_constants.resolveSiteAllowedCaptchaTypes(clientRecord.settings);
|
|
114
|
+
tasks.frictionlessManager.setAllowedCaptchaTypes(allowedCaptchaTypes);
|
|
111
115
|
if (dedup) {
|
|
112
116
|
const dedupCountryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
|
|
113
117
|
const dedupAsn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
|
|
@@ -144,16 +148,17 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
144
148
|
...dedupTrafficPolicies && { trafficPolicies: dedupTrafficPolicies }
|
|
145
149
|
}
|
|
146
150
|
}) : { captchaType: cachedCaptchaType };
|
|
147
|
-
const dedupConflictsWithRouting = dedupRouted.captchaType !== cachedCaptchaType;
|
|
151
|
+
const dedupConflictsWithRouting = require_captchaTypeSelection.coerceToEnabledCaptchaType(dedupRouted.captchaType, allowedCaptchaTypes) !== cachedCaptchaType;
|
|
152
|
+
const dedupConflictsWithAllowedTypes = require_captchaTypeSelection.coerceToEnabledCaptchaType(cachedCaptchaType, allowedCaptchaTypes) !== cachedCaptchaType;
|
|
148
153
|
let dedupConflictsWithBundle = false;
|
|
149
154
|
let dedupIncomingBundleId;
|
|
150
155
|
if (detectorSessionId && dedup.session.bundleId) {
|
|
151
156
|
dedupIncomingBundleId = (await tasks.frictionlessManager.resolveBundleByDetectorSession(detectorSessionId))?.bundleId;
|
|
152
157
|
if (dedupIncomingBundleId !== void 0 && dedupIncomingBundleId !== dedup.session.bundleId) dedupConflictsWithBundle = true;
|
|
153
158
|
}
|
|
154
|
-
if (dedupConflictsWithPolicy || dedupConflictsWithRouting) {
|
|
159
|
+
if (dedupConflictsWithPolicy || dedupConflictsWithRouting || dedupConflictsWithAllowedTypes) {
|
|
155
160
|
req.logger.info(() => ({
|
|
156
|
-
msg: "Evicting reused session: cached captchaType conflicts with access policy or
|
|
161
|
+
msg: "Evicting reused session: cached captchaType conflicts with access policy, routing machine or allowed types",
|
|
157
162
|
data: {
|
|
158
163
|
userSitekeyIpHash,
|
|
159
164
|
sessionId: dedup.sessionId,
|
|
@@ -162,7 +167,8 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
162
167
|
policyType: dedupAccessPolicy?.type,
|
|
163
168
|
policyCaptchaType: dedupAccessPolicy?.captchaType
|
|
164
169
|
},
|
|
165
|
-
...dedupConflictsWithRouting && { routedCaptchaType: dedupRouted.captchaType }
|
|
170
|
+
...dedupConflictsWithRouting && { routedCaptchaType: dedupRouted.captchaType },
|
|
171
|
+
...dedupConflictsWithAllowedTypes && { allowedCaptchaTypes }
|
|
166
172
|
}
|
|
167
173
|
}));
|
|
168
174
|
await tasks.db.checkAndRemoveSession(dedup.sessionId);
|
|
@@ -306,6 +312,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
306
312
|
...triggeredDetectors && triggeredDetectors.length > 0 && { triggeredDetectors },
|
|
307
313
|
...shadowDomPenalty !== void 0 && { shadowDomPenalty }
|
|
308
314
|
};
|
|
315
|
+
const refreshLineage = await require_refreshLineage.resolveRefreshLineage(tasks.db, refreshOf, dapp, /* @__PURE__ */ new Date());
|
|
309
316
|
tasks.frictionlessManager.setSessionParams({
|
|
310
317
|
token: sessionToken,
|
|
311
318
|
score: botScore,
|
|
@@ -326,6 +333,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
326
333
|
...decodedSimdReadings && { simdReadings: decodedSimdReadings },
|
|
327
334
|
...d !== void 0 && { d },
|
|
328
335
|
...clientSessionId && { clientMetaData: { clientSessionId } },
|
|
336
|
+
...refreshLineage,
|
|
329
337
|
...req.tcpToChelloUs !== void 0 && { tcpToChelloUs: req.tcpToChelloUs },
|
|
330
338
|
...req.chelloToHandshakeUs !== void 0 && { chelloToHandshakeUs: req.chelloToHandshakeUs },
|
|
331
339
|
...require_rawTlsSignalsMiddleware.rawTlsSignalsForSession(req)
|
|
@@ -341,7 +349,6 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
341
349
|
score: botScore,
|
|
342
350
|
imageMaxRounds: clientRecord.settings.imageMaxRounds,
|
|
343
351
|
imageMinRounds: clientRecord.settings.imageMinRounds,
|
|
344
|
-
frictionlessTypes: clientRecord.settings.frictionlessTypes,
|
|
345
352
|
baseImageRounds: env.config.captchas.solved.count,
|
|
346
353
|
puzzleMaxDifficulty: clientRecord.settings.puzzleMaxDifficulty,
|
|
347
354
|
platform: require_devicePlatform.derivePlatform(requestUserAgent, webView, { ...typeof ipInfoMobile === "boolean" && { isMobile: ipInfoMobile } }),
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.ts
|
|
2
|
+
/**
|
|
3
|
+
* Work out where a refresh sits in its chain from the session it replaced.
|
|
4
|
+
*
|
|
5
|
+
* An unknown session, or one from another site, is ignored rather than
|
|
6
|
+
* rejected: the request then mints an ordinary session, which is all a client
|
|
7
|
+
* that never sent `refreshOf` would have got.
|
|
8
|
+
*/
|
|
9
|
+
var resolveRefreshLineage = async (db, refreshOf, siteKey, now) => {
|
|
10
|
+
if (!refreshOf) return void 0;
|
|
11
|
+
const replaced = await db.getSessionRecordBySessionId(refreshOf);
|
|
12
|
+
if (!replaced || replaced.siteKey !== siteKey) return void 0;
|
|
13
|
+
return {
|
|
14
|
+
refreshOf,
|
|
15
|
+
refreshCount: (replaced.refreshCount ?? 0) + 1,
|
|
16
|
+
refreshedAfterMs: Math.max(0, now.getTime() - new Date(replaced.createdAt).getTime())
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
exports.resolveRefreshLineage = resolveRefreshLineage;
|
|
@@ -13,6 +13,7 @@ const require_requestBodySummary = require("../requestBodySummary.cjs");
|
|
|
13
13
|
let _prosopo_common = require("@prosopo/common");
|
|
14
14
|
let _prosopo_types = require("@prosopo/types");
|
|
15
15
|
let _prosopo_util = require("@prosopo/util");
|
|
16
|
+
let _prosopo_puzzle_assets = require("@prosopo/puzzle-assets");
|
|
16
17
|
//#region src/api/captcha/getPuzzleCaptchaChallenge.ts
|
|
17
18
|
var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (req, res, next) => {
|
|
18
19
|
let parsed;
|
|
@@ -113,6 +114,29 @@ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (
|
|
|
113
114
|
targetX: challenge.targetX,
|
|
114
115
|
targetY: challenge.targetY
|
|
115
116
|
}, effectivePuzzleSettings, effectivePieceSize);
|
|
117
|
+
await tasks.db.updatePuzzleCaptchaRecord(challenge.challenge, { render: {
|
|
118
|
+
...sessionRecord?.puzzleLevel !== void 0 && { level: sessionRecord.puzzleLevel },
|
|
119
|
+
pieceSize: images.pieceSize,
|
|
120
|
+
geometry: {
|
|
121
|
+
width: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.width,
|
|
122
|
+
height: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.height,
|
|
123
|
+
notchSize: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.notchSize
|
|
124
|
+
},
|
|
125
|
+
settings: {
|
|
126
|
+
decoyCount: effectivePuzzleSettings.decoyCount,
|
|
127
|
+
decoyEdgeDarkness: effectivePuzzleSettings.decoyEdgeDarkness,
|
|
128
|
+
decoyBodyBrightness: effectivePuzzleSettings.decoyBodyBrightness,
|
|
129
|
+
holeDarken: effectivePuzzleSettings.holeDarken,
|
|
130
|
+
decoyHoleDarken: effectivePuzzleSettings.decoyHoleDarken
|
|
131
|
+
},
|
|
132
|
+
backgroundSeed: images.backgroundSeed,
|
|
133
|
+
renderSeed: images.renderSeed
|
|
134
|
+
} }).catch((updateErr) => {
|
|
135
|
+
req.logger.warn(() => ({
|
|
136
|
+
err: updateErr,
|
|
137
|
+
msg: "Failed to patch puzzle render inputs onto the challenge record"
|
|
138
|
+
}));
|
|
139
|
+
});
|
|
116
140
|
const padBytes = trafficVerdict.padBytes;
|
|
117
141
|
const getPuzzleCaptchaResponse = {
|
|
118
142
|
[_prosopo_types.ApiParams.status]: "ok",
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
const require_validateAddress = require("../validateAddress.cjs");
|
|
2
|
+
const require_rawTlsSignalsMiddleware = require("../rawTlsSignalsMiddleware.cjs");
|
|
2
3
|
const require_captchaTypeSelection = require("../../tasks/captchaTypeSelection.cjs");
|
|
3
4
|
const require_puzzleDifficulty = require("../../tasks/puzzle/puzzleDifficulty.cjs");
|
|
4
5
|
const require_devicePlatform = require("../../utils/devicePlatform.cjs");
|
|
5
6
|
const require_tasks = require("../../tasks/tasks.cjs");
|
|
6
7
|
const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
7
8
|
const require_testSiteKey = require("../testSiteKey.cjs");
|
|
8
|
-
const require_rawTlsSignalsMiddleware = require("../rawTlsSignalsMiddleware.cjs");
|
|
9
9
|
const require_requestBodySummary = require("../requestBodySummary.cjs");
|
|
10
10
|
let _prosopo_common = require("@prosopo/common");
|
|
11
11
|
let _prosopo_types = require("@prosopo/types");
|
|
@@ -100,8 +100,9 @@ var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
|
100
100
|
chelloToHandshakeUs: req.chelloToHandshakeUs,
|
|
101
101
|
...require_rawTlsSignalsMiddleware.rawTlsSignalsForSession(req)
|
|
102
102
|
}, {
|
|
103
|
-
|
|
104
|
-
imageMaxRounds: clientRecord.settings?.imageMaxRounds
|
|
103
|
+
allowedCaptchaTypes: (0, _prosopo_types.resolveAllowedCaptchaTypes)(clientRecord.settings),
|
|
104
|
+
imageMaxRounds: clientRecord.settings?.imageMaxRounds,
|
|
105
|
+
puzzleMaxDifficulty: clientRecord.settings?.puzzleMaxDifficulty
|
|
105
106
|
});
|
|
106
107
|
const response = {
|
|
107
108
|
status: "ok",
|
|
@@ -144,17 +145,19 @@ var buildEscalation = async (tasks, result, challenge, perConnectionSignals, sit
|
|
|
144
145
|
const originSession = await tasks.db.getSessionRecordBySessionId(powRecord.sessionId);
|
|
145
146
|
if (!originSession) return void 0;
|
|
146
147
|
const routed = result.routingOutput;
|
|
147
|
-
const escalatedType = require_captchaTypeSelection.coerceToEnabledCaptchaType(routed.captchaType, siteConstraints?.
|
|
148
|
+
const escalatedType = require_captchaTypeSelection.coerceToEnabledCaptchaType(routed.captchaType, siteConstraints?.allowedCaptchaTypes);
|
|
148
149
|
if (escalatedType === _prosopo_types.CaptchaType.pow) return void 0;
|
|
149
150
|
const imageMaxRounds = siteConstraints?.imageMaxRounds ?? _prosopo_types.imageMaxRoundsDefault;
|
|
150
151
|
const escalationPuzzleOverrides = (() => {
|
|
151
152
|
if (escalatedType !== _prosopo_types.CaptchaType.puzzle) return void 0;
|
|
152
|
-
const
|
|
153
|
+
const { isMobile } = require_devicePlatform.derivePlatform(originSession.headers?.["user-agent"] ?? "", originSession.webView);
|
|
154
|
+
const level = (0, _prosopo_captcha_severity.severityToPuzzleDifficulty)(routed.solvedImagesCount ?? originSession.solvedImagesCount, tasks.config.captchas.solved.count, (0, _prosopo_captcha_severity.resolveMaxEscalationLevel)(siteConstraints?.puzzleMaxDifficulty, isMobile));
|
|
153
155
|
if (level === 0) return void 0;
|
|
154
156
|
const difficulty = require_puzzleDifficulty.samplePuzzleDifficulty(level, _prosopo_puzzle_assets.DEFAULT_RENDER_SETTINGS.holeDarken);
|
|
155
157
|
return {
|
|
156
158
|
puzzleTolerance: difficulty.tolerance,
|
|
157
|
-
puzzle: difficulty.puzzle
|
|
159
|
+
puzzle: difficulty.puzzle,
|
|
160
|
+
puzzleLevel: difficulty.level
|
|
158
161
|
};
|
|
159
162
|
})();
|
|
160
163
|
const selectionReason = routed.reason ?? originSession.reason;
|
|
@@ -185,15 +188,7 @@ var buildEscalation = async (tasks, result, challenge, perConnectionSignals, sit
|
|
|
185
188
|
originSessionId: originSession.sessionId,
|
|
186
189
|
tcpToChelloUs: perConnectionSignals?.tcpToChelloUs,
|
|
187
190
|
chelloToHandshakeUs: perConnectionSignals?.chelloToHandshakeUs,
|
|
188
|
-
|
|
189
|
-
synackNs: perConnectionSignals?.synackNs,
|
|
190
|
-
ackNs: perConnectionSignals?.ackNs,
|
|
191
|
-
observedTtl: perConnectionSignals?.observedTtl,
|
|
192
|
-
tcpMss: perConnectionSignals?.tcpMss,
|
|
193
|
-
tcpWscale: perConnectionSignals?.tcpWscale,
|
|
194
|
-
tcpOptsFlags: perConnectionSignals?.tcpOptsFlags,
|
|
195
|
-
tcpOptsOrder: perConnectionSignals?.tcpOptsOrder,
|
|
196
|
-
tcpWindow: perConnectionSignals?.tcpWindow,
|
|
191
|
+
...require_rawTlsSignalsMiddleware.rawTlsSignalsFromRecord(perConnectionSignals),
|
|
197
192
|
puzzleTolerance: escalationPuzzleOverrides?.puzzleTolerance,
|
|
198
193
|
puzzle: escalationPuzzleOverrides?.puzzle,
|
|
199
194
|
clientMetaData: originSession.clientMetaData
|