@prosopo/user-access-policy 3.3.0 → 3.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/CHANGELOG.md +36 -0
- package/dist/accessPolicy.js +71 -57
- package/dist/accessPolicyResolver.js +62 -36
- package/dist/accessRules.js +9 -6
- package/dist/api/accessRuleApiRoutes.js +73 -50
- package/dist/api/deleteAllRulesEndpoint.js +22 -19
- package/dist/api/deleteRulesEndpoint.js +30 -27
- package/dist/api/insertRulesEndpoint.js +57 -57
- package/dist/index.js +27 -14
- package/dist/redis/redisAccessRules.js +128 -112
- package/dist/redis/redisAccessRulesIndex.js +94 -70
- package/dist/redis/redisIndex.js +15 -16
- package/dist/util.js +4 -2
- package/package.json +15 -10
- package/vite.cjs.config.ts +7 -6
- package/vite.esm.config.ts +20 -0
- package/vite.test.config.ts +16 -21
- package/dist/accessPolicy.d.ts +0 -169
- package/dist/accessPolicy.d.ts.map +0 -1
- package/dist/accessPolicy.js.map +0 -1
- package/dist/accessPolicyResolver.d.ts +0 -115
- package/dist/accessPolicyResolver.d.ts.map +0 -1
- package/dist/accessPolicyResolver.js.map +0 -1
- package/dist/accessRules.d.ts +0 -16
- package/dist/accessRules.d.ts.map +0 -1
- package/dist/accessRules.js.map +0 -1
- package/dist/api/accessRuleApiRoutes.d.ts +0 -27
- package/dist/api/accessRuleApiRoutes.d.ts.map +0 -1
- package/dist/api/accessRuleApiRoutes.js.map +0 -1
- package/dist/api/deleteAllRulesEndpoint.d.ts +0 -12
- package/dist/api/deleteAllRulesEndpoint.d.ts.map +0 -1
- package/dist/api/deleteAllRulesEndpoint.js.map +0 -1
- package/dist/api/deleteRulesEndpoint.d.ts +0 -116
- package/dist/api/deleteRulesEndpoint.d.ts.map +0 -1
- package/dist/api/deleteRulesEndpoint.js.map +0 -1
- package/dist/api/insertRulesEndpoint.d.ts +0 -22
- package/dist/api/insertRulesEndpoint.d.ts.map +0 -1
- package/dist/api/insertRulesEndpoint.js.map +0 -1
- package/dist/index.d.ts +0 -15
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/redis/redisAccessRules.d.ts +0 -7
- package/dist/redis/redisAccessRules.d.ts.map +0 -1
- package/dist/redis/redisAccessRules.js.map +0 -1
- package/dist/redis/redisAccessRulesIndex.d.ts +0 -13
- package/dist/redis/redisAccessRulesIndex.d.ts.map +0 -1
- package/dist/redis/redisAccessRulesIndex.js.map +0 -1
- package/dist/redis/redisIndex.d.ts +0 -9
- package/dist/redis/redisIndex.d.ts.map +0 -1
- package/dist/redis/redisIndex.js.map +0 -1
- package/dist/tests/accessPolicy.test.d.ts +0 -2
- package/dist/tests/accessPolicy.test.d.ts.map +0 -1
- package/dist/tests/accessPolicy.test.js +0 -27
- package/dist/tests/accessPolicy.test.js.map +0 -1
- package/dist/tests/redis/redisAccessRules.test.d.ts +0 -2
- package/dist/tests/redis/redisAccessRules.test.d.ts.map +0 -1
- package/dist/tests/redis/redisAccessRules.test.js +0 -413
- package/dist/tests/redis/redisAccessRules.test.js.map +0 -1
- package/dist/tests/redis/redisIndex.test.d.ts +0 -2
- package/dist/tests/redis/redisIndex.test.d.ts.map +0 -1
- package/dist/tests/redis/redisIndex.test.js +0 -84
- package/dist/tests/redis/redisIndex.test.js.map +0 -1
- package/dist/tests/redis/testRedisClient.d.ts +0 -3
- package/dist/tests/redis/testRedisClient.d.ts.map +0 -1
- package/dist/tests/redis/testRedisClient.js +0 -8
- package/dist/tests/redis/testRedisClient.js.map +0 -1
- package/dist/tests/testLogger.d.ts +0 -4
- package/dist/tests/testLogger.d.ts.map +0 -1
- package/dist/tests/testLogger.js +0 -22
- package/dist/tests/testLogger.js.map +0 -1
- package/dist/util.d.ts +0 -2
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js.map +0 -1
- package/vite.config.ts +0 -39
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
# @prosopo/user-access-policy
|
|
2
2
|
|
|
3
|
+
## 3.3.2
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- eb71691: configure typecheck before bundle for vue packages
|
|
7
|
+
- eb71691: make typecheck script always recompile
|
|
8
|
+
- Updated dependencies [eb71691]
|
|
9
|
+
- Updated dependencies [eb71691]
|
|
10
|
+
- @prosopo/api-route@2.6.9
|
|
11
|
+
- @prosopo/common@3.1.1
|
|
12
|
+
- @prosopo/types@3.0.5
|
|
13
|
+
- @prosopo/util@3.0.4
|
|
14
|
+
- @prosopo/config@3.1.2
|
|
15
|
+
|
|
16
|
+
## 3.3.1
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- 3573f0b: fix npm scripts bundle command
|
|
20
|
+
- 3573f0b: build using vite, typecheck using tsc
|
|
21
|
+
- efd8102: Add tests for unwrap error helper
|
|
22
|
+
- 3573f0b: standardise all vite based npm scripts for bundling
|
|
23
|
+
- Updated dependencies [52dbf21]
|
|
24
|
+
- Updated dependencies [93d5e50]
|
|
25
|
+
- Updated dependencies [3573f0b]
|
|
26
|
+
- Updated dependencies [3573f0b]
|
|
27
|
+
- Updated dependencies [efd8102]
|
|
28
|
+
- Updated dependencies [93d5e50]
|
|
29
|
+
- Updated dependencies [63519d7]
|
|
30
|
+
- Updated dependencies [f29fc7e]
|
|
31
|
+
- Updated dependencies [3573f0b]
|
|
32
|
+
- Updated dependencies [2d0dd8a]
|
|
33
|
+
- @prosopo/util@3.0.3
|
|
34
|
+
- @prosopo/types@3.0.4
|
|
35
|
+
- @prosopo/api-route@2.6.8
|
|
36
|
+
- @prosopo/common@3.1.0
|
|
37
|
+
- @prosopo/config@3.1.1
|
|
38
|
+
|
|
3
39
|
## 3.3.0
|
|
4
40
|
### Minor Changes
|
|
5
41
|
|
package/dist/accessPolicy.js
CHANGED
|
@@ -2,65 +2,79 @@ import { CaptchaTypeSchema } from "@prosopo/types";
|
|
|
2
2
|
import { getIPAddress } from "@prosopo/util";
|
|
3
3
|
import { Address4 } from "ip-address";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import { hashUserAgent } from "
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
})(AccessPolicyType ||
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
import { hashUserAgent } from "./util.js";
|
|
6
|
+
var AccessPolicyType = /* @__PURE__ */ ((AccessPolicyType2) => {
|
|
7
|
+
AccessPolicyType2["Block"] = "block";
|
|
8
|
+
AccessPolicyType2["Restrict"] = "restrict";
|
|
9
|
+
return AccessPolicyType2;
|
|
10
|
+
})(AccessPolicyType || {});
|
|
11
|
+
const accessPolicySchema = z.object({
|
|
12
|
+
type: z.nativeEnum(AccessPolicyType),
|
|
13
|
+
captchaType: CaptchaTypeSchema.optional(),
|
|
14
|
+
description: z.coerce.string().optional(),
|
|
15
|
+
// Redis stores values as strings, so coerce is needed to parse properly
|
|
16
|
+
solvedImagesCount: z.coerce.number().optional(),
|
|
17
|
+
// the percentage of image panels that must be solved per image CAPTCHA
|
|
18
|
+
imageThreshold: z.coerce.number().optional(),
|
|
19
|
+
// the Proof-of-Work difficulty level
|
|
20
|
+
powDifficulty: z.coerce.number().optional(),
|
|
21
|
+
// the number of unsolved image CAPTCHA challenges to serve
|
|
22
|
+
unsolvedImagesCount: z.coerce.number().optional(),
|
|
23
|
+
// used to increase the user's score
|
|
24
|
+
frictionlessScore: z.coerce.number().optional()
|
|
20
25
|
});
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
26
|
+
const policyScopeSchema = z.object({
|
|
27
|
+
clientId: z.coerce.string().optional(),
|
|
28
|
+
ruleGroupId: z.coerce.string().optional()
|
|
24
29
|
});
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
const userScopeSchema = z.object({
|
|
31
|
+
// coerce is used for safety, as e.g., incoming userId can be digital
|
|
32
|
+
userId: z.coerce.string().optional(),
|
|
33
|
+
numericIp: z.coerce.bigint().optional(),
|
|
34
|
+
numericIpMaskMin: z.coerce.bigint().optional(),
|
|
35
|
+
numericIpMaskMax: z.coerce.bigint().optional(),
|
|
36
|
+
ja4Hash: z.coerce.string().optional(),
|
|
37
|
+
headersHash: z.coerce.string().optional(),
|
|
38
|
+
userAgentHash: z.coerce.string().optional()
|
|
33
39
|
});
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
40
|
+
const userScopeInputSchema = userScopeSchema.extend({
|
|
41
|
+
// human-friendly ip versions. If present, then converted to numeric and removed from the object
|
|
42
|
+
// 127.0.0.1
|
|
43
|
+
ip: z.string().optional(),
|
|
44
|
+
// 127.0.0.1/24
|
|
45
|
+
ipMask: z.string().optional(),
|
|
46
|
+
// human friendly user agent
|
|
47
|
+
userAgent: z.string().optional()
|
|
48
|
+
}).transform((inputUserScope) => {
|
|
49
|
+
const { ip, ipMask, userAgent, ...userScope } = inputUserScope;
|
|
50
|
+
if ("string" === typeof ip) {
|
|
51
|
+
userScope.numericIp = getIPAddress(ip).bigInt();
|
|
52
|
+
}
|
|
53
|
+
if ("string" === typeof ipMask) {
|
|
54
|
+
const ipObject = new Address4(ipMask);
|
|
55
|
+
userScope.numericIpMaskMin = ipObject.startAddress().bigInt();
|
|
56
|
+
userScope.numericIpMaskMax = ipObject.endAddress().bigInt();
|
|
57
|
+
}
|
|
58
|
+
if ("string" === typeof userAgent) {
|
|
59
|
+
userScope.userAgentHash = hashUserAgent(userAgent);
|
|
60
|
+
}
|
|
61
|
+
return userScope;
|
|
54
62
|
});
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
numericIpMaskMax: true,
|
|
63
|
+
const accessRuleSchemaExtended = z.object({
|
|
64
|
+
// flat structure is used to fit the Redis requirements
|
|
65
|
+
...accessPolicySchema.shape,
|
|
66
|
+
...policyScopeSchema.shape,
|
|
67
|
+
...userScopeInputSchema._def.schema.shape
|
|
68
|
+
}).omit({
|
|
69
|
+
numericIp: true,
|
|
70
|
+
numericIpMaskMin: true,
|
|
71
|
+
numericIpMaskMax: true
|
|
65
72
|
});
|
|
66
|
-
|
|
73
|
+
export {
|
|
74
|
+
AccessPolicyType,
|
|
75
|
+
accessPolicySchema,
|
|
76
|
+
accessRuleSchemaExtended,
|
|
77
|
+
policyScopeSchema,
|
|
78
|
+
userScopeInputSchema,
|
|
79
|
+
userScopeSchema
|
|
80
|
+
};
|
|
@@ -1,44 +1,70 @@
|
|
|
1
1
|
import * as util from "node:util";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
})(ScopeMatch ||
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
import { userScopeInputSchema, policyScopeSchema, AccessPolicyType } from "./accessPolicy.js";
|
|
4
|
+
var ScopeMatch = /* @__PURE__ */ ((ScopeMatch2) => {
|
|
5
|
+
ScopeMatch2["Exact"] = "exact";
|
|
6
|
+
ScopeMatch2["Greedy"] = "greedy";
|
|
7
|
+
return ScopeMatch2;
|
|
8
|
+
})(ScopeMatch || {});
|
|
9
|
+
const policyFilterSchema = z.object({
|
|
10
|
+
policyScope: policyScopeSchema.optional(),
|
|
11
|
+
/**
|
|
12
|
+
* Exact: "clientId" => client rules, "undefined" => global rules. Used by the API
|
|
13
|
+
* Greedy: "clientId" => client + global rules, "undefined" => any rules. Used by the Express middleware
|
|
14
|
+
*/
|
|
15
|
+
policyScopeMatch: z.nativeEnum(ScopeMatch).default(
|
|
16
|
+
"exact"
|
|
17
|
+
/* Exact */
|
|
18
|
+
),
|
|
19
|
+
userScope: userScopeInputSchema.optional(),
|
|
20
|
+
/**
|
|
21
|
+
* Exact: finds rules where all the given fields matches and doesn't check IP against masks. Used by the API
|
|
22
|
+
* Greedy: finds rules where any of the given fields match and checks IP against masks. Used by the Express middleware
|
|
23
|
+
*/
|
|
24
|
+
userScopeMatch: z.nativeEnum(ScopeMatch).default(
|
|
25
|
+
"exact"
|
|
26
|
+
/* Exact */
|
|
27
|
+
)
|
|
14
28
|
});
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const createAccessPolicyResolver = (accessRulesReader, logger) => {
|
|
30
|
+
return async (filter) => {
|
|
31
|
+
const accessRules = await accessRulesReader.findRules(filter);
|
|
32
|
+
const primaryAccessRule = resolvePrimaryRule(accessRules);
|
|
33
|
+
logger.debug(() => ({
|
|
34
|
+
msg: "Resolved access policy",
|
|
35
|
+
// filter contains BigInt, which can't be handled directly via logger.
|
|
36
|
+
data: {
|
|
37
|
+
inspect: util.inspect(
|
|
38
|
+
{
|
|
39
|
+
filter,
|
|
40
|
+
accessRules,
|
|
41
|
+
primaryAccessRule
|
|
42
|
+
},
|
|
43
|
+
{ depth: null }
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
}));
|
|
47
|
+
return primaryAccessRule;
|
|
48
|
+
};
|
|
31
49
|
};
|
|
32
50
|
const resolvePrimaryRule = (rules) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
51
|
+
const blockingRules = rules.filter(
|
|
52
|
+
(accessRule) => AccessPolicyType.Block === accessRule.type
|
|
53
|
+
);
|
|
54
|
+
const rulesToEvaluate = blockingRules.length > 0 ? blockingRules : rules;
|
|
55
|
+
return resolveMostLocalRule(rulesToEvaluate);
|
|
36
56
|
};
|
|
37
57
|
const resolveMostLocalRule = (rules) => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return
|
|
58
|
+
const clientRules = rules.filter(
|
|
59
|
+
(accessRule) => "string" === typeof accessRule.clientId
|
|
60
|
+
);
|
|
61
|
+
if (clientRules.length > 0) {
|
|
62
|
+
return clientRules.shift();
|
|
63
|
+
}
|
|
64
|
+
return rules.shift();
|
|
65
|
+
};
|
|
66
|
+
export {
|
|
67
|
+
ScopeMatch,
|
|
68
|
+
createAccessPolicyResolver,
|
|
69
|
+
policyFilterSchema
|
|
43
70
|
};
|
|
44
|
-
//# sourceMappingURL=accessPolicyResolver.js.map
|
package/dist/accessRules.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { userScopeSchema, policyScopeSchema, accessPolicySchema } from "./accessPolicy.js";
|
|
3
|
+
const accessRuleSchema = z.object({
|
|
4
|
+
// flat structure is used to fit the Redis requirements
|
|
5
|
+
...accessPolicySchema.shape,
|
|
6
|
+
...policyScopeSchema.shape,
|
|
7
|
+
...userScopeSchema.shape
|
|
7
8
|
});
|
|
8
|
-
|
|
9
|
+
export {
|
|
10
|
+
accessRuleSchema
|
|
11
|
+
};
|
|
@@ -1,56 +1,79 @@
|
|
|
1
|
-
import { DeleteAllRulesEndpoint } from "
|
|
1
|
+
import { DeleteAllRulesEndpoint } from "./deleteAllRulesEndpoint.js";
|
|
2
2
|
import { DeleteRulesEndpoint } from "./deleteRulesEndpoint.js";
|
|
3
3
|
import { InsertRulesEndpoint } from "./insertRulesEndpoint.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
})(accessRuleApiPaths ||
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
4
|
+
var accessRuleApiPaths = /* @__PURE__ */ ((accessRuleApiPaths2) => {
|
|
5
|
+
accessRuleApiPaths2["INSERT_MANY"] = "/v1/prosopo/user-access-policy/rules/insert-many";
|
|
6
|
+
accessRuleApiPaths2["DELETE_MANY"] = "/v1/prosopo/user-access-policy/rules/delete-many";
|
|
7
|
+
accessRuleApiPaths2["DELETE_ALL"] = "/v1/prosopo/user-access-policy/rules/delete-all";
|
|
8
|
+
return accessRuleApiPaths2;
|
|
9
|
+
})(accessRuleApiPaths || {});
|
|
10
|
+
class AccessRuleApiRoutes {
|
|
11
|
+
constructor(accessRulesStorage) {
|
|
12
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
13
|
+
}
|
|
14
|
+
getRoutes() {
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
path: "/v1/prosopo/user-access-policy/rules/insert-many",
|
|
18
|
+
endpoint: new InsertRulesEndpoint(this.accessRulesStorage)
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
path: "/v1/prosopo/user-access-policy/rules/delete-many",
|
|
22
|
+
endpoint: new DeleteRulesEndpoint(this.accessRulesStorage)
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
path: "/v1/prosopo/user-access-policy/rules/delete-all",
|
|
26
|
+
endpoint: new DeleteAllRulesEndpoint(this.accessRulesStorage)
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
31
|
+
const getExpressApiRuleRateLimits = () => {
|
|
32
|
+
const defaultWindowsMs = 6e4;
|
|
33
|
+
const defaultLimit = 5;
|
|
34
|
+
return {
|
|
35
|
+
[
|
|
36
|
+
"/v1/prosopo/user-access-policy/rules/insert-many"
|
|
37
|
+
/* INSERT_MANY */
|
|
38
|
+
]: {
|
|
39
|
+
windowMs: getIntEnvironmentVariable(
|
|
40
|
+
"PROSOPO_USER_ACCESS_POLICY_RULE_INSERT_MANY_WINDOW"
|
|
41
|
+
) || defaultWindowsMs,
|
|
42
|
+
limit: getIntEnvironmentVariable(
|
|
43
|
+
"PROSOPO_USER_ACCESS_POLICY_RULE_INSERT_MANY_LIMIT"
|
|
44
|
+
) || defaultLimit
|
|
45
|
+
},
|
|
46
|
+
[
|
|
47
|
+
"/v1/prosopo/user-access-policy/rules/delete-many"
|
|
48
|
+
/* DELETE_MANY */
|
|
49
|
+
]: {
|
|
50
|
+
windowMs: getIntEnvironmentVariable(
|
|
51
|
+
"PROSOPO_USER_ACCESS_POLICY_RULE_DELETE_MANY_WINDOW"
|
|
52
|
+
) || defaultWindowsMs,
|
|
53
|
+
limit: getIntEnvironmentVariable(
|
|
54
|
+
"PROSOPO_USER_ACCESS_POLICY_RULE_DELETE_MANY_LIMIT"
|
|
55
|
+
) || defaultLimit
|
|
56
|
+
},
|
|
57
|
+
[
|
|
58
|
+
"/v1/prosopo/user-access-policy/rules/delete-all"
|
|
59
|
+
/* DELETE_ALL */
|
|
60
|
+
]: {
|
|
61
|
+
windowMs: getIntEnvironmentVariable(
|
|
62
|
+
"PROSOPO_USER_ACCESS_POLICY_RULE_DELETE_ALL_WINDOW"
|
|
63
|
+
) || defaultWindowsMs,
|
|
64
|
+
limit: getIntEnvironmentVariable(
|
|
65
|
+
"PROSOPO_USER_ACCESS_POLICY_RULE_DELETE_ALL_LIMIT"
|
|
66
|
+
) || defaultLimit
|
|
67
|
+
}
|
|
68
|
+
};
|
|
48
69
|
};
|
|
49
70
|
const getIntEnvironmentVariable = (variableName) => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
71
|
+
const variableValue = process.env[variableName];
|
|
72
|
+
const numericValue = variableValue ? Number.parseInt(variableValue) : Number.NaN;
|
|
73
|
+
return Number.isInteger(numericValue) ? numericValue : void 0;
|
|
74
|
+
};
|
|
75
|
+
export {
|
|
76
|
+
AccessRuleApiRoutes,
|
|
77
|
+
accessRuleApiPaths,
|
|
78
|
+
getExpressApiRuleRateLimits
|
|
55
79
|
};
|
|
56
|
-
//# sourceMappingURL=accessRuleApiRoutes.js.map
|
|
@@ -1,21 +1,24 @@
|
|
|
1
|
-
import { ApiEndpointResponseStatus
|
|
1
|
+
import { ApiEndpointResponseStatus } from "@prosopo/api-route";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
3
|
+
const deleteAllRulesEndpointSchema = z.object({});
|
|
4
|
+
class DeleteAllRulesEndpoint {
|
|
5
|
+
constructor(accessRulesStorage) {
|
|
6
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
7
|
+
}
|
|
8
|
+
async processRequest(args) {
|
|
9
|
+
const deletedCount = await this.accessRulesStorage.deleteAllRules();
|
|
10
|
+
return {
|
|
11
|
+
status: ApiEndpointResponseStatus.SUCCESS,
|
|
12
|
+
data: {
|
|
13
|
+
deleted_count: deletedCount
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
getRequestArgsSchema() {
|
|
18
|
+
return deleteAllRulesEndpointSchema;
|
|
19
|
+
}
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
export {
|
|
22
|
+
DeleteAllRulesEndpoint,
|
|
23
|
+
deleteAllRulesEndpointSchema
|
|
24
|
+
};
|
|
@@ -1,31 +1,34 @@
|
|
|
1
|
-
import { ApiEndpointResponseStatus
|
|
1
|
+
import { ApiEndpointResponseStatus } from "@prosopo/api-route";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { policyFilterSchema } from "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { policyFilterSchema } from "../accessPolicyResolver.js";
|
|
4
|
+
const deleteRulesEndpointSchema = z.array(policyFilterSchema);
|
|
5
|
+
class DeleteRulesEndpoint {
|
|
6
|
+
constructor(accessRulesStorage) {
|
|
7
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
8
|
+
}
|
|
9
|
+
async processRequest(args) {
|
|
10
|
+
const allRuleIds = [];
|
|
11
|
+
for (const accessRuleFilter of args) {
|
|
12
|
+
const parsedRules = policyFilterSchema.parse(accessRuleFilter);
|
|
13
|
+
const foundRuleIds = await this.accessRulesStorage.findRuleIds(parsedRules);
|
|
14
|
+
allRuleIds.push(...foundRuleIds);
|
|
8
15
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const parsedRules = policyFilterSchema.parse(accessRuleFilter);
|
|
13
|
-
const foundRuleIds = await this.accessRulesStorage.findRuleIds(parsedRules);
|
|
14
|
-
allRuleIds.push(...foundRuleIds);
|
|
15
|
-
}
|
|
16
|
-
const uniqueRuleIds = [...new Set(allRuleIds)];
|
|
17
|
-
if (uniqueRuleIds.length > 0) {
|
|
18
|
-
await this.accessRulesStorage.deleteRules(uniqueRuleIds);
|
|
19
|
-
}
|
|
20
|
-
return {
|
|
21
|
-
status: ApiEndpointResponseStatus.SUCCESS,
|
|
22
|
-
data: {
|
|
23
|
-
deleted_count: uniqueRuleIds.length,
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
getRequestArgsSchema() {
|
|
28
|
-
return deleteRulesEndpointSchema;
|
|
16
|
+
const uniqueRuleIds = [...new Set(allRuleIds)];
|
|
17
|
+
if (uniqueRuleIds.length > 0) {
|
|
18
|
+
await this.accessRulesStorage.deleteRules(uniqueRuleIds);
|
|
29
19
|
}
|
|
20
|
+
return {
|
|
21
|
+
status: ApiEndpointResponseStatus.SUCCESS,
|
|
22
|
+
data: {
|
|
23
|
+
deleted_count: uniqueRuleIds.length
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
getRequestArgsSchema() {
|
|
28
|
+
return deleteRulesEndpointSchema;
|
|
29
|
+
}
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
export {
|
|
32
|
+
DeleteRulesEndpoint,
|
|
33
|
+
deleteRulesEndpointSchema
|
|
34
|
+
};
|