@prosopo/server 0.3.39 → 0.3.41
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/config.cjs +11 -4
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/server.cjs +40 -34
- package/dist/config.d.ts +19 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -3
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +4 -7
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +35 -30
- package/dist/server.js.map +1 -1
- package/package.json +8 -7
package/dist/cjs/config.cjs
CHANGED
|
@@ -5,14 +5,21 @@ const getServerConfig = () => types.ProsopoServerConfigSchema.parse({
|
|
|
5
5
|
defaultEnvironment: process.env.PROSOPO_DEFAULT_ENVIRONMENT,
|
|
6
6
|
// enviromental variables
|
|
7
7
|
defaultNetwork: process.env.PROSOPO_DEFAULT_NETWORK,
|
|
8
|
-
serverUrl: (
|
|
9
|
-
// https://github.com/prosopo/captcha/issues/701
|
|
10
|
-
process.env.PROSOPO_SERVER_URL && process.env.PROSOPO_SERVER_PORT ? `${process.env.PROSOPO_SERVER_URL}:${process.env.PROSOPO_SERVER_PORT}` : "http://localhost:9228"
|
|
11
|
-
),
|
|
8
|
+
serverUrl: getServerUrl(),
|
|
12
9
|
dappName: process.env.PROSOPO_DAPP_NAME || "client-example-server",
|
|
13
10
|
account: {
|
|
14
11
|
password: "",
|
|
15
12
|
address: process.env.PROSOPO_SITE_KEY || ""
|
|
16
13
|
}
|
|
17
14
|
});
|
|
15
|
+
const getServerUrl = () => {
|
|
16
|
+
if (process.env.PROSOPO_SERVER_URL) {
|
|
17
|
+
if (process.env.PROSOPO_SERVER_URL.match(/:\d+/)) {
|
|
18
|
+
return process.env.PROSOPO_SERVER_URL;
|
|
19
|
+
}
|
|
20
|
+
return `${process.env.PROSOPO_SERVER_URL}:${process.env.PROSOPO_SERVER_PORT || 9228}`;
|
|
21
|
+
}
|
|
22
|
+
return "http://localhost:9228";
|
|
23
|
+
};
|
|
18
24
|
exports.getServerConfig = getServerConfig;
|
|
25
|
+
exports.getServerUrl = getServerUrl;
|
package/dist/cjs/index.cjs
CHANGED
package/dist/cjs/server.cjs
CHANGED
|
@@ -9,8 +9,6 @@ const api = require("@prosopo/api");
|
|
|
9
9
|
const ws = require("@polkadot/rpc-provider/ws");
|
|
10
10
|
const contractInfo = require("@prosopo/captcha-contract/contract-info");
|
|
11
11
|
const util = require("@prosopo/util");
|
|
12
|
-
const DEFAULT_MAX_VERIFIED_TIME_CACHED = 60 * 1e3;
|
|
13
|
-
const DEFAULT_MAX_VERIFIED_TIME_CONTRACT = 5 * 60 * 1e3;
|
|
14
12
|
class ProsopoServer {
|
|
15
13
|
constructor(config, pair) {
|
|
16
14
|
this.config = config;
|
|
@@ -97,18 +95,6 @@ class ProsopoServer {
|
|
|
97
95
|
}
|
|
98
96
|
return void 0;
|
|
99
97
|
}
|
|
100
|
-
/**
|
|
101
|
-
* Verify the time since the blockNumber is equal to or less than the maxVerifiedTime.
|
|
102
|
-
* @param maxVerifiedTime
|
|
103
|
-
* @param blockNumber
|
|
104
|
-
*/
|
|
105
|
-
async verifyRecency(blockNumber, maxVerifiedTime) {
|
|
106
|
-
const contractApi = await this.getContractApi();
|
|
107
|
-
const currentBlock = await contract.getCurrentBlockNumber(contractApi.api);
|
|
108
|
-
const blocksPassed = currentBlock - blockNumber;
|
|
109
|
-
const blockTime = contract.getBlockTimeMs(contractApi.api);
|
|
110
|
-
return blockTime * blocksPassed <= maxVerifiedTime;
|
|
111
|
-
}
|
|
112
98
|
/**
|
|
113
99
|
* Verify the user with the contract. We check the contract to see if the user has completed a captcha in the
|
|
114
100
|
* past. If they have, we check the time since the last correct captcha is within the maxVerifiedTime and we check
|
|
@@ -116,13 +102,27 @@ class ProsopoServer {
|
|
|
116
102
|
* @param user
|
|
117
103
|
* @param maxVerifiedTime
|
|
118
104
|
*/
|
|
119
|
-
async verifyContract(user, maxVerifiedTime
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
105
|
+
async verifyContract(user, maxVerifiedTime) {
|
|
106
|
+
try {
|
|
107
|
+
const contractApi = await this.getContractApi();
|
|
108
|
+
this.logger.info("Provider URL not provided. Verifying with contract.");
|
|
109
|
+
const correctCaptchaBlockNumber = (await contractApi.query.dappOperatorLastCorrectCaptcha(user)).value.unwrap().unwrap().before.valueOf();
|
|
110
|
+
const recent = await contract.verifyRecency(
|
|
111
|
+
(await this.getContractApi()).api,
|
|
112
|
+
correctCaptchaBlockNumber,
|
|
113
|
+
maxVerifiedTime
|
|
114
|
+
);
|
|
115
|
+
if (!recent) {
|
|
116
|
+
this.logger.info("User has not completed a captcha recently");
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const isHuman = (await contractApi.query.dappOperatorIsHumanUser(user, this.config.solutionThreshold)).value.unwrap().unwrap();
|
|
120
|
+
this.logger.info("isHuman", isHuman);
|
|
121
|
+
return isHuman;
|
|
122
|
+
} catch (error) {
|
|
123
|
+
this.logger.error(error);
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
128
|
* Verify the user with the provider URL passed in. If a challenge is provided, we use the challenge to verify the
|
|
@@ -131,28 +131,36 @@ class ProsopoServer {
|
|
|
131
131
|
* @param dapp
|
|
132
132
|
* @param user
|
|
133
133
|
* @param blockNumber
|
|
134
|
+
* @param timeouts
|
|
134
135
|
* @param challenge
|
|
135
136
|
* @param commitmentId
|
|
136
|
-
* @param maxVerifiedTime
|
|
137
137
|
*/
|
|
138
|
-
async verifyProvider(providerUrl, dapp, user, blockNumber, challenge, commitmentId
|
|
138
|
+
async verifyProvider(providerUrl, dapp, user, blockNumber, timeouts, challenge, commitmentId) {
|
|
139
139
|
this.logger.info("Verifying with provider.");
|
|
140
140
|
const providerApi = await this.getProviderApi(providerUrl);
|
|
141
141
|
if (challenge) {
|
|
142
|
-
const result2 = await providerApi.submitPowCaptchaVerify(challenge, dapp);
|
|
142
|
+
const result2 = await providerApi.submitPowCaptchaVerify(challenge, dapp, timeouts.pow.cachedTimeout);
|
|
143
143
|
return result2.verified;
|
|
144
144
|
}
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
145
|
+
const recent = await contract.verifyRecency((await this.getContractApi()).api, blockNumber, timeouts.image.cachedTimeout);
|
|
146
|
+
if (!recent) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const result = await providerApi.verifyDappUser(
|
|
150
|
+
dapp,
|
|
151
|
+
user,
|
|
152
|
+
blockNumber,
|
|
153
|
+
commitmentId,
|
|
154
|
+
timeouts.image.cachedTimeout
|
|
155
|
+
);
|
|
156
|
+
return result.verified;
|
|
148
157
|
}
|
|
149
158
|
/**
|
|
150
159
|
*
|
|
151
160
|
* @param payload Info output by procaptcha on completion of the captcha process
|
|
152
|
-
* @param maxVerifiedTime Maximum time in milliseconds since the blockNumber
|
|
153
161
|
* @returns
|
|
154
162
|
*/
|
|
155
|
-
async isVerified(payload
|
|
163
|
+
async isVerified(payload) {
|
|
156
164
|
const { user, dapp, providerUrl, commitmentId, blockNumber, challenge } = payload;
|
|
157
165
|
if (providerUrl && blockNumber) {
|
|
158
166
|
return await this.verifyProvider(
|
|
@@ -160,12 +168,12 @@ class ProsopoServer {
|
|
|
160
168
|
dapp,
|
|
161
169
|
user,
|
|
162
170
|
blockNumber,
|
|
171
|
+
this.config.timeouts,
|
|
163
172
|
challenge,
|
|
164
|
-
commitmentId
|
|
165
|
-
maxVerifiedTime
|
|
173
|
+
commitmentId
|
|
166
174
|
);
|
|
167
175
|
} else {
|
|
168
|
-
return await this.verifyContract(user, maxVerifiedTime);
|
|
176
|
+
return await this.verifyContract(user, this.config.timeouts.contract.maxVerifiedTime);
|
|
169
177
|
}
|
|
170
178
|
}
|
|
171
179
|
async getContractApi() {
|
|
@@ -180,6 +188,4 @@ class ProsopoServer {
|
|
|
180
188
|
return this.contract;
|
|
181
189
|
}
|
|
182
190
|
}
|
|
183
|
-
exports.DEFAULT_MAX_VERIFIED_TIME_CACHED = DEFAULT_MAX_VERIFIED_TIME_CACHED;
|
|
184
|
-
exports.DEFAULT_MAX_VERIFIED_TIME_CONTRACT = DEFAULT_MAX_VERIFIED_TIME_CONTRACT;
|
|
185
191
|
exports.ProsopoServer = ProsopoServer;
|
package/dist/config.d.ts
CHANGED
|
@@ -8,17 +8,33 @@ export declare const getServerConfig: () => {
|
|
|
8
8
|
password?: string | undefined;
|
|
9
9
|
};
|
|
10
10
|
networks: Record<"development" | "rococo" | "shiden", {
|
|
11
|
+
endpoint: string;
|
|
11
12
|
contract: {
|
|
12
|
-
name: string;
|
|
13
13
|
address: string;
|
|
14
|
+
name: string;
|
|
14
15
|
};
|
|
15
|
-
endpoint: string;
|
|
16
16
|
pairType: "sr25519" | "ed25519" | "ecdsa" | "ethereum";
|
|
17
17
|
ss58Format: number;
|
|
18
18
|
}>;
|
|
19
19
|
web2: boolean;
|
|
20
20
|
solutionThreshold: number;
|
|
21
21
|
dappName: string;
|
|
22
|
+
timeouts: {
|
|
23
|
+
image: {
|
|
24
|
+
challengeTimeout: number;
|
|
25
|
+
solutionTimeout: number;
|
|
26
|
+
verifiedTimeout: number;
|
|
27
|
+
cachedTimeout: number;
|
|
28
|
+
};
|
|
29
|
+
contract: {
|
|
30
|
+
maxVerifiedTime: number;
|
|
31
|
+
};
|
|
32
|
+
pow: {
|
|
33
|
+
solutionTimeout: number;
|
|
34
|
+
verifiedTimeout: number;
|
|
35
|
+
cachedTimeout: number;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
22
38
|
database?: Partial<Record<"development" | "staging" | "production", {
|
|
23
39
|
type: string;
|
|
24
40
|
endpoint: string;
|
|
@@ -29,4 +45,5 @@ export declare const getServerConfig: () => {
|
|
|
29
45
|
userAccountAddress?: string | undefined;
|
|
30
46
|
serverUrl?: string | undefined;
|
|
31
47
|
};
|
|
48
|
+
export declare const getServerUrl: () => string;
|
|
32
49
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAUtB,CAAA;AAEN,eAAO,MAAM,YAAY,QAAO,MAQ/B,CAAA"}
|
package/dist/config.js
CHANGED
|
@@ -2,13 +2,20 @@ import { ProsopoServerConfigSchema } from '@prosopo/types';
|
|
|
2
2
|
export const getServerConfig = () => ProsopoServerConfigSchema.parse({
|
|
3
3
|
defaultEnvironment: process.env.PROSOPO_DEFAULT_ENVIRONMENT,
|
|
4
4
|
defaultNetwork: process.env.PROSOPO_DEFAULT_NETWORK,
|
|
5
|
-
serverUrl:
|
|
6
|
-
? `${process.env.PROSOPO_SERVER_URL}:${process.env.PROSOPO_SERVER_PORT}`
|
|
7
|
-
: 'http://localhost:9228',
|
|
5
|
+
serverUrl: getServerUrl(),
|
|
8
6
|
dappName: process.env.PROSOPO_DAPP_NAME || 'client-example-server',
|
|
9
7
|
account: {
|
|
10
8
|
password: '',
|
|
11
9
|
address: process.env.PROSOPO_SITE_KEY || '',
|
|
12
10
|
},
|
|
13
11
|
});
|
|
12
|
+
export const getServerUrl = () => {
|
|
13
|
+
if (process.env.PROSOPO_SERVER_URL) {
|
|
14
|
+
if (process.env.PROSOPO_SERVER_URL.match(/:\d+/)) {
|
|
15
|
+
return process.env.PROSOPO_SERVER_URL;
|
|
16
|
+
}
|
|
17
|
+
return `${process.env.PROSOPO_SERVER_URL}:${process.env.PROSOPO_SERVER_PORT || 9228}`;
|
|
18
|
+
}
|
|
19
|
+
return 'http://localhost:9228';
|
|
20
|
+
};
|
|
14
21
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAChC,yBAAyB,CAAC,KAAK,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B;IAC3D,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;IACnD,SAAS,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAChC,yBAAyB,CAAC,KAAK,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B;IAC3D,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;IACnD,SAAS,EAAE,YAAY,EAAE;IACzB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,uBAAuB;IAClE,OAAO,EAAE;QACL,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;KAC9C;CACJ,CAAC,CAAA;AAEN,MAAM,CAAC,MAAM,YAAY,GAAG,GAAW,EAAE;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;SACxC;QACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAA;KACxF;IACD,OAAO,uBAAuB,CAAA;AAClC,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ProsopoServer } from './server.js';
|
|
2
2
|
export { ProsopoServer } from './server.js';
|
|
3
|
-
export { getServerConfig } from './config.js';
|
|
3
|
+
export { getServerConfig, getServerUrl } from './config.js';
|
|
4
4
|
import { ProsopoServerConfigOutput } from '@prosopo/types';
|
|
5
5
|
export declare const PublicProsopoServer: (config: ProsopoServerConfigOutput) => Promise<ProsopoServer>;
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE1D,eAAO,MAAM,mBAAmB,WAAkB,yBAAyB,2BAI1E,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ProsopoServer } from './server.js';
|
|
2
2
|
export { ProsopoServer } from './server.js';
|
|
3
|
-
export { getServerConfig } from './config.js';
|
|
3
|
+
export { getServerConfig, getServerUrl } from './config.js';
|
|
4
4
|
import { getPairAsync } from '@prosopo/contract';
|
|
5
5
|
export const PublicProsopoServer = async (config) => {
|
|
6
6
|
const pair = await getPairAsync(config.networks[config.defaultNetwork], undefined, config.account.address);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,MAAiC,EAAE,EAAE;IAE3E,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1G,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAC1C,CAAC,CAAA"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { ApiPromise } from '@polkadot/api/promise/Api';
|
|
2
|
-
import { ContractAbi, NetworkConfig, ProcaptchaOutput, ProsopoServerConfigOutput } from '@prosopo/types';
|
|
2
|
+
import { CaptchaTimeoutOutput, ContractAbi, NetworkConfig, ProcaptchaOutput, ProsopoServerConfigOutput } from '@prosopo/types';
|
|
3
3
|
import { Keyring } from '@polkadot/keyring';
|
|
4
4
|
import { KeyringPair } from '@polkadot/keyring/types';
|
|
5
5
|
import { Logger } from '@prosopo/common';
|
|
6
6
|
import { ProsopoCaptchaContract } from '@prosopo/contract';
|
|
7
7
|
import { ProviderApi } from '@prosopo/api';
|
|
8
8
|
import { WsProvider } from '@polkadot/rpc-provider/ws';
|
|
9
|
-
export declare const DEFAULT_MAX_VERIFIED_TIME_CACHED: number;
|
|
10
|
-
export declare const DEFAULT_MAX_VERIFIED_TIME_CONTRACT: number;
|
|
11
9
|
export declare class ProsopoServer {
|
|
12
10
|
config: ProsopoServerConfigOutput;
|
|
13
11
|
contract: ProsopoCaptchaContract | undefined;
|
|
@@ -30,10 +28,9 @@ export declare class ProsopoServer {
|
|
|
30
28
|
getApi(): ApiPromise;
|
|
31
29
|
getContract(): ProsopoCaptchaContract;
|
|
32
30
|
checkRandomProvider(user: string, dapp: string, providerUrl: string, blockNumber: number): Promise<import("@prosopo/captcha-contract/types-returns").Provider | undefined>;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
isVerified(payload: ProcaptchaOutput, maxVerifiedTime?: number): Promise<boolean>;
|
|
31
|
+
verifyContract(user: string, maxVerifiedTime: number): Promise<boolean>;
|
|
32
|
+
verifyProvider(providerUrl: string, dapp: string, user: string, blockNumber: number, timeouts: CaptchaTimeoutOutput, challenge?: string, commitmentId?: string): Promise<boolean>;
|
|
33
|
+
isVerified(payload: ProcaptchaOutput): Promise<boolean>;
|
|
37
34
|
getContractApi(): Promise<ProsopoCaptchaContract>;
|
|
38
35
|
}
|
|
39
36
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EACH,WAAW,EACX,aAAa,EAEb,gBAAgB,EAChB,yBAAyB,EAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAY,MAAM,EAA+C,MAAM,iBAAiB,CAAA;AAC/F,OAAO,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EACH,oBAAoB,EACpB,WAAW,EACX,aAAa,EAEb,gBAAgB,EAChB,yBAAyB,EAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAY,MAAM,EAA+C,MAAM,iBAAiB,CAAA;AAC/F,OAAO,EAAE,sBAAsB,EAAiC,MAAM,mBAAmB,CAAA;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAItD,qBAAa,aAAa;IACtB,MAAM,EAAE,yBAAyB,CAAA;IACjC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,CAAA;IAC5C,sBAAsB,EAAE,MAAM,CAAA;IAC9B,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,EAAE,WAAW,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,WAAW,GAAG,SAAS,CAAA;IAC7B,GAAG,EAAE,UAAU,GAAG,SAAS,CAAA;IAC3B,OAAO,EAAE,aAAa,CAAA;gBAEV,MAAM,EAAE,yBAAyB,EAAE,IAAI,CAAC,EAAE,WAAW;IAiBpD,cAAc,CAAC,WAAW,EAAE,MAAM;IAIxC,sBAAsB,IAAI,MAAM;IAOjC,OAAO;IAUP,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBhC,MAAM,IAAI,UAAU;IAOpB,WAAW,IAAI,sBAAsB;IAkB/B,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAsBjF,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAwCpD,cAAc,CACvB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM;IAgCZ,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BvD,cAAc,IAAI,OAAO,CAAC,sBAAsB,CAAC;CAWjE"}
|
package/dist/server.js
CHANGED
|
@@ -2,13 +2,11 @@ import { ApiPromise } from '@polkadot/api/promise/Api';
|
|
|
2
2
|
import { NetworkNamesSchema, } from '@prosopo/types';
|
|
3
3
|
import { Keyring } from '@polkadot/keyring';
|
|
4
4
|
import { ProsopoEnvError, getLogger, trimProviderUrl } from '@prosopo/common';
|
|
5
|
-
import { ProsopoCaptchaContract,
|
|
5
|
+
import { ProsopoCaptchaContract, getZeroAddress, verifyRecency } from '@prosopo/contract';
|
|
6
6
|
import { ProviderApi } from '@prosopo/api';
|
|
7
7
|
import { WsProvider } from '@polkadot/rpc-provider/ws';
|
|
8
8
|
import { ContractAbi as abiJson } from '@prosopo/captcha-contract/contract-info';
|
|
9
9
|
import { get } from '@prosopo/util';
|
|
10
|
-
export const DEFAULT_MAX_VERIFIED_TIME_CACHED = 60 * 1000;
|
|
11
|
-
export const DEFAULT_MAX_VERIFIED_TIME_CONTRACT = 5 * 60 * 1000;
|
|
12
10
|
export class ProsopoServer {
|
|
13
11
|
constructor(config, pair) {
|
|
14
12
|
this.config = config;
|
|
@@ -81,44 +79,51 @@ export class ProsopoServer {
|
|
|
81
79
|
}
|
|
82
80
|
return undefined;
|
|
83
81
|
}
|
|
84
|
-
async
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
.
|
|
101
|
-
|
|
102
|
-
|
|
82
|
+
async verifyContract(user, maxVerifiedTime) {
|
|
83
|
+
try {
|
|
84
|
+
const contractApi = await this.getContractApi();
|
|
85
|
+
this.logger.info('Provider URL not provided. Verifying with contract.');
|
|
86
|
+
const correctCaptchaBlockNumber = (await contractApi.query.dappOperatorLastCorrectCaptcha(user)).value
|
|
87
|
+
.unwrap()
|
|
88
|
+
.unwrap()
|
|
89
|
+
.before.valueOf();
|
|
90
|
+
const recent = await verifyRecency((await this.getContractApi()).api, correctCaptchaBlockNumber, maxVerifiedTime);
|
|
91
|
+
if (!recent) {
|
|
92
|
+
this.logger.info('User has not completed a captcha recently');
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
const isHuman = (await contractApi.query.dappOperatorIsHumanUser(user, this.config.solutionThreshold)).value
|
|
96
|
+
.unwrap()
|
|
97
|
+
.unwrap();
|
|
98
|
+
this.logger.info('isHuman', isHuman);
|
|
99
|
+
return isHuman;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
this.logger.error(error);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
103
105
|
}
|
|
104
|
-
async verifyProvider(providerUrl, dapp, user, blockNumber, challenge, commitmentId
|
|
106
|
+
async verifyProvider(providerUrl, dapp, user, blockNumber, timeouts, challenge, commitmentId) {
|
|
105
107
|
this.logger.info('Verifying with provider.');
|
|
106
108
|
const providerApi = await this.getProviderApi(providerUrl);
|
|
107
109
|
if (challenge) {
|
|
108
|
-
const result = await providerApi.submitPowCaptchaVerify(challenge, dapp);
|
|
110
|
+
const result = await providerApi.submitPowCaptchaVerify(challenge, dapp, timeouts.pow.cachedTimeout);
|
|
109
111
|
return result.verified;
|
|
110
112
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
const recent = await verifyRecency((await this.getContractApi()).api, blockNumber, timeouts.image.cachedTimeout);
|
|
114
|
+
if (!recent) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
const result = await providerApi.verifyDappUser(dapp, user, blockNumber, commitmentId, timeouts.image.cachedTimeout);
|
|
118
|
+
return result.verified;
|
|
114
119
|
}
|
|
115
|
-
async isVerified(payload
|
|
120
|
+
async isVerified(payload) {
|
|
116
121
|
const { user, dapp, providerUrl, commitmentId, blockNumber, challenge } = payload;
|
|
117
122
|
if (providerUrl && blockNumber) {
|
|
118
|
-
return await this.verifyProvider(providerUrl, dapp, user, blockNumber, challenge, commitmentId
|
|
123
|
+
return await this.verifyProvider(providerUrl, dapp, user, blockNumber, this.config.timeouts, challenge, commitmentId);
|
|
119
124
|
}
|
|
120
125
|
else {
|
|
121
|
-
return await this.verifyContract(user, maxVerifiedTime);
|
|
126
|
+
return await this.verifyContract(user, this.config.timeouts.contract.maxVerifiedTime);
|
|
122
127
|
}
|
|
123
128
|
}
|
|
124
129
|
async getContractApi() {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/server",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.41",
|
|
4
4
|
"description": "NodeJS package for server side communication with the prosopo captcha client",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"clean": "tsc --build --clean",
|
|
20
20
|
"build": "tsc --build --verbose tsconfig.json",
|
|
21
21
|
"build:cjs": "npx vite --config vite.cjs.config.ts build",
|
|
22
|
-
"eslint": "npx eslint . --no-error-on-unmatched-pattern --ignore-path ../../.eslintignore",
|
|
22
|
+
"eslint": "npx eslint . --no-error-on-unmatched-pattern --ignore-path ../../.eslintignore --quiet",
|
|
23
23
|
"eslint:fix": "npm run eslint -- --fix",
|
|
24
24
|
"prettier": "npx prettier . --check --no-error-on-unmatched-pattern --ignore-path ../../.eslintignore",
|
|
25
25
|
"prettier:fix": "npm run prettier -- --write",
|
|
@@ -41,11 +41,12 @@
|
|
|
41
41
|
"@polkadot/api": "10.13.1",
|
|
42
42
|
"@polkadot/keyring": "12.6.2",
|
|
43
43
|
"@polkadot/rpc-provider": "10.13.1",
|
|
44
|
-
"@
|
|
45
|
-
"@prosopo/
|
|
46
|
-
"@prosopo/contract": "0.3.
|
|
47
|
-
"@prosopo/captcha-contract": "0.3.
|
|
48
|
-
"@prosopo/
|
|
44
|
+
"@prosopo/api": "0.3.41",
|
|
45
|
+
"@prosopo/common": "0.3.41",
|
|
46
|
+
"@prosopo/contract": "0.3.41",
|
|
47
|
+
"@prosopo/captcha-contract": "0.3.41",
|
|
48
|
+
"@prosopo/util": "0.3.41",
|
|
49
|
+
"@prosopo/types": "0.3.41"
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
51
52
|
"tslib": "2.6.2",
|