@prosopo/user-access-policy 3.5.27 → 3.5.31

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 (240) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/package.json +11 -11
  3. package/coverage/base.css +0 -224
  4. package/coverage/block-navigation.js +0 -87
  5. package/coverage/clover.xml +0 -786
  6. package/coverage/coverage-final.json +0 -15
  7. package/coverage/favicon.png +0 -0
  8. package/coverage/index.html +0 -146
  9. package/coverage/prettify.css +0 -1
  10. package/coverage/prettify.js +0 -2
  11. package/coverage/sort-arrow-sprite.png +0 -0
  12. package/coverage/sorter.js +0 -210
  13. package/coverage/src/accessPolicy.ts.html +0 -457
  14. package/coverage/src/accessPolicyResolver.ts.html +0 -211
  15. package/coverage/src/accessRules.ts.html +0 -265
  16. package/coverage/src/api/accessRuleApiRoutes.ts.html +0 -379
  17. package/coverage/src/api/accessRulesApiClient.ts.html +0 -274
  18. package/coverage/src/api/deleteAllRulesEndpoint.ts.html +0 -229
  19. package/coverage/src/api/deleteRulesEndpoint.ts.html +0 -301
  20. package/coverage/src/api/index.html +0 -176
  21. package/coverage/src/api/insertRulesEndpoint.ts.html +0 -436
  22. package/coverage/src/index.html +0 -176
  23. package/coverage/src/index.ts.html +0 -277
  24. package/coverage/src/redis/index.html +0 -161
  25. package/coverage/src/redis/redisRulesIndex.ts.html +0 -769
  26. package/coverage/src/redis/redisRulesReader.ts.html +0 -652
  27. package/coverage/src/redis/redisRulesStorage.ts.html +0 -229
  28. package/coverage/src/redis/redisRulesWriter.ts.html +0 -424
  29. package/coverage/src/util.ts.html +0 -136
  30. package/dist/.export.d.ts +0 -6
  31. package/dist/.export.d.ts.map +0 -1
  32. package/dist/.export.js.map +0 -1
  33. package/dist/accessPolicy.d.ts +0 -169
  34. package/dist/accessPolicy.d.ts.map +0 -1
  35. package/dist/accessPolicy.js +0 -80
  36. package/dist/accessPolicy.js.map +0 -1
  37. package/dist/accessPolicyResolver.d.ts +0 -110
  38. package/dist/accessPolicyResolver.d.ts.map +0 -1
  39. package/dist/accessPolicyResolver.js +0 -31
  40. package/dist/accessPolicyResolver.js.map +0 -1
  41. package/dist/accessRules.d.ts +0 -16
  42. package/dist/accessRules.d.ts.map +0 -1
  43. package/dist/accessRules.js +0 -11
  44. package/dist/accessRules.js.map +0 -1
  45. package/dist/api/.export.d.ts +0 -7
  46. package/dist/api/.export.d.ts.map +0 -1
  47. package/dist/api/.export.js.map +0 -1
  48. package/dist/api/accessRuleApiRoutes.d.ts +0 -27
  49. package/dist/api/accessRuleApiRoutes.d.ts.map +0 -1
  50. package/dist/api/accessRuleApiRoutes.js +0 -79
  51. package/dist/api/accessRuleApiRoutes.js.map +0 -1
  52. package/dist/api/accessRulesApiClient.d.ts +0 -10
  53. package/dist/api/accessRulesApiClient.d.ts.map +0 -1
  54. package/dist/api/accessRulesApiClient.js +0 -38
  55. package/dist/api/accessRulesApiClient.js.map +0 -1
  56. package/dist/api/delete/.export.d.ts +0 -2
  57. package/dist/api/delete/.export.d.ts.map +0 -1
  58. package/dist/api/delete/.export.js.map +0 -1
  59. package/dist/api/delete/deleteAllRules.d.ts +0 -11
  60. package/dist/api/delete/deleteAllRules.d.ts.map +0 -1
  61. package/dist/api/delete/deleteAllRules.js.map +0 -1
  62. package/dist/api/delete/deleteRuleGroups.d.ts +0 -19
  63. package/dist/api/delete/deleteRuleGroups.d.ts.map +0 -1
  64. package/dist/api/delete/deleteRuleGroups.js.map +0 -1
  65. package/dist/api/delete/deleteRules.d.ts +0 -15
  66. package/dist/api/delete/deleteRules.d.ts.map +0 -1
  67. package/dist/api/delete/deleteRules.js.map +0 -1
  68. package/dist/api/deleteAllRulesEndpoint.d.ts +0 -12
  69. package/dist/api/deleteAllRulesEndpoint.d.ts.map +0 -1
  70. package/dist/api/deleteAllRulesEndpoint.js +0 -24
  71. package/dist/api/deleteAllRulesEndpoint.js.map +0 -1
  72. package/dist/api/deleteRulesEndpoint.d.ts +0 -116
  73. package/dist/api/deleteRulesEndpoint.d.ts.map +0 -1
  74. package/dist/api/deleteRulesEndpoint.js +0 -34
  75. package/dist/api/deleteRulesEndpoint.js.map +0 -1
  76. package/dist/api/insertRulesEndpoint.d.ts +0 -22
  77. package/dist/api/insertRulesEndpoint.d.ts.map +0 -1
  78. package/dist/api/insertRulesEndpoint.js +0 -62
  79. package/dist/api/insertRulesEndpoint.js.map +0 -1
  80. package/dist/api/read/.export.d.ts +0 -4
  81. package/dist/api/read/.export.d.ts.map +0 -1
  82. package/dist/api/read/.export.js.map +0 -1
  83. package/dist/api/read/fetchRules.d.ts +0 -53
  84. package/dist/api/read/fetchRules.d.ts.map +0 -1
  85. package/dist/api/read/fetchRules.js.map +0 -1
  86. package/dist/api/read/findRuleIds.d.ts +0 -28
  87. package/dist/api/read/findRuleIds.d.ts.map +0 -1
  88. package/dist/api/read/findRuleIds.js.map +0 -1
  89. package/dist/api/read/getMissingIds.d.ts +0 -28
  90. package/dist/api/read/getMissingIds.d.ts.map +0 -1
  91. package/dist/api/read/getMissingIds.js.map +0 -1
  92. package/dist/api/ruleApiRoutes.d.ts +0 -43
  93. package/dist/api/ruleApiRoutes.d.ts.map +0 -1
  94. package/dist/api/ruleApiRoutes.js.map +0 -1
  95. package/dist/api/rulesApiClient.d.ts +0 -20
  96. package/dist/api/rulesApiClient.d.ts.map +0 -1
  97. package/dist/api/rulesApiClient.js.map +0 -1
  98. package/dist/api/write/.export.d.ts +0 -2
  99. package/dist/api/write/.export.d.ts.map +0 -1
  100. package/dist/api/write/.export.js.map +0 -1
  101. package/dist/api/write/insertRules.d.ts +0 -29
  102. package/dist/api/write/insertRules.d.ts.map +0 -1
  103. package/dist/api/write/insertRules.js.map +0 -1
  104. package/dist/api/write/rehashRules.d.ts +0 -11
  105. package/dist/api/write/rehashRules.d.ts.map +0 -1
  106. package/dist/api/write/rehashRules.js.map +0 -1
  107. package/dist/cjs/accessPolicy.cjs +0 -80
  108. package/dist/cjs/accessPolicyResolver.cjs +0 -31
  109. package/dist/cjs/accessRules.cjs +0 -11
  110. package/dist/cjs/api/accessRuleApiRoutes.cjs +0 -79
  111. package/dist/cjs/api/deleteAllRulesEndpoint.cjs +0 -24
  112. package/dist/cjs/api/deleteRulesEndpoint.cjs +0 -34
  113. package/dist/cjs/api/insertRulesEndpoint.cjs +0 -62
  114. package/dist/cjs/index.cjs +0 -29
  115. package/dist/cjs/redis/redisAccessRules.cjs +0 -152
  116. package/dist/cjs/redis/redisAccessRulesIndex.cjs +0 -171
  117. package/dist/cjs/redis/redisIndex.cjs +0 -22
  118. package/dist/cjs/util.cjs +0 -5
  119. package/dist/index.d.ts +0 -15
  120. package/dist/index.d.ts.map +0 -1
  121. package/dist/index.js +0 -32
  122. package/dist/index.js.map +0 -1
  123. package/dist/mongoose/.export.d.ts +0 -2
  124. package/dist/mongoose/.export.d.ts.map +0 -1
  125. package/dist/mongoose/.export.js.map +0 -1
  126. package/dist/mongoose/mongooseRuleSchema.d.ts +0 -4
  127. package/dist/mongoose/mongooseRuleSchema.d.ts.map +0 -1
  128. package/dist/mongoose/mongooseRuleSchema.js.map +0 -1
  129. package/dist/redis/.export.d.ts +0 -3
  130. package/dist/redis/.export.d.ts.map +0 -1
  131. package/dist/redis/.export.js.map +0 -1
  132. package/dist/redis/reader/redisAggregate.d.ts +0 -4
  133. package/dist/redis/reader/redisAggregate.d.ts.map +0 -1
  134. package/dist/redis/reader/redisAggregate.js.map +0 -1
  135. package/dist/redis/reader/redisRulesQuery.d.ts +0 -4
  136. package/dist/redis/reader/redisRulesQuery.d.ts.map +0 -1
  137. package/dist/redis/reader/redisRulesQuery.js.map +0 -1
  138. package/dist/redis/reader/redisRulesReader.d.ts +0 -26
  139. package/dist/redis/reader/redisRulesReader.d.ts.map +0 -1
  140. package/dist/redis/reader/redisRulesReader.js.map +0 -1
  141. package/dist/redis/redisAccessRules.d.ts +0 -7
  142. package/dist/redis/redisAccessRules.d.ts.map +0 -1
  143. package/dist/redis/redisAccessRules.js +0 -119
  144. package/dist/redis/redisAccessRules.js.map +0 -1
  145. package/dist/redis/redisAccessRulesIndex.d.ts +0 -13
  146. package/dist/redis/redisAccessRulesIndex.d.ts.map +0 -1
  147. package/dist/redis/redisAccessRulesIndex.js +0 -140
  148. package/dist/redis/redisAccessRulesIndex.js.map +0 -1
  149. package/dist/redis/redisClient.d.ts +0 -11
  150. package/dist/redis/redisClient.d.ts.map +0 -1
  151. package/dist/redis/redisClient.js.map +0 -1
  152. package/dist/redis/redisIndex.d.ts +0 -9
  153. package/dist/redis/redisIndex.d.ts.map +0 -1
  154. package/dist/redis/redisIndex.js +0 -23
  155. package/dist/redis/redisIndex.js.map +0 -1
  156. package/dist/redis/redisRuleIndex.d.ts +0 -13
  157. package/dist/redis/redisRuleIndex.d.ts.map +0 -1
  158. package/dist/redis/redisRuleIndex.js.map +0 -1
  159. package/dist/redis/redisRulesIndex.d.ts +0 -9
  160. package/dist/redis/redisRulesIndex.d.ts.map +0 -1
  161. package/dist/redis/redisRulesIndex.js +0 -138
  162. package/dist/redis/redisRulesIndex.js.map +0 -1
  163. package/dist/redis/redisRulesReader.d.ts +0 -6
  164. package/dist/redis/redisRulesReader.d.ts.map +0 -1
  165. package/dist/redis/redisRulesReader.js +0 -125
  166. package/dist/redis/redisRulesReader.js.map +0 -1
  167. package/dist/redis/redisRulesStorage.d.ts +0 -5
  168. package/dist/redis/redisRulesStorage.d.ts.map +0 -1
  169. package/dist/redis/redisRulesStorage.js.map +0 -1
  170. package/dist/redis/redisRulesWriter.d.ts +0 -22
  171. package/dist/redis/redisRulesWriter.d.ts.map +0 -1
  172. package/dist/redis/redisRulesWriter.js.map +0 -1
  173. package/dist/rule.d.ts +0 -34
  174. package/dist/rule.d.ts.map +0 -1
  175. package/dist/rule.js.map +0 -1
  176. package/dist/ruleInput/.export.d.ts +0 -4
  177. package/dist/ruleInput/.export.d.ts.map +0 -1
  178. package/dist/ruleInput/.export.js.map +0 -1
  179. package/dist/ruleInput/policyInput.d.ts +0 -38
  180. package/dist/ruleInput/policyInput.d.ts.map +0 -1
  181. package/dist/ruleInput/policyInput.js.map +0 -1
  182. package/dist/ruleInput/ruleInput.d.ts +0 -145
  183. package/dist/ruleInput/ruleInput.d.ts.map +0 -1
  184. package/dist/ruleInput/ruleInput.js.map +0 -1
  185. package/dist/ruleInput/userScopeInput.d.ts +0 -93
  186. package/dist/ruleInput/userScopeInput.d.ts.map +0 -1
  187. package/dist/ruleInput/userScopeInput.js.map +0 -1
  188. package/dist/ruleRecord.d.ts +0 -18
  189. package/dist/ruleRecord.d.ts.map +0 -1
  190. package/dist/ruleRecord.js.map +0 -1
  191. package/dist/rulesStorage.d.ts +0 -30
  192. package/dist/rulesStorage.d.ts.map +0 -1
  193. package/dist/rulesStorage.js.map +0 -1
  194. package/dist/tests/accessPolicy.test.d.ts +0 -2
  195. package/dist/tests/accessPolicy.test.d.ts.map +0 -1
  196. package/dist/tests/accessPolicy.test.js +0 -27
  197. package/dist/tests/accessPolicy.test.js.map +0 -1
  198. package/dist/tests/redis/reader/redisRulesQuery.unit.test.d.ts +0 -2
  199. package/dist/tests/redis/reader/redisRulesQuery.unit.test.d.ts.map +0 -1
  200. package/dist/tests/redis/reader/redisRulesQuery.unit.test.js +0 -101
  201. package/dist/tests/redis/reader/redisRulesQuery.unit.test.js.map +0 -1
  202. package/dist/tests/redis/redisAccessRules.integration.test.d.ts +0 -2
  203. package/dist/tests/redis/redisAccessRules.integration.test.d.ts.map +0 -1
  204. package/dist/tests/redis/redisAccessRules.integration.test.js +0 -586
  205. package/dist/tests/redis/redisAccessRules.integration.test.js.map +0 -1
  206. package/dist/tests/redis/redisAccessRules.unit.test.d.ts +0 -2
  207. package/dist/tests/redis/redisAccessRules.unit.test.d.ts.map +0 -1
  208. package/dist/tests/redis/redisAccessRules.unit.test.js +0 -198
  209. package/dist/tests/redis/redisAccessRules.unit.test.js.map +0 -1
  210. package/dist/tests/redis/redisIndex.integration.test.d.ts +0 -2
  211. package/dist/tests/redis/redisIndex.integration.test.d.ts.map +0 -1
  212. package/dist/tests/redis/redisIndex.integration.test.js +0 -80
  213. package/dist/tests/redis/redisIndex.integration.test.js.map +0 -1
  214. package/dist/tests/redis/redisRulesIndex.unit.test.d.ts +0 -2
  215. package/dist/tests/redis/redisRulesIndex.unit.test.d.ts.map +0 -1
  216. package/dist/tests/redis/redisRulesIndex.unit.test.js +0 -101
  217. package/dist/tests/redis/redisRulesIndex.unit.test.js.map +0 -1
  218. package/dist/tests/redis/redisRulesStorage.integration.test.d.ts +0 -2
  219. package/dist/tests/redis/redisRulesStorage.integration.test.d.ts.map +0 -1
  220. package/dist/tests/redis/redisRulesStorage.integration.test.js +0 -611
  221. package/dist/tests/redis/redisRulesStorage.integration.test.js.map +0 -1
  222. package/dist/tests/redis/testRedisClient.d.ts +0 -3
  223. package/dist/tests/redis/testRedisClient.d.ts.map +0 -1
  224. package/dist/tests/redis/testRedisClient.js +0 -8
  225. package/dist/tests/redis/testRedisClient.js.map +0 -1
  226. package/dist/tests/testLogger.d.ts +0 -4
  227. package/dist/tests/testLogger.d.ts.map +0 -1
  228. package/dist/tests/testLogger.js +0 -22
  229. package/dist/tests/testLogger.js.map +0 -1
  230. package/dist/tests/transformRule.unit.test.d.ts +0 -2
  231. package/dist/tests/transformRule.unit.test.d.ts.map +0 -1
  232. package/dist/tests/transformRule.unit.test.js +0 -188
  233. package/dist/tests/transformRule.unit.test.js.map +0 -1
  234. package/dist/transformRule.d.ts +0 -7
  235. package/dist/transformRule.d.ts.map +0 -1
  236. package/dist/transformRule.js.map +0 -1
  237. package/dist/util.d.ts +0 -2
  238. package/dist/util.d.ts.map +0 -1
  239. package/dist/util.js +0 -5
  240. package/dist/util.js.map +0 -1
@@ -1,586 +0,0 @@
1
- import { LogLevel, getLogger } from "@prosopo/common";
2
- import { randomAsHex } from "@prosopo/util-crypto";
3
- import { afterAll, beforeAll, beforeEach, describe, expect, test, } from "vitest";
4
- import { AccessPolicyType } from "#policy/accessPolicy.js";
5
- import { ScopeMatch } from "#policy/accessPolicyResolver.js";
6
- import { createRedisAccessRulesReader, createRedisAccessRulesWriter, } from "#policy/redis/redisAccessRules.js";
7
- import { createRedisAccessRulesIndex, getRedisAccessRuleKey, getRedisAccessRuleValue, } from "#policy/redis/redisAccessRulesIndex.js";
8
- import { createTestRedisClient } from "./testRedisClient.js";
9
- describe("redisAccessRules", () => {
10
- let redisClient;
11
- let indexName;
12
- const getUniqueString = () => Math.random().toString(36).substring(2, 15);
13
- const getIndexRecordsCount = async (indexName) => (await redisClient.ft.info(indexName)).num_docs;
14
- const insertRule = async (rule) => {
15
- const ruleKey = getRedisAccessRuleKey(rule);
16
- const ruleValue = getRedisAccessRuleValue(rule);
17
- return await redisClient.hSet(ruleKey, ruleValue);
18
- };
19
- beforeAll(async () => {
20
- redisClient = await createTestRedisClient();
21
- await createRedisAccessRulesIndex(redisClient);
22
- });
23
- beforeEach(async () => {
24
- const keys = await redisClient.keys("*");
25
- if (keys.length > 0) {
26
- await redisClient.del(keys);
27
- }
28
- indexName = randomAsHex(16);
29
- redisClient = await createTestRedisClient();
30
- await createRedisAccessRulesIndex(redisClient, indexName);
31
- });
32
- describe("writer", () => {
33
- let accessRulesWriter;
34
- beforeAll(() => {
35
- accessRulesWriter = createRedisAccessRulesWriter(redisClient);
36
- });
37
- test("inserts rule", async () => {
38
- const accessRule = {
39
- type: AccessPolicyType.Block,
40
- clientId: "clientId",
41
- };
42
- const accessRuleKey = getRedisAccessRuleKey(accessRule);
43
- await accessRulesWriter.insertRule(accessRule);
44
- const insertedAccessRule = await redisClient.hGetAll(accessRuleKey);
45
- const indexRecordsCount = await getIndexRecordsCount(indexName);
46
- expect(insertedAccessRule).toEqual(accessRule);
47
- expect(indexRecordsCount).toEqual(1);
48
- });
49
- test("inserts time limited rule", async () => {
50
- const accessRule = {
51
- type: AccessPolicyType.Block,
52
- clientId: "clientId",
53
- };
54
- const accessRuleKey = getRedisAccessRuleKey(accessRule);
55
- const expireIn = 60 * 60;
56
- const expirationTimestamp = new Date(Date.now() + expireIn * 1000).getTime();
57
- const expirationTimestampInSeconds = Math.floor(expirationTimestamp / 1000);
58
- await accessRulesWriter.insertRule(accessRule, expirationTimestamp);
59
- const ruleKey = getRedisAccessRuleKey(accessRule);
60
- const insertedAccessRule = await redisClient.hGetAll(accessRuleKey);
61
- const insertedExpirationResult = await redisClient.expireAt(ruleKey, expirationTimestampInSeconds);
62
- const indexRecordsCount = await getIndexRecordsCount(indexName);
63
- const recordExpirySeconds = await redisClient.ttl(ruleKey);
64
- expect(insertedAccessRule).toEqual(accessRule);
65
- expect(insertedExpirationResult).toBe(1);
66
- expect(recordExpirySeconds).toBeLessThanOrEqual(expirationTimestampInSeconds);
67
- expect(indexRecordsCount).toBe(1);
68
- });
69
- test("deletes rules", async () => {
70
- const johnAccessRule = {
71
- type: AccessPolicyType.Block,
72
- clientId: getUniqueString(),
73
- };
74
- const johnAccessRuleKey = getRedisAccessRuleKey(johnAccessRule);
75
- const doeAccessRule = {
76
- type: AccessPolicyType.Block,
77
- clientId: getUniqueString(),
78
- };
79
- const doeAccessRuleKey = getRedisAccessRuleKey(doeAccessRule);
80
- await insertRule(johnAccessRule);
81
- await insertRule(doeAccessRule);
82
- await accessRulesWriter.deleteRules([johnAccessRuleKey]);
83
- const presentAccessRule = await redisClient.hGetAll(doeAccessRuleKey);
84
- const indexRecordsCount = await getIndexRecordsCount(indexName);
85
- expect(presentAccessRule).toEqual(doeAccessRule);
86
- expect(indexRecordsCount).toBe(1);
87
- });
88
- test("deletes all rules", async () => {
89
- const johnAccessRule = {
90
- type: AccessPolicyType.Block,
91
- clientId: getUniqueString(),
92
- };
93
- const doeAccessRule = {
94
- type: AccessPolicyType.Block,
95
- clientId: getUniqueString(),
96
- };
97
- await insertRule(johnAccessRule);
98
- await insertRule(doeAccessRule);
99
- await accessRulesWriter.deleteAllRules();
100
- const indexRecordsCount = await getIndexRecordsCount(indexName);
101
- expect(indexRecordsCount).toBe(0);
102
- });
103
- test("deletes all rules when there are 1000s of rules", async () => {
104
- const rulesCount = 10000;
105
- const accessRules = Array.from({ length: rulesCount }, () => ({
106
- type: AccessPolicyType.Block,
107
- clientId: getUniqueString(),
108
- }));
109
- for (const rule of accessRules) {
110
- await insertRule(rule);
111
- }
112
- await accessRulesWriter.deleteAllRules();
113
- const indexRecordsCount = await getIndexRecordsCount(indexName);
114
- expect(indexRecordsCount).toBe(0);
115
- });
116
- });
117
- describe("reader", () => {
118
- let accessRulesReader;
119
- beforeAll(async () => {
120
- accessRulesReader = createRedisAccessRulesReader(redisClient, getLogger(LogLevel.enum.info, "RedisAccessRulesReader"));
121
- });
122
- test("finds client and global rules by greedy policy scope match", async () => {
123
- const johnId = getUniqueString();
124
- const johnAccessRule = {
125
- type: AccessPolicyType.Block,
126
- clientId: johnId,
127
- };
128
- const doeAccessRule = {
129
- type: AccessPolicyType.Block,
130
- clientId: getUniqueString(),
131
- };
132
- const globalAccessRule = {
133
- type: AccessPolicyType.Block,
134
- };
135
- await insertRule(johnAccessRule);
136
- await insertRule(doeAccessRule);
137
- await insertRule(globalAccessRule);
138
- const foundByClientAccessRules = await accessRulesReader.findRules({
139
- policyScope: {
140
- clientId: johnId,
141
- },
142
- policyScopeMatch: ScopeMatch.Greedy,
143
- });
144
- const foundAccessRules = await accessRulesReader.findRules({
145
- policyScopeMatch: ScopeMatch.Greedy,
146
- });
147
- const indexRecordsCount = await getIndexRecordsCount(indexName);
148
- expect(indexRecordsCount).toBe(3);
149
- expect(foundByClientAccessRules).toEqual([
150
- johnAccessRule,
151
- globalAccessRule,
152
- ]);
153
- expect(foundAccessRules).toEqual([
154
- johnAccessRule,
155
- doeAccessRule,
156
- globalAccessRule,
157
- ]);
158
- });
159
- test("finds client or global rules by exact policy scope match", async () => {
160
- const johnId = getUniqueString();
161
- const johnAccessRule = {
162
- type: AccessPolicyType.Block,
163
- clientId: johnId,
164
- };
165
- const doeAccessRule = {
166
- type: AccessPolicyType.Block,
167
- clientId: getUniqueString(),
168
- };
169
- const globalAccessRule = {
170
- type: AccessPolicyType.Block,
171
- };
172
- await insertRule(johnAccessRule);
173
- await insertRule(doeAccessRule);
174
- await insertRule(globalAccessRule);
175
- const foundClientAccessRules = await accessRulesReader.findRules({
176
- policyScope: {
177
- clientId: johnId,
178
- },
179
- policyScopeMatch: ScopeMatch.Exact,
180
- });
181
- const foundGlobalAccessRules = await accessRulesReader.findRules({
182
- policyScopeMatch: ScopeMatch.Exact,
183
- }, false, false);
184
- const indexRecordsCount = await getIndexRecordsCount(indexName);
185
- expect(indexRecordsCount).toBe(3);
186
- expect(foundClientAccessRules).toEqual([johnAccessRule]);
187
- expect(foundGlobalAccessRules).toEqual([globalAccessRule]);
188
- });
189
- test("finds rules by greedy user scope match", async () => {
190
- const johnId = getUniqueString();
191
- const johnIpAccessRule = {
192
- type: AccessPolicyType.Block,
193
- clientId: johnId,
194
- numericIp: BigInt(100),
195
- };
196
- const doeIpAccessRule = {
197
- type: AccessPolicyType.Block,
198
- clientId: getUniqueString(),
199
- numericIp: BigInt(100),
200
- };
201
- const johnHeaderAccessRule = {
202
- type: AccessPolicyType.Block,
203
- headersHash: "chrome",
204
- };
205
- const globalJa4AccessRule = {
206
- type: AccessPolicyType.Block,
207
- ja4Hash: "windows",
208
- };
209
- await insertRule(johnIpAccessRule);
210
- await insertRule(doeIpAccessRule);
211
- await insertRule(johnHeaderAccessRule);
212
- await insertRule(globalJa4AccessRule);
213
- const foundAccessRules = await accessRulesReader.findRules({
214
- policyScope: {
215
- clientId: johnId,
216
- },
217
- userScope: {
218
- numericIp: BigInt(100),
219
- ja4Hash: "windows",
220
- },
221
- userScopeMatch: ScopeMatch.Greedy,
222
- });
223
- const indexRecordsCount = await getIndexRecordsCount(indexName);
224
- expect(indexRecordsCount).toBe(4);
225
- expect(foundAccessRules).toEqual([johnIpAccessRule, globalJa4AccessRule]);
226
- });
227
- test("finds rules by exact user scope match", async () => {
228
- const johnId = getUniqueString();
229
- const johnTargetAccessRule = {
230
- type: AccessPolicyType.Block,
231
- clientId: johnId,
232
- numericIp: BigInt(100),
233
- ja4Hash: "windows",
234
- };
235
- const doeTargetAccessRule = {
236
- type: AccessPolicyType.Block,
237
- clientId: getUniqueString(),
238
- numericIp: BigInt(100),
239
- ja4Hash: "windows",
240
- };
241
- const johnHeaderAccessRule = {
242
- type: AccessPolicyType.Block,
243
- headersHash: "chrome",
244
- };
245
- const globalTargetAccessRule = {
246
- type: AccessPolicyType.Block,
247
- numericIp: BigInt(100),
248
- ja4Hash: "windows",
249
- };
250
- const globalJa4AccessRule = {
251
- type: AccessPolicyType.Block,
252
- ja4Hash: "windows",
253
- };
254
- await insertRule(johnTargetAccessRule);
255
- await insertRule(doeTargetAccessRule);
256
- await insertRule(johnHeaderAccessRule);
257
- await insertRule(globalTargetAccessRule);
258
- await insertRule(globalJa4AccessRule);
259
- const foundAccessRules = await accessRulesReader.findRules({
260
- policyScope: {
261
- clientId: johnId,
262
- },
263
- userScope: {
264
- numericIp: BigInt(100),
265
- ja4Hash: "windows",
266
- },
267
- userScopeMatch: ScopeMatch.Exact,
268
- });
269
- const indexRecordsCount = await getIndexRecordsCount(indexName);
270
- expect(indexRecordsCount).toBe(5);
271
- expect(foundAccessRules).toEqual([
272
- johnTargetAccessRule,
273
- globalTargetAccessRule,
274
- ]);
275
- });
276
- test("finds rules by greedy ip match", async () => {
277
- const johnId = getUniqueString();
278
- const johnIpMask_0_100_AccessRule = {
279
- clientId: johnId,
280
- type: AccessPolicyType.Block,
281
- numericIpMaskMin: BigInt(0),
282
- numericIpMaskMax: BigInt(100),
283
- };
284
- const johnIp_100_AccessRule = {
285
- clientId: johnId,
286
- type: AccessPolicyType.Block,
287
- numericIp: BigInt(100),
288
- };
289
- const globalIpMask_100_200_AccessRule = {
290
- type: AccessPolicyType.Block,
291
- numericIpMaskMin: BigInt(100),
292
- numericIpMaskMax: BigInt(200),
293
- };
294
- const doeIpMask_200_300AccessRule = {
295
- clientId: getUniqueString(),
296
- type: AccessPolicyType.Block,
297
- numericIpMaskMin: BigInt(200),
298
- numericIpMaskMax: BigInt(300),
299
- };
300
- await insertRule(johnIpMask_0_100_AccessRule);
301
- await insertRule(johnIp_100_AccessRule);
302
- await insertRule(globalIpMask_100_200_AccessRule);
303
- await insertRule(doeIpMask_200_300AccessRule);
304
- const ip_0_accessRules = await accessRulesReader.findRules({
305
- policyScope: {
306
- clientId: johnId,
307
- },
308
- userScope: {
309
- numericIp: BigInt(0),
310
- },
311
- userScopeMatch: ScopeMatch.Greedy,
312
- });
313
- const ip_99_accessRules = await accessRulesReader.findRules({
314
- policyScope: {
315
- clientId: johnId,
316
- },
317
- userScope: {
318
- numericIp: BigInt(99),
319
- },
320
- userScopeMatch: ScopeMatch.Greedy,
321
- });
322
- const ip_100_accessRules = await accessRulesReader.findRules({
323
- policyScope: {
324
- clientId: johnId,
325
- },
326
- userScope: {
327
- numericIp: BigInt(100),
328
- },
329
- userScopeMatch: ScopeMatch.Greedy,
330
- });
331
- const ip_101_accessRules = await accessRulesReader.findRules({
332
- policyScope: {
333
- clientId: johnId,
334
- },
335
- userScope: {
336
- numericIp: BigInt(101),
337
- },
338
- userScopeMatch: ScopeMatch.Greedy,
339
- });
340
- const ip_201_accessRules = await accessRulesReader.findRules({
341
- policyScope: {
342
- clientId: johnId,
343
- },
344
- userScope: {
345
- numericIp: BigInt(201),
346
- },
347
- userScopeMatch: ScopeMatch.Greedy,
348
- });
349
- const indexRecordsCount = await getIndexRecordsCount(indexName);
350
- expect(indexRecordsCount).toBe(4);
351
- expect(ip_0_accessRules).toEqual([johnIpMask_0_100_AccessRule]);
352
- expect(ip_99_accessRules).toEqual([johnIpMask_0_100_AccessRule]);
353
- expect(ip_100_accessRules).toEqual([
354
- johnIpMask_0_100_AccessRule,
355
- johnIp_100_AccessRule,
356
- globalIpMask_100_200_AccessRule,
357
- ]);
358
- expect(ip_101_accessRules).toEqual([globalIpMask_100_200_AccessRule]);
359
- expect(ip_201_accessRules).toEqual([]);
360
- });
361
- test("finds rules by exact ip match with exact policy match", async () => {
362
- const johnId = getUniqueString();
363
- const johnIpMask_0_100_AccessRule = {
364
- clientId: johnId,
365
- type: AccessPolicyType.Block,
366
- numericIpMaskMin: BigInt(0),
367
- numericIpMaskMax: BigInt(100),
368
- };
369
- const johnIp_100_AccessRule = {
370
- clientId: johnId,
371
- type: AccessPolicyType.Block,
372
- numericIp: BigInt(100),
373
- };
374
- const globalIpMask_100_200_AccessRule = {
375
- type: AccessPolicyType.Block,
376
- numericIpMaskMin: BigInt(100),
377
- numericIpMaskMax: BigInt(200),
378
- };
379
- const globalIp_100_AccessRule = {
380
- type: AccessPolicyType.Block,
381
- numericIp: BigInt(100),
382
- };
383
- await insertRule(johnIpMask_0_100_AccessRule);
384
- await insertRule(johnIp_100_AccessRule);
385
- await insertRule(globalIpMask_100_200_AccessRule);
386
- await insertRule(globalIp_100_AccessRule);
387
- const ip_0_accessRules = await accessRulesReader.findRules({
388
- policyScope: {
389
- clientId: johnId,
390
- },
391
- policyScopeMatch: ScopeMatch.Exact,
392
- userScope: {
393
- numericIp: BigInt(0),
394
- },
395
- userScopeMatch: ScopeMatch.Exact,
396
- });
397
- const ip_100_accessRules = await accessRulesReader.findRules({
398
- policyScope: {
399
- clientId: johnId,
400
- },
401
- policyScopeMatch: ScopeMatch.Exact,
402
- userScope: {
403
- numericIp: BigInt(100),
404
- },
405
- userScopeMatch: ScopeMatch.Exact,
406
- });
407
- const indexRecordsCount = await getIndexRecordsCount(indexName);
408
- expect(indexRecordsCount).toBe(4);
409
- expect(ip_0_accessRules).toEqual([johnIpMask_0_100_AccessRule]);
410
- expect(ip_100_accessRules).toEqual([
411
- johnIpMask_0_100_AccessRule,
412
- johnIp_100_AccessRule,
413
- ]);
414
- });
415
- test("finds rules by exact ip match with exact policy match 2", async () => {
416
- const johnId = getUniqueString();
417
- const johnIp = BigInt(100);
418
- const johnIpMask_0_100_AccessRule = {
419
- clientId: johnId,
420
- type: AccessPolicyType.Block,
421
- numericIpMaskMin: BigInt(0),
422
- numericIpMaskMax: johnIp,
423
- };
424
- const johnIp_100_AccessRule = {
425
- clientId: johnId,
426
- type: AccessPolicyType.Block,
427
- numericIp: johnIp,
428
- };
429
- const globalIpMask_100_200_AccessRule = {
430
- type: AccessPolicyType.Block,
431
- numericIpMaskMin: johnIp,
432
- numericIpMaskMax: BigInt(200),
433
- };
434
- const globalIp_100_AccessRule = {
435
- type: AccessPolicyType.Block,
436
- numericIp: johnIp,
437
- };
438
- await insertRule(johnIpMask_0_100_AccessRule);
439
- await insertRule(johnIp_100_AccessRule);
440
- await insertRule(globalIpMask_100_200_AccessRule);
441
- await insertRule(globalIp_100_AccessRule);
442
- const ip_0_accessRules = await accessRulesReader.findRules({
443
- policyScope: {
444
- clientId: johnId,
445
- },
446
- policyScopeMatch: ScopeMatch.Exact,
447
- userScope: {
448
- numericIp: BigInt(0),
449
- },
450
- userScopeMatch: ScopeMatch.Exact,
451
- });
452
- const ip_100_accessRules = await accessRulesReader.findRules({
453
- policyScopeMatch: ScopeMatch.Exact,
454
- userScope: {
455
- numericIp: johnIp,
456
- },
457
- userScopeMatch: ScopeMatch.Exact,
458
- });
459
- const indexRecordsCount = await getIndexRecordsCount(indexName);
460
- expect(indexRecordsCount).toBe(4);
461
- expect(ip_0_accessRules).toEqual([johnIpMask_0_100_AccessRule]);
462
- expect(ip_100_accessRules).toEqual([
463
- globalIpMask_100_200_AccessRule,
464
- globalIp_100_AccessRule,
465
- ]);
466
- });
467
- test("does not find rules when some criteria do not match and user scope match is exact", async () => {
468
- const accessRule = {
469
- type: AccessPolicyType.Restrict,
470
- clientId: "clientId",
471
- userAgentHash: "userAgentHash1",
472
- ja4Hash: "ja4Hash",
473
- };
474
- await insertRule(accessRule);
475
- const query = {
476
- policyScope: {
477
- clientId: "clientId",
478
- },
479
- policyScopeMatch: ScopeMatch.Exact,
480
- userScope: {
481
- ja4Hash: "ja4Hash",
482
- userAgentHash: "userAgentHash2",
483
- },
484
- userScopeMatch: ScopeMatch.Exact,
485
- };
486
- const foundAccessRules = await accessRulesReader.findRules(query);
487
- expect(foundAccessRules).toEqual([]);
488
- });
489
- test("does not find rules when query is more exact than rule and user scope match is exact", async () => {
490
- const accessRule = {
491
- type: AccessPolicyType.Restrict,
492
- clientId: "clientId",
493
- ja4Hash: "ja4Hash",
494
- };
495
- await insertRule(accessRule);
496
- const query = {
497
- policyScope: {
498
- clientId: "clientId",
499
- },
500
- policyScopeMatch: ScopeMatch.Exact,
501
- userScope: {
502
- ja4Hash: "ja4Hash",
503
- userAgentHash: "userAgentHash",
504
- },
505
- userScopeMatch: ScopeMatch.Exact,
506
- };
507
- const foundAccessRules = await accessRulesReader.findRules(query);
508
- expect(foundAccessRules).toEqual([]);
509
- });
510
- test("does find rules when query is more exact than rule and user scope match is greedy", async () => {
511
- const accessRule = {
512
- type: AccessPolicyType.Restrict,
513
- clientId: "clientId",
514
- ja4Hash: "ja4Hash",
515
- };
516
- await insertRule(accessRule);
517
- const query = {
518
- policyScope: {
519
- clientId: "clientId",
520
- },
521
- policyScopeMatch: ScopeMatch.Exact,
522
- userScope: {
523
- ja4Hash: "ja4Hash",
524
- userAgentHash: "userAgentHash",
525
- },
526
- userScopeMatch: ScopeMatch.Greedy,
527
- };
528
- const foundAccessRules = await accessRulesReader.findRules(query);
529
- expect(foundAccessRules).toEqual([accessRule]);
530
- });
531
- test("does find rules when some criteria do not match and user scope match is exact", async () => {
532
- const accessRule = {
533
- type: AccessPolicyType.Restrict,
534
- clientId: "clientId",
535
- userAgentHash: "userAgentHash",
536
- ja4Hash: "ja4Hash",
537
- };
538
- getRedisAccessRuleKey(accessRule);
539
- await insertRule(accessRule);
540
- const query = {
541
- policyScope: {
542
- clientId: "clientId",
543
- },
544
- policyScopeMatch: ScopeMatch.Exact,
545
- userScope: {
546
- ja4Hash: "ja4Hash",
547
- userAgentHash: "userAgentHash",
548
- },
549
- userScopeMatch: ScopeMatch.Greedy,
550
- };
551
- const foundAccessRules = await accessRulesReader.findRules(query);
552
- expect(foundAccessRules).toEqual([accessRule]);
553
- });
554
- test("if an ip rule and an ip mask rule is applied for a single IP at client level, both rules are returned with the more specific IP rule being first in the list", async () => {
555
- const accessRule = {
556
- type: AccessPolicyType.Restrict,
557
- clientId: "clientId",
558
- numericIp: BigInt(10),
559
- };
560
- const ipRangeAccessRule = {
561
- type: AccessPolicyType.Restrict,
562
- clientId: "clientId",
563
- numericIpMaskMin: BigInt(10),
564
- numericIpMaskMax: BigInt(20),
565
- };
566
- await insertRule(accessRule);
567
- await insertRule(ipRangeAccessRule);
568
- const query = {
569
- policyScope: {
570
- clientId: "clientId",
571
- },
572
- policyScopeMatch: ScopeMatch.Exact,
573
- userScope: {
574
- numericIp: BigInt(10),
575
- },
576
- userScopeMatch: ScopeMatch.Exact,
577
- };
578
- const foundAccessRules = await accessRulesReader.findRules(query);
579
- expect(foundAccessRules).toEqual([accessRule, ipRangeAccessRule]);
580
- });
581
- });
582
- afterAll(async () => {
583
- await redisClient.flushAll();
584
- });
585
- });
586
- //# sourceMappingURL=redisAccessRules.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redisAccessRules.integration.test.js","sourceRoot":"","sources":["../../../src/tests/redis/redisAccessRules.integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=redisAccessRules.unit.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redisAccessRules.unit.test.d.ts","sourceRoot":"","sources":["../../../src/tests/redis/redisAccessRules.unit.test.ts"],"names":[],"mappings":""}