@prosopo/provider 5.6.4 → 5.7.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 -15
- package/.turbo/turbo-build$colon$tsc.log +28 -25
- package/.turbo/turbo-build.log +17 -16
- package/CHANGELOG.md +140 -0
- package/dist/api/blacklistRequestInspector.d.ts +1 -1
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.js +9 -12
- package/dist/api/blacklistRequestInspector.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +0 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +1 -9
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +1 -49
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.js +2 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +1 -1
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/blacklistRequestInspector.cjs +8 -11
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +0 -9
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +0 -48
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +3 -2
- package/dist/cjs/api/verify.cjs +1 -1
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +3 -5
- package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +30 -1
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +1 -2
- package/dist/cjs/tasks/puzzle/puzzleDifficulty.cjs +13 -170
- package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +2 -2
- package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +2 -8
- package/dist/tasks/frictionless/frictionlessTasks.d.ts +1 -2
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +2 -4
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasksUtils.js +30 -1
- package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +1 -3
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tasks/puzzle/puzzleDifficulty.d.ts +0 -17
- package/dist/tasks/puzzle/puzzleDifficulty.d.ts.map +1 -1
- package/dist/tasks/puzzle/puzzleDifficulty.js +11 -164
- package/dist/tasks/puzzle/puzzleDifficulty.js.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.js +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.js +3 -9
- package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +1 -19
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js +1 -10
- package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js.map +1 -1
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js +1 -15
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +35 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +1 -30
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.unit.test.js +0 -6
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.unit.test.js.map +1 -1
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +1 -62
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +1 -10
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +3 -23
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +64 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +10 -10
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzleDifficulty.unit.test.js +2 -53
- package/dist/tests/unit/tasks/puzzleDifficulty.unit.test.js.map +1 -1
- package/package.json +29 -28
- package/dist/api/captcha/contextAwareValidation.d.ts +0 -5
- package/dist/api/captcha/contextAwareValidation.d.ts.map +0 -1
- package/dist/api/captcha/contextAwareValidation.js +0 -45
- package/dist/api/captcha/contextAwareValidation.js.map +0 -1
- package/dist/cjs/api/captcha/contextAwareValidation.cjs +0 -47
- package/dist/tests/unit/api/contextAwareValidation.unit.test.d.ts +0 -2
- package/dist/tests/unit/api/contextAwareValidation.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/api/contextAwareValidation.unit.test.js +0 -105
- package/dist/tests/unit/api/contextAwareValidation.unit.test.js.map +0 -1
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
let _prosopo_types = require("@prosopo/types");
|
|
2
|
-
//#region src/api/captcha/contextAwareValidation.ts
|
|
3
|
-
/**
|
|
4
|
-
* Determines the context a request belongs to — its device family crossed
|
|
5
|
-
* with whether it is running in a webview.
|
|
6
|
-
*
|
|
7
|
-
* `userAgent` is the raw header value, not the hashed one carried on the
|
|
8
|
-
* decrypted payload. The entropy sweep classifies stored sessions from the
|
|
9
|
-
* same header through the same function, so the two sides agree on which
|
|
10
|
-
* bucket a session lands in.
|
|
11
|
-
*
|
|
12
|
-
* @param userAgent - Raw `user-agent` request header
|
|
13
|
-
* @param webView - Whether the request is from a WebView
|
|
14
|
-
*/
|
|
15
|
-
function determineContextType(userAgent, webView) {
|
|
16
|
-
return (0, _prosopo_types.contextTypeFromSession)(userAgent, webView);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Whether the client has this context configured.
|
|
20
|
-
*
|
|
21
|
-
* A context the customer has not enabled is not validated at all — the
|
|
22
|
-
* request passes through this stage untouched. That is a change from the
|
|
23
|
-
* pre-device-type behaviour, where configuring a single context validated
|
|
24
|
-
* *every* request against it: with six contexts, applying a tablet baseline
|
|
25
|
-
* to desktop traffic would reject real users wholesale.
|
|
26
|
-
*/
|
|
27
|
-
function isContextConfigured(settings, contextType) {
|
|
28
|
-
return (0, _prosopo_types.expandContexts)(settings.contextAware?.contexts)[contextType] !== void 0;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Gets the threshold for a specific context type from client settings.
|
|
32
|
-
*
|
|
33
|
-
* Falls back to the global default when the context is unconfigured, so a
|
|
34
|
-
* caller that skipped `isContextConfigured` still gets a sane number rather
|
|
35
|
-
* than NaN.
|
|
36
|
-
*
|
|
37
|
-
* @param settings - Client settings
|
|
38
|
-
* @param contextType - The context type to get the threshold for
|
|
39
|
-
* @returns The threshold for the context type, or the global threshold if not configured
|
|
40
|
-
*/
|
|
41
|
-
function getContextThreshold(settings, contextType) {
|
|
42
|
-
return (0, _prosopo_types.expandContexts)(settings.contextAware?.contexts)[contextType]?.threshold ?? _prosopo_types.contextAwareThresholdDefault;
|
|
43
|
-
}
|
|
44
|
-
//#endregion
|
|
45
|
-
exports.determineContextType = determineContextType;
|
|
46
|
-
exports.getContextThreshold = getContextThreshold;
|
|
47
|
-
exports.isContextConfigured = isContextConfigured;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contextAwareValidation.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit/api/contextAwareValidation.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { ContextType, contextAwareThresholdDefault, } from "@prosopo/types";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
3
|
-
import { determineContextType, getContextThreshold, isContextConfigured, } from "../../../api/captcha/contextAwareValidation.js";
|
|
4
|
-
const DESKTOP_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
|
5
|
-
const IPHONE_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
6
|
-
const IPAD_UA = "Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
7
|
-
const ANDROID_PHONE_UA = "Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36";
|
|
8
|
-
const ANDROID_TABLET_UA = "Mozilla/5.0 (Linux; Android 13; SM-X710) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
|
9
|
-
const settingsWith = (contexts) => ({
|
|
10
|
-
contextAware: { enabled: true, contexts },
|
|
11
|
-
});
|
|
12
|
-
describe("contextAwareValidation", () => {
|
|
13
|
-
describe("determineContextType", () => {
|
|
14
|
-
it("classifies desktop browsers", () => {
|
|
15
|
-
expect(determineContextType(DESKTOP_UA, false)).toBe(ContextType.Desktop);
|
|
16
|
-
});
|
|
17
|
-
it("classifies phones", () => {
|
|
18
|
-
expect(determineContextType(IPHONE_UA, false)).toBe(ContextType.Mobile);
|
|
19
|
-
expect(determineContextType(ANDROID_PHONE_UA, false)).toBe(ContextType.Mobile);
|
|
20
|
-
});
|
|
21
|
-
it("classifies tablets, including an iPad whose UA carries a Mobile token", () => {
|
|
22
|
-
expect(determineContextType(IPAD_UA, false)).toBe(ContextType.Tablet);
|
|
23
|
-
expect(determineContextType(ANDROID_TABLET_UA, false)).toBe(ContextType.Tablet);
|
|
24
|
-
});
|
|
25
|
-
it("crosses each device family with the webview flag", () => {
|
|
26
|
-
expect(determineContextType(DESKTOP_UA, true)).toBe(ContextType.DesktopWebview);
|
|
27
|
-
expect(determineContextType(IPHONE_UA, true)).toBe(ContextType.MobileWebview);
|
|
28
|
-
expect(determineContextType(IPAD_UA, true)).toBe(ContextType.TabletWebview);
|
|
29
|
-
});
|
|
30
|
-
it("falls back to desktop for a missing user agent", () => {
|
|
31
|
-
expect(determineContextType(undefined, false)).toBe(ContextType.Desktop);
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
describe("isContextConfigured", () => {
|
|
35
|
-
it("is false when contextAware is not set", () => {
|
|
36
|
-
expect(isContextConfigured({}, ContextType.Mobile)).toBe(false);
|
|
37
|
-
});
|
|
38
|
-
it("is true only for the device contexts that are configured", () => {
|
|
39
|
-
const settings = settingsWith({
|
|
40
|
-
[ContextType.Mobile]: { type: ContextType.Mobile, threshold: 0.8 },
|
|
41
|
-
});
|
|
42
|
-
expect(isContextConfigured(settings, ContextType.Mobile)).toBe(true);
|
|
43
|
-
expect(isContextConfigured(settings, ContextType.Desktop)).toBe(false);
|
|
44
|
-
expect(isContextConfigured(settings, ContextType.MobileWebview)).toBe(false);
|
|
45
|
-
});
|
|
46
|
-
it("expands a legacy default context over every non-webview family", () => {
|
|
47
|
-
const settings = settingsWith({
|
|
48
|
-
[ContextType.Default]: { type: ContextType.Default, threshold: 0.75 },
|
|
49
|
-
});
|
|
50
|
-
expect(isContextConfigured(settings, ContextType.Desktop)).toBe(true);
|
|
51
|
-
expect(isContextConfigured(settings, ContextType.Mobile)).toBe(true);
|
|
52
|
-
expect(isContextConfigured(settings, ContextType.Tablet)).toBe(true);
|
|
53
|
-
expect(isContextConfigured(settings, ContextType.MobileWebview)).toBe(false);
|
|
54
|
-
});
|
|
55
|
-
it("expands a legacy webview context over every webview family", () => {
|
|
56
|
-
const settings = settingsWith({
|
|
57
|
-
[ContextType.Webview]: { type: ContextType.Webview, threshold: 0.75 },
|
|
58
|
-
});
|
|
59
|
-
expect(isContextConfigured(settings, ContextType.MobileWebview)).toBe(true);
|
|
60
|
-
expect(isContextConfigured(settings, ContextType.TabletWebview)).toBe(true);
|
|
61
|
-
expect(isContextConfigured(settings, ContextType.DesktopWebview)).toBe(true);
|
|
62
|
-
expect(isContextConfigured(settings, ContextType.Mobile)).toBe(false);
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
describe("getContextThreshold", () => {
|
|
66
|
-
it("returns the default threshold when contextAware is not set", () => {
|
|
67
|
-
const settings = {};
|
|
68
|
-
expect(getContextThreshold(settings, ContextType.Desktop)).toBe(contextAwareThresholdDefault);
|
|
69
|
-
});
|
|
70
|
-
it("returns the device context's own threshold", () => {
|
|
71
|
-
const settings = settingsWith({
|
|
72
|
-
[ContextType.Mobile]: { type: ContextType.Mobile, threshold: 0.9 },
|
|
73
|
-
[ContextType.Desktop]: { type: ContextType.Desktop, threshold: 0.6 },
|
|
74
|
-
});
|
|
75
|
-
expect(getContextThreshold(settings, ContextType.Mobile)).toBe(0.9);
|
|
76
|
-
expect(getContextThreshold(settings, ContextType.Desktop)).toBe(0.6);
|
|
77
|
-
});
|
|
78
|
-
it("inherits a legacy context's threshold across its family", () => {
|
|
79
|
-
const settings = settingsWith({
|
|
80
|
-
[ContextType.Default]: { type: ContextType.Default, threshold: 0.85 },
|
|
81
|
-
});
|
|
82
|
-
expect(getContextThreshold(settings, ContextType.Desktop)).toBe(0.85);
|
|
83
|
-
expect(getContextThreshold(settings, ContextType.Tablet)).toBe(0.85);
|
|
84
|
-
});
|
|
85
|
-
it("lets a device context override the legacy threshold that covers it", () => {
|
|
86
|
-
const settings = settingsWith({
|
|
87
|
-
[ContextType.Default]: { type: ContextType.Default, threshold: 0.85 },
|
|
88
|
-
[ContextType.Mobile]: { type: ContextType.Mobile, threshold: 0.6 },
|
|
89
|
-
});
|
|
90
|
-
expect(getContextThreshold(settings, ContextType.Mobile)).toBe(0.6);
|
|
91
|
-
expect(getContextThreshold(settings, ContextType.Desktop)).toBe(0.85);
|
|
92
|
-
});
|
|
93
|
-
it("returns the default threshold for an unconfigured context", () => {
|
|
94
|
-
const settings = settingsWith({
|
|
95
|
-
[ContextType.Mobile]: { type: ContextType.Mobile, threshold: 0.9 },
|
|
96
|
-
});
|
|
97
|
-
expect(getContextThreshold(settings, ContextType.Desktop)).toBe(contextAwareThresholdDefault);
|
|
98
|
-
});
|
|
99
|
-
it("handles an empty contexts object", () => {
|
|
100
|
-
const settings = settingsWith({});
|
|
101
|
-
expect(getContextThreshold(settings, ContextType.Desktop)).toBe(contextAwareThresholdDefault);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
//# sourceMappingURL=contextAwareValidation.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contextAwareValidation.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/api/contextAwareValidation.unit.test.ts"],"names":[],"mappings":"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"}
|