@prosopo/provider 2.5.3 → 2.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/CHANGELOG.md +43 -0
- package/dist/api/captcha.d.ts.map +1 -1
- package/dist/api/captcha.js +1 -1
- package/dist/api/captcha.js.map +1 -1
- package/dist/api/ja4Middleware.d.ts +6 -0
- package/dist/api/ja4Middleware.d.ts.map +1 -1
- package/dist/api/ja4Middleware.js +7 -7
- package/dist/api/ja4Middleware.js.map +1 -1
- package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +32 -0
- package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +25 -0
- package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +32 -0
- package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +32 -0
- package/dist/cjs/api/admin/createApiAdminRoutesProvider.cjs +10 -0
- package/dist/cjs/api/authMiddleware.cjs +81 -0
- package/dist/cjs/api/blacklistRequestInspector.cjs +73 -0
- package/dist/cjs/api/block.cjs +24 -0
- package/dist/cjs/api/captcha.cjs +482 -0
- package/dist/cjs/api/domainMiddleware.cjs +89 -0
- package/dist/cjs/api/headerCheckMiddleware.cjs +29 -0
- package/dist/cjs/api/ignoreMiddleware.cjs +14 -0
- package/dist/cjs/api/ja4Middleware.cjs +73 -0
- package/dist/cjs/api/public.cjs +27 -0
- package/dist/cjs/api/requestLoggerMiddleware.cjs +14 -0
- package/dist/cjs/api/robotsMiddleware.cjs +12 -0
- package/dist/cjs/api/validateAddress.cjs +19 -0
- package/dist/cjs/api/verify.cjs +138 -0
- package/dist/cjs/index.cjs +41 -0
- package/dist/cjs/rules/lang.cjs +16 -0
- package/dist/cjs/schedulers/captchaScheduler.cjs +31 -0
- package/dist/cjs/schedulers/getClientList.cjs +29 -0
- package/dist/cjs/tasks/captchaManager.cjs +90 -0
- package/dist/cjs/tasks/client/clientTasks.cjs +281 -0
- package/dist/cjs/tasks/dataset/datasetTasks.cjs +30 -0
- package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +34 -0
- package/dist/cjs/tasks/detection/decodePayload.cjs +475 -0
- package/dist/cjs/tasks/detection/getBotScore.cjs +13 -0
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +121 -0
- package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +11 -0
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +366 -0
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +25 -0
- package/dist/cjs/tasks/index.cjs +4 -0
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +155 -0
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +26 -0
- package/dist/cjs/tasks/tasks.cjs +51 -0
- package/dist/cjs/util.cjs +58 -0
- package/dist/schedulers/captchaScheduler.d.ts +1 -1
- package/dist/schedulers/captchaScheduler.d.ts.map +1 -1
- package/dist/schedulers/captchaScheduler.js +1 -7
- package/dist/schedulers/captchaScheduler.js.map +1 -1
- package/dist/schedulers/getClientList.d.ts +1 -1
- package/dist/schedulers/getClientList.d.ts.map +1 -1
- package/dist/schedulers/getClientList.js +1 -7
- package/dist/schedulers/getClientList.js.map +1 -1
- package/dist/tasks/client/clientTasks.d.ts +5 -2
- package/dist/tasks/client/clientTasks.d.ts.map +1 -1
- package/dist/tasks/client/clientTasks.js +55 -9
- package/dist/tasks/client/clientTasks.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +1 -0
- package/dist/tasks/frictionless/frictionlessTasks.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 +13 -3
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js +57 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +2 -2
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +1 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +11 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +2 -2
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +2 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
- package/package.json +19 -18
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const apiExpressRouter = require("@prosopo/api-express-router");
|
|
4
|
+
const common = require("@prosopo/common");
|
|
5
|
+
const types = require("@prosopo/types");
|
|
6
|
+
const util = require("@prosopo/util");
|
|
7
|
+
const express = require("express");
|
|
8
|
+
const tasks = require("../tasks/tasks.cjs");
|
|
9
|
+
function publicRouter(env) {
|
|
10
|
+
const router = express.Router();
|
|
11
|
+
const tasks$1 = new tasks.Tasks(env);
|
|
12
|
+
router.get(types.PublicApiPaths.GetProviderDetails, async (req, res, next) => {
|
|
13
|
+
try {
|
|
14
|
+
return res.json({ version: util.version, ...{ message: "Provider online" } });
|
|
15
|
+
} catch (err) {
|
|
16
|
+
req.logger.error({ err, params: req.params });
|
|
17
|
+
return next(
|
|
18
|
+
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
19
|
+
context: { code: 500 }
|
|
20
|
+
})
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
router.use(apiExpressRouter.handleErrors);
|
|
25
|
+
return router;
|
|
26
|
+
}
|
|
27
|
+
exports.publicRouter = publicRouter;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const common = require("@prosopo/common");
|
|
4
|
+
const uuid = require("uuid");
|
|
5
|
+
function requestLoggerMiddleware(env) {
|
|
6
|
+
return (req, res, next) => {
|
|
7
|
+
const requestId = req.headers["x-request-id"] || `e-${uuid.v4()}`;
|
|
8
|
+
const logger = common.getLogger(env.config.logLevel, "request-logger", requestId);
|
|
9
|
+
req.logger = logger;
|
|
10
|
+
req.requestId = requestId;
|
|
11
|
+
next();
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
exports.requestLoggerMiddleware = requestLoggerMiddleware;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
function robotsMiddleware() {
|
|
4
|
+
return (_req, res, next) => {
|
|
5
|
+
res.setHeader("Strict-Transport-Security", "max-age=31536000;");
|
|
6
|
+
res.setHeader("X-XSS-Protection", "1; mode=block");
|
|
7
|
+
res.setHeader("X-Frame-Options", "DENY");
|
|
8
|
+
res.setHeader("X-Robots-Tag", "none");
|
|
9
|
+
next();
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
exports.robotsMiddleware = robotsMiddleware;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const address = require("@polkadot/util-crypto/address");
|
|
4
|
+
const common = require("@prosopo/common");
|
|
5
|
+
const validiateSiteKey = (siteKey, logger) => {
|
|
6
|
+
return validateAddr(siteKey, "API.INVALID_SITE_KEY", logger);
|
|
7
|
+
};
|
|
8
|
+
const validateAddr = (address$1, translationKey = "CONTRACT.INVALID_ADDRESS", logger) => {
|
|
9
|
+
try {
|
|
10
|
+
return address.validateAddress(address$1, false, 42);
|
|
11
|
+
} catch (err) {
|
|
12
|
+
throw new common.ProsopoApiError(translationKey, {
|
|
13
|
+
context: { code: 400, error: err, siteKey: address$1 },
|
|
14
|
+
logger
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
exports.validateAddr = validateAddr;
|
|
19
|
+
exports.validiateSiteKey = validiateSiteKey;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const address = require("@polkadot/util-crypto/address");
|
|
4
|
+
const apiExpressRouter = require("@prosopo/api-express-router");
|
|
5
|
+
const common = require("@prosopo/common");
|
|
6
|
+
const types = require("@prosopo/types");
|
|
7
|
+
const express = require("express");
|
|
8
|
+
const tasks = require("../tasks/tasks.cjs");
|
|
9
|
+
const authMiddleware = require("./authMiddleware.cjs");
|
|
10
|
+
function prosopoVerifyRouter(env) {
|
|
11
|
+
const router = express.Router();
|
|
12
|
+
const tasks$1 = new tasks.Tasks(env);
|
|
13
|
+
router.post(
|
|
14
|
+
types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
|
|
15
|
+
async (req, res, next) => {
|
|
16
|
+
let parsed;
|
|
17
|
+
try {
|
|
18
|
+
parsed = types.VerifySolutionBody.parse(req.body);
|
|
19
|
+
} catch (err) {
|
|
20
|
+
return next(
|
|
21
|
+
new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
|
|
22
|
+
context: { code: 400, error: err, body: req.body },
|
|
23
|
+
i18n: req.i18n,
|
|
24
|
+
logger: req.logger
|
|
25
|
+
})
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
const { dappSignature, token } = parsed;
|
|
29
|
+
try {
|
|
30
|
+
const { user, dapp, timestamp, commitmentId } = types.decodeProcaptchaOutput(token);
|
|
31
|
+
address.validateAddress(dapp, false, 42);
|
|
32
|
+
address.validateAddress(user, false, 42);
|
|
33
|
+
const clientRecord = await tasks$1.db.getClientRecord(dapp);
|
|
34
|
+
if (!clientRecord) {
|
|
35
|
+
return next(
|
|
36
|
+
new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
|
|
37
|
+
context: { code: 400, siteKey: dapp, user },
|
|
38
|
+
i18n: req.i18n,
|
|
39
|
+
logger: req.logger
|
|
40
|
+
})
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
const keyPair = env.keyring.addFromAddress(dapp);
|
|
44
|
+
authMiddleware.verifySignature(dappSignature, timestamp.toString(), keyPair);
|
|
45
|
+
const response = await tasks$1.imgCaptchaManager.verifyImageCaptchaSolution(
|
|
46
|
+
user,
|
|
47
|
+
dapp,
|
|
48
|
+
commitmentId,
|
|
49
|
+
parsed.maxVerifiedTime
|
|
50
|
+
);
|
|
51
|
+
req.logger.debug(response);
|
|
52
|
+
const verificationResponse = tasks$1.imgCaptchaManager.getVerificationResponse(
|
|
53
|
+
response[types.ApiParams.verified],
|
|
54
|
+
clientRecord,
|
|
55
|
+
req.i18n.t,
|
|
56
|
+
response[types.ApiParams.score],
|
|
57
|
+
response[types.ApiParams.commitmentId]
|
|
58
|
+
);
|
|
59
|
+
res.json(verificationResponse);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
req.logger.error({ err, body: req.body });
|
|
62
|
+
return next(
|
|
63
|
+
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
64
|
+
context: { code: 500, siteKey: req.body.dapp, user: req.body.user },
|
|
65
|
+
i18n: req.i18n,
|
|
66
|
+
logger: req.logger
|
|
67
|
+
})
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
router.post(
|
|
73
|
+
types.ClientApiPaths.VerifyPowCaptchaSolution,
|
|
74
|
+
async (req, res, next) => {
|
|
75
|
+
let parsed;
|
|
76
|
+
try {
|
|
77
|
+
parsed = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
|
|
78
|
+
} catch (err) {
|
|
79
|
+
return next(
|
|
80
|
+
new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
|
|
81
|
+
context: { code: 400, error: err, body: req.body },
|
|
82
|
+
i18n: req.i18n,
|
|
83
|
+
logger: req.logger
|
|
84
|
+
})
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const { token, dappSignature, verifiedTimeout } = parsed;
|
|
89
|
+
const { dapp, user, timestamp, challenge } = types.decodeProcaptchaOutput(token);
|
|
90
|
+
address.validateAddress(dapp, false, 42);
|
|
91
|
+
address.validateAddress(user, false, 42);
|
|
92
|
+
const clientRecord = await tasks$1.db.getClientRecord(dapp);
|
|
93
|
+
if (!clientRecord) {
|
|
94
|
+
return next(
|
|
95
|
+
new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
|
|
96
|
+
context: { code: 400, siteKey: dapp },
|
|
97
|
+
i18n: req.i18n,
|
|
98
|
+
logger: req.logger
|
|
99
|
+
})
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
if (!challenge) {
|
|
103
|
+
const unverifiedResponse = {
|
|
104
|
+
status: req.i18n.t("API.USER_NOT_VERIFIED"),
|
|
105
|
+
[types.ApiParams.verified]: false
|
|
106
|
+
};
|
|
107
|
+
return res.json(unverifiedResponse);
|
|
108
|
+
}
|
|
109
|
+
const dappPair = env.keyring.addFromAddress(dapp);
|
|
110
|
+
authMiddleware.verifySignature(dappSignature, timestamp.toString(), dappPair);
|
|
111
|
+
const { verified, score } = await tasks$1.powCaptchaManager.serverVerifyPowCaptchaSolution(
|
|
112
|
+
dapp,
|
|
113
|
+
challenge,
|
|
114
|
+
verifiedTimeout
|
|
115
|
+
);
|
|
116
|
+
const verificationResponse = tasks$1.powCaptchaManager.getVerificationResponse(
|
|
117
|
+
verified,
|
|
118
|
+
clientRecord,
|
|
119
|
+
req.i18n.t,
|
|
120
|
+
score
|
|
121
|
+
);
|
|
122
|
+
return res.json(verificationResponse);
|
|
123
|
+
} catch (err) {
|
|
124
|
+
req.logger.error({ err, body: req.body });
|
|
125
|
+
return next(
|
|
126
|
+
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
127
|
+
context: { code: 500, error: err },
|
|
128
|
+
i18n: req.i18n,
|
|
129
|
+
logger: req.logger
|
|
130
|
+
})
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
router.use(apiExpressRouter.handleErrors);
|
|
136
|
+
return router;
|
|
137
|
+
}
|
|
138
|
+
exports.prosopoVerifyRouter = prosopoVerifyRouter;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("./tasks/index.cjs");
|
|
4
|
+
const util = require("./util.cjs");
|
|
5
|
+
const block = require("./api/block.cjs");
|
|
6
|
+
const captcha = require("./api/captcha.cjs");
|
|
7
|
+
const verify = require("./api/verify.cjs");
|
|
8
|
+
const authMiddleware = require("./api/authMiddleware.cjs");
|
|
9
|
+
const ja4Middleware = require("./api/ja4Middleware.cjs");
|
|
10
|
+
const _public = require("./api/public.cjs");
|
|
11
|
+
const domainMiddleware = require("./api/domainMiddleware.cjs");
|
|
12
|
+
const captchaScheduler = require("./schedulers/captchaScheduler.cjs");
|
|
13
|
+
const getClientList = require("./schedulers/getClientList.cjs");
|
|
14
|
+
const headerCheckMiddleware = require("./api/headerCheckMiddleware.cjs");
|
|
15
|
+
const createApiAdminRoutesProvider = require("./api/admin/createApiAdminRoutesProvider.cjs");
|
|
16
|
+
const requestLoggerMiddleware = require("./api/requestLoggerMiddleware.cjs");
|
|
17
|
+
const ignoreMiddleware = require("./api/ignoreMiddleware.cjs");
|
|
18
|
+
const robotsMiddleware = require("./api/robotsMiddleware.cjs");
|
|
19
|
+
const tasks = require("./tasks/tasks.cjs");
|
|
20
|
+
exports.checkIfTaskIsRunning = util.checkIfTaskIsRunning;
|
|
21
|
+
exports.encodeStringAddress = util.encodeStringAddress;
|
|
22
|
+
exports.getIPAddress = util.getIPAddress;
|
|
23
|
+
exports.shuffleArray = util.shuffleArray;
|
|
24
|
+
exports.blockMiddleware = block.blockMiddleware;
|
|
25
|
+
exports.prosopoRouter = captcha.prosopoRouter;
|
|
26
|
+
exports.prosopoVerifyRouter = verify.prosopoVerifyRouter;
|
|
27
|
+
exports.authMiddleware = authMiddleware.authMiddleware;
|
|
28
|
+
exports.verifySignature = authMiddleware.verifySignature;
|
|
29
|
+
exports.DEFAULT_JA4 = ja4Middleware.DEFAULT_JA4;
|
|
30
|
+
exports.getJA4 = ja4Middleware.getJA4;
|
|
31
|
+
exports.ja4Middleware = ja4Middleware.ja4Middleware;
|
|
32
|
+
exports.publicRouter = _public.publicRouter;
|
|
33
|
+
exports.domainMiddleware = domainMiddleware.domainMiddleware;
|
|
34
|
+
exports.storeCaptchasExternally = captchaScheduler.storeCaptchasExternally;
|
|
35
|
+
exports.getClientList = getClientList.getClientList;
|
|
36
|
+
exports.headerCheckMiddleware = headerCheckMiddleware.headerCheckMiddleware;
|
|
37
|
+
exports.createApiAdminRoutesProvider = createApiAdminRoutesProvider.createApiAdminRoutesProvider;
|
|
38
|
+
exports.requestLoggerMiddleware = requestLoggerMiddleware.requestLoggerMiddleware;
|
|
39
|
+
exports.ignoreMiddleware = ignoreMiddleware.ignoreMiddleware;
|
|
40
|
+
exports.robotsMiddleware = robotsMiddleware.robotsMiddleware;
|
|
41
|
+
exports.Tasks = tasks.Tasks;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const checkLangRules = (config, acceptLanguage) => {
|
|
4
|
+
const lConfig = config.lRules;
|
|
5
|
+
let lScore = 0;
|
|
6
|
+
if (lConfig) {
|
|
7
|
+
const languages = acceptLanguage.split(",").map((lang) => lang.trim().split(";")[0]);
|
|
8
|
+
for (const lang of languages) {
|
|
9
|
+
if (lang && lConfig[lang]) {
|
|
10
|
+
lScore += lConfig[lang];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return lScore;
|
|
15
|
+
};
|
|
16
|
+
exports.checkLangRules = checkLangRules;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const env = require("@prosopo/env");
|
|
4
|
+
const types = require("@prosopo/types");
|
|
5
|
+
const cron = require("cron");
|
|
6
|
+
const tasks = require("../tasks/tasks.cjs");
|
|
7
|
+
const util = require("../util.cjs");
|
|
8
|
+
async function storeCaptchasExternally(pair, cronSchedule, config) {
|
|
9
|
+
const env$1 = new env.ProviderEnvironment(config, pair);
|
|
10
|
+
await env$1.isReady();
|
|
11
|
+
const tasks$1 = new tasks.Tasks(env$1);
|
|
12
|
+
const job = new cron.CronJob(cronSchedule, async () => {
|
|
13
|
+
const taskRunning = await util.checkIfTaskIsRunning(
|
|
14
|
+
types.ScheduledTaskNames.StoreCommitmentsExternal,
|
|
15
|
+
env$1.getDb()
|
|
16
|
+
);
|
|
17
|
+
env$1.logger.info(
|
|
18
|
+
`${types.ScheduledTaskNames.StoreCommitmentsExternal} task running: ${taskRunning}`
|
|
19
|
+
);
|
|
20
|
+
if (!taskRunning) {
|
|
21
|
+
env$1.logger.info(
|
|
22
|
+
`${types.ScheduledTaskNames.StoreCommitmentsExternal} task....`
|
|
23
|
+
);
|
|
24
|
+
await tasks$1.clientTaskManager.storeCommitmentsExternal().catch((err) => {
|
|
25
|
+
env$1.logger.error(err);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
job.start();
|
|
30
|
+
}
|
|
31
|
+
exports.storeCaptchasExternally = storeCaptchasExternally;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const env = require("@prosopo/env");
|
|
4
|
+
const types = require("@prosopo/types");
|
|
5
|
+
const cron = require("cron");
|
|
6
|
+
const tasks = require("../tasks/tasks.cjs");
|
|
7
|
+
const util = require("../util.cjs");
|
|
8
|
+
async function getClientList(pair, cronSchedule, config) {
|
|
9
|
+
const env$1 = new env.ProviderEnvironment(config, pair);
|
|
10
|
+
await env$1.isReady();
|
|
11
|
+
const tasks$1 = new tasks.Tasks(env$1);
|
|
12
|
+
const job = new cron.CronJob(cronSchedule, async () => {
|
|
13
|
+
const taskRunning = await util.checkIfTaskIsRunning(
|
|
14
|
+
types.ScheduledTaskNames.GetClientList,
|
|
15
|
+
env$1.getDb()
|
|
16
|
+
);
|
|
17
|
+
env$1.logger.info(
|
|
18
|
+
`${types.ScheduledTaskNames.GetClientList} task running: ${taskRunning}`
|
|
19
|
+
);
|
|
20
|
+
if (!taskRunning) {
|
|
21
|
+
env$1.logger.info(`${types.ScheduledTaskNames.GetClientList} task....`);
|
|
22
|
+
await tasks$1.clientTaskManager.getClientList().catch((err) => {
|
|
23
|
+
env$1.logger.error(err);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
job.start();
|
|
28
|
+
}
|
|
29
|
+
exports.getClientList = getClientList;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const common = require("@prosopo/common");
|
|
4
|
+
const types = require("@prosopo/types");
|
|
5
|
+
class CaptchaManager {
|
|
6
|
+
constructor(db, pair, logger) {
|
|
7
|
+
this.pair = pair;
|
|
8
|
+
this.db = db;
|
|
9
|
+
this.logger = logger || common.getLoggerDefault();
|
|
10
|
+
}
|
|
11
|
+
async getFrictionlessTokenIdFromSession(sessionRecord) {
|
|
12
|
+
const tokenRecord = await this.db.getFrictionlessTokenRecordByTokenId(
|
|
13
|
+
sessionRecord.tokenId
|
|
14
|
+
);
|
|
15
|
+
return tokenRecord ? tokenRecord._id : void 0;
|
|
16
|
+
}
|
|
17
|
+
async isValidRequest(clientSettings, captchaType, sessionId) {
|
|
18
|
+
this.logger.debug({
|
|
19
|
+
message: "Validating request",
|
|
20
|
+
captchaType,
|
|
21
|
+
sessionId
|
|
22
|
+
});
|
|
23
|
+
if (sessionId) {
|
|
24
|
+
if (clientSettings?.settings?.captchaType === types.CaptchaType.frictionless) {
|
|
25
|
+
const sessionRecord = await this.db.checkAndRemoveSession(sessionId);
|
|
26
|
+
if (!sessionRecord) {
|
|
27
|
+
this.logger.warn({
|
|
28
|
+
message: "No frictionless session found",
|
|
29
|
+
account: clientSettings.account,
|
|
30
|
+
sessionId
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
valid: false,
|
|
34
|
+
reason: "CAPTCHA.NO_SESSION_FOUND",
|
|
35
|
+
type: captchaType
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const frictionlessTokenId = await this.getFrictionlessTokenIdFromSession(sessionRecord);
|
|
39
|
+
return {
|
|
40
|
+
valid: true,
|
|
41
|
+
frictionlessTokenId,
|
|
42
|
+
type: captchaType
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
this.logger.warn({
|
|
46
|
+
message: "Invalid frictionless request",
|
|
47
|
+
account: clientSettings.account,
|
|
48
|
+
sessionId,
|
|
49
|
+
settingsCaptchaType: clientSettings?.settings?.captchaType
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
valid: false,
|
|
53
|
+
reason: "API.INCORRECT_CAPTCHA_TYPE",
|
|
54
|
+
type: captchaType
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (clientSettings?.settings?.captchaType !== captchaType) {
|
|
58
|
+
this.logger.warn({
|
|
59
|
+
message: `Invalid ${captchaType} request`,
|
|
60
|
+
account: clientSettings.account,
|
|
61
|
+
requestedCaptchaType: captchaType,
|
|
62
|
+
settingsCaptchaType: clientSettings?.settings?.captchaType
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
valid: false,
|
|
66
|
+
reason: "API.INCORRECT_CAPTCHA_TYPE",
|
|
67
|
+
type: captchaType
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return { valid: true, type: captchaType };
|
|
71
|
+
}
|
|
72
|
+
getVerificationResponse(verified, clientRecord, translateFn, score) {
|
|
73
|
+
return {
|
|
74
|
+
status: translateFn(
|
|
75
|
+
verified ? "API.USER_VERIFIED" : "API.USER_NOT_VERIFIED"
|
|
76
|
+
),
|
|
77
|
+
[types.ApiParams.verified]: verified,
|
|
78
|
+
...CaptchaManager.canClientSeeScore(clientRecord.tier, score) && {
|
|
79
|
+
[types.ApiParams.score]: score
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async getDetectorKeys() {
|
|
84
|
+
return await this.db.getDetectorKeys();
|
|
85
|
+
}
|
|
86
|
+
static canClientSeeScore(tier, score) {
|
|
87
|
+
return score && tier && tier !== types.Tier.Free;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.CaptchaManager = CaptchaManager;
|