@lamalibre/create-lamaste 4.0.0

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 (270) hide show
  1. package/LICENSE.md +118 -0
  2. package/README.md +114 -0
  3. package/bin/create-lamaste.js +15 -0
  4. package/package.json +54 -0
  5. package/scripts/bundle-vendor.js +110 -0
  6. package/scripts/lamaste-cert-info +62 -0
  7. package/scripts/lamaste-certbot +96 -0
  8. package/scripts/lamaste-priv +693 -0
  9. package/src/index.js +646 -0
  10. package/src/lib/accounts.js +86 -0
  11. package/src/lib/binaries.js +137 -0
  12. package/src/lib/cert-help-page.js +160 -0
  13. package/src/lib/env.js +132 -0
  14. package/src/lib/http-redirect.js +38 -0
  15. package/src/lib/ownership.js +231 -0
  16. package/src/lib/relay-services.js +103 -0
  17. package/src/lib/secrets.js +19 -0
  18. package/src/lib/service-config.js +311 -0
  19. package/src/lib/summary.js +131 -0
  20. package/src/lib/wrappers.js +63 -0
  21. package/src/tasks/gatekeeper.js +233 -0
  22. package/src/tasks/harden.js +293 -0
  23. package/src/tasks/mtls.js +193 -0
  24. package/src/tasks/nginx.js +265 -0
  25. package/src/tasks/node.js +110 -0
  26. package/src/tasks/panel.js +408 -0
  27. package/src/tasks/redeploy.js +438 -0
  28. package/vendor/docs/00-introduction/how-it-works.md +447 -0
  29. package/vendor/docs/00-introduction/quickstart.md +472 -0
  30. package/vendor/docs/00-introduction/what-is-lamaste.md +112 -0
  31. package/vendor/docs/01-concepts/authentication.md +464 -0
  32. package/vendor/docs/01-concepts/authorization.md +242 -0
  33. package/vendor/docs/01-concepts/certificates.md +452 -0
  34. package/vendor/docs/01-concepts/dns-and-domains.md +343 -0
  35. package/vendor/docs/01-concepts/mtls.md +490 -0
  36. package/vendor/docs/01-concepts/nginx-reverse-proxy.md +540 -0
  37. package/vendor/docs/01-concepts/security-model.md +600 -0
  38. package/vendor/docs/01-concepts/tickets.md +414 -0
  39. package/vendor/docs/01-concepts/tunneling.md +367 -0
  40. package/vendor/docs/02-guides/agent-setup.md +194 -0
  41. package/vendor/docs/02-guides/certificate-management.md +341 -0
  42. package/vendor/docs/02-guides/cloud-provisioning.md +406 -0
  43. package/vendor/docs/02-guides/desktop-app-setup.md +226 -0
  44. package/vendor/docs/02-guides/disaster-recovery.md +464 -0
  45. package/vendor/docs/02-guides/first-tunnel.md +230 -0
  46. package/vendor/docs/02-guides/installation.md +393 -0
  47. package/vendor/docs/02-guides/managing-users.md +255 -0
  48. package/vendor/docs/02-guides/onboarding.md +244 -0
  49. package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +375 -0
  50. package/vendor/docs/02-guides/static-sites.md +364 -0
  51. package/vendor/docs/03-architecture/e2e-three-vm-sequences.md +457 -0
  52. package/vendor/docs/03-architecture/installer-flow.md +151 -0
  53. package/vendor/docs/03-architecture/installer.md +445 -0
  54. package/vendor/docs/03-architecture/management-flow.md +288 -0
  55. package/vendor/docs/03-architecture/nginx-configuration.md +830 -0
  56. package/vendor/docs/03-architecture/onboarding-flow.md +164 -0
  57. package/vendor/docs/03-architecture/overview.md +541 -0
  58. package/vendor/docs/03-architecture/panel-client.md +416 -0
  59. package/vendor/docs/03-architecture/panel-server.md +695 -0
  60. package/vendor/docs/03-architecture/state-management.md +529 -0
  61. package/vendor/docs/03-architecture/system-overview.md +167 -0
  62. package/vendor/docs/04-api-reference/certificates.md +1141 -0
  63. package/vendor/docs/04-api-reference/gatekeeper.md +592 -0
  64. package/vendor/docs/04-api-reference/onboarding.md +473 -0
  65. package/vendor/docs/04-api-reference/overview.md +404 -0
  66. package/vendor/docs/04-api-reference/services.md +267 -0
  67. package/vendor/docs/04-api-reference/settings.md +343 -0
  68. package/vendor/docs/04-api-reference/sites.md +716 -0
  69. package/vendor/docs/04-api-reference/system.md +268 -0
  70. package/vendor/docs/04-api-reference/tickets.md +618 -0
  71. package/vendor/docs/04-api-reference/tunnels.md +417 -0
  72. package/vendor/docs/04-api-reference/users.md +333 -0
  73. package/vendor/docs/05-operations/backup-and-restore.md +342 -0
  74. package/vendor/docs/05-operations/monitoring.md +285 -0
  75. package/vendor/docs/05-operations/uninstalling.md +344 -0
  76. package/vendor/docs/05-operations/upgrades.md +270 -0
  77. package/vendor/docs/06-reference/config-files.md +1080 -0
  78. package/vendor/docs/06-reference/glossary.md +528 -0
  79. package/vendor/docs/06-reference/installer-flags.md +260 -0
  80. package/vendor/docs/06-reference/ports-and-services.md +244 -0
  81. package/vendor/docs/06-reference/troubleshooting.md +665 -0
  82. package/vendor/docs/_index.json +233 -0
  83. package/vendor/docs/gatekeeper-design.md +953 -0
  84. package/vendor/docs/package.json +15 -0
  85. package/vendor/docs/todo/lib-cli-desktop-refactor.md +641 -0
  86. package/vendor/gatekeeper/dist/boot.d.ts +1 -0
  87. package/vendor/gatekeeper/dist/boot.d.ts.map +1 -0
  88. package/vendor/gatekeeper/dist/boot.js +17 -0
  89. package/vendor/gatekeeper/dist/boot.js.map +1 -0
  90. package/vendor/gatekeeper/dist/cli/commands/access.d.ts +2 -0
  91. package/vendor/gatekeeper/dist/cli/commands/access.d.ts.map +1 -0
  92. package/vendor/gatekeeper/dist/cli/commands/access.js +33 -0
  93. package/vendor/gatekeeper/dist/cli/commands/access.js.map +1 -0
  94. package/vendor/gatekeeper/dist/cli/commands/grants.d.ts +2 -0
  95. package/vendor/gatekeeper/dist/cli/commands/grants.d.ts.map +1 -0
  96. package/vendor/gatekeeper/dist/cli/commands/grants.js +110 -0
  97. package/vendor/gatekeeper/dist/cli/commands/grants.js.map +1 -0
  98. package/vendor/gatekeeper/dist/cli/commands/groups.d.ts +2 -0
  99. package/vendor/gatekeeper/dist/cli/commands/groups.d.ts.map +1 -0
  100. package/vendor/gatekeeper/dist/cli/commands/groups.js +98 -0
  101. package/vendor/gatekeeper/dist/cli/commands/groups.js.map +1 -0
  102. package/vendor/gatekeeper/dist/cli/index.d.ts +3 -0
  103. package/vendor/gatekeeper/dist/cli/index.d.ts.map +1 -0
  104. package/vendor/gatekeeper/dist/cli/index.js +45 -0
  105. package/vendor/gatekeeper/dist/cli/index.js.map +1 -0
  106. package/vendor/gatekeeper/dist/index.d.ts +9 -0
  107. package/vendor/gatekeeper/dist/index.d.ts.map +1 -0
  108. package/vendor/gatekeeper/dist/index.js +13 -0
  109. package/vendor/gatekeeper/dist/index.js.map +1 -0
  110. package/vendor/gatekeeper/dist/lib/authz.d.ts +16 -0
  111. package/vendor/gatekeeper/dist/lib/authz.d.ts.map +1 -0
  112. package/vendor/gatekeeper/dist/lib/authz.js +42 -0
  113. package/vendor/gatekeeper/dist/lib/authz.js.map +1 -0
  114. package/vendor/gatekeeper/dist/lib/cache-bust.d.ts +15 -0
  115. package/vendor/gatekeeper/dist/lib/cache-bust.d.ts.map +1 -0
  116. package/vendor/gatekeeper/dist/lib/cache-bust.js +19 -0
  117. package/vendor/gatekeeper/dist/lib/cache-bust.js.map +1 -0
  118. package/vendor/gatekeeper/dist/lib/constants.d.ts +82 -0
  119. package/vendor/gatekeeper/dist/lib/constants.d.ts.map +1 -0
  120. package/vendor/gatekeeper/dist/lib/constants.js +79 -0
  121. package/vendor/gatekeeper/dist/lib/constants.js.map +1 -0
  122. package/vendor/gatekeeper/dist/lib/grants.d.ts +32 -0
  123. package/vendor/gatekeeper/dist/lib/grants.d.ts.map +1 -0
  124. package/vendor/gatekeeper/dist/lib/grants.js +314 -0
  125. package/vendor/gatekeeper/dist/lib/grants.js.map +1 -0
  126. package/vendor/gatekeeper/dist/lib/groups.d.ts +10 -0
  127. package/vendor/gatekeeper/dist/lib/groups.d.ts.map +1 -0
  128. package/vendor/gatekeeper/dist/lib/groups.js +247 -0
  129. package/vendor/gatekeeper/dist/lib/groups.js.map +1 -0
  130. package/vendor/gatekeeper/dist/lib/migration.d.ts +17 -0
  131. package/vendor/gatekeeper/dist/lib/migration.d.ts.map +1 -0
  132. package/vendor/gatekeeper/dist/lib/migration.js +79 -0
  133. package/vendor/gatekeeper/dist/lib/migration.js.map +1 -0
  134. package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0001_groups.sql +7 -0
  135. package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0002_access_grants.sql +14 -0
  136. package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0003_access_request_log.sql +9 -0
  137. package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0001_groups.sql +7 -0
  138. package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0002_access_grants.sql +14 -0
  139. package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0003_access_request_log.sql +9 -0
  140. package/vendor/gatekeeper/dist/lib/state-db.d.ts +16 -0
  141. package/vendor/gatekeeper/dist/lib/state-db.d.ts.map +1 -0
  142. package/vendor/gatekeeper/dist/lib/state-db.js +154 -0
  143. package/vendor/gatekeeper/dist/lib/state-db.js.map +1 -0
  144. package/vendor/gatekeeper/dist/lib/templates.d.ts +21 -0
  145. package/vendor/gatekeeper/dist/lib/templates.d.ts.map +1 -0
  146. package/vendor/gatekeeper/dist/lib/templates.js +151 -0
  147. package/vendor/gatekeeper/dist/lib/templates.js.map +1 -0
  148. package/vendor/gatekeeper/dist/lib/types.d.ts +178 -0
  149. package/vendor/gatekeeper/dist/lib/types.d.ts.map +1 -0
  150. package/vendor/gatekeeper/dist/lib/types.js +2 -0
  151. package/vendor/gatekeeper/dist/lib/types.js.map +1 -0
  152. package/vendor/gatekeeper/dist/server/index.d.ts +15 -0
  153. package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -0
  154. package/vendor/gatekeeper/dist/server/index.js +251 -0
  155. package/vendor/gatekeeper/dist/server/index.js.map +1 -0
  156. package/vendor/gatekeeper/dist/server/routes/access-request.d.ts +7 -0
  157. package/vendor/gatekeeper/dist/server/routes/access-request.d.ts.map +1 -0
  158. package/vendor/gatekeeper/dist/server/routes/access-request.js +17 -0
  159. package/vendor/gatekeeper/dist/server/routes/access-request.js.map +1 -0
  160. package/vendor/gatekeeper/dist/server/routes/authz.d.ts +3 -0
  161. package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -0
  162. package/vendor/gatekeeper/dist/server/routes/authz.js +279 -0
  163. package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -0
  164. package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts +13 -0
  165. package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts.map +1 -0
  166. package/vendor/gatekeeper/dist/server/routes/diagnostic.js +249 -0
  167. package/vendor/gatekeeper/dist/server/routes/diagnostic.js.map +1 -0
  168. package/vendor/gatekeeper/dist/server/routes/grants.d.ts +3 -0
  169. package/vendor/gatekeeper/dist/server/routes/grants.d.ts.map +1 -0
  170. package/vendor/gatekeeper/dist/server/routes/grants.js +112 -0
  171. package/vendor/gatekeeper/dist/server/routes/grants.js.map +1 -0
  172. package/vendor/gatekeeper/dist/server/routes/groups.d.ts +3 -0
  173. package/vendor/gatekeeper/dist/server/routes/groups.d.ts.map +1 -0
  174. package/vendor/gatekeeper/dist/server/routes/groups.js +139 -0
  175. package/vendor/gatekeeper/dist/server/routes/groups.js.map +1 -0
  176. package/vendor/gatekeeper/package.json +49 -0
  177. package/vendor/server/bin/lamaste-server.js +204 -0
  178. package/vendor/server/package.json +31 -0
  179. package/vendor/server/src/commands/certs.js +224 -0
  180. package/vendor/server/src/commands/chisel.js +132 -0
  181. package/vendor/server/src/commands/logs.js +49 -0
  182. package/vendor/server/src/commands/plugins.js +321 -0
  183. package/vendor/server/src/commands/reset-admin.js +478 -0
  184. package/vendor/server/src/commands/restart.js +94 -0
  185. package/vendor/server/src/commands/sites.js +257 -0
  186. package/vendor/server/src/commands/status.js +158 -0
  187. package/vendor/server/src/commands/tunnels.js +365 -0
  188. package/vendor/server/src/commands/uninstall.js +326 -0
  189. package/vendor/server/src/config.js +38 -0
  190. package/vendor/server/src/exec.js +26 -0
  191. package/vendor/server/src/logger.js +39 -0
  192. package/vendor/server/src/ndjson.js +56 -0
  193. package/vendor/server/src/panel-api.js +85 -0
  194. package/vendor/server/src/state.js +45 -0
  195. package/vendor/server-ui/dist/assets/index-B0nWuUyL.js +257 -0
  196. package/vendor/server-ui/dist/assets/index-BqWWFlTU.css +1 -0
  197. package/vendor/server-ui/dist/index.html +13 -0
  198. package/vendor/serverd/package.json +44 -0
  199. package/vendor/serverd/src/boot.js +13 -0
  200. package/vendor/serverd/src/index.js +191 -0
  201. package/vendor/serverd/src/lib/app-error.js +14 -0
  202. package/vendor/serverd/src/lib/authelia.js +85 -0
  203. package/vendor/serverd/src/lib/certbot.js +74 -0
  204. package/vendor/serverd/src/lib/chisel-args.js +6 -0
  205. package/vendor/serverd/src/lib/chisel-reconcile.js +232 -0
  206. package/vendor/serverd/src/lib/chisel-runtime.js +46 -0
  207. package/vendor/serverd/src/lib/chisel-users.js +109 -0
  208. package/vendor/serverd/src/lib/chisel.js +81 -0
  209. package/vendor/serverd/src/lib/config.js +190 -0
  210. package/vendor/serverd/src/lib/constants.js +8 -0
  211. package/vendor/serverd/src/lib/csr-signing.js +331 -0
  212. package/vendor/serverd/src/lib/enrollment.js +302 -0
  213. package/vendor/serverd/src/lib/files.js +19 -0
  214. package/vendor/serverd/src/lib/gatekeeper-client.js +135 -0
  215. package/vendor/serverd/src/lib/invite-page.js +281 -0
  216. package/vendor/serverd/src/lib/ip-utils.js +79 -0
  217. package/vendor/serverd/src/lib/migrations/state/0001_enrollment_tokens.sql +17 -0
  218. package/vendor/serverd/src/lib/migrations/state/0002_tickets.sql +70 -0
  219. package/vendor/serverd/src/lib/migrations/state/0003_plugins.sql +15 -0
  220. package/vendor/serverd/src/lib/migrations/state/0004_agents.sql +19 -0
  221. package/vendor/serverd/src/lib/mtls.js +795 -0
  222. package/vendor/serverd/src/lib/nginx.js +1090 -0
  223. package/vendor/serverd/src/lib/pki-paths.js +41 -0
  224. package/vendor/serverd/src/lib/pki-sign.js +103 -0
  225. package/vendor/serverd/src/lib/plugins.js +538 -0
  226. package/vendor/serverd/src/lib/push-install.js +390 -0
  227. package/vendor/serverd/src/lib/revocation.js +112 -0
  228. package/vendor/serverd/src/lib/services.js +131 -0
  229. package/vendor/serverd/src/lib/session.js +151 -0
  230. package/vendor/serverd/src/lib/state-db.js +130 -0
  231. package/vendor/serverd/src/lib/state.js +140 -0
  232. package/vendor/serverd/src/lib/storage.js +63 -0
  233. package/vendor/serverd/src/lib/system-stats.js +58 -0
  234. package/vendor/serverd/src/lib/tickets.js +1556 -0
  235. package/vendor/serverd/src/lib/totp.js +76 -0
  236. package/vendor/serverd/src/lib/tunnel-deps.js +41 -0
  237. package/vendor/serverd/src/lib/user-access-session.js +142 -0
  238. package/vendor/serverd/src/lib/user-access.js +52 -0
  239. package/vendor/serverd/src/middleware/errors.js +63 -0
  240. package/vendor/serverd/src/middleware/mtls.js +120 -0
  241. package/vendor/serverd/src/middleware/onboarding-guard.js +30 -0
  242. package/vendor/serverd/src/middleware/role-guard.js +58 -0
  243. package/vendor/serverd/src/middleware/twofa-session.js +65 -0
  244. package/vendor/serverd/src/middleware/user-access-session.js +52 -0
  245. package/vendor/serverd/src/routes/enrollment.js +120 -0
  246. package/vendor/serverd/src/routes/health.js +22 -0
  247. package/vendor/serverd/src/routes/invite.js +163 -0
  248. package/vendor/serverd/src/routes/management/agents.js +182 -0
  249. package/vendor/serverd/src/routes/management/certs.js +911 -0
  250. package/vendor/serverd/src/routes/management/gatekeeper-proxy.js +160 -0
  251. package/vendor/serverd/src/routes/management/identity.js +107 -0
  252. package/vendor/serverd/src/routes/management/invitations.js +166 -0
  253. package/vendor/serverd/src/routes/management/logs.js +218 -0
  254. package/vendor/serverd/src/routes/management/plugins.js +560 -0
  255. package/vendor/serverd/src/routes/management/services.js +63 -0
  256. package/vendor/serverd/src/routes/management/settings.js +325 -0
  257. package/vendor/serverd/src/routes/management/sites.js +522 -0
  258. package/vendor/serverd/src/routes/management/storage.js +192 -0
  259. package/vendor/serverd/src/routes/management/system.js +201 -0
  260. package/vendor/serverd/src/routes/management/tickets.js +457 -0
  261. package/vendor/serverd/src/routes/management/tunnels.js +709 -0
  262. package/vendor/serverd/src/routes/management/users.js +377 -0
  263. package/vendor/serverd/src/routes/management.js +36 -0
  264. package/vendor/serverd/src/routes/onboarding/dns.js +101 -0
  265. package/vendor/serverd/src/routes/onboarding/domain.js +42 -0
  266. package/vendor/serverd/src/routes/onboarding/index.js +18 -0
  267. package/vendor/serverd/src/routes/onboarding/provision.js +327 -0
  268. package/vendor/serverd/src/routes/onboarding/status.js +12 -0
  269. package/vendor/serverd/src/routes/plugin-router.js +79 -0
  270. package/vendor/serverd/src/routes/user-access.js +389 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Principal types for grants.
3
+ */
4
+ export const PRINCIPAL_TYPES = ['user', 'group'];
5
+ /**
6
+ * Built-in resource types. The grant system is extensible — new resource types
7
+ * can be added without schema changes.
8
+ */
9
+ export const RESOURCE_TYPES = ['tunnel', 'plugin'];
10
+ /**
11
+ * Tunnel access modes.
12
+ */
13
+ export const ACCESS_MODES = ['public', 'authenticated', 'restricted'];
14
+ /**
15
+ * Reserved Authelia group names (identity tier). These cannot be used as
16
+ * Lamaste group names to avoid confusion between the two group systems.
17
+ */
18
+ export const RESERVED_GROUP_NAMES = ['admins', 'internal', 'external'];
19
+ /**
20
+ * Hard cap on Lamaste groups (DoS protection).
21
+ */
22
+ export const MAX_GROUPS = 200;
23
+ /**
24
+ * Hard cap on grants (DoS protection).
25
+ */
26
+ export const MAX_GRANTS = 1000;
27
+ /**
28
+ * Hard cap on members per group (DoS protection).
29
+ */
30
+ export const MAX_MEMBERS_PER_GROUP = 1000;
31
+ /**
32
+ * Consumed grant retention period (90 days in ms).
33
+ * Grants older than this are pruned during write operations.
34
+ */
35
+ export const GRANT_RETENTION_MS = 90 * 24 * 60 * 60 * 1000;
36
+ /**
37
+ * Gatekeeper in-memory session cache TTL (30 seconds in ms).
38
+ */
39
+ export const SESSION_CACHE_TTL_MS = 30 * 1000;
40
+ /**
41
+ * Group name validation regex: lowercase alphanumeric + hyphens,
42
+ * cannot start or end with a hyphen, 2-63 chars.
43
+ */
44
+ export const GROUP_NAME_REGEX = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;
45
+ /**
46
+ * Maximum group name length.
47
+ */
48
+ export const MAX_GROUP_NAME_LENGTH = 63;
49
+ /**
50
+ * Minimum group name length.
51
+ */
52
+ export const MIN_GROUP_NAME_LENGTH = 2;
53
+ /**
54
+ * Default data directory path.
55
+ */
56
+ export const DEFAULT_DATA_DIR = '/etc/lamalibre/lamaste';
57
+ /**
58
+ * State file names.
59
+ */
60
+ export const GROUPS_FILE = 'groups.json';
61
+ export const GRANTS_FILE = 'access-grants.json';
62
+ export const SETTINGS_FILE = 'gatekeeper.json';
63
+ export const ACCESS_LOG_FILE = 'access-request-log.json';
64
+ /**
65
+ * Authelia verify endpoint (localhost).
66
+ *
67
+ * We call the nginx-flavored `/api/authz/auth-request` endpoint because we
68
+ * forward the origin request as `X-Original-URL` (+ `X-Original-Method`), the
69
+ * header contract that endpoint expects. The `/api/authz/forward-auth`
70
+ * endpoint is for Traefik-style callers that send `X-Forwarded-Host` /
71
+ * `X-Forwarded-Uri` and errors out with "missing host value" when given
72
+ * `X-Original-URL` — which was the prior default here.
73
+ */
74
+ export const AUTHELIA_VERIFY_URL = 'http://127.0.0.1:9091/api/authz/auth-request';
75
+ /**
76
+ * Gatekeeper service port.
77
+ */
78
+ export const GATEKEEPER_PORT = 9294;
79
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAU,CAAC;AAG1D;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAG5D;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,CAAU,CAAC;AAG/E;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAE9B;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC;AAE/B;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAEzD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,8CAA8C,CAAC;AAElF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Grant, GrantState, CreateGrantOptions, GrantFilter } from './types.js';
2
+ export declare function createGrant(options: CreateGrantOptions, initialState?: {
3
+ used?: boolean;
4
+ createdAt?: string;
5
+ usedAt?: string | null;
6
+ }): Promise<Grant>;
7
+ export declare function listGrants(filter?: GrantFilter): Promise<readonly Grant[]>;
8
+ export declare function getGrant(grantId: string): Promise<Grant | null>;
9
+ export declare function revokeGrant(grantId: string): Promise<Grant>;
10
+ /**
11
+ * Remove all grants matching a filter predicate.
12
+ * Used by groups.ts for cascading deletes/renames — serialized via grantLock.
13
+ */
14
+ export declare function removeGrantsByPredicate(predicate: (g: GrantState) => boolean): Promise<number>;
15
+ /**
16
+ * Remove all grants belonging to a specific principal (user or group).
17
+ *
18
+ * Used by the panel server when a user is deleted from Authelia, to cascade
19
+ * the deletion across gatekeeper grants. Serialized via grantLock.
20
+ *
21
+ * @param principalType - 'user' or 'group'
22
+ * @param principalId - The principal's identifier (username or group name)
23
+ * @returns Number of grants removed
24
+ */
25
+ export declare function removeGrantsByPrincipal(principalType: 'user' | 'group', principalId: string): Promise<number>;
26
+ /**
27
+ * Update grants matching a filter predicate.
28
+ * Used by groups.ts for cascading renames — serialized via grantLock.
29
+ */
30
+ export declare function updateGrantsByPredicate(predicate: (g: GrantState) => boolean, updater: (g: GrantState) => void): Promise<number>;
31
+ export declare function consumeGrant(grantId: string, username: string): Promise<Grant>;
32
+ //# sourceMappingURL=grants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/lib/grants.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA+IrF,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,EAC3B,YAAY,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC5E,OAAO,CAAC,KAAK,CAAC,CAmEhB;AAED,wBAAsB,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC,CAkBhF;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAIrE;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAiCjE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,OAAO,GACpC,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,GAAG,OAAO,EAC/B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,OAAO,EACrC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAC/B,OAAO,CAAC,MAAM,CAAC,CA+CjB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAgCpF"}
@@ -0,0 +1,314 @@
1
+ import crypto from 'node:crypto';
2
+ import { PromiseChainMutex } from '@lamalibre/lamaste';
3
+ import { MAX_GRANTS, GRANT_RETENTION_MS } from './constants.js';
4
+ import { notifyCacheInvalidated } from './cache-bust.js';
5
+ import { getGatekeeperDb } from './state-db.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Promise-chain mutex (preserved from JSON era)
8
+ //
9
+ // SQLite's BEGIN IMMEDIATE serialises writers, but several public exports
10
+ // (createGrant with prune, consumeGrant with belongs-to check) are
11
+ // read-modify-write sequences whose JSON-era atomicity came from this lock.
12
+ // Drop as a follow-up after Step 4 (rodeo) lands.
13
+ // ---------------------------------------------------------------------------
14
+ const grantMutex = new PromiseChainMutex();
15
+ function withGrantLock(fn) {
16
+ return grantMutex.run(fn);
17
+ }
18
+ let stmts = null;
19
+ async function getStmts() {
20
+ if (stmts)
21
+ return stmts;
22
+ const db = await getGatekeeperDb();
23
+ stmts = {
24
+ selectAll: db.prepare('SELECT * FROM access_grants ORDER BY created_at'),
25
+ selectById: db.prepare('SELECT * FROM access_grants WHERE grant_id = ?'),
26
+ countAll: db.prepare('SELECT COUNT(*) AS n FROM access_grants'),
27
+ insert: db.prepare(`
28
+ INSERT INTO access_grants
29
+ (grant_id, principal_type, principal_id, resource_type, resource_id, context, used, created_at, used_at)
30
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
31
+ `),
32
+ markUsed: db.prepare('UPDATE access_grants SET used = 1, used_at = ? WHERE grant_id = ?'),
33
+ deleteById: db.prepare('DELETE FROM access_grants WHERE grant_id = ?'),
34
+ // Retention sweep: prune consumed grants past GRANT_RETENTION_MS. The
35
+ // matching index (idx_grants_used_used_at) covers the predicate.
36
+ deleteConsumedBefore: db.prepare('DELETE FROM access_grants WHERE used = 1 AND used_at IS NOT NULL AND used_at < ?'),
37
+ begin: db.prepare('BEGIN IMMEDIATE'),
38
+ commit: db.prepare('COMMIT'),
39
+ rollback: db.prepare('ROLLBACK'),
40
+ };
41
+ return stmts;
42
+ }
43
+ function rowToGrant(row) {
44
+ return {
45
+ grantId: row.grant_id,
46
+ principalType: row.principal_type,
47
+ principalId: row.principal_id,
48
+ resourceType: row.resource_type,
49
+ resourceId: row.resource_id,
50
+ context: JSON.parse(row.context),
51
+ used: row.used === 1,
52
+ createdAt: row.created_at,
53
+ usedAt: row.used_at,
54
+ };
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Internal helpers
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Prune consumed grants older than the retention period. Replaces the
61
+ * JSON-era `pruneStaleGrants` array filter — the SQL DELETE is now driven
62
+ * by `idx_grants_used_used_at`, but the call sites (every write operation)
63
+ * remain the same.
64
+ */
65
+ function pruneStaleGrants(s) {
66
+ const cutoff = new Date(Date.now() - GRANT_RETENTION_MS).toISOString();
67
+ s.deleteConsumedBefore.run(cutoff);
68
+ }
69
+ /**
70
+ * Check if a grant should be auto-consumed on creation.
71
+ * Tunnel grants and agent-side plugin grants are auto-consumed.
72
+ * Local plugin grants start unused (consumed on enrollment).
73
+ */
74
+ function shouldAutoConsume(options) {
75
+ if (options.resourceType === 'tunnel')
76
+ return true;
77
+ if (options.resourceType === 'plugin') {
78
+ const target = options.context?.['target'] ?? 'local';
79
+ return target.startsWith('agent:');
80
+ }
81
+ return true;
82
+ }
83
+ /**
84
+ * Check if two grants are duplicates (same principal + resource + context).
85
+ */
86
+ function isDuplicate(a, b) {
87
+ if (a.principalType !== b.principalType)
88
+ return false;
89
+ if (a.principalId !== b.principalId)
90
+ return false;
91
+ if (a.resourceType !== b.resourceType)
92
+ return false;
93
+ if (a.resourceId !== b.resourceId)
94
+ return false;
95
+ const aCtx = JSON.stringify(a.context ?? {});
96
+ const bCtx = JSON.stringify(b.context ?? {});
97
+ return aCtx === bCtx;
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Public API — signatures preserved byte-identical to the JSON-backed version
101
+ // ---------------------------------------------------------------------------
102
+ export async function createGrant(options, initialState) {
103
+ return withGrantLock(async () => {
104
+ const s = await getStmts();
105
+ // Prune stale grants on every write operation (matches JSON-era cadence).
106
+ pruneStaleGrants(s);
107
+ const countRow = s.countAll.get();
108
+ if (countRow.n >= MAX_GRANTS) {
109
+ throw Object.assign(new Error(`Maximum number of grants (${MAX_GRANTS}) reached`), {
110
+ statusCode: 503,
111
+ });
112
+ }
113
+ // Reject duplicates — same scan as the JSON era over the full table.
114
+ // Index-friendly tightening (e.g. idx_grants_principal + resource pre-
115
+ // filter) is a Step 4+ optimisation; not changing semantics here.
116
+ const allRows = s.selectAll.all();
117
+ const all = allRows.map(rowToGrant);
118
+ if (all.some((g) => isDuplicate(g, options))) {
119
+ throw Object.assign(new Error('Duplicate grant: a grant with the same principal, resource, and context already exists'), { statusCode: 409 });
120
+ }
121
+ const now = new Date().toISOString();
122
+ const used = initialState?.used ?? shouldAutoConsume(options);
123
+ const createdAt = initialState?.createdAt ?? now;
124
+ const usedAt = initialState?.usedAt !== undefined ? initialState.usedAt : used ? now : null;
125
+ const grant = {
126
+ grantId: crypto.randomUUID(),
127
+ principalType: options.principalType,
128
+ principalId: options.principalId,
129
+ resourceType: options.resourceType,
130
+ resourceId: options.resourceId,
131
+ context: options.context ?? {},
132
+ used,
133
+ createdAt,
134
+ usedAt,
135
+ };
136
+ s.begin.run();
137
+ try {
138
+ s.insert.run(grant.grantId, grant.principalType, grant.principalId, grant.resourceType, grant.resourceId, JSON.stringify(grant.context), grant.used ? 1 : 0, grant.createdAt, grant.usedAt);
139
+ s.commit.run();
140
+ }
141
+ catch (err) {
142
+ s.rollback.run();
143
+ throw err;
144
+ }
145
+ notifyCacheInvalidated();
146
+ return grant;
147
+ });
148
+ }
149
+ export async function listGrants(filter) {
150
+ const s = await getStmts();
151
+ const rows = s.selectAll.all();
152
+ let grants = rows.map(rowToGrant);
153
+ if (filter) {
154
+ grants = grants.filter((g) => {
155
+ if (filter.principalType !== undefined && g.principalType !== filter.principalType)
156
+ return false;
157
+ if (filter.principalId !== undefined && g.principalId !== filter.principalId)
158
+ return false;
159
+ if (filter.resourceType !== undefined && g.resourceType !== filter.resourceType)
160
+ return false;
161
+ if (filter.resourceId !== undefined && g.resourceId !== filter.resourceId)
162
+ return false;
163
+ if (filter.used !== undefined && g.used !== filter.used)
164
+ return false;
165
+ return true;
166
+ });
167
+ }
168
+ return grants;
169
+ }
170
+ export async function getGrant(grantId) {
171
+ const s = await getStmts();
172
+ const row = s.selectById.get(grantId);
173
+ return row ? rowToGrant(row) : null;
174
+ }
175
+ export async function revokeGrant(grantId) {
176
+ return withGrantLock(async () => {
177
+ const s = await getStmts();
178
+ const row = s.selectById.get(grantId);
179
+ if (!row) {
180
+ throw Object.assign(new Error('Grant not found'), { statusCode: 404 });
181
+ }
182
+ const grant = rowToGrant(row);
183
+ // Local plugin grants: only revocable if unused
184
+ if (grant.resourceType === 'plugin' &&
185
+ grant.context?.['target'] === 'local' &&
186
+ grant.used) {
187
+ throw Object.assign(new Error('Cannot revoke a consumed local plugin grant'), {
188
+ statusCode: 409,
189
+ });
190
+ }
191
+ s.begin.run();
192
+ try {
193
+ s.deleteById.run(grantId);
194
+ s.commit.run();
195
+ }
196
+ catch (err) {
197
+ s.rollback.run();
198
+ throw err;
199
+ }
200
+ notifyCacheInvalidated();
201
+ return grant;
202
+ });
203
+ }
204
+ /**
205
+ * Remove all grants matching a filter predicate.
206
+ * Used by groups.ts for cascading deletes/renames — serialized via grantLock.
207
+ */
208
+ export async function removeGrantsByPredicate(predicate) {
209
+ return withGrantLock(async () => {
210
+ const s = await getStmts();
211
+ const rows = s.selectAll.all();
212
+ const all = rows.map(rowToGrant);
213
+ const toRemove = all.filter(predicate);
214
+ if (toRemove.length === 0)
215
+ return 0;
216
+ s.begin.run();
217
+ try {
218
+ for (const g of toRemove) {
219
+ s.deleteById.run(g.grantId);
220
+ }
221
+ s.commit.run();
222
+ }
223
+ catch (err) {
224
+ s.rollback.run();
225
+ throw err;
226
+ }
227
+ notifyCacheInvalidated();
228
+ return toRemove.length;
229
+ });
230
+ }
231
+ /**
232
+ * Remove all grants belonging to a specific principal (user or group).
233
+ *
234
+ * Used by the panel server when a user is deleted from Authelia, to cascade
235
+ * the deletion across gatekeeper grants. Serialized via grantLock.
236
+ *
237
+ * @param principalType - 'user' or 'group'
238
+ * @param principalId - The principal's identifier (username or group name)
239
+ * @returns Number of grants removed
240
+ */
241
+ export async function removeGrantsByPrincipal(principalType, principalId) {
242
+ return removeGrantsByPredicate((g) => g.principalType === principalType && g.principalId === principalId);
243
+ }
244
+ /**
245
+ * Update grants matching a filter predicate.
246
+ * Used by groups.ts for cascading renames — serialized via grantLock.
247
+ */
248
+ export async function updateGrantsByPredicate(predicate, updater) {
249
+ return withGrantLock(async () => {
250
+ const s = await getStmts();
251
+ const rows = s.selectAll.all();
252
+ const all = rows.map(rowToGrant);
253
+ let updated = 0;
254
+ const mutated = [];
255
+ for (const grant of all) {
256
+ if (predicate(grant)) {
257
+ updater(grant);
258
+ mutated.push(grant);
259
+ updated++;
260
+ }
261
+ }
262
+ if (updated === 0)
263
+ return 0;
264
+ s.begin.run();
265
+ try {
266
+ // The legacy updater closure mutates principalId / context fields in
267
+ // place. Persist whatever the closure changed by re-inserting the row
268
+ // (delete + insert keeps the prepared-statement bundle small and
269
+ // avoids needing a generic UPDATE for every column permutation).
270
+ for (const g of mutated) {
271
+ s.deleteById.run(g.grantId);
272
+ s.insert.run(g.grantId, g.principalType, g.principalId, g.resourceType, g.resourceId, JSON.stringify(g.context), g.used ? 1 : 0, g.createdAt, g.usedAt);
273
+ }
274
+ s.commit.run();
275
+ }
276
+ catch (err) {
277
+ s.rollback.run();
278
+ throw err;
279
+ }
280
+ notifyCacheInvalidated();
281
+ return updated;
282
+ });
283
+ }
284
+ export async function consumeGrant(grantId, username) {
285
+ return withGrantLock(async () => {
286
+ const s = await getStmts();
287
+ const row = s.selectById.get(grantId);
288
+ if (!row) {
289
+ throw Object.assign(new Error('Grant not found'), { statusCode: 404 });
290
+ }
291
+ const grant = rowToGrant(row);
292
+ if (grant.principalType !== 'user' || grant.principalId !== username) {
293
+ throw Object.assign(new Error('Grant does not belong to this user'), { statusCode: 403 });
294
+ }
295
+ if (grant.used) {
296
+ throw Object.assign(new Error('Grant has already been consumed'), { statusCode: 409 });
297
+ }
298
+ const usedAt = new Date().toISOString();
299
+ s.begin.run();
300
+ try {
301
+ s.markUsed.run(usedAt, grantId);
302
+ s.commit.run();
303
+ }
304
+ catch (err) {
305
+ s.rollback.run();
306
+ throw err;
307
+ }
308
+ grant.used = true;
309
+ grant.usedAt = usedAt;
310
+ notifyCacheInvalidated();
311
+ return grant;
312
+ });
313
+ }
314
+ //# sourceMappingURL=grants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/lib/grants.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKhD,8EAA8E;AAC9E,gDAAgD;AAChD,EAAE;AACF,0EAA0E;AAC1E,mEAAmE;AACnE,4EAA4E;AAC5E,kDAAkD;AAClD,8EAA8E;AAE9E,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAE3C,SAAS,aAAa,CAAI,EAAoB;IAC5C,OAAO,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC5B,CAAC;AAmBD,IAAI,KAAK,GAAsB,IAAI,CAAC;AAEpC,KAAK,UAAU,QAAQ;IACrB,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IAEnC,KAAK,GAAG;QACN,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC;QACxE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC;QACxE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC;QAC/D,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;;;KAIlB,CAAC;QACF,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC;QACzF,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC;QACtE,sEAAsE;QACtE,iEAAiE;QACjE,oBAAoB,EAAE,EAAE,CAAC,OAAO,CAC9B,kFAAkF,CACnF;QACD,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACpC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5B,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;KACjC,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAkBD,SAAS,UAAU,CAAC,GAAa;IAC/B,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,aAAa,EAAE,GAAG,CAAC,cAA+B;QAClD,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA4B;QAC3D,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC;QACpB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,MAAM,EAAE,GAAG,CAAC,OAAO;KACpB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,CAAa;IACrC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,OAA2B;IACpD,IAAI,OAAO,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,MAAM,GAAI,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAY,IAAI,OAAO,CAAC;QAClE,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,CAAa,EAAE,CAAqB;IACvD,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAEhD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC7C,OAAO,IAAI,KAAK,IAAI,CAAC;AACvB,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B,EAC3B,YAA6E;IAE7E,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;QAE3B,0EAA0E;QAC1E,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAEpB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAmB,CAAC;QACnD,IAAI,QAAQ,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,UAAU,WAAW,CAAC,EAAE;gBACjF,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QAED,qEAAqE;QACrE,uEAAuE;QACvE,kEAAkE;QAClE,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,EAA2B,CAAC;QAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CACP,wFAAwF,CACzF,EACD,EAAE,UAAU,EAAE,GAAG,EAAE,CACpB,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,YAAY,EAAE,SAAS,IAAI,GAAG,CAAC;QACjD,MAAM,MAAM,GAAG,YAAY,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAE5F,MAAM,KAAK,GAAe;YACxB,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE;YAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,IAAI;YACJ,SAAS;YACT,MAAM;SACP,CAAC;QAEF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC;YACH,CAAC,CAAC,MAAM,CAAC,GAAG,CACV,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,UAAU,EAChB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAC7B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAClB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,MAAM,CACb,CAAC;YACF,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,sBAAsB,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAoB;IACnD,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,EAA2B,CAAC;IACxD,IAAI,MAAM,GAAiB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,aAAa;gBAChF,OAAO,KAAK,CAAC;YACf,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAC;YAC3F,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY;gBAAE,OAAO,KAAK,CAAC;YAC9F,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;YACxF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe;IAC5C,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAyB,CAAC;IAC9D,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAyB,CAAC;QAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAE9B,gDAAgD;QAChD,IACE,KAAK,CAAC,YAAY,KAAK,QAAQ;YAC9B,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAY,KAAK,OAAO;YACjD,KAAK,CAAC,IAAI,EACV,CAAC;YACD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,EAAE;gBAC5E,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QAED,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC;YACH,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,sBAAsB,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAqC;IAErC,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,EAA2B,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEpC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YACD,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,sBAAsB,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,aAA+B,EAC/B,WAAmB;IAEnB,OAAO,uBAAuB,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,aAAa,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAC1E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAqC,EACrC,OAAgC;IAEhC,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,EAA2B,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEjC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YACxB,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAE5B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC;YACH,qEAAqE;YACrE,sEAAsE;YACtE,iEAAiE;YACjE,iEAAiE;YACjE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC,CAAC,MAAM,CAAC,GAAG,CACV,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,aAAa,EACf,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,YAAY,EACd,CAAC,CAAC,UAAU,EACZ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EACzB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACd,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,MAAM,CACT,CAAC;YACJ,CAAC;YACD,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,sBAAsB,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,QAAgB;IAClE,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAyB,CAAC;QAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAE9B,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACrE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC;YACH,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACtB,sBAAsB,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Group, CreateGroupOptions, UpdateGroupOptions, DeleteGroupResult } from './types.js';
2
+ export declare function createGroup(name: string, options?: CreateGroupOptions): Promise<Group>;
3
+ export declare function listGroups(): Promise<readonly Group[]>;
4
+ export declare function getGroup(name: string): Promise<Group | null>;
5
+ export declare function updateGroup(name: string, updates: UpdateGroupOptions): Promise<Group>;
6
+ export declare function deleteGroup(name: string): Promise<DeleteGroupResult>;
7
+ export declare function addMembers(groupName: string, usernames: readonly string[]): Promise<Group>;
8
+ export declare function removeMembers(groupName: string, usernames: readonly string[]): Promise<Group>;
9
+ export declare function getGroupsForUser(username: string): Promise<readonly string[]>;
10
+ //# sourceMappingURL=groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/lib/groups.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,KAAK,EAEL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAmHpB,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,KAAK,CAAC,CA4ChG;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC,CAI5D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAIlE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CA0D3F;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4B1E;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAiChG;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,KAAK,CAAC,CAwBhB;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAOnF"}