@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.
Files changed (79) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/api/captcha.d.ts.map +1 -1
  3. package/dist/api/captcha.js +1 -1
  4. package/dist/api/captcha.js.map +1 -1
  5. package/dist/api/ja4Middleware.d.ts +6 -0
  6. package/dist/api/ja4Middleware.d.ts.map +1 -1
  7. package/dist/api/ja4Middleware.js +7 -7
  8. package/dist/api/ja4Middleware.js.map +1 -1
  9. package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +32 -0
  10. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +25 -0
  11. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +32 -0
  12. package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +32 -0
  13. package/dist/cjs/api/admin/createApiAdminRoutesProvider.cjs +10 -0
  14. package/dist/cjs/api/authMiddleware.cjs +81 -0
  15. package/dist/cjs/api/blacklistRequestInspector.cjs +73 -0
  16. package/dist/cjs/api/block.cjs +24 -0
  17. package/dist/cjs/api/captcha.cjs +482 -0
  18. package/dist/cjs/api/domainMiddleware.cjs +89 -0
  19. package/dist/cjs/api/headerCheckMiddleware.cjs +29 -0
  20. package/dist/cjs/api/ignoreMiddleware.cjs +14 -0
  21. package/dist/cjs/api/ja4Middleware.cjs +73 -0
  22. package/dist/cjs/api/public.cjs +27 -0
  23. package/dist/cjs/api/requestLoggerMiddleware.cjs +14 -0
  24. package/dist/cjs/api/robotsMiddleware.cjs +12 -0
  25. package/dist/cjs/api/validateAddress.cjs +19 -0
  26. package/dist/cjs/api/verify.cjs +138 -0
  27. package/dist/cjs/index.cjs +41 -0
  28. package/dist/cjs/rules/lang.cjs +16 -0
  29. package/dist/cjs/schedulers/captchaScheduler.cjs +31 -0
  30. package/dist/cjs/schedulers/getClientList.cjs +29 -0
  31. package/dist/cjs/tasks/captchaManager.cjs +90 -0
  32. package/dist/cjs/tasks/client/clientTasks.cjs +281 -0
  33. package/dist/cjs/tasks/dataset/datasetTasks.cjs +30 -0
  34. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +34 -0
  35. package/dist/cjs/tasks/detection/decodePayload.cjs +475 -0
  36. package/dist/cjs/tasks/detection/getBotScore.cjs +13 -0
  37. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +121 -0
  38. package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +11 -0
  39. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +366 -0
  40. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +25 -0
  41. package/dist/cjs/tasks/index.cjs +4 -0
  42. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +155 -0
  43. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +26 -0
  44. package/dist/cjs/tasks/tasks.cjs +51 -0
  45. package/dist/cjs/util.cjs +58 -0
  46. package/dist/schedulers/captchaScheduler.d.ts +1 -1
  47. package/dist/schedulers/captchaScheduler.d.ts.map +1 -1
  48. package/dist/schedulers/captchaScheduler.js +1 -7
  49. package/dist/schedulers/captchaScheduler.js.map +1 -1
  50. package/dist/schedulers/getClientList.d.ts +1 -1
  51. package/dist/schedulers/getClientList.d.ts.map +1 -1
  52. package/dist/schedulers/getClientList.js +1 -7
  53. package/dist/schedulers/getClientList.js.map +1 -1
  54. package/dist/tasks/client/clientTasks.d.ts +5 -2
  55. package/dist/tasks/client/clientTasks.d.ts.map +1 -1
  56. package/dist/tasks/client/clientTasks.js +55 -9
  57. package/dist/tasks/client/clientTasks.js.map +1 -1
  58. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  59. package/dist/tasks/frictionless/frictionlessTasks.js +1 -0
  60. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  61. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +1 -1
  62. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  63. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +13 -3
  64. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  65. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +2 -0
  66. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +1 -0
  67. package/dist/tests/unit/api/ja4Middleware.unit.test.js +57 -0
  68. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -0
  69. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +2 -2
  70. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  71. package/dist/tests/unit/tasks/captchaManager.unit.test.js +1 -0
  72. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  73. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +11 -0
  74. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  75. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +2 -2
  76. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  77. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +2 -1
  78. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
  79. 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;