@prosopo/provider 5.19.4 → 5.20.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 +40 -36
- package/.turbo/turbo-build$colon$tsc.log +28 -28
- package/.turbo/turbo-build.log +43 -36
- package/CHANGELOG.md +135 -0
- package/dist/api/admin/apiClearAllCountersEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetSessionEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.js.map +1 -1
- package/dist/api/admin/apiReplaceDetectorPoolEndpoint.js.map +1 -1
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.js +9 -8
- package/dist/api/blacklistRequestInspector.js.map +1 -1
- package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -1
- package/dist/api/captcha/checkSpamEmail.js +19 -26
- package/dist/api/captcha/checkSpamEmail.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +11 -2
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +6 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +20 -25
- 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 +32 -43
- 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 +27 -32
- package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/interactiveCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/interactiveCaptchaChallenge.js +27 -32
- package/dist/api/captcha/interactiveCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/interactiveCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/interactiveCaptchaSolution.js +18 -24
- package/dist/api/captcha/interactiveCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.js +18 -24
- 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 +23 -25
- package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
- package/dist/api/domainMiddleware.d.ts.map +1 -1
- package/dist/api/domainMiddleware.js +39 -47
- package/dist/api/domainMiddleware.js.map +1 -1
- package/dist/api/errorCodeForReason.d.ts +3 -0
- package/dist/api/errorCodeForReason.d.ts.map +1 -0
- package/dist/api/errorCodeForReason.js +22 -0
- package/dist/api/errorCodeForReason.js.map +1 -0
- package/dist/api/headerCheckMiddleware.d.ts.map +1 -1
- package/dist/api/headerCheckMiddleware.js +14 -9
- package/dist/api/headerCheckMiddleware.js.map +1 -1
- package/dist/api/ipInfoMiddleware.d.ts +1 -1
- package/dist/api/ipInfoMiddleware.d.ts.map +1 -1
- package/dist/api/ipInfoMiddleware.js +5 -1
- package/dist/api/ipInfoMiddleware.js.map +1 -1
- package/dist/api/metrics.d.ts.map +1 -1
- package/dist/api/metrics.js +9 -1
- package/dist/api/metrics.js.map +1 -1
- package/dist/api/public.d.ts.map +1 -1
- package/dist/api/public.js +6 -2
- package/dist/api/public.js.map +1 -1
- package/dist/api/rateLimitHandler.d.ts +4 -0
- package/dist/api/rateLimitHandler.d.ts.map +1 -0
- package/dist/api/rateLimitHandler.js +20 -0
- package/dist/api/rateLimitHandler.js.map +1 -0
- package/dist/api/startProviderApi.d.ts +1 -0
- package/dist/api/startProviderApi.d.ts.map +1 -1
- package/dist/api/startProviderApi.js +8 -17
- package/dist/api/startProviderApi.js.map +1 -1
- package/dist/api/validateAddress.d.ts +3 -4
- package/dist/api/validateAddress.d.ts.map +1 -1
- package/dist/api/validateAddress.js +13 -19
- package/dist/api/validateAddress.js.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +73 -96
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/blacklistRequestInspector.cjs +9 -8
- package/dist/cjs/api/captcha/checkSpamEmail.cjs +18 -25
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +11 -2
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +6 -1
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +19 -24
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +31 -42
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +26 -31
- package/dist/cjs/api/captcha/interactiveCaptchaChallenge.cjs +26 -31
- package/dist/cjs/api/captcha/interactiveCaptchaSolution.cjs +17 -23
- package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +17 -23
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +22 -24
- package/dist/cjs/api/domainMiddleware.cjs +38 -46
- package/dist/cjs/api/errorCodeForReason.cjs +22 -0
- package/dist/cjs/api/headerCheckMiddleware.cjs +13 -8
- package/dist/cjs/api/ipInfoMiddleware.cjs +5 -1
- package/dist/cjs/api/metrics.cjs +9 -1
- package/dist/cjs/api/public.cjs +5 -1
- package/dist/cjs/api/rateLimitHandler.cjs +20 -0
- package/dist/cjs/api/startProviderApi.cjs +8 -16
- package/dist/cjs/api/validateAddress.cjs +12 -18
- package/dist/cjs/api/verify.cjs +72 -95
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/tasks/captchaManager.cjs +6 -8
- package/dist/cjs/tasks/client/clientTasks.cjs +26 -13
- package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +28 -8
- package/dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs +21 -19
- package/dist/cjs/tasks/frictionless/routingMachine.cjs +13 -4
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +89 -40
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +18 -8
- package/dist/cjs/tasks/interactiveCaptcha/interactiveCaptchaManager.cjs +21 -13
- package/dist/cjs/tasks/powCaptcha/backgroundWrites.cjs +24 -0
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +44 -19
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +14 -10
- package/dist/cjs/tasks/signatureCheck.cjs +12 -0
- package/dist/cjs/tasks/tasks.cjs +6 -1
- package/dist/cjs/util/usageCounters.cjs +26 -3
- package/dist/cjs/util.cjs +14 -3
- package/dist/errorSites.d.ts +98 -0
- package/dist/errorSites.d.ts.map +1 -0
- package/dist/errorSites.js +2 -0
- package/dist/errorSites.js.map +1 -0
- package/dist/fingerprint/dist/merkle.js +69 -0
- package/dist/fingerprint/dist/proof.js +95 -0
- package/dist/fingerprint/dist/summary.js +73 -0
- package/dist/index.js +2 -2
- package/dist/tasks/captchaManager.d.ts +2 -3
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +6 -7
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/client/clientTasks.d.ts.map +1 -1
- package/dist/tasks/client/clientTasks.js +27 -14
- package/dist/tasks/client/clientTasks.js.map +1 -1
- package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -1
- package/dist/tasks/dataset/datasetTasksUtils.js +29 -9
- package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -1
- package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts +1 -3
- package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts.map +1 -1
- package/dist/tasks/decisionMachine/decisionMachineRunner.js +21 -19
- package/dist/tasks/decisionMachine/decisionMachineRunner.js.map +1 -1
- package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -1
- package/dist/tasks/frictionless/routingMachine.js +13 -4
- 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 +91 -42
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +19 -9
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -1
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts.map +1 -1
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js +22 -14
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js.map +1 -1
- package/dist/tasks/powCaptcha/backgroundWrites.d.ts +7 -0
- package/dist/tasks/powCaptcha/backgroundWrites.d.ts.map +1 -0
- package/dist/tasks/powCaptcha/backgroundWrites.js +24 -0
- package/dist/tasks/powCaptcha/backgroundWrites.js.map +1 -0
- package/dist/tasks/powCaptcha/powTasks.d.ts +3 -3
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.js +45 -20
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js +15 -11
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
- package/dist/tasks/signatureCheck.d.ts +2 -0
- package/dist/tasks/signatureCheck.d.ts.map +1 -0
- package/dist/tasks/signatureCheck.js +12 -0
- package/dist/tasks/signatureCheck.js.map +1 -0
- package/dist/tasks/tasks.d.ts.map +1 -1
- package/dist/tasks/tasks.js +7 -2
- package/dist/tasks/tasks.js.map +1 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +3 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js +6 -2
- package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js.map +1 -1
- package/dist/tests/integration/escalationPeekBeforeConsume.integration.test.js +1 -1
- package/dist/tests/integration/escalationPeekBeforeConsume.integration.test.js.map +1 -1
- package/dist/tests/integration/imgCaptcha.integration.test.js +6 -5
- package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -1
- package/dist/tests/integration/ipValidation.integration.test.js +1 -1
- package/dist/tests/integration/ipValidation.integration.test.js.map +1 -1
- package/dist/tests/integration/powCaptcha.integration.test.js +2 -2
- package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -1
- package/dist/tests/integration/routingDecisionMachines.integration.test.js.map +1 -1
- package/dist/tests/integration/testUtils.d.ts +2 -2
- package/dist/tests/integration/testUtils.d.ts.map +1 -1
- package/dist/tests/integration/testUtils.js +1 -1
- package/dist/tests/integration/testUtils.js.map +1 -1
- package/dist/tests/integration/webBotAuthAuthenticated.integration.test.js +3 -1
- package/dist/tests/integration/webBotAuthAuthenticated.integration.test.js.map +1 -1
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +26 -10
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js +4 -4
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.js +153 -0
- package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.js.map +1 -0
- package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js +6 -2
- package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js.map +1 -1
- package/dist/tests/unit/api/errorCodeForReason.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/errorCodeForReason.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/errorCodeForReason.unit.test.js +23 -0
- package/dist/tests/unit/api/errorCodeForReason.unit.test.js.map +1 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +6 -1
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +16 -7
- package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -1
- package/dist/tests/unit/api/ipInfoMiddleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ipInfoMiddleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ipInfoMiddleware.unit.test.js +46 -0
- package/dist/tests/unit/api/ipInfoMiddleware.unit.test.js.map +1 -0
- package/dist/tests/unit/api/public.unit.test.js +45 -10
- package/dist/tests/unit/api/public.unit.test.js.map +1 -1
- package/dist/tests/unit/api/rateLimitHandler.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/rateLimitHandler.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/rateLimitHandler.unit.test.js +39 -0
- package/dist/tests/unit/api/rateLimitHandler.unit.test.js.map +1 -0
- package/dist/tests/unit/api/validateAddress.unit.test.js +41 -115
- package/dist/tests/unit/api/validateAddress.unit.test.js.map +1 -1
- package/dist/tests/unit/api/verifyMalformedToken.unit.test.js +3 -3
- package/dist/tests/unit/api/verifyMalformedToken.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +22 -18
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +25 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +25 -20
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js +31 -0
- package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.js +80 -0
- package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.js +48 -0
- package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +20 -28
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +2 -2
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.js +44 -0
- package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +78 -43
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +7 -6
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +2 -2
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/util/usageCounters.unit.test.js +20 -0
- package/dist/tests/unit/util/usageCounters.unit.test.js.map +1 -1
- package/dist/tests/unit/util.unit.test.js +7 -7
- package/dist/tests/unit/util.unit.test.js.map +1 -1
- package/dist/util/usageCounters.d.ts +1 -1
- package/dist/util/usageCounters.d.ts.map +1 -1
- package/dist/util/usageCounters.js +26 -3
- package/dist/util/usageCounters.js.map +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +15 -4
- package/dist/util.js.map +1 -1
- package/package.json +44 -43
|
@@ -1,141 +1,67 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isProsopoError } from "@prosopo/common";
|
|
2
2
|
import { validateAddress } from "@prosopo/util-crypto";
|
|
3
3
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
4
|
import { validateAddr, validateSiteKey } from "../../../api/validateAddress.js";
|
|
5
5
|
vi.mock("@prosopo/util-crypto", () => ({
|
|
6
6
|
validateAddress: vi.fn(),
|
|
7
7
|
}));
|
|
8
|
+
const address = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
|
|
9
|
+
const thrown = (fn) => {
|
|
10
|
+
try {
|
|
11
|
+
fn();
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
return err;
|
|
15
|
+
}
|
|
16
|
+
throw new Error("expected a throw");
|
|
17
|
+
};
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
vi.clearAllMocks();
|
|
20
|
+
});
|
|
8
21
|
describe("validateSiteKey", () => {
|
|
9
|
-
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
vi.clearAllMocks();
|
|
12
|
-
mockLogger = {
|
|
13
|
-
error: vi.fn(),
|
|
14
|
-
info: vi.fn(),
|
|
15
|
-
debug: vi.fn(),
|
|
16
|
-
warn: vi.fn(),
|
|
17
|
-
};
|
|
18
|
-
});
|
|
19
|
-
it("should validate site key using validateAddr", () => {
|
|
20
|
-
const siteKey = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
|
|
22
|
+
it("accepts a valid site key", () => {
|
|
21
23
|
vi.mocked(validateAddress).mockReturnValue(true);
|
|
22
|
-
expect(() => validateSiteKey(
|
|
23
|
-
expect(validateAddress).toHaveBeenCalledWith(
|
|
24
|
+
expect(() => validateSiteKey(address)).not.toThrow();
|
|
25
|
+
expect(validateAddress).toHaveBeenCalledWith(address, false, 42);
|
|
24
26
|
});
|
|
25
|
-
it("
|
|
26
|
-
const invalidSiteKey = "invalid-site-key";
|
|
27
|
+
it("rejects an invalid site key as SITE_KEY_INVALID", () => {
|
|
27
28
|
vi.mocked(validateAddress).mockReturnValue(false);
|
|
28
|
-
|
|
29
|
-
expect(
|
|
30
|
-
});
|
|
31
|
-
it("should work without logger", () => {
|
|
32
|
-
const siteKey = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
|
|
33
|
-
vi.mocked(validateAddress).mockReturnValue(true);
|
|
34
|
-
expect(() => validateSiteKey(siteKey)).not.toThrow();
|
|
35
|
-
expect(validateAddress).toHaveBeenCalledWith(siteKey, false, 42);
|
|
29
|
+
const err = thrown(() => validateSiteKey("invalid"));
|
|
30
|
+
expect(isProsopoError(err, "SITE_KEY_INVALID")).toBe(true);
|
|
36
31
|
});
|
|
37
32
|
});
|
|
38
33
|
describe("validateAddr", () => {
|
|
39
|
-
|
|
40
|
-
beforeEach(() => {
|
|
41
|
-
vi.clearAllMocks();
|
|
42
|
-
mockLogger = {
|
|
43
|
-
error: vi.fn(),
|
|
44
|
-
info: vi.fn(),
|
|
45
|
-
debug: vi.fn(),
|
|
46
|
-
warn: vi.fn(),
|
|
47
|
-
};
|
|
48
|
-
});
|
|
49
|
-
it("should validate successfully for valid address", () => {
|
|
50
|
-
const validAddress = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
|
|
34
|
+
it("accepts a valid address", () => {
|
|
51
35
|
vi.mocked(validateAddress).mockReturnValue(true);
|
|
52
|
-
expect(() => validateAddr(
|
|
53
|
-
expect(validateAddress).toHaveBeenCalledWith(validAddress, false, 42);
|
|
36
|
+
expect(() => validateAddr(address)).not.toThrow();
|
|
54
37
|
});
|
|
55
|
-
it("
|
|
56
|
-
const invalidAddress = "invalid-address";
|
|
38
|
+
it("rejects an invalid address as INVALID_REQUEST by default", () => {
|
|
57
39
|
vi.mocked(validateAddress).mockReturnValue(false);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
expect(error.context).toEqual({
|
|
65
|
-
code: 400,
|
|
66
|
-
siteKey: invalidAddress,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
40
|
+
const err = thrown(() => validateAddr("invalid"));
|
|
41
|
+
if (!isProsopoError(err, "INVALID_REQUEST"))
|
|
42
|
+
throw err;
|
|
43
|
+
expect(err.errorSite).toBe("PROV-35");
|
|
44
|
+
expect(err.context.siteKey).toBe("invalid");
|
|
45
|
+
expect(err.cause).toBeUndefined();
|
|
69
46
|
});
|
|
70
|
-
it("
|
|
71
|
-
const invalidAddress = "invalid-address";
|
|
47
|
+
it("uses the given code", () => {
|
|
72
48
|
vi.mocked(validateAddress).mockReturnValue(false);
|
|
73
|
-
expect(() => validateAddr(
|
|
74
|
-
try {
|
|
75
|
-
validateAddr(invalidAddress);
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
expect(error).toBeInstanceOf(ProsopoApiError);
|
|
79
|
-
expect(error.context).toEqual({
|
|
80
|
-
code: 400,
|
|
81
|
-
siteKey: invalidAddress,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
49
|
+
expect(isProsopoError(thrown(() => validateAddr("x", "FORBIDDEN")), "FORBIDDEN")).toBe(true);
|
|
84
50
|
});
|
|
85
|
-
it("
|
|
86
|
-
const
|
|
87
|
-
const cryptoError = new Error("Crypto validation failed");
|
|
51
|
+
it("keeps the validator's exception as the cause", () => {
|
|
52
|
+
const failure = new Error("bad checksum");
|
|
88
53
|
vi.mocked(validateAddress).mockImplementation(() => {
|
|
89
|
-
throw
|
|
54
|
+
throw failure;
|
|
90
55
|
});
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
catch (error) {
|
|
96
|
-
expect(error).toBeInstanceOf(ProsopoApiError);
|
|
97
|
-
expect(error.context).toEqual({
|
|
98
|
-
code: 400,
|
|
99
|
-
siteKey: address,
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
it("should work without logger parameter", () => {
|
|
104
|
-
const validAddress = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
|
|
105
|
-
vi.mocked(validateAddress).mockReturnValue(true);
|
|
106
|
-
expect(() => validateAddr(validAddress)).not.toThrow();
|
|
107
|
-
expect(validateAddress).toHaveBeenCalledWith(validAddress, false, 42);
|
|
56
|
+
const err = thrown(() => validateAddr("invalid"));
|
|
57
|
+
if (!isProsopoError(err))
|
|
58
|
+
throw err;
|
|
59
|
+
expect(err.cause).toBe(failure);
|
|
108
60
|
});
|
|
109
|
-
it("
|
|
110
|
-
const invalidAddress = "invalid-address";
|
|
111
|
-
const customTranslationKey = "API.INVALID_SITE_KEY";
|
|
61
|
+
it("handles an empty address", () => {
|
|
112
62
|
vi.mocked(validateAddress).mockReturnValue(false);
|
|
113
|
-
expect(() => validateAddr(
|
|
114
|
-
expect(validateAddress).toHaveBeenCalledWith(
|
|
115
|
-
});
|
|
116
|
-
it("should handle empty address string", () => {
|
|
117
|
-
const emptyAddress = "";
|
|
118
|
-
vi.mocked(validateAddress).mockReturnValue(false);
|
|
119
|
-
expect(() => validateAddr(emptyAddress, "CONTRACT.INVALID_ADDRESS", mockLogger)).toThrow(ProsopoApiError);
|
|
120
|
-
expect(validateAddress).toHaveBeenCalledWith(emptyAddress, false, 42);
|
|
121
|
-
});
|
|
122
|
-
it("should handle null address", () => {
|
|
123
|
-
const nullAddress = null;
|
|
124
|
-
vi.mocked(validateAddress).mockReturnValue(false);
|
|
125
|
-
expect(() => validateAddr(nullAddress, "CONTRACT.INVALID_ADDRESS", mockLogger)).toThrow(ProsopoApiError);
|
|
126
|
-
expect(validateAddress).toHaveBeenCalledWith(nullAddress, false, 42);
|
|
127
|
-
});
|
|
128
|
-
it("should validate hex addresses", () => {
|
|
129
|
-
const hexAddress = "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d";
|
|
130
|
-
vi.mocked(validateAddress).mockReturnValue(true);
|
|
131
|
-
expect(() => validateAddr(hexAddress, "CONTRACT.INVALID_ADDRESS", mockLogger)).not.toThrow();
|
|
132
|
-
expect(validateAddress).toHaveBeenCalledWith(hexAddress, false, 42);
|
|
133
|
-
});
|
|
134
|
-
it("should validate base58 addresses", () => {
|
|
135
|
-
const base58Address = "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty";
|
|
136
|
-
vi.mocked(validateAddress).mockReturnValue(true);
|
|
137
|
-
expect(() => validateAddr(base58Address, "CONTRACT.INVALID_ADDRESS", mockLogger)).not.toThrow();
|
|
138
|
-
expect(validateAddress).toHaveBeenCalledWith(base58Address, false, 42);
|
|
63
|
+
expect(isProsopoError(thrown(() => validateAddr("")))).toBe(true);
|
|
64
|
+
expect(validateAddress).toHaveBeenCalledWith("", false, 42);
|
|
139
65
|
});
|
|
140
66
|
});
|
|
141
67
|
//# sourceMappingURL=validateAddress.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateAddress.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/api/validateAddress.unit.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"validateAddress.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/api/validateAddress.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,11 +78,11 @@ describe("verify routes reject a malformed token with 400, not 500", () => {
|
|
|
78
78
|
["authenticated", ClientApiPaths.VerifyAuthenticatedSession],
|
|
79
79
|
];
|
|
80
80
|
for (const [name, path] of routes) {
|
|
81
|
-
it(`${name}: undecodable token -> 400
|
|
81
|
+
it(`${name}: undecodable token -> 400 INVALID_REQUEST`, async () => {
|
|
82
82
|
const { status, body } = await callRoute(path, malformedBody);
|
|
83
83
|
expect(status).toBe(400);
|
|
84
|
-
expect(body?.error?.
|
|
85
|
-
expect(body?.error?.
|
|
84
|
+
expect(body?.error?.status).toBe(400);
|
|
85
|
+
expect(body?.error?.errorId).toBe("INVALID_REQUEST:PROV-37");
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
88
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyMalformedToken.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/api/verifyMalformedToken.unit.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"verifyMalformedToken.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/api/verifyMalformedToken.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1341,7 +1341,7 @@ describe("CaptchaManager", () => {
|
|
|
1341
1341
|
});
|
|
1342
1342
|
it("should return undefined when there are no matching policies", async () => {
|
|
1343
1343
|
vi.spyOn(captchaManager, "getPrioritisedAccessPolicies").mockResolvedValue([]);
|
|
1344
|
-
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders);
|
|
1344
|
+
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders, undefined);
|
|
1345
1345
|
expect(result).toBeUndefined();
|
|
1346
1346
|
});
|
|
1347
1347
|
it("should return undefined for a Block policy that has a captchaType (captcha-type selector, not hard block)", async () => {
|
|
@@ -1350,7 +1350,7 @@ describe("CaptchaManager", () => {
|
|
|
1350
1350
|
captchaType: CaptchaType.image,
|
|
1351
1351
|
};
|
|
1352
1352
|
vi.spyOn(captchaManager, "getPrioritisedAccessPolicies").mockResolvedValue([blockWithCaptchaType]);
|
|
1353
|
-
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders);
|
|
1353
|
+
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders, undefined);
|
|
1354
1354
|
expect(result).toBeUndefined();
|
|
1355
1355
|
});
|
|
1356
1356
|
it("should return the policy for a Block policy without a captchaType (hard block)", async () => {
|
|
@@ -1359,7 +1359,7 @@ describe("CaptchaManager", () => {
|
|
|
1359
1359
|
description: "hard block",
|
|
1360
1360
|
};
|
|
1361
1361
|
vi.spyOn(captchaManager, "getPrioritisedAccessPolicies").mockResolvedValue([hardBlockPolicy]);
|
|
1362
|
-
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders);
|
|
1362
|
+
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders, undefined);
|
|
1363
1363
|
expect(result).toEqual(hardBlockPolicy);
|
|
1364
1364
|
});
|
|
1365
1365
|
it("should return undefined for a Restrict policy without captchaType (not a Block policy)", async () => {
|
|
@@ -1367,7 +1367,7 @@ describe("CaptchaManager", () => {
|
|
|
1367
1367
|
type: AccessPolicyType.Restrict,
|
|
1368
1368
|
};
|
|
1369
1369
|
vi.spyOn(captchaManager, "getPrioritisedAccessPolicies").mockResolvedValue([restrictPolicy]);
|
|
1370
|
-
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders);
|
|
1370
|
+
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders, undefined);
|
|
1371
1371
|
expect(result).toBeUndefined();
|
|
1372
1372
|
});
|
|
1373
1373
|
it("should return the policy for a Block policy with deferToVerify=true AND captchaType (verify-time hard block)", async () => {
|
|
@@ -1377,7 +1377,7 @@ describe("CaptchaManager", () => {
|
|
|
1377
1377
|
deferToVerify: true,
|
|
1378
1378
|
};
|
|
1379
1379
|
vi.spyOn(captchaManager, "getPrioritisedAccessPolicies").mockResolvedValue([deferBlock]);
|
|
1380
|
-
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders);
|
|
1380
|
+
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders, undefined);
|
|
1381
1381
|
expect(result).toEqual(deferBlock);
|
|
1382
1382
|
});
|
|
1383
1383
|
it("should return the policy for a Block policy with deferToVerify=true AND no captchaType", async () => {
|
|
@@ -1386,7 +1386,7 @@ describe("CaptchaManager", () => {
|
|
|
1386
1386
|
deferToVerify: true,
|
|
1387
1387
|
};
|
|
1388
1388
|
vi.spyOn(captchaManager, "getPrioritisedAccessPolicies").mockResolvedValue([deferBlockNoType]);
|
|
1389
|
-
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders);
|
|
1389
|
+
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders, undefined);
|
|
1390
1390
|
expect(result).toEqual(deferBlockNoType);
|
|
1391
1391
|
});
|
|
1392
1392
|
it("should return the policy for Restrict + deferToVerify=true (verify-time hard block after serving captcha)", async () => {
|
|
@@ -1397,7 +1397,7 @@ describe("CaptchaManager", () => {
|
|
|
1397
1397
|
deferToVerify: true,
|
|
1398
1398
|
};
|
|
1399
1399
|
vi.spyOn(captchaManager, "getPrioritisedAccessPolicies").mockResolvedValue([restrictDefer]);
|
|
1400
|
-
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders);
|
|
1400
|
+
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders, undefined);
|
|
1401
1401
|
expect(result).toEqual(restrictDefer);
|
|
1402
1402
|
});
|
|
1403
1403
|
it("should return undefined for Restrict without deferToVerify (routing rules are not hard blocks)", async () => {
|
|
@@ -1407,7 +1407,7 @@ describe("CaptchaManager", () => {
|
|
|
1407
1407
|
solvedImagesCount: 4,
|
|
1408
1408
|
};
|
|
1409
1409
|
vi.spyOn(captchaManager, "getPrioritisedAccessPolicies").mockResolvedValue([restrictRoute]);
|
|
1410
|
-
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders);
|
|
1410
|
+
const result = await captchaManager.checkForHardBlock({}, mockChallengeRecord, "userAccount", mockHeaders, undefined);
|
|
1411
1411
|
expect(result).toBeUndefined();
|
|
1412
1412
|
});
|
|
1413
1413
|
});
|
|
@@ -1425,39 +1425,43 @@ describe("CaptchaManager", () => {
|
|
|
1425
1425
|
isCrawler: false,
|
|
1426
1426
|
...overrides,
|
|
1427
1427
|
});
|
|
1428
|
-
const mkEnvWithIpLookup = (ipLookup) => ({
|
|
1429
|
-
config: {},
|
|
1430
|
-
ipInfoService: { lookup: ipLookup },
|
|
1431
|
-
});
|
|
1432
1428
|
it("blocks a datacenter IP at verify time when the site configures datacenter:{action:block}", async () => {
|
|
1433
|
-
const check = await captchaManager.resolveTrafficFilterCheck(
|
|
1429
|
+
const check = await captchaManager.resolveTrafficFilterCheck(undefined, { datacenter: { action: TrafficFilterAction.Block } }, ipInfoResponse({ isDatacenter: true, providerType: "hosting" }));
|
|
1434
1430
|
expect(check.isBlocked).toBe(true);
|
|
1435
1431
|
if (check.isBlocked) {
|
|
1436
1432
|
expect(check.reason).toBe(ResultReason.DATACENTER_BLOCKED);
|
|
1437
1433
|
}
|
|
1438
1434
|
});
|
|
1439
1435
|
it("does NOT block at verify time when the operator configured datacenter:{action:challenge} — challenge is a request-time concern", async () => {
|
|
1440
|
-
const check = await captchaManager.resolveTrafficFilterCheck(
|
|
1436
|
+
const check = await captchaManager.resolveTrafficFilterCheck(undefined, {
|
|
1441
1437
|
datacenter: {
|
|
1442
1438
|
action: TrafficFilterAction.Challenge,
|
|
1443
1439
|
captchaType: CaptchaType.image,
|
|
1444
1440
|
},
|
|
1445
|
-
}, "
|
|
1441
|
+
}, ipInfoResponse({ isDatacenter: true, providerType: "hosting" }));
|
|
1446
1442
|
expect(check.isBlocked).toBe(false);
|
|
1447
1443
|
});
|
|
1448
1444
|
it("applies the abuser default at verify time even when the operator did not configure it (protects unconfigured sites)", async () => {
|
|
1449
|
-
const check = await captchaManager.resolveTrafficFilterCheck(
|
|
1445
|
+
const check = await captchaManager.resolveTrafficFilterCheck(undefined, {}, ipInfoResponse({
|
|
1450
1446
|
isAbuser: true,
|
|
1451
1447
|
abuserScore: 0.9,
|
|
1452
1448
|
companyAbuserScore: 0.9,
|
|
1453
|
-
}))
|
|
1449
|
+
}));
|
|
1454
1450
|
expect(check.isBlocked).toBe(true);
|
|
1455
1451
|
if (check.isBlocked) {
|
|
1456
1452
|
expect(check.reason).toBe(ResultReason.ABUSER_BLOCKED);
|
|
1457
1453
|
}
|
|
1458
1454
|
});
|
|
1459
1455
|
it("passes when no category is active and the abuser default doesn't match (clean IP)", async () => {
|
|
1460
|
-
const check = await captchaManager.resolveTrafficFilterCheck(
|
|
1456
|
+
const check = await captchaManager.resolveTrafficFilterCheck(undefined, {}, ipInfoResponse());
|
|
1457
|
+
expect(check.isBlocked).toBe(false);
|
|
1458
|
+
});
|
|
1459
|
+
it("falls back to the record's ip info when the site sent no current ip", async () => {
|
|
1460
|
+
const check = await captchaManager.resolveTrafficFilterCheck(ipInfoResponse({ isDatacenter: true, providerType: "hosting" }), { datacenter: { action: TrafficFilterAction.Block } }, undefined);
|
|
1461
|
+
expect(check.isBlocked).toBe(true);
|
|
1462
|
+
});
|
|
1463
|
+
it("filters on the current ip info over the record's", async () => {
|
|
1464
|
+
const check = await captchaManager.resolveTrafficFilterCheck(ipInfoResponse({ isDatacenter: true, providerType: "hosting" }), { datacenter: { action: TrafficFilterAction.Block } }, ipInfoResponse());
|
|
1461
1465
|
expect(check.isBlocked).toBe(false);
|
|
1462
1466
|
});
|
|
1463
1467
|
});
|