@prosopo/user-access-policy 3.4.0 → 3.5.27

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 (292) hide show
  1. package/CHANGELOG.md +309 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +786 -0
  5. package/coverage/coverage-final.json +15 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +146 -0
  8. package/coverage/prettify.css +1 -0
  9. package/coverage/prettify.js +2 -0
  10. package/coverage/sort-arrow-sprite.png +0 -0
  11. package/coverage/sorter.js +210 -0
  12. package/coverage/src/accessPolicy.ts.html +457 -0
  13. package/coverage/src/accessPolicyResolver.ts.html +211 -0
  14. package/coverage/src/accessRules.ts.html +265 -0
  15. package/coverage/src/api/accessRuleApiRoutes.ts.html +379 -0
  16. package/coverage/src/api/accessRulesApiClient.ts.html +274 -0
  17. package/coverage/src/api/deleteAllRulesEndpoint.ts.html +229 -0
  18. package/coverage/src/api/deleteRulesEndpoint.ts.html +301 -0
  19. package/coverage/src/api/index.html +176 -0
  20. package/coverage/src/api/insertRulesEndpoint.ts.html +436 -0
  21. package/coverage/src/index.html +176 -0
  22. package/coverage/src/index.ts.html +277 -0
  23. package/coverage/src/redis/index.html +161 -0
  24. package/coverage/src/redis/redisRulesIndex.ts.html +769 -0
  25. package/coverage/src/redis/redisRulesReader.ts.html +652 -0
  26. package/coverage/src/redis/redisRulesStorage.ts.html +229 -0
  27. package/coverage/src/redis/redisRulesWriter.ts.html +424 -0
  28. package/coverage/src/util.ts.html +136 -0
  29. package/dist/.export.d.ts +6 -0
  30. package/dist/.export.d.ts.map +1 -0
  31. package/dist/.export.js +21 -0
  32. package/dist/.export.js.map +1 -0
  33. package/dist/accessPolicy.d.ts +169 -0
  34. package/dist/accessPolicy.d.ts.map +1 -0
  35. package/dist/accessPolicy.js.map +1 -0
  36. package/dist/accessPolicyResolver.d.ts +110 -0
  37. package/dist/accessPolicyResolver.d.ts.map +1 -0
  38. package/dist/accessPolicyResolver.js.map +1 -0
  39. package/dist/accessRules.d.ts +16 -0
  40. package/dist/accessRules.d.ts.map +1 -0
  41. package/dist/accessRules.js.map +1 -0
  42. package/dist/api/.export.d.ts +7 -0
  43. package/dist/api/.export.d.ts.map +1 -0
  44. package/dist/api/.export.js +11 -0
  45. package/dist/api/.export.js.map +1 -0
  46. package/dist/api/accessRuleApiRoutes.d.ts +27 -0
  47. package/dist/api/accessRuleApiRoutes.d.ts.map +1 -0
  48. package/dist/api/accessRuleApiRoutes.js.map +1 -0
  49. package/dist/api/accessRulesApiClient.d.ts +10 -0
  50. package/dist/api/accessRulesApiClient.d.ts.map +1 -0
  51. package/dist/api/accessRulesApiClient.js +38 -0
  52. package/dist/api/accessRulesApiClient.js.map +1 -0
  53. package/dist/api/delete/.export.d.ts +2 -0
  54. package/dist/api/delete/.export.d.ts.map +1 -0
  55. package/dist/api/delete/.export.js +1 -0
  56. package/dist/api/delete/.export.js.map +1 -0
  57. package/dist/api/delete/deleteAllRules.d.ts +11 -0
  58. package/dist/api/delete/deleteAllRules.d.ts.map +1 -0
  59. package/dist/api/delete/deleteAllRules.js +25 -0
  60. package/dist/api/delete/deleteAllRules.js.map +1 -0
  61. package/dist/api/delete/deleteRuleGroups.d.ts +19 -0
  62. package/dist/api/delete/deleteRuleGroups.d.ts.map +1 -0
  63. package/dist/api/delete/deleteRuleGroups.js +52 -0
  64. package/dist/api/delete/deleteRuleGroups.js.map +1 -0
  65. package/dist/api/delete/deleteRules.d.ts +15 -0
  66. package/dist/api/delete/deleteRules.d.ts.map +1 -0
  67. package/dist/api/delete/deleteRules.js +43 -0
  68. package/dist/api/delete/deleteRules.js.map +1 -0
  69. package/dist/api/deleteAllRulesEndpoint.d.ts +12 -0
  70. package/dist/api/deleteAllRulesEndpoint.d.ts.map +1 -0
  71. package/dist/api/deleteAllRulesEndpoint.js.map +1 -0
  72. package/dist/api/deleteRulesEndpoint.d.ts +116 -0
  73. package/dist/api/deleteRulesEndpoint.d.ts.map +1 -0
  74. package/dist/api/deleteRulesEndpoint.js.map +1 -0
  75. package/dist/api/insertRulesEndpoint.d.ts +22 -0
  76. package/dist/api/insertRulesEndpoint.d.ts.map +1 -0
  77. package/dist/api/insertRulesEndpoint.js.map +1 -0
  78. package/dist/api/read/.export.d.ts +4 -0
  79. package/dist/api/read/.export.d.ts.map +1 -0
  80. package/dist/api/read/.export.js +1 -0
  81. package/dist/api/read/.export.js.map +1 -0
  82. package/dist/api/read/fetchRules.d.ts +53 -0
  83. package/dist/api/read/fetchRules.d.ts.map +1 -0
  84. package/dist/api/read/fetchRules.js +43 -0
  85. package/dist/api/read/fetchRules.js.map +1 -0
  86. package/dist/api/read/findRuleIds.d.ts +28 -0
  87. package/dist/api/read/findRuleIds.d.ts.map +1 -0
  88. package/dist/api/read/findRuleIds.js +50 -0
  89. package/dist/api/read/findRuleIds.js.map +1 -0
  90. package/dist/api/read/getMissingIds.d.ts +28 -0
  91. package/dist/api/read/getMissingIds.d.ts.map +1 -0
  92. package/dist/api/read/getMissingIds.js +41 -0
  93. package/dist/api/read/getMissingIds.js.map +1 -0
  94. package/dist/api/ruleApiRoutes.d.ts +43 -0
  95. package/dist/api/ruleApiRoutes.d.ts.map +1 -0
  96. package/dist/api/ruleApiRoutes.js +131 -0
  97. package/dist/api/ruleApiRoutes.js.map +1 -0
  98. package/dist/api/rulesApiClient.d.ts +20 -0
  99. package/dist/api/rulesApiClient.d.ts.map +1 -0
  100. package/dist/api/rulesApiClient.js +93 -0
  101. package/dist/api/rulesApiClient.js.map +1 -0
  102. package/dist/api/write/.export.d.ts +2 -0
  103. package/dist/api/write/.export.d.ts.map +1 -0
  104. package/dist/api/write/.export.js +1 -0
  105. package/dist/api/write/.export.js.map +1 -0
  106. package/dist/api/write/insertRules.d.ts +29 -0
  107. package/dist/api/write/insertRules.d.ts.map +1 -0
  108. package/dist/api/write/insertRules.js +102 -0
  109. package/dist/api/write/insertRules.js.map +1 -0
  110. package/dist/api/write/rehashRules.d.ts +11 -0
  111. package/dist/api/write/rehashRules.d.ts.map +1 -0
  112. package/dist/api/write/rehashRules.js +57 -0
  113. package/dist/api/write/rehashRules.js.map +1 -0
  114. package/dist/cjs/.export.cjs +21 -0
  115. package/dist/cjs/api/.export.cjs +11 -0
  116. package/dist/cjs/api/delete/.export.cjs +1 -0
  117. package/dist/cjs/api/delete/deleteAllRules.cjs +25 -0
  118. package/dist/cjs/api/delete/deleteRuleGroups.cjs +52 -0
  119. package/dist/cjs/api/delete/deleteRules.cjs +43 -0
  120. package/dist/cjs/api/read/.export.cjs +1 -0
  121. package/dist/cjs/api/read/fetchRules.cjs +43 -0
  122. package/dist/cjs/api/read/findRuleIds.cjs +50 -0
  123. package/dist/cjs/api/read/getMissingIds.cjs +41 -0
  124. package/dist/cjs/api/ruleApiRoutes.cjs +131 -0
  125. package/dist/cjs/api/rulesApiClient.cjs +93 -0
  126. package/dist/cjs/api/write/.export.cjs +1 -0
  127. package/dist/cjs/api/write/insertRules.cjs +102 -0
  128. package/dist/cjs/api/write/rehashRules.cjs +57 -0
  129. package/dist/cjs/index.cjs +2 -0
  130. package/dist/cjs/mongoose/.export.cjs +4 -0
  131. package/dist/cjs/mongoose/mongooseRuleSchema.cjs +36 -0
  132. package/dist/cjs/redis/.export.cjs +6 -0
  133. package/dist/cjs/redis/reader/redisAggregate.cjs +60 -0
  134. package/dist/cjs/redis/reader/redisRulesQuery.cjs +99 -0
  135. package/dist/cjs/redis/reader/redisRulesReader.cjs +230 -0
  136. package/dist/cjs/redis/redisAccessRules.cjs +4 -4
  137. package/dist/cjs/redis/redisAccessRulesIndex.cjs +55 -14
  138. package/dist/cjs/redis/redisClient.cjs +67 -0
  139. package/dist/cjs/redis/redisRuleIndex.cjs +50 -0
  140. package/dist/cjs/redis/redisRulesStorage.cjs +34 -0
  141. package/dist/cjs/redis/redisRulesWriter.cjs +100 -0
  142. package/dist/cjs/rule.cjs +8 -0
  143. package/dist/cjs/ruleInput/.export.cjs +9 -0
  144. package/dist/cjs/ruleInput/policyInput.cjs +25 -0
  145. package/dist/cjs/ruleInput/ruleInput.cjs +50 -0
  146. package/dist/cjs/ruleInput/userScopeInput.cjs +55 -0
  147. package/dist/cjs/ruleRecord.cjs +23 -0
  148. package/dist/cjs/rulesStorage.cjs +8 -0
  149. package/dist/cjs/transformRule.cjs +77 -0
  150. package/dist/index.d.ts +15 -0
  151. package/dist/index.d.ts.map +1 -0
  152. package/dist/index.js +7 -3
  153. package/dist/index.js.map +1 -0
  154. package/dist/mongoose/.export.d.ts +2 -0
  155. package/dist/mongoose/.export.d.ts.map +1 -0
  156. package/dist/mongoose/.export.js +4 -0
  157. package/dist/mongoose/.export.js.map +1 -0
  158. package/dist/mongoose/mongooseRuleSchema.d.ts +4 -0
  159. package/dist/mongoose/mongooseRuleSchema.d.ts.map +1 -0
  160. package/dist/mongoose/mongooseRuleSchema.js +36 -0
  161. package/dist/mongoose/mongooseRuleSchema.js.map +1 -0
  162. package/dist/redis/.export.d.ts +3 -0
  163. package/dist/redis/.export.d.ts.map +1 -0
  164. package/dist/redis/.export.js +6 -0
  165. package/dist/redis/.export.js.map +1 -0
  166. package/dist/redis/reader/redisAggregate.d.ts +4 -0
  167. package/dist/redis/reader/redisAggregate.d.ts.map +1 -0
  168. package/dist/redis/reader/redisAggregate.js +60 -0
  169. package/dist/redis/reader/redisAggregate.js.map +1 -0
  170. package/dist/redis/reader/redisRulesQuery.d.ts +4 -0
  171. package/dist/redis/reader/redisRulesQuery.d.ts.map +1 -0
  172. package/dist/redis/reader/redisRulesQuery.js +99 -0
  173. package/dist/redis/reader/redisRulesQuery.js.map +1 -0
  174. package/dist/redis/reader/redisRulesReader.d.ts +26 -0
  175. package/dist/redis/reader/redisRulesReader.d.ts.map +1 -0
  176. package/dist/redis/reader/redisRulesReader.js +213 -0
  177. package/dist/redis/reader/redisRulesReader.js.map +1 -0
  178. package/dist/redis/redisAccessRules.d.ts +7 -0
  179. package/dist/redis/redisAccessRules.d.ts.map +1 -0
  180. package/dist/redis/redisAccessRules.js +112 -128
  181. package/dist/redis/redisAccessRules.js.map +1 -0
  182. package/dist/redis/redisAccessRulesIndex.d.ts +13 -0
  183. package/dist/redis/redisAccessRulesIndex.d.ts.map +1 -0
  184. package/dist/redis/redisAccessRulesIndex.js +122 -112
  185. package/dist/redis/redisAccessRulesIndex.js.map +1 -0
  186. package/dist/redis/redisClient.d.ts +11 -0
  187. package/dist/redis/redisClient.d.ts.map +1 -0
  188. package/dist/redis/redisClient.js +67 -0
  189. package/dist/redis/redisClient.js.map +1 -0
  190. package/dist/redis/redisIndex.d.ts +9 -0
  191. package/dist/redis/redisIndex.d.ts.map +1 -0
  192. package/dist/redis/redisIndex.js +16 -15
  193. package/dist/redis/redisIndex.js.map +1 -0
  194. package/dist/redis/redisRuleIndex.d.ts +13 -0
  195. package/dist/redis/redisRuleIndex.d.ts.map +1 -0
  196. package/dist/redis/redisRuleIndex.js +50 -0
  197. package/dist/redis/redisRuleIndex.js.map +1 -0
  198. package/dist/redis/redisRulesIndex.d.ts +9 -0
  199. package/dist/redis/redisRulesIndex.d.ts.map +1 -0
  200. package/dist/redis/redisRulesIndex.js +138 -0
  201. package/dist/redis/redisRulesIndex.js.map +1 -0
  202. package/dist/redis/redisRulesReader.d.ts +6 -0
  203. package/dist/redis/redisRulesReader.d.ts.map +1 -0
  204. package/dist/redis/redisRulesReader.js +125 -0
  205. package/dist/redis/redisRulesReader.js.map +1 -0
  206. package/dist/redis/redisRulesStorage.d.ts +5 -0
  207. package/dist/redis/redisRulesStorage.d.ts.map +1 -0
  208. package/dist/redis/redisRulesStorage.js +34 -0
  209. package/dist/redis/redisRulesStorage.js.map +1 -0
  210. package/dist/redis/redisRulesWriter.d.ts +22 -0
  211. package/dist/redis/redisRulesWriter.d.ts.map +1 -0
  212. package/dist/redis/redisRulesWriter.js +100 -0
  213. package/dist/redis/redisRulesWriter.js.map +1 -0
  214. package/dist/rule.d.ts +34 -0
  215. package/dist/rule.d.ts.map +1 -0
  216. package/dist/rule.js +8 -0
  217. package/dist/rule.js.map +1 -0
  218. package/dist/ruleInput/.export.d.ts +4 -0
  219. package/dist/ruleInput/.export.d.ts.map +1 -0
  220. package/dist/ruleInput/.export.js +9 -0
  221. package/dist/ruleInput/.export.js.map +1 -0
  222. package/dist/ruleInput/policyInput.d.ts +38 -0
  223. package/dist/ruleInput/policyInput.d.ts.map +1 -0
  224. package/dist/ruleInput/policyInput.js +25 -0
  225. package/dist/ruleInput/policyInput.js.map +1 -0
  226. package/dist/ruleInput/ruleInput.d.ts +145 -0
  227. package/dist/ruleInput/ruleInput.d.ts.map +1 -0
  228. package/dist/ruleInput/ruleInput.js +50 -0
  229. package/dist/ruleInput/ruleInput.js.map +1 -0
  230. package/dist/ruleInput/userScopeInput.d.ts +93 -0
  231. package/dist/ruleInput/userScopeInput.d.ts.map +1 -0
  232. package/dist/ruleInput/userScopeInput.js +55 -0
  233. package/dist/ruleInput/userScopeInput.js.map +1 -0
  234. package/dist/ruleRecord.d.ts +18 -0
  235. package/dist/ruleRecord.d.ts.map +1 -0
  236. package/dist/ruleRecord.js +23 -0
  237. package/dist/ruleRecord.js.map +1 -0
  238. package/dist/rulesStorage.d.ts +30 -0
  239. package/dist/rulesStorage.d.ts.map +1 -0
  240. package/dist/rulesStorage.js +8 -0
  241. package/dist/rulesStorage.js.map +1 -0
  242. package/dist/tests/accessPolicy.test.d.ts +2 -0
  243. package/dist/tests/accessPolicy.test.d.ts.map +1 -0
  244. package/dist/tests/accessPolicy.test.js +27 -0
  245. package/dist/tests/accessPolicy.test.js.map +1 -0
  246. package/dist/tests/redis/reader/redisRulesQuery.unit.test.d.ts +2 -0
  247. package/dist/tests/redis/reader/redisRulesQuery.unit.test.d.ts.map +1 -0
  248. package/dist/tests/redis/reader/redisRulesQuery.unit.test.js +101 -0
  249. package/dist/tests/redis/reader/redisRulesQuery.unit.test.js.map +1 -0
  250. package/dist/tests/redis/redisAccessRules.integration.test.d.ts +2 -0
  251. package/dist/tests/redis/redisAccessRules.integration.test.d.ts.map +1 -0
  252. package/dist/tests/redis/redisAccessRules.integration.test.js +586 -0
  253. package/dist/tests/redis/redisAccessRules.integration.test.js.map +1 -0
  254. package/dist/tests/redis/redisAccessRules.unit.test.d.ts +2 -0
  255. package/dist/tests/redis/redisAccessRules.unit.test.d.ts.map +1 -0
  256. package/dist/tests/redis/redisAccessRules.unit.test.js +198 -0
  257. package/dist/tests/redis/redisAccessRules.unit.test.js.map +1 -0
  258. package/dist/tests/redis/redisIndex.integration.test.d.ts +2 -0
  259. package/dist/tests/redis/redisIndex.integration.test.d.ts.map +1 -0
  260. package/dist/tests/redis/redisIndex.integration.test.js +80 -0
  261. package/dist/tests/redis/redisIndex.integration.test.js.map +1 -0
  262. package/dist/tests/redis/redisRulesIndex.unit.test.d.ts +2 -0
  263. package/dist/tests/redis/redisRulesIndex.unit.test.d.ts.map +1 -0
  264. package/dist/tests/redis/redisRulesIndex.unit.test.js +101 -0
  265. package/dist/tests/redis/redisRulesIndex.unit.test.js.map +1 -0
  266. package/dist/tests/redis/redisRulesStorage.integration.test.d.ts +2 -0
  267. package/dist/tests/redis/redisRulesStorage.integration.test.d.ts.map +1 -0
  268. package/dist/tests/redis/redisRulesStorage.integration.test.js +611 -0
  269. package/dist/tests/redis/redisRulesStorage.integration.test.js.map +1 -0
  270. package/dist/tests/redis/testRedisClient.d.ts +3 -0
  271. package/dist/tests/redis/testRedisClient.d.ts.map +1 -0
  272. package/dist/tests/redis/testRedisClient.js +8 -0
  273. package/dist/tests/redis/testRedisClient.js.map +1 -0
  274. package/dist/tests/testLogger.d.ts +4 -0
  275. package/dist/tests/testLogger.d.ts.map +1 -0
  276. package/dist/tests/testLogger.js +22 -0
  277. package/dist/tests/testLogger.js.map +1 -0
  278. package/dist/tests/transformRule.unit.test.d.ts +2 -0
  279. package/dist/tests/transformRule.unit.test.d.ts.map +1 -0
  280. package/dist/tests/transformRule.unit.test.js +188 -0
  281. package/dist/tests/transformRule.unit.test.js.map +1 -0
  282. package/dist/transformRule.d.ts +7 -0
  283. package/dist/transformRule.d.ts.map +1 -0
  284. package/dist/transformRule.js +77 -0
  285. package/dist/transformRule.js.map +1 -0
  286. package/dist/util.d.ts +2 -0
  287. package/dist/util.d.ts.map +1 -0
  288. package/dist/util.js.map +1 -0
  289. package/entries.ts +20 -0
  290. package/package.json +42 -21
  291. package/vite.cjs.config.ts +4 -1
  292. package/vite.esm.config.ts +6 -1
@@ -0,0 +1,586 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redisAccessRules.integration.test.js","sourceRoot":"","sources":["../../../src/tests/redis/redisAccessRules.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=redisAccessRules.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redisAccessRules.unit.test.d.ts","sourceRoot":"","sources":["../../../src/tests/redis/redisAccessRules.unit.test.ts"],"names":[],"mappings":""}