@prosopo/procaptcha 2.7.14 → 2.7.16
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/CHANGELOG.md +35 -0
- package/dist/index.js +9 -2
- package/dist/modules/Manager.js +328 -292
- package/dist/modules/ProsopoCaptchaApi.js +68 -55
- package/dist/modules/collector.js +69 -43
- package/dist/modules/index.js +8 -4
- package/package.json +18 -15
- package/vite.cjs.config.ts +4 -1
- package/{vite.test.config.ts → vite.esm.config.ts} +5 -21
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/modules/Manager.d.ts +0 -10
- package/dist/modules/Manager.d.ts.map +0 -1
- package/dist/modules/Manager.js.map +0 -1
- package/dist/modules/ProsopoCaptchaApi.d.ts +0 -16
- package/dist/modules/ProsopoCaptchaApi.d.ts.map +0 -1
- package/dist/modules/ProsopoCaptchaApi.js.map +0 -1
- package/dist/modules/collector.d.ts +0 -8
- package/dist/modules/collector.d.ts.map +0 -1
- package/dist/modules/collector.js.map +0 -1
- package/dist/modules/index.d.ts +0 -4
- package/dist/modules/index.d.ts.map +0 -1
- package/dist/modules/index.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# @prosopo/procaptcha
|
|
2
2
|
|
|
3
|
+
## 2.7.16
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- @prosopo/datasets@3.0.11
|
|
7
|
+
|
|
8
|
+
## 2.7.15
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- 3573f0b: fix npm scripts bundle command
|
|
12
|
+
- 3573f0b: build using vite, typecheck using tsc
|
|
13
|
+
- efd8102: Add tests for unwrap error helper
|
|
14
|
+
- 3573f0b: standardise all vite based npm scripts for bundling
|
|
15
|
+
- Updated dependencies [52dbf21]
|
|
16
|
+
- Updated dependencies [93d5e50]
|
|
17
|
+
- Updated dependencies [3573f0b]
|
|
18
|
+
- Updated dependencies [8a64429]
|
|
19
|
+
- Updated dependencies [3573f0b]
|
|
20
|
+
- Updated dependencies [efd8102]
|
|
21
|
+
- Updated dependencies [93d5e50]
|
|
22
|
+
- Updated dependencies [63519d7]
|
|
23
|
+
- Updated dependencies [f29fc7e]
|
|
24
|
+
- Updated dependencies [3573f0b]
|
|
25
|
+
- Updated dependencies [2d0dd8a]
|
|
26
|
+
- Updated dependencies [6d604ad]
|
|
27
|
+
- @prosopo/util@3.0.3
|
|
28
|
+
- @prosopo/util-crypto@13.5.2
|
|
29
|
+
- @prosopo/types@3.0.4
|
|
30
|
+
- @prosopo/procaptcha-common@2.7.10
|
|
31
|
+
- @prosopo/load-balancer@2.6.15
|
|
32
|
+
- @prosopo/datasets@3.0.10
|
|
33
|
+
- @prosopo/account@2.7.10
|
|
34
|
+
- @prosopo/common@3.1.0
|
|
35
|
+
- @prosopo/api@3.1.1
|
|
36
|
+
- @prosopo/config@3.1.1
|
|
37
|
+
|
|
3
38
|
## 2.7.14
|
|
4
39
|
### Patch Changes
|
|
5
40
|
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import "./modules/index.js";
|
|
2
|
+
import { Manager } from "./modules/Manager.js";
|
|
3
|
+
import { ProsopoCaptchaApi } from "./modules/ProsopoCaptchaApi.js";
|
|
4
|
+
import { startCollector } from "./modules/collector.js";
|
|
5
|
+
export {
|
|
6
|
+
Manager,
|
|
7
|
+
ProsopoCaptchaApi,
|
|
8
|
+
startCollector
|
|
9
|
+
};
|
package/dist/modules/Manager.js
CHANGED
|
@@ -1,312 +1,348 @@
|
|
|
1
1
|
import { stringToHex } from "@polkadot/util/string";
|
|
2
2
|
import { ProviderApi } from "@prosopo/api";
|
|
3
|
-
import { ProsopoDatasetError,
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { at, hashToHex } from "@prosopo/util";
|
|
8
|
-
import { sleep } from "@prosopo/util";
|
|
3
|
+
import { ProsopoDatasetError, ProsopoError, ProsopoEnvError } from "@prosopo/common";
|
|
4
|
+
import { getDefaultEvents, buildUpdateState, providerRetry, getRandomActiveProvider, ExtensionLoader } from "@prosopo/procaptcha-common";
|
|
5
|
+
import { ProcaptchaConfigSchema, ApiParams, encodeProcaptchaOutput } from "@prosopo/types";
|
|
6
|
+
import { sleep, at, hashToHex } from "@prosopo/util";
|
|
9
7
|
import { randomAsHex } from "@prosopo/util-crypto";
|
|
10
|
-
import ProsopoCaptchaApi from "./ProsopoCaptchaApi.js";
|
|
8
|
+
import { ProsopoCaptchaApi } from "./ProsopoCaptchaApi.js";
|
|
11
9
|
const defaultState = () => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
10
|
+
return {
|
|
11
|
+
// note order matters! see buildUpdateState. These fields are set in order, so disable modal first, then set loading to false, etc.
|
|
12
|
+
showModal: false,
|
|
13
|
+
loading: false,
|
|
14
|
+
index: 0,
|
|
15
|
+
challenge: void 0,
|
|
16
|
+
solutions: void 0,
|
|
17
|
+
isHuman: false,
|
|
18
|
+
captchaApi: void 0,
|
|
19
|
+
account: void 0
|
|
20
|
+
// don't handle timeout here, this should be handled by the state management
|
|
21
|
+
};
|
|
22
22
|
};
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
};
|
|
31
|
-
if (state.account) {
|
|
32
|
-
config.userAccountAddress = state.account.account.address;
|
|
33
|
-
}
|
|
34
|
-
return ProcaptchaConfigSchema.parse(config);
|
|
35
|
-
};
|
|
36
|
-
const start = async () => {
|
|
37
|
-
events.onOpen();
|
|
38
|
-
await providerRetry(async () => {
|
|
39
|
-
if (state.loading) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
if (state.isHuman) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
updateState({ loading: true });
|
|
46
|
-
updateState({
|
|
47
|
-
attemptCount: state.attemptCount ? state.attemptCount + 1 : 1,
|
|
48
|
-
});
|
|
49
|
-
updateState({
|
|
50
|
-
sessionId: frictionlessState?.sessionId,
|
|
51
|
-
});
|
|
52
|
-
const config = getConfig();
|
|
53
|
-
updateState({ dappAccount: config.account.address });
|
|
54
|
-
await sleep(100);
|
|
55
|
-
const account = await loadAccount();
|
|
56
|
-
let captchaApi = state.captchaApi;
|
|
57
|
-
if (!frictionlessState?.provider) {
|
|
58
|
-
const getRandomProviderResponse = await getRandomActiveProvider(getConfig());
|
|
59
|
-
const providerUrl = getRandomProviderResponse.provider.url;
|
|
60
|
-
const providerApi = await loadProviderApi(providerUrl);
|
|
61
|
-
captchaApi = new ProsopoCaptchaApi(account.account.address, getRandomProviderResponse, providerApi, config.web2, config.account.address || "");
|
|
62
|
-
updateState({ captchaApi });
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
const providerUrl = frictionlessState.provider.provider.url;
|
|
66
|
-
const providerApi = await loadProviderApi(providerUrl);
|
|
67
|
-
captchaApi = new ProsopoCaptchaApi(account.account.address, frictionlessState.provider, providerApi, config.web2, config.account.address || "");
|
|
68
|
-
updateState({ captchaApi });
|
|
69
|
-
}
|
|
70
|
-
const challenge = await captchaApi?.getCaptchaChallenge(state.sessionId);
|
|
71
|
-
if (challenge.error) {
|
|
72
|
-
updateState({
|
|
73
|
-
loading: false,
|
|
74
|
-
error: {
|
|
75
|
-
message: challenge.error.message,
|
|
76
|
-
key: challenge.error.key || "API.UNKNOWN_ERROR",
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
events.onError(new Error(challenge.error?.message));
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
if (challenge.captchas.length <= 0) {
|
|
83
|
-
throw new ProsopoDatasetError("DEVELOPER.PROVIDER_NO_CAPTCHA");
|
|
84
|
-
}
|
|
85
|
-
const timeMillis = challenge.captchas
|
|
86
|
-
.map((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
|
-
loading: false,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}, start, resetState, state.attemptCount, 10);
|
|
102
|
-
};
|
|
103
|
-
const submit = async () => {
|
|
104
|
-
await providerRetry(async () => {
|
|
105
|
-
clearTimeout();
|
|
106
|
-
if (!state.challenge) {
|
|
107
|
-
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
108
|
-
context: { error: "Cannot submit, no Captcha found in state" },
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
updateState({ showModal: false });
|
|
112
|
-
const challenge = state.challenge;
|
|
113
|
-
const salt = randomAsHex();
|
|
114
|
-
const captchaSolution = state.challenge.captchas.map((captcha, index) => {
|
|
115
|
-
const solution = at(state.solutions, index);
|
|
116
|
-
return {
|
|
117
|
-
captchaId: captcha.captchaId,
|
|
118
|
-
captchaContentId: captcha.captchaContentId,
|
|
119
|
-
salt,
|
|
120
|
-
solution,
|
|
121
|
-
};
|
|
122
|
-
});
|
|
123
|
-
const account = getAccount();
|
|
124
|
-
const signer = getExtension(account).signer;
|
|
125
|
-
const first = at(challenge.captchas, 0);
|
|
126
|
-
if (!first.datasetId) {
|
|
127
|
-
throw new ProsopoDatasetError("CAPTCHA.INVALID_CAPTCHA_ID", {
|
|
128
|
-
context: { error: "No datasetId set for challenge" },
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
const captchaApi = state.captchaApi;
|
|
132
|
-
if (!captchaApi) {
|
|
133
|
-
throw new ProsopoError("CAPTCHA.INVALID_TOKEN", {
|
|
134
|
-
context: { error: "No Captcha API found in state" },
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
if (!signer || !signer.signRaw) {
|
|
138
|
-
throw new ProsopoEnvError("GENERAL.CANT_FIND_KEYRINGPAIR", {
|
|
139
|
-
context: {
|
|
140
|
-
error: "Signer is not defined, cannot sign message to prove account ownership",
|
|
141
|
-
},
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
const userTimestampSignature = await signer.signRaw({
|
|
145
|
-
address: account.account.address,
|
|
146
|
-
data: stringToHex(challenge[ApiParams.timestamp]),
|
|
147
|
-
type: "bytes",
|
|
148
|
-
});
|
|
149
|
-
const submission = await captchaApi.submitCaptchaSolution(userTimestampSignature.signature, challenge.requestHash, captchaSolution, challenge.timestamp, challenge.signature.provider.requestHash);
|
|
150
|
-
const isHuman = submission[0].verified;
|
|
151
|
-
updateState({
|
|
152
|
-
submission,
|
|
153
|
-
isHuman,
|
|
154
|
-
loading: false,
|
|
155
|
-
});
|
|
156
|
-
if (state.isHuman) {
|
|
157
|
-
const providerUrl = captchaApi.provider.provider.url;
|
|
158
|
-
events.onHuman(encodeProcaptchaOutput({
|
|
159
|
-
[ApiParams.providerUrl]: providerUrl,
|
|
160
|
-
[ApiParams.user]: account.account.address,
|
|
161
|
-
[ApiParams.dapp]: getDappAccount(),
|
|
162
|
-
[ApiParams.commitmentId]: hashToHex(submission[1]),
|
|
163
|
-
[ApiParams.timestamp]: challenge.timestamp,
|
|
164
|
-
[ApiParams.signature]: {
|
|
165
|
-
[ApiParams.provider]: {
|
|
166
|
-
[ApiParams.requestHash]: challenge.signature.provider.requestHash,
|
|
167
|
-
},
|
|
168
|
-
[ApiParams.user]: {
|
|
169
|
-
[ApiParams.timestamp]: userTimestampSignature.signature,
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
}));
|
|
173
|
-
setValidChallengeTimeout();
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
events.onFailed();
|
|
177
|
-
resetState(frictionlessState?.restart);
|
|
178
|
-
}
|
|
179
|
-
}, start, resetState, state.attemptCount, 10);
|
|
180
|
-
};
|
|
181
|
-
const cancel = async () => {
|
|
182
|
-
clearTimeout();
|
|
183
|
-
resetState(frictionlessState?.restart);
|
|
184
|
-
events.onClose();
|
|
185
|
-
};
|
|
186
|
-
const reload = async () => {
|
|
187
|
-
clearTimeout();
|
|
188
|
-
events.onReload();
|
|
189
|
-
resetState(frictionlessState?.restart);
|
|
190
|
-
if (!frictionlessState?.restart) {
|
|
191
|
-
await start();
|
|
192
|
-
}
|
|
23
|
+
function Manager(configOptional, state, onStateUpdate, callbacks, frictionlessState) {
|
|
24
|
+
const events = getDefaultEvents(callbacks);
|
|
25
|
+
const updateState = buildUpdateState(state, onStateUpdate);
|
|
26
|
+
const getConfig = () => {
|
|
27
|
+
const config = {
|
|
28
|
+
userAccountAddress: "",
|
|
29
|
+
...configOptional
|
|
193
30
|
};
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
31
|
+
if (state.account) {
|
|
32
|
+
config.userAccountAddress = state.account.account.address;
|
|
33
|
+
}
|
|
34
|
+
return ProcaptchaConfigSchema.parse(config);
|
|
35
|
+
};
|
|
36
|
+
const start = async () => {
|
|
37
|
+
events.onOpen();
|
|
38
|
+
await providerRetry(
|
|
39
|
+
async () => {
|
|
40
|
+
if (state.loading) {
|
|
41
|
+
return;
|
|
199
42
|
}
|
|
200
|
-
if (state.
|
|
201
|
-
|
|
202
|
-
context: {
|
|
203
|
-
error: "Cannot select, index is out of range for this Captcha",
|
|
204
|
-
},
|
|
205
|
-
});
|
|
43
|
+
if (state.isHuman) {
|
|
44
|
+
return;
|
|
206
45
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
46
|
+
updateState({ loading: true });
|
|
47
|
+
updateState({
|
|
48
|
+
attemptCount: state.attemptCount ? state.attemptCount + 1 : 1
|
|
49
|
+
});
|
|
50
|
+
updateState({
|
|
51
|
+
sessionId: frictionlessState?.sessionId
|
|
52
|
+
});
|
|
53
|
+
const config = getConfig();
|
|
54
|
+
updateState({ dappAccount: config.account.address });
|
|
55
|
+
await sleep(100);
|
|
56
|
+
const account = await loadAccount();
|
|
57
|
+
let captchaApi = state.captchaApi;
|
|
58
|
+
if (!frictionlessState?.provider) {
|
|
59
|
+
const getRandomProviderResponse = await getRandomActiveProvider(
|
|
60
|
+
getConfig()
|
|
61
|
+
);
|
|
62
|
+
const providerUrl = getRandomProviderResponse.provider.url;
|
|
63
|
+
const providerApi = await loadProviderApi(providerUrl);
|
|
64
|
+
captchaApi = new ProsopoCaptchaApi(
|
|
65
|
+
account.account.address,
|
|
66
|
+
getRandomProviderResponse,
|
|
67
|
+
providerApi,
|
|
68
|
+
config.web2,
|
|
69
|
+
config.account.address || ""
|
|
70
|
+
);
|
|
71
|
+
updateState({ captchaApi });
|
|
72
|
+
} else {
|
|
73
|
+
const providerUrl = frictionlessState.provider.provider.url;
|
|
74
|
+
const providerApi = await loadProviderApi(providerUrl);
|
|
75
|
+
captchaApi = new ProsopoCaptchaApi(
|
|
76
|
+
account.account.address,
|
|
77
|
+
frictionlessState.provider,
|
|
78
|
+
providerApi,
|
|
79
|
+
config.web2,
|
|
80
|
+
config.account.address || ""
|
|
81
|
+
);
|
|
82
|
+
updateState({ captchaApi });
|
|
212
83
|
}
|
|
213
|
-
|
|
214
|
-
|
|
84
|
+
const challenge = await captchaApi?.getCaptchaChallenge(
|
|
85
|
+
state.sessionId
|
|
86
|
+
);
|
|
87
|
+
if (challenge.error) {
|
|
88
|
+
updateState({
|
|
89
|
+
loading: false,
|
|
90
|
+
error: {
|
|
91
|
+
message: challenge.error.message,
|
|
92
|
+
key: challenge.error.key || "API.UNKNOWN_ERROR"
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
events.onError(new Error(challenge.error?.message));
|
|
96
|
+
} else {
|
|
97
|
+
if (challenge.captchas.length <= 0) {
|
|
98
|
+
throw new ProsopoDatasetError("DEVELOPER.PROVIDER_NO_CAPTCHA");
|
|
99
|
+
}
|
|
100
|
+
const timeMillis = challenge.captchas.map(
|
|
101
|
+
(captcha) => captcha.timeLimitMs || config.captchas.image.challengeTimeout
|
|
102
|
+
).reduce((a, b) => a + b);
|
|
103
|
+
const timeout = setTimeout(() => {
|
|
104
|
+
events.onChallengeExpired();
|
|
105
|
+
updateState({ isHuman: false, showModal: false, loading: false });
|
|
106
|
+
}, timeMillis);
|
|
107
|
+
updateState({
|
|
108
|
+
index: 0,
|
|
109
|
+
solutions: challenge.captchas.map(() => []),
|
|
110
|
+
challenge,
|
|
111
|
+
showModal: true,
|
|
112
|
+
timeout,
|
|
113
|
+
loading: false
|
|
114
|
+
});
|
|
215
115
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
116
|
+
},
|
|
117
|
+
start,
|
|
118
|
+
resetState,
|
|
119
|
+
state.attemptCount,
|
|
120
|
+
10
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
const submit = async () => {
|
|
124
|
+
await providerRetry(
|
|
125
|
+
async () => {
|
|
126
|
+
clearTimeout();
|
|
219
127
|
if (!state.challenge) {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
if (state.index + 1 >= state.challenge.captchas.length) {
|
|
225
|
-
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
226
|
-
context: {
|
|
227
|
-
error: "Cannot select, index is out of range for this Captcha",
|
|
228
|
-
},
|
|
229
|
-
});
|
|
128
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
129
|
+
context: { error: "Cannot submit, no Captcha found in state" }
|
|
130
|
+
});
|
|
230
131
|
}
|
|
231
|
-
updateState({
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
|
|
132
|
+
updateState({ showModal: false });
|
|
133
|
+
const challenge = state.challenge;
|
|
134
|
+
const salt = randomAsHex();
|
|
135
|
+
const captchaSolution = state.challenge.captchas.map(
|
|
136
|
+
(captcha, index) => {
|
|
137
|
+
const solution = at(state.solutions, index);
|
|
138
|
+
return {
|
|
139
|
+
captchaId: captcha.captchaId,
|
|
140
|
+
captchaContentId: captcha.captchaContentId,
|
|
141
|
+
salt,
|
|
142
|
+
solution
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
);
|
|
146
|
+
const account = getAccount();
|
|
147
|
+
const signer = getExtension(account).signer;
|
|
148
|
+
const first = at(challenge.captchas, 0);
|
|
149
|
+
if (!first.datasetId) {
|
|
150
|
+
throw new ProsopoDatasetError("CAPTCHA.INVALID_CAPTCHA_ID", {
|
|
151
|
+
context: { error: "No datasetId set for challenge" }
|
|
152
|
+
});
|
|
237
153
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
};
|
|
244
|
-
const setValidChallengeTimeout = () => {
|
|
245
|
-
const timeMillis = configOptional.captchas.image.solutionTimeout;
|
|
246
|
-
const successfullChallengeTimeout = setTimeout(() => {
|
|
247
|
-
updateState({ isHuman: false });
|
|
248
|
-
events.onExpired();
|
|
249
|
-
}, timeMillis);
|
|
250
|
-
updateState({ successfullChallengeTimeout });
|
|
251
|
-
};
|
|
252
|
-
const resetState = (frictionlessRestart) => {
|
|
253
|
-
clearTimeout();
|
|
254
|
-
updateState(defaultState());
|
|
255
|
-
events.onReset();
|
|
256
|
-
if (frictionlessRestart) {
|
|
257
|
-
frictionlessRestart();
|
|
154
|
+
const captchaApi = state.captchaApi;
|
|
155
|
+
if (!captchaApi) {
|
|
156
|
+
throw new ProsopoError("CAPTCHA.INVALID_TOKEN", {
|
|
157
|
+
context: { error: "No Captcha API found in state" }
|
|
158
|
+
});
|
|
258
159
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
|
|
264
|
-
context: { error: "Account address has not been set for web3 mode" },
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
const selectAccount = async () => {
|
|
268
|
-
const ext = new (await ExtensionLoader(config.web2))();
|
|
269
|
-
if (frictionlessState) {
|
|
270
|
-
return frictionlessState.userAccount;
|
|
160
|
+
if (!signer || !signer.signRaw) {
|
|
161
|
+
throw new ProsopoEnvError("GENERAL.CANT_FIND_KEYRINGPAIR", {
|
|
162
|
+
context: {
|
|
163
|
+
error: "Signer is not defined, cannot sign message to prove account ownership"
|
|
271
164
|
}
|
|
272
|
-
|
|
273
|
-
};
|
|
274
|
-
const account = await selectAccount();
|
|
275
|
-
updateState({ account });
|
|
276
|
-
return getAccount();
|
|
277
|
-
};
|
|
278
|
-
const getAccount = () => {
|
|
279
|
-
if (!state.account) {
|
|
280
|
-
throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
|
|
281
|
-
context: { error: "Account not loaded" },
|
|
282
|
-
});
|
|
165
|
+
});
|
|
283
166
|
}
|
|
284
|
-
const
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
167
|
+
const userTimestampSignature = await signer.signRaw({
|
|
168
|
+
address: account.account.address,
|
|
169
|
+
data: stringToHex(challenge[ApiParams.timestamp]),
|
|
170
|
+
type: "bytes"
|
|
171
|
+
});
|
|
172
|
+
const submission = await captchaApi.submitCaptchaSolution(
|
|
173
|
+
userTimestampSignature.signature,
|
|
174
|
+
challenge.requestHash,
|
|
175
|
+
captchaSolution,
|
|
176
|
+
challenge.timestamp,
|
|
177
|
+
challenge.signature.provider.requestHash
|
|
178
|
+
);
|
|
179
|
+
const isHuman = submission[0].verified;
|
|
180
|
+
updateState({
|
|
181
|
+
submission,
|
|
182
|
+
isHuman,
|
|
183
|
+
loading: false
|
|
184
|
+
});
|
|
185
|
+
if (state.isHuman) {
|
|
186
|
+
const providerUrl = captchaApi.provider.provider.url;
|
|
187
|
+
events.onHuman(
|
|
188
|
+
encodeProcaptchaOutput({
|
|
189
|
+
[ApiParams.providerUrl]: providerUrl,
|
|
190
|
+
[ApiParams.user]: account.account.address,
|
|
191
|
+
[ApiParams.dapp]: getDappAccount(),
|
|
192
|
+
[ApiParams.commitmentId]: hashToHex(submission[1]),
|
|
193
|
+
[ApiParams.timestamp]: challenge.timestamp,
|
|
194
|
+
[ApiParams.signature]: {
|
|
195
|
+
[ApiParams.provider]: {
|
|
196
|
+
[ApiParams.requestHash]: challenge.signature.provider.requestHash
|
|
197
|
+
},
|
|
198
|
+
[ApiParams.user]: {
|
|
199
|
+
[ApiParams.timestamp]: userTimestampSignature.signature
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
})
|
|
203
|
+
);
|
|
204
|
+
setValidChallengeTimeout();
|
|
205
|
+
} else {
|
|
206
|
+
events.onFailed();
|
|
207
|
+
resetState(frictionlessState?.restart);
|
|
290
208
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
209
|
+
},
|
|
210
|
+
start,
|
|
211
|
+
resetState,
|
|
212
|
+
state.attemptCount,
|
|
213
|
+
10
|
|
214
|
+
);
|
|
215
|
+
};
|
|
216
|
+
const cancel = async () => {
|
|
217
|
+
clearTimeout();
|
|
218
|
+
resetState(frictionlessState?.restart);
|
|
219
|
+
events.onClose();
|
|
220
|
+
};
|
|
221
|
+
const reload = async () => {
|
|
222
|
+
clearTimeout();
|
|
223
|
+
events.onReload();
|
|
224
|
+
resetState(frictionlessState?.restart);
|
|
225
|
+
if (!frictionlessState?.restart) {
|
|
226
|
+
await start();
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
const select = (hash) => {
|
|
230
|
+
if (!state.challenge) {
|
|
231
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
232
|
+
context: { error: "Cannot select, no Captcha found in state" }
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
if (state.index >= state.challenge.captchas.length || state.index < 0) {
|
|
236
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
237
|
+
context: {
|
|
238
|
+
error: "Cannot select, index is out of range for this Captcha"
|
|
300
239
|
}
|
|
301
|
-
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
const index = state.index;
|
|
243
|
+
const solutions = state.solutions;
|
|
244
|
+
const solution = at(solutions, index);
|
|
245
|
+
if (solution.includes(hash)) {
|
|
246
|
+
solution.splice(solution.indexOf(hash), 1);
|
|
247
|
+
} else {
|
|
248
|
+
solution.push(hash);
|
|
249
|
+
}
|
|
250
|
+
updateState({ solutions });
|
|
251
|
+
};
|
|
252
|
+
const nextRound = () => {
|
|
253
|
+
if (!state.challenge) {
|
|
254
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
255
|
+
context: { error: "Cannot select, no Captcha found in state" }
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
if (state.index + 1 >= state.challenge.captchas.length) {
|
|
259
|
+
throw new ProsopoError("CAPTCHA.NO_CAPTCHA", {
|
|
260
|
+
context: {
|
|
261
|
+
error: "Cannot select, index is out of range for this Captcha"
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
updateState({ index: state.index + 1 });
|
|
266
|
+
};
|
|
267
|
+
const loadProviderApi = async (providerUrl) => {
|
|
268
|
+
const config = getConfig();
|
|
269
|
+
if (!config.account.address) {
|
|
270
|
+
throw new ProsopoEnvError("GENERAL.SITE_KEY_MISSING");
|
|
271
|
+
}
|
|
272
|
+
return new ProviderApi(providerUrl, config.account.address);
|
|
273
|
+
};
|
|
274
|
+
const clearTimeout = () => {
|
|
275
|
+
window.clearTimeout(Number(state.timeout));
|
|
276
|
+
updateState({ timeout: void 0 });
|
|
277
|
+
};
|
|
278
|
+
const setValidChallengeTimeout = () => {
|
|
279
|
+
const timeMillis = configOptional.captchas.image.solutionTimeout;
|
|
280
|
+
const successfullChallengeTimeout = setTimeout(() => {
|
|
281
|
+
updateState({ isHuman: false });
|
|
282
|
+
events.onExpired();
|
|
283
|
+
}, timeMillis);
|
|
284
|
+
updateState({ successfullChallengeTimeout });
|
|
285
|
+
};
|
|
286
|
+
const resetState = (frictionlessRestart) => {
|
|
287
|
+
clearTimeout();
|
|
288
|
+
updateState(defaultState());
|
|
289
|
+
events.onReset();
|
|
290
|
+
if (frictionlessRestart) {
|
|
291
|
+
frictionlessRestart();
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
const loadAccount = async () => {
|
|
295
|
+
const config = getConfig();
|
|
296
|
+
if (!config.web2 && !config.userAccountAddress) {
|
|
297
|
+
throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
|
|
298
|
+
context: { error: "Account address has not been set for web3 mode" }
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
const selectAccount = async () => {
|
|
302
|
+
const ext = new (await ExtensionLoader(config.web2))();
|
|
303
|
+
if (frictionlessState) {
|
|
304
|
+
return frictionlessState.userAccount;
|
|
305
|
+
}
|
|
306
|
+
return await ext.getAccount(config);
|
|
310
307
|
};
|
|
308
|
+
const account = await selectAccount();
|
|
309
|
+
updateState({ account });
|
|
310
|
+
return getAccount();
|
|
311
|
+
};
|
|
312
|
+
const getAccount = () => {
|
|
313
|
+
if (!state.account) {
|
|
314
|
+
throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
|
|
315
|
+
context: { error: "Account not loaded" }
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
const account = state.account;
|
|
319
|
+
return account;
|
|
320
|
+
};
|
|
321
|
+
const getDappAccount = () => {
|
|
322
|
+
if (!state.dappAccount) {
|
|
323
|
+
throw new ProsopoEnvError("GENERAL.SITE_KEY_MISSING");
|
|
324
|
+
}
|
|
325
|
+
const dappAccount = state.dappAccount;
|
|
326
|
+
return dappAccount;
|
|
327
|
+
};
|
|
328
|
+
const getExtension = (possiblyAccount) => {
|
|
329
|
+
const account = possiblyAccount || getAccount();
|
|
330
|
+
if (!account.extension) {
|
|
331
|
+
throw new ProsopoEnvError("ACCOUNT.NO_POLKADOT_EXTENSION", {
|
|
332
|
+
context: { error: "Extension not loaded" }
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
return account.extension;
|
|
336
|
+
};
|
|
337
|
+
return {
|
|
338
|
+
start,
|
|
339
|
+
cancel,
|
|
340
|
+
submit,
|
|
341
|
+
select,
|
|
342
|
+
nextRound,
|
|
343
|
+
reload
|
|
344
|
+
};
|
|
311
345
|
}
|
|
312
|
-
|
|
346
|
+
export {
|
|
347
|
+
Manager
|
|
348
|
+
};
|
|
@@ -1,59 +1,72 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CaptchaMerkleTree, computeCaptchaSolutionHash
|
|
3
|
-
import { ApiParams
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
catch (error) {
|
|
31
|
-
throw new ProsopoEnvError("CAPTCHA.INVALID_CAPTCHA_CHALLENGE", {
|
|
32
|
-
context: { error },
|
|
33
|
-
});
|
|
1
|
+
import { ProsopoEnvError, ProsopoDatasetError } from "@prosopo/common";
|
|
2
|
+
import { CaptchaMerkleTree, computeCaptchaSolutionHash } from "@prosopo/datasets";
|
|
3
|
+
import { ApiParams } from "@prosopo/types";
|
|
4
|
+
class ProsopoCaptchaApi {
|
|
5
|
+
constructor(userAccount, provider, providerApi, web2, dappAccount) {
|
|
6
|
+
this.userAccount = userAccount;
|
|
7
|
+
this.provider = provider;
|
|
8
|
+
this.providerApi = providerApi;
|
|
9
|
+
this._web2 = web2;
|
|
10
|
+
this.dappAccount = dappAccount;
|
|
11
|
+
}
|
|
12
|
+
get web2() {
|
|
13
|
+
return this._web2;
|
|
14
|
+
}
|
|
15
|
+
async getCaptchaChallenge(sessionId) {
|
|
16
|
+
try {
|
|
17
|
+
const captchaChallenge = await this.providerApi.getCaptchaChallenge(
|
|
18
|
+
this.userAccount,
|
|
19
|
+
this.provider,
|
|
20
|
+
sessionId
|
|
21
|
+
);
|
|
22
|
+
if (captchaChallenge[ApiParams.error]) {
|
|
23
|
+
return captchaChallenge;
|
|
24
|
+
}
|
|
25
|
+
for (const captcha of captchaChallenge.captchas) {
|
|
26
|
+
for (const item of captcha.items) {
|
|
27
|
+
if (item.data) {
|
|
28
|
+
item.data = `https://${item.data.replace(/^http(s)*:\/\//, "")}`;
|
|
29
|
+
}
|
|
34
30
|
}
|
|
31
|
+
}
|
|
32
|
+
return captchaChallenge;
|
|
33
|
+
} catch (error) {
|
|
34
|
+
throw new ProsopoEnvError("CAPTCHA.INVALID_CAPTCHA_CHALLENGE", {
|
|
35
|
+
context: { error }
|
|
36
|
+
});
|
|
35
37
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
38
|
+
}
|
|
39
|
+
async submitCaptchaSolution(userTimestampSignature, requestHash, solutions, timestamp, providerRequestHashSignature) {
|
|
40
|
+
const tree = new CaptchaMerkleTree();
|
|
41
|
+
const captchasHashed = solutions.map(
|
|
42
|
+
(captcha) => computeCaptchaSolutionHash(captcha)
|
|
43
|
+
);
|
|
44
|
+
tree.build(captchasHashed);
|
|
45
|
+
if (!tree.root) {
|
|
46
|
+
throw new ProsopoDatasetError("CAPTCHA.INVALID_CAPTCHA_CHALLENGE", {
|
|
47
|
+
context: { error: "Merkle tree root is undefined" }
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const commitmentId = tree.root.hash;
|
|
51
|
+
let result;
|
|
52
|
+
try {
|
|
53
|
+
result = await this.providerApi.submitCaptchaSolution(
|
|
54
|
+
solutions,
|
|
55
|
+
requestHash,
|
|
56
|
+
this.userAccount,
|
|
57
|
+
timestamp,
|
|
58
|
+
providerRequestHashSignature,
|
|
59
|
+
userTimestampSignature
|
|
60
|
+
);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
throw new ProsopoDatasetError("CAPTCHA.INVALID_CAPTCHA_CHALLENGE", {
|
|
63
|
+
context: { error }
|
|
64
|
+
});
|
|
56
65
|
}
|
|
66
|
+
return [result, commitmentId];
|
|
67
|
+
}
|
|
57
68
|
}
|
|
58
|
-
export
|
|
59
|
-
|
|
69
|
+
export {
|
|
70
|
+
ProsopoCaptchaApi,
|
|
71
|
+
ProsopoCaptchaApi as default
|
|
72
|
+
};
|
|
@@ -1,54 +1,80 @@
|
|
|
1
|
-
const COLLECTOR_LIMIT =
|
|
1
|
+
const COLLECTOR_LIMIT = 1e4;
|
|
2
2
|
const storeLog = (event, setEvents) => {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
setEvents((currentEvents) => {
|
|
4
|
+
let newEvents = [...currentEvents, event];
|
|
5
|
+
if (newEvents.length > COLLECTOR_LIMIT) {
|
|
6
|
+
newEvents = newEvents.slice(1);
|
|
7
|
+
}
|
|
8
|
+
return newEvents;
|
|
9
|
+
});
|
|
10
10
|
};
|
|
11
11
|
const logMouseEvent = (event, setMouseEvent) => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
const storedEvent = {
|
|
13
|
+
x: event.x,
|
|
14
|
+
y: event.y,
|
|
15
|
+
timestamp: event.timeStamp
|
|
16
|
+
};
|
|
17
|
+
storeLog(storedEvent, setMouseEvent);
|
|
18
18
|
};
|
|
19
19
|
const logKeyboardEvent = (event, setKeyboardEvent) => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
const storedEvent = {
|
|
21
|
+
key: event.key,
|
|
22
|
+
timestamp: event.timeStamp,
|
|
23
|
+
isShiftKey: event.shiftKey,
|
|
24
|
+
isCtrlKey: event.ctrlKey
|
|
25
|
+
};
|
|
26
|
+
storeLog(storedEvent, setKeyboardEvent);
|
|
27
27
|
};
|
|
28
28
|
const logTouchEvent = (event, setTouchEvent) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
for (const touch of Array.from(event.touches)) {
|
|
30
|
+
storeLog(
|
|
31
|
+
{ x: touch.clientX, y: touch.clientY, timestamp: event.timeStamp },
|
|
32
|
+
setTouchEvent
|
|
33
|
+
);
|
|
34
|
+
}
|
|
32
35
|
};
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
const startCollector = (setStoredMouseEvents, setStoredTouchEvents, setStoredKeyboardEvents, rootElement) => {
|
|
37
|
+
const form = findContainingForm(rootElement);
|
|
38
|
+
if (form) {
|
|
39
|
+
form.addEventListener(
|
|
40
|
+
"mousemove",
|
|
41
|
+
(e) => logMouseEvent(e, setStoredMouseEvents)
|
|
42
|
+
);
|
|
43
|
+
form.addEventListener(
|
|
44
|
+
"keydown",
|
|
45
|
+
(e) => logKeyboardEvent(e, setStoredKeyboardEvents)
|
|
46
|
+
);
|
|
47
|
+
form.addEventListener(
|
|
48
|
+
"keyup",
|
|
49
|
+
(e) => logKeyboardEvent(e, setStoredKeyboardEvents)
|
|
50
|
+
);
|
|
51
|
+
form.addEventListener(
|
|
52
|
+
"touchstart",
|
|
53
|
+
(e) => logTouchEvent(e, setStoredTouchEvents)
|
|
54
|
+
);
|
|
55
|
+
form.addEventListener(
|
|
56
|
+
"touchend",
|
|
57
|
+
(e) => logTouchEvent(e, setStoredTouchEvents)
|
|
58
|
+
);
|
|
59
|
+
form.addEventListener(
|
|
60
|
+
"touchcancel",
|
|
61
|
+
(e) => logTouchEvent(e, setStoredTouchEvents)
|
|
62
|
+
);
|
|
63
|
+
form.addEventListener(
|
|
64
|
+
"touchmove",
|
|
65
|
+
(e) => logTouchEvent(e, setStoredTouchEvents)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
44
68
|
};
|
|
45
69
|
const findContainingForm = (element) => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
70
|
+
if (element.tagName === "FORM") {
|
|
71
|
+
return element;
|
|
72
|
+
}
|
|
73
|
+
if (element.parentElement) {
|
|
74
|
+
return findContainingForm(element.parentElement);
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
};
|
|
78
|
+
export {
|
|
79
|
+
startCollector
|
|
53
80
|
};
|
|
54
|
-
//# sourceMappingURL=collector.js.map
|
package/dist/modules/index.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { Manager } from "./Manager.js";
|
|
2
|
+
import { ProsopoCaptchaApi } from "./ProsopoCaptchaApi.js";
|
|
3
|
+
import { startCollector } from "./collector.js";
|
|
4
|
+
export {
|
|
5
|
+
Manager,
|
|
6
|
+
ProsopoCaptchaApi,
|
|
7
|
+
startCollector
|
|
8
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/procaptcha",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.16",
|
|
4
4
|
"author": "PROSOPO LIMITED <info@prosopo.io>",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -11,13 +11,16 @@
|
|
|
11
11
|
"npm": "10.8.2"
|
|
12
12
|
},
|
|
13
13
|
"scripts": {
|
|
14
|
-
"clean": "
|
|
15
|
-
"build": "
|
|
16
|
-
"build:
|
|
17
|
-
"
|
|
14
|
+
"clean": "del-cli --verbose dist tsconfig.tsbuildinfo",
|
|
15
|
+
"build": "NODE_ENV=${NODE_ENV:-production}; vite build --config vite.esm.config.ts --mode $NODE_ENV",
|
|
16
|
+
"build:tsc": "tsc --build --verbose",
|
|
17
|
+
"build:cjs": "NODE_ENV=${NODE_ENV:-production}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
|
|
18
|
+
"typecheck": "tsc --build --declaration --emitDeclarationOnly",
|
|
19
|
+
"test": "echo no tests"
|
|
18
20
|
},
|
|
19
21
|
"exports": {
|
|
20
22
|
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
21
24
|
"import": "./dist/index.js",
|
|
22
25
|
"require": "./dist/cjs/index.cjs"
|
|
23
26
|
},
|
|
@@ -30,20 +33,21 @@
|
|
|
30
33
|
},
|
|
31
34
|
"dependencies": {
|
|
32
35
|
"@polkadot/util": "12.6.2",
|
|
33
|
-
"@prosopo/account": "2.7.
|
|
34
|
-
"@prosopo/api": "3.1.
|
|
35
|
-
"@prosopo/common": "3.0
|
|
36
|
-
"@prosopo/datasets": "3.0.
|
|
37
|
-
"@prosopo/load-balancer": "2.6.
|
|
38
|
-
"@prosopo/procaptcha-common": "2.7.
|
|
39
|
-
"@prosopo/types": "3.0.
|
|
40
|
-
"@prosopo/util": "3.0.
|
|
41
|
-
"@prosopo/util-crypto": "13.5.
|
|
36
|
+
"@prosopo/account": "2.7.10",
|
|
37
|
+
"@prosopo/api": "3.1.1",
|
|
38
|
+
"@prosopo/common": "3.1.0",
|
|
39
|
+
"@prosopo/datasets": "3.0.11",
|
|
40
|
+
"@prosopo/load-balancer": "2.6.15",
|
|
41
|
+
"@prosopo/procaptcha-common": "2.7.10",
|
|
42
|
+
"@prosopo/types": "3.0.4",
|
|
43
|
+
"@prosopo/util": "3.0.3",
|
|
44
|
+
"@prosopo/util-crypto": "13.5.2",
|
|
42
45
|
"@typegoose/auto-increment": "4.13.0",
|
|
43
46
|
"axios": "1.10.0",
|
|
44
47
|
"esbuild": "0.25.6",
|
|
45
48
|
"express": "4.21.2",
|
|
46
49
|
"jsdom": "25.0.0",
|
|
50
|
+
"@prosopo/config": "3.1.1",
|
|
47
51
|
"openpgp": "5.11.3",
|
|
48
52
|
"webpack-dev-server": "5.2.2"
|
|
49
53
|
},
|
|
@@ -60,7 +64,6 @@
|
|
|
60
64
|
}
|
|
61
65
|
},
|
|
62
66
|
"devDependencies": {
|
|
63
|
-
"@prosopo/config": "3.1.0",
|
|
64
67
|
"@vitest/coverage-v8": "3.0.9",
|
|
65
68
|
"concurrently": "9.0.1",
|
|
66
69
|
"del-cli": "6.0.0",
|
package/vite.cjs.config.ts
CHANGED
|
@@ -15,5 +15,8 @@ import path from "node:path";
|
|
|
15
15
|
import { ViteCommonJSConfig } from "@prosopo/config";
|
|
16
16
|
|
|
17
17
|
export default function () {
|
|
18
|
-
return ViteCommonJSConfig(
|
|
18
|
+
return ViteCommonJSConfig(
|
|
19
|
+
path.basename("."),
|
|
20
|
+
path.resolve("./tsconfig.json"),
|
|
21
|
+
);
|
|
19
22
|
}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import dotenv from "dotenv";
|
|
4
1
|
// Copyright 2021-2025 Prosopo (UK) Ltd.
|
|
5
2
|
//
|
|
6
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -14,23 +11,10 @@ import dotenv from "dotenv";
|
|
|
14
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
12
|
// See the License for the specific language governing permissions and
|
|
16
13
|
// limitations under the License.
|
|
17
|
-
import { defineConfig } from "vitest/config";
|
|
18
|
-
process.env.NODE_ENV = "test";
|
|
19
|
-
// if .env.test exists at this level, use it, otherwise use the one at the root
|
|
20
|
-
const envFile = `.env.${process.env.NODE_ENV || "development"}`;
|
|
21
|
-
let envPath = envFile;
|
|
22
|
-
if (fs.existsSync(envFile)) {
|
|
23
|
-
envPath = path.resolve(envFile);
|
|
24
|
-
} else if (fs.existsSync(`../../${envFile}`)) {
|
|
25
|
-
envPath = path.resolve(`../../${envFile}`);
|
|
26
|
-
} else {
|
|
27
|
-
throw new Error(`No ${envFile} file found`);
|
|
28
|
-
}
|
|
29
14
|
|
|
30
|
-
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import { ViteEsmConfig } from "@prosopo/config";
|
|
31
17
|
|
|
32
|
-
export default
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
},
|
|
36
|
-
});
|
|
18
|
+
export default function () {
|
|
19
|
+
return ViteEsmConfig(path.basename("."), path.resolve("./tsconfig.json"));
|
|
20
|
+
}
|
package/dist/index.d.ts
DELETED
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type FrictionlessState, type ProcaptchaCallbacks, type ProcaptchaClientConfigOutput, type ProcaptchaState, type ProcaptchaStateUpdateFn } from "@prosopo/types";
|
|
2
|
-
export declare function Manager(configOptional: ProcaptchaClientConfigOutput, state: ProcaptchaState, onStateUpdate: ProcaptchaStateUpdateFn, callbacks: ProcaptchaCallbacks, frictionlessState?: FrictionlessState): {
|
|
3
|
-
start: () => Promise<void>;
|
|
4
|
-
cancel: () => Promise<void>;
|
|
5
|
-
submit: () => Promise<void>;
|
|
6
|
-
select: (hash: string) => void;
|
|
7
|
-
nextRound: () => void;
|
|
8
|
-
reload: () => Promise<void>;
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=Manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Manager.d.ts","sourceRoot":"","sources":["../../src/modules/Manager.ts"],"names":[],"mappings":"AA4BA,OAAO,EAKN,KAAK,iBAAiB,EACtB,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,EAC9B,iBAAiB,CAAC,EAAE,iBAAiB;;;;mBA6Rf,MAAM;;;EAwJ5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Manager.js","sourceRoot":"","sources":["../../src/modules/Manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { ProviderApi } from "@prosopo/api";
|
|
2
|
-
import { type CaptchaResponseBody, type CaptchaSolution, type ProcaptchaApiInterface, type RandomProvider } from "@prosopo/types";
|
|
3
|
-
import type { TCaptchaSubmitResult } from "@prosopo/types";
|
|
4
|
-
export declare class ProsopoCaptchaApi implements ProcaptchaApiInterface {
|
|
5
|
-
userAccount: string;
|
|
6
|
-
provider: RandomProvider;
|
|
7
|
-
providerApi: ProviderApi;
|
|
8
|
-
dappAccount: string;
|
|
9
|
-
_web2: boolean;
|
|
10
|
-
constructor(userAccount: string, provider: RandomProvider, providerApi: ProviderApi, web2: boolean, dappAccount: string);
|
|
11
|
-
get web2(): boolean;
|
|
12
|
-
getCaptchaChallenge(sessionId?: string): Promise<CaptchaResponseBody>;
|
|
13
|
-
submitCaptchaSolution(userTimestampSignature: string, requestHash: string, solutions: CaptchaSolution[], timestamp: string, providerRequestHashSignature: string): Promise<TCaptchaSubmitResult>;
|
|
14
|
-
}
|
|
15
|
-
export default ProsopoCaptchaApi;
|
|
16
|
-
//# sourceMappingURL=ProsopoCaptchaApi.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProsopoCaptchaApi.d.ts","sourceRoot":"","sources":["../../src/modules/ProsopoCaptchaApi.ts"],"names":[],"mappings":"AAcA,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,CAC/B,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC;IA8BlB,qBAAqB,CACjC,sBAAsB,EAAE,MAAM,EAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,eAAe,EAAE,EAC5B,SAAS,EAAE,MAAM,EACjB,4BAA4B,EAAE,MAAM,GAClC,OAAO,CAAC,oBAAoB,CAAC;CAoChC;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProsopoCaptchaApi.js","sourceRoot":"","sources":["../../src/modules/ProsopoCaptchaApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ProsopoKeyboardEvent, ProsopoMouseEvent, ProsopoTouchEvent } from "@prosopo/types";
|
|
2
|
-
type SetStateAction<T> = T | ((prevState: T) => T);
|
|
3
|
-
type SetMouseEvent = (setValueFunc: SetStateAction<ProsopoMouseEvent[]>) => void;
|
|
4
|
-
type SetKeyboardEvent = (setValueFunc: SetStateAction<ProsopoKeyboardEvent[]>) => void;
|
|
5
|
-
type SetTouchEvent = (setValueFunc: SetStateAction<ProsopoTouchEvent[]>) => void;
|
|
6
|
-
export declare const startCollector: (setStoredMouseEvents: SetMouseEvent, setStoredTouchEvents: SetTouchEvent, setStoredKeyboardEvents: SetKeyboardEvent, rootElement: HTMLDivElement) => void;
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/modules/collector.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACX,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,MAAM,gBAAgB,CAAC;AAIxB,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAEnD,KAAK,aAAa,GAAG,CACpB,YAAY,EAAE,cAAc,CAAC,iBAAiB,EAAE,CAAC,KAC7C,IAAI,CAAC;AACV,KAAK,gBAAgB,GAAG,CACvB,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,CAAC,KAChD,IAAI,CAAC;AACV,KAAK,aAAa,GAAG,CACpB,YAAY,EAAE,cAAc,CAAC,iBAAiB,EAAE,CAAC,KAC7C,IAAI,CAAC;AAiDV,eAAO,MAAM,cAAc,yBACJ,aAAa,wBACb,aAAa,2BACV,gBAAgB,eAC5B,cAAc,SA+B3B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/modules/collector.ts"],"names":[],"mappings":"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"}
|
package/dist/modules/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAaA,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAaA,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|