@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.
Files changed (149) hide show
  1. package/package.json +12 -14
  2. package/vite.test.config.ts +2 -16
  3. package/.dockerignore +0 -5
  4. package/dist/api/admin.d.ts +0 -4
  5. package/dist/api/admin.d.ts.map +0 -1
  6. package/dist/api/admin.js +0 -26
  7. package/dist/api/admin.js.map +0 -1
  8. package/dist/api/authMiddleware.d.ts +0 -7
  9. package/dist/api/authMiddleware.d.ts.map +0 -1
  10. package/dist/api/authMiddleware.js +0 -50
  11. package/dist/api/authMiddleware.js.map +0 -1
  12. package/dist/api/captcha.d.ts +0 -4
  13. package/dist/api/captcha.d.ts.map +0 -1
  14. package/dist/api/captcha.js +0 -134
  15. package/dist/api/captcha.js.map +0 -1
  16. package/dist/api/errorHandler.d.ts +0 -5
  17. package/dist/api/errorHandler.d.ts.map +0 -1
  18. package/dist/api/errorHandler.js +0 -14
  19. package/dist/api/errorHandler.js.map +0 -1
  20. package/dist/api/verify.d.ts +0 -4
  21. package/dist/api/verify.d.ts.map +0 -1
  22. package/dist/api/verify.js +0 -127
  23. package/dist/api/verify.js.map +0 -1
  24. package/dist/cjs/api/admin.cjs +0 -28
  25. package/dist/cjs/api/authMiddleware.cjs +0 -50
  26. package/dist/cjs/api/captcha.cjs +0 -183
  27. package/dist/cjs/api/errorHandler.cjs +0 -14
  28. package/dist/cjs/api/verify.cjs +0 -140
  29. package/dist/cjs/index.cjs +0 -21
  30. package/dist/cjs/schedulers/captchaScheduler.cjs +0 -33
  31. package/dist/cjs/schedulers/getClientList.cjs +0 -31
  32. package/dist/cjs/tasks/client/clientTasks.cjs +0 -141
  33. package/dist/cjs/tasks/dataset/datasetTasks.cjs +0 -30
  34. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +0 -34
  35. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +0 -280
  36. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +0 -25
  37. package/dist/cjs/tasks/index.cjs +0 -4
  38. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +0 -132
  39. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +0 -26
  40. package/dist/cjs/tasks/tasks.cjs +0 -40
  41. package/dist/cjs/util.cjs +0 -45
  42. package/dist/index.d.ts +0 -9
  43. package/dist/index.d.ts.map +0 -1
  44. package/dist/index.js +0 -9
  45. package/dist/index.js.map +0 -1
  46. package/dist/schedulers/captchaScheduler.d.ts +0 -4
  47. package/dist/schedulers/captchaScheduler.d.ts.map +0 -1
  48. package/dist/schedulers/captchaScheduler.js +0 -28
  49. package/dist/schedulers/captchaScheduler.js.map +0 -1
  50. package/dist/schedulers/getClientList.d.ts +0 -4
  51. package/dist/schedulers/getClientList.d.ts.map +0 -1
  52. package/dist/schedulers/getClientList.js +0 -28
  53. package/dist/schedulers/getClientList.js.map +0 -1
  54. package/dist/tasks/client/clientTasks.d.ts +0 -12
  55. package/dist/tasks/client/clientTasks.d.ts.map +0 -1
  56. package/dist/tasks/client/clientTasks.js +0 -80
  57. package/dist/tasks/client/clientTasks.js.map +0 -1
  58. package/dist/tasks/dataset/datasetTasks.d.ts +0 -13
  59. package/dist/tasks/dataset/datasetTasks.d.ts.map +0 -1
  60. package/dist/tasks/dataset/datasetTasks.js +0 -19
  61. package/dist/tasks/dataset/datasetTasks.js.map +0 -1
  62. package/dist/tasks/dataset/datasetTasksUtils.d.ts +0 -3
  63. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +0 -1
  64. package/dist/tasks/dataset/datasetTasksUtils.js +0 -34
  65. package/dist/tasks/dataset/datasetTasksUtils.js.map +0 -1
  66. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +0 -28
  67. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +0 -1
  68. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +0 -208
  69. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +0 -1
  70. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +0 -7
  71. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +0 -1
  72. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +0 -18
  73. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +0 -1
  74. package/dist/tasks/index.d.ts +0 -2
  75. package/dist/tasks/index.d.ts.map +0 -1
  76. package/dist/tasks/index.js +0 -2
  77. package/dist/tasks/index.js.map +0 -1
  78. package/dist/tasks/powCaptcha/powTasks.d.ts +0 -13
  79. package/dist/tasks/powCaptcha/powTasks.d.ts.map +0 -1
  80. package/dist/tasks/powCaptcha/powTasks.js +0 -83
  81. package/dist/tasks/powCaptcha/powTasks.js.map +0 -1
  82. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +0 -3
  83. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +0 -1
  84. package/dist/tasks/powCaptcha/powTasksUtils.js +0 -22
  85. package/dist/tasks/powCaptcha/powTasksUtils.js.map +0 -1
  86. package/dist/tasks/tasks.d.ts +0 -22
  87. package/dist/tasks/tasks.d.ts.map +0 -1
  88. package/dist/tasks/tasks.js +0 -24
  89. package/dist/tasks/tasks.js.map +0 -1
  90. package/dist/tests/index.d.ts +0 -2
  91. package/dist/tests/index.d.ts.map +0 -1
  92. package/dist/tests/index.js +0 -2
  93. package/dist/tests/index.js.map +0 -1
  94. package/dist/tests/integration/imgCaptcha.integration.test.d.ts +0 -2
  95. package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +0 -1
  96. package/dist/tests/integration/imgCaptcha.integration.test.js +0 -115
  97. package/dist/tests/integration/imgCaptcha.integration.test.js.map +0 -1
  98. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +0 -32
  99. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +0 -1
  100. package/dist/tests/integration/mocks/solvedTestCaptchas.js +0 -1046
  101. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +0 -1
  102. package/dist/tests/integration/powCaptcha.integration.test.d.ts +0 -2
  103. package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +0 -1
  104. package/dist/tests/integration/powCaptcha.integration.test.js +0 -173
  105. package/dist/tests/integration/powCaptcha.integration.test.js.map +0 -1
  106. package/dist/tests/unit/api/authMiddleware.unit.test.d.ts +0 -2
  107. package/dist/tests/unit/api/authMiddleware.unit.test.d.ts.map +0 -1
  108. package/dist/tests/unit/api/authMiddleware.unit.test.js +0 -87
  109. package/dist/tests/unit/api/authMiddleware.unit.test.js.map +0 -1
  110. package/dist/tests/unit/api/errorHandler.unit.test.d.ts +0 -2
  111. package/dist/tests/unit/api/errorHandler.unit.test.d.ts.map +0 -1
  112. package/dist/tests/unit/api/errorHandler.unit.test.js +0 -65
  113. package/dist/tests/unit/api/errorHandler.unit.test.js.map +0 -1
  114. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +0 -2
  115. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +0 -1
  116. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +0 -63
  117. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +0 -1
  118. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +0 -2
  119. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +0 -1
  120. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +0 -172
  121. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +0 -1
  122. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +0 -2
  123. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +0 -1
  124. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +0 -86
  125. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +0 -1
  126. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +0 -2
  127. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +0 -1
  128. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +0 -75
  129. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +0 -1
  130. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +0 -2
  131. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +0 -1
  132. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +0 -266
  133. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +0 -1
  134. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +0 -2
  135. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +0 -1
  136. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +0 -46
  137. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +0 -1
  138. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +0 -2
  139. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +0 -1
  140. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +0 -209
  141. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +0 -1
  142. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +0 -2
  143. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +0 -1
  144. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +0 -65
  145. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +0 -1
  146. package/dist/util.d.ts +0 -6
  147. package/dist/util.d.ts.map +0 -1
  148. package/dist/util.js +0 -34
  149. package/dist/util.js.map +0 -1
@@ -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;
@@ -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;
@@ -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;