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