@prosopo/provider 2.1.4 → 2.1.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.
Files changed (263) hide show
  1. package/.dockerignore +5 -0
  2. package/dist/api/admin.d.ts +4 -0
  3. package/dist/api/admin.d.ts.map +1 -0
  4. package/dist/api/admin.js +36 -0
  5. package/dist/api/admin.js.map +1 -0
  6. package/dist/api/authMiddleware.d.ts +6 -0
  7. package/dist/api/authMiddleware.d.ts.map +1 -0
  8. package/dist/api/authMiddleware.js +66 -0
  9. package/dist/api/authMiddleware.js.map +1 -0
  10. package/dist/api/captcha.d.ts +4 -0
  11. package/dist/api/captcha.d.ts.map +1 -0
  12. package/dist/api/captcha.js +299 -0
  13. package/dist/api/captcha.js.map +1 -0
  14. package/dist/api/captchaScheduler.d.ts +4 -0
  15. package/dist/api/captchaScheduler.d.ts.map +1 -0
  16. package/dist/api/captchaScheduler.js +17 -0
  17. package/dist/api/captchaScheduler.js.map +1 -0
  18. package/dist/api/errorHandler.d.ts +11 -0
  19. package/dist/api/errorHandler.d.ts.map +1 -0
  20. package/dist/api/errorHandler.js +42 -0
  21. package/dist/api/errorHandler.js.map +1 -0
  22. package/dist/api/verify.d.ts +4 -0
  23. package/dist/api/verify.d.ts.map +1 -0
  24. package/dist/api/verify.js +98 -0
  25. package/dist/api/verify.js.map +1 -0
  26. package/dist/batch/commitments.d.ts +24 -0
  27. package/dist/batch/commitments.d.ts.map +1 -0
  28. package/dist/batch/commitments.js +130 -0
  29. package/dist/batch/commitments.js.map +1 -0
  30. package/dist/batch/index.d.ts +2 -0
  31. package/dist/batch/index.d.ts.map +1 -0
  32. package/dist/batch/index.js +2 -0
  33. package/dist/batch/index.js.map +1 -0
  34. package/dist/cjs/api/admin.cjs +37 -0
  35. package/dist/cjs/api/authMiddleware.cjs +66 -0
  36. package/dist/cjs/api/captcha.cjs +380 -0
  37. package/dist/cjs/api/errorHandler.cjs +42 -0
  38. package/dist/cjs/api/verify.cjs +120 -0
  39. package/dist/cjs/index.cjs +25 -0
  40. package/dist/cjs/schedulers/captchaScheduler.cjs +33 -0
  41. package/dist/cjs/schedulers/getClientList.cjs +31 -0
  42. package/dist/cjs/tasks/client/clientTasks.cjs +148 -0
  43. package/dist/cjs/tasks/dataset/datasetTasks.cjs +30 -0
  44. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +34 -0
  45. package/dist/cjs/tasks/detection/decodePayload.cjs +549 -0
  46. package/dist/cjs/tasks/detection/getBotScore.cjs +18 -0
  47. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +313 -0
  48. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +25 -0
  49. package/dist/cjs/tasks/index.cjs +4 -0
  50. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +134 -0
  51. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +26 -0
  52. package/dist/cjs/tasks/tasks.cjs +40 -0
  53. package/dist/cjs/util.cjs +45 -0
  54. package/dist/index.d.ts +10 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +10 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/scheduler.d.ts +4 -0
  59. package/dist/scheduler.d.ts.map +1 -0
  60. package/dist/scheduler.js +21 -0
  61. package/dist/scheduler.js.map +1 -0
  62. package/dist/schedulers/captchaScheduler.d.ts +4 -0
  63. package/dist/schedulers/captchaScheduler.d.ts.map +1 -0
  64. package/dist/schedulers/captchaScheduler.js +28 -0
  65. package/dist/schedulers/captchaScheduler.js.map +1 -0
  66. package/dist/schedulers/getClientList.d.ts +4 -0
  67. package/dist/schedulers/getClientList.d.ts.map +1 -0
  68. package/dist/schedulers/getClientList.js +28 -0
  69. package/dist/schedulers/getClientList.js.map +1 -0
  70. package/dist/tasks/client/clientTasks.d.ts +13 -0
  71. package/dist/tasks/client/clientTasks.d.ts.map +1 -0
  72. package/dist/tasks/client/clientTasks.js +87 -0
  73. package/dist/tasks/client/clientTasks.js.map +1 -0
  74. package/dist/tasks/dataset/datasetTasks.d.ts +13 -0
  75. package/dist/tasks/dataset/datasetTasks.d.ts.map +1 -0
  76. package/dist/tasks/dataset/datasetTasks.js +19 -0
  77. package/dist/tasks/dataset/datasetTasks.js.map +1 -0
  78. package/dist/tasks/dataset/datasetTasksUtils.d.ts +3 -0
  79. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -0
  80. package/dist/tasks/dataset/datasetTasksUtils.js +34 -0
  81. package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -0
  82. package/dist/tasks/detection/decodePayload.d.ts +3 -0
  83. package/dist/tasks/detection/decodePayload.d.ts.map +1 -0
  84. package/dist/tasks/detection/decodePayload.js +302 -0
  85. package/dist/tasks/detection/decodePayload.js.map +1 -0
  86. package/dist/tasks/detection/getBotScore.d.ts +2 -0
  87. package/dist/tasks/detection/getBotScore.d.ts.map +1 -0
  88. package/dist/tasks/detection/getBotScore.js +17 -0
  89. package/dist/tasks/detection/getBotScore.js.map +1 -0
  90. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +29 -0
  91. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -0
  92. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +242 -0
  93. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -0
  94. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +7 -0
  95. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +1 -0
  96. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +18 -0
  97. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -0
  98. package/dist/tasks/index.d.ts +2 -0
  99. package/dist/tasks/index.d.ts.map +1 -0
  100. package/dist/tasks/index.js +2 -0
  101. package/dist/tasks/index.js.map +1 -0
  102. package/dist/tasks/powCaptcha/powTasks.d.ts +13 -0
  103. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -0
  104. package/dist/tasks/powCaptcha/powTasks.js +84 -0
  105. package/dist/tasks/powCaptcha/powTasks.js.map +1 -0
  106. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +3 -0
  107. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -0
  108. package/dist/tasks/powCaptcha/powTasksUtils.js +22 -0
  109. package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -0
  110. package/dist/tasks/tasks.d.ts +22 -0
  111. package/dist/tasks/tasks.d.ts.map +1 -0
  112. package/dist/tasks/tasks.js +24 -0
  113. package/dist/tasks/tasks.js.map +1 -0
  114. package/dist/tests/accounts.d.ts +12 -0
  115. package/dist/tests/accounts.d.ts.map +1 -0
  116. package/dist/tests/accounts.js +35 -0
  117. package/dist/tests/accounts.js.map +1 -0
  118. package/dist/tests/contract/helpers.test.d.ts +6 -0
  119. package/dist/tests/contract/helpers.test.d.ts.map +1 -0
  120. package/dist/tests/contract/helpers.test.js +54 -0
  121. package/dist/tests/contract/helpers.test.js.map +1 -0
  122. package/dist/tests/dataUtils/DatabaseAccounts.d.ts +35 -0
  123. package/dist/tests/dataUtils/DatabaseAccounts.d.ts.map +1 -0
  124. package/dist/tests/dataUtils/DatabaseAccounts.js +84 -0
  125. package/dist/tests/dataUtils/DatabaseAccounts.js.map +1 -0
  126. package/dist/tests/dataUtils/DatabasePopulator.d.ts +73 -0
  127. package/dist/tests/dataUtils/DatabasePopulator.d.ts.map +1 -0
  128. package/dist/tests/dataUtils/DatabasePopulator.js +326 -0
  129. package/dist/tests/dataUtils/DatabasePopulator.js.map +1 -0
  130. package/dist/tests/dataUtils/dapp-example-contract/dapp.json +648 -0
  131. package/dist/tests/dataUtils/dapp-example-contract/loadFiles.d.ts +4 -0
  132. package/dist/tests/dataUtils/dapp-example-contract/loadFiles.d.ts.map +1 -0
  133. package/dist/tests/dataUtils/dapp-example-contract/loadFiles.js +27 -0
  134. package/dist/tests/dataUtils/dapp-example-contract/loadFiles.js.map +1 -0
  135. package/dist/tests/dataUtils/funds.d.ts +9 -0
  136. package/dist/tests/dataUtils/funds.d.ts.map +1 -0
  137. package/dist/tests/dataUtils/funds.js +105 -0
  138. package/dist/tests/dataUtils/funds.js.map +1 -0
  139. package/dist/tests/dataUtils/populateDatabase.d.ts +16 -0
  140. package/dist/tests/dataUtils/populateDatabase.d.ts.map +1 -0
  141. package/dist/tests/dataUtils/populateDatabase.js +72 -0
  142. package/dist/tests/dataUtils/populateDatabase.js.map +1 -0
  143. package/dist/tests/getUser.d.ts +4 -0
  144. package/dist/tests/getUser.d.ts.map +1 -0
  145. package/dist/tests/getUser.js +18 -0
  146. package/dist/tests/getUser.js.map +1 -0
  147. package/dist/tests/index.d.ts +2 -0
  148. package/dist/tests/index.d.ts.map +1 -0
  149. package/dist/tests/index.js +2 -0
  150. package/dist/tests/index.js.map +1 -0
  151. package/dist/tests/integration/imgCaptcha.integration.test.d.ts +2 -0
  152. package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +1 -0
  153. package/dist/tests/integration/imgCaptcha.integration.test.js +137 -0
  154. package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -0
  155. package/dist/tests/integration/imgCaptcha.test.d.ts +2 -0
  156. package/dist/tests/integration/imgCaptcha.test.d.ts.map +1 -0
  157. package/dist/tests/integration/imgCaptcha.test.js +103 -0
  158. package/dist/tests/integration/imgCaptcha.test.js.map +1 -0
  159. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +32 -0
  160. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +1 -0
  161. package/dist/tests/integration/mocks/solvedTestCaptchas.js +1046 -0
  162. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +1 -0
  163. package/dist/tests/integration/powCaptcha.integration.test.d.ts +2 -0
  164. package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +1 -0
  165. package/dist/tests/integration/powCaptcha.integration.test.js +222 -0
  166. package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -0
  167. package/dist/tests/integration/powCaptcha.test.d.ts +2 -0
  168. package/dist/tests/integration/powCaptcha.test.d.ts.map +1 -0
  169. package/dist/tests/integration/powCaptcha.test.js +133 -0
  170. package/dist/tests/integration/powCaptcha.test.js.map +1 -0
  171. package/dist/tests/integration/registerSitekey.d.ts +2 -0
  172. package/dist/tests/integration/registerSitekey.d.ts.map +1 -0
  173. package/dist/tests/integration/registerSitekey.js +28 -0
  174. package/dist/tests/integration/registerSitekey.js.map +1 -0
  175. package/dist/tests/tasks/tasks.test.d.ts +6 -0
  176. package/dist/tests/tasks/tasks.test.d.ts.map +1 -0
  177. package/dist/tests/tasks/tasks.test.js +636 -0
  178. package/dist/tests/tasks/tasks.test.js.map +1 -0
  179. package/dist/tests/unit/api/authMiddleware.test.d.ts +2 -0
  180. package/dist/tests/unit/api/authMiddleware.test.d.ts.map +1 -0
  181. package/dist/tests/unit/api/authMiddleware.test.js +87 -0
  182. package/dist/tests/unit/api/authMiddleware.test.js.map +1 -0
  183. package/dist/tests/unit/api/authMiddleware.unit.test.d.ts +2 -0
  184. package/dist/tests/unit/api/authMiddleware.unit.test.d.ts.map +1 -0
  185. package/dist/tests/unit/api/authMiddleware.unit.test.js +108 -0
  186. package/dist/tests/unit/api/authMiddleware.unit.test.js.map +1 -0
  187. package/dist/tests/unit/api/captchaScheduler.test.d.ts +2 -0
  188. package/dist/tests/unit/api/captchaScheduler.test.d.ts.map +1 -0
  189. package/dist/tests/unit/api/captchaScheduler.test.js +47 -0
  190. package/dist/tests/unit/api/captchaScheduler.test.js.map +1 -0
  191. package/dist/tests/unit/api/errorHandler.test.d.ts +2 -0
  192. package/dist/tests/unit/api/errorHandler.test.d.ts.map +1 -0
  193. package/dist/tests/unit/api/errorHandler.test.js +65 -0
  194. package/dist/tests/unit/api/errorHandler.test.js.map +1 -0
  195. package/dist/tests/unit/api/errorHandler.unit.test.d.ts +2 -0
  196. package/dist/tests/unit/api/errorHandler.unit.test.d.ts.map +1 -0
  197. package/dist/tests/unit/api/errorHandler.unit.test.js +100 -0
  198. package/dist/tests/unit/api/errorHandler.unit.test.js.map +1 -0
  199. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +2 -0
  200. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +1 -0
  201. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +63 -0
  202. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -0
  203. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +2 -0
  204. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +1 -0
  205. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +172 -0
  206. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -0
  207. package/dist/tests/unit/tasks/dataset/datasetTasks.test.d.ts +2 -0
  208. package/dist/tests/unit/tasks/dataset/datasetTasks.test.d.ts.map +1 -0
  209. package/dist/tests/unit/tasks/dataset/datasetTasks.test.js +82 -0
  210. package/dist/tests/unit/tasks/dataset/datasetTasks.test.js.map +1 -0
  211. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +2 -0
  212. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +1 -0
  213. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +86 -0
  214. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -0
  215. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.d.ts +2 -0
  216. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.d.ts.map +1 -0
  217. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.js +75 -0
  218. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.js.map +1 -0
  219. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +2 -0
  220. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +1 -0
  221. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +75 -0
  222. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -0
  223. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.d.ts +2 -0
  224. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.d.ts.map +1 -0
  225. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.js +245 -0
  226. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.js.map +1 -0
  227. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +2 -0
  228. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +1 -0
  229. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +266 -0
  230. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -0
  231. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.d.ts +2 -0
  232. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.d.ts.map +1 -0
  233. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.js +45 -0
  234. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.js.map +1 -0
  235. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +2 -0
  236. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +1 -0
  237. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +46 -0
  238. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -0
  239. package/dist/tests/unit/tasks/powCaptcha/powTasks.test.d.ts +2 -0
  240. package/dist/tests/unit/tasks/powCaptcha/powTasks.test.d.ts.map +1 -0
  241. package/dist/tests/unit/tasks/powCaptcha/powTasks.test.js +121 -0
  242. package/dist/tests/unit/tasks/powCaptcha/powTasks.test.js.map +1 -0
  243. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +2 -0
  244. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +1 -0
  245. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +209 -0
  246. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -0
  247. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.d.ts +2 -0
  248. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.d.ts.map +1 -0
  249. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.js +94 -0
  250. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.js.map +1 -0
  251. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +2 -0
  252. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +1 -0
  253. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +65 -0
  254. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -0
  255. package/dist/tests/util.test.d.ts +2 -0
  256. package/dist/tests/util.test.d.ts.map +1 -0
  257. package/dist/tests/util.test.js +23 -0
  258. package/dist/tests/util.test.js.map +1 -0
  259. package/dist/util.d.ts +6 -0
  260. package/dist/util.d.ts.map +1 -0
  261. package/dist/util.js +34 -0
  262. package/dist/util.js.map +1 -0
  263. package/package.json +14 -12
@@ -0,0 +1,380 @@
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 uuid = require("uuid");
10
+ const getBotScore = require("../tasks/detection/getBotScore.cjs");
11
+ const tasks = require("../tasks/tasks.cjs");
12
+ const errorHandler = require("./errorHandler.cjs");
13
+ const NO_IP_ADDRESS = "NO_IP_ADDRESS";
14
+ const DEFAULT_FRICTIONLESS_THRESHOLD = 0.5;
15
+ function prosopoRouter(env) {
16
+ const router = express.Router();
17
+ const tasks$1 = new tasks.Tasks(env);
18
+ const GetImageCaptchaChallengePath = `${types.ApiPaths.GetImageCaptchaChallenge}/:${types.ApiParams.datasetId}/:${types.ApiParams.user}/:${types.ApiParams.dapp}`;
19
+ router.get(GetImageCaptchaChallengePath, async (req, res, next) => {
20
+ let parsed;
21
+ try {
22
+ parsed = types.CaptchaRequestBody.parse(req.params);
23
+ } catch (err) {
24
+ return next(
25
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
26
+ context: { code: 400, error: err }
27
+ })
28
+ );
29
+ }
30
+ const { datasetId, user, dapp } = parsed;
31
+ try {
32
+ address.validateAddress(dapp, false, 42);
33
+ } catch (err) {
34
+ return next(
35
+ new common.ProsopoApiError("API.INVALID_SITE_KEY", {
36
+ context: { code: 400, error: err, siteKey: dapp }
37
+ })
38
+ );
39
+ }
40
+ try {
41
+ address.validateAddress(dapp, false, 42);
42
+ } catch (err) {
43
+ return next(
44
+ new common.ProsopoApiError("API.INVALID_SITE_KEY", {
45
+ context: { code: 400, error: err, siteKey: dapp }
46
+ })
47
+ );
48
+ }
49
+ try {
50
+ address.validateAddress(user, false, 42);
51
+ const clientRecord = await tasks$1.db.getClientRecord(dapp);
52
+ if (!clientRecord) {
53
+ return next(
54
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
55
+ context: { code: 400, siteKey: dapp }
56
+ })
57
+ );
58
+ }
59
+ const taskData = await tasks$1.imgCaptchaManager.getRandomCaptchasAndRequestHash(
60
+ datasetId,
61
+ user,
62
+ req.ip || NO_IP_ADDRESS,
63
+ util.flatten(req.headers, ",")
64
+ );
65
+ const captchaResponse = {
66
+ [types.ApiParams.status]: "ok",
67
+ [types.ApiParams.captchas]: taskData.captchas.map((captcha) => ({
68
+ ...captcha,
69
+ items: captcha.items.map(
70
+ (item) => datasets.parseCaptchaAssets(item, env.assetsResolver)
71
+ )
72
+ })),
73
+ [types.ApiParams.requestHash]: taskData.requestHash,
74
+ [types.ApiParams.timestamp]: taskData.timestamp.toString(),
75
+ [types.ApiParams.signature]: {
76
+ [types.ApiParams.provider]: {
77
+ [types.ApiParams.requestHash]: taskData.signedRequestHash
78
+ }
79
+ }
80
+ };
81
+ return res.json(captchaResponse);
82
+ } catch (err) {
83
+ tasks$1.logger.error({ err, params: req.params });
84
+ return next(
85
+ new common.ProsopoApiError("API.BAD_REQUEST", {
86
+ context: {
87
+ error: err,
88
+ code: 500,
89
+ params: req.params
90
+ }
91
+ })
92
+ );
93
+ }
94
+ });
95
+ router.post(types.ApiPaths.SubmitImageCaptchaSolution, async (req, res, next) => {
96
+ let parsed;
97
+ try {
98
+ parsed = types.CaptchaSolutionBody.parse(req.body);
99
+ } catch (err) {
100
+ return next(
101
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
102
+ context: { code: 400, error: err, body: req.body }
103
+ })
104
+ );
105
+ }
106
+ const { user, dapp } = parsed;
107
+ try {
108
+ address.validateAddress(dapp, false, 42);
109
+ } catch (err) {
110
+ return next(
111
+ new common.ProsopoApiError("API.INVALID_SITE_KEY", {
112
+ context: { code: 400, error: err, siteKey: dapp }
113
+ })
114
+ );
115
+ }
116
+ try {
117
+ address.validateAddress(user, false, 42);
118
+ const clientRecord = await tasks$1.db.getClientRecord(parsed.dapp);
119
+ if (!clientRecord) {
120
+ return next(
121
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
122
+ context: { code: 400, siteKey: dapp }
123
+ })
124
+ );
125
+ }
126
+ const result = await tasks$1.imgCaptchaManager.dappUserSolution(
127
+ user,
128
+ dapp,
129
+ parsed[types.ApiParams.requestHash],
130
+ parsed[types.ApiParams.captchas],
131
+ parsed[types.ApiParams.signature].user.timestamp,
132
+ Number.parseInt(parsed[types.ApiParams.timestamp]),
133
+ parsed[types.ApiParams.signature].provider.requestHash,
134
+ req.ip || NO_IP_ADDRESS,
135
+ util.flatten(req.headers, ",")
136
+ );
137
+ const returnValue = {
138
+ status: req.i18n.t(
139
+ result.verified ? "API.CAPTCHA_PASSED" : "API.CAPTCHA_FAILED"
140
+ ),
141
+ ...result
142
+ };
143
+ return res.json(returnValue);
144
+ } catch (err) {
145
+ tasks$1.logger.error({ err, body: req.body });
146
+ return next(
147
+ new common.ProsopoApiError("API.BAD_REQUEST", {
148
+ context: { code: 500, siteKey: req.body.dapp }
149
+ })
150
+ );
151
+ }
152
+ });
153
+ router.post(types.ApiPaths.GetPowCaptchaChallenge, async (req, res, next) => {
154
+ let parsed;
155
+ try {
156
+ parsed = types.GetPowCaptchaChallengeRequestBody.parse(req.body);
157
+ } catch (err) {
158
+ return next(
159
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
160
+ context: { code: 400, error: err }
161
+ })
162
+ );
163
+ }
164
+ const { user, dapp, sessionId } = parsed;
165
+ try {
166
+ address.validateAddress(dapp, false, 42);
167
+ } catch (err) {
168
+ return next(
169
+ new common.ProsopoApiError("API.INVALID_SITE_KEY", {
170
+ context: { code: 400, error: err, siteKey: dapp }
171
+ })
172
+ );
173
+ }
174
+ try {
175
+ address.validateAddress(user, false, 42);
176
+ const clientSettings = await tasks$1.db.getClientRecord(dapp);
177
+ const clientRecord = await tasks$1.db.getClientRecord(dapp);
178
+ if (!clientRecord) {
179
+ return next(
180
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
181
+ context: { code: 400, siteKey: dapp }
182
+ })
183
+ );
184
+ }
185
+ if (sessionId) {
186
+ const sessionRecord = await tasks$1.db.checkAndRemoveSession(sessionId);
187
+ if (!sessionRecord) {
188
+ return next(
189
+ new common.ProsopoApiError("API.BAD_REQUEST", {
190
+ context: { error: "Session ID not found", code: 400 }
191
+ })
192
+ );
193
+ }
194
+ } else if (!(clientSettings?.settings?.captchaType === "pow")) {
195
+ return next(
196
+ new common.ProsopoApiError("API.INCORRECT_CAPTCHA_TYPE", {
197
+ context: { code: 400, siteKey: dapp }
198
+ })
199
+ );
200
+ }
201
+ const origin = req.headers.origin;
202
+ if (!origin) {
203
+ return next(
204
+ new common.ProsopoApiError("API.BAD_REQUEST", {
205
+ context: { error: "Origin header not found", code: 400 }
206
+ })
207
+ );
208
+ }
209
+ const challenge = await tasks$1.powCaptchaManager.getPowCaptchaChallenge(
210
+ user,
211
+ dapp,
212
+ origin,
213
+ clientSettings?.settings?.powDifficulty
214
+ );
215
+ await tasks$1.db.storePowCaptchaRecord(
216
+ challenge.challenge,
217
+ {
218
+ requestedAtTimestamp: challenge.requestedAtTimestamp,
219
+ userAccount: user,
220
+ dappAccount: dapp
221
+ },
222
+ challenge.difficulty,
223
+ challenge.providerSignature,
224
+ req.ip || NO_IP_ADDRESS,
225
+ util.flatten(req.headers, ",")
226
+ );
227
+ const getPowCaptchaResponse = {
228
+ [types.ApiParams.status]: "ok",
229
+ [types.ApiParams.challenge]: challenge.challenge,
230
+ [types.ApiParams.difficulty]: challenge.difficulty,
231
+ [types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
232
+ [types.ApiParams.signature]: {
233
+ [types.ApiParams.provider]: {
234
+ [types.ApiParams.challenge]: challenge.providerSignature
235
+ }
236
+ }
237
+ };
238
+ return res.json(getPowCaptchaResponse);
239
+ } catch (err) {
240
+ tasks$1.logger.error({ err, body: req.body });
241
+ return next(
242
+ new common.ProsopoApiError("API.BAD_REQUEST", {
243
+ context: {
244
+ code: 500,
245
+ siteKey: req.body.dapp
246
+ }
247
+ })
248
+ );
249
+ }
250
+ });
251
+ router.post(types.ApiPaths.SubmitPowCaptchaSolution, async (req, res, next) => {
252
+ let parsed;
253
+ try {
254
+ parsed = types.SubmitPowCaptchaSolutionBody.parse(req.body);
255
+ } catch (err) {
256
+ return next(
257
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
258
+ context: { code: 400, error: err, body: req.body }
259
+ })
260
+ );
261
+ }
262
+ const {
263
+ challenge,
264
+ difficulty,
265
+ signature,
266
+ nonce,
267
+ verifiedTimeout,
268
+ dapp,
269
+ user
270
+ } = parsed;
271
+ try {
272
+ address.validateAddress(dapp, false, 42);
273
+ } catch (err) {
274
+ return next(
275
+ new common.ProsopoApiError("API.INVALID_SITE_KEY", {
276
+ context: { code: 400, error: err, siteKey: dapp }
277
+ })
278
+ );
279
+ }
280
+ try {
281
+ address.validateAddress(user, false, 42);
282
+ address.validateAddress(dapp, false, 42);
283
+ const clientRecord = await tasks$1.db.getClientRecord(dapp);
284
+ if (!clientRecord) {
285
+ return next(
286
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
287
+ context: { code: 400, siteKey: dapp }
288
+ })
289
+ );
290
+ }
291
+ const verified = await tasks$1.powCaptchaManager.verifyPowCaptchaSolution(
292
+ challenge,
293
+ difficulty,
294
+ signature.provider.challenge,
295
+ nonce,
296
+ verifiedTimeout,
297
+ signature.user.timestamp,
298
+ req.ip || NO_IP_ADDRESS,
299
+ util.flatten(req.headers, ",")
300
+ );
301
+ const response = { status: "ok", verified };
302
+ return res.json(response);
303
+ } catch (err) {
304
+ tasks$1.logger.error({ err, body: req.body });
305
+ return next(
306
+ new common.ProsopoApiError("API.BAD_REQUEST", {
307
+ context: {
308
+ code: 500,
309
+ siteKey: req.body.dapp
310
+ }
311
+ })
312
+ );
313
+ }
314
+ });
315
+ router.post(
316
+ types.ApiPaths.GetFrictionlessCaptchaChallenge,
317
+ async (req, res, next) => {
318
+ try {
319
+ const { token, dapp } = types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
320
+ const botScore = await getBotScore.getBotScore(token);
321
+ const clientConfig = await tasks$1.db.getClientRecord(dapp);
322
+ const botThreshold = clientConfig?.settings?.frictionlessThreshold || DEFAULT_FRICTIONLESS_THRESHOLD;
323
+ if (Number(botScore) > botThreshold) {
324
+ const response2 = {
325
+ [types.ApiParams.captchaType]: "image",
326
+ [types.ApiParams.status]: "ok"
327
+ };
328
+ return res.json(response2);
329
+ }
330
+ const sessionRecord = {
331
+ sessionId: uuid.v4(),
332
+ createdAt: /* @__PURE__ */ new Date()
333
+ };
334
+ await tasks$1.db.storeSessionRecord(sessionRecord);
335
+ const response = {
336
+ [types.ApiParams.captchaType]: "pow",
337
+ [types.ApiParams.sessionId]: sessionRecord.sessionId,
338
+ [types.ApiParams.status]: "ok"
339
+ };
340
+ return res.json(response);
341
+ } catch (err) {
342
+ console.error("Error in frictionless captcha challenge:", err);
343
+ tasks$1.logger.error(err);
344
+ return next(
345
+ new common.ProsopoApiError("API.BAD_REQUEST", {
346
+ context: { code: 400, error: err }
347
+ })
348
+ );
349
+ }
350
+ }
351
+ );
352
+ router.post(types.ApiPaths.UpdateProviderClients, async (req, res, next) => {
353
+ try {
354
+ await tasks$1.clientTaskManager.getClientList();
355
+ return res.json({ message: "Provider updated" });
356
+ } catch (err) {
357
+ tasks$1.logger.error(err);
358
+ return next(
359
+ new common.ProsopoApiError("API.BAD_REQUEST", {
360
+ context: { code: 400, error: err }
361
+ })
362
+ );
363
+ }
364
+ });
365
+ router.get(types.ApiPaths.GetProviderDetails, async (req, res, next) => {
366
+ try {
367
+ return res.json({ version: util.version, ...{ message: "Provider online" } });
368
+ } catch (err) {
369
+ tasks$1.logger.error({ err, params: req.params });
370
+ return next(
371
+ new common.ProsopoApiError("API.BAD_REQUEST", {
372
+ context: { code: 500 }
373
+ })
374
+ );
375
+ }
376
+ });
377
+ router.use(errorHandler.handleErrors);
378
+ return router;
379
+ }
380
+ exports.prosopoRouter = prosopoRouter;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const common = require("@prosopo/common");
4
+ const locale = require("@prosopo/locale");
5
+ const zod = require("zod");
6
+ const handleErrors = (err, request, response, next) => {
7
+ const { code, statusMessage, jsonError } = unwrapError(err);
8
+ response.statusMessage = statusMessage;
9
+ response.set("content-type", "application/json");
10
+ response.status(code);
11
+ response.send({ error: jsonError });
12
+ response.end();
13
+ };
14
+ const unwrapError = (err) => {
15
+ const code = "code" in err ? err.code : 400;
16
+ let message = err.message;
17
+ let jsonError = { code, message };
18
+ let statusMessage = err.message;
19
+ jsonError.message = message;
20
+ while (err instanceof common.ProsopoBaseError && err.context) {
21
+ jsonError.code = err.context.translationKey || err.translationKey || jsonError.code;
22
+ jsonError.message = err.message;
23
+ if (err.context.error) {
24
+ err = err.context.error;
25
+ } else {
26
+ break;
27
+ }
28
+ }
29
+ if (err instanceof zod.ZodError) {
30
+ message = locale.i18n.t("CAPTCHA.PARSE_ERROR");
31
+ statusMessage = message;
32
+ if (typeof err.message === "object") {
33
+ jsonError = err.message;
34
+ } else {
35
+ jsonError.message = JSON.parse(err.message);
36
+ }
37
+ }
38
+ jsonError.code = jsonError.code || code;
39
+ return { code, statusMessage, jsonError };
40
+ };
41
+ exports.handleErrors = handleErrors;
42
+ exports.unwrapError = unwrapError;
@@ -0,0 +1,120 @@
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 types = require("@prosopo/types");
6
+ const express = require("express");
7
+ const tasks = require("../tasks/tasks.cjs");
8
+ const authMiddleware = require("./authMiddleware.cjs");
9
+ const errorHandler = require("./errorHandler.cjs");
10
+ function prosopoVerifyRouter(env) {
11
+ const router = express.Router();
12
+ const tasks$1 = new tasks.Tasks(env);
13
+ router.post(
14
+ types.ApiPaths.VerifyImageCaptchaSolutionDapp,
15
+ async (req, res, next) => {
16
+ let parsed;
17
+ try {
18
+ parsed = types.VerifySolutionBody.parse(req.body);
19
+ } catch (err) {
20
+ return next(
21
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
22
+ context: { code: 400, error: err, body: req.body }
23
+ })
24
+ );
25
+ }
26
+ const { dappSignature, token } = parsed;
27
+ try {
28
+ const { user, dapp, timestamp, commitmentId } = types.decodeProcaptchaOutput(token);
29
+ address.validateAddress(dapp, false, 42);
30
+ address.validateAddress(user, false, 42);
31
+ const clientRecord = await tasks$1.db.getClientRecord(dapp);
32
+ if (!clientRecord) {
33
+ return next(
34
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
35
+ context: { code: 400, siteKey: dapp }
36
+ })
37
+ );
38
+ }
39
+ const keyPair = env.keyring.addFromAddress(dapp);
40
+ authMiddleware.verifySignature(dappSignature, timestamp.toString(), keyPair);
41
+ const response = await tasks$1.imgCaptchaManager.verifyImageCaptchaSolution(
42
+ user,
43
+ dapp,
44
+ commitmentId,
45
+ parsed.maxVerifiedTime
46
+ );
47
+ const verificationResponse = {
48
+ [types.ApiParams.status]: req.t(response.status),
49
+ [types.ApiParams.verified]: response[types.ApiParams.verified],
50
+ ...response.commitmentId && {
51
+ [types.ApiParams.commitmentId]: response.commitmentId
52
+ }
53
+ };
54
+ res.json(verificationResponse);
55
+ } catch (err) {
56
+ tasks$1.logger.error({ err, body: req.body });
57
+ return next(
58
+ new common.ProsopoApiError("API.BAD_REQUEST", {
59
+ context: { code: 500 }
60
+ })
61
+ );
62
+ }
63
+ }
64
+ );
65
+ router.post(types.ApiPaths.VerifyPowCaptchaSolution, async (req, res, next) => {
66
+ let parsed;
67
+ try {
68
+ parsed = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
69
+ } catch (err) {
70
+ return next(
71
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
72
+ context: { code: 400, error: err, body: req.body }
73
+ })
74
+ );
75
+ }
76
+ try {
77
+ const { token, dappSignature, verifiedTimeout } = parsed;
78
+ const { dapp, user, timestamp, challenge } = types.decodeProcaptchaOutput(token);
79
+ address.validateAddress(dapp, false, 42);
80
+ address.validateAddress(user, false, 42);
81
+ const clientRecord = await tasks$1.db.getClientRecord(dapp);
82
+ if (!clientRecord) {
83
+ return next(
84
+ new common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
85
+ context: { code: 400, siteKey: dapp }
86
+ })
87
+ );
88
+ }
89
+ if (!challenge) {
90
+ const unverifiedResponse = {
91
+ status: req.t("API.USER_NOT_VERIFIED"),
92
+ [types.ApiParams.verified]: false
93
+ };
94
+ return res.json(unverifiedResponse);
95
+ }
96
+ const dappPair = env.keyring.addFromAddress(dapp);
97
+ authMiddleware.verifySignature(dappSignature, timestamp.toString(), dappPair);
98
+ const approved = await tasks$1.powCaptchaManager.serverVerifyPowCaptchaSolution(
99
+ dapp,
100
+ challenge,
101
+ verifiedTimeout
102
+ );
103
+ const verificationResponse = {
104
+ status: req.t(approved ? "API.USER_VERIFIED" : "API.USER_NOT_VERIFIED"),
105
+ [types.ApiParams.verified]: approved
106
+ };
107
+ return res.json(verificationResponse);
108
+ } catch (err) {
109
+ tasks$1.logger.error({ err, body: req.body });
110
+ return next(
111
+ new common.ProsopoApiError("API.BAD_REQUEST", {
112
+ context: { code: 500 }
113
+ })
114
+ );
115
+ }
116
+ });
117
+ router.use(errorHandler.handleErrors);
118
+ return router;
119
+ }
120
+ exports.prosopoVerifyRouter = prosopoVerifyRouter;
@@ -0,0 +1,25 @@
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 authMiddleware = require("./api/authMiddleware.cjs");
10
+ const captchaScheduler = require("./schedulers/captchaScheduler.cjs");
11
+ const getClientList = require("./schedulers/getClientList.cjs");
12
+ const tasks = require("./tasks/tasks.cjs");
13
+ exports.checkIfTaskIsRunning = util.checkIfTaskIsRunning;
14
+ exports.encodeStringAddress = util.encodeStringAddress;
15
+ exports.shuffleArray = util.shuffleArray;
16
+ exports.prosopoRouter = captcha.prosopoRouter;
17
+ exports.prosopoVerifyRouter = verify.prosopoVerifyRouter;
18
+ exports.prosopoAdminRouter = admin.prosopoAdminRouter;
19
+ exports.handleErrors = errorHandler.handleErrors;
20
+ exports.unwrapError = errorHandler.unwrapError;
21
+ exports.authMiddleware = authMiddleware.authMiddleware;
22
+ exports.verifySignature = authMiddleware.verifySignature;
23
+ exports.storeCaptchasExternally = captchaScheduler.storeCaptchasExternally;
24
+ exports.getClientList = getClientList.getClientList;
25
+ exports.Tasks = tasks.Tasks;
@@ -0,0 +1,33 @@
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;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const env = require("@prosopo/env");
4
+ const types = require("@prosopo/types");
5
+ const cron = require("cron");
6
+ const tasks = require("../tasks/tasks.cjs");
7
+ const util = require("../util.cjs");
8
+ async function 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;