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,151 @@
|
|
|
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 { createHash } from 'node:crypto';
|
|
18
|
+
/**
|
|
19
|
+
* Trust-foundation schema: groups, resource grants, auth sessions, API
|
|
20
|
+
* tokens, OAuth identities, and the append-only security audit log.
|
|
21
|
+
*/
|
|
22
|
+
// CHECK expressions use the exact form PostgreSQL reconstructs in
|
|
23
|
+
// pg_get_constraintdef (no BETWEEN), so the schema inspector's declared and
|
|
24
|
+
// actual constraint texts normalize identically.
|
|
25
|
+
export const POSTGRES_TRUST_FOUNDATION_SQL = `CREATE TABLE user_groups (
|
|
26
|
+
id text PRIMARY KEY,
|
|
27
|
+
name text NOT NULL UNIQUE CHECK (length(name) >= 1 AND length(name) <= 128),
|
|
28
|
+
description text,
|
|
29
|
+
created_by text,
|
|
30
|
+
created_at bigint NOT NULL,
|
|
31
|
+
updated_at bigint NOT NULL
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE TABLE user_group_members (
|
|
35
|
+
group_id text NOT NULL REFERENCES user_groups(id) ON DELETE CASCADE,
|
|
36
|
+
user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
37
|
+
added_by text,
|
|
38
|
+
added_at bigint NOT NULL,
|
|
39
|
+
PRIMARY KEY (group_id, user_id)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE INDEX idx_user_group_members_user
|
|
43
|
+
ON user_group_members(user_id, group_id);
|
|
44
|
+
|
|
45
|
+
CREATE TABLE resource_grants (
|
|
46
|
+
id text PRIMARY KEY,
|
|
47
|
+
resource_type text NOT NULL
|
|
48
|
+
CHECK (length(resource_type) >= 1 AND length(resource_type) <= 64),
|
|
49
|
+
resource_id text NOT NULL
|
|
50
|
+
CHECK (length(resource_id) >= 1 AND length(resource_id) <= 256),
|
|
51
|
+
owner_user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
52
|
+
principal_type text NOT NULL CHECK (principal_type IN ('user', 'group')),
|
|
53
|
+
principal_id text NOT NULL,
|
|
54
|
+
permission text NOT NULL CHECK (permission IN ('read', 'write', 'admin')),
|
|
55
|
+
created_by text NOT NULL,
|
|
56
|
+
created_at bigint NOT NULL,
|
|
57
|
+
UNIQUE (resource_type, resource_id, principal_type, principal_id)
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
CREATE INDEX idx_resource_grants_resource
|
|
61
|
+
ON resource_grants(resource_type, resource_id);
|
|
62
|
+
|
|
63
|
+
CREATE INDEX idx_resource_grants_principal
|
|
64
|
+
ON resource_grants(principal_type, principal_id);
|
|
65
|
+
|
|
66
|
+
CREATE TABLE auth_sessions (
|
|
67
|
+
id text PRIMARY KEY,
|
|
68
|
+
user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
69
|
+
kind text NOT NULL,
|
|
70
|
+
ip_hash text,
|
|
71
|
+
user_agent text,
|
|
72
|
+
created_at bigint NOT NULL,
|
|
73
|
+
last_seen_at bigint NOT NULL,
|
|
74
|
+
expires_at bigint NOT NULL,
|
|
75
|
+
revoked_at bigint,
|
|
76
|
+
revoked_by text
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
CREATE INDEX idx_auth_sessions_user
|
|
80
|
+
ON auth_sessions(user_id, last_seen_at);
|
|
81
|
+
|
|
82
|
+
CREATE INDEX idx_auth_sessions_expires
|
|
83
|
+
ON auth_sessions(expires_at);
|
|
84
|
+
|
|
85
|
+
CREATE TABLE api_tokens (
|
|
86
|
+
id text PRIMARY KEY,
|
|
87
|
+
user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
88
|
+
name text NOT NULL CHECK (length(name) >= 1 AND length(name) <= 128),
|
|
89
|
+
token_hash text NOT NULL UNIQUE,
|
|
90
|
+
token_prefix text NOT NULL,
|
|
91
|
+
scopes text NOT NULL,
|
|
92
|
+
created_at bigint NOT NULL,
|
|
93
|
+
expires_at bigint,
|
|
94
|
+
last_used_at bigint,
|
|
95
|
+
revoked_at bigint
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
CREATE INDEX idx_api_tokens_user
|
|
99
|
+
ON api_tokens(user_id, created_at);
|
|
100
|
+
|
|
101
|
+
CREATE TABLE oauth_identities (
|
|
102
|
+
provider text NOT NULL,
|
|
103
|
+
subject text NOT NULL,
|
|
104
|
+
user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
105
|
+
email text,
|
|
106
|
+
created_at bigint NOT NULL,
|
|
107
|
+
updated_at bigint NOT NULL,
|
|
108
|
+
PRIMARY KEY (provider, subject)
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
CREATE INDEX idx_oauth_identities_user
|
|
112
|
+
ON oauth_identities(user_id);
|
|
113
|
+
|
|
114
|
+
CREATE TABLE security_audit_events (
|
|
115
|
+
id text PRIMARY KEY,
|
|
116
|
+
occurred_at bigint NOT NULL,
|
|
117
|
+
actor_user_id text,
|
|
118
|
+
actor_kind text NOT NULL,
|
|
119
|
+
action text NOT NULL CHECK (length(action) >= 1 AND length(action) <= 128),
|
|
120
|
+
target_type text,
|
|
121
|
+
target_id text,
|
|
122
|
+
result text NOT NULL CHECK (result IN ('success', 'denied', 'failure')),
|
|
123
|
+
request_id text,
|
|
124
|
+
ip_hash text,
|
|
125
|
+
details text
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
CREATE INDEX idx_security_audit_occurred
|
|
129
|
+
ON security_audit_events(occurred_at, id);
|
|
130
|
+
|
|
131
|
+
CREATE INDEX idx_security_audit_actor
|
|
132
|
+
ON security_audit_events(actor_user_id, occurred_at);
|
|
133
|
+
|
|
134
|
+
CREATE INDEX idx_security_audit_action
|
|
135
|
+
ON security_audit_events(action, occurred_at);`;
|
|
136
|
+
const version = 13;
|
|
137
|
+
const name = 'trust-foundation';
|
|
138
|
+
export const POSTGRES_TRUST_FOUNDATION_MIGRATION = Object.freeze({
|
|
139
|
+
version,
|
|
140
|
+
name,
|
|
141
|
+
checksum: createHash('sha256')
|
|
142
|
+
.update(`${version}\n${name}\n${POSTGRES_TRUST_FOUNDATION_SQL}`)
|
|
143
|
+
.digest('hex'),
|
|
144
|
+
sql: POSTGRES_TRUST_FOUNDATION_SQL,
|
|
145
|
+
rollbackPlan: 'DROP TABLE security_audit_events, oauth_identities, api_tokens, ' +
|
|
146
|
+
'auth_sessions, resource_grants, user_group_members, user_groups; ' +
|
|
147
|
+
'delete ledger row 13. Existing bearer tokens keep working because ' +
|
|
148
|
+
'sid-less JWTs remain accepted; issued API tokens stop resolving.',
|
|
149
|
+
minimumCompatibleVersion: 13,
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=postgresTrustFoundationMigration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresTrustFoundationMigration.js","sourceRoot":"","sources":["../../src/persistence/postgresTrustFoundationMigration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;GAGG;AACH,kEAAkE;AAClE,4EAA4E;AAC5E,iDAAiD;AACjD,MAAM,CAAC,MAAM,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDA8GI,CAAC;AAElD,MAAM,OAAO,GAAG,EAAE,CAAC;AACnB,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAEhC,MAAM,CAAC,MAAM,mCAAmC,GAC9C,MAAM,CAAC,MAAM,CAAC;IACZ,OAAO;IACP,IAAI;IACJ,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC;SAC3B,MAAM,CAAC,GAAG,OAAO,KAAK,IAAI,KAAK,6BAA6B,EAAE,CAAC;SAC/D,MAAM,CAAC,KAAK,CAAC;IAChB,GAAG,EAAE,6BAA6B;IAClC,YAAY,EACV,kEAAkE;QAClE,mEAAmE;QACnE,oEAAoE;QACpE,kEAAkE;IACpE,wBAAwB,EAAE,EAAE;CAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trust-foundation persistence contracts: groups, resource grants, auth
|
|
3
|
+
* sessions, API tokens, OAuth identities, and the security audit log.
|
|
4
|
+
*
|
|
5
|
+
* Repositories exchange snake_case row shapes with epoch-millisecond
|
|
6
|
+
* timestamps, mirroring the resource repositories. Values arrive already
|
|
7
|
+
* validated; secrets (API tokens) arrive already hashed. The audit log is
|
|
8
|
+
* append-only: there is no update or delete surface beyond retention pruning.
|
|
9
|
+
*/
|
|
10
|
+
export type GrantPrincipalType = 'user' | 'group';
|
|
11
|
+
export type GrantPermission = 'read' | 'write' | 'admin';
|
|
12
|
+
export type AuditResult = 'success' | 'denied' | 'failure';
|
|
13
|
+
export interface StoredGroupRecord {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
description: string | null;
|
|
17
|
+
created_by: string | null;
|
|
18
|
+
created_at: number;
|
|
19
|
+
updated_at: number;
|
|
20
|
+
}
|
|
21
|
+
export interface StoredGroupMemberRecord {
|
|
22
|
+
group_id: string;
|
|
23
|
+
user_id: string;
|
|
24
|
+
added_by: string | null;
|
|
25
|
+
added_at: number;
|
|
26
|
+
}
|
|
27
|
+
export interface StoredResourceGrantRecord {
|
|
28
|
+
id: string;
|
|
29
|
+
resource_type: string;
|
|
30
|
+
resource_id: string;
|
|
31
|
+
owner_user_id: string;
|
|
32
|
+
principal_type: GrantPrincipalType;
|
|
33
|
+
principal_id: string;
|
|
34
|
+
permission: GrantPermission;
|
|
35
|
+
created_by: string;
|
|
36
|
+
created_at: number;
|
|
37
|
+
}
|
|
38
|
+
export interface StoredAuthSessionRecord {
|
|
39
|
+
id: string;
|
|
40
|
+
user_id: string;
|
|
41
|
+
kind: string;
|
|
42
|
+
ip_hash: string | null;
|
|
43
|
+
user_agent: string | null;
|
|
44
|
+
created_at: number;
|
|
45
|
+
last_seen_at: number;
|
|
46
|
+
expires_at: number;
|
|
47
|
+
revoked_at: number | null;
|
|
48
|
+
revoked_by: string | null;
|
|
49
|
+
}
|
|
50
|
+
export interface StoredApiTokenRecord {
|
|
51
|
+
id: string;
|
|
52
|
+
user_id: string;
|
|
53
|
+
name: string;
|
|
54
|
+
token_hash: string;
|
|
55
|
+
token_prefix: string;
|
|
56
|
+
scopes: string;
|
|
57
|
+
created_at: number;
|
|
58
|
+
expires_at: number | null;
|
|
59
|
+
last_used_at: number | null;
|
|
60
|
+
revoked_at: number | null;
|
|
61
|
+
}
|
|
62
|
+
export interface StoredOAuthIdentityRecord {
|
|
63
|
+
provider: string;
|
|
64
|
+
subject: string;
|
|
65
|
+
user_id: string;
|
|
66
|
+
email: string | null;
|
|
67
|
+
created_at: number;
|
|
68
|
+
updated_at: number;
|
|
69
|
+
}
|
|
70
|
+
export interface StoredSecurityAuditEventRecord {
|
|
71
|
+
id: string;
|
|
72
|
+
occurred_at: number;
|
|
73
|
+
actor_user_id: string | null;
|
|
74
|
+
actor_kind: string;
|
|
75
|
+
action: string;
|
|
76
|
+
target_type: string | null;
|
|
77
|
+
target_id: string | null;
|
|
78
|
+
result: AuditResult;
|
|
79
|
+
request_id: string | null;
|
|
80
|
+
ip_hash: string | null;
|
|
81
|
+
details: string | null;
|
|
82
|
+
}
|
|
83
|
+
export interface SecurityAuditQuery {
|
|
84
|
+
action?: string;
|
|
85
|
+
actorUserId?: string;
|
|
86
|
+
result?: AuditResult;
|
|
87
|
+
targetType?: string;
|
|
88
|
+
before?: number;
|
|
89
|
+
after?: number;
|
|
90
|
+
limit: number;
|
|
91
|
+
}
|
|
92
|
+
export interface GroupRepository {
|
|
93
|
+
list(): Promise<StoredGroupRecord[]>;
|
|
94
|
+
findById(groupId: string): Promise<StoredGroupRecord | null>;
|
|
95
|
+
findByName(name: string): Promise<StoredGroupRecord | null>;
|
|
96
|
+
insert(group: StoredGroupRecord): Promise<void>;
|
|
97
|
+
update(groupId: string, patch: {
|
|
98
|
+
name?: string;
|
|
99
|
+
description?: string | null;
|
|
100
|
+
updated_at: number;
|
|
101
|
+
}): Promise<boolean>;
|
|
102
|
+
delete(groupId: string): Promise<boolean>;
|
|
103
|
+
listMembers(groupId: string): Promise<StoredGroupMemberRecord[]>;
|
|
104
|
+
listGroupIdsForUser(userId: string): Promise<string[]>;
|
|
105
|
+
listGroupsForUser(userId: string): Promise<StoredGroupRecord[]>;
|
|
106
|
+
addMember(member: StoredGroupMemberRecord): Promise<boolean>;
|
|
107
|
+
removeMember(groupId: string, userId: string): Promise<boolean>;
|
|
108
|
+
removeUserFromAllGroups(userId: string): Promise<number>;
|
|
109
|
+
}
|
|
110
|
+
export interface ResourceGrantRepository {
|
|
111
|
+
listForResource(resourceType: string, resourceId: string): Promise<StoredResourceGrantRecord[]>;
|
|
112
|
+
listForPrincipal(principalType: GrantPrincipalType, principalId: string): Promise<StoredResourceGrantRecord[]>;
|
|
113
|
+
findById(grantId: string): Promise<StoredResourceGrantRecord | null>;
|
|
114
|
+
/**
|
|
115
|
+
* Effective grants for a user against one resource: direct user grants
|
|
116
|
+
* plus grants held by any of the supplied group ids.
|
|
117
|
+
*/
|
|
118
|
+
listEffective(resourceType: string, resourceId: string, userId: string, groupIds: readonly string[]): Promise<StoredResourceGrantRecord[]>;
|
|
119
|
+
upsert(grant: StoredResourceGrantRecord): Promise<void>;
|
|
120
|
+
delete(grantId: string): Promise<boolean>;
|
|
121
|
+
deleteForResource(resourceType: string, resourceId: string): Promise<number>;
|
|
122
|
+
deleteForPrincipal(principalType: GrantPrincipalType, principalId: string): Promise<number>;
|
|
123
|
+
deleteForOwner(ownerUserId: string): Promise<number>;
|
|
124
|
+
}
|
|
125
|
+
export interface AuthSessionRepository {
|
|
126
|
+
insert(session: StoredAuthSessionRecord): Promise<void>;
|
|
127
|
+
findById(sessionId: string): Promise<StoredAuthSessionRecord | null>;
|
|
128
|
+
listByUser(userId: string): Promise<StoredAuthSessionRecord[]>;
|
|
129
|
+
touch(sessionId: string, lastSeenAt: number): Promise<boolean>;
|
|
130
|
+
revoke(sessionId: string, revokedAt: number, revokedBy: string): Promise<boolean>;
|
|
131
|
+
revokeAllForUser(userId: string, revokedAt: number, revokedBy: string, exceptSessionId?: string): Promise<string[]>;
|
|
132
|
+
deleteExpired(before: number): Promise<number>;
|
|
133
|
+
deleteForUser(userId: string): Promise<number>;
|
|
134
|
+
}
|
|
135
|
+
export interface ApiTokenRepository {
|
|
136
|
+
insert(token: StoredApiTokenRecord): Promise<void>;
|
|
137
|
+
findByHash(tokenHash: string): Promise<StoredApiTokenRecord | null>;
|
|
138
|
+
findById(tokenId: string): Promise<StoredApiTokenRecord | null>;
|
|
139
|
+
listByUser(userId: string): Promise<StoredApiTokenRecord[]>;
|
|
140
|
+
listAll(): Promise<StoredApiTokenRecord[]>;
|
|
141
|
+
touchLastUsed(tokenId: string, lastUsedAt: number): Promise<boolean>;
|
|
142
|
+
revoke(tokenId: string, revokedAt: number): Promise<boolean>;
|
|
143
|
+
deleteForUser(userId: string): Promise<number>;
|
|
144
|
+
}
|
|
145
|
+
export interface OAuthIdentityRepository {
|
|
146
|
+
find(provider: string, subject: string): Promise<StoredOAuthIdentityRecord | null>;
|
|
147
|
+
listByUser(userId: string): Promise<StoredOAuthIdentityRecord[]>;
|
|
148
|
+
upsert(identity: StoredOAuthIdentityRecord): Promise<void>;
|
|
149
|
+
deleteForUser(userId: string): Promise<number>;
|
|
150
|
+
}
|
|
151
|
+
export interface SecurityAuditRepository {
|
|
152
|
+
insert(event: StoredSecurityAuditEventRecord): Promise<void>;
|
|
153
|
+
query(query: SecurityAuditQuery): Promise<StoredSecurityAuditEventRecord[]>;
|
|
154
|
+
deleteBefore(before: number): Promise<number>;
|
|
155
|
+
}
|
|
156
|
+
export interface SecurityRepositories {
|
|
157
|
+
groups: GroupRepository;
|
|
158
|
+
grants: ResourceGrantRepository;
|
|
159
|
+
authSessions: AuthSessionRepository;
|
|
160
|
+
apiTokens: ApiTokenRepository;
|
|
161
|
+
oauthIdentities: OAuthIdentityRepository;
|
|
162
|
+
audit: SecurityAuditRepository;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Synchronous variants used inside owned SQLite transactions, so a
|
|
166
|
+
* security-critical mutation and its audit event commit atomically.
|
|
167
|
+
*/
|
|
168
|
+
export interface GroupSyncRepository {
|
|
169
|
+
findById(groupId: string): StoredGroupRecord | null;
|
|
170
|
+
findByName(name: string): StoredGroupRecord | null;
|
|
171
|
+
insert(group: StoredGroupRecord): void;
|
|
172
|
+
update(groupId: string, patch: {
|
|
173
|
+
name?: string;
|
|
174
|
+
description?: string | null;
|
|
175
|
+
updated_at: number;
|
|
176
|
+
}): boolean;
|
|
177
|
+
delete(groupId: string): boolean;
|
|
178
|
+
addMember(member: StoredGroupMemberRecord): boolean;
|
|
179
|
+
removeMember(groupId: string, userId: string): boolean;
|
|
180
|
+
}
|
|
181
|
+
export interface ResourceGrantSyncRepository {
|
|
182
|
+
findById(grantId: string): StoredResourceGrantRecord | null;
|
|
183
|
+
upsert(grant: StoredResourceGrantRecord): void;
|
|
184
|
+
delete(grantId: string): boolean;
|
|
185
|
+
deleteForResource(resourceType: string, resourceId: string): number;
|
|
186
|
+
deleteForPrincipal(principalType: GrantPrincipalType, principalId: string): number;
|
|
187
|
+
}
|
|
188
|
+
export interface SecurityAuditSyncRepository {
|
|
189
|
+
insert(event: StoredSecurityAuditEventRecord): void;
|
|
190
|
+
}
|
|
191
|
+
export interface SecuritySyncRepositories {
|
|
192
|
+
groups: GroupSyncRepository;
|
|
193
|
+
grants: ResourceGrantSyncRepository;
|
|
194
|
+
audit: SecurityAuditSyncRepository;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=securityTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityTypes.d.ts","sourceRoot":"","sources":["../../src/persistence/securityTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=securityTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityTypes.js","sourceRoot":"","sources":["../../src/persistence/securityTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -20,6 +20,7 @@ export declare const WORK_PREVIEW_UPSTREAM_SCHEMA_SQL = "\n ALTER TABLE work_ta
|
|
|
20
20
|
export declare const DURABLE_EVENT_IDEMPOTENCY_SCHEMA_SQL = "\n ALTER TABLE platform_events ADD COLUMN request_fingerprint TEXT NOT NULL\n DEFAULT '0000000000000000000000000000000000000000000000000000000000000000'\n CHECK (\n length(request_fingerprint) = 64\n AND request_fingerprint NOT GLOB '*[^0-9a-f]*'\n );\n";
|
|
21
21
|
export declare const DURABLE_EVENT_REPLAY_INDEX_SCHEMA_SQL = "\n CREATE INDEX IF NOT EXISTS idx_platform_events_stream_subject_cursor\n ON platform_events(stream_id, subject_id, global_cursor);\n";
|
|
22
22
|
export declare const RESOURCE_DELETION_LIFECYCLE_SCHEMA_SQL = "\n CREATE TABLE IF NOT EXISTS platform_resource_deletion_tombstones (\n resource_type TEXT NOT NULL\n CHECK (resource_type IN ('document', 'generated-media', 'persona')),\n resource_id TEXT NOT NULL CHECK (length(resource_id) BETWEEN 1 AND 256),\n owner_user_id TEXT NOT NULL CHECK (length(owner_user_id) BETWEEN 1 AND 256),\n deletion_incarnation INTEGER NOT NULL CHECK (deletion_incarnation > 0),\n deletion_token TEXT NOT NULL UNIQUE\n CHECK (\n length(deletion_token) = 64\n AND deletion_token NOT GLOB '*[^0-9a-f]*'\n ),\n deleted_at INTEGER NOT NULL CHECK (deleted_at >= 0),\n completed_at INTEGER CHECK (\n completed_at IS NULL OR completed_at >= deleted_at\n ),\n PRIMARY KEY (resource_type, resource_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_platform_resource_tombstones_owner\n ON platform_resource_deletion_tombstones(\n owner_user_id,\n deleted_at,\n resource_type,\n resource_id\n );\n";
|
|
23
|
+
export declare const TRUST_FOUNDATION_SCHEMA_SQL = "\n CREATE TABLE IF NOT EXISTS user_groups (\n id TEXT PRIMARY KEY,\n name TEXT UNIQUE NOT NULL CHECK (length(name) BETWEEN 1 AND 128),\n description TEXT,\n created_by TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS user_group_members (\n group_id TEXT NOT NULL REFERENCES user_groups(id) ON DELETE CASCADE,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n added_by TEXT,\n added_at INTEGER NOT NULL,\n PRIMARY KEY (group_id, user_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_user_group_members_user\n ON user_group_members(user_id, group_id);\n\n CREATE TABLE IF NOT EXISTS resource_grants (\n id TEXT PRIMARY KEY,\n resource_type TEXT NOT NULL CHECK (length(resource_type) BETWEEN 1 AND 64),\n resource_id TEXT NOT NULL CHECK (length(resource_id) BETWEEN 1 AND 256),\n owner_user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n principal_type TEXT NOT NULL CHECK (principal_type IN ('user', 'group')),\n principal_id TEXT NOT NULL,\n permission TEXT NOT NULL CHECK (permission IN ('read', 'write', 'admin')),\n created_by TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n UNIQUE (resource_type, resource_id, principal_type, principal_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_resource_grants_resource\n ON resource_grants(resource_type, resource_id);\n\n CREATE INDEX IF NOT EXISTS idx_resource_grants_principal\n ON resource_grants(principal_type, principal_id);\n\n CREATE TABLE IF NOT EXISTS auth_sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n kind TEXT NOT NULL,\n ip_hash TEXT,\n user_agent TEXT,\n created_at INTEGER NOT NULL,\n last_seen_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL,\n revoked_at INTEGER,\n revoked_by TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_auth_sessions_user\n ON auth_sessions(user_id, last_seen_at);\n\n CREATE INDEX IF NOT EXISTS idx_auth_sessions_expires\n ON auth_sessions(expires_at);\n\n CREATE TABLE IF NOT EXISTS api_tokens (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n name TEXT NOT NULL CHECK (length(name) BETWEEN 1 AND 128),\n token_hash TEXT UNIQUE NOT NULL,\n token_prefix TEXT NOT NULL,\n scopes TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n expires_at INTEGER,\n last_used_at INTEGER,\n revoked_at INTEGER\n );\n\n CREATE INDEX IF NOT EXISTS idx_api_tokens_user\n ON api_tokens(user_id, created_at);\n\n CREATE TABLE IF NOT EXISTS oauth_identities (\n provider TEXT NOT NULL,\n subject TEXT NOT NULL,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n email TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (provider, subject)\n );\n\n CREATE INDEX IF NOT EXISTS idx_oauth_identities_user\n ON oauth_identities(user_id);\n\n CREATE TABLE IF NOT EXISTS security_audit_events (\n id TEXT PRIMARY KEY,\n occurred_at INTEGER NOT NULL,\n actor_user_id TEXT,\n actor_kind TEXT NOT NULL,\n action TEXT NOT NULL CHECK (length(action) BETWEEN 1 AND 128),\n target_type TEXT,\n target_id TEXT,\n result TEXT NOT NULL CHECK (result IN ('success', 'denied', 'failure')),\n request_id TEXT,\n ip_hash TEXT,\n details TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_security_audit_occurred\n ON security_audit_events(occurred_at, id);\n\n CREATE INDEX IF NOT EXISTS idx_security_audit_actor\n ON security_audit_events(actor_user_id, occurred_at);\n\n CREATE INDEX IF NOT EXISTS idx_security_audit_action\n ON security_audit_events(action, occurred_at);\n";
|
|
23
24
|
export type SchemaCompatibilityStatus = 'uninitialized' | 'migrating' | 'compatible' | 'incompatible';
|
|
24
25
|
export interface SchemaCompatibilityState {
|
|
25
26
|
dialect: 'sqlite';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteMigrations.d.ts","sourceRoot":"","sources":["../../src/persistence/sqliteMigrations.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,+CAA+C,CAAC;AA2RvD;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,4rEAwEtC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,svHAqG1C,CAAC;
|
|
1
|
+
{"version":3,"file":"sqliteMigrations.d.ts","sourceRoot":"","sources":["../../src/persistence/sqliteMigrations.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,+CAA+C,CAAC;AA2RvD;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,4rEAwEtC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,svHAqG1C,CAAC;AA2OF,eAAO,MAAM,gCAAgC,yKAK5C,CAAC;AAEF,eAAO,MAAM,oCAAoC,2NAKhD,CAAC;AAEF,eAAO,MAAM,4BAA4B,okBAkBxC,CAAC;AAEF,eAAO,MAAM,sCAAsC,ugBAgBlD,CAAC;AAEF,eAAO,MAAM,gCAAgC,4WAW5C,CAAC;AAEF,eAAO,MAAM,oCAAoC,sRAOhD,CAAC;AAEF,eAAO,MAAM,qCAAqC,8IAGjD,CAAC;AAEF,eAAO,MAAM,sCAAsC,m+BA0BlD,CAAC;AAEF,eAAO,MAAM,2BAA2B,+qHA8GvC,CAAC;AAqEF,MAAM,MAAM,yBAAyB,GACnC,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,QAAQ,CAAC;IAClB,MAAM,EAAE,yBAAyB,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,QAAQ,CAAC;IAClB,MAAM,EAAE,yBAAyB,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,EAAE,KAAK,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA05CD;;;;;GAKG;AACH,eAAO,MAAM,+CAA+C,mBAC1C,MAAM,KACrB,OAKA,CAAC;AAEJ,iFAAiF;AACjF,eAAO,MAAM,yBAAyB;;;;IAQrC,CAAC;AA4GF;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAC1B,IAAI,CAkBN;AAED,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAC1B,IAAI,CAmBN;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAC1B,sBAAsB,CAuIxB;AAUD,eAAO,MAAM,2BAA2B,QAAO,wBAE7C,CAAC;AAkBH,eAAO,MAAM,yBAAyB,UAC7B,OAAO,KACb,wBAC2D,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAC1B,wBAAwB,CAsD1B;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAC1B,wBAAwB,CA0B1B;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAC1B,wBAAwB,CAgN1B"}
|