@prosopo/provider 4.12.0 → 4.13.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 +41 -38
- package/.turbo/turbo-build$colon$tsc.log +24 -24
- package/.turbo/turbo-build.log +42 -39
- package/CHANGELOG.md +84 -0
- package/dist/api/admin/apiClearAllCountersEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiClearAllCountersEndpoint.js +1 -1
- package/dist/api/admin/apiClearAllCountersEndpoint.js.map +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.js +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js +1 -1
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetDecisionMachineEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiGetDecisionMachineEndpoint.js +1 -1
- package/dist/api/admin/apiGetDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +1 -1
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeysEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeysEndpoint.js +1 -1
- package/dist/api/admin/apiRegisterSiteKeysEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js +1 -1
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js +1 -1
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +1 -2
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.js +1 -1
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.js +1 -1
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.js.map +1 -1
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +3 -1
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js +1 -1
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +1 -2
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -1
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.js +7 -3
- 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 -4
- package/dist/api/captcha/checkSpamEmail.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts +0 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +1 -7
- 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 +8 -7
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +68 -28
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts +0 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +0 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.js +3 -0
- package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPoWCaptchaChallenge.js +3 -0
- package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +3 -0
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha.d.ts +2 -1
- package/dist/api/captcha.d.ts.map +1 -1
- package/dist/api/captcha.js +12 -15
- package/dist/api/captcha.js.map +1 -1
- package/dist/api/domainMiddleware.d.ts.map +1 -1
- package/dist/api/domainMiddleware.js +4 -0
- package/dist/api/domainMiddleware.js.map +1 -1
- package/dist/api/forwardVerify.d.ts +14 -0
- package/dist/api/forwardVerify.d.ts.map +1 -0
- package/dist/api/forwardVerify.js +54 -0
- package/dist/api/forwardVerify.js.map +1 -0
- package/dist/api/headerCheckMiddleware.d.ts.map +1 -1
- package/dist/api/headerCheckMiddleware.js +7 -4
- package/dist/api/headerCheckMiddleware.js.map +1 -1
- package/dist/api/ja4.d.ts +5 -0
- package/dist/api/ja4.d.ts.map +1 -0
- package/dist/api/ja4.js +203 -0
- package/dist/api/ja4.js.map +1 -0
- package/dist/api/ja4Middleware.d.ts.map +1 -1
- package/dist/api/ja4Middleware.js +9 -18
- package/dist/api/ja4Middleware.js.map +1 -1
- package/dist/api/metrics.d.ts +40 -0
- package/dist/api/metrics.d.ts.map +1 -0
- package/dist/api/metrics.js +260 -0
- package/dist/api/metrics.js.map +1 -0
- package/dist/api/public.d.ts.map +1 -1
- package/dist/api/public.js +4 -0
- package/dist/api/public.js.map +1 -1
- package/dist/api/startProviderApi.d.ts.map +1 -1
- package/dist/api/startProviderApi.js +3 -1
- package/dist/api/startProviderApi.js.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +85 -8
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +1 -3
- package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +3 -2
- package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +1 -2
- package/dist/cjs/api/blacklistRequestInspector.cjs +7 -3
- package/dist/cjs/api/captcha/checkSpamEmail.cjs +18 -3
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +1 -7
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +8 -7
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +70 -30
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +0 -1
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +3 -0
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +3 -0
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +3 -0
- package/dist/cjs/api/captcha.cjs +12 -15
- package/dist/cjs/api/domainMiddleware.cjs +4 -0
- package/dist/cjs/api/forwardVerify.cjs +54 -0
- package/dist/cjs/api/headerCheckMiddleware.cjs +7 -4
- package/dist/cjs/api/ja4.cjs +203 -0
- package/dist/cjs/api/ja4Middleware.cjs +11 -21
- package/dist/cjs/api/metrics.cjs +260 -0
- package/dist/cjs/api/public.cjs +4 -0
- package/dist/cjs/api/startProviderApi.cjs +3 -1
- package/dist/cjs/api/verify.cjs +83 -6
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/tasks/captchaManager.cjs +1 -2
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +20 -22
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +17 -23
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +15 -21
- package/dist/index.js +2 -1
- package/dist/tasks/captchaManager.js +1 -1
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +20 -22
- 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 +17 -23
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js +15 -21
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +5 -1
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/adminRoutes.unit.test.js +1 -0
- package/dist/tests/unit/api/adminRoutes.unit.test.js.map +1 -1
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +43 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js +62 -0
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js.map +1 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js +0 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js +0 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha.unit.test.js +31 -1
- package/dist/tests/unit/api/captcha.unit.test.js.map +1 -1
- package/dist/tests/unit/api/forwardVerify.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/forwardVerify.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/forwardVerify.unit.test.js +151 -0
- package/dist/tests/unit/api/forwardVerify.unit.test.js.map +1 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +68 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +2 -2
- package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -1
- package/dist/tests/unit/api/ja4.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ja4.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ja4.unit.test.js +233 -0
- package/dist/tests/unit/api/ja4.unit.test.js.map +1 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js +11 -8
- package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -1
- package/dist/tests/unit/api/public.unit.test.js +72 -0
- package/dist/tests/unit/api/public.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +1 -1
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/getClientList.unit.test.js +1 -1
- package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +1 -1
- package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +1 -1
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +4 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/package.json +23 -23
package/dist/cjs/api/public.cjs
CHANGED
|
@@ -5,12 +5,16 @@ const common = require("@prosopo/common");
|
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
6
|
const util = require("@prosopo/util");
|
|
7
7
|
const express = require("express");
|
|
8
|
+
const metrics = require("./metrics.cjs");
|
|
8
9
|
function publicRouter(env) {
|
|
9
10
|
const router = express.Router();
|
|
10
11
|
router.get(types.PublicApiPaths.Healthz, (req, res) => {
|
|
11
12
|
const host = env.config.host && env.config.host.length > 0 ? env.config.host : req.hostname;
|
|
12
13
|
return res.status(200).json({ ok: true, host });
|
|
13
14
|
});
|
|
15
|
+
if (metrics.metricsEnabled()) {
|
|
16
|
+
router.get(types.PublicApiPaths.Metrics, metrics.metricsHandler(env));
|
|
17
|
+
}
|
|
14
18
|
router.get(types.PublicApiPaths.GetProviderDetails, async (req, res, next) => {
|
|
15
19
|
try {
|
|
16
20
|
const db = env.getDb();
|
|
@@ -20,6 +20,7 @@ const headerCheckMiddleware = require("./headerCheckMiddleware.cjs");
|
|
|
20
20
|
const ignoreMiddleware = require("./ignoreMiddleware.cjs");
|
|
21
21
|
const ipInfoMiddleware = require("./ipInfoMiddleware.cjs");
|
|
22
22
|
const ja4Middleware = require("./ja4Middleware.cjs");
|
|
23
|
+
const metrics = require("./metrics.cjs");
|
|
23
24
|
const _public = require("./public.cjs");
|
|
24
25
|
const robotsMiddleware = require("./robotsMiddleware.cjs");
|
|
25
26
|
const verify = require("./verify.cjs");
|
|
@@ -102,8 +103,9 @@ async function startProviderApi(env, admin = false, port) {
|
|
|
102
103
|
maxAge: 86400
|
|
103
104
|
})
|
|
104
105
|
);
|
|
105
|
-
apiApp.use(express.json({ limit: "
|
|
106
|
+
apiApp.use(express.json({ limit: "1mb" }));
|
|
106
107
|
apiApp.use(_public.publicRouter(env));
|
|
108
|
+
apiApp.use(metrics.metricsMiddleware());
|
|
107
109
|
const isTestOrDevelopmentEnv = process.env.NODE_ENV === "test" || env.config.defaultEnvironment === "development";
|
|
108
110
|
if (!isTestOrDevelopmentEnv) {
|
|
109
111
|
const configRateLimits = env.config.rateLimits;
|
package/dist/cjs/api/verify.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const api = require("@prosopo/api");
|
|
3
4
|
const apiExpressRouter = require("@prosopo/api-express-router");
|
|
4
5
|
const common = require("@prosopo/common");
|
|
5
6
|
const types = require("@prosopo/types");
|
|
@@ -7,7 +8,26 @@ const utilCrypto = require("@prosopo/util-crypto");
|
|
|
7
8
|
const express = require("express");
|
|
8
9
|
const tasks = require("../tasks/tasks.cjs");
|
|
9
10
|
const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
11
|
+
const forwardVerify = require("./forwardVerify.cjs");
|
|
12
|
+
const metrics = require("./metrics.cjs");
|
|
10
13
|
const testSiteKey = require("./testSiteKey.cjs");
|
|
14
|
+
const deriveVerifySource = (body) => {
|
|
15
|
+
if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) return "maintenance";
|
|
16
|
+
try {
|
|
17
|
+
const token = body?.token;
|
|
18
|
+
if (token) {
|
|
19
|
+
const { dapp } = types.decodeProcaptchaOutput(token);
|
|
20
|
+
if (testSiteKey.isReservedTestSiteKey(dapp)) return "test_key";
|
|
21
|
+
}
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
return "real";
|
|
25
|
+
};
|
|
26
|
+
const VERIFY_PATH_TYPE = {
|
|
27
|
+
[types.ClientApiPaths.VerifyImageCaptchaSolutionDapp]: types.CaptchaType.image,
|
|
28
|
+
[types.ClientApiPaths.VerifyPowCaptchaSolution]: types.CaptchaType.pow,
|
|
29
|
+
[types.ClientApiPaths.VerifyPuzzleCaptchaSolution]: types.CaptchaType.puzzle
|
|
30
|
+
};
|
|
11
31
|
function prosopoVerifyRouter(env) {
|
|
12
32
|
const router = express.Router();
|
|
13
33
|
let userAccessRulesStorage;
|
|
@@ -20,6 +40,24 @@ function prosopoVerifyRouter(env) {
|
|
|
20
40
|
}));
|
|
21
41
|
userAccessRulesStorage = void 0;
|
|
22
42
|
}
|
|
43
|
+
router.use((req, res, next) => {
|
|
44
|
+
if (!metrics.metricsEnabled()) return next();
|
|
45
|
+
const type = VERIFY_PATH_TYPE[req.path];
|
|
46
|
+
if (!type) return next();
|
|
47
|
+
const originalJson = res.json.bind(res);
|
|
48
|
+
res.json = (body) => {
|
|
49
|
+
if (res.statusCode < 300) {
|
|
50
|
+
const verified = !!(body && typeof body === "object" && body.verified);
|
|
51
|
+
metrics.recordCaptchaVerify({
|
|
52
|
+
type,
|
|
53
|
+
verified,
|
|
54
|
+
source: deriveVerifySource(req.body)
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return originalJson(body);
|
|
58
|
+
};
|
|
59
|
+
next();
|
|
60
|
+
});
|
|
23
61
|
router.post(
|
|
24
62
|
types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
|
|
25
63
|
async (req, res, next) => {
|
|
@@ -33,7 +71,6 @@ function prosopoVerifyRouter(env) {
|
|
|
33
71
|
};
|
|
34
72
|
return res.json(verificationResponse);
|
|
35
73
|
}
|
|
36
|
-
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
37
74
|
let parsed;
|
|
38
75
|
try {
|
|
39
76
|
parsed = types.VerifySolutionBody.parse(req.body);
|
|
@@ -48,7 +85,7 @@ function prosopoVerifyRouter(env) {
|
|
|
48
85
|
}
|
|
49
86
|
const { dappSignature, token, ip, maxVerifiedTime, email } = parsed;
|
|
50
87
|
try {
|
|
51
|
-
const { user, dapp, timestamp, commitmentId } = types.decodeProcaptchaOutput(token);
|
|
88
|
+
const { user, dapp, timestamp, commitmentId, providerUrl } = types.decodeProcaptchaOutput(token);
|
|
52
89
|
const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
|
|
53
90
|
if (testVerdict !== null) {
|
|
54
91
|
const verificationResponse2 = {
|
|
@@ -57,6 +94,20 @@ function prosopoVerifyRouter(env) {
|
|
|
57
94
|
};
|
|
58
95
|
return res.json(verificationResponse2);
|
|
59
96
|
}
|
|
97
|
+
const forwarded = await forwardVerify.forwardVerifyIfNotIssuer({
|
|
98
|
+
env,
|
|
99
|
+
logger: req.logger,
|
|
100
|
+
path: types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
|
|
101
|
+
providerUrl,
|
|
102
|
+
dapp,
|
|
103
|
+
user,
|
|
104
|
+
body: parsed,
|
|
105
|
+
alreadyForwarded: req.headers[api.VERIFY_FORWARDED_HEADER] !== void 0
|
|
106
|
+
});
|
|
107
|
+
if (forwarded) {
|
|
108
|
+
return res.json(forwarded);
|
|
109
|
+
}
|
|
110
|
+
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
60
111
|
utilCrypto.validateAddress(dapp, false, 42);
|
|
61
112
|
utilCrypto.validateAddress(user, false, 42);
|
|
62
113
|
const clientRecord = await tasks$1.db.getClientRecord(dapp);
|
|
@@ -122,7 +173,6 @@ function prosopoVerifyRouter(env) {
|
|
|
122
173
|
};
|
|
123
174
|
return res.json(verificationResponse);
|
|
124
175
|
}
|
|
125
|
-
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
126
176
|
let parsed;
|
|
127
177
|
try {
|
|
128
178
|
parsed = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
|
|
@@ -137,7 +187,7 @@ function prosopoVerifyRouter(env) {
|
|
|
137
187
|
}
|
|
138
188
|
try {
|
|
139
189
|
const { token, dappSignature, ip, email } = parsed;
|
|
140
|
-
const { dapp, user, timestamp, challenge } = types.decodeProcaptchaOutput(token);
|
|
190
|
+
const { dapp, user, timestamp, challenge, providerUrl } = types.decodeProcaptchaOutput(token);
|
|
141
191
|
const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
|
|
142
192
|
if (testVerdict !== null) {
|
|
143
193
|
const verificationResponse2 = {
|
|
@@ -146,6 +196,20 @@ function prosopoVerifyRouter(env) {
|
|
|
146
196
|
};
|
|
147
197
|
return res.json(verificationResponse2);
|
|
148
198
|
}
|
|
199
|
+
const forwarded = await forwardVerify.forwardVerifyIfNotIssuer({
|
|
200
|
+
env,
|
|
201
|
+
logger: req.logger,
|
|
202
|
+
path: types.ClientApiPaths.VerifyPowCaptchaSolution,
|
|
203
|
+
providerUrl,
|
|
204
|
+
dapp,
|
|
205
|
+
user,
|
|
206
|
+
body: parsed,
|
|
207
|
+
alreadyForwarded: req.headers[api.VERIFY_FORWARDED_HEADER] !== void 0
|
|
208
|
+
});
|
|
209
|
+
if (forwarded) {
|
|
210
|
+
return res.json(forwarded);
|
|
211
|
+
}
|
|
212
|
+
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
149
213
|
utilCrypto.validateAddress(dapp, false, 42);
|
|
150
214
|
utilCrypto.validateAddress(user, false, 42);
|
|
151
215
|
const clientRecord = await tasks$1.db.getClientRecord(dapp);
|
|
@@ -217,7 +281,6 @@ function prosopoVerifyRouter(env) {
|
|
|
217
281
|
};
|
|
218
282
|
return res.json(verificationResponse);
|
|
219
283
|
}
|
|
220
|
-
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
221
284
|
let parsed;
|
|
222
285
|
try {
|
|
223
286
|
parsed = types.ServerPuzzleCaptchaVerifyRequestBody.parse(req.body);
|
|
@@ -232,7 +295,7 @@ function prosopoVerifyRouter(env) {
|
|
|
232
295
|
}
|
|
233
296
|
try {
|
|
234
297
|
const { token, dappSignature, ip, email } = parsed;
|
|
235
|
-
const { dapp, user, timestamp, challenge } = types.decodeProcaptchaOutput(token);
|
|
298
|
+
const { dapp, user, timestamp, challenge, providerUrl } = types.decodeProcaptchaOutput(token);
|
|
236
299
|
const testVerdict = testSiteKey.resolveTestSiteKeyVerdict(dapp, req.logger);
|
|
237
300
|
if (testVerdict !== null) {
|
|
238
301
|
const verificationResponse2 = {
|
|
@@ -241,6 +304,20 @@ function prosopoVerifyRouter(env) {
|
|
|
241
304
|
};
|
|
242
305
|
return res.json(verificationResponse2);
|
|
243
306
|
}
|
|
307
|
+
const forwarded = await forwardVerify.forwardVerifyIfNotIssuer({
|
|
308
|
+
env,
|
|
309
|
+
logger: req.logger,
|
|
310
|
+
path: types.ClientApiPaths.VerifyPuzzleCaptchaSolution,
|
|
311
|
+
providerUrl,
|
|
312
|
+
dapp,
|
|
313
|
+
user,
|
|
314
|
+
body: parsed,
|
|
315
|
+
alreadyForwarded: req.headers[api.VERIFY_FORWARDED_HEADER] !== void 0
|
|
316
|
+
});
|
|
317
|
+
if (forwarded) {
|
|
318
|
+
return res.json(forwarded);
|
|
319
|
+
}
|
|
320
|
+
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
244
321
|
utilCrypto.validateAddress(dapp, false, 42);
|
|
245
322
|
utilCrypto.validateAddress(user, false, 42);
|
|
246
323
|
const clientRecord = await tasks$1.db.getClientRecord(dapp);
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -34,6 +34,7 @@ exports.getIPAddressFromBigInt = util.getIPAddressFromBigInt;
|
|
|
34
34
|
exports.shuffleArray = util.shuffleArray;
|
|
35
35
|
exports.validateIpAddress = util.validateIpAddress;
|
|
36
36
|
exports.blockMiddleware = block.blockMiddleware;
|
|
37
|
+
exports.asyncHandler = captcha.asyncHandler;
|
|
37
38
|
exports.prosopoRouter = captcha.prosopoRouter;
|
|
38
39
|
exports.prosopoVerifyRouter = verify.prosopoVerifyRouter;
|
|
39
40
|
exports.DEFAULT_JA4 = ja4Middleware.DEFAULT_JA4;
|
|
@@ -8,7 +8,6 @@ const compositeIpAddress = require("../compositeIpAddress.cjs");
|
|
|
8
8
|
const enrichDnsEvent = require("./dnsEvent/enrichDnsEvent.cjs");
|
|
9
9
|
const checkSpamEmail = require("./spam/checkSpamEmail.cjs");
|
|
10
10
|
const checkTrafficFilter = require("./spam/checkTrafficFilter.cjs");
|
|
11
|
-
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
12
11
|
const findHardBlockPolicy = (accessPolicies) => {
|
|
13
12
|
return accessPolicies.find(
|
|
14
13
|
(policy) => policy.type === userAccessPolicy.AccessPolicyType.Block && (policy.deferToVerify || !policy.captchaType)
|
|
@@ -19,7 +18,7 @@ class CaptchaManager {
|
|
|
19
18
|
this.pair = pair;
|
|
20
19
|
this.db = db;
|
|
21
20
|
this.config = config;
|
|
22
|
-
this.logger = logger$1 || logger.getLogger("info",
|
|
21
|
+
this.logger = logger$1 || logger.getLogger("info", "provider:captcha-manager");
|
|
23
22
|
this.writeQueue = writeQueue ?? null;
|
|
24
23
|
}
|
|
25
24
|
/**
|
|
@@ -456,9 +456,10 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
456
456
|
return void 0;
|
|
457
457
|
}
|
|
458
458
|
async verifyImageCaptchaSolution(user, dapp, commitmentId, env, maxVerifiedTime, ip, disallowWebView, contextAwareEnabled = false, userAccessRulesStorage, email, spamEmailDomainCheckingEnabled = false, spamFilter, trafficFilter, storeMetadata = false) {
|
|
459
|
+
const logger = this.logger.with({ commitmentId, dapp });
|
|
459
460
|
const solution = await (commitmentId ? this.getDappUserCommitmentById(commitmentId) : this.getDappUserCommitmentByAccount(user, dapp));
|
|
460
461
|
if (!solution) {
|
|
461
|
-
|
|
462
|
+
logger.debug(() => ({
|
|
462
463
|
msg: "Not verified - no solution found"
|
|
463
464
|
}));
|
|
464
465
|
return {
|
|
@@ -484,7 +485,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
484
485
|
const submittedAt = solution.submittedAtTimestamp;
|
|
485
486
|
const timeSinceCompletion = submittedAt instanceof Date ? currentTime - submittedAt.getTime() : Number.POSITIVE_INFINITY;
|
|
486
487
|
if (timeSinceCompletion > maxVerifiedTime) {
|
|
487
|
-
|
|
488
|
+
logger.debug(() => ({
|
|
488
489
|
msg: "Not verified - timed out"
|
|
489
490
|
}));
|
|
490
491
|
return {
|
|
@@ -506,7 +507,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
506
507
|
solution.ipInfo?.isValid ? solution.ipInfo.asnNumber : void 0
|
|
507
508
|
);
|
|
508
509
|
if (blockPolicy) {
|
|
509
|
-
|
|
510
|
+
logger.info(() => ({
|
|
510
511
|
msg: "User blocked by access policy in server image verification",
|
|
511
512
|
data: {
|
|
512
513
|
userAccount: solution.userAccount,
|
|
@@ -521,8 +522,8 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
521
522
|
failStatus = types.ResultReason.ACCESS_POLICY_BLOCK;
|
|
522
523
|
}
|
|
523
524
|
} catch (error) {
|
|
524
|
-
|
|
525
|
-
msg: "Failed to check user access policies in server
|
|
525
|
+
logger.warn(() => ({
|
|
526
|
+
msg: "Failed to check user access policies in server image verification",
|
|
526
527
|
error
|
|
527
528
|
}));
|
|
528
529
|
}
|
|
@@ -532,9 +533,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
532
533
|
const isSpam = await this.checkSpamEmail(email);
|
|
533
534
|
if (isSpam) {
|
|
534
535
|
const emailDomain = email.split("@")[1] || "unknown";
|
|
535
|
-
|
|
536
|
+
logger.info(() => ({
|
|
536
537
|
msg: "Spam email domain detected in server image verification",
|
|
537
|
-
data: {
|
|
538
|
+
data: { emailDomain }
|
|
538
539
|
}));
|
|
539
540
|
commitmentUpdates.result = {
|
|
540
541
|
status: types.CaptchaStatus.disapproved,
|
|
@@ -543,7 +544,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
543
544
|
failStatus = types.ResultReason.SPAM_EMAIL_DOMAIN;
|
|
544
545
|
}
|
|
545
546
|
} catch (error) {
|
|
546
|
-
|
|
547
|
+
logger.warn(() => ({
|
|
547
548
|
msg: "Failed to check spam email domain in server image verification",
|
|
548
549
|
error
|
|
549
550
|
}));
|
|
@@ -552,9 +553,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
552
553
|
if (!failStatus && spamFilter?.enabled && spamFilter.emailRules?.enabled && email) {
|
|
553
554
|
const result = evaluateEmailSpamRules.evaluateEmailSpamRules(email, spamFilter.emailRules);
|
|
554
555
|
if (result.isSpam) {
|
|
555
|
-
|
|
556
|
+
logger.info(() => ({
|
|
556
557
|
msg: "Spam filter rejected email in image verification",
|
|
557
|
-
data: {
|
|
558
|
+
data: { reason: result.reason }
|
|
558
559
|
}));
|
|
559
560
|
commitmentUpdates.result = {
|
|
560
561
|
status: types.CaptchaStatus.disapproved,
|
|
@@ -578,11 +579,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
578
579
|
enrichedDnsEvent
|
|
579
580
|
);
|
|
580
581
|
if (check.isBlocked) {
|
|
581
|
-
|
|
582
|
+
logger.info(() => ({
|
|
582
583
|
msg: "Traffic filter rejected request",
|
|
583
584
|
data: {
|
|
584
|
-
commitmentId,
|
|
585
|
-
dapp,
|
|
586
585
|
ip,
|
|
587
586
|
reason: check.reason,
|
|
588
587
|
dnsPeerIp: enrichedDnsEvent?.peerIp,
|
|
@@ -611,13 +610,13 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
611
610
|
const ipValidation = await util.deepValidateIpAddress(
|
|
612
611
|
ip,
|
|
613
612
|
solutionIpAddress,
|
|
614
|
-
|
|
613
|
+
logger,
|
|
615
614
|
env.ipInfoService,
|
|
616
615
|
ipValidationRules,
|
|
617
616
|
enrichedDnsEvent?.peerIp
|
|
618
617
|
);
|
|
619
618
|
if (!ipValidation.isValid) {
|
|
620
|
-
|
|
619
|
+
logger.error(() => ({
|
|
621
620
|
msg: "IP validation failed for image captcha",
|
|
622
621
|
data: {
|
|
623
622
|
ip,
|
|
@@ -658,7 +657,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
658
657
|
};
|
|
659
658
|
}
|
|
660
659
|
score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
|
|
661
|
-
|
|
660
|
+
logger.info(() => ({
|
|
662
661
|
data: {
|
|
663
662
|
scoreComponents: sessionRecord?.scoreComponents,
|
|
664
663
|
score,
|
|
@@ -667,7 +666,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
667
666
|
}
|
|
668
667
|
}));
|
|
669
668
|
if (!failStatus && disallowWebView === true && (sessionRecord.webView === true || (sessionRecord.scoreComponents.webView || 0) > 0)) {
|
|
670
|
-
|
|
669
|
+
logger.info(() => ({
|
|
671
670
|
msg: "Disallowing webview access - user not verified"
|
|
672
671
|
}));
|
|
673
672
|
commitmentUpdates.result = {
|
|
@@ -679,7 +678,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
679
678
|
failureStatus = types.ResultReason.DISALLOWED_WEBVIEW;
|
|
680
679
|
}
|
|
681
680
|
if (contextAwareEnabled && sessionRecord.reason === types.FrictionlessReason.CONTEXT_AWARE_VALIDATION_FAILED) {
|
|
682
|
-
|
|
681
|
+
logger.info(() => ({
|
|
683
682
|
msg: "Context aware validation failed"
|
|
684
683
|
}));
|
|
685
684
|
}
|
|
@@ -708,14 +707,13 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
708
707
|
try {
|
|
709
708
|
const decision = await this.decisionMachineRunner.decide(
|
|
710
709
|
decisionInput,
|
|
711
|
-
|
|
710
|
+
logger
|
|
712
711
|
);
|
|
713
712
|
if (decision.decision === types.DecisionMachineDecision.Deny) {
|
|
714
713
|
const dmReason = decision.reason || types.ResultReason.CAPTCHA_DECISION_MACHINE_DENIED;
|
|
715
|
-
|
|
714
|
+
logger.info(() => ({
|
|
716
715
|
msg: "Decision machine denied user verification",
|
|
717
716
|
data: {
|
|
718
|
-
commitmentId,
|
|
719
717
|
reason: decision.reason
|
|
720
718
|
}
|
|
721
719
|
}));
|
|
@@ -727,7 +725,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
727
725
|
failureStatus = dmReason;
|
|
728
726
|
}
|
|
729
727
|
} catch (error) {
|
|
730
|
-
|
|
728
|
+
logger.error(() => ({
|
|
731
729
|
msg: "Failed to process decision machine",
|
|
732
730
|
err: error
|
|
733
731
|
}));
|
|
@@ -363,9 +363,10 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
363
363
|
verified: false,
|
|
364
364
|
reason
|
|
365
365
|
});
|
|
366
|
+
const logger = this.logger.with({ challenge, dappAccount });
|
|
366
367
|
const challengeRecord = await this.db.getPowCaptchaRecordByChallenge(challenge);
|
|
367
368
|
if (!challengeRecord) {
|
|
368
|
-
|
|
369
|
+
logger.debug(() => ({
|
|
369
370
|
msg: `No record of this challenge: ${challenge}`
|
|
370
371
|
}));
|
|
371
372
|
return notVerified("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND");
|
|
@@ -417,12 +418,10 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
417
418
|
challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.asnNumber : void 0
|
|
418
419
|
);
|
|
419
420
|
if (blockPolicy) {
|
|
420
|
-
|
|
421
|
+
logger.info(() => ({
|
|
421
422
|
msg: "User blocked by access policy in server PoW verification",
|
|
422
423
|
data: {
|
|
423
|
-
challenge,
|
|
424
424
|
userAccount: challengeRecord.userAccount,
|
|
425
|
-
dappAccount,
|
|
426
425
|
policy: blockPolicy
|
|
427
426
|
}
|
|
428
427
|
}));
|
|
@@ -433,7 +432,7 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
433
432
|
failReason = "API.ACCESS_POLICY_BLOCK";
|
|
434
433
|
}
|
|
435
434
|
} catch (error) {
|
|
436
|
-
|
|
435
|
+
logger.warn(() => ({
|
|
437
436
|
msg: "Failed to check user access policies in server PoW verification",
|
|
438
437
|
error
|
|
439
438
|
}));
|
|
@@ -444,9 +443,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
444
443
|
const isSpam = await this.checkSpamEmail(email);
|
|
445
444
|
if (isSpam) {
|
|
446
445
|
const emailDomain = email.split("@")[1] || "unknown";
|
|
447
|
-
|
|
446
|
+
logger.info(() => ({
|
|
448
447
|
msg: "Spam email domain detected in server PoW verification",
|
|
449
|
-
data: {
|
|
448
|
+
data: { emailDomain }
|
|
450
449
|
}));
|
|
451
450
|
failResult = {
|
|
452
451
|
status: types.CaptchaStatus.disapproved,
|
|
@@ -455,7 +454,7 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
455
454
|
failReason = "API.SPAM_EMAIL_DOMAIN";
|
|
456
455
|
}
|
|
457
456
|
} catch (error) {
|
|
458
|
-
|
|
457
|
+
logger.warn(() => ({
|
|
459
458
|
msg: "Failed to check spam email domain in server PoW verification",
|
|
460
459
|
error
|
|
461
460
|
}));
|
|
@@ -464,9 +463,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
464
463
|
if (!failResult && spamFilter?.enabled && spamFilter.emailRules?.enabled && email) {
|
|
465
464
|
const result = evaluateEmailSpamRules.evaluateEmailSpamRules(email, spamFilter.emailRules);
|
|
466
465
|
if (result.isSpam) {
|
|
467
|
-
|
|
466
|
+
logger.info(() => ({
|
|
468
467
|
msg: "Spam filter rejected email in PoW verification",
|
|
469
|
-
data: {
|
|
468
|
+
data: { reason: result.reason }
|
|
470
469
|
}));
|
|
471
470
|
failResult = {
|
|
472
471
|
status: types.CaptchaStatus.disapproved,
|
|
@@ -490,11 +489,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
490
489
|
enrichedDnsEvent
|
|
491
490
|
);
|
|
492
491
|
if (check.isBlocked) {
|
|
493
|
-
|
|
492
|
+
logger.info(() => ({
|
|
494
493
|
msg: "Traffic filter rejected request in PoW verification",
|
|
495
494
|
data: {
|
|
496
|
-
challenge,
|
|
497
|
-
dappAccount,
|
|
498
495
|
ip,
|
|
499
496
|
reason: check.reason,
|
|
500
497
|
dnsPeerIp: enrichedDnsEvent?.peerIp,
|
|
@@ -525,13 +522,13 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
525
522
|
const ipValidation = await util$2.deepValidateIpAddress(
|
|
526
523
|
ip,
|
|
527
524
|
challengeIpAddress,
|
|
528
|
-
|
|
525
|
+
logger,
|
|
529
526
|
env.ipInfoService,
|
|
530
527
|
ipValidationRules,
|
|
531
528
|
enrichedDnsEvent?.peerIp
|
|
532
529
|
);
|
|
533
530
|
if (!ipValidation.isValid) {
|
|
534
|
-
|
|
531
|
+
logger.error(() => ({
|
|
535
532
|
msg: "IP validation failed for PoW captcha",
|
|
536
533
|
data: {
|
|
537
534
|
ip,
|
|
@@ -561,7 +558,7 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
561
558
|
};
|
|
562
559
|
}
|
|
563
560
|
score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
|
|
564
|
-
|
|
561
|
+
logger.info(() => ({
|
|
565
562
|
data: {
|
|
566
563
|
scoreComponents: { ...sessionRecord?.scoreComponents || {} },
|
|
567
564
|
score,
|
|
@@ -596,15 +593,13 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
596
593
|
};
|
|
597
594
|
const decision = await this.decisionMachineRunner.decide(
|
|
598
595
|
decisionInput,
|
|
599
|
-
|
|
596
|
+
logger
|
|
600
597
|
);
|
|
601
598
|
if (decision.decision === types.DecisionMachineDecision.Deny) {
|
|
602
|
-
|
|
599
|
+
logger.info(() => ({
|
|
603
600
|
msg: "Decision machine denied PoW captcha in server verification",
|
|
604
601
|
data: {
|
|
605
|
-
challenge,
|
|
606
602
|
userAccount: challengeRecord.userAccount,
|
|
607
|
-
dappAccount,
|
|
608
603
|
reason: decision.reason,
|
|
609
604
|
score: decision.score,
|
|
610
605
|
tags: decision.tags
|
|
@@ -617,10 +612,9 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
617
612
|
};
|
|
618
613
|
failReason = dmReason;
|
|
619
614
|
} else {
|
|
620
|
-
|
|
615
|
+
logger.debug(() => ({
|
|
621
616
|
msg: "Decision machine allowed PoW captcha",
|
|
622
617
|
data: {
|
|
623
|
-
challenge,
|
|
624
618
|
reason: decision.reason,
|
|
625
619
|
score: decision.score,
|
|
626
620
|
tags: decision.tags
|
|
@@ -628,7 +622,7 @@ class PowCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
628
622
|
}));
|
|
629
623
|
}
|
|
630
624
|
} catch (error) {
|
|
631
|
-
|
|
625
|
+
logger.error(() => ({
|
|
632
626
|
msg: "Failed to run decision machine in server PoW verification",
|
|
633
627
|
err: error
|
|
634
628
|
}));
|
|
@@ -282,9 +282,10 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
282
282
|
*/
|
|
283
283
|
async serverVerifyPuzzleCaptchaSolution(dappAccount, challenge, timeout, env, ip, userAccessRulesStorage, email, spamEmailDomainCheckingEnabled = false, trafficFilter, storeMetadata = false) {
|
|
284
284
|
const notVerifiedResponse = { verified: false };
|
|
285
|
+
const logger = this.logger.with({ challenge, dappAccount });
|
|
285
286
|
const challengeRecord = await this.db.getPuzzleCaptchaRecordByChallenge(challenge);
|
|
286
287
|
if (!challengeRecord) {
|
|
287
|
-
|
|
288
|
+
logger.debug(() => ({
|
|
288
289
|
msg: `No record of this challenge: ${challenge}`
|
|
289
290
|
}));
|
|
290
291
|
return notVerifiedResponse;
|
|
@@ -342,12 +343,10 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
342
343
|
challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.asnNumber : void 0
|
|
343
344
|
);
|
|
344
345
|
if (blockPolicy) {
|
|
345
|
-
|
|
346
|
+
logger.info(() => ({
|
|
346
347
|
msg: "User blocked by access policy in server puzzle verification",
|
|
347
348
|
data: {
|
|
348
|
-
challenge,
|
|
349
349
|
userAccount: challengeRecord.userAccount,
|
|
350
|
-
dappAccount,
|
|
351
350
|
policy: blockPolicy
|
|
352
351
|
}
|
|
353
352
|
}));
|
|
@@ -367,7 +366,7 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
367
366
|
return notVerifiedResponse;
|
|
368
367
|
}
|
|
369
368
|
} catch (error) {
|
|
370
|
-
|
|
369
|
+
logger.warn(() => ({
|
|
371
370
|
msg: "Failed to check user access policies in server puzzle verification",
|
|
372
371
|
error
|
|
373
372
|
}));
|
|
@@ -378,9 +377,9 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
378
377
|
const isSpam = await this.checkSpamEmail(email);
|
|
379
378
|
if (isSpam) {
|
|
380
379
|
const emailDomain = email.split("@")[1] || "unknown";
|
|
381
|
-
|
|
380
|
+
logger.info(() => ({
|
|
382
381
|
msg: "Spam email domain detected in server puzzle verification",
|
|
383
|
-
data: {
|
|
382
|
+
data: { emailDomain }
|
|
384
383
|
}));
|
|
385
384
|
await this.db.updatePuzzleCaptchaRecord(challengeRecord.challenge, {
|
|
386
385
|
result: {
|
|
@@ -391,7 +390,7 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
391
390
|
return notVerifiedResponse;
|
|
392
391
|
}
|
|
393
392
|
} catch (error) {
|
|
394
|
-
|
|
393
|
+
logger.warn(() => ({
|
|
395
394
|
msg: "Failed to check spam email domain in server puzzle verification",
|
|
396
395
|
error
|
|
397
396
|
}));
|
|
@@ -412,11 +411,9 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
412
411
|
enrichedDnsEvent
|
|
413
412
|
);
|
|
414
413
|
if (check.isBlocked) {
|
|
415
|
-
|
|
414
|
+
logger.info(() => ({
|
|
416
415
|
msg: "Traffic filter rejected request in puzzle verification",
|
|
417
416
|
data: {
|
|
418
|
-
challenge,
|
|
419
|
-
dappAccount,
|
|
420
417
|
ip,
|
|
421
418
|
reason: check.reason,
|
|
422
419
|
dnsPeerIp: enrichedDnsEvent?.peerIp,
|
|
@@ -460,13 +457,13 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
460
457
|
const ipValidation = await util$2.deepValidateIpAddress(
|
|
461
458
|
ip,
|
|
462
459
|
challengeIpAddress,
|
|
463
|
-
|
|
460
|
+
logger,
|
|
464
461
|
env.ipInfoService,
|
|
465
462
|
ipValidationRules,
|
|
466
463
|
enrichedDnsEvent?.peerIp
|
|
467
464
|
);
|
|
468
465
|
if (!ipValidation.isValid) {
|
|
469
|
-
|
|
466
|
+
logger.error(() => ({
|
|
470
467
|
msg: "IP validation failed for puzzle captcha",
|
|
471
468
|
data: {
|
|
472
469
|
ip,
|
|
@@ -505,7 +502,7 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
505
502
|
};
|
|
506
503
|
}
|
|
507
504
|
score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
|
|
508
|
-
|
|
505
|
+
logger.info(() => ({
|
|
509
506
|
data: {
|
|
510
507
|
scoreComponents: { ...sessionRecord?.scoreComponents || {} },
|
|
511
508
|
score,
|
|
@@ -539,15 +536,13 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
539
536
|
};
|
|
540
537
|
const decision = await this.decisionMachineRunner.decide(
|
|
541
538
|
decisionInput,
|
|
542
|
-
|
|
539
|
+
logger
|
|
543
540
|
);
|
|
544
541
|
if (decision.decision === types.DecisionMachineDecision.Deny) {
|
|
545
|
-
|
|
542
|
+
logger.info(() => ({
|
|
546
543
|
msg: "Decision machine denied puzzle captcha in server verification",
|
|
547
544
|
data: {
|
|
548
|
-
challenge,
|
|
549
545
|
userAccount: challengeRecord.userAccount,
|
|
550
|
-
dappAccount,
|
|
551
546
|
reason: decision.reason,
|
|
552
547
|
score: decision.score,
|
|
553
548
|
tags: decision.tags
|
|
@@ -568,17 +563,16 @@ class PuzzleCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
568
563
|
}
|
|
569
564
|
return notVerifiedResponse;
|
|
570
565
|
}
|
|
571
|
-
|
|
566
|
+
logger.debug(() => ({
|
|
572
567
|
msg: "Decision machine allowed puzzle captcha",
|
|
573
568
|
data: {
|
|
574
|
-
challenge,
|
|
575
569
|
reason: decision.reason,
|
|
576
570
|
score: decision.score,
|
|
577
571
|
tags: decision.tags
|
|
578
572
|
}
|
|
579
573
|
}));
|
|
580
574
|
} catch (error) {
|
|
581
|
-
|
|
575
|
+
logger.error(() => ({
|
|
582
576
|
msg: "Failed to run decision machine in server puzzle verification",
|
|
583
577
|
err: error
|
|
584
578
|
}));
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import "./tasks/index.js";
|
|
|
2
2
|
import { updateSpamEmailDomains } from "./tasks/spam/updateSpamEmailDomains.js";
|
|
3
3
|
import { checkIfTaskIsRunning, deepValidateIpAddress, encodeStringAddress, evaluateIpValidationRules, getIPAddress, getIPAddressFromBigInt, shuffleArray, validateIpAddress } from "./util.js";
|
|
4
4
|
import { blockMiddleware } from "./api/block.js";
|
|
5
|
-
import { prosopoRouter } from "./api/captcha.js";
|
|
5
|
+
import { asyncHandler, prosopoRouter } from "./api/captcha.js";
|
|
6
6
|
import { prosopoVerifyRouter } from "./api/verify.js";
|
|
7
7
|
import { DEFAULT_JA4, getJA4, ja4Middleware } from "./api/ja4Middleware.js";
|
|
8
8
|
import { publicRouter } from "./api/public.js";
|
|
@@ -27,6 +27,7 @@ export {
|
|
|
27
27
|
DEFAULT_JA4,
|
|
28
28
|
FrictionlessReason,
|
|
29
29
|
Tasks,
|
|
30
|
+
asyncHandler,
|
|
30
31
|
blockMiddleware,
|
|
31
32
|
checkIfTaskIsRunning,
|
|
32
33
|
compareIPs,
|