@prosopo/user-access-policy 3.5.32 → 3.7.11
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/.turbo/turbo-build$colon$cjs.log +23 -21
- package/.turbo/turbo-build$colon$tsc.log +41 -0
- package/.turbo/turbo-build.log +28 -22
- package/CHANGELOG.md +393 -0
- package/dist/.export.d.ts +6 -0
- package/dist/.export.d.ts.map +1 -0
- package/dist/.export.js.map +1 -0
- package/dist/api/.export.d.ts +7 -0
- package/dist/api/.export.d.ts.map +1 -0
- package/dist/api/.export.js.map +1 -0
- package/dist/api/accessRulesApiClient.d.ts +2 -0
- package/dist/api/accessRulesApiClient.d.ts.map +1 -0
- package/dist/api/accessRulesApiClient.js +2 -0
- package/dist/api/accessRulesApiClient.js.map +1 -0
- package/dist/api/delete/.export.d.ts +2 -0
- package/dist/api/delete/.export.d.ts.map +1 -0
- package/dist/api/delete/.export.js.map +1 -0
- package/dist/api/delete/deleteAllRules.d.ts +11 -0
- package/dist/api/delete/deleteAllRules.d.ts.map +1 -0
- package/dist/api/delete/deleteAllRules.js +3 -2
- package/dist/api/delete/deleteAllRules.js.map +1 -0
- package/dist/api/delete/deleteRuleGroups.d.ts +19 -0
- package/dist/api/delete/deleteRuleGroups.d.ts.map +1 -0
- package/dist/api/delete/deleteRuleGroups.js +3 -2
- package/dist/api/delete/deleteRuleGroups.js.map +1 -0
- package/dist/api/delete/deleteRules.d.ts +15 -0
- package/dist/api/delete/deleteRules.d.ts.map +1 -0
- package/dist/api/delete/deleteRules.js +3 -2
- package/dist/api/delete/deleteRules.js.map +1 -0
- package/dist/api/read/.export.d.ts +4 -0
- package/dist/api/read/.export.d.ts.map +1 -0
- package/dist/api/read/.export.js.map +1 -0
- package/dist/api/read/fetchRules.d.ts +53 -0
- package/dist/api/read/fetchRules.d.ts.map +1 -0
- package/dist/api/read/fetchRules.js +4 -3
- package/dist/api/read/fetchRules.js.map +1 -0
- package/dist/api/read/findRuleIds.d.ts +28 -0
- package/dist/api/read/findRuleIds.d.ts.map +1 -0
- package/dist/api/read/findRuleIds.js +3 -2
- package/dist/api/read/findRuleIds.js.map +1 -0
- package/dist/api/read/getMissingIds.d.ts +28 -0
- package/dist/api/read/getMissingIds.d.ts.map +1 -0
- package/dist/api/read/getMissingIds.js +4 -3
- package/dist/api/read/getMissingIds.js.map +1 -0
- package/dist/api/ruleApiRoutes.d.ts +43 -0
- package/dist/api/ruleApiRoutes.d.ts.map +1 -0
- package/dist/api/ruleApiRoutes.js.map +1 -0
- package/dist/api/rulesApiClient.d.ts +20 -0
- package/dist/api/rulesApiClient.d.ts.map +1 -0
- package/dist/api/rulesApiClient.js +18 -19
- package/dist/api/rulesApiClient.js.map +1 -0
- package/dist/api/write/.export.d.ts +2 -0
- package/dist/api/write/.export.d.ts.map +1 -0
- package/dist/api/write/.export.js.map +1 -0
- package/dist/api/write/insertRules.d.ts +29 -0
- package/dist/api/write/insertRules.d.ts.map +1 -0
- package/dist/api/write/insertRules.js +12 -9
- package/dist/api/write/insertRules.js.map +1 -0
- package/dist/api/write/rehashRules.d.ts +11 -0
- package/dist/api/write/rehashRules.d.ts.map +1 -0
- package/dist/api/write/rehashRules.js +7 -6
- package/dist/api/write/rehashRules.js.map +1 -0
- package/dist/cjs/api/delete/deleteAllRules.cjs +3 -2
- package/dist/cjs/api/delete/deleteRuleGroups.cjs +3 -2
- package/dist/cjs/api/delete/deleteRules.cjs +3 -2
- package/dist/cjs/api/read/fetchRules.cjs +4 -3
- package/dist/cjs/api/read/findRuleIds.cjs +3 -2
- package/dist/cjs/api/read/getMissingIds.cjs +4 -3
- package/dist/cjs/api/rulesApiClient.cjs +18 -19
- package/dist/cjs/api/write/insertRules.cjs +13 -10
- package/dist/cjs/api/write/rehashRules.cjs +7 -6
- package/dist/cjs/mongoose/mongooseRuleSchema.cjs +4 -1
- package/dist/cjs/redis/reader/redisRulesQuery.cjs +18 -1
- package/dist/cjs/redis/reader/redisRulesReader.cjs +13 -4
- package/dist/cjs/redis/redisRuleIndex.cjs +5 -1
- package/dist/cjs/redis/redisRulesWriter.cjs +6 -0
- package/dist/cjs/ruleInput/policyInput.cjs +8 -0
- package/dist/cjs/ruleInput/userScopeInput.cjs +4 -1
- package/dist/cjs/ruleRecord.cjs +4 -1
- package/dist/mongoose/.export.d.ts +2 -0
- package/dist/mongoose/.export.d.ts.map +1 -0
- package/dist/mongoose/.export.js.map +1 -0
- package/dist/mongoose/mongooseRuleSchema.d.ts +4 -0
- package/dist/mongoose/mongooseRuleSchema.d.ts.map +1 -0
- package/dist/mongoose/mongooseRuleSchema.js +4 -1
- package/dist/mongoose/mongooseRuleSchema.js.map +1 -0
- package/dist/redis/.export.d.ts +3 -0
- package/dist/redis/.export.d.ts.map +1 -0
- package/dist/redis/.export.js.map +1 -0
- package/dist/redis/reader/redisAggregate.d.ts +4 -0
- package/dist/redis/reader/redisAggregate.d.ts.map +1 -0
- package/dist/redis/reader/redisAggregate.js.map +1 -0
- package/dist/redis/reader/redisRulesQuery.d.ts +4 -0
- package/dist/redis/reader/redisRulesQuery.d.ts.map +1 -0
- package/dist/redis/reader/redisRulesQuery.js +18 -1
- package/dist/redis/reader/redisRulesQuery.js.map +1 -0
- package/dist/redis/reader/redisRulesReader.d.ts +26 -0
- package/dist/redis/reader/redisRulesReader.d.ts.map +1 -0
- package/dist/redis/reader/redisRulesReader.js +14 -5
- package/dist/redis/reader/redisRulesReader.js.map +1 -0
- package/dist/redis/redisClient.d.ts +11 -0
- package/dist/redis/redisClient.d.ts.map +1 -0
- package/dist/redis/redisClient.js.map +1 -0
- package/dist/redis/redisRuleIndex.d.ts +13 -0
- package/dist/redis/redisRuleIndex.d.ts.map +1 -0
- package/dist/redis/redisRuleIndex.js +5 -1
- package/dist/redis/redisRuleIndex.js.map +1 -0
- package/dist/redis/redisRulesStorage.d.ts +5 -0
- package/dist/redis/redisRulesStorage.d.ts.map +1 -0
- package/dist/redis/redisRulesStorage.js.map +1 -0
- package/dist/redis/redisRulesWriter.d.ts +22 -0
- package/dist/redis/redisRulesWriter.d.ts.map +1 -0
- package/dist/redis/redisRulesWriter.js +6 -0
- package/dist/redis/redisRulesWriter.js.map +1 -0
- package/dist/rule.d.ts +37 -0
- package/dist/rule.d.ts.map +1 -0
- package/dist/rule.js.map +1 -0
- package/dist/ruleInput/.export.d.ts +4 -0
- package/dist/ruleInput/.export.d.ts.map +1 -0
- package/dist/ruleInput/.export.js.map +1 -0
- package/dist/ruleInput/policyInput.d.ts +39 -0
- package/dist/ruleInput/policyInput.d.ts.map +1 -0
- package/dist/ruleInput/policyInput.js +9 -1
- package/dist/ruleInput/policyInput.js.map +1 -0
- package/dist/ruleInput/ruleInput.d.ts +163 -0
- package/dist/ruleInput/ruleInput.d.ts.map +1 -0
- package/dist/ruleInput/ruleInput.js.map +1 -0
- package/dist/ruleInput/userScopeInput.d.ts +117 -0
- package/dist/ruleInput/userScopeInput.d.ts.map +1 -0
- package/dist/ruleInput/userScopeInput.js +4 -1
- package/dist/ruleInput/userScopeInput.js.map +1 -0
- package/dist/ruleRecord.d.ts +18 -0
- package/dist/ruleRecord.d.ts.map +1 -0
- package/dist/ruleRecord.js +4 -1
- package/dist/ruleRecord.js.map +1 -0
- package/dist/rulesStorage.d.ts +30 -0
- package/dist/rulesStorage.d.ts.map +1 -0
- package/dist/rulesStorage.js.map +1 -0
- package/dist/tests/insertRulesEndpoint.unit.test.d.ts +2 -0
- package/dist/tests/insertRulesEndpoint.unit.test.d.ts.map +1 -0
- package/dist/tests/insertRulesEndpoint.unit.test.js +57 -0
- package/dist/tests/insertRulesEndpoint.unit.test.js.map +1 -0
- package/dist/tests/policyInput.unit.test.d.ts +2 -0
- package/dist/tests/policyInput.unit.test.d.ts.map +1 -0
- package/dist/tests/policyInput.unit.test.js +116 -0
- package/dist/tests/policyInput.unit.test.js.map +1 -0
- package/dist/tests/redis/reader/redisRulesQuery.unit.test.d.ts +2 -0
- package/dist/tests/redis/reader/redisRulesQuery.unit.test.d.ts.map +1 -0
- package/dist/tests/redis/reader/redisRulesQuery.unit.test.js +199 -0
- package/dist/tests/redis/reader/redisRulesQuery.unit.test.js.map +1 -0
- package/dist/tests/redis/redisRulesStorage.integration.test.d.ts +2 -0
- package/dist/tests/redis/redisRulesStorage.integration.test.d.ts.map +1 -0
- package/dist/tests/redis/redisRulesStorage.integration.test.js +831 -0
- package/dist/tests/redis/redisRulesStorage.integration.test.js.map +1 -0
- package/dist/tests/testLogger.d.ts +4 -0
- package/dist/tests/testLogger.d.ts.map +1 -0
- package/dist/tests/testLogger.js +22 -0
- package/dist/tests/testLogger.js.map +1 -0
- package/dist/tests/transformRule.unit.test.d.ts +2 -0
- package/dist/tests/transformRule.unit.test.d.ts.map +1 -0
- package/dist/tests/transformRule.unit.test.js +191 -0
- package/dist/tests/transformRule.unit.test.js.map +1 -0
- package/dist/transformRule.d.ts +7 -0
- package/dist/transformRule.d.ts.map +1 -0
- package/dist/transformRule.js.map +1 -0
- package/entries.ts +1 -1
- package/package.json +18 -12
- package/src/.export.ts +44 -0
- package/src/api/.export.ts +25 -0
- package/src/api/accessRulesApiClient.ts +13 -0
- package/src/api/delete/.export.ts +18 -0
- package/src/api/delete/deleteAllRules.ts +47 -0
- package/src/api/delete/deleteRuleGroups.ts +96 -0
- package/src/api/delete/deleteRules.ts +81 -0
- package/src/api/read/.export.ts +25 -0
- package/src/api/read/fetchRules.ts +88 -0
- package/src/api/read/findRuleIds.ts +95 -0
- package/src/api/read/getMissingIds.ts +81 -0
- package/src/api/ruleApiRoutes.ts +146 -0
- package/src/api/rulesApiClient.ts +154 -0
- package/src/api/write/.export.ts +15 -0
- package/src/api/write/insertRules.ts +183 -0
- package/src/api/write/rehashRules.ts +85 -0
- package/src/mongoose/.export.ts +15 -0
- package/src/mongoose/mongooseRuleSchema.ts +65 -0
- package/src/redis/.export.ts +17 -0
- package/src/redis/reader/redisAggregate.ts +103 -0
- package/src/redis/reader/redisRulesQuery.ts +217 -0
- package/src/redis/reader/redisRulesReader.ts +318 -0
- package/src/redis/redisClient.ts +120 -0
- package/src/redis/redisRuleIndex.ts +85 -0
- package/src/redis/redisRulesStorage.ts +68 -0
- package/src/redis/redisRulesWriter.ts +158 -0
- package/src/rule.ts +59 -0
- package/src/ruleInput/.export.ts +19 -0
- package/src/ruleInput/policyInput.ts +51 -0
- package/src/ruleInput/ruleInput.ts +103 -0
- package/src/ruleInput/userScopeInput.ts +108 -0
- package/src/ruleRecord.ts +69 -0
- package/src/rulesStorage.ts +72 -0
- package/src/tests/insertRulesEndpoint.unit.test.ts +89 -0
- package/src/tests/policyInput.unit.test.ts +150 -0
- package/src/tests/redis/reader/redisRulesQuery.unit.test.ts +284 -0
- package/src/tests/redis/redisRulesStorage.integration.test.ts +1156 -0
- package/src/tests/testLogger.ts +38 -0
- package/src/tests/transformRule.unit.test.ts +255 -0
- package/src/transformRule.ts +128 -0
- package/tsconfig.cjs.json +41 -0
- package/tsconfig.json +47 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/tsconfig.types.json +9 -0
- package/vite.cjs.config.ts +1 -1
- package/vite.esm.config.ts +1 -1
- package/vite.test.config.ts +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ApiEndpointResponseStatus } from "@prosopo/api-route";
|
|
2
|
-
import { LogLevel } from "@prosopo/
|
|
2
|
+
import { LogLevel } from "@prosopo/logger";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { policyScopeInput, accessPolicyInput } from "../../ruleInput/policyInput.js";
|
|
4
|
+
import { policyScopeInput, accessPolicyInput, sanitizeAccessPolicy } from "../../ruleInput/policyInput.js";
|
|
5
5
|
import { userScopeInput } from "../../ruleInput/userScopeInput.js";
|
|
6
6
|
class InsertRulesEndpoint {
|
|
7
7
|
constructor(accessRulesWriter, logger) {
|
|
@@ -19,7 +19,8 @@ class InsertRulesEndpoint {
|
|
|
19
19
|
})
|
|
20
20
|
);
|
|
21
21
|
}
|
|
22
|
-
async processRequest(args) {
|
|
22
|
+
async processRequest(args, logger) {
|
|
23
|
+
const log = logger ?? this.logger;
|
|
23
24
|
const timeoutPromise = new Promise((resolve) => {
|
|
24
25
|
setTimeout(() => {
|
|
25
26
|
resolve({
|
|
@@ -32,7 +33,7 @@ class InsertRulesEndpoint {
|
|
|
32
33
|
0
|
|
33
34
|
);
|
|
34
35
|
const createRulesPromise = this.createRuleGroups(args).then((insertedIds) => {
|
|
35
|
-
|
|
36
|
+
log.info(() => ({
|
|
36
37
|
msg: "Endpoint inserted access rules",
|
|
37
38
|
data: {
|
|
38
39
|
userScopesCount,
|
|
@@ -40,7 +41,7 @@ class InsertRulesEndpoint {
|
|
|
40
41
|
uniqueIdsCount: new Set(insertedIds).size
|
|
41
42
|
}
|
|
42
43
|
}));
|
|
43
|
-
|
|
44
|
+
log.debug(() => ({
|
|
44
45
|
msg: "Inserted access rules details",
|
|
45
46
|
data: {
|
|
46
47
|
insertedIds,
|
|
@@ -51,8 +52,8 @@ class InsertRulesEndpoint {
|
|
|
51
52
|
status: ApiEndpointResponseStatus.SUCCESS
|
|
52
53
|
};
|
|
53
54
|
}).catch((error) => {
|
|
54
|
-
if (LogLevel.enum.debug ===
|
|
55
|
-
|
|
55
|
+
if (LogLevel.enum.debug === log.getLogLevel()) {
|
|
56
|
+
log.error(() => ({
|
|
56
57
|
err: error,
|
|
57
58
|
data: { args },
|
|
58
59
|
msg: "Failed to insert access rules"
|
|
@@ -72,9 +73,10 @@ class InsertRulesEndpoint {
|
|
|
72
73
|
async createRulesGroup(group) {
|
|
73
74
|
const ruleEntries = [];
|
|
74
75
|
const policyScopes = group.policyScopes || [];
|
|
76
|
+
const sanitizedPolicy = sanitizeAccessPolicy(group.accessPolicy);
|
|
75
77
|
for (const userScope of group.userScopes) {
|
|
76
78
|
const ruleBase = {
|
|
77
|
-
...
|
|
79
|
+
...sanitizedPolicy,
|
|
78
80
|
...userScope,
|
|
79
81
|
...group.groupId ? { groupId: group.groupId } : {}
|
|
80
82
|
};
|
|
@@ -84,7 +86,8 @@ class InsertRulesEndpoint {
|
|
|
84
86
|
rule: {
|
|
85
87
|
...ruleBase,
|
|
86
88
|
...policyScope
|
|
87
|
-
}
|
|
89
|
+
},
|
|
90
|
+
expiresUnixTimestamp: group.expiresUnixTimestamp
|
|
88
91
|
});
|
|
89
92
|
}
|
|
90
93
|
} else {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertRules.js","sourceRoot":"","sources":["../../../src/api/write/insertRules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ApiEndpoint, type ApiEndpointResponse } from "@prosopo/api-route";
|
|
2
|
+
import type { Logger } from "@prosopo/logger";
|
|
3
|
+
import type { AccessRulesStorage } from "#policy/rulesStorage.js";
|
|
4
|
+
export declare class RehashRulesEndpoint implements ApiEndpoint<undefined> {
|
|
5
|
+
private readonly accessRulesStorage;
|
|
6
|
+
private readonly logger;
|
|
7
|
+
constructor(accessRulesStorage: AccessRulesStorage, logger: Logger);
|
|
8
|
+
getRequestArgsSchema(): undefined;
|
|
9
|
+
processRequest(logger?: Logger): Promise<ApiEndpointResponse>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=rehashRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehashRules.d.ts","sourceRoot":"","sources":["../../../src/api/write/rehashRules.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,mBAAmB,EAExB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,qBAAa,mBAAoB,YAAW,WAAW,CAAC,SAAS,CAAC;IAEhE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM;IAGzB,oBAAoB,IAAI,SAAS;IAElC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAsDnE"}
|
|
@@ -6,9 +6,10 @@ class RehashRulesEndpoint {
|
|
|
6
6
|
}
|
|
7
7
|
getRequestArgsSchema() {
|
|
8
8
|
}
|
|
9
|
-
async processRequest() {
|
|
9
|
+
async processRequest(logger) {
|
|
10
|
+
const log = logger ?? this.logger;
|
|
10
11
|
await this.accessRulesStorage.fetchAllRuleIds(async (ruleIds) => {
|
|
11
|
-
|
|
12
|
+
log.info(() => ({
|
|
12
13
|
msg: "Fetched rule ids batch",
|
|
13
14
|
data: {
|
|
14
15
|
count: ruleIds.length,
|
|
@@ -16,14 +17,14 @@ class RehashRulesEndpoint {
|
|
|
16
17
|
}
|
|
17
18
|
}));
|
|
18
19
|
const ruleEntries = await this.accessRulesStorage.fetchRules(ruleIds);
|
|
19
|
-
|
|
20
|
+
log.info(() => ({
|
|
20
21
|
msg: "Fetched rules",
|
|
21
22
|
data: {
|
|
22
23
|
count: ruleEntries.length
|
|
23
24
|
}
|
|
24
25
|
}));
|
|
25
26
|
if (ruleEntries.length !== ruleIds.length) {
|
|
26
|
-
|
|
27
|
+
log.warn(() => ({
|
|
27
28
|
msg: "Fetched rules count is not equal to the requested count",
|
|
28
29
|
data: {
|
|
29
30
|
fetchedCount: ruleEntries.length,
|
|
@@ -32,14 +33,14 @@ class RehashRulesEndpoint {
|
|
|
32
33
|
}));
|
|
33
34
|
}
|
|
34
35
|
await this.accessRulesStorage.deleteRules(ruleIds);
|
|
35
|
-
|
|
36
|
+
log.info(() => ({
|
|
36
37
|
msg: "Deleted rules",
|
|
37
38
|
data: {
|
|
38
39
|
count: ruleIds.length
|
|
39
40
|
}
|
|
40
41
|
}));
|
|
41
42
|
await this.accessRulesStorage.insertRules(ruleEntries);
|
|
42
|
-
|
|
43
|
+
log.info(() => ({
|
|
43
44
|
msg: "Inserted rules",
|
|
44
45
|
data: {
|
|
45
46
|
count: ruleEntries.length
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehashRules.js","sourceRoot":"","sources":["../../../src/api/write/rehashRules.ts"],"names":[],"mappings":"AAcA,OAAO,EAGN,yBAAyB,GACzB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,OAAO,mBAAmB;IAC/B,YACkB,kBAAsC,EACtC,MAAc;QADd,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,WAAM,GAAN,MAAM,CAAQ;IAC7B,CAAC;IAEG,oBAAoB,KAAe,CAAC;IAE3C,KAAK,CAAC,cAAc,CAAC,MAAe;QACnC,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAClC,MAAM,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,KAAK,EAAE,OAAiB,EAAE,EAAE;YACzE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACf,GAAG,EAAE,wBAAwB;gBAC7B,IAAI,EAAE;oBACL,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,OAAO;iBACP;aACD,CAAC,CAAC,CAAC;YAEJ,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAEtE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACf,GAAG,EAAE,eAAe;gBACpB,IAAI,EAAE;oBACL,KAAK,EAAE,WAAW,CAAC,MAAM;iBACzB;aACD,CAAC,CAAC,CAAC;YAEJ,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC3C,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBACf,GAAG,EAAE,yDAAyD;oBAC9D,IAAI,EAAE;wBACL,YAAY,EAAE,WAAW,CAAC,MAAM;wBAChC,cAAc,EAAE,OAAO,CAAC,MAAM;qBAC9B;iBACD,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAEnD,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACf,GAAG,EAAE,eAAe;gBACpB,IAAI,EAAE;oBACL,KAAK,EAAE,OAAO,CAAC,MAAM;iBACrB;aACD,CAAC,CAAC,CAAC;YAEJ,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAEvD,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACf,GAAG,EAAE,gBAAgB;gBACrB,IAAI,EAAE;oBACL,KAAK,EAAE,WAAW,CAAC,MAAM;iBACzB;aACD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO;YACN,MAAM,EAAE,yBAAyB,CAAC,OAAO;YACzC,IAAI,EAAE,EAAE;SACR,CAAC;IACH,CAAC;CACD"}
|
|
@@ -8,9 +8,10 @@ class DeleteAllRulesEndpoint {
|
|
|
8
8
|
}
|
|
9
9
|
getRequestArgsSchema() {
|
|
10
10
|
}
|
|
11
|
-
async processRequest() {
|
|
11
|
+
async processRequest(logger) {
|
|
12
|
+
const log = logger ?? this.logger;
|
|
12
13
|
const deletedCount = await this.accessRulesStorage.deleteAllRules();
|
|
13
|
-
|
|
14
|
+
log.info(() => ({
|
|
14
15
|
msg: "Endpoint deleted all access rules",
|
|
15
16
|
data: { deletedCount }
|
|
16
17
|
}));
|
|
@@ -16,7 +16,8 @@ class DeleteRuleGroupsEndpoint {
|
|
|
16
16
|
})
|
|
17
17
|
);
|
|
18
18
|
}
|
|
19
|
-
async processRequest(args) {
|
|
19
|
+
async processRequest(args, logger) {
|
|
20
|
+
const log = logger ?? this.logger;
|
|
20
21
|
const foundRuleIdPromises = args.flatMap(
|
|
21
22
|
(ruleToDelete) => ruleToDelete.clientIds.map(
|
|
22
23
|
(clientId) => this.accessRulesStorage.findRuleIds({
|
|
@@ -34,7 +35,7 @@ class DeleteRuleGroupsEndpoint {
|
|
|
34
35
|
if (uniqueRuleIds.length > 0) {
|
|
35
36
|
await this.accessRulesStorage.deleteRules(uniqueRuleIds);
|
|
36
37
|
}
|
|
37
|
-
|
|
38
|
+
log.info(() => ({
|
|
38
39
|
msg: "Endpoint deleted rule groups",
|
|
39
40
|
data: {
|
|
40
41
|
args,
|
|
@@ -12,7 +12,8 @@ class DeleteRulesEndpoint {
|
|
|
12
12
|
getRequestArgsSchema() {
|
|
13
13
|
return zod.z.array(ruleInput.accessRulesFilterInput);
|
|
14
14
|
}
|
|
15
|
-
async processRequest(args) {
|
|
15
|
+
async processRequest(args, logger) {
|
|
16
|
+
const log = logger ?? this.logger;
|
|
16
17
|
let deletedCount = 0;
|
|
17
18
|
for (const rulesFilterInput of args) {
|
|
18
19
|
const ruleFilters = ruleInput.getAccessRuleFiltersFromInput(rulesFilterInput);
|
|
@@ -22,7 +23,7 @@ class DeleteRulesEndpoint {
|
|
|
22
23
|
if (uniqueRuleIds.length > 0) {
|
|
23
24
|
await this.accessRulesStorage.deleteRules(uniqueRuleIds);
|
|
24
25
|
deletedCount += uniqueRuleIds.length;
|
|
25
|
-
|
|
26
|
+
log.info(() => ({
|
|
26
27
|
msg: "Endpoint deleted rules",
|
|
27
28
|
data: {
|
|
28
29
|
rulesFilterInput,
|
|
@@ -16,16 +16,17 @@ class FetchRulesEndpoint {
|
|
|
16
16
|
ids: zod.z.string().array()
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
-
async processRequest(args) {
|
|
19
|
+
async processRequest(args, logger) {
|
|
20
|
+
const log = logger ?? this.logger;
|
|
20
21
|
const ruleEntries = await this.accessRulesStorage.fetchRules(args.ids);
|
|
21
|
-
|
|
22
|
+
log.info(() => ({
|
|
22
23
|
msg: "Endpoint fetched rules",
|
|
23
24
|
data: {
|
|
24
25
|
requestedCount: args.ids.length,
|
|
25
26
|
foundCount: ruleEntries.length
|
|
26
27
|
}
|
|
27
28
|
}));
|
|
28
|
-
|
|
29
|
+
log.debug(() => ({
|
|
29
30
|
msg: "Fetched rule details",
|
|
30
31
|
data: {
|
|
31
32
|
ruleEntries
|
|
@@ -15,7 +15,8 @@ class FindRuleIdsEndpoint {
|
|
|
15
15
|
getRequestArgsSchema() {
|
|
16
16
|
return zod.z.array(ruleInput.accessRulesFilterInput);
|
|
17
17
|
}
|
|
18
|
-
async processRequest(args) {
|
|
18
|
+
async processRequest(args, logger) {
|
|
19
|
+
const log = logger ?? this.logger;
|
|
19
20
|
const ruleIdBatches = await common.executeBatchesSequentially(
|
|
20
21
|
args,
|
|
21
22
|
async (rulesFilterInput) => {
|
|
@@ -29,7 +30,7 @@ class FindRuleIdsEndpoint {
|
|
|
29
30
|
);
|
|
30
31
|
const ruleIds = ruleIdBatches.flat();
|
|
31
32
|
const uniqueRuleIds = [...new Set(ruleIds)];
|
|
32
|
-
|
|
33
|
+
log.info(() => ({
|
|
33
34
|
msg: "Endpoint found rules",
|
|
34
35
|
data: {
|
|
35
36
|
totalFoundCount: ruleIds.length,
|
|
@@ -13,16 +13,17 @@ class GetMissingIdsEndpoint {
|
|
|
13
13
|
getRequestArgsSchema() {
|
|
14
14
|
return zod.z.string().array();
|
|
15
15
|
}
|
|
16
|
-
async processRequest(args) {
|
|
16
|
+
async processRequest(args, logger) {
|
|
17
|
+
const log = logger ?? this.logger;
|
|
17
18
|
const missingIds = await this.accessRulesStorage.getMissingRuleIds(args);
|
|
18
|
-
|
|
19
|
+
log.info(() => ({
|
|
19
20
|
msg: "Endpoint checked missing ids",
|
|
20
21
|
data: {
|
|
21
22
|
idsToCheck: args.length,
|
|
22
23
|
missingIds: missingIds.length
|
|
23
24
|
}
|
|
24
25
|
}));
|
|
25
|
-
|
|
26
|
+
log.debug(() => ({
|
|
26
27
|
msg: "Missing id details",
|
|
27
28
|
data: {
|
|
28
29
|
idsToCheck: args,
|
|
@@ -7,33 +7,33 @@ const getMissingIds = require("./read/getMissingIds.cjs");
|
|
|
7
7
|
const ruleApiRoutes = require("./ruleApiRoutes.cjs");
|
|
8
8
|
class AccessRulesApiClient extends api.ApiClient {
|
|
9
9
|
//// delete
|
|
10
|
-
deleteMany(filters,
|
|
10
|
+
deleteMany(filters, jwt) {
|
|
11
11
|
return this.post(
|
|
12
12
|
ruleApiRoutes.accessRuleApiPaths.DELETE_MANY,
|
|
13
13
|
filters,
|
|
14
|
-
this.getAuthHeaders(
|
|
14
|
+
this.getAuthHeaders(jwt)
|
|
15
15
|
);
|
|
16
16
|
}
|
|
17
|
-
deleteGroups(siteGroups,
|
|
17
|
+
deleteGroups(siteGroups, jwt) {
|
|
18
18
|
return this.post(
|
|
19
19
|
ruleApiRoutes.accessRuleApiPaths.DELETE_GROUPS,
|
|
20
20
|
siteGroups,
|
|
21
|
-
this.getAuthHeaders(
|
|
21
|
+
this.getAuthHeaders(jwt)
|
|
22
22
|
);
|
|
23
23
|
}
|
|
24
|
-
deleteAll(
|
|
24
|
+
deleteAll(jwt) {
|
|
25
25
|
return this.post(
|
|
26
26
|
ruleApiRoutes.accessRuleApiPaths.DELETE_ALL,
|
|
27
27
|
{},
|
|
28
|
-
this.getAuthHeaders(
|
|
28
|
+
this.getAuthHeaders(jwt)
|
|
29
29
|
);
|
|
30
30
|
}
|
|
31
31
|
//// read
|
|
32
|
-
async getMissingIds(idsToCheck,
|
|
32
|
+
async getMissingIds(idsToCheck, jwt) {
|
|
33
33
|
const endpointResponse = await this.post(
|
|
34
34
|
ruleApiRoutes.accessRuleApiPaths.GET_MISSING_IDS,
|
|
35
35
|
idsToCheck,
|
|
36
|
-
this.getAuthHeaders(
|
|
36
|
+
this.getAuthHeaders(jwt)
|
|
37
37
|
);
|
|
38
38
|
const parsedData = getMissingIds.missingIdsResponse.safeParse(endpointResponse.data);
|
|
39
39
|
return {
|
|
@@ -41,11 +41,11 @@ class AccessRulesApiClient extends api.ApiClient {
|
|
|
41
41
|
data: parsedData.success ? parsedData.data : void 0
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
-
async fetchMany(fetchOptions,
|
|
44
|
+
async fetchMany(fetchOptions, jwt) {
|
|
45
45
|
const endpointResponse = await this.post(
|
|
46
46
|
ruleApiRoutes.accessRuleApiPaths.FETCH_MANY,
|
|
47
47
|
fetchOptions,
|
|
48
|
-
this.getAuthHeaders(
|
|
48
|
+
this.getAuthHeaders(jwt)
|
|
49
49
|
);
|
|
50
50
|
const parsedData = fetchRules.fetchRulesResponse.safeParse(endpointResponse.data);
|
|
51
51
|
return {
|
|
@@ -53,11 +53,11 @@ class AccessRulesApiClient extends api.ApiClient {
|
|
|
53
53
|
data: parsedData.success ? parsedData.data : void 0
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
|
-
async findIds(filters,
|
|
56
|
+
async findIds(filters, jwt) {
|
|
57
57
|
const endpointResponse = await this.post(
|
|
58
58
|
ruleApiRoutes.accessRuleApiPaths.FIND_IDS,
|
|
59
59
|
filters,
|
|
60
|
-
this.getAuthHeaders(
|
|
60
|
+
this.getAuthHeaders(jwt)
|
|
61
61
|
);
|
|
62
62
|
const parsedData = findRuleIds.ruleIdsResponse.safeParse(endpointResponse.data);
|
|
63
63
|
return {
|
|
@@ -66,26 +66,25 @@ class AccessRulesApiClient extends api.ApiClient {
|
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
//// write
|
|
69
|
-
async rehashAll(
|
|
69
|
+
async rehashAll(jwt) {
|
|
70
70
|
return this.post(
|
|
71
71
|
ruleApiRoutes.accessRuleApiPaths.REHASH_ALL,
|
|
72
72
|
{},
|
|
73
|
-
this.getAuthHeaders(
|
|
73
|
+
this.getAuthHeaders(jwt)
|
|
74
74
|
);
|
|
75
75
|
}
|
|
76
|
-
insertMany(ruleGroups,
|
|
76
|
+
insertMany(ruleGroups, jwt) {
|
|
77
77
|
return this.post(
|
|
78
78
|
ruleApiRoutes.accessRuleApiPaths.INSERT_MANY,
|
|
79
79
|
ruleGroups,
|
|
80
|
-
this.getAuthHeaders(
|
|
80
|
+
this.getAuthHeaders(jwt)
|
|
81
81
|
);
|
|
82
82
|
}
|
|
83
|
-
getAuthHeaders(
|
|
83
|
+
getAuthHeaders(jwt) {
|
|
84
84
|
return {
|
|
85
85
|
headers: {
|
|
86
86
|
"Prosopo-Site-Key": this.account,
|
|
87
|
-
|
|
88
|
-
signature
|
|
87
|
+
Authorization: `Bearer ${jwt}`
|
|
89
88
|
}
|
|
90
89
|
};
|
|
91
90
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const apiRoute = require("@prosopo/api-route");
|
|
4
|
-
const
|
|
4
|
+
const logger = require("@prosopo/logger");
|
|
5
5
|
const zod = require("zod");
|
|
6
6
|
const policyInput = require("../../ruleInput/policyInput.cjs");
|
|
7
7
|
const userScopeInput = require("../../ruleInput/userScopeInput.cjs");
|
|
8
8
|
class InsertRulesEndpoint {
|
|
9
|
-
constructor(accessRulesWriter,
|
|
9
|
+
constructor(accessRulesWriter, logger2) {
|
|
10
10
|
this.accessRulesWriter = accessRulesWriter;
|
|
11
|
-
this.logger =
|
|
11
|
+
this.logger = logger2;
|
|
12
12
|
}
|
|
13
13
|
getRequestArgsSchema() {
|
|
14
14
|
return zod.z.array(
|
|
@@ -21,7 +21,8 @@ class InsertRulesEndpoint {
|
|
|
21
21
|
})
|
|
22
22
|
);
|
|
23
23
|
}
|
|
24
|
-
async processRequest(args) {
|
|
24
|
+
async processRequest(args, logger$1) {
|
|
25
|
+
const log = logger$1 ?? this.logger;
|
|
25
26
|
const timeoutPromise = new Promise((resolve) => {
|
|
26
27
|
setTimeout(() => {
|
|
27
28
|
resolve({
|
|
@@ -34,7 +35,7 @@ class InsertRulesEndpoint {
|
|
|
34
35
|
0
|
|
35
36
|
);
|
|
36
37
|
const createRulesPromise = this.createRuleGroups(args).then((insertedIds) => {
|
|
37
|
-
|
|
38
|
+
log.info(() => ({
|
|
38
39
|
msg: "Endpoint inserted access rules",
|
|
39
40
|
data: {
|
|
40
41
|
userScopesCount,
|
|
@@ -42,7 +43,7 @@ class InsertRulesEndpoint {
|
|
|
42
43
|
uniqueIdsCount: new Set(insertedIds).size
|
|
43
44
|
}
|
|
44
45
|
}));
|
|
45
|
-
|
|
46
|
+
log.debug(() => ({
|
|
46
47
|
msg: "Inserted access rules details",
|
|
47
48
|
data: {
|
|
48
49
|
insertedIds,
|
|
@@ -53,8 +54,8 @@ class InsertRulesEndpoint {
|
|
|
53
54
|
status: apiRoute.ApiEndpointResponseStatus.SUCCESS
|
|
54
55
|
};
|
|
55
56
|
}).catch((error) => {
|
|
56
|
-
if (
|
|
57
|
-
|
|
57
|
+
if (logger.LogLevel.enum.debug === log.getLogLevel()) {
|
|
58
|
+
log.error(() => ({
|
|
58
59
|
err: error,
|
|
59
60
|
data: { args },
|
|
60
61
|
msg: "Failed to insert access rules"
|
|
@@ -74,9 +75,10 @@ class InsertRulesEndpoint {
|
|
|
74
75
|
async createRulesGroup(group) {
|
|
75
76
|
const ruleEntries = [];
|
|
76
77
|
const policyScopes = group.policyScopes || [];
|
|
78
|
+
const sanitizedPolicy = policyInput.sanitizeAccessPolicy(group.accessPolicy);
|
|
77
79
|
for (const userScope of group.userScopes) {
|
|
78
80
|
const ruleBase = {
|
|
79
|
-
...
|
|
81
|
+
...sanitizedPolicy,
|
|
80
82
|
...userScope,
|
|
81
83
|
...group.groupId ? { groupId: group.groupId } : {}
|
|
82
84
|
};
|
|
@@ -86,7 +88,8 @@ class InsertRulesEndpoint {
|
|
|
86
88
|
rule: {
|
|
87
89
|
...ruleBase,
|
|
88
90
|
...policyScope
|
|
89
|
-
}
|
|
91
|
+
},
|
|
92
|
+
expiresUnixTimestamp: group.expiresUnixTimestamp
|
|
90
93
|
});
|
|
91
94
|
}
|
|
92
95
|
} else {
|
|
@@ -8,9 +8,10 @@ class RehashRulesEndpoint {
|
|
|
8
8
|
}
|
|
9
9
|
getRequestArgsSchema() {
|
|
10
10
|
}
|
|
11
|
-
async processRequest() {
|
|
11
|
+
async processRequest(logger) {
|
|
12
|
+
const log = logger ?? this.logger;
|
|
12
13
|
await this.accessRulesStorage.fetchAllRuleIds(async (ruleIds) => {
|
|
13
|
-
|
|
14
|
+
log.info(() => ({
|
|
14
15
|
msg: "Fetched rule ids batch",
|
|
15
16
|
data: {
|
|
16
17
|
count: ruleIds.length,
|
|
@@ -18,14 +19,14 @@ class RehashRulesEndpoint {
|
|
|
18
19
|
}
|
|
19
20
|
}));
|
|
20
21
|
const ruleEntries = await this.accessRulesStorage.fetchRules(ruleIds);
|
|
21
|
-
|
|
22
|
+
log.info(() => ({
|
|
22
23
|
msg: "Fetched rules",
|
|
23
24
|
data: {
|
|
24
25
|
count: ruleEntries.length
|
|
25
26
|
}
|
|
26
27
|
}));
|
|
27
28
|
if (ruleEntries.length !== ruleIds.length) {
|
|
28
|
-
|
|
29
|
+
log.warn(() => ({
|
|
29
30
|
msg: "Fetched rules count is not equal to the requested count",
|
|
30
31
|
data: {
|
|
31
32
|
fetchedCount: ruleEntries.length,
|
|
@@ -34,14 +35,14 @@ class RehashRulesEndpoint {
|
|
|
34
35
|
}));
|
|
35
36
|
}
|
|
36
37
|
await this.accessRulesStorage.deleteRules(ruleIds);
|
|
37
|
-
|
|
38
|
+
log.info(() => ({
|
|
38
39
|
msg: "Deleted rules",
|
|
39
40
|
data: {
|
|
40
41
|
count: ruleIds.length
|
|
41
42
|
}
|
|
42
43
|
}));
|
|
43
44
|
await this.accessRulesStorage.insertRules(ruleEntries);
|
|
44
|
-
|
|
45
|
+
log.info(() => ({
|
|
45
46
|
msg: "Inserted rules",
|
|
46
47
|
data: {
|
|
47
48
|
count: ruleEntries.length
|
|
@@ -4,7 +4,10 @@ const userAttributesSchema = {
|
|
|
4
4
|
userId: { type: String, required: false },
|
|
5
5
|
ja4Hash: { type: String, required: false },
|
|
6
6
|
userAgent: { type: String, required: false },
|
|
7
|
-
headersHash: { type: String, required: false }
|
|
7
|
+
headersHash: { type: String, required: false },
|
|
8
|
+
headHash: { type: String, required: false },
|
|
9
|
+
coords: { type: String, required: false },
|
|
10
|
+
countryCode: { type: String, required: false }
|
|
8
11
|
};
|
|
9
12
|
const userIpSchema = {
|
|
10
13
|
ip: { type: String, required: false },
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const userScopeInput = require("../../ruleInput/userScopeInput.cjs");
|
|
4
4
|
const rulesStorage = require("../../rulesStorage.cjs");
|
|
5
|
+
const escapeTagValue = (value) => {
|
|
6
|
+
return value.replace(/([,.<>{}\[\]"':;!@#$%^&*()\-+=~|/\\])/g, "\\$1");
|
|
7
|
+
};
|
|
5
8
|
const REDIS_QUERY_DIALECT = 2;
|
|
6
9
|
const userIpQueries = {
|
|
7
10
|
numericIp: (value, scope) => {
|
|
@@ -17,12 +20,18 @@ const userIpQueries = {
|
|
|
17
20
|
if (scope.numericIp !== void 0) {
|
|
18
21
|
return "";
|
|
19
22
|
}
|
|
23
|
+
if (value === void 0 && scope.numericIpMaskMax === void 0) {
|
|
24
|
+
return "";
|
|
25
|
+
}
|
|
20
26
|
return value !== void 0 ? `@numericIpMaskMin:[-inf ${value}]` : "ismissing(@numericIpMaskMin)";
|
|
21
27
|
},
|
|
22
28
|
numericIpMaskMax: (value, scope) => {
|
|
23
29
|
if (scope.numericIp !== void 0) {
|
|
24
30
|
return "";
|
|
25
31
|
}
|
|
32
|
+
if (value === void 0 && scope.numericIpMaskMin === void 0) {
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
26
35
|
return value !== void 0 ? `@numericIpMaskMax:[${value} +inf]` : "ismissing(@numericIpMaskMax)";
|
|
27
36
|
}
|
|
28
37
|
};
|
|
@@ -58,12 +67,20 @@ const getUserScopeQuery = (userScope, FilterScopeMatchType, matchingFieldsOnly)
|
|
|
58
67
|
)
|
|
59
68
|
).filter(Boolean).join(scopeJoinType);
|
|
60
69
|
};
|
|
70
|
+
const FIELDS_REQUIRING_ESCAPE = /* @__PURE__ */ new Set([
|
|
71
|
+
"coords"
|
|
72
|
+
]);
|
|
61
73
|
const getUserScopeFieldQuery = (fieldName, fieldValue, scopeMatch, fullScope) => {
|
|
62
74
|
if (fieldName in userIpQueries) {
|
|
63
75
|
const queryBuilder = userIpQueries[fieldName];
|
|
64
76
|
return queryBuilder(fieldValue, fullScope);
|
|
65
77
|
}
|
|
66
|
-
|
|
78
|
+
if (void 0 === fieldValue) {
|
|
79
|
+
return `ismissing(@${fieldName})`;
|
|
80
|
+
}
|
|
81
|
+
const stringValue = String(fieldValue);
|
|
82
|
+
const queryValue = FIELDS_REQUIRING_ESCAPE.has(fieldName) ? escapeTagValue(stringValue) : stringValue;
|
|
83
|
+
return `@${fieldName}:{${queryValue}}`;
|
|
67
84
|
};
|
|
68
85
|
const getPolicyScopeQuery = (policyScope, scopeMatch) => {
|
|
69
86
|
const clientId = policyScope?.clientId;
|
|
@@ -52,9 +52,8 @@ class RedisRulesReader {
|
|
|
52
52
|
if (skipEmptyUserScopes && query === "ismissing(@clientId)") {
|
|
53
53
|
return [];
|
|
54
54
|
}
|
|
55
|
-
let searchReply;
|
|
56
55
|
try {
|
|
57
|
-
searchReply = await this.client.ft.
|
|
56
|
+
const searchReply = await this.client.ft.searchNoContent(
|
|
58
57
|
redisRuleIndex.ACCESS_RULES_REDIS_INDEX_NAME,
|
|
59
58
|
query,
|
|
60
59
|
{
|
|
@@ -81,6 +80,18 @@ class RedisRulesReader {
|
|
|
81
80
|
}
|
|
82
81
|
}));
|
|
83
82
|
}
|
|
83
|
+
if (searchReply.documents.length === 0) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const { records } = await redisClient.fetchRedisHashRecords(
|
|
87
|
+
this.client,
|
|
88
|
+
searchReply.documents,
|
|
89
|
+
this.logger
|
|
90
|
+
);
|
|
91
|
+
const nonEmptyRecords = records.filter(
|
|
92
|
+
(record) => Object.keys(record).length > 0
|
|
93
|
+
);
|
|
94
|
+
return redisClient.parseRedisRecords(nonEmptyRecords, ruleInput.accessRuleInput, this.logger);
|
|
84
95
|
} catch (e) {
|
|
85
96
|
this.logger.error(() => ({
|
|
86
97
|
err: e,
|
|
@@ -99,8 +110,6 @@ class RedisRulesReader {
|
|
|
99
110
|
}));
|
|
100
111
|
return [];
|
|
101
112
|
}
|
|
102
|
-
const records = searchReply.documents.map(({ value }) => value);
|
|
103
|
-
return redisClient.parseRedisRecords(records, ruleInput.accessRuleInput, this.logger);
|
|
104
113
|
}
|
|
105
114
|
async findRuleIds(filter, matchingFieldsOnly = false) {
|
|
106
115
|
const query = redisRulesQuery.getRulesRedisQuery(filter, matchingFieldsOnly);
|
|
@@ -11,7 +11,11 @@ const userAttributesRedisSchema = {
|
|
|
11
11
|
userId: { type: search.SCHEMA_FIELD_TYPE.TAG, INDEXMISSING: true },
|
|
12
12
|
ja4Hash: { type: search.SCHEMA_FIELD_TYPE.TAG, INDEXMISSING: true },
|
|
13
13
|
headersHash: { type: search.SCHEMA_FIELD_TYPE.TAG, INDEXMISSING: true },
|
|
14
|
-
userAgentHash: { type: search.SCHEMA_FIELD_TYPE.TAG, INDEXMISSING: true }
|
|
14
|
+
userAgentHash: { type: search.SCHEMA_FIELD_TYPE.TAG, INDEXMISSING: true },
|
|
15
|
+
headHash: { type: search.SCHEMA_FIELD_TYPE.TAG, INDEXMISSING: true },
|
|
16
|
+
// Use pipe separator for coords since JSON strings contain commas
|
|
17
|
+
coords: { type: search.SCHEMA_FIELD_TYPE.TAG, INDEXMISSING: true, SEPARATOR: "|" },
|
|
18
|
+
countryCode: { type: search.SCHEMA_FIELD_TYPE.TAG, INDEXMISSING: true }
|
|
15
19
|
};
|
|
16
20
|
const userScopeRedisSchema = {
|
|
17
21
|
...userAttributesRedisSchema,
|
|
@@ -56,6 +56,12 @@ class RedisRulesWriter {
|
|
|
56
56
|
const ruleValue = getRedisRuleValue(rule);
|
|
57
57
|
queries.hSet(ruleKey, ruleValue);
|
|
58
58
|
if (expiresUnixTimestamp) {
|
|
59
|
+
const MILLISECOND_THRESHOLD = 1e10;
|
|
60
|
+
if (expiresUnixTimestamp > MILLISECOND_THRESHOLD) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Invalid expiry timestamp: ${expiresUnixTimestamp}. Timestamp must be in seconds, not milliseconds.`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
59
65
|
queries.expireAt(ruleKey, expiresUnixTimestamp);
|
|
60
66
|
}
|
|
61
67
|
return ruleKey;
|
|
@@ -18,8 +18,16 @@ const accessPolicyInput = zod.z.object({
|
|
|
18
18
|
// used to increase the user's score
|
|
19
19
|
frictionlessScore: zod.z.coerce.number().optional()
|
|
20
20
|
});
|
|
21
|
+
const sanitizeAccessPolicy = (policy) => {
|
|
22
|
+
if (policy.type === rule.AccessPolicyType.Block) {
|
|
23
|
+
const { captchaType, solvedImagesCount, ...blockPolicy } = policy;
|
|
24
|
+
return blockPolicy;
|
|
25
|
+
}
|
|
26
|
+
return policy;
|
|
27
|
+
};
|
|
21
28
|
const policyScopeInput = zod.z.object({
|
|
22
29
|
clientId: zod.z.coerce.string().optional()
|
|
23
30
|
});
|
|
24
31
|
exports.accessPolicyInput = accessPolicyInput;
|
|
25
32
|
exports.policyScopeInput = policyScopeInput;
|
|
33
|
+
exports.sanitizeAccessPolicy = sanitizeAccessPolicy;
|
|
@@ -9,7 +9,10 @@ const userAttributesSchema = zod.z.object({
|
|
|
9
9
|
userId: zod.z.coerce.string().optional(),
|
|
10
10
|
ja4Hash: zod.z.coerce.string().optional(),
|
|
11
11
|
headersHash: zod.z.coerce.string().optional(),
|
|
12
|
-
userAgentHash: zod.z.coerce.string().optional()
|
|
12
|
+
userAgentHash: zod.z.coerce.string().optional(),
|
|
13
|
+
headHash: zod.z.coerce.string().optional(),
|
|
14
|
+
coords: zod.z.coerce.string().optional(),
|
|
15
|
+
countryCode: zod.z.coerce.string().optional()
|
|
13
16
|
});
|
|
14
17
|
const userAttributesInput = zod.z.object({
|
|
15
18
|
...userAttributesSchema.shape,
|