@prosopo/provider 2.9.8 → 3.0.6
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 +186 -0
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +4 -4
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +5 -5
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +5 -5
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -1
- package/dist/api/blacklistRequestInspector.d.ts +6 -8
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.js +38 -20
- package/dist/api/blacklistRequestInspector.js.map +1 -1
- package/dist/api/block.d.ts.map +1 -1
- package/dist/api/block.js +5 -5
- package/dist/api/block.js.map +1 -1
- package/dist/api/captcha.d.ts.map +1 -1
- package/dist/api/captcha.js +114 -24
- package/dist/api/captcha.js.map +1 -1
- package/dist/api/domainMiddleware.d.ts.map +1 -1
- package/dist/api/domainMiddleware.js +3 -3
- package/dist/api/domainMiddleware.js.map +1 -1
- package/dist/api/headerCheckMiddleware.js +2 -2
- package/dist/api/headerCheckMiddleware.js.map +1 -1
- package/dist/api/ja4Middleware.d.ts.map +1 -1
- package/dist/api/ja4Middleware.js +18 -6
- package/dist/api/ja4Middleware.js.map +1 -1
- package/dist/api/public.d.ts +1 -2
- package/dist/api/public.d.ts.map +1 -1
- package/dist/api/public.js +9 -4
- package/dist/api/public.js.map +1 -1
- package/dist/api/validateAddress.d.ts +2 -2
- package/dist/api/validateAddress.d.ts.map +1 -1
- package/dist/api/validateAddress.js +10 -4
- package/dist/api/validateAddress.js.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +8 -7
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +3 -3
- package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +4 -4
- package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +4 -4
- package/dist/cjs/api/blacklistRequestInspector.cjs +36 -21
- package/dist/cjs/api/block.cjs +4 -5
- package/dist/cjs/api/captcha.cjs +116 -39
- package/dist/cjs/api/domainMiddleware.cjs +3 -3
- package/dist/cjs/api/headerCheckMiddleware.cjs +1 -1
- package/dist/cjs/api/ja4Middleware.cjs +17 -8
- package/dist/cjs/api/public.cjs +9 -4
- package/dist/cjs/api/validateAddress.cjs +12 -6
- package/dist/cjs/api/verify.cjs +13 -12
- package/dist/cjs/index.cjs +1 -5
- package/dist/cjs/schedulers/captchaScheduler.cjs +11 -7
- package/dist/cjs/schedulers/getClientList.cjs +12 -5
- package/dist/cjs/tasks/captchaManager.cjs +76 -23
- package/dist/cjs/tasks/client/clientTasks.cjs +25 -19
- package/dist/cjs/tasks/detection/decodePayload.cjs +284 -362
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +32 -25
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +37 -26
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +19 -18
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +5 -3
- package/dist/cjs/tasks/tasks.cjs +11 -2
- package/dist/cjs/util.cjs +58 -8
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/schedulers/captchaScheduler.d.ts +1 -1
- package/dist/schedulers/captchaScheduler.d.ts.map +1 -1
- package/dist/schedulers/captchaScheduler.js +11 -3
- 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 +12 -3
- package/dist/schedulers/getClientList.js.map +1 -1
- package/dist/tasks/captchaManager.d.ts +14 -1
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +67 -24
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/client/clientTasks.d.ts.map +1 -1
- package/dist/tasks/client/clientTasks.js +26 -18
- package/dist/tasks/client/clientTasks.js.map +1 -1
- package/dist/tasks/detection/decodePayload.d.ts +2 -2
- package/dist/tasks/detection/decodePayload.d.ts.map +1 -1
- package/dist/tasks/detection/decodePayload.js +184 -230
- package/dist/tasks/detection/decodePayload.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts +4 -5
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +32 -24
- 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 +38 -25
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.d.ts +1 -1
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.js +17 -18
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js +5 -3
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
- package/dist/tasks/tasks.d.ts +3 -2
- package/dist/tasks/tasks.d.ts.map +1 -1
- package/dist/tasks/tasks.js +13 -3
- package/dist/tasks/tasks.js.map +1 -1
- package/dist/tests/integration/imgCaptcha.integration.test.js +3 -2
- package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -1
- package/dist/tests/integration/powCaptcha.integration.test.js +9 -9
- package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -1
- package/dist/tests/integration/registerSitekey.d.ts.map +1 -1
- package/dist/tests/integration/registerSitekey.js +13 -2
- package/dist/tests/integration/registerSitekey.js.map +1 -1
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +43 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +1 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js +18 -4
- package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +30 -18
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +11 -5
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +43 -19
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +11 -4
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +9 -8
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +29 -10
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +2 -3
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +4 -2
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/util.unit.test.js +110 -2
- package/dist/tests/unit/util.unit.test.js.map +1 -1
- package/dist/util.d.ts +5 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +57 -5
- package/dist/util.js.map +1 -1
- package/package.json +24 -20
- package/vite.test.config.ts +1 -1
- package/dist/api/authMiddleware.d.ts +0 -6
- package/dist/api/authMiddleware.d.ts.map +0 -1
- package/dist/api/authMiddleware.js +0 -82
- package/dist/api/authMiddleware.js.map +0 -1
- package/dist/api/requestLoggerMiddleware.d.ts +0 -4
- package/dist/api/requestLoggerMiddleware.d.ts.map +0 -1
- package/dist/api/requestLoggerMiddleware.js +0 -12
- package/dist/api/requestLoggerMiddleware.js.map +0 -1
- package/dist/cjs/api/authMiddleware.cjs +0 -81
- package/dist/cjs/api/requestLoggerMiddleware.cjs +0 -14
- package/dist/tests/unit/api/authMiddleware.unit.test.d.ts +0 -2
- package/dist/tests/unit/api/authMiddleware.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/api/authMiddleware.unit.test.js +0 -125
- package/dist/tests/unit/api/authMiddleware.unit.test.js.map +0 -1
package/dist/cjs/api/public.cjs
CHANGED
|
@@ -5,15 +5,20 @@ 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
|
-
|
|
9
|
-
function publicRouter(env) {
|
|
8
|
+
function publicRouter() {
|
|
10
9
|
const router = express.Router();
|
|
11
|
-
|
|
10
|
+
router.get(types.PublicApiPaths.Healthz, (req, res) => {
|
|
11
|
+
res.status(200).send("OK");
|
|
12
|
+
});
|
|
12
13
|
router.get(types.PublicApiPaths.GetProviderDetails, async (req, res, next) => {
|
|
13
14
|
try {
|
|
14
15
|
return res.json({ version: util.version, ...{ message: "Provider online" } });
|
|
15
16
|
} catch (err) {
|
|
16
|
-
req.logger.error(
|
|
17
|
+
req.logger.error(() => ({
|
|
18
|
+
err,
|
|
19
|
+
data: { reqParams: req.params },
|
|
20
|
+
msg: "Error getting provider details"
|
|
21
|
+
}));
|
|
17
22
|
return next(
|
|
18
23
|
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
19
24
|
context: { code: 500 }
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const address = require("@polkadot/util-crypto/address");
|
|
4
3
|
const common = require("@prosopo/common");
|
|
5
|
-
const
|
|
4
|
+
const utilCrypto = require("@prosopo/util-crypto");
|
|
5
|
+
const validateSiteKey = (siteKey, logger) => {
|
|
6
6
|
return validateAddr(siteKey, "API.INVALID_SITE_KEY", logger);
|
|
7
7
|
};
|
|
8
|
-
const validateAddr = (address
|
|
8
|
+
const validateAddr = (address, translationKey = "CONTRACT.INVALID_ADDRESS", logger) => {
|
|
9
9
|
try {
|
|
10
|
-
|
|
10
|
+
const valid = utilCrypto.validateAddress(address, false, 42);
|
|
11
|
+
if (!valid) {
|
|
12
|
+
throw new common.ProsopoApiError(translationKey, {
|
|
13
|
+
context: { code: 400, siteKey: address },
|
|
14
|
+
logger
|
|
15
|
+
});
|
|
16
|
+
}
|
|
11
17
|
} catch (err) {
|
|
12
18
|
throw new common.ProsopoApiError(translationKey, {
|
|
13
|
-
context: { code: 400,
|
|
19
|
+
context: { code: 400, siteKey: address },
|
|
14
20
|
logger
|
|
15
21
|
});
|
|
16
22
|
}
|
|
17
23
|
};
|
|
18
24
|
exports.validateAddr = validateAddr;
|
|
19
|
-
exports.
|
|
25
|
+
exports.validateSiteKey = validateSiteKey;
|
package/dist/cjs/api/verify.cjs
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const address = require("@polkadot/util-crypto/address");
|
|
4
3
|
const apiExpressRouter = require("@prosopo/api-express-router");
|
|
5
4
|
const common = require("@prosopo/common");
|
|
6
5
|
const types = require("@prosopo/types");
|
|
6
|
+
const utilCrypto = require("@prosopo/util-crypto");
|
|
7
7
|
const express = require("express");
|
|
8
8
|
const tasks = require("../tasks/tasks.cjs");
|
|
9
|
-
const authMiddleware = require("./authMiddleware.cjs");
|
|
10
9
|
function prosopoVerifyRouter(env) {
|
|
11
10
|
const router = express.Router();
|
|
12
|
-
const tasks$1 = new tasks.Tasks(env);
|
|
13
11
|
router.post(
|
|
14
12
|
types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
|
|
15
13
|
async (req, res, next) => {
|
|
14
|
+
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
16
15
|
let parsed;
|
|
17
16
|
try {
|
|
18
17
|
parsed = types.VerifySolutionBody.parse(req.body);
|
|
@@ -28,8 +27,8 @@ function prosopoVerifyRouter(env) {
|
|
|
28
27
|
const { dappSignature, token, ip } = parsed;
|
|
29
28
|
try {
|
|
30
29
|
const { user, dapp, timestamp, commitmentId } = types.decodeProcaptchaOutput(token);
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
utilCrypto.validateAddress(dapp, false, 42);
|
|
31
|
+
utilCrypto.validateAddress(user, false, 42);
|
|
33
32
|
const clientRecord = await tasks$1.db.getClientRecord(dapp);
|
|
34
33
|
if (!clientRecord) {
|
|
35
34
|
return next(
|
|
@@ -41,7 +40,7 @@ function prosopoVerifyRouter(env) {
|
|
|
41
40
|
);
|
|
42
41
|
}
|
|
43
42
|
const keyPair = env.keyring.addFromAddress(dapp);
|
|
44
|
-
|
|
43
|
+
apiExpressRouter.verifySignature(dappSignature, timestamp.toString(), keyPair);
|
|
45
44
|
const response = await tasks$1.imgCaptchaManager.verifyImageCaptchaSolution(
|
|
46
45
|
user,
|
|
47
46
|
dapp,
|
|
@@ -49,7 +48,7 @@ function prosopoVerifyRouter(env) {
|
|
|
49
48
|
parsed.maxVerifiedTime,
|
|
50
49
|
ip
|
|
51
50
|
);
|
|
52
|
-
req.logger.debug(response);
|
|
51
|
+
req.logger.debug(() => ({ data: { response } }));
|
|
53
52
|
const verificationResponse = tasks$1.imgCaptchaManager.getVerificationResponse(
|
|
54
53
|
response[types.ApiParams.verified],
|
|
55
54
|
clientRecord,
|
|
@@ -59,7 +58,7 @@ function prosopoVerifyRouter(env) {
|
|
|
59
58
|
);
|
|
60
59
|
res.json(verificationResponse);
|
|
61
60
|
} catch (err) {
|
|
62
|
-
req.logger.error({ err, body: req.body });
|
|
61
|
+
req.logger.error(() => ({ err, data: { body: req.body } }));
|
|
63
62
|
return next(
|
|
64
63
|
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
65
64
|
context: { code: 500, siteKey: req.body.dapp, user: req.body.user },
|
|
@@ -73,6 +72,7 @@ function prosopoVerifyRouter(env) {
|
|
|
73
72
|
router.post(
|
|
74
73
|
types.ClientApiPaths.VerifyPowCaptchaSolution,
|
|
75
74
|
async (req, res, next) => {
|
|
75
|
+
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
76
76
|
let parsed;
|
|
77
77
|
try {
|
|
78
78
|
parsed = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
|
|
@@ -88,8 +88,8 @@ function prosopoVerifyRouter(env) {
|
|
|
88
88
|
try {
|
|
89
89
|
const { token, dappSignature, verifiedTimeout, ip } = parsed;
|
|
90
90
|
const { dapp, user, timestamp, challenge } = types.decodeProcaptchaOutput(token);
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
utilCrypto.validateAddress(dapp, false, 42);
|
|
92
|
+
utilCrypto.validateAddress(user, false, 42);
|
|
93
93
|
const clientRecord = await tasks$1.db.getClientRecord(dapp);
|
|
94
94
|
if (!clientRecord) {
|
|
95
95
|
return next(
|
|
@@ -108,7 +108,7 @@ function prosopoVerifyRouter(env) {
|
|
|
108
108
|
return res.json(unverifiedResponse);
|
|
109
109
|
}
|
|
110
110
|
const dappPair = env.keyring.addFromAddress(dapp);
|
|
111
|
-
|
|
111
|
+
apiExpressRouter.verifySignature(dappSignature, timestamp.toString(), dappPair);
|
|
112
112
|
const { verified, score } = await tasks$1.powCaptchaManager.serverVerifyPowCaptchaSolution(
|
|
113
113
|
dapp,
|
|
114
114
|
challenge,
|
|
@@ -123,7 +123,8 @@ function prosopoVerifyRouter(env) {
|
|
|
123
123
|
);
|
|
124
124
|
return res.json(verificationResponse);
|
|
125
125
|
} catch (err) {
|
|
126
|
-
|
|
126
|
+
console.error("\nError in verifyPowCaptchaSolution:", err);
|
|
127
|
+
req.logger.error(() => ({ err, data: { body: req.body } }));
|
|
127
128
|
return next(
|
|
128
129
|
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
129
130
|
context: { code: 500, error: err },
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -5,7 +5,6 @@ const util = require("./util.cjs");
|
|
|
5
5
|
const block = require("./api/block.cjs");
|
|
6
6
|
const captcha = require("./api/captcha.cjs");
|
|
7
7
|
const verify = require("./api/verify.cjs");
|
|
8
|
-
const authMiddleware = require("./api/authMiddleware.cjs");
|
|
9
8
|
const ja4Middleware = require("./api/ja4Middleware.cjs");
|
|
10
9
|
const _public = require("./api/public.cjs");
|
|
11
10
|
const domainMiddleware = require("./api/domainMiddleware.cjs");
|
|
@@ -13,7 +12,6 @@ const captchaScheduler = require("./schedulers/captchaScheduler.cjs");
|
|
|
13
12
|
const getClientList = require("./schedulers/getClientList.cjs");
|
|
14
13
|
const headerCheckMiddleware = require("./api/headerCheckMiddleware.cjs");
|
|
15
14
|
const createApiAdminRoutesProvider = require("./api/admin/createApiAdminRoutesProvider.cjs");
|
|
16
|
-
const requestLoggerMiddleware = require("./api/requestLoggerMiddleware.cjs");
|
|
17
15
|
const ignoreMiddleware = require("./api/ignoreMiddleware.cjs");
|
|
18
16
|
const robotsMiddleware = require("./api/robotsMiddleware.cjs");
|
|
19
17
|
const tasks = require("./tasks/tasks.cjs");
|
|
@@ -22,11 +20,10 @@ exports.encodeStringAddress = util.encodeStringAddress;
|
|
|
22
20
|
exports.getIPAddress = util.getIPAddress;
|
|
23
21
|
exports.getIPAddressFromBigInt = util.getIPAddressFromBigInt;
|
|
24
22
|
exports.shuffleArray = util.shuffleArray;
|
|
23
|
+
exports.validateIpAddress = util.validateIpAddress;
|
|
25
24
|
exports.blockMiddleware = block.blockMiddleware;
|
|
26
25
|
exports.prosopoRouter = captcha.prosopoRouter;
|
|
27
26
|
exports.prosopoVerifyRouter = verify.prosopoVerifyRouter;
|
|
28
|
-
exports.authMiddleware = authMiddleware.authMiddleware;
|
|
29
|
-
exports.verifySignature = authMiddleware.verifySignature;
|
|
30
27
|
exports.DEFAULT_JA4 = ja4Middleware.DEFAULT_JA4;
|
|
31
28
|
exports.getJA4 = ja4Middleware.getJA4;
|
|
32
29
|
exports.ja4Middleware = ja4Middleware.ja4Middleware;
|
|
@@ -36,7 +33,6 @@ exports.storeCaptchasExternally = captchaScheduler.storeCaptchasExternally;
|
|
|
36
33
|
exports.getClientList = getClientList.getClientList;
|
|
37
34
|
exports.headerCheckMiddleware = headerCheckMiddleware.headerCheckMiddleware;
|
|
38
35
|
exports.createApiAdminRoutesProvider = createApiAdminRoutesProvider.createApiAdminRoutesProvider;
|
|
39
|
-
exports.requestLoggerMiddleware = requestLoggerMiddleware.requestLoggerMiddleware;
|
|
40
36
|
exports.ignoreMiddleware = ignoreMiddleware.ignoreMiddleware;
|
|
41
37
|
exports.robotsMiddleware = robotsMiddleware.robotsMiddleware;
|
|
42
38
|
exports.Tasks = tasks.Tasks;
|
|
@@ -14,15 +14,19 @@ async function storeCaptchasExternally(pair, cronSchedule, config) {
|
|
|
14
14
|
types.ScheduledTaskNames.StoreCommitmentsExternal,
|
|
15
15
|
env$1.getDb()
|
|
16
16
|
);
|
|
17
|
-
env$1.logger.info(
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
env$1.logger.info(() => ({
|
|
18
|
+
data: { taskRunning },
|
|
19
|
+
msg: `${types.ScheduledTaskNames.StoreCommitmentsExternal} task running: ${taskRunning}`
|
|
20
|
+
}));
|
|
20
21
|
if (!taskRunning) {
|
|
21
|
-
env$1.logger.info(
|
|
22
|
-
`${types.ScheduledTaskNames.StoreCommitmentsExternal} task....`
|
|
23
|
-
);
|
|
22
|
+
env$1.logger.info(() => ({
|
|
23
|
+
msg: `${types.ScheduledTaskNames.StoreCommitmentsExternal} task....`
|
|
24
|
+
}));
|
|
24
25
|
await tasks$1.clientTaskManager.storeCommitmentsExternal().catch((err) => {
|
|
25
|
-
env$1.logger.error(
|
|
26
|
+
env$1.logger.error(() => ({
|
|
27
|
+
err,
|
|
28
|
+
msg: "Error storing commitments externally"
|
|
29
|
+
}));
|
|
26
30
|
});
|
|
27
31
|
}
|
|
28
32
|
});
|
|
@@ -14,13 +14,20 @@ async function getClientList(pair, cronSchedule, config) {
|
|
|
14
14
|
types.ScheduledTaskNames.GetClientList,
|
|
15
15
|
env$1.getDb()
|
|
16
16
|
);
|
|
17
|
-
env$1.logger.info(
|
|
18
|
-
`${types.ScheduledTaskNames.GetClientList} task running: ${taskRunning}
|
|
19
|
-
|
|
17
|
+
env$1.logger.info(() => ({
|
|
18
|
+
msg: `${types.ScheduledTaskNames.GetClientList} task running: ${taskRunning}`,
|
|
19
|
+
data: { taskRunning }
|
|
20
|
+
}));
|
|
20
21
|
if (!taskRunning) {
|
|
21
|
-
env$1.logger.info(
|
|
22
|
+
env$1.logger.info(() => ({
|
|
23
|
+
msg: `${types.ScheduledTaskNames.GetClientList} task....`,
|
|
24
|
+
data: {}
|
|
25
|
+
}));
|
|
22
26
|
await tasks$1.clientTaskManager.getClientList().catch((err) => {
|
|
23
|
-
env$1.logger.error(
|
|
27
|
+
env$1.logger.error(() => ({
|
|
28
|
+
err,
|
|
29
|
+
msg: "Error getting client list"
|
|
30
|
+
}));
|
|
24
31
|
});
|
|
25
32
|
}
|
|
26
33
|
});
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const common = require("@prosopo/common");
|
|
4
4
|
const types = require("@prosopo/types");
|
|
5
|
+
const userAccessPolicy = require("@prosopo/user-access-policy");
|
|
6
|
+
const util = require("@prosopo/util");
|
|
5
7
|
class CaptchaManager {
|
|
6
8
|
constructor(db, pair, logger) {
|
|
7
9
|
this.pair = pair;
|
|
8
10
|
this.db = db;
|
|
9
|
-
this.logger = logger || common.
|
|
11
|
+
this.logger = logger || common.getLogger("info", module);
|
|
10
12
|
}
|
|
11
13
|
async getFrictionlessTokenIdFromSession(sessionRecord) {
|
|
12
14
|
const tokenRecord = await this.db.getFrictionlessTokenRecordByTokenId(
|
|
@@ -15,20 +17,24 @@ class CaptchaManager {
|
|
|
15
17
|
return tokenRecord ? tokenRecord._id : void 0;
|
|
16
18
|
}
|
|
17
19
|
async isValidRequest(clientSettings, captchaType, sessionId) {
|
|
18
|
-
this.logger.debug({
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
this.logger.debug(() => ({
|
|
21
|
+
msg: "Validating request",
|
|
22
|
+
data: {
|
|
23
|
+
captchaType,
|
|
24
|
+
sessionId
|
|
25
|
+
}
|
|
26
|
+
}));
|
|
23
27
|
if (sessionId) {
|
|
24
28
|
if (clientSettings?.settings?.captchaType === types.CaptchaType.frictionless) {
|
|
25
29
|
const sessionRecord = await this.db.checkAndRemoveSession(sessionId);
|
|
26
30
|
if (!sessionRecord) {
|
|
27
|
-
this.logger.warn({
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
this.logger.warn(() => ({
|
|
32
|
+
msg: "No frictionless session found",
|
|
33
|
+
data: {
|
|
34
|
+
account: clientSettings.account,
|
|
35
|
+
sessionId
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
32
38
|
return {
|
|
33
39
|
valid: false,
|
|
34
40
|
reason: "CAPTCHA.NO_SESSION_FOUND",
|
|
@@ -42,12 +48,14 @@ class CaptchaManager {
|
|
|
42
48
|
type: captchaType
|
|
43
49
|
};
|
|
44
50
|
}
|
|
45
|
-
this.logger.warn({
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
this.logger.warn(() => ({
|
|
52
|
+
msg: "Invalid frictionless request",
|
|
53
|
+
data: {
|
|
54
|
+
account: clientSettings.account,
|
|
55
|
+
sessionId,
|
|
56
|
+
settingsCaptchaType: clientSettings?.settings?.captchaType
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
51
59
|
return {
|
|
52
60
|
valid: false,
|
|
53
61
|
reason: "API.INCORRECT_CAPTCHA_TYPE",
|
|
@@ -55,12 +63,14 @@ class CaptchaManager {
|
|
|
55
63
|
};
|
|
56
64
|
}
|
|
57
65
|
if (clientSettings?.settings?.captchaType !== captchaType) {
|
|
58
|
-
this.logger.warn({
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
66
|
+
this.logger.warn(() => ({
|
|
67
|
+
msg: `Invalid ${captchaType} request`,
|
|
68
|
+
data: {
|
|
69
|
+
account: clientSettings.account,
|
|
70
|
+
requestedCaptchaType: captchaType,
|
|
71
|
+
settingsCaptchaType: clientSettings?.settings?.captchaType
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
64
74
|
return {
|
|
65
75
|
valid: false,
|
|
66
76
|
reason: "API.INCORRECT_CAPTCHA_TYPE",
|
|
@@ -80,6 +90,49 @@ class CaptchaManager {
|
|
|
80
90
|
}
|
|
81
91
|
};
|
|
82
92
|
}
|
|
93
|
+
async getPrioritisedAccessPolicies(userAccessRulesStorage, clientId, userScope) {
|
|
94
|
+
const resolver = userAccessPolicy.createAccessPolicyResolver(
|
|
95
|
+
userAccessRulesStorage,
|
|
96
|
+
this.logger
|
|
97
|
+
);
|
|
98
|
+
const userScopeKeys = Object.keys(userScope).filter(
|
|
99
|
+
(key) => userScope[key] !== void 0
|
|
100
|
+
);
|
|
101
|
+
const prioritisedUserScopes = util.uniqueSubsets(userScopeKeys).map(
|
|
102
|
+
(subset) => subset.reduce(
|
|
103
|
+
(acc, key) => {
|
|
104
|
+
acc[key] = userScope[key];
|
|
105
|
+
return acc;
|
|
106
|
+
},
|
|
107
|
+
{}
|
|
108
|
+
)
|
|
109
|
+
);
|
|
110
|
+
for (const clientOrUndefined of [clientId, void 0]) {
|
|
111
|
+
for (const scope of prioritisedUserScopes) {
|
|
112
|
+
const accessPolicy = await resolver({
|
|
113
|
+
...clientOrUndefined && {
|
|
114
|
+
policyScope: {
|
|
115
|
+
clientId: clientOrUndefined
|
|
116
|
+
},
|
|
117
|
+
policyScopeMatch: userAccessPolicy.ScopeMatch.Exact
|
|
118
|
+
},
|
|
119
|
+
userScope: userAccessPolicy.userScopeInputSchema.parse(scope),
|
|
120
|
+
userScopeMatch: userAccessPolicy.ScopeMatch.Exact
|
|
121
|
+
});
|
|
122
|
+
if (accessPolicy) {
|
|
123
|
+
this.logger.debug(() => ({
|
|
124
|
+
msg: "Access policy found",
|
|
125
|
+
data: {
|
|
126
|
+
accessPolicy,
|
|
127
|
+
scope
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
return accessPolicy;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return void 0;
|
|
135
|
+
}
|
|
83
136
|
async getDetectorKeys() {
|
|
84
137
|
return await this.db.getDetectorKeys();
|
|
85
138
|
}
|
|
@@ -49,7 +49,7 @@ class ClientTaskManager {
|
|
|
49
49
|
*/
|
|
50
50
|
async storeCommitmentsExternal() {
|
|
51
51
|
if (!this.config.mongoCaptchaUri) {
|
|
52
|
-
this.logger.info("Mongo env not set");
|
|
52
|
+
this.logger.info(() => ({ msg: "Mongo env not set" }));
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
55
|
const lastTask = await this.providerDB.getLastScheduledTaskStatus(
|
|
@@ -105,18 +105,18 @@ class ClientTaskManager {
|
|
|
105
105
|
const frictionlessTokenRecords = await this.providerDB.getFrictionlessTokenRecordsByTokenIds(
|
|
106
106
|
filteredBatch.map((record) => record.tokenId)
|
|
107
107
|
);
|
|
108
|
-
this.logger.info(
|
|
109
|
-
`Frictionless token records: ${frictionlessTokenRecords.length}`
|
|
110
|
-
);
|
|
108
|
+
this.logger.info(() => ({
|
|
109
|
+
msg: `Frictionless token records: ${frictionlessTokenRecords.length}`
|
|
110
|
+
}));
|
|
111
111
|
const filteredBatchWithScores = filteredBatch.map((record) => {
|
|
112
112
|
const tokenRecord = frictionlessTokenRecords.find(
|
|
113
113
|
(tokenRecord2) => tokenRecord2._id?.toString() === record.tokenId.toString()
|
|
114
114
|
);
|
|
115
115
|
if (!tokenRecord) {
|
|
116
|
-
this.logger.error({
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
});
|
|
116
|
+
this.logger.error(() => ({
|
|
117
|
+
msg: "No token record found",
|
|
118
|
+
data: { tokenId: record.tokenId }
|
|
119
|
+
}));
|
|
120
120
|
return {
|
|
121
121
|
...record,
|
|
122
122
|
score: 0,
|
|
@@ -155,7 +155,10 @@ class ClientTaskManager {
|
|
|
155
155
|
);
|
|
156
156
|
this.captchaDB?.close();
|
|
157
157
|
} catch (e) {
|
|
158
|
-
this.logger.error(
|
|
158
|
+
this.logger.error(() => ({
|
|
159
|
+
err: e,
|
|
160
|
+
msg: "Error processing client tasks"
|
|
161
|
+
}));
|
|
159
162
|
this.captchaDB?.close();
|
|
160
163
|
await this.providerDB.updateScheduledTaskStatus(
|
|
161
164
|
taskID,
|
|
@@ -170,7 +173,7 @@ class ClientTaskManager {
|
|
|
170
173
|
*/
|
|
171
174
|
async getClientList() {
|
|
172
175
|
if (!this.config.mongoClientUri) {
|
|
173
|
-
this.logger.info("Mongo env not set");
|
|
176
|
+
this.logger.info(() => ({ msg: "Mongo env not set" }));
|
|
174
177
|
return;
|
|
175
178
|
}
|
|
176
179
|
const lastTask = await this.providerDB.getLastScheduledTaskStatus(
|
|
@@ -192,9 +195,9 @@ class ClientTaskManager {
|
|
|
192
195
|
);
|
|
193
196
|
const tenMinuteWindow = 10 * 60 * 1e3;
|
|
194
197
|
const updatedAtTimestamp = lastTask?.updated ? lastTask.updated - tenMinuteWindow || 0 : 0;
|
|
195
|
-
this.logger.info({
|
|
196
|
-
|
|
197
|
-
});
|
|
198
|
+
this.logger.info(() => ({
|
|
199
|
+
msg: `Getting updated client records since ${new Date(updatedAtTimestamp).toDateString()}`
|
|
200
|
+
}));
|
|
198
201
|
const newClientRecords = await clientDB.getUpdatedClients(updatedAtTimestamp);
|
|
199
202
|
if (newClientRecords) {
|
|
200
203
|
await this.providerDB.updateClientRecords(newClientRecords);
|
|
@@ -213,7 +216,10 @@ class ClientTaskManager {
|
|
|
213
216
|
context: { error: e },
|
|
214
217
|
logger: this.logger
|
|
215
218
|
});
|
|
216
|
-
this.logger.error(
|
|
219
|
+
this.logger.error(() => ({
|
|
220
|
+
err: getClientListError,
|
|
221
|
+
msg: "Error getting client list"
|
|
222
|
+
}));
|
|
217
223
|
await this.providerDB.updateScheduledTaskStatus(
|
|
218
224
|
taskID,
|
|
219
225
|
types.ScheduledTaskStatus.Failed,
|
|
@@ -222,7 +228,7 @@ class ClientTaskManager {
|
|
|
222
228
|
}
|
|
223
229
|
}
|
|
224
230
|
async registerSiteKey(siteKey, tier, settings) {
|
|
225
|
-
validateAddress.
|
|
231
|
+
validateAddress.validateSiteKey(siteKey);
|
|
226
232
|
await this.providerDB.updateClientRecords([
|
|
227
233
|
{
|
|
228
234
|
account: siteKey,
|
|
@@ -257,10 +263,10 @@ class ClientTaskManager {
|
|
|
257
263
|
const allowedDomain = util.parseUrl(clientDomain).hostname.replace(/\.$/, "");
|
|
258
264
|
return referrerDomain === allowedDomain || referrerDomain.endsWith(`.${allowedDomain}`);
|
|
259
265
|
} catch {
|
|
260
|
-
this.logger.error({
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
});
|
|
266
|
+
this.logger.error(() => ({
|
|
267
|
+
msg: "Error in isSubdomainOrExactMatch",
|
|
268
|
+
data: { referrer, clientDomain }
|
|
269
|
+
}));
|
|
264
270
|
return false;
|
|
265
271
|
}
|
|
266
272
|
}
|