@prosopo/user-access-policy 3.12.8 → 3.12.10

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.
Files changed (84) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +45 -41
  2. package/.turbo/turbo-build$colon$tsc.log +14 -14
  3. package/.turbo/turbo-build.log +46 -42
  4. package/CHANGELOG.md +24 -0
  5. package/dist/.export.js +7 -21
  6. package/dist/_virtual/_rolldown/runtime.js +3 -0
  7. package/dist/api/.export.js +2 -9
  8. package/dist/api/accessRulesApiClient.js +1 -1
  9. package/dist/api/delete/.export.js +2 -1
  10. package/dist/api/delete/deleteAllRules.js +22 -24
  11. package/dist/api/delete/deleteRuleGroups.js +39 -51
  12. package/dist/api/delete/deleteRules.js +37 -41
  13. package/dist/api/read/.export.js +2 -1
  14. package/dist/api/read/fetchRules.js +34 -42
  15. package/dist/api/read/findRuleIds.js +35 -48
  16. package/dist/api/read/getMissingIds.js +36 -40
  17. package/dist/api/ruleApiRoutes.js +62 -120
  18. package/dist/api/rulesApiClient.js +51 -87
  19. package/dist/api/write/.export.js +2 -1
  20. package/dist/api/write/insertRules.js +84 -102
  21. package/dist/api/write/rehashRules.js +48 -56
  22. package/dist/cjs/.export.cjs +21 -23
  23. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  24. package/dist/cjs/api/.export.cjs +6 -10
  25. package/dist/cjs/api/accessRulesApiClient.cjs +0 -0
  26. package/dist/cjs/api/delete/.export.cjs +0 -1
  27. package/dist/cjs/api/delete/deleteAllRules.cjs +22 -24
  28. package/dist/cjs/api/delete/deleteRuleGroups.cjs +39 -51
  29. package/dist/cjs/api/delete/deleteRules.cjs +41 -42
  30. package/dist/cjs/api/read/.export.cjs +0 -1
  31. package/dist/cjs/api/read/fetchRules.cjs +34 -41
  32. package/dist/cjs/api/read/findRuleIds.cjs +37 -48
  33. package/dist/cjs/api/read/getMissingIds.cjs +36 -39
  34. package/dist/cjs/api/ruleApiRoutes.cjs +69 -125
  35. package/dist/cjs/api/rulesApiClient.cjs +54 -90
  36. package/dist/cjs/api/write/.export.cjs +0 -1
  37. package/dist/cjs/api/write/insertRules.cjs +85 -103
  38. package/dist/cjs/api/write/rehashRules.cjs +48 -56
  39. package/dist/cjs/classifyOs.cjs +46 -26
  40. package/dist/cjs/mongoose/.export.cjs +2 -3
  41. package/dist/cjs/mongoose/mongooseRuleSchema.cjs +97 -36
  42. package/dist/cjs/redis/.export.cjs +4 -5
  43. package/dist/cjs/redis/reader/redisAggregate.cjs +59 -84
  44. package/dist/cjs/redis/reader/redisRulesQuery.cjs +74 -116
  45. package/dist/cjs/redis/reader/redisRulesReader.cjs +322 -503
  46. package/dist/cjs/redis/reader/redisRulesSplitQuery.cjs +94 -72
  47. package/dist/cjs/redis/redisClient.cjs +53 -58
  48. package/dist/cjs/redis/redisRuleIndex.cjs +93 -49
  49. package/dist/cjs/redis/redisRulesStorage.cjs +21 -30
  50. package/dist/cjs/redis/redisRulesWriter.cjs +86 -112
  51. package/dist/cjs/rule.cjs +8 -7
  52. package/dist/cjs/ruleInput/.export.cjs +7 -8
  53. package/dist/cjs/ruleInput/policyInput.cjs +35 -58
  54. package/dist/cjs/ruleInput/ruleInput.cjs +37 -42
  55. package/dist/cjs/ruleInput/userScopeInput.cjs +47 -55
  56. package/dist/cjs/ruleRecord.cjs +15 -22
  57. package/dist/cjs/rulesStorage.cjs +7 -6
  58. package/dist/cjs/transformRule.cjs +36 -70
  59. package/dist/classifyOs.js +48 -29
  60. package/dist/mongoose/.export.js +2 -3
  61. package/dist/mongoose/mongooseRuleSchema.js +99 -38
  62. package/dist/redis/.export.js +3 -5
  63. package/dist/redis/reader/redisAggregate.js +60 -86
  64. package/dist/redis/reader/redisRulesQuery.js +75 -118
  65. package/dist/redis/reader/redisRulesReader.js +312 -487
  66. package/dist/redis/reader/redisRulesSplitQuery.js +96 -75
  67. package/dist/redis/redisClient.js +54 -62
  68. package/dist/redis/redisRuleIndex.js +93 -58
  69. package/dist/redis/redisRulesStorage.js +21 -30
  70. package/dist/redis/redisRulesWriter.js +82 -113
  71. package/dist/rule.js +10 -10
  72. package/dist/ruleInput/.export.js +3 -7
  73. package/dist/ruleInput/policyInput.js +35 -61
  74. package/dist/ruleInput/ruleInput.js +36 -44
  75. package/dist/ruleInput/userScopeInput.js +44 -55
  76. package/dist/ruleRecord.js +17 -27
  77. package/dist/rulesStorage.js +9 -8
  78. package/dist/tests/redis/redisRulesStorage.integration.test.js +1 -3
  79. package/dist/tests/redis/redisRulesStorage.integration.test.js.map +1 -1
  80. package/dist/transformRule.js +34 -73
  81. package/entries.ts +25 -6
  82. package/package.json +13 -12
  83. package/src/tests/redis/redisRulesStorage.integration.test.ts +191 -195
  84. package/tsconfig.tsbuildinfo +1 -1
@@ -1,125 +1,82 @@
1
- import { GLOBAL_CLIENT_SCOPE_SENTINEL, AccessPolicyType } from "../../rule.js";
2
- import { userScopeSchema } from "../../ruleInput/userScopeInput.js";
1
+ import "../../_virtual/_rolldown/runtime.js";
3
2
  import { FilterScopeMatch } from "../../rulesStorage.js";
4
- const escapeTagValue = (value) => {
5
- return value.replace(/([,.<>{}\[\]"':;!@#$%^&*()\-+=~|/\\])/g, "\\$1");
6
- };
7
- const REDIS_QUERY_DIALECT = 2;
8
- const userIpQueries = {
9
- numericIp: (value, scope) => {
10
- if (void 0 !== value) {
11
- return `( @numericIp:[${value} ${value}] | ( @numericIpMaskMin:[-inf ${value}] @numericIpMaskMax:[${value} +inf] ) )`;
12
- }
13
- if (scope.numericIpMaskMin === void 0 && scope.numericIpMaskMax === void 0) {
14
- return "ismissing(@numericIp) ismissing(@numericIpMaskMin) ismissing(@numericIpMaskMax)";
15
- }
16
- return "";
17
- },
18
- numericIpMaskMin: (value, scope) => {
19
- if (scope.numericIp !== void 0) {
20
- return "";
21
- }
22
- if (value === void 0 && scope.numericIpMaskMax === void 0) {
23
- return "";
24
- }
25
- return value !== void 0 ? `@numericIpMaskMin:[-inf ${value}]` : "ismissing(@numericIpMaskMin)";
26
- },
27
- numericIpMaskMax: (value, scope) => {
28
- if (scope.numericIp !== void 0) {
29
- return "";
30
- }
31
- if (value === void 0 && scope.numericIpMaskMin === void 0) {
32
- return "";
33
- }
34
- return value !== void 0 ? `@numericIpMaskMax:[${value} +inf]` : "ismissing(@numericIpMaskMax)";
35
- }
3
+ import { AccessPolicyType, GLOBAL_CLIENT_SCOPE_SENTINEL } from "../../rule.js";
4
+ import { userScopeSchema } from "../../ruleInput/userScopeInput.js";
5
+ //#region src/redis/reader/redisRulesQuery.ts
6
+ /**
7
+ * Escapes special characters for Redis TAG field queries.
8
+ * Redis TAG fields treat these characters as special and they must be escaped with a backslash.
9
+ */
10
+ var escapeTagValue = (value) => {
11
+ return value.replace(/([,.<>{}\[\]"':;!@#$%^&*()\-+=~|/\\])/g, "\\$1");
36
12
  };
37
- const getUserScopeQuery = (userScope, FilterScopeMatchType, matchingFieldsOnly) => {
38
- let scopeEntries = Object.entries(userScope);
39
- let scopeJoinType = " ";
40
- if (FilterScopeMatchType === FilterScopeMatch.Greedy) {
41
- scopeEntries = scopeEntries.filter(
42
- ([_, value]) => value !== void 0
43
- );
44
- scopeJoinType = " | ";
45
- }
46
- if (matchingFieldsOnly) {
47
- const scopeMap = new Map(scopeEntries);
48
- if (scopeMap.has("numericIp") && scopeMap.get("numericIp") === void 0) {
49
- scopeMap.set("numericIpMaskMin", void 0);
50
- scopeMap.set("numericIpMaskMax", void 0);
51
- }
52
- for (const name of Object.keys(userScopeSchema.shape)) {
53
- if (!scopeMap.has(name)) {
54
- scopeMap.set(name, void 0);
55
- }
56
- }
57
- scopeEntries = [...scopeMap.entries()];
58
- }
59
- const scopeObj = Object.fromEntries(scopeEntries);
60
- return scopeEntries.map(
61
- ([scopeFieldName, scopeFieldValue]) => getUserScopeFieldQuery(
62
- scopeFieldName,
63
- scopeFieldValue,
64
- FilterScopeMatchType,
65
- scopeObj
66
- )
67
- ).filter(Boolean).join(scopeJoinType);
13
+ var REDIS_QUERY_DIALECT = 2;
14
+ var userIpQueries = {
15
+ numericIp: (value, scope) => {
16
+ if (void 0 !== value) return `( @numericIp:[${value} ${value}] | ( @numericIpMaskMin:[-inf ${value}] @numericIpMaskMax:[${value} +inf] ) )`;
17
+ if (scope.numericIpMaskMin === void 0 && scope.numericIpMaskMax === void 0) return "ismissing(@numericIp) ismissing(@numericIpMaskMin) ismissing(@numericIpMaskMax)";
18
+ return "";
19
+ },
20
+ numericIpMaskMin: (value, scope) => {
21
+ if (scope.numericIp !== void 0) return "";
22
+ if (value === void 0 && scope.numericIpMaskMax === void 0) return "";
23
+ return value !== void 0 ? `@numericIpMaskMin:[-inf ${value}]` : "ismissing(@numericIpMaskMin)";
24
+ },
25
+ numericIpMaskMax: (value, scope) => {
26
+ if (scope.numericIp !== void 0) return "";
27
+ if (value === void 0 && scope.numericIpMaskMin === void 0) return "";
28
+ return value !== void 0 ? `@numericIpMaskMax:[${value} +inf]` : "ismissing(@numericIpMaskMax)";
29
+ }
68
30
  };
69
- const FIELDS_REQUIRING_ESCAPE = /* @__PURE__ */ new Set([
70
- "coords"
71
- ]);
72
- const NUMERIC_FIELDS = /* @__PURE__ */ new Set(["asn"]);
73
- const getUserScopeFieldQuery = (fieldName, fieldValue, scopeMatch, fullScope) => {
74
- if (fieldName in userIpQueries) {
75
- const queryBuilder = userIpQueries[fieldName];
76
- return queryBuilder(fieldValue, fullScope);
77
- }
78
- if (void 0 === fieldValue) {
79
- return `ismissing(@${fieldName})`;
80
- }
81
- const stringValue = String(fieldValue);
82
- if (NUMERIC_FIELDS.has(fieldName)) {
83
- return `@${fieldName}:[${stringValue} ${stringValue}]`;
84
- }
85
- const queryValue = FIELDS_REQUIRING_ESCAPE.has(fieldName) ? escapeTagValue(stringValue) : stringValue;
86
- return `@${fieldName}:{${queryValue}}`;
31
+ var getUserScopeQuery = (userScope, FilterScopeMatchType, matchingFieldsOnly) => {
32
+ let scopeEntries = Object.entries(userScope);
33
+ let scopeJoinType = " ";
34
+ if (FilterScopeMatchType === FilterScopeMatch.Greedy) {
35
+ scopeEntries = scopeEntries.filter(([_, value]) => value !== void 0);
36
+ scopeJoinType = " | ";
37
+ }
38
+ if (matchingFieldsOnly) {
39
+ const scopeMap = new Map(scopeEntries);
40
+ if (scopeMap.has("numericIp") && scopeMap.get("numericIp") === void 0) {
41
+ scopeMap.set("numericIpMaskMin", void 0);
42
+ scopeMap.set("numericIpMaskMax", void 0);
43
+ }
44
+ for (const name of Object.keys(userScopeSchema.shape)) if (!scopeMap.has(name)) scopeMap.set(name, void 0);
45
+ scopeEntries = [...scopeMap.entries()];
46
+ }
47
+ const scopeObj = Object.fromEntries(scopeEntries);
48
+ return scopeEntries.map(([scopeFieldName, scopeFieldValue]) => getUserScopeFieldQuery(scopeFieldName, scopeFieldValue, FilterScopeMatchType, scopeObj)).filter(Boolean).join(scopeJoinType);
87
49
  };
88
- const GLOBAL_MATCH_CLAUSE_INNER = `@clientId:{${GLOBAL_CLIENT_SCOPE_SENTINEL}} | ismissing(@clientId)`;
89
- const getPolicyScopeQuery = (policyScope, scopeMatch) => {
90
- const clientId = policyScope?.clientId;
91
- if ("string" === typeof clientId) {
92
- return FilterScopeMatch.Exact === scopeMatch ? `@clientId:{${clientId}}` : `( @clientId:{${clientId}} | ${GLOBAL_MATCH_CLAUSE_INNER} )`;
93
- }
94
- return FilterScopeMatch.Exact === scopeMatch ? `( ${GLOBAL_MATCH_CLAUSE_INNER} )` : "";
50
+ var FIELDS_REQUIRING_ESCAPE = /* @__PURE__ */ new Set(["coords"]);
51
+ var NUMERIC_FIELDS = /* @__PURE__ */ new Set(["asn"]);
52
+ var getUserScopeFieldQuery = (fieldName, fieldValue, scopeMatch, fullScope) => {
53
+ if (fieldName in userIpQueries) {
54
+ const queryBuilder = userIpQueries[fieldName];
55
+ return queryBuilder(fieldValue, fullScope);
56
+ }
57
+ if (void 0 === fieldValue) return `ismissing(@${fieldName})`;
58
+ const stringValue = String(fieldValue);
59
+ if (NUMERIC_FIELDS.has(fieldName)) return `@${fieldName}:[${stringValue} ${stringValue}]`;
60
+ return `@${fieldName}:{${FIELDS_REQUIRING_ESCAPE.has(fieldName) ? escapeTagValue(stringValue) : stringValue}}`;
95
61
  };
96
- const getRulesRedisQuery = (filter, matchingFieldsOnly) => {
97
- const { policyScope, userScope } = filter;
98
- const queryParts = [];
99
- if (filter.groupId) {
100
- queryParts.push(`@groupId:{${filter.groupId}}`);
101
- }
102
- if (filter.blockOnly) {
103
- queryParts.push(`@type:{${AccessPolicyType.Block}}`);
104
- }
105
- const policyScopeQuery = getPolicyScopeQuery(
106
- policyScope,
107
- filter.policyScopeMatch
108
- );
109
- if (policyScopeQuery) {
110
- queryParts.push(policyScopeQuery);
111
- }
112
- if (userScope && Object.keys(userScope).length > 0) {
113
- const userScopeFilter = getUserScopeQuery(
114
- userScope,
115
- filter.userScopeMatch,
116
- matchingFieldsOnly
117
- );
118
- queryParts.push(`( ${userScopeFilter} )`);
119
- }
120
- return queryParts.length > 0 ? queryParts.join(" ") : "*";
62
+ var GLOBAL_MATCH_CLAUSE_INNER = `@clientId:{${GLOBAL_CLIENT_SCOPE_SENTINEL}} | ismissing(@clientId)`;
63
+ var getPolicyScopeQuery = (policyScope, scopeMatch) => {
64
+ const clientId = policyScope?.clientId;
65
+ if ("string" === typeof clientId) return FilterScopeMatch.Exact === scopeMatch ? `@clientId:{${clientId}}` : `( @clientId:{${clientId}} | ${GLOBAL_MATCH_CLAUSE_INNER} )`;
66
+ return FilterScopeMatch.Exact === scopeMatch ? `( ${GLOBAL_MATCH_CLAUSE_INNER} )` : "";
121
67
  };
122
- export {
123
- REDIS_QUERY_DIALECT,
124
- getRulesRedisQuery
68
+ var getRulesRedisQuery = (filter, matchingFieldsOnly) => {
69
+ const { policyScope, userScope } = filter;
70
+ const queryParts = [];
71
+ if (filter.groupId) queryParts.push(`@groupId:{${filter.groupId}}`);
72
+ if (filter.blockOnly) queryParts.push(`@type:{${AccessPolicyType.Block}}`);
73
+ const policyScopeQuery = getPolicyScopeQuery(policyScope, filter.policyScopeMatch);
74
+ if (policyScopeQuery) queryParts.push(policyScopeQuery);
75
+ if (userScope && Object.keys(userScope).length > 0) {
76
+ const userScopeFilter = getUserScopeQuery(userScope, filter.userScopeMatch, matchingFieldsOnly);
77
+ queryParts.push(`( ${userScopeFilter} )`);
78
+ }
79
+ return queryParts.length > 0 ? queryParts.join(" ") : "*";
125
80
  };
81
+ //#endregion
82
+ export { REDIS_QUERY_DIALECT, getRulesRedisQuery };