libre-webui 0.22.1 → 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.
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +8 -0
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/middleware/auth.d.ts +15 -1
- package/backend/dist/middleware/auth.d.ts.map +1 -1
- package/backend/dist/middleware/auth.js +153 -33
- package/backend/dist/middleware/auth.js.map +1 -1
- package/backend/dist/persistence/index.d.ts +1 -0
- package/backend/dist/persistence/index.d.ts.map +1 -1
- package/backend/dist/persistence/index.js.map +1 -1
- package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
- package/backend/dist/persistence/postgresMigrationRegistry.js +2 -0
- package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
- package/backend/dist/persistence/postgresPersistence.d.ts.map +1 -1
- package/backend/dist/persistence/postgresPersistence.js +4 -0
- package/backend/dist/persistence/postgresPersistence.js.map +1 -1
- package/backend/dist/persistence/postgresSecurityRepositories.d.ts +7 -0
- package/backend/dist/persistence/postgresSecurityRepositories.d.ts.map +1 -0
- package/backend/dist/persistence/postgresSecurityRepositories.js +435 -0
- package/backend/dist/persistence/postgresSecurityRepositories.js.map +1 -0
- package/backend/dist/persistence/postgresTrustFoundationMigration.d.ts +8 -0
- package/backend/dist/persistence/postgresTrustFoundationMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresTrustFoundationMigration.js +151 -0
- package/backend/dist/persistence/postgresTrustFoundationMigration.js.map +1 -0
- package/backend/dist/persistence/securityTypes.d.ts +196 -0
- package/backend/dist/persistence/securityTypes.d.ts.map +1 -0
- package/backend/dist/persistence/securityTypes.js +18 -0
- package/backend/dist/persistence/securityTypes.js.map +1 -0
- package/backend/dist/persistence/sqliteMigrations.d.ts +1 -0
- package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteMigrations.js +311 -0
- package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
- package/backend/dist/persistence/sqlitePersistence.d.ts.map +1 -1
- package/backend/dist/persistence/sqlitePersistence.js +3 -0
- package/backend/dist/persistence/sqlitePersistence.js.map +1 -1
- package/backend/dist/persistence/sqliteSecurityRepositories.d.ts +6 -0
- package/backend/dist/persistence/sqliteSecurityRepositories.d.ts.map +1 -0
- package/backend/dist/persistence/sqliteSecurityRepositories.js +497 -0
- package/backend/dist/persistence/sqliteSecurityRepositories.js.map +1 -0
- package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.js +55 -0
- package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
- package/backend/dist/persistence/types.d.ts +4 -0
- package/backend/dist/persistence/types.d.ts.map +1 -1
- package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
- package/backend/dist/platform/jobs/domainJobHandlers.js +7 -0
- package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
- package/backend/dist/routes/access.d.ts +3 -0
- package/backend/dist/routes/access.d.ts.map +1 -0
- package/backend/dist/routes/access.js +134 -0
- package/backend/dist/routes/access.js.map +1 -0
- package/backend/dist/routes/audit.d.ts +3 -0
- package/backend/dist/routes/audit.d.ts.map +1 -0
- package/backend/dist/routes/audit.js +82 -0
- package/backend/dist/routes/audit.js.map +1 -0
- package/backend/dist/routes/auth.d.ts.map +1 -1
- package/backend/dist/routes/auth.js +322 -11
- package/backend/dist/routes/auth.js.map +1 -1
- package/backend/dist/routes/groups.d.ts +3 -0
- package/backend/dist/routes/groups.d.ts.map +1 -0
- package/backend/dist/routes/groups.js +161 -0
- package/backend/dist/routes/groups.js.map +1 -0
- package/backend/dist/services/apiTokenService.d.ts +51 -0
- package/backend/dist/services/apiTokenService.d.ts.map +1 -0
- package/backend/dist/services/apiTokenService.js +220 -0
- package/backend/dist/services/apiTokenService.js.map +1 -0
- package/backend/dist/services/authService.d.ts +20 -4
- package/backend/dist/services/authService.d.ts.map +1 -1
- package/backend/dist/services/authService.js +44 -6
- package/backend/dist/services/authService.js.map +1 -1
- package/backend/dist/services/authSessionService.d.ts +34 -0
- package/backend/dist/services/authSessionService.d.ts.map +1 -0
- package/backend/dist/services/authSessionService.js +205 -0
- package/backend/dist/services/authSessionService.js.map +1 -0
- package/backend/dist/services/authorizationService.d.ts +64 -0
- package/backend/dist/services/authorizationService.d.ts.map +1 -0
- package/backend/dist/services/authorizationService.js +176 -0
- package/backend/dist/services/authorizationService.js.map +1 -0
- package/backend/dist/services/groupService.d.ts +27 -0
- package/backend/dist/services/groupService.d.ts.map +1 -0
- package/backend/dist/services/groupService.js +245 -0
- package/backend/dist/services/groupService.js.map +1 -0
- package/backend/dist/services/groupVectorPrincipalResolver.d.ts +12 -0
- package/backend/dist/services/groupVectorPrincipalResolver.d.ts.map +1 -0
- package/backend/dist/services/groupVectorPrincipalResolver.js +33 -0
- package/backend/dist/services/groupVectorPrincipalResolver.js.map +1 -0
- package/backend/dist/services/modelAccessService.d.ts +1 -0
- package/backend/dist/services/modelAccessService.d.ts.map +1 -1
- package/backend/dist/services/modelAccessService.js +3 -5
- package/backend/dist/services/modelAccessService.js.map +1 -1
- package/backend/dist/services/oauthSecurity.d.ts +12 -1
- package/backend/dist/services/oauthSecurity.d.ts.map +1 -1
- package/backend/dist/services/oauthSecurity.js +41 -0
- package/backend/dist/services/oauthSecurity.js.map +1 -1
- package/backend/dist/services/resourceGrantService.d.ts +28 -0
- package/backend/dist/services/resourceGrantService.d.ts.map +1 -0
- package/backend/dist/services/resourceGrantService.js +192 -0
- package/backend/dist/services/resourceGrantService.js.map +1 -0
- package/backend/dist/services/securityAuditService.d.ts +35 -0
- package/backend/dist/services/securityAuditService.d.ts.map +1 -0
- package/backend/dist/services/securityAuditService.js +159 -0
- package/backend/dist/services/securityAuditService.js.map +1 -0
- package/backend/dist/services/simpleGitHubOAuth.d.ts.map +1 -1
- package/backend/dist/services/simpleGitHubOAuth.js +4 -2
- package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
- package/backend/dist/services/simpleOidcOAuth.d.ts +62 -0
- package/backend/dist/services/simpleOidcOAuth.d.ts.map +1 -0
- package/backend/dist/services/simpleOidcOAuth.js +397 -0
- package/backend/dist/services/simpleOidcOAuth.js.map +1 -0
- package/backend/dist/services/webSearchService.d.ts +1 -0
- package/backend/dist/services/webSearchService.d.ts.map +1 -1
- package/backend/dist/services/webSearchService.js +3 -5
- package/backend/dist/services/webSearchService.js.map +1 -1
- package/backend/dist/services/websocketTicketService.d.ts +3 -1
- package/backend/dist/services/websocketTicketService.d.ts.map +1 -1
- package/backend/dist/services/websocketTicketService.js +4 -1
- package/backend/dist/services/websocketTicketService.js.map +1 -1
- package/backend/dist/services/workAccessService.d.ts +1 -0
- package/backend/dist/services/workAccessService.d.ts.map +1 -1
- package/backend/dist/services/workAccessService.js +3 -5
- package/backend/dist/services/workAccessService.js.map +1 -1
- package/backend/dist/services/workEventService.d.ts.map +1 -1
- package/backend/dist/services/workEventService.js +74 -18
- package/backend/dist/services/workEventService.js.map +1 -1
- package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeService.js +19 -1
- package/backend/dist/services/workRuntimeService.js.map +1 -1
- package/backend/dist/websocketServer.d.ts.map +1 -1
- package/backend/dist/websocketServer.js +25 -1
- package/backend/dist/websocketServer.js.map +1 -1
- package/backend/dist/workTerminalServer.d.ts.map +1 -1
- package/backend/dist/workTerminalServer.js +19 -1
- package/backend/dist/workTerminalServer.js.map +1 -1
- package/backend/dist/worker.js +2 -0
- package/backend/dist/worker.js.map +1 -1
- package/backend/package.json +1 -1
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/assets/index-CudKJ5Bs.js +27 -0
- package/frontend/dist/assets/index-DBaj1DRj.css +1 -0
- package/frontend/dist/index.html +11 -11
- package/frontend/dist/js/ArtifactContainer-CigyGLnW.js +1 -0
- package/frontend/dist/js/{ArtifactDemoPage-BDBXYv9l.js → ArtifactDemoPage-CITpRQXa.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-BN16NtKe.js → ArtifactSandboxFrame-C8_7sKm1.js} +2 -2
- package/frontend/dist/js/ArtifactSlideOutPanel-D1f9zUZN.js +1 -0
- package/frontend/dist/js/ChatPage-D-Q1SGlI.js +23 -0
- package/frontend/dist/js/FirstTimeSetup-DwvqU8Jk.js +1 -0
- package/frontend/dist/js/{GalleryPage-CV_vbE7X.js → GalleryPage-CFU6YW9r.js} +1 -1
- package/frontend/dist/js/{HomePage-P-e7Huco.js → HomePage-CEoZABYG.js} +1 -1
- package/frontend/dist/js/{LibreClawPage-Cee06SUM.js → LibreClawPage-VV4sD4-v.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-D7jIT3v1.js → ModelManagerModals-CZAWUxjI.js} +1 -1
- package/frontend/dist/js/{ModelSelector-DXucbvrz.js → ModelSelector-DVN9nTCB.js} +1 -1
- package/frontend/dist/js/ModelsPage-Ce41crA_.js +2 -0
- package/frontend/dist/js/{NotesPage-rEIPWGIb.js → NotesPage-BV08Gh2X.js} +1 -1
- package/frontend/dist/js/{PersonasPage-BXtepFuD.js → PersonasPage-CSpK5FvR.js} +2 -2
- package/frontend/dist/js/{PluginUsagePage-hhu8cxsu.js → PluginUsagePage-B9YPhusn.js} +1 -1
- package/frontend/dist/js/{RichMessageContent-DkiEvdSg.js → RichMessageContent-C3qddYMx.js} +1 -1
- package/frontend/dist/js/SettingsModal-CQSumlFr.js +1 -0
- package/frontend/dist/js/SystemPage-7KbZlMb_.js +1 -0
- package/frontend/dist/js/UserManagementPage-DnyW0Wmx.js +1 -0
- package/frontend/dist/js/WorkPage-B3cuSSwH.js +6 -0
- package/frontend/dist/js/api-DSzsasYT.js +14 -0
- package/frontend/dist/js/{appStore-DRSSjaHn.js → appStore-CYhqdjge.js} +2 -2
- package/frontend/dist/js/ar-D0z0P4rC.js +2 -0
- package/frontend/dist/js/{authStore-BVykIRec.js → authStore-CnSn5zM7.js} +3 -3
- package/frontend/dist/js/bn-BYYU41A7.js +2 -0
- package/frontend/dist/js/chatStore-P1aGCgiF.js +3 -0
- package/frontend/dist/js/{config-BTlPm-cZ.js → config-EEx_rELa.js} +1 -1
- package/frontend/dist/js/cs-BFx6KNZe.js +2 -0
- package/frontend/dist/js/da-DSDuY5Du.js +2 -0
- package/frontend/dist/js/de-YqhP0FmX.js +2 -0
- package/frontend/dist/js/es-Dpr_y1cN.js +2 -0
- package/frontend/dist/js/{estree-CfYahF_d.js → estree-Dc6SMAYy.js} +1 -1
- package/frontend/dist/js/fr-nVg_iAEC.js +2 -0
- package/frontend/dist/js/hi-gHKYCgkP.js +2 -0
- package/frontend/dist/js/{html-BJsDX1UZ.js → html-Bax5_Bzw.js} +1 -1
- package/frontend/dist/js/id-C_yID1Zk.js +2 -0
- package/frontend/dist/js/is-MoRPLbOM.js +2 -0
- package/frontend/dist/js/it-BZTscLxR.js +2 -0
- package/frontend/dist/js/ja-DpIbtmZq.js +2 -0
- package/frontend/dist/js/ko-LkWggmjU.js +2 -0
- package/frontend/dist/js/{markdown-GLyuUNig.js → markdown-DxaneQad.js} +1 -1
- package/frontend/dist/js/{messageCodeStyles-BHddEFP1.js → messageCodeStyles-CxXrl4jD.js} +2 -2
- package/frontend/dist/js/ms-p3XiQSAo.js +2 -0
- package/frontend/dist/js/nl-sEHHO2Kb.js +2 -0
- package/frontend/dist/js/pl-D2GD6PDW.js +2 -0
- package/frontend/dist/js/pt-DPkn3GUn.js +2 -0
- package/frontend/dist/js/ru-C42iHrEd.js +2 -0
- package/frontend/dist/js/{standalone-Dh56V0YW.js → standalone-CCpjftAD.js} +1 -1
- package/frontend/dist/js/sv-CGvHo4os.js +2 -0
- package/frontend/dist/js/th-BaDNpCdY.js +2 -0
- package/frontend/dist/js/tr-BHQvi1cN.js +2 -0
- package/frontend/dist/js/{typescript-DRy7A9w4.js → typescript-DtQEF6kq.js} +1 -1
- package/frontend/dist/js/{ui-CuY4IifA.js → ui-CUMAcARd.js} +2 -2
- package/frontend/dist/js/{ui-vendor-D3Ahl1x5.js → ui-vendor-54SgntkX.js} +1 -1
- package/frontend/dist/js/uk-7pNGS1b2.js +2 -0
- package/frontend/dist/js/vi-DgAfh6mo.js +2 -0
- package/frontend/dist/js/{workApi-DHuYNHLf.js → workApi-vRuNfpEf.js} +2 -2
- package/frontend/dist/js/zh-FRTz6ZqA.js +2 -0
- package/package.json +2 -2
- package/frontend/dist/assets/index-Jtx9Amhz.js +0 -16
- package/frontend/dist/assets/index-kxtZQLV6.css +0 -1
- package/frontend/dist/js/ArtifactContainer-fZegtmva.js +0 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-x1fS85Ww.js +0 -1
- package/frontend/dist/js/ChatPage-C_pXh7WN.js +0 -23
- package/frontend/dist/js/FirstTimeSetup-oRrlZnBm.js +0 -1
- package/frontend/dist/js/ModelsPage-C3_fZpMM.js +0 -2
- package/frontend/dist/js/SettingsModal-BNxCtJ51.js +0 -1
- package/frontend/dist/js/SystemPage-BvvKFuoG.js +0 -1
- package/frontend/dist/js/UserManagementPage-BccyR7si.js +0 -1
- package/frontend/dist/js/WorkPage-BgxrvY3I.js +0 -6
- package/frontend/dist/js/api-BvPDxsUQ.js +0 -14
- package/frontend/dist/js/ar-xTSvTq05.js +0 -2
- package/frontend/dist/js/bn-iYAsohEA.js +0 -2
- package/frontend/dist/js/chatStore-UPp5TV_t.js +0 -3
- package/frontend/dist/js/cs-YBHN88Hb.js +0 -2
- package/frontend/dist/js/da-D7qlLy_k.js +0 -2
- package/frontend/dist/js/de-DV671k2c.js +0 -2
- package/frontend/dist/js/es-kyBgzNq-.js +0 -2
- package/frontend/dist/js/fr-Cw1vut7I.js +0 -2
- package/frontend/dist/js/hi-DWEFC024.js +0 -2
- package/frontend/dist/js/id-DlMHjjy0.js +0 -2
- package/frontend/dist/js/is-B9E_a7dG.js +0 -2
- package/frontend/dist/js/it-DawmVbLC.js +0 -2
- package/frontend/dist/js/ja-DmVvwY3W.js +0 -2
- package/frontend/dist/js/ko-DzOPpkVs.js +0 -2
- package/frontend/dist/js/ms-DpsaOPht.js +0 -2
- package/frontend/dist/js/nl-B1d8W22n.js +0 -2
- package/frontend/dist/js/pl-nCncRVgt.js +0 -2
- package/frontend/dist/js/pt-DHw8fGuu.js +0 -2
- package/frontend/dist/js/ru-Derl_YP_.js +0 -2
- package/frontend/dist/js/sv-pJAfBVo0.js +0 -2
- package/frontend/dist/js/th-C_7fIGnk.js +0 -2
- package/frontend/dist/js/tr-CPqsJvaP.js +0 -2
- package/frontend/dist/js/uk-3o8P_kFi.js +0 -2
- package/frontend/dist/js/vi-Dv6N7OVD.js +0 -2
- package/frontend/dist/js/zh-qg5iqtPi.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorizationService.js","sourceRoot":"","sources":["../../src/services/authorizationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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,
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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,
|
|
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;
|
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"oauthSecurity.js","sourceRoot":"","sources":["../../src/services/oauthSecurity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { StoredResourceGrantRecord } from '../persistence/index.js';
|
|
2
|
+
import { type AuthzActor, type ShareableResourceType } from './authorizationService.js';
|
|
3
|
+
export declare class ResourceGrantError extends Error {
|
|
4
|
+
readonly statusCode: number;
|
|
5
|
+
constructor(message: string, statusCode: number);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Whether the actor may manage sharing for a resource: the owner always
|
|
9
|
+
* can; other users need an `admin` grant on that resource.
|
|
10
|
+
*/
|
|
11
|
+
export declare const canManageGrants: (actor: AuthzActor, resourceType: ShareableResourceType, resourceId: string) => Promise<{
|
|
12
|
+
allowed: boolean;
|
|
13
|
+
ownerUserId: string | null;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const listGrantsForResource: (actor: AuthzActor, resourceType: string, resourceId: string) => Promise<StoredResourceGrantRecord[]>;
|
|
16
|
+
export declare const createGrant: (actor: AuthzActor, input: {
|
|
17
|
+
resourceType: string;
|
|
18
|
+
resourceId: string;
|
|
19
|
+
principalType: string;
|
|
20
|
+
principalId: string;
|
|
21
|
+
permission: string;
|
|
22
|
+
}) => Promise<StoredResourceGrantRecord>;
|
|
23
|
+
export declare const deleteGrant: (actor: AuthzActor, grantId: string) => Promise<boolean>;
|
|
24
|
+
/** Resources shared with the actor (directly or via groups). */
|
|
25
|
+
export declare const listGrantsForActor: (actor: AuthzActor) => Promise<StoredResourceGrantRecord[]>;
|
|
26
|
+
/** Deletion hygiene: called when a resource is removed. */
|
|
27
|
+
export declare const deleteGrantsForResource: (resourceType: string, resourceId: string) => Promise<number>;
|
|
28
|
+
//# sourceMappingURL=resourceGrantService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceGrantService.d.ts","sourceRoot":"","sources":["../../src/services/resourceGrantService.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAGV,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC3B,MAAM,2BAA2B,CAAC;AAGnC,qBAAa,kBAAmB,SAAQ,KAAK;IAGzC,QAAQ,CAAC,UAAU,EAAE,MAAM;IAF7B,YACE,OAAO,EAAE,MAAM,EACN,UAAU,EAAE,MAAM,EAI5B;CACF;AAaD;;;GAGG;AACH,eAAO,MAAM,eAAe,UACnB,UAAU,gBACH,qBAAqB,cACvB,MAAM,KACjB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAU1D,CAAC;AAEF,eAAO,MAAM,qBAAqB,UACzB,UAAU,gBACH,MAAM,cACR,MAAM,KACjB,OAAO,CAAC,yBAAyB,EAAE,CAUrC,CAAC;AAEF,eAAO,MAAM,WAAW,UACf,UAAU,SACV;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,KACA,OAAO,CAAC,yBAAyB,CAsEnC,CAAC;AAEF,eAAO,MAAM,WAAW,UACf,UAAU,WACR,MAAM,KACd,OAAO,CAAC,OAAO,CA2CjB,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,kBAAkB,UACtB,UAAU,KAChB,OAAO,CAAC,yBAAyB,EAAE,CAWrC,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,uBAAuB,iBACpB,MAAM,cACR,MAAM,KACjB,OAAO,CAAC,MAAM,CAC8C,CAAC"}
|