libre-webui 0.22.0 → 0.23.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 (251) hide show
  1. package/backend/dist/index.d.ts.map +1 -1
  2. package/backend/dist/index.js +8 -0
  3. package/backend/dist/index.js.map +1 -1
  4. package/backend/dist/main.js +2 -2
  5. package/backend/dist/main.js.map +1 -1
  6. package/backend/dist/middleware/auth.d.ts +15 -1
  7. package/backend/dist/middleware/auth.d.ts.map +1 -1
  8. package/backend/dist/middleware/auth.js +153 -33
  9. package/backend/dist/middleware/auth.js.map +1 -1
  10. package/backend/dist/persistence/index.d.ts +1 -0
  11. package/backend/dist/persistence/index.d.ts.map +1 -1
  12. package/backend/dist/persistence/index.js.map +1 -1
  13. package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
  14. package/backend/dist/persistence/postgresMigrationRegistry.js +2 -0
  15. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
  16. package/backend/dist/persistence/postgresPersistence.d.ts.map +1 -1
  17. package/backend/dist/persistence/postgresPersistence.js +4 -0
  18. package/backend/dist/persistence/postgresPersistence.js.map +1 -1
  19. package/backend/dist/persistence/postgresSecurityRepositories.d.ts +7 -0
  20. package/backend/dist/persistence/postgresSecurityRepositories.d.ts.map +1 -0
  21. package/backend/dist/persistence/postgresSecurityRepositories.js +435 -0
  22. package/backend/dist/persistence/postgresSecurityRepositories.js.map +1 -0
  23. package/backend/dist/persistence/postgresTrustFoundationMigration.d.ts +8 -0
  24. package/backend/dist/persistence/postgresTrustFoundationMigration.d.ts.map +1 -0
  25. package/backend/dist/persistence/postgresTrustFoundationMigration.js +151 -0
  26. package/backend/dist/persistence/postgresTrustFoundationMigration.js.map +1 -0
  27. package/backend/dist/persistence/securityTypes.d.ts +196 -0
  28. package/backend/dist/persistence/securityTypes.d.ts.map +1 -0
  29. package/backend/dist/persistence/securityTypes.js +18 -0
  30. package/backend/dist/persistence/securityTypes.js.map +1 -0
  31. package/backend/dist/persistence/sqliteMigrations.d.ts +1 -0
  32. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
  33. package/backend/dist/persistence/sqliteMigrations.js +311 -0
  34. package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
  35. package/backend/dist/persistence/sqlitePersistence.d.ts.map +1 -1
  36. package/backend/dist/persistence/sqlitePersistence.js +3 -0
  37. package/backend/dist/persistence/sqlitePersistence.js.map +1 -1
  38. package/backend/dist/persistence/sqliteSecurityRepositories.d.ts +6 -0
  39. package/backend/dist/persistence/sqliteSecurityRepositories.d.ts.map +1 -0
  40. package/backend/dist/persistence/sqliteSecurityRepositories.js +497 -0
  41. package/backend/dist/persistence/sqliteSecurityRepositories.js.map +1 -0
  42. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
  43. package/backend/dist/persistence/sqliteToPostgresMigration.js +55 -0
  44. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
  45. package/backend/dist/persistence/types.d.ts +4 -0
  46. package/backend/dist/persistence/types.d.ts.map +1 -1
  47. package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
  48. package/backend/dist/platform/jobs/domainJobHandlers.js +12 -0
  49. package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
  50. package/backend/dist/platform/storage/storageFactory.d.ts +2 -0
  51. package/backend/dist/platform/storage/storageFactory.d.ts.map +1 -1
  52. package/backend/dist/platform/storage/storageFactory.js +15 -3
  53. package/backend/dist/platform/storage/storageFactory.js.map +1 -1
  54. package/backend/dist/routes/access.d.ts +3 -0
  55. package/backend/dist/routes/access.d.ts.map +1 -0
  56. package/backend/dist/routes/access.js +134 -0
  57. package/backend/dist/routes/access.js.map +1 -0
  58. package/backend/dist/routes/audit.d.ts +3 -0
  59. package/backend/dist/routes/audit.d.ts.map +1 -0
  60. package/backend/dist/routes/audit.js +82 -0
  61. package/backend/dist/routes/audit.js.map +1 -0
  62. package/backend/dist/routes/auth.d.ts.map +1 -1
  63. package/backend/dist/routes/auth.js +322 -11
  64. package/backend/dist/routes/auth.js.map +1 -1
  65. package/backend/dist/routes/groups.d.ts +3 -0
  66. package/backend/dist/routes/groups.d.ts.map +1 -0
  67. package/backend/dist/routes/groups.js +161 -0
  68. package/backend/dist/routes/groups.js.map +1 -0
  69. package/backend/dist/routes/jobs.d.ts.map +1 -1
  70. package/backend/dist/routes/jobs.js +9 -0
  71. package/backend/dist/routes/jobs.js.map +1 -1
  72. package/backend/dist/services/apiTokenService.d.ts +51 -0
  73. package/backend/dist/services/apiTokenService.d.ts.map +1 -0
  74. package/backend/dist/services/apiTokenService.js +220 -0
  75. package/backend/dist/services/apiTokenService.js.map +1 -0
  76. package/backend/dist/services/authService.d.ts +20 -4
  77. package/backend/dist/services/authService.d.ts.map +1 -1
  78. package/backend/dist/services/authService.js +44 -6
  79. package/backend/dist/services/authService.js.map +1 -1
  80. package/backend/dist/services/authSessionService.d.ts +34 -0
  81. package/backend/dist/services/authSessionService.d.ts.map +1 -0
  82. package/backend/dist/services/authSessionService.js +205 -0
  83. package/backend/dist/services/authSessionService.js.map +1 -0
  84. package/backend/dist/services/authorizationService.d.ts +64 -0
  85. package/backend/dist/services/authorizationService.d.ts.map +1 -0
  86. package/backend/dist/services/authorizationService.js +176 -0
  87. package/backend/dist/services/authorizationService.js.map +1 -0
  88. package/backend/dist/services/groupService.d.ts +27 -0
  89. package/backend/dist/services/groupService.d.ts.map +1 -0
  90. package/backend/dist/services/groupService.js +245 -0
  91. package/backend/dist/services/groupService.js.map +1 -0
  92. package/backend/dist/services/groupVectorPrincipalResolver.d.ts +12 -0
  93. package/backend/dist/services/groupVectorPrincipalResolver.d.ts.map +1 -0
  94. package/backend/dist/services/groupVectorPrincipalResolver.js +33 -0
  95. package/backend/dist/services/groupVectorPrincipalResolver.js.map +1 -0
  96. package/backend/dist/services/modelAccessService.d.ts +1 -0
  97. package/backend/dist/services/modelAccessService.d.ts.map +1 -1
  98. package/backend/dist/services/modelAccessService.js +3 -5
  99. package/backend/dist/services/modelAccessService.js.map +1 -1
  100. package/backend/dist/services/oauthSecurity.d.ts +12 -1
  101. package/backend/dist/services/oauthSecurity.d.ts.map +1 -1
  102. package/backend/dist/services/oauthSecurity.js +41 -0
  103. package/backend/dist/services/oauthSecurity.js.map +1 -1
  104. package/backend/dist/services/pluginService.d.ts.map +1 -1
  105. package/backend/dist/services/pluginService.js +35 -2
  106. package/backend/dist/services/pluginService.js.map +1 -1
  107. package/backend/dist/services/resourceGrantService.d.ts +28 -0
  108. package/backend/dist/services/resourceGrantService.d.ts.map +1 -0
  109. package/backend/dist/services/resourceGrantService.js +192 -0
  110. package/backend/dist/services/resourceGrantService.js.map +1 -0
  111. package/backend/dist/services/securityAuditService.d.ts +35 -0
  112. package/backend/dist/services/securityAuditService.d.ts.map +1 -0
  113. package/backend/dist/services/securityAuditService.js +159 -0
  114. package/backend/dist/services/securityAuditService.js.map +1 -0
  115. package/backend/dist/services/simpleGitHubOAuth.d.ts.map +1 -1
  116. package/backend/dist/services/simpleGitHubOAuth.js +4 -2
  117. package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
  118. package/backend/dist/services/simpleOidcOAuth.d.ts +62 -0
  119. package/backend/dist/services/simpleOidcOAuth.d.ts.map +1 -0
  120. package/backend/dist/services/simpleOidcOAuth.js +397 -0
  121. package/backend/dist/services/simpleOidcOAuth.js.map +1 -0
  122. package/backend/dist/services/webSearchService.d.ts +1 -0
  123. package/backend/dist/services/webSearchService.d.ts.map +1 -1
  124. package/backend/dist/services/webSearchService.js +3 -5
  125. package/backend/dist/services/webSearchService.js.map +1 -1
  126. package/backend/dist/services/websocketTicketService.d.ts +3 -1
  127. package/backend/dist/services/websocketTicketService.d.ts.map +1 -1
  128. package/backend/dist/services/websocketTicketService.js +4 -1
  129. package/backend/dist/services/websocketTicketService.js.map +1 -1
  130. package/backend/dist/services/workAccessService.d.ts +1 -0
  131. package/backend/dist/services/workAccessService.d.ts.map +1 -1
  132. package/backend/dist/services/workAccessService.js +3 -5
  133. package/backend/dist/services/workAccessService.js.map +1 -1
  134. package/backend/dist/services/workEventService.d.ts.map +1 -1
  135. package/backend/dist/services/workEventService.js +74 -18
  136. package/backend/dist/services/workEventService.js.map +1 -1
  137. package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
  138. package/backend/dist/services/workRuntimeService.js +19 -1
  139. package/backend/dist/services/workRuntimeService.js.map +1 -1
  140. package/backend/dist/utils/pluginUpload.d.ts.map +1 -1
  141. package/backend/dist/utils/pluginUpload.js +10 -7
  142. package/backend/dist/utils/pluginUpload.js.map +1 -1
  143. package/backend/dist/websocketServer.d.ts.map +1 -1
  144. package/backend/dist/websocketServer.js +25 -1
  145. package/backend/dist/websocketServer.js.map +1 -1
  146. package/backend/dist/workTerminalServer.d.ts.map +1 -1
  147. package/backend/dist/workTerminalServer.js +19 -1
  148. package/backend/dist/workTerminalServer.js.map +1 -1
  149. package/backend/dist/worker.js +4 -2
  150. package/backend/dist/worker.js.map +1 -1
  151. package/backend/package.json +1 -1
  152. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  153. package/frontend/dist/assets/index-CudKJ5Bs.js +27 -0
  154. package/frontend/dist/assets/index-DBaj1DRj.css +1 -0
  155. package/frontend/dist/index.html +11 -11
  156. package/frontend/dist/js/ArtifactContainer-CigyGLnW.js +1 -0
  157. package/frontend/dist/js/{ArtifactDemoPage-B0gN3YTl.js → ArtifactDemoPage-CITpRQXa.js} +1 -1
  158. package/frontend/dist/js/{ArtifactSandboxFrame-CLBXQkZs.js → ArtifactSandboxFrame-C8_7sKm1.js} +2 -2
  159. package/frontend/dist/js/ArtifactSlideOutPanel-D1f9zUZN.js +1 -0
  160. package/frontend/dist/js/ChatPage-D-Q1SGlI.js +23 -0
  161. package/frontend/dist/js/FirstTimeSetup-DwvqU8Jk.js +1 -0
  162. package/frontend/dist/js/{GalleryPage-W4uI043I.js → GalleryPage-CFU6YW9r.js} +1 -1
  163. package/frontend/dist/js/{HomePage-DlxehbyO.js → HomePage-CEoZABYG.js} +1 -1
  164. package/frontend/dist/js/{LibreClawPage-CgD0_G_F.js → LibreClawPage-VV4sD4-v.js} +1 -1
  165. package/frontend/dist/js/{ModelManagerModals-D7jIT3v1.js → ModelManagerModals-CZAWUxjI.js} +1 -1
  166. package/frontend/dist/js/{ModelSelector-BYxJU1UV.js → ModelSelector-DVN9nTCB.js} +1 -1
  167. package/frontend/dist/js/ModelsPage-Ce41crA_.js +2 -0
  168. package/frontend/dist/js/{NotesPage-CDECOl4V.js → NotesPage-BV08Gh2X.js} +1 -1
  169. package/frontend/dist/js/{PersonasPage-CjSLPrgS.js → PersonasPage-CSpK5FvR.js} +2 -2
  170. package/frontend/dist/js/{PluginUsagePage-DJOXJuH4.js → PluginUsagePage-B9YPhusn.js} +1 -1
  171. package/frontend/dist/js/{RichMessageContent-Debeh6bi.js → RichMessageContent-C3qddYMx.js} +1 -1
  172. package/frontend/dist/js/SettingsModal-CQSumlFr.js +1 -0
  173. package/frontend/dist/js/SystemPage-7KbZlMb_.js +1 -0
  174. package/frontend/dist/js/UserManagementPage-DnyW0Wmx.js +1 -0
  175. package/frontend/dist/js/WorkPage-B3cuSSwH.js +6 -0
  176. package/frontend/dist/js/api-DSzsasYT.js +14 -0
  177. package/frontend/dist/js/{appStore-DKwC2vgn.js → appStore-CYhqdjge.js} +2 -2
  178. package/frontend/dist/js/ar-D0z0P4rC.js +2 -0
  179. package/frontend/dist/js/{authStore-OaTuapL7.js → authStore-CnSn5zM7.js} +3 -3
  180. package/frontend/dist/js/bn-BYYU41A7.js +2 -0
  181. package/frontend/dist/js/chatStore-P1aGCgiF.js +3 -0
  182. package/frontend/dist/js/{config-DPEEuTAe.js → config-EEx_rELa.js} +1 -1
  183. package/frontend/dist/js/cs-BFx6KNZe.js +2 -0
  184. package/frontend/dist/js/da-DSDuY5Du.js +2 -0
  185. package/frontend/dist/js/de-YqhP0FmX.js +2 -0
  186. package/frontend/dist/js/es-Dpr_y1cN.js +2 -0
  187. package/frontend/dist/js/{estree-ChwJsD2w.js → estree-Dc6SMAYy.js} +1 -1
  188. package/frontend/dist/js/fr-nVg_iAEC.js +2 -0
  189. package/frontend/dist/js/hi-gHKYCgkP.js +2 -0
  190. package/frontend/dist/js/{html-DFrVjciF.js → html-Bax5_Bzw.js} +1 -1
  191. package/frontend/dist/js/id-C_yID1Zk.js +2 -0
  192. package/frontend/dist/js/is-MoRPLbOM.js +2 -0
  193. package/frontend/dist/js/it-BZTscLxR.js +2 -0
  194. package/frontend/dist/js/ja-DpIbtmZq.js +2 -0
  195. package/frontend/dist/js/ko-LkWggmjU.js +2 -0
  196. package/frontend/dist/js/{markdown-FLLx7b67.js → markdown-DxaneQad.js} +1 -1
  197. package/frontend/dist/js/{messageCodeStyles-CBkkZY4n.js → messageCodeStyles-CxXrl4jD.js} +2 -2
  198. package/frontend/dist/js/ms-p3XiQSAo.js +2 -0
  199. package/frontend/dist/js/nl-sEHHO2Kb.js +2 -0
  200. package/frontend/dist/js/pl-D2GD6PDW.js +2 -0
  201. package/frontend/dist/js/pt-DPkn3GUn.js +2 -0
  202. package/frontend/dist/js/ru-C42iHrEd.js +2 -0
  203. package/frontend/dist/js/{standalone-i8-5bg5p.js → standalone-CCpjftAD.js} +1 -1
  204. package/frontend/dist/js/sv-CGvHo4os.js +2 -0
  205. package/frontend/dist/js/th-BaDNpCdY.js +2 -0
  206. package/frontend/dist/js/tr-BHQvi1cN.js +2 -0
  207. package/frontend/dist/js/{typescript-CQ3x-Uni.js → typescript-DtQEF6kq.js} +1 -1
  208. package/frontend/dist/js/{ui-BHhR3Vok.js → ui-CUMAcARd.js} +2 -2
  209. package/frontend/dist/js/{ui-vendor-D3Ahl1x5.js → ui-vendor-54SgntkX.js} +1 -1
  210. package/frontend/dist/js/uk-7pNGS1b2.js +2 -0
  211. package/frontend/dist/js/vi-DgAfh6mo.js +2 -0
  212. package/frontend/dist/js/{workApi-Czu69yWS.js → workApi-vRuNfpEf.js} +2 -2
  213. package/frontend/dist/js/zh-FRTz6ZqA.js +2 -0
  214. package/package.json +2 -2
  215. package/frontend/dist/assets/index-CUhEG7E2.js +0 -33
  216. package/frontend/dist/assets/index-kxtZQLV6.css +0 -1
  217. package/frontend/dist/js/ArtifactContainer-BTEDhBnv.js +0 -1
  218. package/frontend/dist/js/ArtifactSlideOutPanel-CfqHPFdE.js +0 -1
  219. package/frontend/dist/js/ChatPage-DIkAXZWA.js +0 -23
  220. package/frontend/dist/js/FirstTimeSetup-B8phXGNA.js +0 -1
  221. package/frontend/dist/js/ModelsPage-C4XdCKP5.js +0 -2
  222. package/frontend/dist/js/SettingsModal-cUqAeYUP.js +0 -1
  223. package/frontend/dist/js/SystemPage-DxPw0GS7.js +0 -1
  224. package/frontend/dist/js/UserManagementPage-CEdYFe_Z.js +0 -1
  225. package/frontend/dist/js/WorkPage-DDVeuG_9.js +0 -6
  226. package/frontend/dist/js/api-IzobHGND.js +0 -14
  227. package/frontend/dist/js/ar-xTSvTq05.js +0 -2
  228. package/frontend/dist/js/bn-iYAsohEA.js +0 -2
  229. package/frontend/dist/js/chatStore-DXGUVLXD.js +0 -3
  230. package/frontend/dist/js/cs-YBHN88Hb.js +0 -2
  231. package/frontend/dist/js/da-D7qlLy_k.js +0 -2
  232. package/frontend/dist/js/de-DV671k2c.js +0 -2
  233. package/frontend/dist/js/es-kyBgzNq-.js +0 -2
  234. package/frontend/dist/js/fr-Cw1vut7I.js +0 -2
  235. package/frontend/dist/js/hi-DWEFC024.js +0 -2
  236. package/frontend/dist/js/id-DlMHjjy0.js +0 -2
  237. package/frontend/dist/js/is-B9E_a7dG.js +0 -2
  238. package/frontend/dist/js/it-DawmVbLC.js +0 -2
  239. package/frontend/dist/js/ja-DmVvwY3W.js +0 -2
  240. package/frontend/dist/js/ko-DzOPpkVs.js +0 -2
  241. package/frontend/dist/js/ms-DpsaOPht.js +0 -2
  242. package/frontend/dist/js/nl-B1d8W22n.js +0 -2
  243. package/frontend/dist/js/pl-nCncRVgt.js +0 -2
  244. package/frontend/dist/js/pt-DHw8fGuu.js +0 -2
  245. package/frontend/dist/js/ru-Derl_YP_.js +0 -2
  246. package/frontend/dist/js/sv-pJAfBVo0.js +0 -2
  247. package/frontend/dist/js/th-C_7fIGnk.js +0 -2
  248. package/frontend/dist/js/tr-CPqsJvaP.js +0 -2
  249. package/frontend/dist/js/uk-3o8P_kFi.js +0 -2
  250. package/frontend/dist/js/vi-Dv6N7OVD.js +0 -2
  251. package/frontend/dist/js/zh-qg5iqtPi.js +0 -2
@@ -0,0 +1,27 @@
1
+ import type { StoredGroupMemberRecord, StoredGroupRecord } from '../persistence/index.js';
2
+ export declare class GroupError extends Error {
3
+ readonly statusCode: number;
4
+ constructor(message: string, statusCode: number);
5
+ }
6
+ export interface GroupWithMembers extends StoredGroupRecord {
7
+ members: StoredGroupMemberRecord[];
8
+ }
9
+ export declare const listGroups: () => Promise<StoredGroupRecord[]>;
10
+ export declare const listGroupsWithMembers: () => Promise<GroupWithMembers[]>;
11
+ export declare const getGroup: (groupId: string) => Promise<StoredGroupRecord | null>;
12
+ export declare const getGroupByName: (name: string) => Promise<StoredGroupRecord | null>;
13
+ export declare const listGroupsForUser: (userId: string) => Promise<StoredGroupRecord[]>;
14
+ export declare const createGroup: (input: {
15
+ name: string;
16
+ description?: string | null;
17
+ }, actorUserId: string) => Promise<StoredGroupRecord>;
18
+ export declare const updateGroup: (groupId: string, patch: {
19
+ name?: string;
20
+ description?: string | null;
21
+ }, actorUserId: string) => Promise<StoredGroupRecord | null>;
22
+ export declare const deleteGroup: (groupId: string, actorUserId: string) => Promise<boolean>;
23
+ export declare const addGroupMember: (groupId: string, userId: string, actorUserId: string) => Promise<boolean>;
24
+ export declare const removeGroupMember: (groupId: string, userId: string, actorUserId: string) => Promise<boolean>;
25
+ /** Deletion hygiene: strip a retiring user from groups and their grants. */
26
+ export declare const removeUserFromSecurityPrincipals: (userId: string) => Promise<void>;
27
+ //# sourceMappingURL=groupService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupService.d.ts","sourceRoot":"","sources":["../../src/services/groupService.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAKjC,qBAAa,UAAW,SAAQ,KAAK;IAGjC,QAAQ,CAAC,UAAU,EAAE,MAAM;IAF7B,YACE,OAAO,EAAE,MAAM,EACN,UAAU,EAAE,MAAM,EAI5B;CACF;AAiBD,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,OAAO,EAAE,uBAAuB,EAAE,CAAC;CACpC;AAED,eAAO,MAAM,UAAU,QAAO,OAAO,CAAC,iBAAiB,EAAE,CAC/B,CAAC;AAE3B,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,gBAAgB,EAAE,CAQxE,CAAC;AAEF,eAAO,MAAM,QAAQ,YAAa,MAAM,KAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CACtC,CAAC;AAEtC,eAAO,MAAM,cAAc,SACnB,MAAM,KACX,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAuC,CAAC;AAE3E,eAAO,MAAM,iBAAiB,WACpB,MAAM,KACb,OAAO,CAAC,iBAAiB,EAAE,CAAgD,CAAC;AAE/E,eAAO,MAAM,WAAW,UACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,eACvC,MAAM,KAClB,OAAO,CAAC,iBAAiB,CAwC3B,CAAC;AAEF,eAAO,MAAM,WAAW,YACb,MAAM,SACR;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,eACxC,MAAM,KAClB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CA6ClC,CAAC;AAEF,eAAO,MAAM,WAAW,YACb,MAAM,eACF,MAAM,KAClB,OAAO,CAAC,OAAO,CAwBjB,CAAC;AAEF,eAAO,MAAM,cAAc,YAChB,MAAM,UACP,MAAM,eACD,MAAM,KAClB,OAAO,CAAC,OAAO,CAoCjB,CAAC;AAEF,eAAO,MAAM,iBAAiB,YACnB,MAAM,UACP,MAAM,eACD,MAAM,KAClB,OAAO,CAAC,OAAO,CAsBjB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,gCAAgC,WACnC,MAAM,KACb,OAAO,CAAC,IAAI,CAGd,CAAC"}
@@ -0,0 +1,245 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Groups and memberships (IAM-02).
19
+ *
20
+ * Groups are administrator-managed principals for grants and external
21
+ * identity mapping. Every mutation commits atomically with its security
22
+ * audit event (AUDIT-02): the SQLite path runs both writes in one owned
23
+ * synchronous transaction, the PostgreSQL path in one serializable
24
+ * transaction, so a group change can never exist without its audit trail.
25
+ *
26
+ * Revocation is immediate by construction: membership is read from the
27
+ * database at decision time, never cached.
28
+ */
29
+ import { randomUUID } from 'node:crypto';
30
+ import { getPersistence } from '../persistence/index.js';
31
+ import { encryptionService } from './encryptionService.js';
32
+ import { buildAuditEvent } from './securityAuditService.js';
33
+ import { userModel } from '../models/userModel.js';
34
+ export class GroupError extends Error {
35
+ constructor(message, statusCode) {
36
+ super(message);
37
+ this.statusCode = statusCode;
38
+ this.name = 'GroupError';
39
+ }
40
+ }
41
+ const GROUP_NAME_PATTERN = /^[\p{L}\p{N}][\p{L}\p{N} ._-]{0,127}$/u;
42
+ const normalizeName = (name) => {
43
+ const trimmed = name.trim();
44
+ if (!GROUP_NAME_PATTERN.test(trimmed)) {
45
+ throw new GroupError('Group names are 1-128 letters, numbers, spaces, dots, underscores, or dashes', 400);
46
+ }
47
+ return trimmed;
48
+ };
49
+ const security = () => getPersistence(encryptionService).repositories.security;
50
+ export const listGroups = () => security().groups.list();
51
+ export const listGroupsWithMembers = async () => {
52
+ const groups = await security().groups.list();
53
+ return Promise.all(groups.map(async (group) => ({
54
+ ...group,
55
+ members: await security().groups.listMembers(group.id),
56
+ })));
57
+ };
58
+ export const getGroup = (groupId) => security().groups.findById(groupId);
59
+ export const getGroupByName = (name) => security().groups.findByName(name);
60
+ export const listGroupsForUser = (userId) => security().groups.listGroupsForUser(userId);
61
+ export const createGroup = async (input, actorUserId) => {
62
+ const name = normalizeName(input.name);
63
+ const now = Date.now();
64
+ const record = {
65
+ id: randomUUID(),
66
+ name,
67
+ description: input.description?.trim() || null,
68
+ created_by: actorUserId,
69
+ created_at: now,
70
+ updated_at: now,
71
+ };
72
+ const audit = buildAuditEvent({
73
+ action: 'group.create',
74
+ result: 'success',
75
+ actorUserId,
76
+ targetType: 'group',
77
+ targetId: record.id,
78
+ details: { name },
79
+ });
80
+ const persistence = getPersistence(encryptionService);
81
+ if (persistence.dialect === 'sqlite') {
82
+ await persistence.transaction(({ security: tx }) => {
83
+ if (tx.groups.findByName(name)) {
84
+ throw new GroupError('A group with this name already exists', 409);
85
+ }
86
+ tx.groups.insert(record);
87
+ tx.audit.insert(audit);
88
+ return undefined;
89
+ });
90
+ return record;
91
+ }
92
+ await persistence.transaction(async ({ security: tx }) => {
93
+ if (await tx.groups.findByName(name)) {
94
+ throw new GroupError('A group with this name already exists', 409);
95
+ }
96
+ await tx.groups.insert(record);
97
+ await tx.audit.insert(audit);
98
+ });
99
+ return record;
100
+ };
101
+ export const updateGroup = async (groupId, patch, actorUserId) => {
102
+ const name = patch.name !== undefined ? normalizeName(patch.name) : undefined;
103
+ const update = {
104
+ ...(name !== undefined ? { name } : {}),
105
+ ...(patch.description !== undefined
106
+ ? { description: patch.description?.trim() || null }
107
+ : {}),
108
+ updated_at: Date.now(),
109
+ };
110
+ const audit = buildAuditEvent({
111
+ action: 'group.update',
112
+ result: 'success',
113
+ actorUserId,
114
+ targetType: 'group',
115
+ targetId: groupId,
116
+ details: { ...(name !== undefined ? { name } : {}) },
117
+ });
118
+ const persistence = getPersistence(encryptionService);
119
+ if (persistence.dialect === 'sqlite') {
120
+ const updated = await persistence.transaction(({ security: tx }) => {
121
+ if (name !== undefined) {
122
+ const existing = tx.groups.findByName(name);
123
+ if (existing && existing.id !== groupId) {
124
+ throw new GroupError('A group with this name already exists', 409);
125
+ }
126
+ }
127
+ const applied = tx.groups.update(groupId, update);
128
+ if (applied)
129
+ tx.audit.insert(audit);
130
+ return applied;
131
+ });
132
+ return updated ? security().groups.findById(groupId) : null;
133
+ }
134
+ const updated = await persistence.transaction(async ({ security: tx }) => {
135
+ if (name !== undefined) {
136
+ const existing = await tx.groups.findByName(name);
137
+ if (existing && existing.id !== groupId) {
138
+ throw new GroupError('A group with this name already exists', 409);
139
+ }
140
+ }
141
+ const applied = await tx.groups.update(groupId, update);
142
+ if (applied)
143
+ await tx.audit.insert(audit);
144
+ return applied;
145
+ });
146
+ return updated ? security().groups.findById(groupId) : null;
147
+ };
148
+ export const deleteGroup = async (groupId, actorUserId) => {
149
+ const audit = buildAuditEvent({
150
+ action: 'group.delete',
151
+ result: 'success',
152
+ actorUserId,
153
+ targetType: 'group',
154
+ targetId: groupId,
155
+ });
156
+ const persistence = getPersistence(encryptionService);
157
+ if (persistence.dialect === 'sqlite') {
158
+ return persistence.transaction(({ security: tx }) => {
159
+ // Grants held by the group disappear with it; memberships cascade.
160
+ tx.grants.deleteForPrincipal('group', groupId);
161
+ const deleted = tx.groups.delete(groupId);
162
+ if (deleted)
163
+ tx.audit.insert(audit);
164
+ return deleted;
165
+ });
166
+ }
167
+ return persistence.transaction(async ({ security: tx }) => {
168
+ await tx.grants.deleteForPrincipal('group', groupId);
169
+ const deleted = await tx.groups.delete(groupId);
170
+ if (deleted)
171
+ await tx.audit.insert(audit);
172
+ return deleted;
173
+ });
174
+ };
175
+ export const addGroupMember = async (groupId, userId, actorUserId) => {
176
+ const user = await userModel.getUserById(userId);
177
+ if (!user)
178
+ throw new GroupError('User not found', 404);
179
+ const member = {
180
+ group_id: groupId,
181
+ user_id: userId,
182
+ added_by: actorUserId,
183
+ added_at: Date.now(),
184
+ };
185
+ const audit = buildAuditEvent({
186
+ action: 'group.member-add',
187
+ result: 'success',
188
+ actorUserId,
189
+ targetType: 'group',
190
+ targetId: groupId,
191
+ details: { userId },
192
+ });
193
+ const persistence = getPersistence(encryptionService);
194
+ if (persistence.dialect === 'sqlite') {
195
+ return persistence.transaction(({ security: tx }) => {
196
+ if (!tx.groups.findById(groupId)) {
197
+ throw new GroupError('Group not found', 404);
198
+ }
199
+ const added = tx.groups.addMember(member);
200
+ if (added)
201
+ tx.audit.insert(audit);
202
+ return added;
203
+ });
204
+ }
205
+ return persistence.transaction(async ({ security: tx }) => {
206
+ if (!(await tx.groups.findById(groupId))) {
207
+ throw new GroupError('Group not found', 404);
208
+ }
209
+ const added = await tx.groups.addMember(member);
210
+ if (added)
211
+ await tx.audit.insert(audit);
212
+ return added;
213
+ });
214
+ };
215
+ export const removeGroupMember = async (groupId, userId, actorUserId) => {
216
+ const audit = buildAuditEvent({
217
+ action: 'group.member-remove',
218
+ result: 'success',
219
+ actorUserId,
220
+ targetType: 'group',
221
+ targetId: groupId,
222
+ details: { userId },
223
+ });
224
+ const persistence = getPersistence(encryptionService);
225
+ if (persistence.dialect === 'sqlite') {
226
+ return persistence.transaction(({ security: tx }) => {
227
+ const removed = tx.groups.removeMember(groupId, userId);
228
+ if (removed)
229
+ tx.audit.insert(audit);
230
+ return removed;
231
+ });
232
+ }
233
+ return persistence.transaction(async ({ security: tx }) => {
234
+ const removed = await tx.groups.removeMember(groupId, userId);
235
+ if (removed)
236
+ await tx.audit.insert(audit);
237
+ return removed;
238
+ });
239
+ };
240
+ /** Deletion hygiene: strip a retiring user from groups and their grants. */
241
+ export const removeUserFromSecurityPrincipals = async (userId) => {
242
+ await security().groups.removeUserFromAllGroups(userId);
243
+ await security().grants.deleteForPrincipal('user', userId);
244
+ };
245
+ //# sourceMappingURL=groupService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupService.js","sourceRoot":"","sources":["../../src/services/groupService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAKzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YACE,OAAe,EACN,UAAkB;QAE3B,KAAK,CAAC,OAAO,CAAC,CAAC;0BAFN,UAAU;QAGnB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,kBAAkB,GAAG,wCAAwC,CAAC;AAEpE,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,UAAU,CAClB,8EAA8E,EAC9E,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC;AAM/E,MAAM,CAAC,MAAM,UAAU,GAAG,GAAiC,EAAE,CAC3D,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAE3B,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAAiC,EAAE;IAC3E,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE,CAAC,CAAC;QACzB,GAAG,KAAK;QACR,OAAO,EAAE,MAAM,QAAQ,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;KACvD,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAqC,EAAE,CAC7E,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,IAAY,EACuB,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAc,EACgB,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,KAAoD,EACpD,WAAmB,EACS,EAAE;IAC9B,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAsB;QAChC,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI;QAC9C,UAAU,EAAE,WAAW;QACvB,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,GAAG;KAChB,CAAC;IACF,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,SAAS;QACjB,WAAW;QACX,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,OAAO,EAAE,EAAE,IAAI,EAAE;KAClB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;YACjD,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,UAAU,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;YACrE,CAAC;YACD,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;QACvD,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,UAAU,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,OAAe,EACf,KAAqD,EACrD,WAAmB,EACgB,EAAE;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,MAAM,GAAG;QACb,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;KACvB,CAAC;IACF,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,SAAS;QACjB,WAAW;QACX,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;KACrD,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;YACjE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;oBACxC,MAAM,IAAI,UAAU,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YACD,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,OAAO;gBAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;QACvE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;gBACxC,MAAM,IAAI,UAAU,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,OAAO;YAAE,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,OAAe,EACf,WAAmB,EACD,EAAE;IACpB,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,SAAS;QACjB,WAAW;QACX,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;YAClD,mEAAmE;YACnE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,OAAO;gBAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;QACxD,MAAM,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,OAAO;YAAE,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,OAAe,EACf,MAAc,EACd,WAAmB,EACD,EAAE;IACpB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,MAAM,GAA4B;QACtC,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;IACF,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,SAAS;QACjB,WAAW;QACX,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,EAAE,MAAM,EAAE;KACpB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;YAClD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,KAAK;gBAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;QACxD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,KAAK;YAAE,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,OAAe,EACf,MAAc,EACd,WAAmB,EACD,EAAE;IACpB,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,SAAS;QACjB,WAAW;QACX,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,EAAE,MAAM,EAAE;KACpB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;YAClD,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACxD,IAAI,OAAO;gBAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,IAAI,OAAO;YAAE,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gCAAgC,GAAG,KAAK,EACnD,MAAc,EACC,EAAE;IACjB,MAAM,QAAQ,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,QAAQ,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { VectorPrincipalResolver } from '../platform/storage/vectorStore.js';
2
+ /**
3
+ * Resolves a user's group principals from the trust-foundation membership
4
+ * table, so vector-store ACL predicates can honor group grants. Memberships
5
+ * are read fresh on every query: removing a member revokes their
6
+ * group-granted retrieval immediately.
7
+ */
8
+ export declare class GroupVectorPrincipalResolver implements VectorPrincipalResolver {
9
+ resolveGroupIds(userId: string): Promise<readonly string[]>;
10
+ }
11
+ export declare const groupVectorPrincipalResolver: GroupVectorPrincipalResolver;
12
+ //# sourceMappingURL=groupVectorPrincipalResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupVectorPrincipalResolver.d.ts","sourceRoot":"","sources":["../../src/services/groupVectorPrincipalResolver.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAIlF;;;;;GAKG;AACH,qBAAa,4BAA6B,YAAW,uBAAuB;IACpE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAKhE;CACF;AAED,eAAO,MAAM,4BAA4B,8BAAqC,CAAC"}
@@ -0,0 +1,33 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { getPersistence } from '../persistence/index.js';
18
+ import { encryptionService } from './encryptionService.js';
19
+ /**
20
+ * Resolves a user's group principals from the trust-foundation membership
21
+ * table, so vector-store ACL predicates can honor group grants. Memberships
22
+ * are read fresh on every query: removing a member revokes their
23
+ * group-granted retrieval immediately.
24
+ */
25
+ export class GroupVectorPrincipalResolver {
26
+ async resolveGroupIds(userId) {
27
+ if (!userId)
28
+ return [];
29
+ return getPersistence(encryptionService).repositories.security.groups.listGroupIdsForUser(userId);
30
+ }
31
+ }
32
+ export const groupVectorPrincipalResolver = new GroupVectorPrincipalResolver();
33
+ //# sourceMappingURL=groupVectorPrincipalResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupVectorPrincipalResolver.js","sourceRoot":"","sources":["../../src/services/groupVectorPrincipalResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,OAAO,4BAA4B;IACvC,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,OAAO,cAAc,CACnB,iBAAiB,CAClB,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,4BAA4B,EAAE,CAAC"}
@@ -6,6 +6,7 @@ export declare function getModelDownloadMode(): Promise<ModelDownloadMode>;
6
6
  export declare function setModelDownloadMode(mode: ModelDownloadMode): Promise<void>;
7
7
  /** Whether a user may pull models right now. */
8
8
  export declare function userCanDownloadModels(user: {
9
+ id?: string;
9
10
  role?: string;
10
11
  status?: string;
11
12
  }): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"modelAccessService.d.ts","sourceRoot":"","sources":["../../src/services/modelAccessService.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEvD,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAG5D,CAAC;AAEF,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,iBAAiB,CAK5B;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAOvE;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,gDAAgD;AAChD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,OAAO,CAAC,CAInB"}
1
+ {"version":3,"file":"modelAccessService.d.ts","sourceRoot":"","sources":["../../src/services/modelAccessService.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEvD,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAG5D,CAAC;AAEF,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,iBAAiB,CAK5B;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAOvE;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,gDAAgD;AAChD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB"}
@@ -49,10 +49,8 @@ export async function setModelDownloadMode(mode) {
49
49
  }
50
50
  /** Whether a user may pull models right now. */
51
51
  export async function userCanDownloadModels(user) {
52
- if (user.status !== undefined && user.status !== 'active')
53
- return false;
54
- if (user.role === 'admin')
55
- return true;
56
- return (await getModelDownloadMode()) === 'all-users';
52
+ const { authorize } = await import('./authorizationService.js');
53
+ const decision = await authorize({ userId: user.id ?? '', role: user.role, status: user.status }, 'use', { type: 'feature', id: 'model-download' });
54
+ return decision.allowed;
57
55
  }
58
56
  //# sourceMappingURL=modelAccessService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modelAccessService.js","sourceRoot":"","sources":["../../src/services/modelAccessService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAIhF,MAAM,CAAC,MAAM,oBAAoB,GAAiC;IAChE,QAAQ;IACR,WAAW;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D,MAAM,UAAU,mBAAmB,CACjC,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACxB,oBAA0C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC5D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;QAC9D,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAuB;IAEvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,gBAAgB,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAG3C;IACC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,CAAC,MAAM,oBAAoB,EAAE,CAAC,KAAK,WAAW,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"modelAccessService.js","sourceRoot":"","sources":["../../src/services/modelAccessService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAIhF,MAAM,CAAC,MAAM,oBAAoB,GAAiC;IAChE,QAAQ;IACR,WAAW;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D,MAAM,UAAU,mBAAmB,CACjC,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACxB,oBAA0C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC5D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;QAC9D,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAuB;IAEvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,gBAAgB,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAI3C;IACC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAC/D,KAAK,EACL,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAC1C,CAAC;IACF,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC"}
@@ -1,7 +1,18 @@
1
1
  import type { Request, Response } from 'express';
2
- export type OAuthProvider = 'github' | 'huggingface';
2
+ export type OAuthProvider = 'github' | 'huggingface' | 'oidc';
3
3
  /** Start a browser-bound OAuth flow and return the state sent to the provider. */
4
4
  export declare const beginOAuthFlow: (req: Request, res: Response, provider: OAuthProvider) => string;
5
+ /**
6
+ * Start a browser-bound OAuth flow that also needs per-flow secrets (PKCE
7
+ * verifier, OIDC nonce). The payload rides in the same HttpOnly state
8
+ * cookie, encoded alongside the CSRF state.
9
+ */
10
+ export declare const beginOAuthFlowWithPayload: (req: Request, res: Response, provider: OAuthProvider, payload: Record<string, string>) => string;
11
+ /**
12
+ * Validate state and return the per-flow payload stored at flow start.
13
+ * The cookie is always cleared, so a callback cannot be replayed.
14
+ */
15
+ export declare const consumeOAuthStatePayload: (req: Request, res: Response, provider: OAuthProvider, receivedState: string) => Record<string, string> | null;
5
16
  /** Validate and clear OAuth state so a callback cannot be replayed in-browser. */
6
17
  export declare const consumeOAuthState: (req: Request, res: Response, provider: OAuthProvider, receivedState: string) => boolean;
7
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"oauthSecurity.d.ts","sourceRoot":"","sources":["../../src/services/oauthSecurity.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAiB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,aAAa,CAAC;AAgErD,kFAAkF;AAClF,eAAO,MAAM,cAAc,QACpB,OAAO,OACP,QAAQ,YACH,aAAa,KACtB,MAQF,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,QACvB,OAAO,OACP,QAAQ,YACH,aAAa,iBACR,MAAM,KACpB,OAQF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,SAC1B,OAAO,OACR,QAAQ,SACN,MAAM,KACZ,IAQF,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,QAC/B,OAAO,OACP,QAAQ,KACZ,MAAM,GAAG,SASX,CAAC"}
1
+ {"version":3,"file":"oauthSecurity.d.ts","sourceRoot":"","sources":["../../src/services/oauthSecurity.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAiB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,CAAC;AAgE9D,kFAAkF;AAClF,eAAO,MAAM,cAAc,QACpB,OAAO,OACP,QAAQ,YACH,aAAa,KACtB,MAQF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,QAC/B,OAAO,OACP,QAAQ,YACH,aAAa,WACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,MAYF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAC9B,OAAO,OACP,QAAQ,YACH,aAAa,iBACR,MAAM,KACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAyB3B,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,QACvB,OAAO,OACP,QAAQ,YACH,aAAa,iBACR,MAAM,KACpB,OAQF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,SAC1B,OAAO,OACR,QAAQ,SACN,MAAM,KACZ,IAQF,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,QAC/B,OAAO,OACP,QAAQ,KACZ,MAAM,GAAG,SASX,CAAC"}
@@ -67,6 +67,47 @@ export const beginOAuthFlow = (req, res, provider) => {
67
67
  res.cookie(stateCookieName(provider), state, cookieOptions(req, stateCookiePath(provider), STATE_TTL_MS));
68
68
  return state;
69
69
  };
70
+ /**
71
+ * Start a browser-bound OAuth flow that also needs per-flow secrets (PKCE
72
+ * verifier, OIDC nonce). The payload rides in the same HttpOnly state
73
+ * cookie, encoded alongside the CSRF state.
74
+ */
75
+ export const beginOAuthFlowWithPayload = (req, res, provider, payload) => {
76
+ const state = randomBytes(32).toString('base64url');
77
+ const envelope = Buffer.from(JSON.stringify({ state, ...payload }), 'utf8').toString('base64url');
78
+ res.cookie(stateCookieName(provider), envelope, cookieOptions(req, stateCookiePath(provider), STATE_TTL_MS));
79
+ return state;
80
+ };
81
+ /**
82
+ * Validate state and return the per-flow payload stored at flow start.
83
+ * The cookie is always cleared, so a callback cannot be replayed.
84
+ */
85
+ export const consumeOAuthStatePayload = (req, res, provider, receivedState) => {
86
+ const path = stateCookiePath(provider);
87
+ const raw = readCookie(req, stateCookieName(provider));
88
+ res.clearCookie(stateCookieName(provider), clearCookieOptions(req, path));
89
+ if (!raw || !receivedState)
90
+ return null;
91
+ try {
92
+ const parsed = JSON.parse(Buffer.from(raw, 'base64url').toString('utf8'));
93
+ if (!parsed || typeof parsed !== 'object')
94
+ return null;
95
+ const envelope = parsed;
96
+ if (typeof envelope.state !== 'string' ||
97
+ !secureEqual(envelope.state, receivedState)) {
98
+ return null;
99
+ }
100
+ const payload = {};
101
+ for (const [key, value] of Object.entries(envelope)) {
102
+ if (key !== 'state' && typeof value === 'string')
103
+ payload[key] = value;
104
+ }
105
+ return payload;
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ };
70
111
  /** Validate and clear OAuth state so a callback cannot be replayed in-browser. */
71
112
  export const consumeOAuthState = (req, res, provider, receivedState) => {
72
113
  const path = stateCookiePath(provider);
@@ -1 +1 @@
1
- {"version":3,"file":"oauthSecurity.js","sourceRoot":"","sources":["../../src/services/oauthSecurity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAKtD,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAClD,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAE9C,MAAM,eAAe,GAAG,CAAC,QAAuB,EAAU,EAAE,CAC1D,qBAAqB,QAAQ,EAAE,CAAC;AAElC,MAAM,eAAe,GAAG,CAAC,QAAuB,EAAU,EAAE,CAC1D,mBAAmB,QAAQ,EAAE,CAAC;AAEhC,MAAM,eAAe,GAAG,CAAC,GAAY,EAAW,EAAE,CAChD,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC;AAEzC,MAAM,aAAa,GAAG,CACpB,GAAY,EACZ,IAAY,EACZ,MAAc,EACC,EAAE,CAAC,CAAC;IACnB,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC;IAC5B,QAAQ,EAAE,KAAK;IACf,IAAI;IACJ,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAE,IAAY,EAAiB,EAAE,CAAC,CAAC;IACzE,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC;IAC5B,QAAQ,EAAE,KAAK;IACf,IAAI;CACL,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,IAAY,EAAsB,EAAE;IACpE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,SAAS,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI;YAAE,SAAS;QAEvD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,KAAa,EAAW,EAAE;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,CACL,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;QACxC,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC,CACzC,CAAC;AACJ,CAAC,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,GAAY,EACZ,GAAa,EACb,QAAuB,EACf,EAAE;IACV,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,GAAG,CAAC,MAAM,CACR,eAAe,CAAC,QAAQ,CAAC,EACzB,KAAK,EACL,aAAa,CAAC,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAC5D,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,GAAY,EACZ,GAAa,EACb,QAAuB,EACvB,aAAqB,EACZ,EAAE;IACX,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1E,OAAO,OAAO,CACZ,aAAa,IAAI,aAAa,IAAI,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,CAC5E,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAAa,EACb,GAAa,EACb,KAAa,EACP,EAAE;IACR,GAAG,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE;QACrC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,uBAAuB;KAChC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,GAAY,EACZ,GAAa,EACO,EAAE;IACtB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACnD,GAAG,CAAC,WAAW,CAAC,mBAAmB,EAAE;QACnC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,mBAAmB;KAC1B,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
1
+ {"version":3,"file":"oauthSecurity.js","sourceRoot":"","sources":["../../src/services/oauthSecurity.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pluginService.d.ts","sourceRoot":"","sources":["../../src/services/pluginService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pluginService.d.ts","sourceRoot":"","sources":["../../src/services/pluginService.ts"],"names":[],"mappings":"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"}
@@ -1555,7 +1555,7 @@ export class PluginService {
1555
1555
  // Get the active plugin for a specific model
1556
1556
  async getActivePluginForModel(model, userId, pluginId) {
1557
1557
  if (pluginId) {
1558
- const plugin = await this.getPlugin(pluginId, userId);
1558
+ let plugin = await this.getPlugin(pluginId, userId);
1559
1559
  if (!plugin) {
1560
1560
  throw new Error(`Plugin not found: ${pluginId}`);
1561
1561
  }
@@ -1563,7 +1563,18 @@ export class PluginService {
1563
1563
  throw new Error(`Plugin is not active: ${pluginId}`);
1564
1564
  }
1565
1565
  if (!plugin.model_map.includes(model)) {
1566
- throw new Error(`Model ${model} is not supported by plugin ${pluginId}`);
1566
+ // The UI offers a live-fetched catalog, so a just-released provider
1567
+ // model can be requested before the shared store carries it — and an
1568
+ // external worker resolves from the shared store only. Refresh a due
1569
+ // catalog once before rejecting; the discovery backoff keeps a
1570
+ // mistyped model from probing the provider on every request.
1571
+ if (await this.isModelDiscoveryDue(pluginId, userId)) {
1572
+ await this.discoverModelsResult(pluginId, userId).catch(() => undefined);
1573
+ plugin = await this.getPlugin(pluginId, userId);
1574
+ }
1575
+ if (!plugin?.model_map.includes(model)) {
1576
+ throw new Error(`Model ${model} is not supported by plugin ${pluginId}`);
1577
+ }
1567
1578
  }
1568
1579
  await this.resolveOperationEndpoint(plugin, userId);
1569
1580
  const apiKey = await this.getApiKey(plugin, userId);
@@ -1587,6 +1598,28 @@ export class PluginService {
1587
1598
  return plugin;
1588
1599
  }
1589
1600
  }
1601
+ // Same store-vs-catalog skew guard for sessions without an explicit
1602
+ // provider: refresh every due catalog once, then rescan before giving up.
1603
+ let refreshedAnyCatalog = false;
1604
+ for (const plugin of activePlugins) {
1605
+ if ((plugin.type === 'completion' || plugin.type === 'chat') &&
1606
+ (await this.isModelDiscoveryDue(plugin.id, userId))) {
1607
+ await this.discoverModelsResult(plugin.id, userId).catch(() => undefined);
1608
+ refreshedAnyCatalog = true;
1609
+ }
1610
+ }
1611
+ if (refreshedAnyCatalog) {
1612
+ for (const plugin of await this.getActivePlugins(userId)) {
1613
+ if (plugin.model_map.includes(model)) {
1614
+ await this.resolveOperationEndpoint(plugin, userId);
1615
+ const apiKey = await this.getApiKey(plugin, userId);
1616
+ if (pluginRequiresApiKey(plugin) && !apiKey) {
1617
+ continue;
1618
+ }
1619
+ return plugin;
1620
+ }
1621
+ }
1622
+ }
1590
1623
  return null;
1591
1624
  }
1592
1625
  // Get all currently active plugins