@prosopo/provider 2.1.0 → 2.1.2
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/package.json +12 -14
- package/vite.test.config.ts +2 -16
- package/.dockerignore +0 -5
- package/dist/api/admin.d.ts +0 -4
- package/dist/api/admin.d.ts.map +0 -1
- package/dist/api/admin.js +0 -26
- package/dist/api/admin.js.map +0 -1
- package/dist/api/authMiddleware.d.ts +0 -7
- package/dist/api/authMiddleware.d.ts.map +0 -1
- package/dist/api/authMiddleware.js +0 -50
- package/dist/api/authMiddleware.js.map +0 -1
- package/dist/api/captcha.d.ts +0 -4
- package/dist/api/captcha.d.ts.map +0 -1
- package/dist/api/captcha.js +0 -134
- package/dist/api/captcha.js.map +0 -1
- package/dist/api/errorHandler.d.ts +0 -5
- package/dist/api/errorHandler.d.ts.map +0 -1
- package/dist/api/errorHandler.js +0 -14
- package/dist/api/errorHandler.js.map +0 -1
- package/dist/api/verify.d.ts +0 -4
- package/dist/api/verify.d.ts.map +0 -1
- package/dist/api/verify.js +0 -127
- package/dist/api/verify.js.map +0 -1
- package/dist/cjs/api/admin.cjs +0 -28
- package/dist/cjs/api/authMiddleware.cjs +0 -50
- package/dist/cjs/api/captcha.cjs +0 -183
- package/dist/cjs/api/errorHandler.cjs +0 -14
- package/dist/cjs/api/verify.cjs +0 -140
- package/dist/cjs/index.cjs +0 -21
- package/dist/cjs/schedulers/captchaScheduler.cjs +0 -33
- package/dist/cjs/schedulers/getClientList.cjs +0 -31
- package/dist/cjs/tasks/client/clientTasks.cjs +0 -141
- package/dist/cjs/tasks/dataset/datasetTasks.cjs +0 -30
- package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +0 -34
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +0 -280
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +0 -25
- package/dist/cjs/tasks/index.cjs +0 -4
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +0 -132
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +0 -26
- package/dist/cjs/tasks/tasks.cjs +0 -40
- package/dist/cjs/util.cjs +0 -45
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -9
- package/dist/index.js.map +0 -1
- package/dist/schedulers/captchaScheduler.d.ts +0 -4
- package/dist/schedulers/captchaScheduler.d.ts.map +0 -1
- package/dist/schedulers/captchaScheduler.js +0 -28
- package/dist/schedulers/captchaScheduler.js.map +0 -1
- package/dist/schedulers/getClientList.d.ts +0 -4
- package/dist/schedulers/getClientList.d.ts.map +0 -1
- package/dist/schedulers/getClientList.js +0 -28
- package/dist/schedulers/getClientList.js.map +0 -1
- package/dist/tasks/client/clientTasks.d.ts +0 -12
- package/dist/tasks/client/clientTasks.d.ts.map +0 -1
- package/dist/tasks/client/clientTasks.js +0 -80
- package/dist/tasks/client/clientTasks.js.map +0 -1
- package/dist/tasks/dataset/datasetTasks.d.ts +0 -13
- package/dist/tasks/dataset/datasetTasks.d.ts.map +0 -1
- package/dist/tasks/dataset/datasetTasks.js +0 -19
- package/dist/tasks/dataset/datasetTasks.js.map +0 -1
- package/dist/tasks/dataset/datasetTasksUtils.d.ts +0 -3
- package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +0 -1
- package/dist/tasks/dataset/datasetTasksUtils.js +0 -34
- package/dist/tasks/dataset/datasetTasksUtils.js.map +0 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +0 -28
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +0 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +0 -208
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +0 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +0 -7
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +0 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +0 -18
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +0 -1
- package/dist/tasks/index.d.ts +0 -2
- package/dist/tasks/index.d.ts.map +0 -1
- package/dist/tasks/index.js +0 -2
- package/dist/tasks/index.js.map +0 -1
- package/dist/tasks/powCaptcha/powTasks.d.ts +0 -13
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +0 -1
- package/dist/tasks/powCaptcha/powTasks.js +0 -83
- package/dist/tasks/powCaptcha/powTasks.js.map +0 -1
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts +0 -3
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +0 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js +0 -22
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +0 -1
- package/dist/tasks/tasks.d.ts +0 -22
- package/dist/tasks/tasks.d.ts.map +0 -1
- package/dist/tasks/tasks.js +0 -24
- package/dist/tasks/tasks.js.map +0 -1
- package/dist/tests/index.d.ts +0 -2
- package/dist/tests/index.d.ts.map +0 -1
- package/dist/tests/index.js +0 -2
- package/dist/tests/index.js.map +0 -1
- package/dist/tests/integration/imgCaptcha.integration.test.d.ts +0 -2
- package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/imgCaptcha.integration.test.js +0 -115
- package/dist/tests/integration/imgCaptcha.integration.test.js.map +0 -1
- package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +0 -32
- package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +0 -1
- package/dist/tests/integration/mocks/solvedTestCaptchas.js +0 -1046
- package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +0 -1
- package/dist/tests/integration/powCaptcha.integration.test.d.ts +0 -2
- package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/powCaptcha.integration.test.js +0 -173
- package/dist/tests/integration/powCaptcha.integration.test.js.map +0 -1
- 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 -87
- package/dist/tests/unit/api/authMiddleware.unit.test.js.map +0 -1
- package/dist/tests/unit/api/errorHandler.unit.test.d.ts +0 -2
- package/dist/tests/unit/api/errorHandler.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/api/errorHandler.unit.test.js +0 -65
- package/dist/tests/unit/api/errorHandler.unit.test.js.map +0 -1
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +0 -2
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +0 -63
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +0 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +0 -2
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +0 -172
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +0 -1
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +0 -2
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +0 -86
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +0 -1
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +0 -2
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +0 -75
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +0 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +0 -2
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +0 -266
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +0 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +0 -2
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +0 -46
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +0 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +0 -2
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +0 -209
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +0 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +0 -2
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +0 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +0 -65
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +0 -1
- package/dist/util.d.ts +0 -6
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js +0 -34
- package/dist/util.js.map +0 -1
package/dist/cjs/api/captcha.cjs
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
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 datasets = require("@prosopo/datasets");
|
|
6
|
-
const types = require("@prosopo/types");
|
|
7
|
-
const util = require("@prosopo/util");
|
|
8
|
-
const express = require("express");
|
|
9
|
-
const tasks = require("../tasks/tasks.cjs");
|
|
10
|
-
const errorHandler = require("./errorHandler.cjs");
|
|
11
|
-
const NO_IP_ADDRESS = "NO_IP_ADDRESS";
|
|
12
|
-
const flattenHeaders = (headers) => {
|
|
13
|
-
return Object.fromEntries(
|
|
14
|
-
Object.entries(headers).map(([key, value]) => [
|
|
15
|
-
key,
|
|
16
|
-
Array.isArray(value) ? value.join(",") : value || ""
|
|
17
|
-
])
|
|
18
|
-
);
|
|
19
|
-
};
|
|
20
|
-
function prosopoRouter(env) {
|
|
21
|
-
const router = express.Router();
|
|
22
|
-
const tasks$1 = new tasks.Tasks(env);
|
|
23
|
-
const GetImageCaptchaChallengePath = `${types.ApiPaths.GetImageCaptchaChallenge}/:${types.ApiParams.datasetId}/:${types.ApiParams.user}/:${types.ApiParams.dapp}`;
|
|
24
|
-
router.get(GetImageCaptchaChallengePath, async (req, res, next) => {
|
|
25
|
-
try {
|
|
26
|
-
const { datasetId, user } = types.CaptchaRequestBody.parse(req.params);
|
|
27
|
-
address.validateAddress(user, false, 42);
|
|
28
|
-
const taskData = await tasks$1.imgCaptchaManager.getRandomCaptchasAndRequestHash(
|
|
29
|
-
datasetId,
|
|
30
|
-
user,
|
|
31
|
-
req.ip || NO_IP_ADDRESS,
|
|
32
|
-
flattenHeaders(req.headers)
|
|
33
|
-
);
|
|
34
|
-
const captchaResponse = {
|
|
35
|
-
[types.ApiParams.captchas]: taskData.captchas.map((captcha) => ({
|
|
36
|
-
...captcha,
|
|
37
|
-
items: captcha.items.map(
|
|
38
|
-
(item) => datasets.parseCaptchaAssets(item, env.assetsResolver)
|
|
39
|
-
)
|
|
40
|
-
})),
|
|
41
|
-
[types.ApiParams.requestHash]: taskData.requestHash,
|
|
42
|
-
[types.ApiParams.timestamp]: taskData.timestamp.toString(),
|
|
43
|
-
[types.ApiParams.signature]: {
|
|
44
|
-
[types.ApiParams.provider]: {
|
|
45
|
-
[types.ApiParams.requestHash]: taskData.signedRequestHash
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
return res.json(captchaResponse);
|
|
50
|
-
} catch (err) {
|
|
51
|
-
tasks$1.logger.error(err);
|
|
52
|
-
return next(
|
|
53
|
-
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
54
|
-
context: { error: err, code: 400 }
|
|
55
|
-
})
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
router.post(types.ApiPaths.SubmitImageCaptchaSolution, async (req, res, next) => {
|
|
60
|
-
let parsed;
|
|
61
|
-
try {
|
|
62
|
-
parsed = types.CaptchaSolutionBody.parse(req.body);
|
|
63
|
-
} catch (err) {
|
|
64
|
-
return next(
|
|
65
|
-
new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
|
|
66
|
-
context: { code: 400, error: err }
|
|
67
|
-
})
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
try {
|
|
71
|
-
const result = await tasks$1.imgCaptchaManager.dappUserSolution(
|
|
72
|
-
parsed[types.ApiParams.user],
|
|
73
|
-
parsed[types.ApiParams.dapp],
|
|
74
|
-
parsed[types.ApiParams.requestHash],
|
|
75
|
-
parsed[types.ApiParams.captchas],
|
|
76
|
-
parsed[types.ApiParams.signature].user.requestHash,
|
|
77
|
-
Number.parseInt(parsed[types.ApiParams.timestamp]),
|
|
78
|
-
parsed[types.ApiParams.signature].provider.requestHash,
|
|
79
|
-
req.ip || NO_IP_ADDRESS,
|
|
80
|
-
flattenHeaders(req.headers)
|
|
81
|
-
);
|
|
82
|
-
const returnValue = {
|
|
83
|
-
status: req.i18n.t(
|
|
84
|
-
result.verified ? "API.CAPTCHA_PASSED" : "API.CAPTCHA_FAILED"
|
|
85
|
-
),
|
|
86
|
-
...result
|
|
87
|
-
};
|
|
88
|
-
return res.json(returnValue);
|
|
89
|
-
} catch (err) {
|
|
90
|
-
tasks$1.logger.error(err);
|
|
91
|
-
return next(
|
|
92
|
-
new common.ProsopoApiError("API.UNKNOWN", {
|
|
93
|
-
context: { code: 400, error: err }
|
|
94
|
-
})
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
router.post(types.ApiPaths.GetPowCaptchaChallenge, async (req, res, next) => {
|
|
99
|
-
try {
|
|
100
|
-
const { user, dapp } = types.GetPowCaptchaChallengeRequestBody.parse(req.body);
|
|
101
|
-
const origin = req.headers.origin;
|
|
102
|
-
if (!origin) {
|
|
103
|
-
throw new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
104
|
-
context: { code: 400, error: "origin header not found" }
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
const challenge = await tasks$1.powCaptchaManager.getPowCaptchaChallenge(
|
|
108
|
-
user,
|
|
109
|
-
dapp,
|
|
110
|
-
origin
|
|
111
|
-
);
|
|
112
|
-
await tasks$1.db.storePowCaptchaRecord(
|
|
113
|
-
challenge.challenge,
|
|
114
|
-
{
|
|
115
|
-
requestedAtTimestamp: challenge.requestedAtTimestamp,
|
|
116
|
-
userAccount: user,
|
|
117
|
-
dappAccount: dapp
|
|
118
|
-
},
|
|
119
|
-
challenge.difficulty,
|
|
120
|
-
challenge.providerSignature,
|
|
121
|
-
req.ip || NO_IP_ADDRESS,
|
|
122
|
-
flattenHeaders(req.headers)
|
|
123
|
-
);
|
|
124
|
-
const getPowCaptchaResponse = {
|
|
125
|
-
challenge: challenge.challenge,
|
|
126
|
-
difficulty: challenge.difficulty,
|
|
127
|
-
timestamp: challenge.requestedAtTimestamp.toString(),
|
|
128
|
-
signature: {
|
|
129
|
-
provider: {
|
|
130
|
-
challenge: challenge.providerSignature
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
return res.json(getPowCaptchaResponse);
|
|
135
|
-
} catch (err) {
|
|
136
|
-
tasks$1.logger.error(err);
|
|
137
|
-
return next(
|
|
138
|
-
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
139
|
-
context: { code: 400, error: err }
|
|
140
|
-
})
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
router.post(types.ApiPaths.SubmitPowCaptchaSolution, async (req, res, next) => {
|
|
145
|
-
try {
|
|
146
|
-
const { challenge, difficulty, signature, nonce, verifiedTimeout } = types.SubmitPowCaptchaSolutionBody.parse(req.body);
|
|
147
|
-
const verified = await tasks$1.powCaptchaManager.verifyPowCaptchaSolution(
|
|
148
|
-
challenge,
|
|
149
|
-
difficulty,
|
|
150
|
-
signature.provider.challenge,
|
|
151
|
-
nonce,
|
|
152
|
-
verifiedTimeout,
|
|
153
|
-
signature.user.timestamp,
|
|
154
|
-
req.ip || NO_IP_ADDRESS,
|
|
155
|
-
flattenHeaders(req.headers)
|
|
156
|
-
);
|
|
157
|
-
const response = { verified };
|
|
158
|
-
return res.json(response);
|
|
159
|
-
} catch (err) {
|
|
160
|
-
tasks$1.logger.error(err);
|
|
161
|
-
return next(
|
|
162
|
-
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
163
|
-
context: { code: 400, error: err }
|
|
164
|
-
})
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
router.get(types.ApiPaths.GetProviderDetails, async (req, res, next) => {
|
|
169
|
-
try {
|
|
170
|
-
return res.json({ version: util.version, ...{ message: "Provider online" } });
|
|
171
|
-
} catch (err) {
|
|
172
|
-
tasks$1.logger.error(err);
|
|
173
|
-
return next(
|
|
174
|
-
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
175
|
-
context: { code: 400, error: err }
|
|
176
|
-
})
|
|
177
|
-
);
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
router.use(errorHandler.handleErrors);
|
|
181
|
-
return router;
|
|
182
|
-
}
|
|
183
|
-
exports.prosopoRouter = prosopoRouter;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const common = require("@prosopo/common");
|
|
4
|
-
const handleErrors = (err, request, response, next) => {
|
|
5
|
-
const code = "code" in err ? err.code : 400;
|
|
6
|
-
while (err instanceof common.ProsopoBaseError && err.context && err.context.error) {
|
|
7
|
-
err = err.context.error;
|
|
8
|
-
}
|
|
9
|
-
const message = err.message;
|
|
10
|
-
response.writeHead(code, JSON.stringify(message), {
|
|
11
|
-
"content-type": "application/json"
|
|
12
|
-
}).end();
|
|
13
|
-
};
|
|
14
|
-
exports.handleErrors = handleErrors;
|
package/dist/cjs/api/verify.cjs
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const common = require("@prosopo/common");
|
|
4
|
-
const types = require("@prosopo/types");
|
|
5
|
-
const express = require("express");
|
|
6
|
-
const tasks = require("../tasks/tasks.cjs");
|
|
7
|
-
const authMiddleware = require("./authMiddleware.cjs");
|
|
8
|
-
const errorHandler = require("./errorHandler.cjs");
|
|
9
|
-
function prosopoVerifyRouter(env) {
|
|
10
|
-
const router = express.Router();
|
|
11
|
-
const tasks$1 = new tasks.Tasks(env);
|
|
12
|
-
async function verifyImageSolution(res, req, next, isDapp) {
|
|
13
|
-
const parsed = types.VerifySolutionBody.parse(req.body);
|
|
14
|
-
try {
|
|
15
|
-
const { dappSignature, token } = parsed;
|
|
16
|
-
const { user, dapp, timestamp, commitmentId } = types.decodeProcaptchaOutput(token);
|
|
17
|
-
const keyPair = isDapp ? env.keyring.addFromAddress(dapp) : env.keyring.addFromAddress(user);
|
|
18
|
-
authMiddleware.verifySignature(dappSignature, timestamp.toString(), keyPair);
|
|
19
|
-
const solution = await (commitmentId ? tasks$1.imgCaptchaManager.getDappUserCommitmentById(commitmentId) : tasks$1.imgCaptchaManager.getDappUserCommitmentByAccount(user, dapp));
|
|
20
|
-
if (!solution) {
|
|
21
|
-
tasks$1.logger.debug("Not verified - no solution found");
|
|
22
|
-
const noSolutionResponse = {
|
|
23
|
-
[types.ApiParams.status]: req.t("API.USER_NOT_VERIFIED_NO_SOLUTION"),
|
|
24
|
-
[types.ApiParams.verified]: false
|
|
25
|
-
};
|
|
26
|
-
return res.json(noSolutionResponse);
|
|
27
|
-
}
|
|
28
|
-
if (isDapp) {
|
|
29
|
-
if (solution.serverChecked) {
|
|
30
|
-
const alreadyCheckedResponse = {
|
|
31
|
-
[types.ApiParams.status]: req.t("API.USER_ALREADY_VERIFIED"),
|
|
32
|
-
[types.ApiParams.verified]: false
|
|
33
|
-
};
|
|
34
|
-
return res.json(alreadyCheckedResponse);
|
|
35
|
-
}
|
|
36
|
-
await tasks$1.imgCaptchaManager.db.markDappUserCommitmentsChecked([
|
|
37
|
-
solution.id
|
|
38
|
-
]);
|
|
39
|
-
}
|
|
40
|
-
if (solution.result.status === types.CaptchaStatus.disapproved) {
|
|
41
|
-
const disapprovedResponse = {
|
|
42
|
-
[types.ApiParams.status]: req.t("API.USER_NOT_VERIFIED"),
|
|
43
|
-
[types.ApiParams.verified]: false
|
|
44
|
-
};
|
|
45
|
-
return res.json(disapprovedResponse);
|
|
46
|
-
}
|
|
47
|
-
const maxVerifiedTime = parsed.maxVerifiedTime || 60 * 1e3;
|
|
48
|
-
if (maxVerifiedTime) {
|
|
49
|
-
const currentTime = Date.now();
|
|
50
|
-
const timeSinceCompletion = currentTime - solution.requestedAtTimestamp;
|
|
51
|
-
if (timeSinceCompletion > parsed.maxVerifiedTime) {
|
|
52
|
-
const expiredResponse = {
|
|
53
|
-
[types.ApiParams.status]: req.t("API.USER_NOT_VERIFIED_TIME_EXPIRED"),
|
|
54
|
-
[types.ApiParams.verified]: false
|
|
55
|
-
};
|
|
56
|
-
tasks$1.logger.debug("Not verified - time run out");
|
|
57
|
-
return res.json(expiredResponse);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
const isApproved = solution.result.status === types.CaptchaStatus.approved;
|
|
61
|
-
const response = {
|
|
62
|
-
[types.ApiParams.status]: req.t(
|
|
63
|
-
isApproved ? "API.USER_VERIFIED" : "API.USER_NOT_VERIFIED"
|
|
64
|
-
),
|
|
65
|
-
[types.ApiParams.verified]: isApproved,
|
|
66
|
-
[types.ApiParams.commitmentId]: solution.id.toString()
|
|
67
|
-
};
|
|
68
|
-
return res.json(response);
|
|
69
|
-
} catch (err) {
|
|
70
|
-
return next(
|
|
71
|
-
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
72
|
-
context: { code: 400, error: err }
|
|
73
|
-
})
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
router.post(
|
|
78
|
-
types.ApiPaths.VerifyImageCaptchaSolutionDapp,
|
|
79
|
-
async (req, res, next) => {
|
|
80
|
-
try {
|
|
81
|
-
await verifyImageSolution(res, req, next, true);
|
|
82
|
-
} catch (err) {
|
|
83
|
-
return next(
|
|
84
|
-
new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
|
|
85
|
-
context: { code: 400, error: err }
|
|
86
|
-
})
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
);
|
|
91
|
-
router.post(
|
|
92
|
-
types.ApiPaths.VerifyImageCaptchaSolutionUser,
|
|
93
|
-
async (req, res, next) => {
|
|
94
|
-
try {
|
|
95
|
-
await verifyImageSolution(res, req, next, false);
|
|
96
|
-
} catch (err) {
|
|
97
|
-
return next(
|
|
98
|
-
new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
|
|
99
|
-
context: { code: 400, error: err }
|
|
100
|
-
})
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
);
|
|
105
|
-
router.post(types.ApiPaths.VerifyPowCaptchaSolution, async (req, res, next) => {
|
|
106
|
-
try {
|
|
107
|
-
const { token, dappSignature, verifiedTimeout } = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
|
|
108
|
-
const { dapp, timestamp, challenge } = types.decodeProcaptchaOutput(token);
|
|
109
|
-
if (!challenge) {
|
|
110
|
-
const unverifiedResponse = {
|
|
111
|
-
status: req.t("API.USER_NOT_VERIFIED"),
|
|
112
|
-
[types.ApiParams.verified]: false
|
|
113
|
-
};
|
|
114
|
-
return res.json(unverifiedResponse);
|
|
115
|
-
}
|
|
116
|
-
const dappPair = env.keyring.addFromAddress(dapp);
|
|
117
|
-
authMiddleware.verifySignature(dappSignature, timestamp.toString(), dappPair);
|
|
118
|
-
const approved = await tasks$1.powCaptchaManager.serverVerifyPowCaptchaSolution(
|
|
119
|
-
dapp,
|
|
120
|
-
challenge,
|
|
121
|
-
verifiedTimeout
|
|
122
|
-
);
|
|
123
|
-
const verificationResponse = {
|
|
124
|
-
status: req.t(approved ? "API.USER_VERIFIED" : "API.USER_NOT_VERIFIED"),
|
|
125
|
-
[types.ApiParams.verified]: approved
|
|
126
|
-
};
|
|
127
|
-
return res.json(verificationResponse);
|
|
128
|
-
} catch (err) {
|
|
129
|
-
tasks$1.logger.error(err);
|
|
130
|
-
return next(
|
|
131
|
-
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
132
|
-
context: { code: 400, error: err }
|
|
133
|
-
})
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
router.use(errorHandler.handleErrors);
|
|
138
|
-
return router;
|
|
139
|
-
}
|
|
140
|
-
exports.prosopoVerifyRouter = prosopoVerifyRouter;
|
package/dist/cjs/index.cjs
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
require("./tasks/index.cjs");
|
|
4
|
-
const util = require("./util.cjs");
|
|
5
|
-
const captcha = require("./api/captcha.cjs");
|
|
6
|
-
const verify = require("./api/verify.cjs");
|
|
7
|
-
const admin = require("./api/admin.cjs");
|
|
8
|
-
const errorHandler = require("./api/errorHandler.cjs");
|
|
9
|
-
const captchaScheduler = require("./schedulers/captchaScheduler.cjs");
|
|
10
|
-
const getClientList = require("./schedulers/getClientList.cjs");
|
|
11
|
-
const tasks = require("./tasks/tasks.cjs");
|
|
12
|
-
exports.checkIfTaskIsRunning = util.checkIfTaskIsRunning;
|
|
13
|
-
exports.encodeStringAddress = util.encodeStringAddress;
|
|
14
|
-
exports.shuffleArray = util.shuffleArray;
|
|
15
|
-
exports.prosopoRouter = captcha.prosopoRouter;
|
|
16
|
-
exports.prosopoVerifyRouter = verify.prosopoVerifyRouter;
|
|
17
|
-
exports.prosopoAdminRouter = admin.prosopoAdminRouter;
|
|
18
|
-
exports.handleErrors = errorHandler.handleErrors;
|
|
19
|
-
exports.storeCaptchasExternally = captchaScheduler.storeCaptchasExternally;
|
|
20
|
-
exports.getClientList = getClientList.getClientList;
|
|
21
|
-
exports.Tasks = tasks.Tasks;
|
|
@@ -1,33 +0,0 @@
|
|
|
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, 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 defaultSchedule = "0 * * * *";
|
|
13
|
-
const cronSchedule = config.scheduledTasks?.captchaScheduler ? config.scheduledTasks.captchaScheduler.schedule ? config.scheduledTasks.captchaScheduler.schedule : defaultSchedule : defaultSchedule;
|
|
14
|
-
const job = new cron.CronJob(cronSchedule, async () => {
|
|
15
|
-
const taskRunning = await util.checkIfTaskIsRunning(
|
|
16
|
-
types.ScheduledTaskNames.StoreCommitmentsExternal,
|
|
17
|
-
env$1.getDb()
|
|
18
|
-
);
|
|
19
|
-
env$1.logger.info(
|
|
20
|
-
`${types.ScheduledTaskNames.StoreCommitmentsExternal} task running: ${taskRunning}`
|
|
21
|
-
);
|
|
22
|
-
if (!taskRunning) {
|
|
23
|
-
env$1.logger.info(
|
|
24
|
-
`${types.ScheduledTaskNames.StoreCommitmentsExternal} task....`
|
|
25
|
-
);
|
|
26
|
-
await tasks$1.clientTaskManager.storeCommitmentsExternal().catch((err) => {
|
|
27
|
-
env$1.logger.error(err);
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
job.start();
|
|
32
|
-
}
|
|
33
|
-
exports.storeCaptchasExternally = storeCaptchasExternally;
|
|
@@ -1,31 +0,0 @@
|
|
|
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, 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 defaultSchedule = "0 * * * *";
|
|
13
|
-
const cronSchedule = config.scheduledTasks?.clientListScheduler ? config.scheduledTasks.clientListScheduler.schedule ? config.scheduledTasks.clientListScheduler.schedule : defaultSchedule : defaultSchedule;
|
|
14
|
-
const job = new cron.CronJob(cronSchedule, async () => {
|
|
15
|
-
const taskRunning = await util.checkIfTaskIsRunning(
|
|
16
|
-
types.ScheduledTaskNames.GetClientList,
|
|
17
|
-
env$1.getDb()
|
|
18
|
-
);
|
|
19
|
-
env$1.logger.info(
|
|
20
|
-
`${types.ScheduledTaskNames.GetClientList} task running: ${taskRunning}`
|
|
21
|
-
);
|
|
22
|
-
if (!taskRunning) {
|
|
23
|
-
env$1.logger.info(`${types.ScheduledTaskNames.GetClientList} task....`);
|
|
24
|
-
await tasks$1.clientTaskManager.getClientList().catch((err) => {
|
|
25
|
-
env$1.logger.error(err);
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
job.start();
|
|
30
|
-
}
|
|
31
|
-
exports.getClientList = getClientList;
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const database = require("@prosopo/database");
|
|
4
|
-
const types = require("@prosopo/types");
|
|
5
|
-
class ClientTaskManager {
|
|
6
|
-
constructor(config, logger, db) {
|
|
7
|
-
this.config = config;
|
|
8
|
-
this.logger = logger;
|
|
9
|
-
this.providerDB = db;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* @description Store commitments externally in the database
|
|
13
|
-
* @returns Promise<void>
|
|
14
|
-
*/
|
|
15
|
-
async storeCommitmentsExternal() {
|
|
16
|
-
if (!this.config.mongoCaptchaUri) {
|
|
17
|
-
this.logger.info("Mongo env not set");
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const lastTask = await this.providerDB.getLastScheduledTaskStatus(
|
|
21
|
-
types.ScheduledTaskNames.StoreCommitmentsExternal,
|
|
22
|
-
types.ScheduledTaskStatus.Completed
|
|
23
|
-
);
|
|
24
|
-
const taskID = await this.providerDB.createScheduledTaskStatus(
|
|
25
|
-
types.ScheduledTaskNames.StoreCommitmentsExternal,
|
|
26
|
-
types.ScheduledTaskStatus.Running
|
|
27
|
-
);
|
|
28
|
-
try {
|
|
29
|
-
let commitments = await this.providerDB.getUnstoredDappUserCommitments();
|
|
30
|
-
let powRecords = await this.providerDB.getUnstoredDappUserPoWCommitments();
|
|
31
|
-
if (lastTask) {
|
|
32
|
-
this.logger.info(
|
|
33
|
-
`Filtering records to only get updated records: ${JSON.stringify(lastTask)}`
|
|
34
|
-
);
|
|
35
|
-
this.logger.info(
|
|
36
|
-
"Last task ran at ",
|
|
37
|
-
new Date(lastTask.updated || 0),
|
|
38
|
-
"Task ID",
|
|
39
|
-
taskID
|
|
40
|
-
);
|
|
41
|
-
commitments = commitments.filter(
|
|
42
|
-
(commitment) => lastTask.updated && commitment.lastUpdatedTimestamp && (commitment.lastUpdatedTimestamp > lastTask.updated || !commitment.lastUpdatedTimestamp)
|
|
43
|
-
);
|
|
44
|
-
powRecords = powRecords.filter((commitment) => {
|
|
45
|
-
return lastTask.updated && commitment.lastUpdatedTimestamp && // either the update stamp is more recent than the last time this task ran or there is no update stamp,
|
|
46
|
-
// so it is a new record
|
|
47
|
-
(commitment.lastUpdatedTimestamp > lastTask.updated || !commitment.lastUpdatedTimestamp);
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
if (commitments.length || powRecords.length) {
|
|
51
|
-
this.logger.info(
|
|
52
|
-
`Storing ${commitments.length} commitments externally`
|
|
53
|
-
);
|
|
54
|
-
this.logger.info(
|
|
55
|
-
`Storing ${powRecords.length} pow challenges externally`
|
|
56
|
-
);
|
|
57
|
-
const captchaDB = new database.CaptchaDatabase(
|
|
58
|
-
this.config.mongoCaptchaUri,
|
|
59
|
-
void 0,
|
|
60
|
-
void 0,
|
|
61
|
-
this.logger
|
|
62
|
-
);
|
|
63
|
-
await captchaDB.saveCaptchas(commitments, powRecords);
|
|
64
|
-
await this.providerDB.markDappUserCommitmentsStored(
|
|
65
|
-
commitments.map((commitment) => commitment.id)
|
|
66
|
-
);
|
|
67
|
-
await this.providerDB.markDappUserPoWCommitmentsStored(
|
|
68
|
-
powRecords.map((powRecords2) => powRecords2.challenge)
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
await this.providerDB.updateScheduledTaskStatus(
|
|
72
|
-
taskID,
|
|
73
|
-
types.ScheduledTaskStatus.Completed,
|
|
74
|
-
{
|
|
75
|
-
data: {
|
|
76
|
-
commitments: commitments.map((c) => c.id),
|
|
77
|
-
powRecords: powRecords.map((pr) => pr.challenge)
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
);
|
|
81
|
-
} catch (e) {
|
|
82
|
-
this.logger.error(e);
|
|
83
|
-
await this.providerDB.updateScheduledTaskStatus(
|
|
84
|
-
taskID,
|
|
85
|
-
types.ScheduledTaskStatus.Failed,
|
|
86
|
-
{ error: String(e) }
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* @description Get a list of client accounts and their settings from the client database
|
|
92
|
-
* @returns Promise<void>
|
|
93
|
-
*/
|
|
94
|
-
async getClientList() {
|
|
95
|
-
if (!this.config.mongoClientUri) {
|
|
96
|
-
this.logger.info("Mongo env not set");
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
const lastTask = await this.providerDB.getLastScheduledTaskStatus(
|
|
100
|
-
types.ScheduledTaskNames.GetClientList,
|
|
101
|
-
types.ScheduledTaskStatus.Completed
|
|
102
|
-
);
|
|
103
|
-
const taskID = await this.providerDB.createScheduledTaskStatus(
|
|
104
|
-
types.ScheduledTaskNames.GetClientList,
|
|
105
|
-
types.ScheduledTaskStatus.Running
|
|
106
|
-
);
|
|
107
|
-
try {
|
|
108
|
-
const clientDB = new database.ClientDatabase(
|
|
109
|
-
this.config.mongoClientUri,
|
|
110
|
-
void 0,
|
|
111
|
-
// expected to come from URI
|
|
112
|
-
void 0,
|
|
113
|
-
// expected to come from URI
|
|
114
|
-
this.logger
|
|
115
|
-
);
|
|
116
|
-
const updatedAtTimestamp = lastTask ? lastTask.updated || 0 : 0;
|
|
117
|
-
console.log("updatedAtTimestamp", updatedAtTimestamp);
|
|
118
|
-
const newClientRecords = await clientDB.getUpdatedClients(updatedAtTimestamp);
|
|
119
|
-
if (newClientRecords) {
|
|
120
|
-
await this.providerDB.updateClientRecords(newClientRecords);
|
|
121
|
-
}
|
|
122
|
-
await this.providerDB.updateScheduledTaskStatus(
|
|
123
|
-
taskID,
|
|
124
|
-
types.ScheduledTaskStatus.Completed,
|
|
125
|
-
{
|
|
126
|
-
data: {
|
|
127
|
-
clientRecords: newClientRecords.map((c) => c.account)
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
);
|
|
131
|
-
} catch (e) {
|
|
132
|
-
this.logger.error(e);
|
|
133
|
-
await this.providerDB.updateScheduledTaskStatus(
|
|
134
|
-
taskID,
|
|
135
|
-
types.ScheduledTaskStatus.Failed,
|
|
136
|
-
{ error: String(e) }
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
exports.ClientTaskManager = ClientTaskManager;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const datasets = require("@prosopo/datasets");
|
|
4
|
-
const datasetTasksUtils = require("./datasetTasksUtils.cjs");
|
|
5
|
-
class DatasetManager {
|
|
6
|
-
constructor(config, logger, captchaConfig, db) {
|
|
7
|
-
this.config = config;
|
|
8
|
-
this.logger = logger;
|
|
9
|
-
this.captchaConfig = captchaConfig;
|
|
10
|
-
this.db = db;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* @description Set the provider dataset from a file
|
|
14
|
-
*
|
|
15
|
-
* @param file JSON of the captcha dataset
|
|
16
|
-
*/
|
|
17
|
-
async providerSetDatasetFromFile(file) {
|
|
18
|
-
const datasetRaw = datasets.parseCaptchaDataset(file);
|
|
19
|
-
return await this.providerSetDataset(datasetRaw);
|
|
20
|
-
}
|
|
21
|
-
async providerSetDataset(datasetRaw) {
|
|
22
|
-
const dataset = await datasetTasksUtils.providerValidateDataset(
|
|
23
|
-
datasetRaw,
|
|
24
|
-
this.captchaConfig.solved.count,
|
|
25
|
-
this.captchaConfig.unsolved.count
|
|
26
|
-
);
|
|
27
|
-
await this.db?.storeDataset(dataset);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
exports.DatasetManager = DatasetManager;
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const common = require("@prosopo/common");
|
|
4
|
-
const datasets = require("@prosopo/datasets");
|
|
5
|
-
const providerValidateDataset = async (datasetRaw, minSolvedCaptchas, minUnsolvedCaptchas) => {
|
|
6
|
-
if (datasetRaw.captchas.length < minSolvedCaptchas + minUnsolvedCaptchas) {
|
|
7
|
-
throw new common.ProsopoEnvError("DATASET.CAPTCHAS_COUNT_LESS_THAN_CONFIGURED", {
|
|
8
|
-
context: { failedFuncName: providerValidateDataset.name }
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
const solutions = datasetRaw.captchas.map((captcha) => captcha.solution ? 1 : 0).reduce((partialSum, b) => partialSum + b, 0);
|
|
12
|
-
if (solutions < minSolvedCaptchas) {
|
|
13
|
-
throw new common.ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
|
|
14
|
-
context: { failedFuncName: providerValidateDataset.name }
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
if (solutions < minUnsolvedCaptchas) {
|
|
18
|
-
throw new common.ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
|
|
19
|
-
context: { failedFuncName: providerValidateDataset.name }
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
const dataset = await datasets.buildDataset(datasetRaw);
|
|
23
|
-
if (!dataset.datasetId || !dataset.datasetContentId) {
|
|
24
|
-
throw new common.ProsopoEnvError("DATASET.DATASET_ID_UNDEFINED", {
|
|
25
|
-
context: {
|
|
26
|
-
failedFuncName: providerValidateDataset.name,
|
|
27
|
-
datasetId: dataset.datasetId,
|
|
28
|
-
datasetContentId: dataset.datasetContentId
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
return dataset;
|
|
33
|
-
};
|
|
34
|
-
exports.providerValidateDataset = providerValidateDataset;
|