@prosopo/user-access-policy 3.5.19 → 3.5.28
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 +84 -0
- package/dist/.export.js +21 -0
- package/dist/api/.export.js +11 -0
- package/dist/api/delete/.export.js +1 -0
- package/dist/api/{deleteAllRulesEndpoint.js → delete/deleteAllRules.js} +10 -9
- package/dist/api/delete/deleteRuleGroups.js +52 -0
- package/dist/api/delete/deleteRules.js +43 -0
- package/dist/api/read/.export.js +1 -0
- package/dist/api/read/fetchRules.js +43 -0
- package/dist/api/read/findRuleIds.js +50 -0
- package/dist/api/read/getMissingIds.js +41 -0
- package/dist/api/ruleApiRoutes.js +131 -0
- package/dist/api/rulesApiClient.js +93 -0
- package/dist/api/write/.export.js +1 -0
- package/dist/api/write/insertRules.js +102 -0
- package/dist/api/write/rehashRules.js +57 -0
- package/dist/cjs/.export.cjs +21 -0
- package/dist/cjs/api/.export.cjs +11 -0
- package/dist/cjs/api/delete/.export.cjs +1 -0
- package/dist/cjs/api/{deleteAllRulesEndpoint.cjs → delete/deleteAllRules.cjs} +9 -8
- package/dist/cjs/api/delete/deleteRuleGroups.cjs +52 -0
- package/dist/cjs/api/delete/deleteRules.cjs +43 -0
- package/dist/cjs/api/read/.export.cjs +1 -0
- package/dist/cjs/api/read/fetchRules.cjs +43 -0
- package/dist/cjs/api/read/findRuleIds.cjs +50 -0
- package/dist/cjs/api/read/getMissingIds.cjs +41 -0
- package/dist/cjs/api/ruleApiRoutes.cjs +131 -0
- package/dist/cjs/api/rulesApiClient.cjs +93 -0
- package/dist/cjs/api/write/.export.cjs +1 -0
- package/dist/cjs/api/write/insertRules.cjs +102 -0
- package/dist/cjs/api/write/rehashRules.cjs +57 -0
- package/dist/cjs/mongoose/.export.cjs +4 -0
- package/dist/cjs/mongoose/mongooseRuleSchema.cjs +36 -0
- package/dist/cjs/redis/.export.cjs +6 -0
- package/dist/cjs/redis/reader/redisAggregate.cjs +60 -0
- package/dist/cjs/redis/reader/redisRulesQuery.cjs +99 -0
- package/dist/cjs/redis/reader/redisRulesReader.cjs +230 -0
- package/dist/cjs/redis/redisClient.cjs +67 -0
- package/dist/cjs/redis/redisRuleIndex.cjs +50 -0
- package/dist/cjs/redis/redisRulesStorage.cjs +22 -9
- package/dist/cjs/redis/redisRulesWriter.cjs +91 -64
- package/dist/cjs/rule.cjs +8 -0
- package/dist/cjs/ruleInput/.export.cjs +9 -0
- package/dist/cjs/ruleInput/policyInput.cjs +25 -0
- package/dist/cjs/ruleInput/ruleInput.cjs +50 -0
- package/dist/cjs/ruleInput/userScopeInput.cjs +55 -0
- package/dist/cjs/ruleRecord.cjs +23 -0
- package/dist/cjs/rulesStorage.cjs +8 -0
- package/dist/cjs/transformRule.cjs +77 -0
- package/dist/mongoose/.export.js +4 -0
- package/dist/mongoose/mongooseRuleSchema.js +36 -0
- package/dist/redis/.export.js +6 -0
- package/dist/redis/reader/redisAggregate.js +60 -0
- package/dist/redis/reader/redisRulesQuery.js +99 -0
- package/dist/redis/reader/redisRulesReader.js +213 -0
- package/dist/redis/redisClient.js +67 -0
- package/dist/redis/redisRuleIndex.js +50 -0
- package/dist/redis/redisRulesStorage.js +23 -10
- package/dist/redis/redisRulesWriter.js +91 -64
- package/dist/rule.js +8 -0
- package/dist/ruleInput/.export.js +9 -0
- package/dist/ruleInput/policyInput.js +25 -0
- package/dist/ruleInput/ruleInput.js +50 -0
- package/dist/ruleInput/userScopeInput.js +55 -0
- package/dist/ruleRecord.js +23 -0
- package/dist/rulesStorage.js +8 -0
- package/dist/transformRule.js +77 -0
- package/entries.ts +20 -0
- package/package.json +34 -18
- package/vite.cjs.config.ts +4 -1
- package/vite.esm.config.ts +6 -1
- package/dist/accessPolicy.js +0 -80
- package/dist/accessPolicyResolver.js +0 -31
- package/dist/accessRules.js +0 -11
- package/dist/api/accessRuleApiRoutes.js +0 -79
- package/dist/api/accessRulesApiClient.js +0 -38
- package/dist/api/deleteRulesEndpoint.js +0 -34
- package/dist/api/insertRulesEndpoint.js +0 -62
- package/dist/cjs/accessPolicy.cjs +0 -80
- package/dist/cjs/accessPolicyResolver.cjs +0 -31
- package/dist/cjs/accessRules.cjs +0 -11
- package/dist/cjs/api/accessRuleApiRoutes.cjs +0 -79
- package/dist/cjs/api/accessRulesApiClient.cjs +0 -38
- package/dist/cjs/api/deleteRulesEndpoint.cjs +0 -34
- package/dist/cjs/api/insertRulesEndpoint.cjs +0 -62
- package/dist/cjs/index.cjs +0 -31
- package/dist/cjs/redis/redisRulesIndex.cjs +0 -138
- package/dist/cjs/redis/redisRulesReader.cjs +0 -142
- package/dist/cjs/util.cjs +0 -5
- package/dist/index.js +0 -32
- package/dist/redis/redisRulesIndex.js +0 -138
- package/dist/redis/redisRulesReader.js +0 -125
- package/dist/util.js +0 -5
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ApiEndpointResponseStatus } from "@prosopo/api-route";
|
|
2
|
+
import { LogLevel } from "@prosopo/common";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { policyScopeInput, accessPolicyInput } from "../../ruleInput/policyInput.js";
|
|
5
|
+
import { userScopeInput } from "../../ruleInput/userScopeInput.js";
|
|
6
|
+
class InsertRulesEndpoint {
|
|
7
|
+
constructor(accessRulesWriter, logger) {
|
|
8
|
+
this.accessRulesWriter = accessRulesWriter;
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
}
|
|
11
|
+
getRequestArgsSchema() {
|
|
12
|
+
return z.array(
|
|
13
|
+
z.object({
|
|
14
|
+
accessPolicy: accessPolicyInput,
|
|
15
|
+
policyScopes: z.array(policyScopeInput).optional(),
|
|
16
|
+
groupId: z.string().optional(),
|
|
17
|
+
userScopes: z.array(userScopeInput),
|
|
18
|
+
expiresUnixTimestamp: z.number().optional()
|
|
19
|
+
})
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
async processRequest(args) {
|
|
23
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
24
|
+
setTimeout(() => {
|
|
25
|
+
resolve({
|
|
26
|
+
status: ApiEndpointResponseStatus.PROCESSING
|
|
27
|
+
});
|
|
28
|
+
}, 5e3);
|
|
29
|
+
});
|
|
30
|
+
const userScopesCount = args.reduce(
|
|
31
|
+
(userScopesCount2, group) => userScopesCount2 + group.userScopes.length,
|
|
32
|
+
0
|
|
33
|
+
);
|
|
34
|
+
const createRulesPromise = this.createRuleGroups(args).then((insertedIds) => {
|
|
35
|
+
this.logger.info(() => ({
|
|
36
|
+
msg: "Endpoint inserted access rules",
|
|
37
|
+
data: {
|
|
38
|
+
userScopesCount,
|
|
39
|
+
insertedCount: insertedIds.length,
|
|
40
|
+
uniqueIdsCount: new Set(insertedIds).size
|
|
41
|
+
}
|
|
42
|
+
}));
|
|
43
|
+
this.logger.debug(() => ({
|
|
44
|
+
msg: "Inserted access rules details",
|
|
45
|
+
data: {
|
|
46
|
+
insertedIds,
|
|
47
|
+
input: args
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
return {
|
|
51
|
+
status: ApiEndpointResponseStatus.SUCCESS
|
|
52
|
+
};
|
|
53
|
+
}).catch((error) => {
|
|
54
|
+
if (LogLevel.enum.debug === this.logger.getLogLevel()) {
|
|
55
|
+
this.logger.error(() => ({
|
|
56
|
+
err: error,
|
|
57
|
+
data: { args },
|
|
58
|
+
msg: "Failed to insert access rules"
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
status: ApiEndpointResponseStatus.FAIL
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
return Promise.race([timeoutPromise, createRulesPromise]);
|
|
66
|
+
}
|
|
67
|
+
async createRuleGroups(groups) {
|
|
68
|
+
const ruleIdPromises = groups.map((group) => this.createRulesGroup(group));
|
|
69
|
+
const ruleIdSets = await Promise.all(ruleIdPromises);
|
|
70
|
+
return ruleIdSets.flat();
|
|
71
|
+
}
|
|
72
|
+
async createRulesGroup(group) {
|
|
73
|
+
const ruleEntries = [];
|
|
74
|
+
const policyScopes = group.policyScopes || [];
|
|
75
|
+
for (const userScope of group.userScopes) {
|
|
76
|
+
const ruleBase = {
|
|
77
|
+
...group.accessPolicy,
|
|
78
|
+
...userScope,
|
|
79
|
+
...group.groupId ? { groupId: group.groupId } : {}
|
|
80
|
+
};
|
|
81
|
+
if (policyScopes.length > 0) {
|
|
82
|
+
for (const policyScope of policyScopes) {
|
|
83
|
+
ruleEntries.push({
|
|
84
|
+
rule: {
|
|
85
|
+
...ruleBase,
|
|
86
|
+
...policyScope
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
ruleEntries.push({
|
|
92
|
+
rule: ruleBase,
|
|
93
|
+
expiresUnixTimestamp: group.expiresUnixTimestamp
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return this.accessRulesWriter.insertRules(ruleEntries);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
InsertRulesEndpoint
|
|
102
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ApiEndpointResponseStatus } from "@prosopo/api-route";
|
|
2
|
+
class RehashRulesEndpoint {
|
|
3
|
+
constructor(accessRulesStorage, logger) {
|
|
4
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
5
|
+
this.logger = logger;
|
|
6
|
+
}
|
|
7
|
+
getRequestArgsSchema() {
|
|
8
|
+
}
|
|
9
|
+
async processRequest() {
|
|
10
|
+
await this.accessRulesStorage.fetchAllRuleIds(async (ruleIds) => {
|
|
11
|
+
this.logger.info(() => ({
|
|
12
|
+
msg: "Fetched rule ids batch",
|
|
13
|
+
data: {
|
|
14
|
+
count: ruleIds.length,
|
|
15
|
+
ruleIds
|
|
16
|
+
}
|
|
17
|
+
}));
|
|
18
|
+
const ruleEntries = await this.accessRulesStorage.fetchRules(ruleIds);
|
|
19
|
+
this.logger.info(() => ({
|
|
20
|
+
msg: "Fetched rules",
|
|
21
|
+
data: {
|
|
22
|
+
count: ruleEntries.length
|
|
23
|
+
}
|
|
24
|
+
}));
|
|
25
|
+
if (ruleEntries.length !== ruleIds.length) {
|
|
26
|
+
this.logger.warn(() => ({
|
|
27
|
+
msg: "Fetched rules count is not equal to the requested count",
|
|
28
|
+
data: {
|
|
29
|
+
fetchedCount: ruleEntries.length,
|
|
30
|
+
requestedCount: ruleIds.length
|
|
31
|
+
}
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
await this.accessRulesStorage.deleteRules(ruleIds);
|
|
35
|
+
this.logger.info(() => ({
|
|
36
|
+
msg: "Deleted rules",
|
|
37
|
+
data: {
|
|
38
|
+
count: ruleIds.length
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
await this.accessRulesStorage.insertRules(ruleEntries);
|
|
42
|
+
this.logger.info(() => ({
|
|
43
|
+
msg: "Inserted rules",
|
|
44
|
+
data: {
|
|
45
|
+
count: ruleEntries.length
|
|
46
|
+
}
|
|
47
|
+
}));
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
status: ApiEndpointResponseStatus.SUCCESS,
|
|
51
|
+
data: {}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
RehashRulesEndpoint
|
|
57
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("./ruleInput/.export.cjs");
|
|
4
|
+
const transformRule = require("./transformRule.cjs");
|
|
5
|
+
const rule = require("./rule.cjs");
|
|
6
|
+
const rulesStorage = require("./rulesStorage.cjs");
|
|
7
|
+
const ruleRecord = require("./ruleRecord.cjs");
|
|
8
|
+
const ruleInput = require("./ruleInput/ruleInput.cjs");
|
|
9
|
+
const policyInput = require("./ruleInput/policyInput.cjs");
|
|
10
|
+
const userScopeInput = require("./ruleInput/userScopeInput.cjs");
|
|
11
|
+
exports.makeAccessRuleHash = transformRule.makeAccessRuleHash;
|
|
12
|
+
exports.transformAccessRuleIntoRecord = transformRule.transformAccessRuleIntoRecord;
|
|
13
|
+
exports.transformAccessRuleRecordIntoRule = transformRule.transformAccessRuleRecordIntoRule;
|
|
14
|
+
exports.AccessPolicyType = rule.AccessPolicyType;
|
|
15
|
+
exports.FilterScopeMatch = rulesStorage.FilterScopeMatch;
|
|
16
|
+
exports.getUserScopeRecordFromAccessRuleRecord = ruleRecord.getUserScopeRecordFromAccessRuleRecord;
|
|
17
|
+
exports.userScopeRecordFields = ruleRecord.userScopeRecordFields;
|
|
18
|
+
exports.accessRuleInput = ruleInput.accessRuleInput;
|
|
19
|
+
exports.accessPolicyInput = policyInput.accessPolicyInput;
|
|
20
|
+
exports.policyScopeInput = policyInput.policyScopeInput;
|
|
21
|
+
exports.userScopeInput = userScopeInput.userScopeInput;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("./delete/.export.cjs");
|
|
4
|
+
require("./read/.export.cjs");
|
|
5
|
+
require("./write/.export.cjs");
|
|
6
|
+
const ruleApiRoutes = require("./ruleApiRoutes.cjs");
|
|
7
|
+
const rulesApiClient = require("./rulesApiClient.cjs");
|
|
8
|
+
exports.AccessRuleApiRoutes = ruleApiRoutes.AccessRuleApiRoutes;
|
|
9
|
+
exports.accessRuleApiPaths = ruleApiRoutes.accessRuleApiPaths;
|
|
10
|
+
exports.getExpressApiRuleRateLimits = ruleApiRoutes.getExpressApiRuleRateLimits;
|
|
11
|
+
exports.AccessRulesApiClient = rulesApiClient.AccessRulesApiClient;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const apiRoute = require("@prosopo/api-route");
|
|
4
|
-
const zod = require("zod");
|
|
5
|
-
const deleteAllRulesEndpointSchema = zod.z.object({});
|
|
6
4
|
class DeleteAllRulesEndpoint {
|
|
7
|
-
constructor(accessRulesStorage) {
|
|
5
|
+
constructor(accessRulesStorage, logger) {
|
|
8
6
|
this.accessRulesStorage = accessRulesStorage;
|
|
7
|
+
this.logger = logger;
|
|
9
8
|
}
|
|
10
|
-
|
|
9
|
+
getRequestArgsSchema() {
|
|
10
|
+
}
|
|
11
|
+
async processRequest() {
|
|
11
12
|
const deletedCount = await this.accessRulesStorage.deleteAllRules();
|
|
13
|
+
this.logger.info(() => ({
|
|
14
|
+
msg: "Endpoint deleted all access rules",
|
|
15
|
+
data: { deletedCount }
|
|
16
|
+
}));
|
|
12
17
|
return {
|
|
13
18
|
status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
|
|
14
19
|
data: {
|
|
@@ -16,9 +21,5 @@ class DeleteAllRulesEndpoint {
|
|
|
16
21
|
}
|
|
17
22
|
};
|
|
18
23
|
}
|
|
19
|
-
getRequestArgsSchema() {
|
|
20
|
-
return deleteAllRulesEndpointSchema;
|
|
21
|
-
}
|
|
22
24
|
}
|
|
23
25
|
exports.DeleteAllRulesEndpoint = DeleteAllRulesEndpoint;
|
|
24
|
-
exports.deleteAllRulesEndpointSchema = deleteAllRulesEndpointSchema;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const apiRoute = require("@prosopo/api-route");
|
|
4
|
+
const zod = require("zod");
|
|
5
|
+
const rulesStorage = require("../../rulesStorage.cjs");
|
|
6
|
+
class DeleteRuleGroupsEndpoint {
|
|
7
|
+
constructor(accessRulesStorage, logger) {
|
|
8
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
}
|
|
11
|
+
getRequestArgsSchema() {
|
|
12
|
+
return zod.z.array(
|
|
13
|
+
zod.z.object({
|
|
14
|
+
clientIds: zod.z.string().array(),
|
|
15
|
+
groupId: zod.z.string()
|
|
16
|
+
})
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
async processRequest(args) {
|
|
20
|
+
const foundRuleIdPromises = args.flatMap(
|
|
21
|
+
(ruleToDelete) => ruleToDelete.clientIds.map(
|
|
22
|
+
(clientId) => this.accessRulesStorage.findRuleIds({
|
|
23
|
+
policyScope: {
|
|
24
|
+
clientId
|
|
25
|
+
},
|
|
26
|
+
policyScopeMatch: rulesStorage.FilterScopeMatch.Exact,
|
|
27
|
+
groupId: ruleToDelete.groupId
|
|
28
|
+
})
|
|
29
|
+
)
|
|
30
|
+
);
|
|
31
|
+
const foundRuleIds = await Promise.all(foundRuleIdPromises);
|
|
32
|
+
const ruleIds = foundRuleIds.flat();
|
|
33
|
+
const uniqueRuleIds = [...new Set(ruleIds)];
|
|
34
|
+
if (uniqueRuleIds.length > 0) {
|
|
35
|
+
await this.accessRulesStorage.deleteRules(uniqueRuleIds);
|
|
36
|
+
}
|
|
37
|
+
this.logger.info(() => ({
|
|
38
|
+
msg: "Endpoint deleted rule groups",
|
|
39
|
+
data: {
|
|
40
|
+
args,
|
|
41
|
+
uniqueRuleIds
|
|
42
|
+
}
|
|
43
|
+
}));
|
|
44
|
+
return {
|
|
45
|
+
status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
|
|
46
|
+
data: {
|
|
47
|
+
deleted_count: uniqueRuleIds.length
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.DeleteRuleGroupsEndpoint = DeleteRuleGroupsEndpoint;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const apiRoute = require("@prosopo/api-route");
|
|
4
|
+
const common = require("@prosopo/common");
|
|
5
|
+
const zod = require("zod");
|
|
6
|
+
const ruleInput = require("../../ruleInput/ruleInput.cjs");
|
|
7
|
+
class DeleteRulesEndpoint {
|
|
8
|
+
constructor(accessRulesStorage, logger) {
|
|
9
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
}
|
|
12
|
+
getRequestArgsSchema() {
|
|
13
|
+
return zod.z.array(ruleInput.accessRulesFilterInput);
|
|
14
|
+
}
|
|
15
|
+
async processRequest(args) {
|
|
16
|
+
let deletedCount = 0;
|
|
17
|
+
for (const rulesFilterInput of args) {
|
|
18
|
+
const ruleFilters = ruleInput.getAccessRuleFiltersFromInput(rulesFilterInput);
|
|
19
|
+
await common.executeBatchesSequentially(ruleFilters, async (ruleFilter) => {
|
|
20
|
+
const ruleIds = await this.accessRulesStorage.findRuleIds(ruleFilter);
|
|
21
|
+
const uniqueRuleIds = [...new Set(ruleIds)];
|
|
22
|
+
if (uniqueRuleIds.length > 0) {
|
|
23
|
+
await this.accessRulesStorage.deleteRules(uniqueRuleIds);
|
|
24
|
+
deletedCount += uniqueRuleIds.length;
|
|
25
|
+
this.logger.info(() => ({
|
|
26
|
+
msg: "Endpoint deleted rules",
|
|
27
|
+
data: {
|
|
28
|
+
rulesFilterInput,
|
|
29
|
+
uniqueRuleIds
|
|
30
|
+
}
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
|
|
37
|
+
data: {
|
|
38
|
+
deleted_count: deletedCount
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.DeleteRulesEndpoint = DeleteRulesEndpoint;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const apiRoute = require("@prosopo/api-route");
|
|
4
|
+
const zod = require("zod");
|
|
5
|
+
const ruleInput = require("../../ruleInput/ruleInput.cjs");
|
|
6
|
+
const fetchRulesResponse = zod.z.object({
|
|
7
|
+
ruleEntries: ruleInput.ruleEntryInput.array()
|
|
8
|
+
});
|
|
9
|
+
class FetchRulesEndpoint {
|
|
10
|
+
constructor(accessRulesStorage, logger) {
|
|
11
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
}
|
|
14
|
+
getRequestArgsSchema() {
|
|
15
|
+
return zod.z.object({
|
|
16
|
+
ids: zod.z.string().array()
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async processRequest(args) {
|
|
20
|
+
const ruleEntries = await this.accessRulesStorage.fetchRules(args.ids);
|
|
21
|
+
this.logger.info(() => ({
|
|
22
|
+
msg: "Endpoint fetched rules",
|
|
23
|
+
data: {
|
|
24
|
+
requestedCount: args.ids.length,
|
|
25
|
+
foundCount: ruleEntries.length
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
this.logger.debug(() => ({
|
|
29
|
+
msg: "Fetched rule details",
|
|
30
|
+
data: {
|
|
31
|
+
ruleEntries
|
|
32
|
+
}
|
|
33
|
+
}));
|
|
34
|
+
return {
|
|
35
|
+
status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
|
|
36
|
+
data: {
|
|
37
|
+
ruleEntries
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.FetchRulesEndpoint = FetchRulesEndpoint;
|
|
43
|
+
exports.fetchRulesResponse = fetchRulesResponse;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const apiRoute = require("@prosopo/api-route");
|
|
4
|
+
const common = require("@prosopo/common");
|
|
5
|
+
const zod = require("zod");
|
|
6
|
+
const ruleInput = require("../../ruleInput/ruleInput.cjs");
|
|
7
|
+
const ruleIdsResponse = zod.z.object({
|
|
8
|
+
ruleIds: zod.z.string().array()
|
|
9
|
+
});
|
|
10
|
+
class FindRuleIdsEndpoint {
|
|
11
|
+
constructor(accessRulesStorage, logger) {
|
|
12
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
}
|
|
15
|
+
getRequestArgsSchema() {
|
|
16
|
+
return zod.z.array(ruleInput.accessRulesFilterInput);
|
|
17
|
+
}
|
|
18
|
+
async processRequest(args) {
|
|
19
|
+
const ruleIdBatches = await common.executeBatchesSequentially(
|
|
20
|
+
args,
|
|
21
|
+
async (rulesFilterInput) => {
|
|
22
|
+
const ruleFilters = ruleInput.getAccessRuleFiltersFromInput(rulesFilterInput);
|
|
23
|
+
const ruleIds2 = await common.executeBatchesSequentially(
|
|
24
|
+
ruleFilters,
|
|
25
|
+
(ruleFilter) => this.accessRulesStorage.findRuleIds(ruleFilter)
|
|
26
|
+
);
|
|
27
|
+
return ruleIds2.flat();
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
const ruleIds = ruleIdBatches.flat();
|
|
31
|
+
const uniqueRuleIds = [...new Set(ruleIds)];
|
|
32
|
+
this.logger.info(() => ({
|
|
33
|
+
msg: "Endpoint found rules",
|
|
34
|
+
data: {
|
|
35
|
+
totalFoundCount: ruleIds.length,
|
|
36
|
+
uniqueFoundCount: uniqueRuleIds.length,
|
|
37
|
+
searchFilters: args,
|
|
38
|
+
foundIds: uniqueRuleIds
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
return {
|
|
42
|
+
status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
|
|
43
|
+
data: {
|
|
44
|
+
ruleIds: uniqueRuleIds
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.FindRuleIdsEndpoint = FindRuleIdsEndpoint;
|
|
50
|
+
exports.ruleIdsResponse = ruleIdsResponse;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const apiRoute = require("@prosopo/api-route");
|
|
4
|
+
const zod = require("zod");
|
|
5
|
+
const missingIdsResponse = zod.z.object({
|
|
6
|
+
ids: zod.z.string().array()
|
|
7
|
+
});
|
|
8
|
+
class GetMissingIdsEndpoint {
|
|
9
|
+
constructor(accessRulesStorage, logger) {
|
|
10
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
11
|
+
this.logger = logger;
|
|
12
|
+
}
|
|
13
|
+
getRequestArgsSchema() {
|
|
14
|
+
return zod.z.string().array();
|
|
15
|
+
}
|
|
16
|
+
async processRequest(args) {
|
|
17
|
+
const missingIds = await this.accessRulesStorage.getMissingRuleIds(args);
|
|
18
|
+
this.logger.info(() => ({
|
|
19
|
+
msg: "Endpoint checked missing ids",
|
|
20
|
+
data: {
|
|
21
|
+
idsToCheck: args.length,
|
|
22
|
+
missingIds: missingIds.length
|
|
23
|
+
}
|
|
24
|
+
}));
|
|
25
|
+
this.logger.debug(() => ({
|
|
26
|
+
msg: "Missing id details",
|
|
27
|
+
data: {
|
|
28
|
+
idsToCheck: args,
|
|
29
|
+
missingIds
|
|
30
|
+
}
|
|
31
|
+
}));
|
|
32
|
+
return {
|
|
33
|
+
status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
|
|
34
|
+
data: {
|
|
35
|
+
ids: missingIds
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.GetMissingIdsEndpoint = GetMissingIdsEndpoint;
|
|
41
|
+
exports.missingIdsResponse = missingIdsResponse;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const fetchRules = require("./read/fetchRules.cjs");
|
|
4
|
+
const findRuleIds = require("./read/findRuleIds.cjs");
|
|
5
|
+
const getMissingIds = require("./read/getMissingIds.cjs");
|
|
6
|
+
const rehashRules = require("./write/rehashRules.cjs");
|
|
7
|
+
const deleteAllRules = require("./delete/deleteAllRules.cjs");
|
|
8
|
+
const deleteRuleGroups = require("./delete/deleteRuleGroups.cjs");
|
|
9
|
+
const deleteRules = require("./delete/deleteRules.cjs");
|
|
10
|
+
const insertRules = require("./write/insertRules.cjs");
|
|
11
|
+
var accessRuleApiPaths = /* @__PURE__ */ ((accessRuleApiPaths2) => {
|
|
12
|
+
accessRuleApiPaths2["DELETE_ALL"] = "/v1/prosopo/user-access-policy/rules/delete-all";
|
|
13
|
+
accessRuleApiPaths2["DELETE_GROUPS"] = "/v1/prosopo/user-access-policy/rules/delete-groups";
|
|
14
|
+
accessRuleApiPaths2["DELETE_MANY"] = "/v1/prosopo/user-access-policy/rules/delete-many";
|
|
15
|
+
accessRuleApiPaths2["FETCH_MANY"] = "/v1/prosopo/user-access-policy/rules/fetch-many";
|
|
16
|
+
accessRuleApiPaths2["FIND_IDS"] = "/v1/prosopo/user-access-policy/rules/find-ids";
|
|
17
|
+
accessRuleApiPaths2["GET_MISSING_IDS"] = "/v1/prosopo/user-access-policy/rules/get-missing-ids";
|
|
18
|
+
accessRuleApiPaths2["INSERT_MANY"] = "/v1/prosopo/user-access-policy/rules/insert-many";
|
|
19
|
+
accessRuleApiPaths2["REHASH_ALL"] = "/v1/prosopo/user-access-policy/rules/rehash-all";
|
|
20
|
+
return accessRuleApiPaths2;
|
|
21
|
+
})(accessRuleApiPaths || {});
|
|
22
|
+
class AccessRuleApiRoutes {
|
|
23
|
+
constructor(accessRulesStorage, logger) {
|
|
24
|
+
this.accessRulesStorage = accessRulesStorage;
|
|
25
|
+
this.logger = logger;
|
|
26
|
+
}
|
|
27
|
+
getRoutes() {
|
|
28
|
+
return {
|
|
29
|
+
...this.makeDeleteEndpoints(),
|
|
30
|
+
...this.makeReadEndpoints(),
|
|
31
|
+
...this.makeWriteEndpoints()
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
makeDeleteEndpoints() {
|
|
35
|
+
return {
|
|
36
|
+
[
|
|
37
|
+
"/v1/prosopo/user-access-policy/rules/delete-all"
|
|
38
|
+
/* DELETE_ALL */
|
|
39
|
+
]: new deleteAllRules.DeleteAllRulesEndpoint(
|
|
40
|
+
this.accessRulesStorage,
|
|
41
|
+
this.logger
|
|
42
|
+
),
|
|
43
|
+
[
|
|
44
|
+
"/v1/prosopo/user-access-policy/rules/delete-groups"
|
|
45
|
+
/* DELETE_GROUPS */
|
|
46
|
+
]: new deleteRuleGroups.DeleteRuleGroupsEndpoint(
|
|
47
|
+
this.accessRulesStorage,
|
|
48
|
+
this.logger
|
|
49
|
+
),
|
|
50
|
+
[
|
|
51
|
+
"/v1/prosopo/user-access-policy/rules/delete-many"
|
|
52
|
+
/* DELETE_MANY */
|
|
53
|
+
]: new deleteRules.DeleteRulesEndpoint(
|
|
54
|
+
this.accessRulesStorage,
|
|
55
|
+
this.logger
|
|
56
|
+
)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
makeReadEndpoints() {
|
|
60
|
+
return {
|
|
61
|
+
[
|
|
62
|
+
"/v1/prosopo/user-access-policy/rules/fetch-many"
|
|
63
|
+
/* FETCH_MANY */
|
|
64
|
+
]: new fetchRules.FetchRulesEndpoint(
|
|
65
|
+
this.accessRulesStorage,
|
|
66
|
+
this.logger
|
|
67
|
+
),
|
|
68
|
+
[
|
|
69
|
+
"/v1/prosopo/user-access-policy/rules/find-ids"
|
|
70
|
+
/* FIND_IDS */
|
|
71
|
+
]: new findRuleIds.FindRuleIdsEndpoint(
|
|
72
|
+
this.accessRulesStorage,
|
|
73
|
+
this.logger
|
|
74
|
+
),
|
|
75
|
+
[
|
|
76
|
+
"/v1/prosopo/user-access-policy/rules/get-missing-ids"
|
|
77
|
+
/* GET_MISSING_IDS */
|
|
78
|
+
]: new getMissingIds.GetMissingIdsEndpoint(
|
|
79
|
+
this.accessRulesStorage,
|
|
80
|
+
this.logger
|
|
81
|
+
)
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
makeWriteEndpoints() {
|
|
85
|
+
return {
|
|
86
|
+
[
|
|
87
|
+
"/v1/prosopo/user-access-policy/rules/insert-many"
|
|
88
|
+
/* INSERT_MANY */
|
|
89
|
+
]: new insertRules.InsertRulesEndpoint(
|
|
90
|
+
this.accessRulesStorage,
|
|
91
|
+
this.logger
|
|
92
|
+
),
|
|
93
|
+
[
|
|
94
|
+
"/v1/prosopo/user-access-policy/rules/rehash-all"
|
|
95
|
+
/* REHASH_ALL */
|
|
96
|
+
]: new rehashRules.RehashRulesEndpoint(
|
|
97
|
+
this.accessRulesStorage,
|
|
98
|
+
this.logger
|
|
99
|
+
)
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const getExpressApiRuleRateLimits = () => {
|
|
104
|
+
const defaults = {
|
|
105
|
+
limit: 5,
|
|
106
|
+
windowSeconds: 10
|
|
107
|
+
};
|
|
108
|
+
const defaultWindowMs = defaults.windowSeconds * 1e3;
|
|
109
|
+
const rateLimitEntries = Object.entries(accessRuleApiPaths).map(
|
|
110
|
+
([endpointName, endpointPath]) => [
|
|
111
|
+
endpointPath,
|
|
112
|
+
{
|
|
113
|
+
windowMs: getIntEnvironmentVariable(
|
|
114
|
+
`PROSOPO_USER_ACCESS_POLICY_RULE_${endpointName}_WINDOW`
|
|
115
|
+
) || defaultWindowMs,
|
|
116
|
+
limit: getIntEnvironmentVariable(
|
|
117
|
+
`PROSOPO_USER_ACCESS_POLICY_RULE_${endpointName}_LIMIT`
|
|
118
|
+
) || defaults.limit
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
);
|
|
122
|
+
return Object.fromEntries(rateLimitEntries);
|
|
123
|
+
};
|
|
124
|
+
const getIntEnvironmentVariable = (variableName) => {
|
|
125
|
+
const variableValue = process.env[variableName];
|
|
126
|
+
const numericValue = variableValue ? Number.parseInt(variableValue) : Number.NaN;
|
|
127
|
+
return Number.isInteger(numericValue) ? numericValue : void 0;
|
|
128
|
+
};
|
|
129
|
+
exports.AccessRuleApiRoutes = AccessRuleApiRoutes;
|
|
130
|
+
exports.accessRuleApiPaths = accessRuleApiPaths;
|
|
131
|
+
exports.getExpressApiRuleRateLimits = getExpressApiRuleRateLimits;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const api = require("@prosopo/api");
|
|
4
|
+
const fetchRules = require("./read/fetchRules.cjs");
|
|
5
|
+
const findRuleIds = require("./read/findRuleIds.cjs");
|
|
6
|
+
const getMissingIds = require("./read/getMissingIds.cjs");
|
|
7
|
+
const ruleApiRoutes = require("./ruleApiRoutes.cjs");
|
|
8
|
+
class AccessRulesApiClient extends api.ApiClient {
|
|
9
|
+
//// delete
|
|
10
|
+
deleteMany(filters, timestamp, signature) {
|
|
11
|
+
return this.post(
|
|
12
|
+
ruleApiRoutes.accessRuleApiPaths.DELETE_MANY,
|
|
13
|
+
filters,
|
|
14
|
+
this.getAuthHeaders(timestamp, signature)
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
deleteGroups(siteGroups, timestamp, signature) {
|
|
18
|
+
return this.post(
|
|
19
|
+
ruleApiRoutes.accessRuleApiPaths.DELETE_GROUPS,
|
|
20
|
+
siteGroups,
|
|
21
|
+
this.getAuthHeaders(timestamp, signature)
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
deleteAll(timestamp, signature) {
|
|
25
|
+
return this.post(
|
|
26
|
+
ruleApiRoutes.accessRuleApiPaths.DELETE_ALL,
|
|
27
|
+
{},
|
|
28
|
+
this.getAuthHeaders(timestamp, signature)
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
//// read
|
|
32
|
+
async getMissingIds(idsToCheck, timestamp, signature) {
|
|
33
|
+
const endpointResponse = await this.post(
|
|
34
|
+
ruleApiRoutes.accessRuleApiPaths.GET_MISSING_IDS,
|
|
35
|
+
idsToCheck,
|
|
36
|
+
this.getAuthHeaders(timestamp, signature)
|
|
37
|
+
);
|
|
38
|
+
const parsedData = getMissingIds.missingIdsResponse.safeParse(endpointResponse.data);
|
|
39
|
+
return {
|
|
40
|
+
...endpointResponse,
|
|
41
|
+
data: parsedData.success ? parsedData.data : void 0
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async fetchMany(fetchOptions, timestamp, signature) {
|
|
45
|
+
const endpointResponse = await this.post(
|
|
46
|
+
ruleApiRoutes.accessRuleApiPaths.FETCH_MANY,
|
|
47
|
+
fetchOptions,
|
|
48
|
+
this.getAuthHeaders(timestamp, signature)
|
|
49
|
+
);
|
|
50
|
+
const parsedData = fetchRules.fetchRulesResponse.safeParse(endpointResponse.data);
|
|
51
|
+
return {
|
|
52
|
+
...endpointResponse,
|
|
53
|
+
data: parsedData.success ? parsedData.data : void 0
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async findIds(filters, timestamp, signature) {
|
|
57
|
+
const endpointResponse = await this.post(
|
|
58
|
+
ruleApiRoutes.accessRuleApiPaths.FIND_IDS,
|
|
59
|
+
filters,
|
|
60
|
+
this.getAuthHeaders(timestamp, signature)
|
|
61
|
+
);
|
|
62
|
+
const parsedData = findRuleIds.ruleIdsResponse.safeParse(endpointResponse.data);
|
|
63
|
+
return {
|
|
64
|
+
...endpointResponse,
|
|
65
|
+
data: parsedData.success ? parsedData.data : void 0
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//// write
|
|
69
|
+
async rehashAll(timestamp, signature) {
|
|
70
|
+
return this.post(
|
|
71
|
+
ruleApiRoutes.accessRuleApiPaths.REHASH_ALL,
|
|
72
|
+
{},
|
|
73
|
+
this.getAuthHeaders(timestamp, signature)
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
insertMany(ruleGroups, timestamp, signature) {
|
|
77
|
+
return this.post(
|
|
78
|
+
ruleApiRoutes.accessRuleApiPaths.INSERT_MANY,
|
|
79
|
+
ruleGroups,
|
|
80
|
+
this.getAuthHeaders(timestamp, signature)
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
getAuthHeaders(timestamp, signature) {
|
|
84
|
+
return {
|
|
85
|
+
headers: {
|
|
86
|
+
"Prosopo-Site-Key": this.account,
|
|
87
|
+
timestamp,
|
|
88
|
+
signature
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.AccessRulesApiClient = AccessRulesApiClient;
|