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.
- 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/main.js +2 -2
- package/backend/dist/main.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 +12 -0
- package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
- package/backend/dist/platform/storage/storageFactory.d.ts +2 -0
- package/backend/dist/platform/storage/storageFactory.d.ts.map +1 -1
- package/backend/dist/platform/storage/storageFactory.js +15 -3
- package/backend/dist/platform/storage/storageFactory.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/routes/jobs.d.ts.map +1 -1
- package/backend/dist/routes/jobs.js +9 -0
- package/backend/dist/routes/jobs.js.map +1 -1
- 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/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +35 -2
- package/backend/dist/services/pluginService.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/utils/pluginUpload.d.ts.map +1 -1
- package/backend/dist/utils/pluginUpload.js +10 -7
- package/backend/dist/utils/pluginUpload.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 +4 -2
- 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-B0gN3YTl.js → ArtifactDemoPage-CITpRQXa.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-CLBXQkZs.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-W4uI043I.js → GalleryPage-CFU6YW9r.js} +1 -1
- package/frontend/dist/js/{HomePage-DlxehbyO.js → HomePage-CEoZABYG.js} +1 -1
- package/frontend/dist/js/{LibreClawPage-CgD0_G_F.js → LibreClawPage-VV4sD4-v.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-D7jIT3v1.js → ModelManagerModals-CZAWUxjI.js} +1 -1
- package/frontend/dist/js/{ModelSelector-BYxJU1UV.js → ModelSelector-DVN9nTCB.js} +1 -1
- package/frontend/dist/js/ModelsPage-Ce41crA_.js +2 -0
- package/frontend/dist/js/{NotesPage-CDECOl4V.js → NotesPage-BV08Gh2X.js} +1 -1
- package/frontend/dist/js/{PersonasPage-CjSLPrgS.js → PersonasPage-CSpK5FvR.js} +2 -2
- package/frontend/dist/js/{PluginUsagePage-DJOXJuH4.js → PluginUsagePage-B9YPhusn.js} +1 -1
- package/frontend/dist/js/{RichMessageContent-Debeh6bi.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-DKwC2vgn.js → appStore-CYhqdjge.js} +2 -2
- package/frontend/dist/js/ar-D0z0P4rC.js +2 -0
- package/frontend/dist/js/{authStore-OaTuapL7.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-DPEEuTAe.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-ChwJsD2w.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-DFrVjciF.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-FLLx7b67.js → markdown-DxaneQad.js} +1 -1
- package/frontend/dist/js/{messageCodeStyles-CBkkZY4n.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-i8-5bg5p.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-CQ3x-Uni.js → typescript-DtQEF6kq.js} +1 -1
- package/frontend/dist/js/{ui-BHhR3Vok.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-Czu69yWS.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-CUhEG7E2.js +0 -33
- package/frontend/dist/assets/index-kxtZQLV6.css +0 -1
- package/frontend/dist/js/ArtifactContainer-BTEDhBnv.js +0 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-CfqHPFdE.js +0 -1
- package/frontend/dist/js/ChatPage-DIkAXZWA.js +0 -23
- package/frontend/dist/js/FirstTimeSetup-B8phXGNA.js +0 -1
- package/frontend/dist/js/ModelsPage-C4XdCKP5.js +0 -2
- package/frontend/dist/js/SettingsModal-cUqAeYUP.js +0 -1
- package/frontend/dist/js/SystemPage-DxPw0GS7.js +0 -1
- package/frontend/dist/js/UserManagementPage-CEdYFe_Z.js +0 -1
- package/frontend/dist/js/WorkPage-DDVeuG_9.js +0 -6
- package/frontend/dist/js/api-IzobHGND.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-DXGUVLXD.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,161 @@
|
|
|
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 express from 'express';
|
|
18
|
+
import rateLimit from '../middleware/sharedRateLimit.js';
|
|
19
|
+
import { authenticate, requireAdmin, } from '../middleware/auth.js';
|
|
20
|
+
import { addGroupMember, createGroup, deleteGroup, getGroup, GroupError, listGroupsWithMembers, removeGroupMember, updateGroup, } from '../services/groupService.js';
|
|
21
|
+
import { explainEffectiveAccess } from '../services/authorizationService.js';
|
|
22
|
+
import { userModel } from '../models/userModel.js';
|
|
23
|
+
import { createLogger } from '../utils/logger.js';
|
|
24
|
+
const router = express.Router();
|
|
25
|
+
const logger = createLogger('groups-routes');
|
|
26
|
+
const groupsRateLimiter = rateLimit({
|
|
27
|
+
keyPrefix: 'groups-admin',
|
|
28
|
+
windowMs: 15 * 60 * 1000,
|
|
29
|
+
max: 120,
|
|
30
|
+
message: { success: false, message: 'Too many requests' },
|
|
31
|
+
standardHeaders: true,
|
|
32
|
+
legacyHeaders: false,
|
|
33
|
+
});
|
|
34
|
+
router.use(groupsRateLimiter, authenticate, requireAdmin);
|
|
35
|
+
const handleError = (res, error, fallback) => {
|
|
36
|
+
if (error instanceof GroupError) {
|
|
37
|
+
res
|
|
38
|
+
.status(error.statusCode)
|
|
39
|
+
.json({ success: false, message: error.message });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
logger.error(fallback, error);
|
|
43
|
+
res.status(500).json({ success: false, message: 'Internal server error' });
|
|
44
|
+
};
|
|
45
|
+
/** List groups with members. */
|
|
46
|
+
router.get('/', async (_req, res) => {
|
|
47
|
+
try {
|
|
48
|
+
const groups = await listGroupsWithMembers();
|
|
49
|
+
res.json({ success: true, data: groups });
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
handleError(res, error, 'Group list error:');
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
/** Create a group. */
|
|
56
|
+
router.post('/', async (req, res) => {
|
|
57
|
+
try {
|
|
58
|
+
const { name, description } = req.body ?? {};
|
|
59
|
+
if (typeof name !== 'string') {
|
|
60
|
+
res.status(400).json({ success: false, message: 'name is required' });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const group = await createGroup({
|
|
64
|
+
name,
|
|
65
|
+
description: typeof description === 'string' ? description : null,
|
|
66
|
+
}, req.user.userId);
|
|
67
|
+
res.status(201).json({ success: true, data: group });
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
handleError(res, error, 'Group create error:');
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
/** Update a group's name or description. */
|
|
74
|
+
router.patch('/:id', async (req, res) => {
|
|
75
|
+
try {
|
|
76
|
+
const { name, description } = req.body ?? {};
|
|
77
|
+
const group = await updateGroup(req.params.id, {
|
|
78
|
+
...(typeof name === 'string' ? { name } : {}),
|
|
79
|
+
...(description !== undefined
|
|
80
|
+
? {
|
|
81
|
+
description: typeof description === 'string' ? description : null,
|
|
82
|
+
}
|
|
83
|
+
: {}),
|
|
84
|
+
}, req.user.userId);
|
|
85
|
+
if (!group) {
|
|
86
|
+
res.status(404).json({ success: false, message: 'Group not found' });
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
res.json({ success: true, data: group });
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
handleError(res, error, 'Group update error:');
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
/** Delete a group; its grants and memberships go with it. */
|
|
96
|
+
router.delete('/:id', async (req, res) => {
|
|
97
|
+
try {
|
|
98
|
+
const deleted = await deleteGroup(req.params.id, req.user.userId);
|
|
99
|
+
if (!deleted) {
|
|
100
|
+
res.status(404).json({ success: false, message: 'Group not found' });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
res.json({ success: true });
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
handleError(res, error, 'Group delete error:');
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
/** Add a member. */
|
|
110
|
+
router.post('/:id/members', async (req, res) => {
|
|
111
|
+
try {
|
|
112
|
+
const { userId } = req.body ?? {};
|
|
113
|
+
if (typeof userId !== 'string' || !userId) {
|
|
114
|
+
res.status(400).json({ success: false, message: 'userId is required' });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const added = await addGroupMember(req.params.id, userId, req.user.userId);
|
|
118
|
+
res.status(added ? 201 : 200).json({ success: true, data: { added } });
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
handleError(res, error, 'Group member add error:');
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
/** Remove a member; access via this group's grants ends immediately. */
|
|
125
|
+
router.delete('/:id/members/:userId', async (req, res) => {
|
|
126
|
+
try {
|
|
127
|
+
if (!(await getGroup(req.params.id))) {
|
|
128
|
+
res.status(404).json({ success: false, message: 'Group not found' });
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const removed = await removeGroupMember(req.params.id, req.params.userId, req.user.userId);
|
|
132
|
+
res.json({ success: true, data: { removed } });
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
handleError(res, error, 'Group member remove error:');
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
/**
|
|
139
|
+
* Effective access for one user: role, groups, feature gates, and every
|
|
140
|
+
* grant reaching them — the "why can this user access this?" view.
|
|
141
|
+
*/
|
|
142
|
+
router.get('/effective/:userId', async (req, res) => {
|
|
143
|
+
try {
|
|
144
|
+
const user = await userModel.getUserById(req.params.userId);
|
|
145
|
+
if (!user) {
|
|
146
|
+
res.status(404).json({ success: false, message: 'User not found' });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const view = await explainEffectiveAccess({
|
|
150
|
+
id: user.id,
|
|
151
|
+
role: user.role,
|
|
152
|
+
status: user.status,
|
|
153
|
+
});
|
|
154
|
+
res.json({ success: true, data: { ...view, username: user.username } });
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
handleError(res, error, 'Effective access error:');
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
export default router;
|
|
161
|
+
//# sourceMappingURL=groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/routes/groups.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/routes/jobs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/routes/jobs.ts"],"names":[],"mappings":"AAeA,QAAA,MAAM,MAAM,4CAAmB,CAAC;eAsIjB,MAAM"}
|
|
@@ -5,9 +5,18 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import express from 'express';
|
|
7
7
|
import { authenticate } from '../middleware/auth.js';
|
|
8
|
+
import rateLimit from '../middleware/sharedRateLimit.js';
|
|
8
9
|
import { DurableJobError, getDurableJobRuntime, } from '../platform/jobs/index.js';
|
|
9
10
|
const router = express.Router();
|
|
10
11
|
router.use(authenticate);
|
|
12
|
+
router.use(rateLimit({
|
|
13
|
+
keyPrefix: 'durable-jobs',
|
|
14
|
+
windowMs: 60000,
|
|
15
|
+
max: 240,
|
|
16
|
+
keyGenerator: req => req.user?.userId || 'unauthenticated',
|
|
17
|
+
standardHeaders: true,
|
|
18
|
+
legacyHeaders: false,
|
|
19
|
+
}));
|
|
11
20
|
const identity = (req) => {
|
|
12
21
|
if (!req.user)
|
|
13
22
|
throw new Error('Authenticated user context is required');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/routes/jobs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAA6B,MAAM,uBAAuB,CAAC;AAChF,OAAO,EACL,eAAe,EACf,oBAAoB,GAErB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAChC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/routes/jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { StoredApiTokenRecord } from '../persistence/index.js';
|
|
2
|
+
export declare const API_TOKEN_PREFIX = "lwk_";
|
|
3
|
+
export declare const API_TOKEN_SCOPES: readonly ['chat', 'models', 'documents', 'notes', 'personas', 'media', 'work', 'admin'];
|
|
4
|
+
export type ApiTokenScope = (typeof API_TOKEN_SCOPES)[number];
|
|
5
|
+
export declare const isApiTokenScope: (value: unknown) => value is ApiTokenScope;
|
|
6
|
+
export declare class ApiTokenScopeError extends Error {
|
|
7
|
+
readonly requiredScope: ApiTokenScope | null;
|
|
8
|
+
constructor(requiredScope: ApiTokenScope | null);
|
|
9
|
+
}
|
|
10
|
+
export declare class ApiTokenRateLimitError extends Error {
|
|
11
|
+
constructor();
|
|
12
|
+
}
|
|
13
|
+
export declare const hashApiToken: (token: string) => string;
|
|
14
|
+
export declare const looksLikeApiToken: (bearer: string) => boolean;
|
|
15
|
+
export declare const parseTokenScopes: (record: StoredApiTokenRecord) => ApiTokenScope[];
|
|
16
|
+
export interface CreatedApiToken {
|
|
17
|
+
token: string;
|
|
18
|
+
record: StoredApiTokenRecord;
|
|
19
|
+
}
|
|
20
|
+
export declare const createApiToken: (userId: string, input: {
|
|
21
|
+
name: string;
|
|
22
|
+
scopes: ApiTokenScope[];
|
|
23
|
+
expiresInDays?: number;
|
|
24
|
+
}) => Promise<CreatedApiToken>;
|
|
25
|
+
/** Resolve a presented bearer to a live token record, or null. */
|
|
26
|
+
export declare const resolveApiToken: (bearer: string) => Promise<StoredApiTokenRecord | null>;
|
|
27
|
+
/** Distributed per-token rate limit; skipped when no coordinator exists. */
|
|
28
|
+
export declare const consumeApiTokenRateLimit: (tokenId: string) => Promise<void>;
|
|
29
|
+
export declare const touchApiTokenUse: (record: StoredApiTokenRecord) => Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* The scope a request path requires, or an error when tokens are barred
|
|
32
|
+
* from the route family entirely.
|
|
33
|
+
*/
|
|
34
|
+
export declare const requiredScopeForPath: (path: string) => ApiTokenScope | null;
|
|
35
|
+
export declare const assertTokenAllowsPath: (record: StoredApiTokenRecord, path: string) => ApiTokenScope[];
|
|
36
|
+
export declare const listTokensForUser: (userId: string) => Promise<StoredApiTokenRecord[]>;
|
|
37
|
+
export declare const listAllTokens: () => Promise<StoredApiTokenRecord[]>;
|
|
38
|
+
export declare const findTokenById: (tokenId: string) => Promise<StoredApiTokenRecord | null>;
|
|
39
|
+
export declare const revokeApiToken: (tokenId: string) => Promise<boolean>;
|
|
40
|
+
/** Public projection: never exposes the hash. */
|
|
41
|
+
export declare const toPublicToken: (record: StoredApiTokenRecord) => {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
tokenPrefix: string;
|
|
45
|
+
scopes: ("admin" | "chat" | "documents" | "media" | "models" | "notes" | "personas" | "work")[];
|
|
46
|
+
createdAt: string;
|
|
47
|
+
expiresAt: string | null;
|
|
48
|
+
lastUsedAt: string | null;
|
|
49
|
+
revokedAt: string | null;
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=apiTokenService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiTokenService.d.ts","sourceRoot":"","sources":["../../src/services/apiTokenService.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAOpE,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAEvC,eAAO,MAAM,gBAAgB,YAC3B,MAAM,EACN,QAAQ,EACR,WAAW,EACX,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,OAAO,CACC,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,KAAK,IAAI,aAED,CAAC;AAoC1D,qBAAa,kBAAmB,SAAQ,KAAK;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAAxD,YAAqB,aAAa,EAAE,aAAa,GAAG,IAAI,EAOvD;CACF;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,cAGC;CACF;AAKD,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,MACK,CAAC;AAEnD,eAAO,MAAM,iBAAiB,WAAY,MAAM,KAAG,OACd,CAAC;AAEtC,eAAO,MAAM,gBAAgB,WACnB,oBAAoB,KAC3B,aAAa,EAQf,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,WACjB,MAAM,SACP;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,KACvE,OAAO,CAAC,eAAe,CAmCzB,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,eAAe,WAClB,MAAM,KACb,OAAO,CAAC,oBAAoB,GAAG,IAAI,CASrC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,YAC1B,MAAM,KACd,OAAO,CAAC,IAAI,CAgBd,CAAC;AAEF,eAAO,MAAM,gBAAgB,WACnB,oBAAoB,KAC3B,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,SAAU,MAAM,KAAG,aAAa,GAAG,IAInE,CAAC;AAEF,eAAO,MAAM,qBAAqB,WACxB,oBAAoB,QACtB,MAAM,KACX,aAAa,EAMf,CAAC;AAEF,eAAO,MAAM,iBAAiB,WACpB,MAAM,KACb,OAAO,CAAC,oBAAoB,EAAE,CAAgC,CAAC;AAElE,eAAO,MAAM,aAAa,QAAO,OAAO,CAAC,oBAAoB,EAAE,CAC3C,CAAC;AAErB,eAAO,MAAM,aAAa,YACf,MAAM,KACd,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAA+B,CAAC;AAEtE,eAAO,MAAM,cAAc,YAAmB,MAAM,KAAG,OAAO,CAAC,OAAO,CAChC,CAAC;AAEvC,iDAAiD;AACjD,eAAO,MAAM,aAAa,WAAY,oBAAoB;IACxD,EAAE;IACF,IAAI;IACJ,WAAW;IACX,MAAM;IACN,SAAS;IACT,SAAS;IAGT,UAAU;IAGV,SAAS;CAGT,CAAC"}
|
|
@@ -0,0 +1,220 @@
|
|
|
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
|
+
* Scoped personal API tokens (IAM-05).
|
|
19
|
+
*
|
|
20
|
+
* Tokens are shown once at creation and stored only as a SHA-256 digest.
|
|
21
|
+
* Each token carries an explicit scope list; the auth middleware maps the
|
|
22
|
+
* requested route to a required scope, so a leaked notes-only token cannot
|
|
23
|
+
* touch chats, media, or administration. Expiry, revocation, and last-use
|
|
24
|
+
* are enforced and tracked server-side.
|
|
25
|
+
*/
|
|
26
|
+
import { createHash, randomBytes, randomUUID } from 'node:crypto';
|
|
27
|
+
import { getPersistence } from '../persistence/index.js';
|
|
28
|
+
import { getInitializedCoordinator } from '../platform/coordination/service.js';
|
|
29
|
+
import { encryptionService } from './encryptionService.js';
|
|
30
|
+
import { createLogger } from '../utils/logger.js';
|
|
31
|
+
const logger = createLogger('services:api-tokens');
|
|
32
|
+
export const API_TOKEN_PREFIX = 'lwk_';
|
|
33
|
+
export const API_TOKEN_SCOPES = [
|
|
34
|
+
'chat',
|
|
35
|
+
'models',
|
|
36
|
+
'documents',
|
|
37
|
+
'notes',
|
|
38
|
+
'personas',
|
|
39
|
+
'media',
|
|
40
|
+
'work',
|
|
41
|
+
'admin',
|
|
42
|
+
];
|
|
43
|
+
export const isApiTokenScope = (value) => typeof value === 'string' &&
|
|
44
|
+
API_TOKEN_SCOPES.includes(value);
|
|
45
|
+
/** Requests per minute allowed per token across every replica. */
|
|
46
|
+
const API_TOKEN_RATE_LIMIT = 600;
|
|
47
|
+
const API_TOKEN_RATE_WINDOW_MS = 60000;
|
|
48
|
+
const LAST_USED_THROTTLE_MS = 60000;
|
|
49
|
+
const MAX_TOKENS_PER_USER = 25;
|
|
50
|
+
/**
|
|
51
|
+
* Route-prefix to scope mapping. Session management and account routes are
|
|
52
|
+
* deliberately unreachable with an API token; unknown prefixes require the
|
|
53
|
+
* admin scope so a new route family fails closed until mapped here.
|
|
54
|
+
*/
|
|
55
|
+
const PATH_SCOPES = [
|
|
56
|
+
{ prefix: '/api/chat', scope: 'chat' },
|
|
57
|
+
{ prefix: '/api/preferences', scope: 'chat' },
|
|
58
|
+
{ prefix: '/api/search', scope: 'chat' },
|
|
59
|
+
{ prefix: '/api/jobs', scope: 'chat' },
|
|
60
|
+
{ prefix: '/api/ollama', scope: 'models' },
|
|
61
|
+
{ prefix: '/api/huggingface-hub', scope: 'models' },
|
|
62
|
+
{ prefix: '/api/documents', scope: 'documents' },
|
|
63
|
+
{ prefix: '/api/embeddings', scope: 'documents' },
|
|
64
|
+
{ prefix: '/api/notes', scope: 'notes' },
|
|
65
|
+
{ prefix: '/api/personas', scope: 'personas' },
|
|
66
|
+
{ prefix: '/api/tts', scope: 'media' },
|
|
67
|
+
{ prefix: '/api/stt', scope: 'media' },
|
|
68
|
+
{ prefix: '/api/image-gen', scope: 'media' },
|
|
69
|
+
{ prefix: '/api/media', scope: 'media' },
|
|
70
|
+
{ prefix: '/api/artifacts', scope: 'media' },
|
|
71
|
+
{ prefix: '/api/work', scope: 'work' },
|
|
72
|
+
{ prefix: '/api/agent-clis', scope: 'work' },
|
|
73
|
+
{ prefix: '/api/health', scope: 'chat' },
|
|
74
|
+
];
|
|
75
|
+
const FORBIDDEN_PREFIXES = ['/api/auth'];
|
|
76
|
+
export class ApiTokenScopeError extends Error {
|
|
77
|
+
constructor(requiredScope) {
|
|
78
|
+
super(requiredScope
|
|
79
|
+
? `This API token is missing the '${requiredScope}' scope`
|
|
80
|
+
: 'This route cannot be used with an API token');
|
|
81
|
+
this.requiredScope = requiredScope;
|
|
82
|
+
this.name = 'ApiTokenScopeError';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export class ApiTokenRateLimitError extends Error {
|
|
86
|
+
constructor() {
|
|
87
|
+
super('API token rate limit exceeded');
|
|
88
|
+
this.name = 'ApiTokenRateLimitError';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const tokens = () => getPersistence(encryptionService).repositories.security.apiTokens;
|
|
92
|
+
export const hashApiToken = (token) => createHash('sha256').update(token).digest('hex');
|
|
93
|
+
export const looksLikeApiToken = (bearer) => bearer.startsWith(API_TOKEN_PREFIX);
|
|
94
|
+
export const parseTokenScopes = (record) => {
|
|
95
|
+
try {
|
|
96
|
+
const parsed = JSON.parse(record.scopes);
|
|
97
|
+
if (Array.isArray(parsed))
|
|
98
|
+
return parsed.filter(isApiTokenScope);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// fall through to empty scopes: an unreadable list must fail closed.
|
|
102
|
+
}
|
|
103
|
+
return [];
|
|
104
|
+
};
|
|
105
|
+
export const createApiToken = async (userId, input) => {
|
|
106
|
+
const name = input.name.trim();
|
|
107
|
+
if (!name || name.length > 128) {
|
|
108
|
+
throw new Error('Token name must be between 1 and 128 characters');
|
|
109
|
+
}
|
|
110
|
+
const scopes = [...new Set(input.scopes)].filter(isApiTokenScope);
|
|
111
|
+
if (scopes.length === 0) {
|
|
112
|
+
throw new Error('At least one valid scope is required');
|
|
113
|
+
}
|
|
114
|
+
const existing = await tokens().listByUser(userId);
|
|
115
|
+
if (existing.filter(item => item.revoked_at === null).length >=
|
|
116
|
+
MAX_TOKENS_PER_USER) {
|
|
117
|
+
throw new Error(`A user may hold at most ${MAX_TOKENS_PER_USER} tokens`);
|
|
118
|
+
}
|
|
119
|
+
const secret = `${API_TOKEN_PREFIX}${randomBytes(32).toString('base64url')}`;
|
|
120
|
+
const now = Date.now();
|
|
121
|
+
const record = {
|
|
122
|
+
id: randomUUID(),
|
|
123
|
+
user_id: userId,
|
|
124
|
+
name,
|
|
125
|
+
token_hash: hashApiToken(secret),
|
|
126
|
+
token_prefix: secret.slice(0, 12),
|
|
127
|
+
scopes: JSON.stringify(scopes),
|
|
128
|
+
created_at: now,
|
|
129
|
+
expires_at: input.expiresInDays && input.expiresInDays > 0
|
|
130
|
+
? now + Math.min(input.expiresInDays, 3650) * 24 * 60 * 60 * 1000
|
|
131
|
+
: null,
|
|
132
|
+
last_used_at: null,
|
|
133
|
+
revoked_at: null,
|
|
134
|
+
};
|
|
135
|
+
await tokens().insert(record);
|
|
136
|
+
return { token: secret, record };
|
|
137
|
+
};
|
|
138
|
+
/** Resolve a presented bearer to a live token record, or null. */
|
|
139
|
+
export const resolveApiToken = async (bearer) => {
|
|
140
|
+
if (!looksLikeApiToken(bearer))
|
|
141
|
+
return null;
|
|
142
|
+
const record = await tokens().findByHash(hashApiToken(bearer));
|
|
143
|
+
if (!record)
|
|
144
|
+
return null;
|
|
145
|
+
if (record.revoked_at !== null)
|
|
146
|
+
return null;
|
|
147
|
+
if (record.expires_at !== null && record.expires_at <= Date.now()) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
return record;
|
|
151
|
+
};
|
|
152
|
+
/** Distributed per-token rate limit; skipped when no coordinator exists. */
|
|
153
|
+
export const consumeApiTokenRateLimit = async (tokenId) => {
|
|
154
|
+
const coordinator = getInitializedCoordinator();
|
|
155
|
+
if (!coordinator)
|
|
156
|
+
return;
|
|
157
|
+
try {
|
|
158
|
+
const result = await coordinator.consumeRateLimit(`api-token:${tokenId}`, API_TOKEN_RATE_LIMIT, API_TOKEN_RATE_WINDOW_MS);
|
|
159
|
+
if (!result.allowed)
|
|
160
|
+
throw new ApiTokenRateLimitError();
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (error instanceof ApiTokenRateLimitError)
|
|
164
|
+
throw error;
|
|
165
|
+
// Coordinator trouble must not take API access down with it; the shared
|
|
166
|
+
// HTTP limiters still bound abuse.
|
|
167
|
+
logger.warn('API token rate limit check failed', { error });
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
export const touchApiTokenUse = async (record) => {
|
|
171
|
+
const now = Date.now();
|
|
172
|
+
if (record.last_used_at !== null &&
|
|
173
|
+
now - record.last_used_at < LAST_USED_THROTTLE_MS) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
await tokens()
|
|
177
|
+
.touchLastUsed(record.id, now)
|
|
178
|
+
.catch(() => undefined);
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* The scope a request path requires, or an error when tokens are barred
|
|
182
|
+
* from the route family entirely.
|
|
183
|
+
*/
|
|
184
|
+
export const requiredScopeForPath = (path) => {
|
|
185
|
+
if (FORBIDDEN_PREFIXES.some(prefix => path.startsWith(prefix)))
|
|
186
|
+
return null;
|
|
187
|
+
const match = PATH_SCOPES.find(entry => path.startsWith(entry.prefix));
|
|
188
|
+
return match ? match.scope : 'admin';
|
|
189
|
+
};
|
|
190
|
+
export const assertTokenAllowsPath = (record, path) => {
|
|
191
|
+
const scopes = parseTokenScopes(record);
|
|
192
|
+
const required = requiredScopeForPath(path);
|
|
193
|
+
if (required === null)
|
|
194
|
+
throw new ApiTokenScopeError(null);
|
|
195
|
+
if (scopes.includes('admin') || scopes.includes(required))
|
|
196
|
+
return scopes;
|
|
197
|
+
throw new ApiTokenScopeError(required);
|
|
198
|
+
};
|
|
199
|
+
export const listTokensForUser = (userId) => tokens().listByUser(userId);
|
|
200
|
+
export const listAllTokens = () => tokens().listAll();
|
|
201
|
+
export const findTokenById = (tokenId) => tokens().findById(tokenId);
|
|
202
|
+
export const revokeApiToken = async (tokenId) => tokens().revoke(tokenId, Date.now());
|
|
203
|
+
/** Public projection: never exposes the hash. */
|
|
204
|
+
export const toPublicToken = (record) => ({
|
|
205
|
+
id: record.id,
|
|
206
|
+
name: record.name,
|
|
207
|
+
tokenPrefix: record.token_prefix,
|
|
208
|
+
scopes: parseTokenScopes(record),
|
|
209
|
+
createdAt: new Date(record.created_at).toISOString(),
|
|
210
|
+
expiresAt: record.expires_at
|
|
211
|
+
? new Date(record.expires_at).toISOString()
|
|
212
|
+
: null,
|
|
213
|
+
lastUsedAt: record.last_used_at
|
|
214
|
+
? new Date(record.last_used_at).toISOString()
|
|
215
|
+
: null,
|
|
216
|
+
revokedAt: record.revoked_at
|
|
217
|
+
? new Date(record.revoked_at).toISOString()
|
|
218
|
+
: null,
|
|
219
|
+
});
|
|
220
|
+
//# sourceMappingURL=apiTokenService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiTokenService.js","sourceRoot":"","sources":["../../src/services/apiTokenService.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,22 @@ import { TurnstilePublicConfig } from './turnstileService.js';
|
|
|
4
4
|
export declare const JWT_SECRET: string;
|
|
5
5
|
export declare const parseJwtLifetime: (value?: string | undefined) => SignOptions['expiresIn'];
|
|
6
6
|
export declare const JWT_EXPIRES_IN: number | import("ms").StringValue | undefined;
|
|
7
|
+
/** The configured JWT lifetime in milliseconds. */
|
|
8
|
+
export declare const jwtLifetimeMs: (lifetime?: SignOptions['expiresIn']) => number;
|
|
7
9
|
export interface AuthTokenPayload {
|
|
8
10
|
userId: string;
|
|
9
11
|
username: string;
|
|
10
12
|
role: 'admin' | 'user';
|
|
13
|
+
/** Server-side auth session id; absent only on legacy tokens. */
|
|
14
|
+
sid?: string;
|
|
11
15
|
iat?: number;
|
|
12
16
|
exp?: number;
|
|
13
17
|
}
|
|
18
|
+
export interface SessionMetadata {
|
|
19
|
+
kind: string;
|
|
20
|
+
ip?: string | undefined;
|
|
21
|
+
userAgent?: string | undefined;
|
|
22
|
+
}
|
|
14
23
|
export type AuthResult = {
|
|
15
24
|
status: 'authenticated';
|
|
16
25
|
user: UserPublic;
|
|
@@ -30,9 +39,16 @@ export interface SystemInfo {
|
|
|
30
39
|
}
|
|
31
40
|
export declare class AuthService {
|
|
32
41
|
/**
|
|
33
|
-
* Generate JWT token for user
|
|
42
|
+
* Generate JWT token for user. When a server-side session id is provided
|
|
43
|
+
* the token carries it as `sid`, making the token revocable.
|
|
44
|
+
*/
|
|
45
|
+
generateToken(user: UserPublic, sessionId?: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Create a server-side auth session and mint the JWT bound to it. All
|
|
48
|
+
* login paths (password, signup bootstrap, OAuth, OIDC) issue through
|
|
49
|
+
* here so every new token is revocable from the session inventory.
|
|
34
50
|
*/
|
|
35
|
-
|
|
51
|
+
issueSession(user: UserPublic, metadata: SessionMetadata): Promise<string>;
|
|
36
52
|
/**
|
|
37
53
|
* Verify JWT token
|
|
38
54
|
*/
|
|
@@ -40,7 +56,7 @@ export declare class AuthService {
|
|
|
40
56
|
/**
|
|
41
57
|
* Login user
|
|
42
58
|
*/
|
|
43
|
-
login(username: string, password: string): Promise<AuthResult | null>;
|
|
59
|
+
login(username: string, password: string, metadata?: SessionMetadata): Promise<AuthResult | null>;
|
|
44
60
|
/**
|
|
45
61
|
* Get system information
|
|
46
62
|
*/
|
|
@@ -60,7 +76,7 @@ export declare class AuthService {
|
|
|
60
76
|
/**
|
|
61
77
|
* Signup user
|
|
62
78
|
*/
|
|
63
|
-
signup(username: string, password: string, email?: string): Promise<AuthResult | null>;
|
|
79
|
+
signup(username: string, password: string, email?: string, metadata?: SessionMetadata): Promise<AuthResult | null>;
|
|
64
80
|
}
|
|
65
81
|
export declare const authService: AuthService;
|
|
66
82
|
//# sourceMappingURL=authService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authService.d.ts","sourceRoot":"","sources":["../../src/services/authService.ts"],"names":[],"mappings":"AAiBA,OAAY,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAa,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,EAAoB,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAyBhF,eAAO,MAAM,UAAU,QAWjB,CAAC;AAEP,eAAO,MAAM,gBAAgB,kCAE1B,WAAW,CAAC,WAAW,CAWzB,CAAC;AAEF,eAAO,MAAM,cAAc,+CAAqB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,qBAAa,WAAW;IACtB
|
|
1
|
+
{"version":3,"file":"authService.d.ts","sourceRoot":"","sources":["../../src/services/authService.ts"],"names":[],"mappings":"AAiBA,OAAY,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAa,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,EAAoB,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAyBhF,eAAO,MAAM,UAAU,QAWjB,CAAC;AAEP,eAAO,MAAM,gBAAgB,kCAE1B,WAAW,CAAC,WAAW,CAWzB,CAAC;AAEF,eAAO,MAAM,cAAc,+CAAqB,CAAC;AAEjD,mDAAmD;AACnD,eAAO,MAAM,aAAa,cACd,WAAW,CAAC,WAAW,CAAC,KACjC,MAgBF,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,qBAAa,WAAW;IACtB;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAa1D;IAED;;;;OAIG;IACG,YAAY,CAChB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CAQjB;IAED;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAelD;IAED;;OAEG;IACG,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAe5B;IAED;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAYzC;IAED,+DAA+D;IAC/D,2BAA2B,IAAI,OAAO,CAErC;IAED,yEAAyE;IACnE,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9C;IAED;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAMhE;IAED;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAKpE;IAED;;OAEG;IACG,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAyC5B;CACF;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|