@prosopo/user-access-policy 3.5.32 → 3.7.11

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