@prosopo/cli 2.3.1 → 2.3.2
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/RateLimiter.d.ts +0 -16
- package/dist/RateLimiter.d.ts.map +1 -1
- package/dist/RateLimiter.js +0 -16
- package/dist/RateLimiter.js.map +1 -1
- package/dist/argv.d.ts.map +1 -1
- package/dist/argv.js +19 -10
- package/dist/argv.js.map +1 -1
- package/dist/bundle/provider.cli.bundle.js +19894 -19425
- package/dist/commands/index.d.ts +0 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +0 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/migrateBlockRulesToUserAccessRules.d.ts +20 -0
- package/dist/commands/migrateBlockRulesToUserAccessRules.d.ts.map +1 -0
- package/dist/commands/migrateBlockRulesToUserAccessRules.js +65 -0
- package/dist/commands/migrateBlockRulesToUserAccessRules.js.map +1 -0
- package/dist/commands/version.d.ts +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/commands/version.js.map +1 -1
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +10 -3
- package/dist/start.js.map +1 -1
- package/package.json +16 -12
- package/dist/commands/addBlockRules.d.ts +0 -29
- package/dist/commands/addBlockRules.d.ts.map +0 -1
- package/dist/commands/addBlockRules.js +0 -97
- package/dist/commands/addBlockRules.js.map +0 -1
package/dist/commands/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { default as commandAddBlockRules } from "./addBlockRules.js";
|
|
2
1
|
export { default as commandProviderSetDataset } from "./providerSetDataset.js";
|
|
3
2
|
export { default as commandStoreCaptchasExternally } from "./storeCaptchasExternally.js";
|
|
4
3
|
export { default as commandVersion } from "./version.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { default as commandAddBlockRules } from "./addBlockRules.js";
|
|
2
1
|
export { default as commandProviderSetDataset } from "./providerSetDataset.js";
|
|
3
2
|
export { default as commandStoreCaptchasExternally } from "./storeCaptchasExternally.js";
|
|
4
3
|
export { default as commandVersion } from "./version.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { KeyringPair } from "@polkadot/keyring/types";
|
|
2
|
+
import type { BlockRule, ProsopoConfigOutput } from "@prosopo/types";
|
|
3
|
+
import type { IPBlockRuleRecord, UserAccountBlockRuleRecord } from "@prosopo/types-database";
|
|
4
|
+
import type { Rule } from "@prosopo/user-access-policy";
|
|
5
|
+
import type { CommandModule } from "yargs";
|
|
6
|
+
declare class MigrateBlockRuleDbRecordsToUserAccessPolicyCommand implements CommandModule {
|
|
7
|
+
private readonly pair;
|
|
8
|
+
private readonly config;
|
|
9
|
+
command: string;
|
|
10
|
+
describe: string;
|
|
11
|
+
constructor(pair: KeyringPair, config: ProsopoConfigOutput);
|
|
12
|
+
handler: () => Promise<void>;
|
|
13
|
+
protected convertIpBlockRulesToUserAccessRules(ipBlockRules: IPBlockRuleRecord[]): Rule[];
|
|
14
|
+
protected convertUserAccountBlockRulesToUserAccessRules(userAccountBlockRules: UserAccountBlockRuleRecord[]): Rule[];
|
|
15
|
+
protected convertIpBlockRuleToUserAccessRule(ipBlockRule: IPBlockRuleRecord): Rule;
|
|
16
|
+
protected convertUserAccountBlockRuleToUserAccessRule(userAccountBlockRule: UserAccountBlockRuleRecord): Rule;
|
|
17
|
+
protected convertBlockRuleToUserAccessRule(blockRule: BlockRule): Rule;
|
|
18
|
+
}
|
|
19
|
+
export { MigrateBlockRuleDbRecordsToUserAccessPolicyCommand };
|
|
20
|
+
//# sourceMappingURL=migrateBlockRulesToUserAccessRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrateBlockRulesToUserAccessRules.d.ts","sourceRoot":"","sources":["../../src/commands/migrateBlockRulesToUserAccessRules.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EACX,iBAAiB,EACjB,0BAA0B,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,cAAM,kDACL,YAAW,aAAa;IAMvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALjB,OAAO,SAA8C;IACrD,QAAQ,SAA8C;gBAG3C,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,mBAAmB;IAGtC,OAAO,QAAa,OAAO,CAAC,IAAI,CAAC,CAsBtC;IAEF,SAAS,CAAC,oCAAoC,CAC7C,YAAY,EAAE,iBAAiB,EAAE,GAC/B,IAAI,EAAE;IAMT,SAAS,CAAC,6CAA6C,CACtD,qBAAqB,EAAE,0BAA0B,EAAE,GACjD,IAAI,EAAE;IAMT,SAAS,CAAC,kCAAkC,CAC3C,WAAW,EAAE,iBAAiB,GAC5B,IAAI;IAgBP,SAAS,CAAC,2CAA2C,CACpD,oBAAoB,EAAE,0BAA0B,GAC9C,IAAI;IASP,SAAS,CAAC,gCAAgC,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;CAiBtE;AAED,OAAO,EAAE,kDAAkD,EAAE,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ProviderEnvironment } from "@prosopo/env";
|
|
2
|
+
import { Address4 } from "ip-address";
|
|
3
|
+
class MigrateBlockRuleDbRecordsToUserAccessPolicyCommand {
|
|
4
|
+
constructor(pair, config) {
|
|
5
|
+
this.pair = pair;
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.command = "migrate-block-rules-to-user-access-rules";
|
|
8
|
+
this.describe = "Migrate block rules to user access rules";
|
|
9
|
+
this.handler = async () => {
|
|
10
|
+
const env = new ProviderEnvironment(this.config, this.pair);
|
|
11
|
+
await env.isReady();
|
|
12
|
+
const db = env.getDb();
|
|
13
|
+
const ipBlockRules = await db.getAllIpBlockRules();
|
|
14
|
+
const userAccountBlockRules = await db.getAllUserAccountBlockRules();
|
|
15
|
+
const userAccessRulesFromIpBlockRules = this.convertIpBlockRulesToUserAccessRules(ipBlockRules);
|
|
16
|
+
const userAccessRulesFromUserAccountBlockRules = this.convertUserAccountBlockRulesToUserAccessRules(userAccountBlockRules);
|
|
17
|
+
const newUserAccessRules = [
|
|
18
|
+
...userAccessRulesFromIpBlockRules,
|
|
19
|
+
...userAccessRulesFromUserAccountBlockRules,
|
|
20
|
+
];
|
|
21
|
+
const userAccessRulesStorage = db.getUserAccessRulesStorage();
|
|
22
|
+
await userAccessRulesStorage.insertMany(newUserAccessRules);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
convertIpBlockRulesToUserAccessRules(ipBlockRules) {
|
|
26
|
+
return ipBlockRules.map((ipBlockRule) => this.convertIpBlockRuleToUserAccessRule(ipBlockRule));
|
|
27
|
+
}
|
|
28
|
+
convertUserAccountBlockRulesToUserAccessRules(userAccountBlockRules) {
|
|
29
|
+
return userAccountBlockRules.map((userAccountBlockRule) => this.convertUserAccountBlockRuleToUserAccessRule(userAccountBlockRule));
|
|
30
|
+
}
|
|
31
|
+
convertIpBlockRuleToUserAccessRule(ipBlockRule) {
|
|
32
|
+
const userAccessRule = this.convertBlockRuleToUserAccessRule(ipBlockRule);
|
|
33
|
+
const ipAsBigInt = BigInt(ipBlockRule.ip);
|
|
34
|
+
const ipAddress = Address4.fromBigInt(ipAsBigInt);
|
|
35
|
+
userAccessRule.userIp = {
|
|
36
|
+
v4: {
|
|
37
|
+
asNumeric: ipAsBigInt,
|
|
38
|
+
asString: ipAddress.address.toString(),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
return userAccessRule;
|
|
42
|
+
}
|
|
43
|
+
convertUserAccountBlockRuleToUserAccessRule(userAccountBlockRule) {
|
|
44
|
+
const userAccessRule = this.convertBlockRuleToUserAccessRule(userAccountBlockRule);
|
|
45
|
+
userAccessRule.userId = userAccountBlockRule.userAccount;
|
|
46
|
+
return userAccessRule;
|
|
47
|
+
}
|
|
48
|
+
convertBlockRuleToUserAccessRule(blockRule) {
|
|
49
|
+
const userAccessRule = {
|
|
50
|
+
isUserBlocked: blockRule.hardBlock,
|
|
51
|
+
clientId: blockRule.dappAccount,
|
|
52
|
+
};
|
|
53
|
+
if (undefined !== blockRule.captchaConfig) {
|
|
54
|
+
userAccessRule.config = {
|
|
55
|
+
imageCaptcha: {
|
|
56
|
+
solvedCount: blockRule.captchaConfig.solved.count,
|
|
57
|
+
unsolvedCount: blockRule.captchaConfig.unsolved.count,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return userAccessRule;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export { MigrateBlockRuleDbRecordsToUserAccessPolicyCommand };
|
|
65
|
+
//# sourceMappingURL=migrateBlockRulesToUserAccessRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrateBlockRulesToUserAccessRules.js","sourceRoot":"","sources":["../../src/commands/migrateBlockRulesToUserAccessRules.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAOnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,kDAAkD;IAMvD,YACkB,IAAiB,EACjB,MAA2B;QAD3B,SAAI,GAAJ,IAAI,CAAa;QACjB,WAAM,GAAN,MAAM,CAAqB;QALtC,YAAO,GAAG,0CAA0C,CAAC;QACrD,aAAQ,GAAG,0CAA0C,CAAC;QAOtD,YAAO,GAAG,KAAK,IAAmB,EAAE;YAC1C,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YAEpB,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;YAEvB,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,kBAAkB,EAAE,CAAC;YACnD,MAAM,qBAAqB,GAAG,MAAM,EAAE,CAAC,2BAA2B,EAAE,CAAC;YAErE,MAAM,+BAA+B,GACpC,IAAI,CAAC,oCAAoC,CAAC,YAAY,CAAC,CAAC;YACzD,MAAM,wCAAwC,GAC7C,IAAI,CAAC,6CAA6C,CAAC,qBAAqB,CAAC,CAAC;YAE3E,MAAM,kBAAkB,GAAG;gBAC1B,GAAG,+BAA+B;gBAClC,GAAG,wCAAwC;aAC3C,CAAC;YAEF,MAAM,sBAAsB,GAAG,EAAE,CAAC,yBAAyB,EAAE,CAAC;YAE9D,MAAM,sBAAsB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAC7D,CAAC,CAAC;IAxBC,CAAC;IA0BM,oCAAoC,CAC7C,YAAiC;QAEjC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CACvC,IAAI,CAAC,kCAAkC,CAAC,WAAW,CAAC,CACpD,CAAC;IACH,CAAC;IAES,6CAA6C,CACtD,qBAAmD;QAEnD,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,EAAE,CACzD,IAAI,CAAC,2CAA2C,CAAC,oBAAoB,CAAC,CACtE,CAAC;IACH,CAAC;IAES,kCAAkC,CAC3C,WAA8B;QAE9B,MAAM,cAAc,GAAG,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC;QAE1E,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAElD,cAAc,CAAC,MAAM,GAAG;YACvB,EAAE,EAAE;gBACH,SAAS,EAAE,UAAU;gBACrB,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE;aACtC;SACD,CAAC;QAEF,OAAO,cAAc,CAAC;IACvB,CAAC;IAES,2CAA2C,CACpD,oBAAgD;QAEhD,MAAM,cAAc,GACnB,IAAI,CAAC,gCAAgC,CAAC,oBAAoB,CAAC,CAAC;QAE7D,cAAc,CAAC,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC;QAEzD,OAAO,cAAc,CAAC;IACvB,CAAC;IAES,gCAAgC,CAAC,SAAoB;QAC9D,MAAM,cAAc,GAAS;YAC5B,aAAa,EAAE,SAAS,CAAC,SAAS;YAClC,QAAQ,EAAE,SAAS,CAAC,WAAW;SAC/B,CAAC;QAEF,IAAI,SAAS,KAAK,SAAS,CAAC,aAAa,EAAE,CAAC;YAC3C,cAAc,CAAC,MAAM,GAAG;gBACvB,YAAY,EAAE;oBACb,WAAW,EAAE,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK;oBACjD,aAAa,EAAE,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK;iBACrD;aACD,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC;IACvB,CAAC;CACD;AAED,OAAO,EAAE,kDAAkD,EAAE,CAAC"}
|
package/dist/commands/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,eAAe,CACd,IAAiB,EACjB,MAA2B,EAC3B,OAA6B,EAC5B,EAAE;IACH,MAAM,MAAM,GACX,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAEjE,OAAO;QACN,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,oCAAoC;QAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,eAAe,CACd,IAAiB,EACjB,MAA2B,EAC3B,OAA6B,EAC5B,EAAE;IACH,MAAM,MAAM,GACX,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAEjE,OAAO;QACN,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,oCAAoC;QAC9C,OAAO,EAAE,GAAG,EAAE;YACb,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;KACD,CAAC;AACH,CAAC,CAAC"}
|
package/dist/start.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAMvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAuFnD,wBAAsB,KAAK,CAC1B,GAAG,CAAC,EAAE,mBAAmB,EACzB,KAAK,CAAC,EAAE,OAAO,EACf,IAAI,CAAC,EAAE,MAAM,mBAqCb;AAED,wBAAsB,QAAQ,CAAC,GAAG,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,OAAO,mBAGxE"}
|
package/dist/start.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { apiExpressRouterFactory, createApiExpressDefaultEndpointAdapter, } from "@prosopo/api-express-router";
|
|
1
2
|
import { loadEnv } from "@prosopo/dotenv";
|
|
2
3
|
import { ProviderEnvironment } from "@prosopo/env";
|
|
3
4
|
import { getPairAsync } from "@prosopo/keyring";
|
|
4
5
|
import { i18nMiddleware } from "@prosopo/locale";
|
|
5
|
-
import { domainMiddleware, getClientList, headerCheckMiddleware,
|
|
6
|
+
import { api, domainMiddleware, getClientList, headerCheckMiddleware, prosopoRouter, prosopoVerifyRouter, publicRouter, storeCaptchasExternally, } from "@prosopo/provider";
|
|
6
7
|
import { authMiddleware, blockMiddleware } from "@prosopo/provider";
|
|
8
|
+
import { createApiRuleRoutesProvider, getExpressApiRuleRateLimits, } from "@prosopo/user-access-policy";
|
|
7
9
|
import cors from "cors";
|
|
8
10
|
import express from "express";
|
|
9
11
|
import rateLimit from "express-rate-limit";
|
|
@@ -13,6 +15,9 @@ function startApi(env, admin = false, port) {
|
|
|
13
15
|
env.logger.info("Starting Prosopo API");
|
|
14
16
|
const apiApp = express();
|
|
15
17
|
const apiPort = port || env.config.server.port;
|
|
18
|
+
const apiEndpointAdapter = createApiExpressDefaultEndpointAdapter(env.logger);
|
|
19
|
+
const apiRuleRoutesProvider = createApiRuleRoutesProvider(env.getDb().getUserAccessRulesStorage());
|
|
20
|
+
const apiAdminRoutesProvider = api.admin.createApiAdminRoutesProvider(env);
|
|
16
21
|
apiApp.set("trust proxy", env.config.proxyCount);
|
|
17
22
|
apiApp.use(cors());
|
|
18
23
|
apiApp.use(express.json({ limit: "50mb" }));
|
|
@@ -24,8 +29,10 @@ function startApi(env, admin = false, port) {
|
|
|
24
29
|
apiApp.use(prosopoRouter(env));
|
|
25
30
|
apiApp.use(publicRouter(env));
|
|
26
31
|
apiApp.use("/v1/prosopo/provider/admin", authMiddleware(env));
|
|
27
|
-
apiApp.use(
|
|
28
|
-
|
|
32
|
+
apiApp.use(apiExpressRouterFactory.createRouter(apiRuleRoutesProvider, apiEndpointAdapter));
|
|
33
|
+
apiApp.use(apiExpressRouterFactory.createRouter(apiAdminRoutesProvider, createApiExpressDefaultEndpointAdapter(env.logger, 400)));
|
|
34
|
+
const configRateLimits = env.config.rateLimits;
|
|
35
|
+
const rateLimits = { ...configRateLimits, ...getExpressApiRuleRateLimits() };
|
|
29
36
|
for (const [path, limit] of Object.entries(rateLimits)) {
|
|
30
37
|
const enumPath = path;
|
|
31
38
|
apiApp.use(enumPath, rateLimit(limit));
|
package/dist/start.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACN,gBAAgB,EAChB,aAAa,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/cli",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"description": "CLI for Prosopo Provider",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -29,25 +29,29 @@
|
|
|
29
29
|
"@polkadot/keyring": "12.6.2",
|
|
30
30
|
"@polkadot/types-codec": "10.13.1",
|
|
31
31
|
"@polkadot/util-crypto": "12.6.2",
|
|
32
|
-
"@prosopo/api": "2.3.
|
|
33
|
-
"@prosopo/
|
|
34
|
-
"@prosopo/
|
|
35
|
-
"@prosopo/
|
|
36
|
-
"@prosopo/
|
|
37
|
-
"@prosopo/
|
|
38
|
-
"@prosopo/
|
|
39
|
-
"@prosopo/
|
|
40
|
-
"@prosopo/
|
|
41
|
-
"@prosopo/
|
|
32
|
+
"@prosopo/api": "2.3.2",
|
|
33
|
+
"@prosopo/api-express-router": "2.3.2",
|
|
34
|
+
"@prosopo/common": "2.3.2",
|
|
35
|
+
"@prosopo/config": "2.3.2",
|
|
36
|
+
"@prosopo/dotenv": "2.3.2",
|
|
37
|
+
"@prosopo/env": "2.3.2",
|
|
38
|
+
"@prosopo/keyring": "2.3.2",
|
|
39
|
+
"@prosopo/locale": "2.3.2",
|
|
40
|
+
"@prosopo/provider": "2.3.2",
|
|
41
|
+
"@prosopo/types": "2.3.2",
|
|
42
|
+
"@prosopo/user-access-policy": "2.3.2",
|
|
43
|
+
"@prosopo/util": "2.3.2",
|
|
42
44
|
"cors": "2.8.5",
|
|
43
45
|
"cron-parser": "4.9.0",
|
|
44
46
|
"dotenv": "16.4.5",
|
|
45
47
|
"express-rate-limit": "7.4.0",
|
|
48
|
+
"has-proto": "1.2.0",
|
|
49
|
+
"ip-address": "10.0.1",
|
|
46
50
|
"yargs": "17.7.2",
|
|
47
51
|
"zod": "3.23.8"
|
|
48
52
|
},
|
|
49
53
|
"devDependencies": {
|
|
50
|
-
"@prosopo/config": "2.3.
|
|
54
|
+
"@prosopo/config": "2.3.2",
|
|
51
55
|
"@types/cors": "2.8.17",
|
|
52
56
|
"@types/yargs": "17.0.33",
|
|
53
57
|
"@vitest/coverage-v8": "2.1.1",
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { KeyringPair } from "@polkadot/keyring/types";
|
|
2
|
-
import { type Logger } from "@prosopo/common";
|
|
3
|
-
import { type ProsopoConfigOutput } from "@prosopo/types";
|
|
4
|
-
import type { ArgumentsCamelCase, Argv } from "yargs";
|
|
5
|
-
declare const _default: (pair: KeyringPair, config: ProsopoConfigOutput, cmdArgs?: {
|
|
6
|
-
logger?: Logger;
|
|
7
|
-
}) => {
|
|
8
|
-
command: string;
|
|
9
|
-
describe: string;
|
|
10
|
-
builder: (yargs: Argv) => Argv<{
|
|
11
|
-
ips: (string | number)[] | undefined;
|
|
12
|
-
} & {
|
|
13
|
-
users: (string | number)[] | undefined;
|
|
14
|
-
} & {
|
|
15
|
-
dapp: string | undefined;
|
|
16
|
-
} & {
|
|
17
|
-
global: string | true;
|
|
18
|
-
} & {
|
|
19
|
-
hardBlock: string | false;
|
|
20
|
-
} & {
|
|
21
|
-
solved: number | undefined;
|
|
22
|
-
} & {
|
|
23
|
-
unsolved: number | undefined;
|
|
24
|
-
}>;
|
|
25
|
-
handler: (argv: ArgumentsCamelCase) => Promise<void>;
|
|
26
|
-
middlewares: never[];
|
|
27
|
-
};
|
|
28
|
-
export default _default;
|
|
29
|
-
//# sourceMappingURL=addBlockRules.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addBlockRules.d.ts","sourceRoot":"","sources":["../../src/commands/addBlockRules.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAY,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AAGnE,OAAO,EAIN,KAAK,mBAAmB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;+BAG/C,WAAW,UACT,mBAAmB,YACjB;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;qBASX,IAAI;;;;;;;;;;;;;;;oBAwCC,kBAAkB;;;AApD1C,wBAuGE"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { LogLevel, getLogger } from "@prosopo/common";
|
|
2
|
-
import { ProviderEnvironment } from "@prosopo/env";
|
|
3
|
-
import { Tasks } from "@prosopo/provider";
|
|
4
|
-
import { AddBlockRulesIPSpec, AddBlockRulesUserSpec, } from "@prosopo/types";
|
|
5
|
-
export default (pair, config, cmdArgs) => {
|
|
6
|
-
const logger = cmdArgs?.logger ||
|
|
7
|
-
getLogger(LogLevel.enum.info, "cli.provider_set_data_set");
|
|
8
|
-
return {
|
|
9
|
-
command: "add_block_rules",
|
|
10
|
-
describe: "Add a rule for blocking requests to the database",
|
|
11
|
-
builder: (yargs) => yargs
|
|
12
|
-
.option("ips", {
|
|
13
|
-
type: "array",
|
|
14
|
-
demandOption: false,
|
|
15
|
-
desc: "The ips to be blocked",
|
|
16
|
-
})
|
|
17
|
-
.option("users", {
|
|
18
|
-
type: "array",
|
|
19
|
-
demandOption: false,
|
|
20
|
-
desc: "The users to be blocked",
|
|
21
|
-
})
|
|
22
|
-
.option("dapp", {
|
|
23
|
-
type: "string",
|
|
24
|
-
demandOption: false,
|
|
25
|
-
desc: "The users to be blocked",
|
|
26
|
-
})
|
|
27
|
-
.option("global", {
|
|
28
|
-
type: "string",
|
|
29
|
-
demandOption: true,
|
|
30
|
-
default: true,
|
|
31
|
-
desc: "Whether the ip is to be blocked globally or not",
|
|
32
|
-
})
|
|
33
|
-
.option("hardBlock", {
|
|
34
|
-
type: "string",
|
|
35
|
-
demandOption: true,
|
|
36
|
-
default: false,
|
|
37
|
-
desc: "Hardblock stops requests, softblock informs frictionless",
|
|
38
|
-
})
|
|
39
|
-
.option("solved", {
|
|
40
|
-
type: "number",
|
|
41
|
-
demandOption: false,
|
|
42
|
-
desc: "The number of solved captchas",
|
|
43
|
-
})
|
|
44
|
-
.option("unsolved", {
|
|
45
|
-
type: "number",
|
|
46
|
-
demandOption: false,
|
|
47
|
-
desc: "The number of unsolved captchas",
|
|
48
|
-
}),
|
|
49
|
-
handler: async (argv) => {
|
|
50
|
-
try {
|
|
51
|
-
const env = new ProviderEnvironment(config, pair);
|
|
52
|
-
await env.isReady();
|
|
53
|
-
const tasks = new Tasks(env);
|
|
54
|
-
let captchaConfig;
|
|
55
|
-
if (argv.solved) {
|
|
56
|
-
captchaConfig = {
|
|
57
|
-
solved: {
|
|
58
|
-
count: argv.solved,
|
|
59
|
-
},
|
|
60
|
-
unsolved: {
|
|
61
|
-
count: argv.unsolved || 0,
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
if (argv.ips) {
|
|
66
|
-
await tasks.clientTaskManager.addIPBlockRules(AddBlockRulesIPSpec.parse([
|
|
67
|
-
{
|
|
68
|
-
ips: argv.ips,
|
|
69
|
-
global: argv.global,
|
|
70
|
-
hardBlock: argv.hardBlock,
|
|
71
|
-
dapp: argv.dapp,
|
|
72
|
-
captchaConfig,
|
|
73
|
-
},
|
|
74
|
-
]));
|
|
75
|
-
logger.info("IP Block rules added");
|
|
76
|
-
}
|
|
77
|
-
if (argv.users) {
|
|
78
|
-
await tasks.clientTaskManager.addUserBlockRules(AddBlockRulesUserSpec.parse([
|
|
79
|
-
{
|
|
80
|
-
users: argv.users,
|
|
81
|
-
global: argv.global,
|
|
82
|
-
hardBlock: argv.hardBlock,
|
|
83
|
-
dapp: argv.dapp,
|
|
84
|
-
captchaConfig,
|
|
85
|
-
},
|
|
86
|
-
]));
|
|
87
|
-
logger.info("User Block rules added");
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
catch (err) {
|
|
91
|
-
logger.error(err);
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
middlewares: [],
|
|
95
|
-
};
|
|
96
|
-
};
|
|
97
|
-
//# sourceMappingURL=addBlockRules.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addBlockRules.js","sourceRoot":"","sources":["../../src/commands/addBlockRules.ts"],"names":[],"mappings":"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"}
|