@prosopo/procaptcha 2.1.0 → 2.1.1
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/dist/cjs/modules/Manager.cjs +23 -16
- package/dist/cjs/modules/ProsopoCaptchaApi.cjs +4 -0
- package/dist/modules/Manager.d.ts.map +1 -1
- package/dist/modules/Manager.js +305 -252
- package/dist/modules/Manager.js.map +1 -1
- package/dist/modules/ProsopoCaptchaApi.d.ts +2 -2
- package/dist/modules/ProsopoCaptchaApi.d.ts.map +1 -1
- package/dist/modules/ProsopoCaptchaApi.js +4 -0
- package/dist/modules/ProsopoCaptchaApi.js.map +1 -1
- package/package.json +10 -10
|
@@ -73,23 +73,30 @@ function Manager(configOptional, state, onStateUpdate, callbacks) {
|
|
|
73
73
|
);
|
|
74
74
|
updateState({ captchaApi });
|
|
75
75
|
const challenge = await captchaApi.getCaptchaChallenge();
|
|
76
|
-
if (challenge.
|
|
77
|
-
|
|
76
|
+
if (challenge.error) {
|
|
77
|
+
updateState({
|
|
78
|
+
loading: false,
|
|
79
|
+
error: challenge.error
|
|
80
|
+
});
|
|
81
|
+
} else {
|
|
82
|
+
if (challenge.captchas.length <= 0) {
|
|
83
|
+
throw new common.ProsopoDatasetError("DEVELOPER.PROVIDER_NO_CAPTCHA");
|
|
84
|
+
}
|
|
85
|
+
const timeMillis = challenge.captchas.map(
|
|
86
|
+
(captcha) => captcha.timeLimitMs || config.captchas.image.challengeTimeout
|
|
87
|
+
).reduce((a, b) => a + b);
|
|
88
|
+
const timeout = setTimeout(() => {
|
|
89
|
+
events.onChallengeExpired();
|
|
90
|
+
updateState({ isHuman: false, showModal: false, loading: false });
|
|
91
|
+
}, timeMillis);
|
|
92
|
+
updateState({
|
|
93
|
+
index: 0,
|
|
94
|
+
solutions: challenge.captchas.map(() => []),
|
|
95
|
+
challenge,
|
|
96
|
+
showModal: true,
|
|
97
|
+
timeout
|
|
98
|
+
});
|
|
78
99
|
}
|
|
79
|
-
const timeMillis = challenge.captchas.map(
|
|
80
|
-
(captcha) => captcha.timeLimitMs || config.captchas.image.challengeTimeout
|
|
81
|
-
).reduce((a, b) => a + b);
|
|
82
|
-
const timeout = setTimeout(() => {
|
|
83
|
-
events.onChallengeExpired();
|
|
84
|
-
updateState({ isHuman: false, showModal: false, loading: false });
|
|
85
|
-
}, timeMillis);
|
|
86
|
-
updateState({
|
|
87
|
-
index: 0,
|
|
88
|
-
solutions: challenge.captchas.map(() => []),
|
|
89
|
-
challenge,
|
|
90
|
-
showModal: true,
|
|
91
|
-
timeout
|
|
92
|
-
});
|
|
93
100
|
},
|
|
94
101
|
start,
|
|
95
102
|
resetState,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const common = require("@prosopo/common");
|
|
4
4
|
const datasets = require("@prosopo/datasets");
|
|
5
|
+
const types = require("@prosopo/types");
|
|
5
6
|
class ProsopoCaptchaApi {
|
|
6
7
|
constructor(userAccount, provider, providerApi, web2, dappAccount) {
|
|
7
8
|
this.userAccount = userAccount;
|
|
@@ -19,6 +20,9 @@ class ProsopoCaptchaApi {
|
|
|
19
20
|
this.userAccount,
|
|
20
21
|
this.provider
|
|
21
22
|
);
|
|
23
|
+
if (captchaChallenge[types.ApiParams.error]) {
|
|
24
|
+
return captchaChallenge;
|
|
25
|
+
}
|
|
22
26
|
for (const captcha of captchaChallenge.captchas) {
|
|
23
27
|
for (const item of captcha.items) {
|
|
24
28
|
if (item.data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Manager.d.ts","sourceRoot":"","sources":["../../src/modules/Manager.ts"],"names":[],"mappings":"AA8BA,OAAO,EAKN,KAAK,mBAAmB,EAExB,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EACpB,KAAK,uBAAuB,
|
|
1
|
+
{"version":3,"file":"Manager.d.ts","sourceRoot":"","sources":["../../src/modules/Manager.ts"],"names":[],"mappings":"AA8BA,OAAO,EAKN,KAAK,mBAAmB,EAExB,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAG5B,MAAM,gBAAgB,CAAC;AAwBxB,wBAAgB,OAAO,CACtB,cAAc,EAAE,4BAA4B,EAC5C,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,uBAAuB,EACtC,SAAS,EAAE,mBAAmB;;;;mBA8PR,MAAM;;EA2I5B"}
|
package/dist/modules/Manager.js
CHANGED
|
@@ -3,274 +3,327 @@ import { randomAsHex } from "@polkadot/util-crypto/random";
|
|
|
3
3
|
import { stringToHex } from "@polkadot/util/string";
|
|
4
4
|
import { ExtensionWeb2, ExtensionWeb3 } from "@prosopo/account";
|
|
5
5
|
import { ProviderApi } from "@prosopo/api";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import {
|
|
7
|
+
ProsopoDatasetError,
|
|
8
|
+
ProsopoEnvError,
|
|
9
|
+
ProsopoError
|
|
10
|
+
} from "@prosopo/common";
|
|
11
|
+
import {
|
|
12
|
+
buildUpdateState,
|
|
13
|
+
getDefaultEvents,
|
|
14
|
+
getRandomActiveProvider,
|
|
15
|
+
providerRetry
|
|
16
|
+
} from "@prosopo/procaptcha-common";
|
|
17
|
+
import {
|
|
18
|
+
ApiParams,
|
|
19
|
+
ProcaptchaConfigSchema,
|
|
20
|
+
encodeProcaptchaOutput
|
|
21
|
+
} from "@prosopo/types";
|
|
9
22
|
import { at, hashToHex } from "@prosopo/util";
|
|
10
23
|
import { sleep } from "../utils/utils.js";
|
|
11
24
|
import ProsopoCaptchaApi from "./ProsopoCaptchaApi.js";
|
|
12
25
|
import storage from "./storage.js";
|
|
13
26
|
const defaultState = () => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
return {
|
|
28
|
+
// note order matters! see buildUpdateState. These fields are set in order, so disable modal first, then set loading to false, etc.
|
|
29
|
+
showModal: false,
|
|
30
|
+
loading: false,
|
|
31
|
+
index: 0,
|
|
32
|
+
challenge: void 0,
|
|
33
|
+
solutions: void 0,
|
|
34
|
+
isHuman: false,
|
|
35
|
+
captchaApi: void 0,
|
|
36
|
+
account: void 0
|
|
37
|
+
// don't handle timeout here, this should be handled by the state management
|
|
38
|
+
};
|
|
24
39
|
};
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
};
|
|
33
|
-
if (state.account) {
|
|
34
|
-
config.userAccountAddress = state.account.account.address;
|
|
35
|
-
}
|
|
36
|
-
return ProcaptchaConfigSchema.parse(config);
|
|
37
|
-
};
|
|
38
|
-
const start = async () => {
|
|
39
|
-
events.onOpen();
|
|
40
|
-
await providerRetry(async () => {
|
|
41
|
-
if (state.loading) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
if (state.isHuman) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
await cryptoWaitReady();
|
|
48
|
-
resetState();
|
|
49
|
-
updateState({ loading: true });
|
|
50
|
-
updateState({
|
|
51
|
-
attemptCount: state.attemptCount ? state.attemptCount + 1 : 1,
|
|
52
|
-
});
|
|
53
|
-
const config = getConfig();
|
|
54
|
-
updateState({ dappAccount: config.account.address });
|
|
55
|
-
await sleep(100);
|
|
56
|
-
const account = await loadAccount();
|
|
57
|
-
const getRandomProviderResponse = await getRandomActiveProvider(getConfig());
|
|
58
|
-
const providerUrl = getRandomProviderResponse.provider.url;
|
|
59
|
-
const providerApi = await loadProviderApi(providerUrl);
|
|
60
|
-
const captchaApi = new ProsopoCaptchaApi(account.account.address, getRandomProviderResponse, providerApi, config.web2, config.account.address || "");
|
|
61
|
-
updateState({ captchaApi });
|
|
62
|
-
const challenge = await captchaApi.getCaptchaChallenge();
|
|
63
|
-
if (challenge.captchas.length <= 0) {
|
|
64
|
-
throw new ProsopoDatasetError("DEVELOPER.PROVIDER_NO_CAPTCHA");
|
|
65
|
-
}
|
|
66
|
-
const timeMillis = challenge.captchas
|
|
67
|
-
.map((captcha) => captcha.timeLimitMs || config.captchas.image.challengeTimeout)
|
|
68
|
-
.reduce((a, b) => a + b);
|
|
69
|
-
const timeout = setTimeout(() => {
|
|
70
|
-
events.onChallengeExpired();
|
|
71
|
-
updateState({ isHuman: false, showModal: false, loading: false });
|
|
72
|
-
}, timeMillis);
|
|
73
|
-
updateState({
|
|
74
|
-
index: 0,
|
|
75
|
-
solutions: challenge.captchas.map(() => []),
|
|
76
|
-
challenge,
|
|
77
|
-
showModal: true,
|
|
78
|
-
timeout,
|
|
79
|
-
});
|
|
80
|
-
}, start, resetState, state.attemptCount, 10);
|
|
40
|
+
function Manager(configOptional, state, onStateUpdate, callbacks) {
|
|
41
|
+
const events = getDefaultEvents(onStateUpdate, state, callbacks);
|
|
42
|
+
const updateState = buildUpdateState(state, onStateUpdate);
|
|
43
|
+
const getConfig = () => {
|
|
44
|
+
const config = {
|
|
45
|
+
userAccountAddress: "",
|
|
46
|
+
...configOptional
|
|
81
47
|
};
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const captchaSolution = state.challenge.captchas.map((captcha, index) => {
|
|
94
|
-
const solution = at(state.solutions, index);
|
|
95
|
-
return {
|
|
96
|
-
captchaId: captcha.captchaId,
|
|
97
|
-
captchaContentId: captcha.captchaContentId,
|
|
98
|
-
salt,
|
|
99
|
-
solution,
|
|
100
|
-
};
|
|
101
|
-
});
|
|
102
|
-
const account = getAccount();
|
|
103
|
-
const signer = getExtension(account).signer;
|
|
104
|
-
const first = at(challenge.captchas, 0);
|
|
105
|
-
if (!first.datasetId) {
|
|
106
|
-
throw new ProsopoDatasetError("CAPTCHA.INVALID_CAPTCHA_ID", {
|
|
107
|
-
context: { error: "No datasetId set for challenge" },
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
const captchaApi = state.captchaApi;
|
|
111
|
-
if (!captchaApi) {
|
|
112
|
-
throw new ProsopoError("CAPTCHA.INVALID_TOKEN", {
|
|
113
|
-
context: { error: "No Captcha API found in state" },
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
if (!signer || !signer.signRaw) {
|
|
117
|
-
throw new ProsopoEnvError("GENERAL.CANT_FIND_KEYRINGPAIR", {
|
|
118
|
-
context: {
|
|
119
|
-
error: "Signer is not defined, cannot sign message to prove account ownership",
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
const userRequestHashSignature = await signer.signRaw({
|
|
124
|
-
address: account.account.address,
|
|
125
|
-
data: stringToHex(challenge.requestHash),
|
|
126
|
-
type: "bytes",
|
|
127
|
-
});
|
|
128
|
-
const submission = await captchaApi.submitCaptchaSolution(userRequestHashSignature.signature, challenge.requestHash, captchaSolution, challenge.timestamp, challenge.signature.provider.requestHash);
|
|
129
|
-
const isHuman = submission[0].verified;
|
|
130
|
-
if (!isHuman) {
|
|
131
|
-
events.onFailed();
|
|
132
|
-
}
|
|
133
|
-
updateState({
|
|
134
|
-
submission,
|
|
135
|
-
isHuman,
|
|
136
|
-
loading: false,
|
|
137
|
-
});
|
|
138
|
-
if (state.isHuman) {
|
|
139
|
-
const providerUrl = captchaApi.provider.provider.url;
|
|
140
|
-
storage.setProcaptchaStorage({
|
|
141
|
-
...storage.getProcaptchaStorage(),
|
|
142
|
-
providerUrl,
|
|
143
|
-
});
|
|
144
|
-
events.onHuman(encodeProcaptchaOutput({
|
|
145
|
-
[ApiParams.providerUrl]: providerUrl,
|
|
146
|
-
[ApiParams.user]: account.account.address,
|
|
147
|
-
[ApiParams.dapp]: getDappAccount(),
|
|
148
|
-
[ApiParams.commitmentId]: hashToHex(submission[1]),
|
|
149
|
-
[ApiParams.timestamp]: challenge.timestamp,
|
|
150
|
-
[ApiParams.signature]: {
|
|
151
|
-
[ApiParams.provider]: {
|
|
152
|
-
[ApiParams.requestHash]: challenge.signature.provider.requestHash,
|
|
153
|
-
},
|
|
154
|
-
[ApiParams.user]: {
|
|
155
|
-
[ApiParams.requestHash]: userRequestHashSignature.signature,
|
|
156
|
-
},
|
|
157
|
-
},
|
|
158
|
-
}));
|
|
159
|
-
setValidChallengeTimeout();
|
|
160
|
-
}
|
|
161
|
-
}, start, resetState, state.attemptCount, 10);
|
|
162
|
-
};
|
|
163
|
-
const cancel = async () => {
|
|
164
|
-
clearTimeout();
|
|
165
|
-
resetState();
|
|
166
|
-
events.onClose();
|
|
167
|
-
};
|
|
168
|
-
const select = (hash) => {
|
|
169
|
-
if (!state.challenge) {
|
|
170
|
-
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
171
|
-
context: { error: "Cannot select, no Captcha found in state" },
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
if (state.index >= state.challenge.captchas.length || state.index < 0) {
|
|
175
|
-
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
176
|
-
context: {
|
|
177
|
-
error: "Cannot select, index is out of range for this Captcha",
|
|
178
|
-
},
|
|
179
|
-
});
|
|
48
|
+
if (state.account) {
|
|
49
|
+
config.userAccountAddress = state.account.account.address;
|
|
50
|
+
}
|
|
51
|
+
return ProcaptchaConfigSchema.parse(config);
|
|
52
|
+
};
|
|
53
|
+
const start = async () => {
|
|
54
|
+
events.onOpen();
|
|
55
|
+
await providerRetry(
|
|
56
|
+
async () => {
|
|
57
|
+
if (state.loading) {
|
|
58
|
+
return;
|
|
180
59
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const solution = at(solutions, index);
|
|
184
|
-
if (solution.includes(hash)) {
|
|
185
|
-
solution.splice(solution.indexOf(hash), 1);
|
|
60
|
+
if (state.isHuman) {
|
|
61
|
+
return;
|
|
186
62
|
}
|
|
187
|
-
|
|
188
|
-
|
|
63
|
+
await cryptoWaitReady();
|
|
64
|
+
resetState();
|
|
65
|
+
updateState({ loading: true });
|
|
66
|
+
updateState({
|
|
67
|
+
attemptCount: state.attemptCount ? state.attemptCount + 1 : 1
|
|
68
|
+
});
|
|
69
|
+
const config = getConfig();
|
|
70
|
+
updateState({ dappAccount: config.account.address });
|
|
71
|
+
await sleep(100);
|
|
72
|
+
const account = await loadAccount();
|
|
73
|
+
const getRandomProviderResponse = await getRandomActiveProvider(
|
|
74
|
+
getConfig()
|
|
75
|
+
);
|
|
76
|
+
const providerUrl = getRandomProviderResponse.provider.url;
|
|
77
|
+
const providerApi = await loadProviderApi(providerUrl);
|
|
78
|
+
const captchaApi = new ProsopoCaptchaApi(
|
|
79
|
+
account.account.address,
|
|
80
|
+
getRandomProviderResponse,
|
|
81
|
+
providerApi,
|
|
82
|
+
config.web2,
|
|
83
|
+
config.account.address || ""
|
|
84
|
+
);
|
|
85
|
+
updateState({ captchaApi });
|
|
86
|
+
const challenge = await captchaApi.getCaptchaChallenge();
|
|
87
|
+
if (challenge.error) {
|
|
88
|
+
updateState({
|
|
89
|
+
loading: false,
|
|
90
|
+
error: challenge.error
|
|
91
|
+
});
|
|
92
|
+
} else {
|
|
93
|
+
if (challenge.captchas.length <= 0) {
|
|
94
|
+
throw new ProsopoDatasetError("DEVELOPER.PROVIDER_NO_CAPTCHA");
|
|
95
|
+
}
|
|
96
|
+
const timeMillis = challenge.captchas.map(
|
|
97
|
+
(captcha) => captcha.timeLimitMs || config.captchas.image.challengeTimeout
|
|
98
|
+
).reduce((a, b) => a + b);
|
|
99
|
+
const timeout = setTimeout(() => {
|
|
100
|
+
events.onChallengeExpired();
|
|
101
|
+
updateState({ isHuman: false, showModal: false, loading: false });
|
|
102
|
+
}, timeMillis);
|
|
103
|
+
updateState({
|
|
104
|
+
index: 0,
|
|
105
|
+
solutions: challenge.captchas.map(() => []),
|
|
106
|
+
challenge,
|
|
107
|
+
showModal: true,
|
|
108
|
+
timeout
|
|
109
|
+
});
|
|
189
110
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
111
|
+
},
|
|
112
|
+
start,
|
|
113
|
+
resetState,
|
|
114
|
+
state.attemptCount,
|
|
115
|
+
10
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
const submit = async () => {
|
|
119
|
+
await providerRetry(
|
|
120
|
+
async () => {
|
|
121
|
+
clearTimeout();
|
|
193
122
|
if (!state.challenge) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
123
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
124
|
+
context: { error: "Cannot submit, no Captcha found in state" }
|
|
125
|
+
});
|
|
197
126
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
127
|
+
updateState({ showModal: false });
|
|
128
|
+
const challenge = state.challenge;
|
|
129
|
+
const salt = randomAsHex();
|
|
130
|
+
const captchaSolution = state.challenge.captchas.map(
|
|
131
|
+
(captcha, index) => {
|
|
132
|
+
const solution = at(state.solutions, index);
|
|
133
|
+
return {
|
|
134
|
+
captchaId: captcha.captchaId,
|
|
135
|
+
captchaContentId: captcha.captchaContentId,
|
|
136
|
+
salt,
|
|
137
|
+
solution
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
const account = getAccount();
|
|
142
|
+
const signer = getExtension(account).signer;
|
|
143
|
+
const first = at(challenge.captchas, 0);
|
|
144
|
+
if (!first.datasetId) {
|
|
145
|
+
throw new ProsopoDatasetError("CAPTCHA.INVALID_CAPTCHA_ID", {
|
|
146
|
+
context: { error: "No datasetId set for challenge" }
|
|
147
|
+
});
|
|
204
148
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
throw new ProsopoEnvError("GENERAL.SITE_KEY_MISSING");
|
|
149
|
+
const captchaApi = state.captchaApi;
|
|
150
|
+
if (!captchaApi) {
|
|
151
|
+
throw new ProsopoError("CAPTCHA.INVALID_TOKEN", {
|
|
152
|
+
context: { error: "No Captcha API found in state" }
|
|
153
|
+
});
|
|
211
154
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const setValidChallengeTimeout = () => {
|
|
219
|
-
const timeMillis = configOptional.captchas.image.solutionTimeout;
|
|
220
|
-
const successfullChallengeTimeout = setTimeout(() => {
|
|
221
|
-
updateState({ isHuman: false });
|
|
222
|
-
events.onExpired();
|
|
223
|
-
}, timeMillis);
|
|
224
|
-
updateState({ successfullChallengeTimeout });
|
|
225
|
-
};
|
|
226
|
-
const resetState = () => {
|
|
227
|
-
clearTimeout();
|
|
228
|
-
updateState(defaultState());
|
|
229
|
-
};
|
|
230
|
-
const loadAccount = async () => {
|
|
231
|
-
const config = getConfig();
|
|
232
|
-
if (!config.web2 && !config.userAccountAddress) {
|
|
233
|
-
throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
|
|
234
|
-
context: { error: "Account address has not been set for web3 mode" },
|
|
235
|
-
});
|
|
155
|
+
if (!signer || !signer.signRaw) {
|
|
156
|
+
throw new ProsopoEnvError("GENERAL.CANT_FIND_KEYRINGPAIR", {
|
|
157
|
+
context: {
|
|
158
|
+
error: "Signer is not defined, cannot sign message to prove account ownership"
|
|
159
|
+
}
|
|
160
|
+
});
|
|
236
161
|
}
|
|
237
|
-
const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
162
|
+
const userRequestHashSignature = await signer.signRaw({
|
|
163
|
+
address: account.account.address,
|
|
164
|
+
data: stringToHex(challenge.requestHash),
|
|
165
|
+
type: "bytes"
|
|
166
|
+
});
|
|
167
|
+
const submission = await captchaApi.submitCaptchaSolution(
|
|
168
|
+
userRequestHashSignature.signature,
|
|
169
|
+
challenge.requestHash,
|
|
170
|
+
captchaSolution,
|
|
171
|
+
challenge.timestamp,
|
|
172
|
+
challenge.signature.provider.requestHash
|
|
173
|
+
);
|
|
174
|
+
const isHuman = submission[0].verified;
|
|
175
|
+
if (!isHuman) {
|
|
176
|
+
events.onFailed();
|
|
248
177
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
178
|
+
updateState({
|
|
179
|
+
submission,
|
|
180
|
+
isHuman,
|
|
181
|
+
loading: false
|
|
182
|
+
});
|
|
183
|
+
if (state.isHuman) {
|
|
184
|
+
const providerUrl = captchaApi.provider.provider.url;
|
|
185
|
+
storage.setProcaptchaStorage({
|
|
186
|
+
...storage.getProcaptchaStorage(),
|
|
187
|
+
providerUrl
|
|
188
|
+
});
|
|
189
|
+
events.onHuman(
|
|
190
|
+
encodeProcaptchaOutput({
|
|
191
|
+
[ApiParams.providerUrl]: providerUrl,
|
|
192
|
+
[ApiParams.user]: account.account.address,
|
|
193
|
+
[ApiParams.dapp]: getDappAccount(),
|
|
194
|
+
[ApiParams.commitmentId]: hashToHex(submission[1]),
|
|
195
|
+
[ApiParams.timestamp]: challenge.timestamp,
|
|
196
|
+
[ApiParams.signature]: {
|
|
197
|
+
[ApiParams.provider]: {
|
|
198
|
+
[ApiParams.requestHash]: challenge.signature.provider.requestHash
|
|
199
|
+
},
|
|
200
|
+
[ApiParams.user]: {
|
|
201
|
+
[ApiParams.requestHash]: userRequestHashSignature.signature
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
})
|
|
205
|
+
);
|
|
206
|
+
setValidChallengeTimeout();
|
|
255
207
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
208
|
+
},
|
|
209
|
+
start,
|
|
210
|
+
resetState,
|
|
211
|
+
state.attemptCount,
|
|
212
|
+
10
|
|
213
|
+
);
|
|
214
|
+
};
|
|
215
|
+
const cancel = async () => {
|
|
216
|
+
clearTimeout();
|
|
217
|
+
resetState();
|
|
218
|
+
events.onClose();
|
|
219
|
+
};
|
|
220
|
+
const select = (hash) => {
|
|
221
|
+
if (!state.challenge) {
|
|
222
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
223
|
+
context: { error: "Cannot select, no Captcha found in state" }
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
if (state.index >= state.challenge.captchas.length || state.index < 0) {
|
|
227
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
228
|
+
context: {
|
|
229
|
+
error: "Cannot select, index is out of range for this Captcha"
|
|
265
230
|
}
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
const index = state.index;
|
|
234
|
+
const solutions = state.solutions;
|
|
235
|
+
const solution = at(solutions, index);
|
|
236
|
+
if (solution.includes(hash)) {
|
|
237
|
+
solution.splice(solution.indexOf(hash), 1);
|
|
238
|
+
} else {
|
|
239
|
+
solution.push(hash);
|
|
240
|
+
}
|
|
241
|
+
updateState({ solutions });
|
|
242
|
+
};
|
|
243
|
+
const nextRound = () => {
|
|
244
|
+
if (!state.challenge) {
|
|
245
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
246
|
+
context: { error: "Cannot select, no Captcha found in state" }
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (state.index + 1 >= state.challenge.captchas.length) {
|
|
250
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
251
|
+
context: {
|
|
252
|
+
error: "Cannot select, index is out of range for this Captcha"
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
updateState({ index: state.index + 1 });
|
|
257
|
+
};
|
|
258
|
+
const loadProviderApi = async (providerUrl) => {
|
|
259
|
+
const config = getConfig();
|
|
260
|
+
if (!config.account.address) {
|
|
261
|
+
throw new ProsopoEnvError("GENERAL.SITE_KEY_MISSING");
|
|
262
|
+
}
|
|
263
|
+
return new ProviderApi(providerUrl, config.account.address);
|
|
264
|
+
};
|
|
265
|
+
const clearTimeout = () => {
|
|
266
|
+
window.clearTimeout(state.timeout);
|
|
267
|
+
updateState({ timeout: void 0 });
|
|
268
|
+
};
|
|
269
|
+
const setValidChallengeTimeout = () => {
|
|
270
|
+
const timeMillis = configOptional.captchas.image.solutionTimeout;
|
|
271
|
+
const successfullChallengeTimeout = setTimeout(() => {
|
|
272
|
+
updateState({ isHuman: false });
|
|
273
|
+
events.onExpired();
|
|
274
|
+
}, timeMillis);
|
|
275
|
+
updateState({ successfullChallengeTimeout });
|
|
276
|
+
};
|
|
277
|
+
const resetState = () => {
|
|
278
|
+
clearTimeout();
|
|
279
|
+
updateState(defaultState());
|
|
280
|
+
};
|
|
281
|
+
const loadAccount = async () => {
|
|
282
|
+
const config = getConfig();
|
|
283
|
+
if (!config.web2 && !config.userAccountAddress) {
|
|
284
|
+
throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
|
|
285
|
+
context: { error: "Account address has not been set for web3 mode" }
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
const ext = config.web2 ? new ExtensionWeb2() : new ExtensionWeb3();
|
|
289
|
+
const account = await ext.getAccount(config);
|
|
290
|
+
storage.setAccount(account.account.address);
|
|
291
|
+
updateState({ account });
|
|
292
|
+
return getAccount();
|
|
293
|
+
};
|
|
294
|
+
const getAccount = () => {
|
|
295
|
+
if (!state.account) {
|
|
296
|
+
throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
|
|
297
|
+
context: { error: "Account not loaded" }
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
const account = state.account;
|
|
301
|
+
return account;
|
|
302
|
+
};
|
|
303
|
+
const getDappAccount = () => {
|
|
304
|
+
if (!state.dappAccount) {
|
|
305
|
+
throw new ProsopoEnvError("GENERAL.SITE_KEY_MISSING");
|
|
306
|
+
}
|
|
307
|
+
const dappAccount = state.dappAccount;
|
|
308
|
+
return dappAccount;
|
|
309
|
+
};
|
|
310
|
+
const getExtension = (possiblyAccount) => {
|
|
311
|
+
const account = possiblyAccount || getAccount();
|
|
312
|
+
if (!account.extension) {
|
|
313
|
+
throw new ProsopoEnvError("ACCOUNT.NO_POLKADOT_EXTENSION", {
|
|
314
|
+
context: { error: "Extension not loaded" }
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
return account.extension;
|
|
318
|
+
};
|
|
319
|
+
return {
|
|
320
|
+
start,
|
|
321
|
+
cancel,
|
|
322
|
+
submit,
|
|
323
|
+
select,
|
|
324
|
+
nextRound
|
|
325
|
+
};
|
|
275
326
|
}
|
|
276
|
-
|
|
327
|
+
export {
|
|
328
|
+
Manager
|
|
329
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Manager.js","sourceRoot":"","sources":["../../src/modules/Manager.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EACN,mBAAmB,EACnB,eAAe,EACf,YAAY,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEN,SAAS,EAMT,sBAAsB,
|
|
1
|
+
{"version":3,"file":"Manager.js","sourceRoot":"","sources":["../../src/modules/Manager.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EACN,mBAAmB,EACnB,eAAe,EACf,YAAY,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEN,SAAS,EAMT,sBAAsB,EAItB,sBAAsB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AACvD,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,YAAY,GAAG,GAA6B,EAAE;IACnD,OAAO;QAEN,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,SAAS;QACrB,OAAO,EAAE,SAAS;KAElB,CAAC;AACH,CAAC,CAAC;AAKF,MAAM,UAAU,OAAO,CACtB,cAA4C,EAC5C,KAAsB,EACtB,aAAsC,EACtC,SAA8B;IAE9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAGjE,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAS3D,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,MAAM,MAAM,GAAgC;YAC3C,kBAAkB,EAAE,EAAE;YACtB,GAAG,cAAc;SACjB,CAAC;QAGF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3D,CAAC;QACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC;IAKF,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACxB,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,aAAa,CAClB,KAAK,IAAI,EAAE;YACV,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;YACR,CAAC;YACD,MAAM,eAAe,EAAE,CAAC;YAExB,UAAU,EAAE,CAAC;YAEb,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/B,WAAW,CAAC;gBACX,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7D,CAAC,CAAC;YAGH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAGrD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAEjB,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;YAGpC,MAAM,yBAAyB,GAAG,MAAM,uBAAuB,CAC9D,SAAS,EAAE,CACX,CAAC;YAEF,MAAM,WAAW,GAAG,yBAAyB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAE3D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;YAEvD,MAAM,UAAU,GAAG,IAAI,iBAAiB,CACvC,OAAO,CAAC,OAAO,CAAC,OAAO,EACvB,yBAAyB,EACzB,WAAW,EACX,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAC5B,CAAC;YACF,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;YAE5B,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,mBAAmB,EAAE,CAAC;YAEzD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACrB,WAAW,CAAC;oBACX,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,SAAS,CAAC,KAAK;iBACtB,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACpC,MAAM,IAAI,mBAAmB,CAAC,+BAA+B,CAAC,CAAC;gBAChE,CAAC;gBAGD,MAAM,UAAU,GAAW,SAAS,CAAC,QAAQ;qBAC3C,GAAG,CACH,CAAC,OAAO,EAAE,EAAE,CACX,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAC9D;qBACA,MAAM,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC/B,MAAM,CAAC,kBAAkB,EAAE,CAAC;oBAE5B,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACnE,CAAC,EAAE,UAAU,CAAC,CAAC;gBAGf,WAAW,CAAC;oBACX,KAAK,EAAE,CAAC;oBACR,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;oBAC3C,SAAS;oBACT,SAAS,EAAE,IAAI;oBACf,OAAO;iBACP,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,EACD,KAAK,EACL,UAAU,EACV,KAAK,CAAC,YAAY,EAClB,EAAE,CACF,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,aAAa,CAClB,KAAK,IAAI,EAAE;YAEV,YAAY,EAAE,CAAC;YAEf,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE;oBAC5C,OAAO,EAAE,EAAE,KAAK,EAAE,0CAA0C,EAAE;iBAC9D,CAAC,CAAC;YACJ,CAAC;YAGD,WAAW,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAElC,MAAM,SAAS,GAAwB,KAAK,CAAC,SAAS,CAAC;YACvD,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;YAG3B,MAAM,eAAe,GAAsB,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CACtE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;gBAClB,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC5C,OAAO;oBACN,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;oBAC1C,IAAI;oBACJ,QAAQ;iBACR,CAAC;YACH,CAAC,CACD,CAAC;YAEF,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAE5C,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,mBAAmB,CAAC,4BAA4B,EAAE;oBAC3D,OAAO,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE;iBACpD,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YAEpC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjB,MAAM,IAAI,YAAY,CAAC,uBAAuB,EAAE;oBAC/C,OAAO,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE;iBACnD,CAAC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,eAAe,CAAC,+BAA+B,EAAE;oBAC1D,OAAO,EAAE;wBACR,KAAK,EACJ,uEAAuE;qBACxE;iBACD,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,wBAAwB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBACrD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;gBAChC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC;gBACxC,IAAI,EAAE,OAAO;aACb,CAAC,CAAC;YAGH,MAAM,UAAU,GACf,MAAM,UAAU,CAAC,qBAAqB,CACrC,wBAAwB,CAAC,SAAS,EAClC,SAAS,CAAC,WAAW,EACrB,eAAe,EACf,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CACxC,CAAC;YAGH,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAEd,MAAM,CAAC,QAAQ,EAAE,CAAC;YACnB,CAAC;YAGD,WAAW,CAAC;gBACX,UAAU;gBACV,OAAO;gBACP,OAAO,EAAE,KAAK;aACd,CAAC,CAAC;YACH,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAErD,OAAO,CAAC,oBAAoB,CAAC;oBAC5B,GAAG,OAAO,CAAC,oBAAoB,EAAE;oBACjC,WAAW;iBACX,CAAC,CAAC;gBACH,MAAM,CAAC,OAAO,CACb,sBAAsB,CAAC;oBACtB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW;oBACpC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;oBACzC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE;oBAClC,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBAClD,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS;oBAC1C,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;wBACtB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;4BACrB,CAAC,SAAS,CAAC,WAAW,CAAC,EACtB,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW;yBACzC;wBACD,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;4BACjB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,wBAAwB,CAAC,SAAS;yBAC3D;qBACD;iBACD,CAAC,CACF,CAAC;gBACF,wBAAwB,EAAE,CAAC;YAC5B,CAAC;QACF,CAAC,EACD,KAAK,EACL,UAAU,EACV,KAAK,CAAC,YAAY,EAClB,EAAE,CACF,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QAEzB,YAAY,EAAE,CAAC;QAEf,UAAU,EAAE,CAAC;QAEb,MAAM,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC;IAMF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;QAC/B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE;gBAC5C,OAAO,EAAE,EAAE,KAAK,EAAE,0CAA0C,EAAE;aAC9D,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE;gBAC5C,OAAO,EAAE;oBACR,KAAK,EAAE,uDAAuD;iBAC9D;aACD,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAE7B,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YAEP,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC;IAKF,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE;gBAC5C,OAAO,EAAE,EAAE,KAAK,EAAE,0CAA0C,EAAE;aAC9D,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACxD,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE;gBAC5C,OAAO,EAAE;oBACR,KAAK,EAAE,uDAAuD;iBAC9D;aACD,CAAC,CAAC;QACJ,CAAC;QAED,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,EAAE,WAAmB,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QAEzB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,wBAAwB,GAAG,GAAG,EAAE;QACrC,MAAM,UAAU,GAAW,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC;QACzE,MAAM,2BAA2B,GAAG,UAAU,CAAC,GAAG,EAAE;YAEnD,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAEhC,MAAM,CAAC,SAAS,EAAE,CAAC;QACpB,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,WAAW,CAAC,EAAE,2BAA2B,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QAEvB,YAAY,EAAE,CAAC;QACf,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC;IAKF,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAChD,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;gBACtD,OAAO,EAAE,EAAE,KAAK,EAAE,gDAAgD,EAAE;aACpE,CAAC,CAAC;QACJ,CAAC;QAGD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE7C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE5C,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAEzB,OAAO,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;gBACtD,OAAO,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE;aACxC,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAY,KAAK,CAAC,OAAO,CAAC;QACvC,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,EAAE;QAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,WAAW,GAAW,KAAK,CAAC,WAAW,CAAC;QAC9C,OAAO,WAAW,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,eAAyB,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,eAAe,IAAI,UAAU,EAAE,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,eAAe,CAAC,+BAA+B,EAAE;gBAC1D,OAAO,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE;aAC1C,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC,SAAS,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO;QACN,KAAK;QACL,MAAM;QACN,MAAM;QACN,MAAM;QACN,SAAS;KACT,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ProviderApi } from "@prosopo/api";
|
|
2
|
-
import type
|
|
2
|
+
import { type CaptchaResponseBody, type CaptchaSolution, type ProcaptchaApiInterface, type RandomProvider } from "@prosopo/types";
|
|
3
3
|
import type { TCaptchaSubmitResult } from "@prosopo/types";
|
|
4
|
-
export declare class ProsopoCaptchaApi implements
|
|
4
|
+
export declare class ProsopoCaptchaApi implements ProcaptchaApiInterface {
|
|
5
5
|
userAccount: string;
|
|
6
6
|
provider: RandomProvider;
|
|
7
7
|
providerApi: ProviderApi;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProsopoCaptchaApi.d.ts","sourceRoot":"","sources":["../../src/modules/ProsopoCaptchaApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProsopoCaptchaApi.d.ts","sourceRoot":"","sources":["../../src/modules/ProsopoCaptchaApi.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,OAAO,EAEN,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAEpB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,qBAAa,iBAAkB,YAAW,sBAAsB;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;gBAGd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM;IASpB,IAAI,IAAI,IAAI,OAAO,CAElB;IAEY,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA8BnD,qBAAqB,CACjC,wBAAwB,EAAE,MAAM,EAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,eAAe,EAAE,EAC5B,SAAS,EAAE,MAAM,EACjB,4BAA4B,EAAE,MAAM,GAClC,OAAO,CAAC,oBAAoB,CAAC;CAsChC;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ProsopoDatasetError, ProsopoEnvError } from "@prosopo/common";
|
|
2
2
|
import { CaptchaMerkleTree, computeCaptchaSolutionHash, } from "@prosopo/datasets";
|
|
3
|
+
import { ApiParams, } from "@prosopo/types";
|
|
3
4
|
export class ProsopoCaptchaApi {
|
|
4
5
|
constructor(userAccount, provider, providerApi, web2, dappAccount) {
|
|
5
6
|
this.userAccount = userAccount;
|
|
@@ -14,6 +15,9 @@ export class ProsopoCaptchaApi {
|
|
|
14
15
|
async getCaptchaChallenge() {
|
|
15
16
|
try {
|
|
16
17
|
const captchaChallenge = await this.providerApi.getCaptchaChallenge(this.userAccount, this.provider);
|
|
18
|
+
if (captchaChallenge[ApiParams.error]) {
|
|
19
|
+
return captchaChallenge;
|
|
20
|
+
}
|
|
17
21
|
for (const captcha of captchaChallenge.captchas) {
|
|
18
22
|
for (const item of captcha.items) {
|
|
19
23
|
if (item.data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProsopoCaptchaApi.js","sourceRoot":"","sources":["../../src/modules/ProsopoCaptchaApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProsopoCaptchaApi.js","sourceRoot":"","sources":["../../src/modules/ProsopoCaptchaApi.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/procaptcha",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"author": "PROSOPO LIMITED <info@prosopo.io>",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
"@polkadot/api-contract": "10.13.1",
|
|
34
34
|
"@polkadot/util": "12.6.2",
|
|
35
35
|
"@polkadot/util-crypto": "12.6.2",
|
|
36
|
-
"@prosopo/account": "2.1.
|
|
37
|
-
"@prosopo/api": "2.1.
|
|
38
|
-
"@prosopo/common": "2.1.
|
|
39
|
-
"@prosopo/datasets": "2.1.
|
|
40
|
-
"@prosopo/load-balancer": "2.1.
|
|
41
|
-
"@prosopo/procaptcha-common": "2.1.
|
|
42
|
-
"@prosopo/types": "2.1.
|
|
43
|
-
"@prosopo/util": "2.1.
|
|
36
|
+
"@prosopo/account": "2.1.1",
|
|
37
|
+
"@prosopo/api": "2.1.1",
|
|
38
|
+
"@prosopo/common": "2.1.1",
|
|
39
|
+
"@prosopo/datasets": "2.1.1",
|
|
40
|
+
"@prosopo/load-balancer": "2.1.1",
|
|
41
|
+
"@prosopo/procaptcha-common": "2.1.1",
|
|
42
|
+
"@prosopo/types": "2.1.1",
|
|
43
|
+
"@prosopo/util": "2.1.1",
|
|
44
44
|
"jsdom": "25.0.0"
|
|
45
45
|
},
|
|
46
46
|
"overrides": {
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
}
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@prosopo/config": "2.1.
|
|
59
|
+
"@prosopo/config": "2.1.1",
|
|
60
60
|
"@vitest/coverage-v8": "2.1.1",
|
|
61
61
|
"concurrently": "9.0.1",
|
|
62
62
|
"dotenv": "16.4.5",
|