@prosopo/provider 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -258
- package/dist/api/admin.d.ts +2 -2
- package/dist/api/admin.d.ts.map +1 -1
- package/dist/api/admin.js +5 -64
- package/dist/api/admin.js.map +1 -1
- package/dist/api/authMiddleware.d.ts +4 -4
- package/dist/api/authMiddleware.d.ts.map +1 -1
- package/dist/api/authMiddleware.js +15 -29
- package/dist/api/authMiddleware.js.map +1 -1
- package/dist/api/captcha.d.ts +2 -2
- package/dist/api/captcha.d.ts.map +1 -1
- package/dist/api/captcha.js +64 -55
- package/dist/api/captcha.js.map +1 -1
- package/dist/api/captchaScheduler.d.ts +2 -2
- package/dist/api/captchaScheduler.d.ts.map +1 -1
- package/dist/api/captchaScheduler.js +11 -10
- package/dist/api/captchaScheduler.js.map +1 -1
- package/dist/api/errorHandler.d.ts +3 -3
- package/dist/api/errorHandler.d.ts.map +1 -1
- package/dist/api/errorHandler.js +7 -3
- package/dist/api/errorHandler.js.map +1 -1
- package/dist/api/verify.d.ts +2 -2
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +37 -29
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/admin.cjs +2 -89
- package/dist/cjs/api/authMiddleware.cjs +1 -15
- package/dist/cjs/api/captcha.cjs +89 -52
- package/dist/cjs/api/captchaScheduler.cjs +4 -7
- package/dist/cjs/api/errorHandler.cjs +3 -1
- package/dist/cjs/api/verify.cjs +54 -28
- package/dist/cjs/index.cjs +0 -3
- package/dist/cjs/tasks/dataset/datasetTasks.cjs +68 -0
- package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +34 -0
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +277 -0
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +25 -0
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +107 -0
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +55 -0
- package/dist/cjs/tasks/tasks.cjs +21 -524
- package/dist/cjs/util.cjs +32 -19
- package/dist/index.d.ts +7 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -8
- package/dist/index.js.map +1 -1
- package/dist/tasks/dataset/datasetTasks.d.ts +15 -0
- package/dist/tasks/dataset/datasetTasks.d.ts.map +1 -0
- package/dist/tasks/dataset/datasetTasks.js +40 -0
- package/dist/tasks/dataset/datasetTasks.js.map +1 -0
- package/dist/tasks/dataset/datasetTasksUtils.d.ts +3 -0
- package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -0
- package/dist/tasks/dataset/datasetTasksUtils.js +34 -0
- package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +28 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +212 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +7 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +18 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -0
- package/dist/tasks/index.d.ts +1 -1
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/index.js +1 -1
- package/dist/tasks/index.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.d.ts +13 -0
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -0
- package/dist/tasks/powCaptcha/powTasks.js +66 -0
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts +5 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.js +49 -0
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -0
- package/dist/tasks/tasks.d.ts +12 -43
- package/dist/tasks/tasks.d.ts.map +1 -1
- package/dist/tasks/tasks.js +13 -431
- package/dist/tasks/tasks.js.map +1 -1
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.d.ts.map +1 -0
- package/dist/tests/index.js +2 -0
- package/dist/tests/index.js.map +1 -0
- package/dist/tests/integration/imgCaptcha.test.d.ts +2 -0
- package/dist/tests/integration/imgCaptcha.test.d.ts.map +1 -0
- package/dist/tests/integration/imgCaptcha.test.js +111 -0
- package/dist/tests/integration/imgCaptcha.test.js.map +1 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +32 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +1 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.js +1042 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +1 -0
- package/dist/tests/integration/powCaptcha.test.d.ts +2 -0
- package/dist/tests/integration/powCaptcha.test.d.ts.map +1 -0
- package/dist/tests/integration/powCaptcha.test.js +171 -0
- package/dist/tests/integration/powCaptcha.test.js.map +1 -0
- package/dist/tests/unit/api/authMiddleware.test.d.ts +2 -0
- package/dist/tests/unit/api/authMiddleware.test.d.ts.map +1 -0
- package/dist/tests/unit/api/authMiddleware.test.js +87 -0
- package/dist/tests/unit/api/authMiddleware.test.js.map +1 -0
- package/dist/tests/unit/api/captchaScheduler.test.d.ts +2 -0
- package/dist/tests/unit/api/captchaScheduler.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captchaScheduler.test.js +47 -0
- package/dist/tests/unit/api/captchaScheduler.test.js.map +1 -0
- package/dist/tests/unit/api/errorHandler.test.d.ts +2 -0
- package/dist/tests/unit/api/errorHandler.test.d.ts.map +1 -0
- package/dist/tests/unit/api/errorHandler.test.js +65 -0
- package/dist/tests/unit/api/errorHandler.test.js.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.test.d.ts +2 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.test.js +88 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.test.js.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.d.ts +2 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.js +75 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.js.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.d.ts +2 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.js +260 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.js.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.d.ts +2 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.js +46 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.test.d.ts +2 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.test.js +133 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.d.ts +2 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.js +94 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.js.map +1 -0
- package/dist/util.d.ts +2 -2
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +10 -8
- package/dist/util.js.map +1 -1
- package/package.json +74 -86
- package/vite.cjs.config.ts +3 -3
- package/vite.test.config.ts +12 -12
- package/dist/batch/commitments.d.ts +0 -24
- package/dist/batch/commitments.d.ts.map +0 -1
- package/dist/batch/commitments.js +0 -130
- package/dist/batch/commitments.js.map +0 -1
- package/dist/batch/index.d.ts +0 -2
- package/dist/batch/index.d.ts.map +0 -1
- package/dist/batch/index.js +0 -2
- package/dist/batch/index.js.map +0 -1
- package/dist/cjs/batch/commitments.cjs +0 -158
- package/dist/cjs/batch/index.cjs +0 -4
- package/dist/scheduler.d.ts +0 -4
- package/dist/scheduler.d.ts.map +0 -1
- package/dist/scheduler.js +0 -21
- package/dist/scheduler.js.map +0 -1
- package/dist/tests/accounts.d.ts +0 -12
- package/dist/tests/accounts.d.ts.map +0 -1
- package/dist/tests/accounts.js +0 -35
- package/dist/tests/accounts.js.map +0 -1
- package/dist/tests/contract/helpers.test.d.ts +0 -6
- package/dist/tests/contract/helpers.test.d.ts.map +0 -1
- package/dist/tests/contract/helpers.test.js +0 -54
- package/dist/tests/contract/helpers.test.js.map +0 -1
- package/dist/tests/dataUtils/DatabaseAccounts.d.ts +0 -35
- package/dist/tests/dataUtils/DatabaseAccounts.d.ts.map +0 -1
- package/dist/tests/dataUtils/DatabaseAccounts.js +0 -84
- package/dist/tests/dataUtils/DatabaseAccounts.js.map +0 -1
- package/dist/tests/dataUtils/DatabasePopulator.d.ts +0 -73
- package/dist/tests/dataUtils/DatabasePopulator.d.ts.map +0 -1
- package/dist/tests/dataUtils/DatabasePopulator.js +0 -326
- package/dist/tests/dataUtils/DatabasePopulator.js.map +0 -1
- package/dist/tests/dataUtils/dapp-example-contract/dapp.json +0 -648
- package/dist/tests/dataUtils/dapp-example-contract/loadFiles.d.ts +0 -4
- package/dist/tests/dataUtils/dapp-example-contract/loadFiles.d.ts.map +0 -1
- package/dist/tests/dataUtils/dapp-example-contract/loadFiles.js +0 -27
- package/dist/tests/dataUtils/dapp-example-contract/loadFiles.js.map +0 -1
- package/dist/tests/dataUtils/funds.d.ts +0 -9
- package/dist/tests/dataUtils/funds.d.ts.map +0 -1
- package/dist/tests/dataUtils/funds.js +0 -105
- package/dist/tests/dataUtils/funds.js.map +0 -1
- package/dist/tests/dataUtils/populateDatabase.d.ts +0 -16
- package/dist/tests/dataUtils/populateDatabase.d.ts.map +0 -1
- package/dist/tests/dataUtils/populateDatabase.js +0 -72
- package/dist/tests/dataUtils/populateDatabase.js.map +0 -1
- package/dist/tests/getUser.d.ts +0 -4
- package/dist/tests/getUser.d.ts.map +0 -1
- package/dist/tests/getUser.js +0 -18
- package/dist/tests/getUser.js.map +0 -1
- package/dist/tests/tasks/tasks.test.d.ts +0 -6
- package/dist/tests/tasks/tasks.test.d.ts.map +0 -1
- package/dist/tests/tasks/tasks.test.js +0 -636
- package/dist/tests/tasks/tasks.test.js.map +0 -1
- package/dist/tests/util.test.d.ts +0 -2
- package/dist/tests/util.test.d.ts.map +0 -1
- package/dist/tests/util.test.js +0 -23
- package/dist/tests/util.test.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Logger } from "@prosopo/common";
|
|
2
|
+
import type { CaptchaConfig, DatasetRaw, ProsopoConfigOutput, StoredEvents } from "@prosopo/types";
|
|
3
|
+
import type { Database } from "@prosopo/types-database";
|
|
4
|
+
export declare class DatasetManager {
|
|
5
|
+
config: ProsopoConfigOutput;
|
|
6
|
+
logger: Logger;
|
|
7
|
+
captchaConfig: CaptchaConfig;
|
|
8
|
+
db: Database;
|
|
9
|
+
constructor(config: ProsopoConfigOutput, logger: Logger, captchaConfig: CaptchaConfig, db: Database);
|
|
10
|
+
providerSetDatasetFromFile(file: JSON): Promise<void>;
|
|
11
|
+
providerSetDataset(datasetRaw: DatasetRaw): Promise<void>;
|
|
12
|
+
saveCaptchaEvent(events: StoredEvents, accountId: string): Promise<void>;
|
|
13
|
+
storeCommitmentsExternal(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=datasetTasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasetTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/dataset/datasetTasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAgB9C,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EAEV,mBAAmB,EACnB,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAwB,MAAM,yBAAyB,CAAC;AAG9E,qBAAa,cAAc;IACzB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,EAAE,EAAE,QAAQ,CAAC;gBAGX,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,EAAE,EAAE,QAAQ;IAaR,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzD,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM;IAYxD,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBhD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { saveCaptchaEvent, saveCaptchas } from "@prosopo/database";
|
|
2
|
+
import { parseCaptchaDataset } from "@prosopo/datasets";
|
|
3
|
+
import { providerValidateDataset } from "./datasetTasksUtils.js";
|
|
4
|
+
export class DatasetManager {
|
|
5
|
+
constructor(config, logger, captchaConfig, db) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.logger = logger;
|
|
8
|
+
this.captchaConfig = captchaConfig;
|
|
9
|
+
this.db = db;
|
|
10
|
+
}
|
|
11
|
+
async providerSetDatasetFromFile(file) {
|
|
12
|
+
const datasetRaw = parseCaptchaDataset(file);
|
|
13
|
+
return await this.providerSetDataset(datasetRaw);
|
|
14
|
+
}
|
|
15
|
+
async providerSetDataset(datasetRaw) {
|
|
16
|
+
const dataset = await providerValidateDataset(datasetRaw, this.captchaConfig.solved.count, this.captchaConfig.unsolved.count);
|
|
17
|
+
await this.db?.storeDataset(dataset);
|
|
18
|
+
}
|
|
19
|
+
async saveCaptchaEvent(events, accountId) {
|
|
20
|
+
if (!this.config.devOnlyWatchEvents || !this.config.mongoEventsUri) {
|
|
21
|
+
this.logger.info("Dev watch events not set to true, not saving events");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
await saveCaptchaEvent(events, accountId, this.config.mongoEventsUri);
|
|
25
|
+
}
|
|
26
|
+
async storeCommitmentsExternal() {
|
|
27
|
+
if (!this.config.mongoCaptchaUri) {
|
|
28
|
+
this.logger.info("Mongo env not set");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const commitments = await this.db.getUnstoredDappUserCommitments();
|
|
32
|
+
this.logger.info(`Storing ${commitments.length} commitments externally`);
|
|
33
|
+
const powRecords = await this.db.getUnstoredDappUserPoWCommitments();
|
|
34
|
+
this.logger.info(`Storing ${powRecords.length} pow challenges externally`);
|
|
35
|
+
await saveCaptchas(commitments, powRecords, this.config.mongoCaptchaUri);
|
|
36
|
+
await this.db.markDappUserCommitmentsStored(commitments.map((commitment) => commitment.id));
|
|
37
|
+
await this.db.markDappUserPoWCommitmentsStored(powRecords.map((powRecords) => powRecords.challenge));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=datasetTasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasetTasks.js","sourceRoot":"","sources":["../../../src/tasks/dataset/datasetTasks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAcnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AASxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,OAAO,cAAc;IAMzB,YACE,MAA2B,EAC3B,MAAc,EACd,aAA4B,EAC5B,EAAY;QAEZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAOD,KAAK,CAAC,0BAA0B,CAAC,IAAU;QACzC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB;QAC7C,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAC3C,UAAU,EACV,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAC/B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAClC,CAAC;QAEF,MAAM,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAWD,KAAK,CAAC,gBAAgB,CAAC,MAAoB,EAAE,SAAiB;QAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAClE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACxE,OAAO;SACR;QACD,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACxE,CAAC;IAMD,KAAK,CAAC,wBAAwB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACtC,OAAO;SACR;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,8BAA8B,EAAE,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,WAAW,CAAC,MAAM,yBAAyB,CAAC,CAAC;QAEzE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,iCAAiC,EAAE,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,MAAM,4BAA4B,CAAC,CAAC;QAE3E,MAAM,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,EAAE,CAAC,6BAA6B,CACzC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAC/C,CAAC;QACF,MAAM,IAAI,CAAC,EAAE,CAAC,gCAAgC,CAC5C,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CACrD,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasetTasksUtils.d.ts","sourceRoot":"","sources":["../../../src/tasks/dataset/datasetTasksUtils.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,eAAO,MAAM,uBAAuB,eACvB,UAAU,qBACH,MAAM,uBACJ,MAAM,8CAyC3B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ProsopoEnvError } from "@prosopo/common";
|
|
2
|
+
import { buildDataset } from "@prosopo/datasets";
|
|
3
|
+
export const providerValidateDataset = async (datasetRaw, minSolvedCaptchas, minUnsolvedCaptchas) => {
|
|
4
|
+
if (datasetRaw.captchas.length < minSolvedCaptchas + minUnsolvedCaptchas) {
|
|
5
|
+
throw new ProsopoEnvError("DATASET.CAPTCHAS_COUNT_LESS_THAN_CONFIGURED", {
|
|
6
|
+
context: { failedFuncName: providerValidateDataset.name },
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
const solutions = datasetRaw.captchas
|
|
10
|
+
.map((captcha) => (captcha.solution ? 1 : 0))
|
|
11
|
+
.reduce((partialSum, b) => partialSum + b, 0);
|
|
12
|
+
if (solutions < minSolvedCaptchas) {
|
|
13
|
+
throw new ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
|
|
14
|
+
context: { failedFuncName: providerValidateDataset.name },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (solutions < minUnsolvedCaptchas) {
|
|
18
|
+
throw new ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
|
|
19
|
+
context: { failedFuncName: providerValidateDataset.name },
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const dataset = await buildDataset(datasetRaw);
|
|
23
|
+
if (!dataset.datasetId || !dataset.datasetContentId) {
|
|
24
|
+
throw new 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
|
+
//# sourceMappingURL=datasetTasksUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasetTasksUtils.js","sourceRoot":"","sources":["../../../src/tasks/dataset/datasetTasksUtils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC3C,UAAsB,EACtB,iBAAyB,EACzB,mBAA2B,EAC1B,EAAE;IAEH,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,iBAAiB,GAAG,mBAAmB,EAAE;QACzE,MAAM,IAAI,eAAe,CAAC,6CAA6C,EAAE;YACxE,OAAO,EAAE,EAAE,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE;SACzD,CAAC,CAAC;KACH;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ;SACnC,GAAG,CAAC,CAAC,OAAO,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAG/C,IAAI,SAAS,GAAG,iBAAiB,EAAE;QAClC,MAAM,IAAI,eAAe,CAAC,8CAA8C,EAAE;YACzE,OAAO,EAAE,EAAE,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE;SACzD,CAAC,CAAC;KACH;IAGD,IAAI,SAAS,GAAG,mBAAmB,EAAE;QACpC,MAAM,IAAI,eAAe,CAAC,8CAA8C,EAAE;YACzE,OAAO,EAAE,EAAE,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE;SACzD,CAAC,CAAC;KACH;IAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IAG/C,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;QACpD,MAAM,IAAI,eAAe,CAAC,8BAA8B,EAAE;YACzD,OAAO,EAAE;gBACR,cAAc,EAAE,uBAAuB,CAAC,IAAI;gBAC5C,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;aAC1C;SACD,CAAC,CAAC;KACH;IAED,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { KeyringPair } from "@polkadot/keyring/types";
|
|
2
|
+
import { type Logger } from "@prosopo/common";
|
|
3
|
+
import { type Captcha, type CaptchaConfig, type CaptchaSolution, type DappUserSolutionResult, type Hash, type PendingCaptchaRequest } from "@prosopo/types";
|
|
4
|
+
import type { Database, UserCommitmentRecord } from "@prosopo/types-database";
|
|
5
|
+
export declare class ImgCaptchaManager {
|
|
6
|
+
db: Database;
|
|
7
|
+
pair: KeyringPair;
|
|
8
|
+
logger: Logger;
|
|
9
|
+
captchaConfig: CaptchaConfig;
|
|
10
|
+
constructor(db: Database, pair: KeyringPair, logger: Logger, captchaConfig: CaptchaConfig);
|
|
11
|
+
getCaptchaWithProof(datasetId: Hash, solved: boolean, size: number): Promise<Captcha[]>;
|
|
12
|
+
getRandomCaptchasAndRequestHash(datasetId: string, userAccount: string): Promise<{
|
|
13
|
+
captchas: Captcha[];
|
|
14
|
+
requestHash: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
signedTimestamp: string;
|
|
17
|
+
}>;
|
|
18
|
+
dappUserSolution(userAccount: string, dappAccount: string, requestHash: string, captchas: CaptchaSolution[], requestHashSignature: string, timestamp: number, timestampSignature: string): Promise<DappUserSolutionResult>;
|
|
19
|
+
validateReceivedCaptchasAgainstStoredCaptchas(captchas: CaptchaSolution[]): Promise<{
|
|
20
|
+
storedCaptchas: Captcha[];
|
|
21
|
+
receivedCaptchas: CaptchaSolution[];
|
|
22
|
+
captchaIds: string[];
|
|
23
|
+
}>;
|
|
24
|
+
validateDappUserSolutionRequestIsPending(requestHash: string, pendingRecord: PendingCaptchaRequest, userAccount: string, captchaIds: string[]): Promise<boolean>;
|
|
25
|
+
getDappUserCommitmentById(commitmentId: string): Promise<UserCommitmentRecord>;
|
|
26
|
+
getDappUserCommitmentByAccount(userAccount: string): Promise<UserCommitmentRecord | undefined>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=imgCaptchaTasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imgCaptchaTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/imgCaptcha/imgCaptchaTasks.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAM/D,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,eAAe,EAGpB,KAAK,sBAAsB,EAC3B,KAAK,IAAI,EACT,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAK9E,qBAAa,iBAAiB;IAC5B,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;gBAG3B,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa;IAQxB,mBAAmB,CACvB,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,EAAE,CAAC;IAgBf,+BAA+B,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IA8EI,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,eAAe,EAAE,EAC3B,oBAAoB,EAAE,MAAM,EAC5B,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,sBAAsB,CAAC;IAmH5B,6CAA6C,CACjD,QAAQ,EAAE,eAAe,EAAE,GAC1B,OAAO,CAAC;QACT,cAAc,EAAE,OAAO,EAAE,CAAC;QAC1B,gBAAgB,EAAE,eAAe,EAAE,CAAC;QACpC,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAqCI,wCAAwC,CAC5C,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,qBAAqB,EACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,OAAO,CAAC;IA2Bb,yBAAyB,CAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,CAAC;IAe1B,8BAA8B,CAClC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;CAY7C"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { hexToU8a, stringToHex, u8aToHex } from "@polkadot/util";
|
|
2
|
+
import { randomAsHex, signatureVerify } from "@polkadot/util-crypto";
|
|
3
|
+
import { ProsopoEnvError } from "@prosopo/common";
|
|
4
|
+
import { compareCaptchaSolutions, computePendingRequestHash, parseAndSortCaptchaSolutions, } from "@prosopo/datasets";
|
|
5
|
+
import { CaptchaStatus, DEFAULT_IMAGE_CAPTCHA_TIMEOUT, } from "@prosopo/types";
|
|
6
|
+
import { at } from "@prosopo/util";
|
|
7
|
+
import { shuffleArray } from "../../util.js";
|
|
8
|
+
import { buildTreeAndGetCommitmentId } from "./imgCaptchaTasksUtils.js";
|
|
9
|
+
export class ImgCaptchaManager {
|
|
10
|
+
constructor(db, pair, logger, captchaConfig) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
this.pair = pair;
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
this.captchaConfig = captchaConfig;
|
|
15
|
+
}
|
|
16
|
+
async getCaptchaWithProof(datasetId, solved, size) {
|
|
17
|
+
const captchaDocs = await this.db.getRandomCaptcha(solved, datasetId, size);
|
|
18
|
+
if (!captchaDocs) {
|
|
19
|
+
throw new ProsopoEnvError("DATABASE.CAPTCHA_GET_FAILED", {
|
|
20
|
+
context: {
|
|
21
|
+
failedFuncName: this.getCaptchaWithProof.name,
|
|
22
|
+
datasetId,
|
|
23
|
+
solved,
|
|
24
|
+
size,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return captchaDocs;
|
|
29
|
+
}
|
|
30
|
+
async getRandomCaptchasAndRequestHash(datasetId, userAccount) {
|
|
31
|
+
const dataset = await this.db.getDatasetDetails(datasetId);
|
|
32
|
+
if (!dataset) {
|
|
33
|
+
throw new ProsopoEnvError("DATABASE.DATASET_GET_FAILED", {
|
|
34
|
+
context: {
|
|
35
|
+
failedFuncName: this.getRandomCaptchasAndRequestHash.name,
|
|
36
|
+
dataset,
|
|
37
|
+
datasetId,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const unsolvedCount = Math.abs(Math.trunc(this.captchaConfig.unsolved.count));
|
|
42
|
+
const solvedCount = Math.abs(Math.trunc(this.captchaConfig.solved.count));
|
|
43
|
+
if (!solvedCount) {
|
|
44
|
+
throw new ProsopoEnvError("CONFIG.INVALID_CAPTCHA_NUMBER");
|
|
45
|
+
}
|
|
46
|
+
const solved = await this.getCaptchaWithProof(datasetId, true, solvedCount);
|
|
47
|
+
let unsolved = [];
|
|
48
|
+
if (unsolvedCount) {
|
|
49
|
+
unsolved = await this.getCaptchaWithProof(datasetId, false, unsolvedCount);
|
|
50
|
+
}
|
|
51
|
+
const captchas = shuffleArray([...solved, ...unsolved]);
|
|
52
|
+
const salt = randomAsHex();
|
|
53
|
+
const requestHash = computePendingRequestHash(captchas.map((c) => c.captchaId), userAccount, salt);
|
|
54
|
+
const currentTime = Date.now();
|
|
55
|
+
const signedTimestamp = u8aToHex(this.pair.sign(stringToHex(currentTime.toString())));
|
|
56
|
+
const timeLimit = captchas
|
|
57
|
+
.map((captcha) => captcha.timeLimitMs || DEFAULT_IMAGE_CAPTCHA_TIMEOUT)
|
|
58
|
+
.reduce((a, b) => a + b, 0);
|
|
59
|
+
const deadlineTs = timeLimit + currentTime;
|
|
60
|
+
const currentBlockNumber = 0;
|
|
61
|
+
await this.db.storeDappUserPending(userAccount, requestHash, salt, deadlineTs, currentBlockNumber);
|
|
62
|
+
return {
|
|
63
|
+
captchas,
|
|
64
|
+
requestHash,
|
|
65
|
+
timestamp: currentTime,
|
|
66
|
+
signedTimestamp,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async dappUserSolution(userAccount, dappAccount, requestHash, captchas, requestHashSignature, timestamp, timestampSignature) {
|
|
70
|
+
const verification = signatureVerify(stringToHex(requestHash), requestHashSignature, userAccount);
|
|
71
|
+
if (!verification.isValid) {
|
|
72
|
+
this.logger.info("Invalid requestHash signature");
|
|
73
|
+
throw new ProsopoEnvError("GENERAL.INVALID_SIGNATURE", {
|
|
74
|
+
context: { failedFuncName: this.dappUserSolution.name, userAccount },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const timestampSigVerify = signatureVerify(stringToHex(timestamp.toString()), timestampSignature, this.pair.address);
|
|
78
|
+
if (!timestampSigVerify.isValid) {
|
|
79
|
+
this.logger.info("Invalid timestamp signature");
|
|
80
|
+
throw new ProsopoEnvError("GENERAL.INVALID_SIGNATURE", {
|
|
81
|
+
context: {
|
|
82
|
+
failedFuncName: this.dappUserSolution.name,
|
|
83
|
+
userAccount,
|
|
84
|
+
error: "timestamp signature is invalid",
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
let response = {
|
|
89
|
+
captchas: [],
|
|
90
|
+
verified: false,
|
|
91
|
+
};
|
|
92
|
+
const pendingRecord = await this.db.getDappUserPending(requestHash);
|
|
93
|
+
const unverifiedCaptchaIds = captchas.map((captcha) => captcha.captchaId);
|
|
94
|
+
const pendingRequest = await this.validateDappUserSolutionRequestIsPending(requestHash, pendingRecord, userAccount, unverifiedCaptchaIds);
|
|
95
|
+
console.log("Pending request", pendingRequest);
|
|
96
|
+
if (pendingRequest) {
|
|
97
|
+
const { storedCaptchas, receivedCaptchas, captchaIds } = await this.validateReceivedCaptchasAgainstStoredCaptchas(captchas);
|
|
98
|
+
const { tree, commitmentId } = buildTreeAndGetCommitmentId(receivedCaptchas);
|
|
99
|
+
const datasetId = at(storedCaptchas, 0).datasetId;
|
|
100
|
+
if (!datasetId) {
|
|
101
|
+
throw new ProsopoEnvError("CAPTCHA.ID_MISMATCH", {
|
|
102
|
+
context: { failedFuncName: this.dappUserSolution.name },
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const userSignature = hexToU8a(requestHashSignature);
|
|
106
|
+
await this.db.updateDappUserPendingStatus(requestHash);
|
|
107
|
+
const commit = {
|
|
108
|
+
id: commitmentId,
|
|
109
|
+
userAccount: userAccount,
|
|
110
|
+
dappContract: dappAccount,
|
|
111
|
+
providerAccount: this.pair.address,
|
|
112
|
+
datasetId,
|
|
113
|
+
status: CaptchaStatus.pending,
|
|
114
|
+
userSignature: Array.from(userSignature),
|
|
115
|
+
requestedAt: pendingRecord.requestedAtBlock,
|
|
116
|
+
completedAt: 0,
|
|
117
|
+
processed: false,
|
|
118
|
+
batched: false,
|
|
119
|
+
stored: false,
|
|
120
|
+
requestedAtTimestamp: timestamp,
|
|
121
|
+
};
|
|
122
|
+
await this.db.storeDappUserSolution(receivedCaptchas, commit);
|
|
123
|
+
console.log(receivedCaptchas);
|
|
124
|
+
console.log(storedCaptchas);
|
|
125
|
+
if (compareCaptchaSolutions(receivedCaptchas, storedCaptchas)) {
|
|
126
|
+
response = {
|
|
127
|
+
captchas: captchaIds.map((id) => ({
|
|
128
|
+
captchaId: id,
|
|
129
|
+
proof: tree.proof(id),
|
|
130
|
+
})),
|
|
131
|
+
verified: true,
|
|
132
|
+
};
|
|
133
|
+
await this.db.approveDappUserCommitment(commitmentId);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
response = {
|
|
137
|
+
captchas: captchaIds.map((id) => ({
|
|
138
|
+
captchaId: id,
|
|
139
|
+
proof: [[]],
|
|
140
|
+
})),
|
|
141
|
+
verified: false,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
this.logger.info("Request hash not found");
|
|
147
|
+
}
|
|
148
|
+
return response;
|
|
149
|
+
}
|
|
150
|
+
async validateReceivedCaptchasAgainstStoredCaptchas(captchas) {
|
|
151
|
+
const receivedCaptchas = parseAndSortCaptchaSolutions(captchas);
|
|
152
|
+
const captchaIds = receivedCaptchas.map((captcha) => captcha.captchaId);
|
|
153
|
+
const storedCaptchas = await this.db.getCaptchaById(captchaIds);
|
|
154
|
+
if (!storedCaptchas || receivedCaptchas.length !== storedCaptchas.length) {
|
|
155
|
+
throw new ProsopoEnvError("CAPTCHA.INVALID_CAPTCHA_ID", {
|
|
156
|
+
context: {
|
|
157
|
+
failedFuncName: this.validateReceivedCaptchasAgainstStoredCaptchas.name,
|
|
158
|
+
captchas,
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (!storedCaptchas.every((captcha) => captcha.datasetId === at(storedCaptchas, 0).datasetId)) {
|
|
163
|
+
throw new ProsopoEnvError("CAPTCHA.DIFFERENT_DATASET_IDS", {
|
|
164
|
+
context: {
|
|
165
|
+
failedFuncName: this.validateReceivedCaptchasAgainstStoredCaptchas.name,
|
|
166
|
+
captchas,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return { storedCaptchas, receivedCaptchas, captchaIds };
|
|
171
|
+
}
|
|
172
|
+
async validateDappUserSolutionRequestIsPending(requestHash, pendingRecord, userAccount, captchaIds) {
|
|
173
|
+
const currentTime = Date.now();
|
|
174
|
+
if (!pendingRecord) {
|
|
175
|
+
this.logger.info("No pending record found");
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
if (pendingRecord.deadlineTimestamp < currentTime) {
|
|
179
|
+
this.logger.info("Deadline for responding to captcha has expired");
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
if (pendingRecord) {
|
|
183
|
+
const pendingHashComputed = computePendingRequestHash(captchaIds, userAccount, pendingRecord.salt);
|
|
184
|
+
return requestHash === pendingHashComputed;
|
|
185
|
+
}
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
async getDappUserCommitmentById(commitmentId) {
|
|
189
|
+
const dappUserSolution = await this.db.getDappUserCommitmentById(commitmentId);
|
|
190
|
+
if (!dappUserSolution) {
|
|
191
|
+
throw new ProsopoEnvError("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND", {
|
|
192
|
+
context: {
|
|
193
|
+
failedFuncName: this.getDappUserCommitmentById.name,
|
|
194
|
+
commitmentId: commitmentId,
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return dappUserSolution;
|
|
199
|
+
}
|
|
200
|
+
async getDappUserCommitmentByAccount(userAccount) {
|
|
201
|
+
const dappUserSolutions = await this.db.getDappUserCommitmentByAccount(userAccount);
|
|
202
|
+
if (dappUserSolutions.length > 0) {
|
|
203
|
+
for (const dappUserSolution of dappUserSolutions) {
|
|
204
|
+
if (dappUserSolution.status === CaptchaStatus.approved) {
|
|
205
|
+
return dappUserSolution;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=imgCaptchaTasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imgCaptchaTasks.js","sourceRoot":"","sources":["../../../src/tasks/imgCaptcha/imgCaptchaTasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CaptchaMerkleTree } from "@prosopo/datasets";
|
|
2
|
+
import type { CaptchaSolution } from "@prosopo/types";
|
|
3
|
+
export declare const buildTreeAndGetCommitmentId: (captchaSolutions: CaptchaSolution[]) => {
|
|
4
|
+
tree: CaptchaMerkleTree;
|
|
5
|
+
commitmentId: string;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=imgCaptchaTasksUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imgCaptchaTasksUtils.d.ts","sourceRoot":"","sources":["../../../src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,iBAAiB,EAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOtD,eAAO,MAAM,2BAA2B,qBACrB,eAAe,EAAE;UACzB,iBAAiB;kBAAgB,MAAM;CAqBjD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ProsopoEnvError } from "@prosopo/common";
|
|
2
|
+
import { CaptchaMerkleTree, computeCaptchaSolutionHash, } from "@prosopo/datasets";
|
|
3
|
+
export const buildTreeAndGetCommitmentId = (captchaSolutions) => {
|
|
4
|
+
const tree = new CaptchaMerkleTree();
|
|
5
|
+
const solutionsHashed = captchaSolutions.map((captcha) => computeCaptchaSolutionHash(captcha));
|
|
6
|
+
tree.build(solutionsHashed);
|
|
7
|
+
const commitmentId = tree.root?.hash;
|
|
8
|
+
if (!commitmentId) {
|
|
9
|
+
throw new ProsopoEnvError("CONTRACT.CAPTCHA_SOLUTION_COMMITMENT_DOES_NOT_EXIST", {
|
|
10
|
+
context: {
|
|
11
|
+
failedFuncName: buildTreeAndGetCommitmentId.name,
|
|
12
|
+
commitmentId: commitmentId,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return { tree, commitmentId };
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=imgCaptchaTasksUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imgCaptchaTasksUtils.js","sourceRoot":"","sources":["../../../src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACN,iBAAiB,EACjB,0BAA0B,GAC1B,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAC1C,gBAAmC,EACiB,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACrC,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACxD,0BAA0B,CAAC,OAAO,CAAC,CACnC,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;IACrC,IAAI,CAAC,YAAY,EAAE;QAClB,MAAM,IAAI,eAAe,CACxB,qDAAqD,EACrD;YACC,OAAO,EAAE;gBACR,cAAc,EAAE,2BAA2B,CAAC,IAAI;gBAChD,YAAY,EAAE,YAAY;aAC1B;SACD,CACD,CAAC;KACF;IAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAC/B,CAAC,CAAC"}
|
package/dist/tasks/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from "./tasks.js";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAC"}
|
package/dist/tasks/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from "./tasks.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/tasks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { KeyringPair } from "@polkadot/keyring/types";
|
|
2
|
+
import { type PoWCaptcha, PoWChallengeId } from "@prosopo/types";
|
|
3
|
+
import type { Database } from "@prosopo/types-database";
|
|
4
|
+
export declare class PowCaptchaManager {
|
|
5
|
+
pair: KeyringPair;
|
|
6
|
+
db: Database;
|
|
7
|
+
POW_SEPARATOR: string;
|
|
8
|
+
constructor(pair: KeyringPair, db: Database);
|
|
9
|
+
getPowCaptchaChallenge(userAccount: string, dappAccount: string, origin: string): Promise<PoWCaptcha>;
|
|
10
|
+
verifyPowCaptchaSolution(challenge: PoWChallengeId, difficulty: number, signature: string, nonce: number, timeout: number, timestampSignature: string): Promise<boolean>;
|
|
11
|
+
serverVerifyPowCaptchaSolution(dappAccount: string, challenge: string, timeout: number): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=powTasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"powTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/powCaptcha/powTasks.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAI3D,OAAO,EAGL,KAAK,UAAU,EACf,cAAc,EACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAQxD,qBAAa,iBAAiB;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,QAAQ,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ;IAarC,sBAAsB,CAC1B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC;IA6BhB,wBAAwB,CAC5B,SAAS,EAAE,cAAc,EACzB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,OAAO,CAAC;IAqCb,8BAA8B,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;CAgCpB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { u8aToHex } from "@polkadot/util";
|
|
2
|
+
import { stringToHex } from "@polkadot/util";
|
|
3
|
+
import { ProsopoEnvError } from "@prosopo/common";
|
|
4
|
+
import { ApiParams, POW_SEPARATOR, } from "@prosopo/types";
|
|
5
|
+
import { at } from "@prosopo/util";
|
|
6
|
+
import { checkPowSignature, checkPowSolution, checkRecentPowSolution, } from "./powTasksUtils.js";
|
|
7
|
+
export class PowCaptchaManager {
|
|
8
|
+
constructor(pair, db) {
|
|
9
|
+
this.pair = pair;
|
|
10
|
+
this.db = db;
|
|
11
|
+
this.POW_SEPARATOR = POW_SEPARATOR;
|
|
12
|
+
}
|
|
13
|
+
async getPowCaptchaChallenge(userAccount, dappAccount, origin) {
|
|
14
|
+
const difficulty = 4;
|
|
15
|
+
const timestamp = Date.now();
|
|
16
|
+
const challenge = `${timestamp}___${userAccount}___${dappAccount}`;
|
|
17
|
+
const challengeSignature = u8aToHex(this.pair.sign(stringToHex(challenge)));
|
|
18
|
+
const timestampSignature = u8aToHex(this.pair.sign(stringToHex(timestamp.toString())));
|
|
19
|
+
return {
|
|
20
|
+
challenge,
|
|
21
|
+
difficulty,
|
|
22
|
+
signature: challengeSignature,
|
|
23
|
+
timestamp,
|
|
24
|
+
timestampSignature,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async verifyPowCaptchaSolution(challenge, difficulty, signature, nonce, timeout, timestampSignature) {
|
|
28
|
+
checkRecentPowSolution(challenge, timeout);
|
|
29
|
+
const challengeSplit = challenge.split(this.POW_SEPARATOR);
|
|
30
|
+
const timestamp = parseInt(at(challengeSplit, 0));
|
|
31
|
+
const userAccount = at(challengeSplit, 1);
|
|
32
|
+
const dappAccount = at(challengeSplit, 2);
|
|
33
|
+
checkPowSignature(timestamp.toString(), timestampSignature, userAccount, ApiParams.timestamp);
|
|
34
|
+
checkPowSignature(challenge, signature, this.pair.address, ApiParams.challenge);
|
|
35
|
+
checkPowSolution(nonce, challenge, difficulty);
|
|
36
|
+
await this.db.storePowCaptchaRecord(challenge, { timestamp, userAccount, dappAccount }, false);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
async serverVerifyPowCaptchaSolution(dappAccount, challenge, timeout) {
|
|
40
|
+
const challengeRecord = await this.db.getPowCaptchaRecordByChallenge(challenge);
|
|
41
|
+
if (!challengeRecord) {
|
|
42
|
+
throw new ProsopoEnvError("DATABASE.CAPTCHA_GET_FAILED", {
|
|
43
|
+
context: {
|
|
44
|
+
failedFuncName: this.serverVerifyPowCaptchaSolution.name,
|
|
45
|
+
challenge,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (challengeRecord.checked)
|
|
50
|
+
return false;
|
|
51
|
+
const challengeDappAccount = challengeRecord.dappAccount;
|
|
52
|
+
if (dappAccount !== challengeDappAccount) {
|
|
53
|
+
throw new ProsopoEnvError("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND", {
|
|
54
|
+
context: {
|
|
55
|
+
failedFuncName: this.serverVerifyPowCaptchaSolution.name,
|
|
56
|
+
dappAccount,
|
|
57
|
+
challengeDappAccount,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
checkRecentPowSolution(challenge, timeout);
|
|
62
|
+
await this.db.updatePowCaptchaRecord(challengeRecord.challenge, true);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=powTasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"powTasks.js","sourceRoot":"","sources":["../../../src/tasks/powCaptcha/powTasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const validateSolution: (nonce: number, challenge: string, difficulty: number) => boolean;
|
|
2
|
+
export declare const checkPowSolution: (nonce: number, challenge: string, difficulty: number) => void;
|
|
3
|
+
export declare const checkPowSignature: (challenge: string, signature: string, address: string, signatureType?: string) => void;
|
|
4
|
+
export declare const checkRecentPowSolution: (challenge: string, timeout: number) => void;
|
|
5
|
+
//# sourceMappingURL=powTasksUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"powTasksUtils.d.ts","sourceRoot":"","sources":["../../../src/tasks/powCaptcha/powTasksUtils.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,gBAAgB,UACrB,MAAM,aACF,MAAM,cACL,MAAM,KAChB,OAIkC,CAAC;AAEtC,eAAO,MAAM,gBAAgB,UACrB,MAAM,aACF,MAAM,cACL,MAAM,KAChB,IAaF,CAAC;AAEF,eAAO,MAAM,iBAAiB,cAClB,MAAM,aACN,MAAM,WACR,MAAM,kBACC,MAAM,KACpB,IAgBF,CAAC;AAEF,eAAO,MAAM,sBAAsB,cACvB,MAAM,WACR,MAAM,KACb,IAWF,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { sha256 } from "@noble/hashes/sha256";
|
|
2
|
+
import { stringToHex } from "@polkadot/util";
|
|
3
|
+
import { signatureVerify } from "@polkadot/util-crypto";
|
|
4
|
+
import { ProsopoContractError } from "@prosopo/common";
|
|
5
|
+
import { verifyRecency } from "@prosopo/contract";
|
|
6
|
+
export const validateSolution = (nonce, challenge, difficulty) => Array.from(sha256(new TextEncoder().encode(nonce + challenge)))
|
|
7
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
8
|
+
.join("")
|
|
9
|
+
.startsWith("0".repeat(difficulty));
|
|
10
|
+
export const checkPowSolution = (nonce, challenge, difficulty) => {
|
|
11
|
+
const solutionValid = validateSolution(nonce, challenge, difficulty);
|
|
12
|
+
if (!solutionValid) {
|
|
13
|
+
throw new ProsopoContractError("API.CAPTCHA_FAILED", {
|
|
14
|
+
context: {
|
|
15
|
+
ERROR: "Captcha solution is invalid",
|
|
16
|
+
failedFuncName: checkPowSolution.name,
|
|
17
|
+
nonce,
|
|
18
|
+
challenge,
|
|
19
|
+
difficulty,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export const checkPowSignature = (challenge, signature, address, signatureType) => {
|
|
25
|
+
const signatureVerification = signatureVerify(stringToHex(challenge), signature, address);
|
|
26
|
+
if (!signatureVerification.isValid) {
|
|
27
|
+
throw new ProsopoContractError("GENERAL.INVALID_SIGNATURE", {
|
|
28
|
+
context: {
|
|
29
|
+
ERROR: `Signature is invalid for this message: ${signatureType}`,
|
|
30
|
+
failedFuncName: checkPowSignature.name,
|
|
31
|
+
signature,
|
|
32
|
+
signatureType,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export const checkRecentPowSolution = (challenge, timeout) => {
|
|
38
|
+
const recent = verifyRecency(challenge, timeout);
|
|
39
|
+
if (!recent) {
|
|
40
|
+
throw new ProsopoContractError("CONTRACT.INVALID_BLOCKHASH", {
|
|
41
|
+
context: {
|
|
42
|
+
ERROR: `Block in which the Provider was selected must be within the last ${timeout / 1000} seconds`,
|
|
43
|
+
failedFuncName: checkRecentPowSolution.name,
|
|
44
|
+
challenge,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=powTasksUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"powTasksUtils.js","sourceRoot":"","sources":["../../../src/tasks/powCaptcha/powTasksUtils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC/B,KAAa,EACb,SAAiB,EACjB,UAAkB,EACR,EAAE,CACZ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;KAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;KACjD,IAAI,CAAC,EAAE,CAAC;KACR,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC/B,KAAa,EACb,SAAiB,EACjB,UAAkB,EACX,EAAE;IACT,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACrE,IAAI,CAAC,aAAa,EAAE;QACnB,MAAM,IAAI,oBAAoB,CAAC,oBAAoB,EAAE;YACpD,OAAO,EAAE;gBACR,KAAK,EAAE,6BAA6B;gBACpC,cAAc,EAAE,gBAAgB,CAAC,IAAI;gBACrC,KAAK;gBACL,SAAS;gBACT,UAAU;aACV;SACD,CAAC,CAAC;KACH;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAChC,SAAiB,EACjB,SAAiB,EACjB,OAAe,EACf,aAAsB,EACf,EAAE;IACT,MAAM,qBAAqB,GAAG,eAAe,CAC5C,WAAW,CAAC,SAAS,CAAC,EACtB,SAAS,EACT,OAAO,CACP,CAAC;IACF,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;QACnC,MAAM,IAAI,oBAAoB,CAAC,2BAA2B,EAAE;YAC3D,OAAO,EAAE;gBACR,KAAK,EAAE,0CAA0C,aAAa,EAAE;gBAChE,cAAc,EAAE,iBAAiB,CAAC,IAAI;gBACtC,SAAS;gBACT,aAAa;aACb;SACD,CAAC,CAAC;KACH;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACrC,SAAiB,EACjB,OAAe,EACR,EAAE;IACT,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE;QACZ,MAAM,IAAI,oBAAoB,CAAC,4BAA4B,EAAE;YAC5D,OAAO,EAAE;gBACR,KAAK,EAAE,oEAAoE,OAAO,GAAG,IAAI,UAAU;gBACnG,cAAc,EAAE,sBAAsB,CAAC,IAAI;gBAC3C,SAAS;aACT;SACD,CAAC,CAAC;KACH;AACF,CAAC,CAAC"}
|