fluxmail 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +7 -5
  2. package/dist/accounts/defaultGoogleOAuth.d.ts +4 -0
  3. package/dist/accounts/defaultGoogleOAuth.d.ts.map +1 -0
  4. package/dist/accounts/defaultGoogleOAuth.js +7 -0
  5. package/dist/accounts/defaultGoogleOAuth.js.map +1 -0
  6. package/dist/accounts/gmailConnection.js +2 -2
  7. package/dist/accounts/gmailConnection.js.map +1 -1
  8. package/dist/accounts/googleAuth.d.ts +10 -7
  9. package/dist/accounts/googleAuth.d.ts.map +1 -1
  10. package/dist/accounts/googleAuth.js +48 -17
  11. package/dist/accounts/googleAuth.js.map +1 -1
  12. package/dist/accounts/microsoftAuth.js +1 -1
  13. package/dist/accounts/microsoftAuth.js.map +1 -1
  14. package/dist/accounts/registry.d.ts +9 -8
  15. package/dist/accounts/registry.d.ts.map +1 -1
  16. package/dist/accounts/registry.js +166 -96
  17. package/dist/accounts/registry.js.map +1 -1
  18. package/dist/auth.d.ts +106 -0
  19. package/dist/auth.d.ts.map +1 -0
  20. package/dist/auth.js +452 -0
  21. package/dist/auth.js.map +1 -0
  22. package/dist/authorization.d.ts +9 -0
  23. package/dist/authorization.d.ts.map +1 -0
  24. package/dist/authorization.js +23 -0
  25. package/dist/authorization.js.map +1 -0
  26. package/dist/cli.d.ts +7 -1
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +734 -358
  29. package/dist/cli.js.map +1 -1
  30. package/dist/cliInstances.d.ts +37 -0
  31. package/dist/cliInstances.d.ts.map +1 -0
  32. package/dist/cliInstances.js +170 -0
  33. package/dist/cliInstances.js.map +1 -0
  34. package/dist/config.d.ts +16 -10
  35. package/dist/config.d.ts.map +1 -1
  36. package/dist/config.js +125 -35
  37. package/dist/config.js.map +1 -1
  38. package/dist/context.d.ts.map +1 -1
  39. package/dist/context.js +8 -4
  40. package/dist/context.js.map +1 -1
  41. package/dist/http/admin.d.ts +57 -3
  42. package/dist/http/admin.d.ts.map +1 -1
  43. package/dist/http/admin.js +188 -67
  44. package/dist/http/admin.js.map +1 -1
  45. package/dist/http/app.d.ts.map +1 -1
  46. package/dist/http/app.js +78 -54
  47. package/dist/http/app.js.map +1 -1
  48. package/dist/http/identity.d.ts +114 -0
  49. package/dist/http/identity.d.ts.map +1 -0
  50. package/dist/http/identity.js +931 -0
  51. package/dist/http/identity.js.map +1 -0
  52. package/dist/http/operationRoutes.d.ts +8 -0
  53. package/dist/http/operationRoutes.d.ts.map +1 -0
  54. package/dist/http/operationRoutes.js +13 -0
  55. package/dist/http/operationRoutes.js.map +1 -0
  56. package/dist/http/rest.d.ts +11 -3
  57. package/dist/http/rest.d.ts.map +1 -1
  58. package/dist/http/rest.js +138 -66
  59. package/dist/http/rest.js.map +1 -1
  60. package/dist/index.d.ts +4 -3
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +4 -3
  63. package/dist/index.js.map +1 -1
  64. package/dist/mcp/buildServer.d.ts +1 -1
  65. package/dist/mcp/buildServer.d.ts.map +1 -1
  66. package/dist/mcp/buildServer.js +14 -19
  67. package/dist/mcp/buildServer.js.map +1 -1
  68. package/dist/permissions.d.ts +1 -1
  69. package/dist/permissions.d.ts.map +1 -1
  70. package/dist/permissions.js +7 -1
  71. package/dist/permissions.js.map +1 -1
  72. package/dist/scheduler/sendScheduler.d.ts +1 -2
  73. package/dist/scheduler/sendScheduler.d.ts.map +1 -1
  74. package/dist/scheduler/sendScheduler.js +1 -2
  75. package/dist/scheduler/sendScheduler.js.map +1 -1
  76. package/dist/service/emailService.d.ts +8 -16
  77. package/dist/service/emailService.d.ts.map +1 -1
  78. package/dist/service/emailService.js +25 -38
  79. package/dist/service/emailService.js.map +1 -1
  80. package/dist/storage/adminAudit.d.ts +15 -2
  81. package/dist/storage/adminAudit.d.ts.map +1 -1
  82. package/dist/storage/adminAudit.js +22 -27
  83. package/dist/storage/adminAudit.js.map +1 -1
  84. package/dist/storage/apiKeys.d.ts +8 -8
  85. package/dist/storage/apiKeys.d.ts.map +1 -1
  86. package/dist/storage/apiKeys.js +16 -11
  87. package/dist/storage/apiKeys.js.map +1 -1
  88. package/dist/storage/db.d.ts +593 -31
  89. package/dist/storage/db.d.ts.map +1 -1
  90. package/dist/storage/db.js +330 -45
  91. package/dist/storage/db.js.map +1 -1
  92. package/dist/storage/fileLock.d.ts +7 -0
  93. package/dist/storage/fileLock.d.ts.map +1 -0
  94. package/dist/storage/fileLock.js +183 -0
  95. package/dist/storage/fileLock.js.map +1 -0
  96. package/dist/storage/gmailConnectionGrants.d.ts +3 -4
  97. package/dist/storage/gmailConnectionGrants.d.ts.map +1 -1
  98. package/dist/storage/gmailConnectionGrants.js +6 -6
  99. package/dist/storage/gmailConnectionGrants.js.map +1 -1
  100. package/dist/storage/members.d.ts +11 -0
  101. package/dist/storage/members.d.ts.map +1 -1
  102. package/dist/storage/members.js +70 -6
  103. package/dist/storage/members.js.map +1 -1
  104. package/dist/telemetry.d.ts +14 -0
  105. package/dist/telemetry.d.ts.map +1 -1
  106. package/dist/telemetry.js +22 -0
  107. package/dist/telemetry.js.map +1 -1
  108. package/package.json +9 -8
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,38 @@
1
1
  import Database from 'better-sqlite3';
2
2
  import { drizzle } from 'drizzle-orm/better-sqlite3';
3
3
  import { index, integer, primaryKey, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
4
+ import { existsSync, mkdirSync, statSync } from 'node:fs';
5
+ import { randomBytes } from 'node:crypto';
6
+ import path from 'node:path';
7
+ import { VERSION } from '../version.js';
8
+ import { withFileLock } from './fileLock.js';
9
+ export const CURRENT_STORE_FORMAT = 1;
10
+ export const MIN_SUPPORTED_STORE_FORMAT = 1;
11
+ export const MAX_SUPPORTED_STORE_FORMAT = CURRENT_STORE_FORMAT;
12
+ export const LEGACY_STORE_FORMAT = 0;
13
+ const MIGRATION_LOCK_TIMEOUT_MS = 5 * 60_000;
14
+ const MIGRATION_LOCK_STALE_MS = 30 * 60_000;
15
+ export class IncompatibleStoreError extends Error {
16
+ compatibility;
17
+ code = 'incompatible_store';
18
+ constructor(compatibility) {
19
+ const supportedFormats = compatibility.minimumSupportedFormat === compatibility.maximumSupportedFormat
20
+ ? `format ${compatibility.minimumSupportedFormat}`
21
+ : `formats ${compatibility.minimumSupportedFormat} through ${compatibility.maximumSupportedFormat}`;
22
+ const action = compatibility.storeFormat > compatibility.maximumSupportedFormat
23
+ ? 'Update Fluxmail'
24
+ : 'Use a Fluxmail version that supports this store';
25
+ super(`This Fluxmail data uses store format ${compatibility.storeFormat}, but Fluxmail ${compatibility.engineVersion} supports ${supportedFormats}. ${action} before opening ${compatibility.dataDir}. Fluxmail did not change the store.`);
26
+ this.compatibility = compatibility;
27
+ this.name = 'IncompatibleStoreError';
28
+ }
29
+ }
4
30
  export const members = sqliteTable('members', {
5
31
  id: text('id').primaryKey(),
6
32
  name: text('name').notNull(),
7
33
  email: text('email'),
8
34
  role: text('role').notNull().default('member'),
35
+ status: text('status').notNull().default('pending'),
9
36
  createdAt: integer('created_at').notNull(),
10
37
  }, (table) => [uniqueIndex('members_email_unique').on(table.email)]);
11
38
  export const accounts = sqliteTable('accounts', {
@@ -15,11 +42,11 @@ export const accounts = sqliteTable('accounts', {
15
42
  displayName: text('display_name'),
16
43
  status: text('status').notNull().default('active'),
17
44
  createdAt: integer('created_at').notNull(),
18
- /** Owning member. NULL is retained only for migrated installs with no members. */
19
- memberId: text('member_id').references(() => members.id, { onDelete: 'set null' }),
20
- sharingMode: text('sharing_mode').notNull().default('private'),
45
+ /** Transitional nulls only exist until a migrated installation claims its first administrator. */
46
+ ownerMemberId: text('member_id').references(() => members.id, { onDelete: 'restrict' }),
47
+ sharedWithAll: integer('shared_with_all', { mode: 'boolean' }).notNull().default(false),
21
48
  }, (table) => [uniqueIndex('accounts_provider_email_unique').on(table.provider, table.email)]);
22
- export const accountMemberShares = sqliteTable('account_member_shares', {
49
+ export const accountMemberGrants = sqliteTable('account_member_grants', {
23
50
  accountId: text('account_id')
24
51
  .notNull()
25
52
  .references(() => accounts.id, { onDelete: 'cascade' }),
@@ -42,6 +69,7 @@ export const accountCredentials = sqliteTable('account_credentials', {
42
69
  /** AES-256-GCM encrypted provider-specific credentials. */
43
70
  encryptedCredentials: text('encrypted_credentials').notNull(),
44
71
  updatedAt: integer('updated_at').notNull(),
72
+ revision: integer('revision').notNull().default(1),
45
73
  });
46
74
  export const imapMessages = sqliteTable('imap_messages', {
47
75
  id: text('id').primaryKey(),
@@ -72,8 +100,10 @@ export const apiKeys = sqliteTable('api_keys', {
72
100
  keyHash: text('key_hash').notNull().unique(),
73
101
  createdAt: integer('created_at').notNull(),
74
102
  lastUsedAt: integer('last_used_at'),
75
- /** Member the key was issued to; NULL is reserved for migrated system credentials. */
76
- memberId: text('member_id').references(() => members.id, { onDelete: 'set null' }),
103
+ /** Member the key was issued to. */
104
+ memberId: text('member_id')
105
+ .notNull()
106
+ .references(() => members.id, { onDelete: 'cascade' }),
77
107
  /** Named MCP permission profile, or "custom" when customCapabilities is populated. */
78
108
  permissionProfile: text('permission_profile').notNull().default('full'),
79
109
  /** JSON array of explicit MCP capabilities for custom policies. */
@@ -83,12 +113,57 @@ export const apiKeys = sqliteTable('api_keys', {
83
113
  /** NULL means no extra narrowing; otherwise a JSON array of canonical account ids. */
84
114
  accountIds: text('account_ids'),
85
115
  });
116
+ export const memberCredentials = sqliteTable('member_credentials', {
117
+ memberId: text('member_id')
118
+ .primaryKey()
119
+ .references(() => members.id, { onDelete: 'cascade' }),
120
+ passwordHash: text('password_hash').notNull(),
121
+ passwordVersion: integer('password_version').notNull().default(1),
122
+ updatedAt: integer('updated_at').notNull(),
123
+ });
124
+ export const memberSessions = sqliteTable('member_sessions', {
125
+ id: text('id').primaryKey(),
126
+ memberId: text('member_id')
127
+ .notNull()
128
+ .references(() => members.id, { onDelete: 'cascade' }),
129
+ tokenHash: text('token_hash').notNull().unique(),
130
+ deviceName: text('device_name').notNull(),
131
+ createdAt: integer('created_at').notNull(),
132
+ expiresAt: integer('expires_at').notNull(),
133
+ lastUsedAt: integer('last_used_at').notNull(),
134
+ revokedAt: integer('revoked_at'),
135
+ }, (table) => [index('member_sessions_member').on(table.memberId), index('member_sessions_expiry').on(table.expiresAt)]);
136
+ export const memberAuthTokens = sqliteTable('member_auth_tokens', {
137
+ id: text('id').primaryKey(),
138
+ memberId: text('member_id')
139
+ .notNull()
140
+ .references(() => members.id, { onDelete: 'cascade' }),
141
+ kind: text('kind').notNull(),
142
+ tokenHash: text('token_hash').notNull().unique(),
143
+ createdByMemberId: text('created_by_member_id').references(() => members.id, { onDelete: 'set null' }),
144
+ createdAt: integer('created_at').notNull(),
145
+ expiresAt: integer('expires_at').notNull(),
146
+ usedAt: integer('used_at'),
147
+ }, (table) => [
148
+ index('member_auth_tokens_member').on(table.memberId),
149
+ index('member_auth_tokens_expiry').on(table.expiresAt),
150
+ ]);
151
+ export const authRateLimits = sqliteTable('auth_rate_limits', {
152
+ key: text('key').primaryKey(),
153
+ attempts: integer('attempts').notNull(),
154
+ windowStartedAt: integer('window_started_at').notNull(),
155
+ }, (table) => [index('auth_rate_limits_window').on(table.windowStartedAt)]);
156
+ export const instanceSettings = sqliteTable('instance_settings', {
157
+ key: text('key').primaryKey(),
158
+ value: text('value').notNull(),
159
+ });
86
160
  export const adminAuditEvents = sqliteTable('admin_audit_events', {
87
161
  id: integer('id').primaryKey({ autoIncrement: true }),
88
162
  timestamp: integer('timestamp').notNull(),
89
163
  operation: text('operation').notNull(),
90
164
  outcome: text('outcome').notNull(),
91
165
  actorKeyId: text('actor_key_id'),
166
+ actorSessionId: text('actor_session_id'),
92
167
  actorMemberId: text('actor_member_id'),
93
168
  resourceType: text('resource_type'),
94
169
  resourceId: text('resource_id'),
@@ -98,10 +173,10 @@ export const gmailConnectionGrants = sqliteTable('gmail_connection_grants', {
98
173
  /** SHA-256 hex digest. The raw token is printed once and never stored. */
99
174
  tokenHash: text('token_hash').primaryKey(),
100
175
  scope: text('scope').notNull(),
101
- memberId: text('member_id'),
176
+ ownerMemberId: text('owner_member_id'),
102
177
  reauthorizeAccountId: text('reauthorize_account_id'),
103
- sharingMode: text('sharing_mode'),
104
- sharedMemberIds: text('shared_member_ids'),
178
+ sharedWithAll: integer('shared_with_all', { mode: 'boolean' }),
179
+ grantedMemberIds: text('granted_member_ids'),
105
180
  createdAt: integer('created_at').notNull(),
106
181
  expiresAt: integer('expires_at').notNull(),
107
182
  consumedAt: integer('consumed_at'),
@@ -152,6 +227,7 @@ CREATE TABLE IF NOT EXISTS members (
152
227
  name TEXT NOT NULL,
153
228
  email TEXT,
154
229
  role TEXT NOT NULL DEFAULT 'member',
230
+ status TEXT NOT NULL DEFAULT 'pending',
155
231
  created_at INTEGER NOT NULL
156
232
  );
157
233
  CREATE UNIQUE INDEX IF NOT EXISTS members_email_unique ON members(email);
@@ -162,10 +238,10 @@ CREATE TABLE IF NOT EXISTS accounts (
162
238
  display_name TEXT,
163
239
  status TEXT NOT NULL DEFAULT 'active',
164
240
  created_at INTEGER NOT NULL,
165
- member_id TEXT REFERENCES members(id) ON DELETE SET NULL,
166
- sharing_mode TEXT NOT NULL DEFAULT 'private'
241
+ member_id TEXT REFERENCES members(id) ON DELETE RESTRICT,
242
+ shared_with_all INTEGER NOT NULL DEFAULT 0
167
243
  );
168
- CREATE TABLE IF NOT EXISTS account_member_shares (
244
+ CREATE TABLE IF NOT EXISTS account_member_grants (
169
245
  account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
170
246
  member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
171
247
  PRIMARY KEY (account_id, member_id)
@@ -178,7 +254,8 @@ CREATE TABLE IF NOT EXISTS oauth_tokens (
178
254
  CREATE TABLE IF NOT EXISTS account_credentials (
179
255
  account_id TEXT PRIMARY KEY REFERENCES accounts(id) ON DELETE CASCADE,
180
256
  encrypted_credentials TEXT NOT NULL,
181
- updated_at INTEGER NOT NULL
257
+ updated_at INTEGER NOT NULL,
258
+ revision INTEGER NOT NULL DEFAULT 1
182
259
  );
183
260
  CREATE TABLE IF NOT EXISTS imap_messages (
184
261
  id TEXT PRIMARY KEY,
@@ -209,18 +286,59 @@ CREATE TABLE IF NOT EXISTS api_keys (
209
286
  key_hash TEXT NOT NULL UNIQUE,
210
287
  created_at INTEGER NOT NULL,
211
288
  last_used_at INTEGER,
212
- member_id TEXT REFERENCES members(id) ON DELETE SET NULL,
289
+ member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
213
290
  permission_profile TEXT NOT NULL DEFAULT 'full',
214
291
  custom_capabilities TEXT,
215
292
  supplemental_capabilities TEXT NOT NULL DEFAULT '[]',
216
293
  account_ids TEXT
217
294
  );
295
+ CREATE TABLE IF NOT EXISTS member_credentials (
296
+ member_id TEXT PRIMARY KEY REFERENCES members(id) ON DELETE CASCADE,
297
+ password_hash TEXT NOT NULL,
298
+ password_version INTEGER NOT NULL DEFAULT 1,
299
+ updated_at INTEGER NOT NULL
300
+ );
301
+ CREATE TABLE IF NOT EXISTS member_sessions (
302
+ id TEXT PRIMARY KEY,
303
+ member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
304
+ token_hash TEXT NOT NULL UNIQUE,
305
+ device_name TEXT NOT NULL,
306
+ created_at INTEGER NOT NULL,
307
+ expires_at INTEGER NOT NULL,
308
+ last_used_at INTEGER NOT NULL,
309
+ revoked_at INTEGER
310
+ );
311
+ CREATE INDEX IF NOT EXISTS member_sessions_member ON member_sessions(member_id);
312
+ CREATE INDEX IF NOT EXISTS member_sessions_expiry ON member_sessions(expires_at);
313
+ CREATE TABLE IF NOT EXISTS member_auth_tokens (
314
+ id TEXT PRIMARY KEY,
315
+ member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
316
+ kind TEXT NOT NULL,
317
+ token_hash TEXT NOT NULL UNIQUE,
318
+ created_by_member_id TEXT REFERENCES members(id) ON DELETE SET NULL,
319
+ created_at INTEGER NOT NULL,
320
+ expires_at INTEGER NOT NULL,
321
+ used_at INTEGER
322
+ );
323
+ CREATE INDEX IF NOT EXISTS member_auth_tokens_member ON member_auth_tokens(member_id);
324
+ CREATE INDEX IF NOT EXISTS member_auth_tokens_expiry ON member_auth_tokens(expires_at);
325
+ CREATE TABLE IF NOT EXISTS auth_rate_limits (
326
+ key TEXT PRIMARY KEY,
327
+ attempts INTEGER NOT NULL,
328
+ window_started_at INTEGER NOT NULL
329
+ );
330
+ CREATE INDEX IF NOT EXISTS auth_rate_limits_window ON auth_rate_limits(window_started_at);
331
+ CREATE TABLE IF NOT EXISTS instance_settings (
332
+ key TEXT PRIMARY KEY,
333
+ value TEXT NOT NULL
334
+ );
218
335
  CREATE TABLE IF NOT EXISTS admin_audit_events (
219
336
  id INTEGER PRIMARY KEY AUTOINCREMENT,
220
337
  timestamp INTEGER NOT NULL,
221
338
  operation TEXT NOT NULL,
222
339
  outcome TEXT NOT NULL,
223
340
  actor_key_id TEXT,
341
+ actor_session_id TEXT,
224
342
  actor_member_id TEXT,
225
343
  resource_type TEXT,
226
344
  resource_id TEXT,
@@ -228,13 +346,23 @@ CREATE TABLE IF NOT EXISTS admin_audit_events (
228
346
  );
229
347
  CREATE INDEX IF NOT EXISTS admin_audit_events_timestamp
230
348
  ON admin_audit_events(timestamp);
349
+ CREATE TRIGGER IF NOT EXISTS admin_audit_events_no_update
350
+ BEFORE UPDATE ON admin_audit_events
351
+ BEGIN
352
+ SELECT RAISE(ABORT, 'security audit events are append-only');
353
+ END;
354
+ CREATE TRIGGER IF NOT EXISTS admin_audit_events_no_delete
355
+ BEFORE DELETE ON admin_audit_events
356
+ BEGIN
357
+ SELECT RAISE(ABORT, 'security audit events are append-only');
358
+ END;
231
359
  CREATE TABLE IF NOT EXISTS gmail_connection_grants (
232
360
  token_hash TEXT PRIMARY KEY,
233
361
  scope TEXT NOT NULL,
234
- member_id TEXT,
362
+ owner_member_id TEXT,
235
363
  reauthorize_account_id TEXT,
236
- sharing_mode TEXT,
237
- shared_member_ids TEXT,
364
+ shared_with_all INTEGER,
365
+ granted_member_ids TEXT,
238
366
  created_at INTEGER NOT NULL,
239
367
  expires_at INTEGER NOT NULL,
240
368
  consumed_at INTEGER
@@ -281,21 +409,75 @@ CREATE INDEX IF NOT EXISTS rest_idempotency_expires_at
281
409
  function tableColumns(sqlite, table) {
282
410
  return new Set(sqlite.prepare(`PRAGMA table_info(${table})`).all().map((column) => column.name));
283
411
  }
284
- export function openDb(dbPath) {
285
- const sqlite = new Database(dbPath);
286
- sqlite.pragma('journal_mode = WAL');
287
- sqlite.pragma('foreign_keys = ON');
288
- sqlite.exec(BOOTSTRAP_SQL);
412
+ function readStoreFormat(sqlite) {
413
+ return sqlite.pragma('user_version', { simple: true });
414
+ }
415
+ function compatibilityFor(dbPath, dataDir, storeFormat) {
416
+ return {
417
+ engineVersion: VERSION,
418
+ dataDir,
419
+ dbPath,
420
+ storeFormat,
421
+ minimumSupportedFormat: MIN_SUPPORTED_STORE_FORMAT,
422
+ maximumSupportedFormat: MAX_SUPPORTED_STORE_FORMAT,
423
+ compatible: storeFormat === LEGACY_STORE_FORMAT ||
424
+ (storeFormat >= MIN_SUPPORTED_STORE_FORMAT && storeFormat <= MAX_SUPPORTED_STORE_FORMAT),
425
+ requiresMigration: storeFormat === LEGACY_STORE_FORMAT || storeFormat < CURRENT_STORE_FORMAT,
426
+ };
427
+ }
428
+ export function inspectStoreCompatibility(dbPath, dataDir = dbPath === ':memory:' ? ':memory:' : path.dirname(dbPath)) {
429
+ if (dbPath === ':memory:' || !existsSync(dbPath) || statSync(dbPath).size === 0) {
430
+ return compatibilityFor(dbPath, dataDir, LEGACY_STORE_FORMAT);
431
+ }
432
+ const sqlite = new Database(dbPath, { readonly: true, fileMustExist: true });
433
+ try {
434
+ return compatibilityFor(dbPath, dataDir, readStoreFormat(sqlite));
435
+ }
436
+ finally {
437
+ sqlite.close();
438
+ }
439
+ }
440
+ function assertCompatible(compatibility) {
441
+ if (!compatibility.compatible)
442
+ throw new IncompatibleStoreError(compatibility);
443
+ }
444
+ function backupForMigration(sqlite, dbPath, fromFormat, toFormat) {
445
+ if (dbPath === ':memory:' || !existsSync(dbPath) || statSync(dbPath).size === 0)
446
+ return undefined;
447
+ const backupDir = path.join(path.dirname(dbPath), 'backups');
448
+ mkdirSync(backupDir, { recursive: true });
449
+ const stamp = new Date().toISOString().replaceAll(/[:.]/g, '-');
450
+ const databaseName = path.basename(dbPath, path.extname(dbPath)) || 'fluxmail';
451
+ const suffix = randomBytes(4).toString('hex');
452
+ const destination = path.join(backupDir, `${databaseName}-format-${fromFormat}-to-${toFormat}-${stamp}-${process.pid}-${suffix}.db`);
453
+ sqlite.exec(`VACUUM INTO '${destination.replaceAll("'", "''")}'`);
454
+ return destination;
455
+ }
456
+ function syncLegacyCredentialRows(sqlite) {
289
457
  // Keep the generic credential row in sync if an older binary updated the
290
458
  // legacy Gmail token table before this version reopened the database.
291
459
  sqlite.exec(`
292
- INSERT INTO account_credentials (account_id, encrypted_credentials, updated_at)
293
- SELECT account_id, encrypted_tokens, updated_at FROM oauth_tokens WHERE true
460
+ INSERT INTO account_credentials (account_id, encrypted_credentials, updated_at, revision)
461
+ SELECT account_id, encrypted_tokens, updated_at, 1 FROM oauth_tokens WHERE true
294
462
  ON CONFLICT(account_id) DO UPDATE SET
295
463
  encrypted_credentials = excluded.encrypted_credentials,
296
- updated_at = excluded.updated_at
464
+ updated_at = excluded.updated_at,
465
+ revision = account_credentials.revision + 1
297
466
  WHERE excluded.updated_at > account_credentials.updated_at
298
467
  `);
468
+ }
469
+ function migrateToFormatOne(sqlite) {
470
+ const existingMemberColumns = tableColumns(sqlite, 'members');
471
+ const existingApiKeyColumns = tableColumns(sqlite, 'api_keys');
472
+ const existingAccountColumns = tableColumns(sqlite, 'accounts');
473
+ const hadLegacyAccountShares = tableColumns(sqlite, 'account_member_shares').size > 0;
474
+ const legacyAuthentication = (existingMemberColumns.size > 0 && !existingMemberColumns.has('status')) ||
475
+ (existingMemberColumns.size === 0 && existingApiKeyColumns.size > 0);
476
+ sqlite.exec(BOOTSTRAP_SQL);
477
+ const credentialCols = tableColumns(sqlite, 'account_credentials');
478
+ if (!credentialCols.has('revision')) {
479
+ sqlite.exec('ALTER TABLE account_credentials ADD COLUMN revision INTEGER NOT NULL DEFAULT 1');
480
+ }
299
481
  const scheduledCols = tableColumns(sqlite, 'scheduled_sends');
300
482
  if (!scheduledCols.has('claim_token'))
301
483
  sqlite.exec('ALTER TABLE scheduled_sends ADD COLUMN claim_token TEXT');
@@ -310,29 +492,35 @@ export function openDb(dbPath) {
310
492
  WHERE id = (SELECT id FROM members ORDER BY created_at, id LIMIT 1)
311
493
  `);
312
494
  }
495
+ if (!memberCols.has('status')) {
496
+ sqlite.exec("ALTER TABLE members ADD COLUMN status TEXT NOT NULL DEFAULT 'pending'");
497
+ }
313
498
  if (!tableColumns(sqlite, 'accounts').has('member_id')) {
314
499
  sqlite.exec('ALTER TABLE accounts ADD COLUMN member_id TEXT REFERENCES members(id) ON DELETE SET NULL');
315
500
  }
316
501
  const accountCols = tableColumns(sqlite, 'accounts');
317
- if (!accountCols.has('sharing_mode')) {
318
- sqlite.exec('ALTER TABLE accounts ADD COLUMN sharing_mode TEXT');
319
- sqlite.exec("UPDATE accounts SET sharing_mode = CASE WHEN member_id IS NULL THEN 'all' ELSE 'private' END");
502
+ if (!accountCols.has('shared_with_all')) {
503
+ sqlite.exec('ALTER TABLE accounts ADD COLUMN shared_with_all INTEGER NOT NULL DEFAULT 0');
504
+ sqlite.exec(existingAccountColumns.has('sharing_mode')
505
+ ? "UPDATE accounts SET shared_with_all = CASE WHEN sharing_mode = 'all' THEN 1 ELSE 0 END"
506
+ : 'UPDATE accounts SET shared_with_all = CASE WHEN member_id IS NULL THEN 1 ELSE 0 END');
320
507
  }
321
508
  sqlite.exec(`
322
- CREATE TABLE IF NOT EXISTS account_member_shares (
509
+ CREATE TABLE IF NOT EXISTS account_member_grants (
323
510
  account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
324
511
  member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
325
512
  PRIMARY KEY (account_id, member_id)
326
513
  )
327
514
  `);
328
- // Migrated ownerless mailboxes remain shared with all, but receive an owner
329
- // when the installation already has a member.
330
- sqlite.exec(`
331
- UPDATE accounts SET member_id = (
332
- SELECT id FROM members ORDER BY CASE role WHEN 'admin' THEN 0 ELSE 1 END, created_at, id LIMIT 1
333
- )
334
- WHERE member_id IS NULL AND sharing_mode = 'all' AND EXISTS (SELECT 1 FROM members)
335
- `);
515
+ if (hadLegacyAccountShares) {
516
+ sqlite.exec(`
517
+ INSERT OR IGNORE INTO account_member_grants (account_id, member_id)
518
+ SELECT account_id, member_id FROM account_member_shares
519
+ `);
520
+ sqlite.exec('DROP TABLE account_member_shares');
521
+ }
522
+ if (accountCols.has('sharing_mode'))
523
+ sqlite.exec('ALTER TABLE accounts DROP COLUMN sharing_mode');
336
524
  if (!tableColumns(sqlite, 'api_keys').has('member_id')) {
337
525
  sqlite.exec('ALTER TABLE api_keys ADD COLUMN member_id TEXT REFERENCES members(id) ON DELETE SET NULL');
338
526
  }
@@ -345,9 +533,10 @@ export function openDb(dbPath) {
345
533
  }
346
534
  if (!apiKeyCols.has('supplemental_capabilities')) {
347
535
  sqlite.exec("ALTER TABLE api_keys ADD COLUMN supplemental_capabilities TEXT NOT NULL DEFAULT '[]'");
348
- // Preserve the account-management authority that admin and memberless keys
349
- // held before administrative capabilities existed. Broader capabilities
350
- // must still be granted explicitly.
536
+ // Preserve the account-management authority held by legacy administrator
537
+ // keys before administrative capabilities existed. Broader capabilities
538
+ // must still be granted explicitly. The breaking auth migration below
539
+ // revokes these keys before authenticated service access resumes.
351
540
  sqlite.exec(`
352
541
  UPDATE api_keys
353
542
  SET supplemental_capabilities = '["admin.accounts"]'
@@ -373,13 +562,55 @@ export function openDb(dbPath) {
373
562
  if (!apiKeyCols.has('account_ids')) {
374
563
  sqlite.exec('ALTER TABLE api_keys ADD COLUMN account_ids TEXT');
375
564
  }
565
+ if (legacyAuthentication)
566
+ sqlite.exec('DELETE FROM api_keys');
567
+ if (!tableColumns(sqlite, 'admin_audit_events').has('actor_session_id')) {
568
+ sqlite.exec('ALTER TABLE admin_audit_events ADD COLUMN actor_session_id TEXT');
569
+ }
376
570
  const grantCols = tableColumns(sqlite, 'gmail_connection_grants');
377
- if (!grantCols.has('sharing_mode')) {
378
- sqlite.exec('ALTER TABLE gmail_connection_grants ADD COLUMN sharing_mode TEXT');
571
+ if (!grantCols.has('owner_member_id')) {
572
+ sqlite.exec('ALTER TABLE gmail_connection_grants ADD COLUMN owner_member_id TEXT');
573
+ if (grantCols.has('member_id')) {
574
+ sqlite.exec('UPDATE gmail_connection_grants SET owner_member_id = member_id');
575
+ }
576
+ }
577
+ if (!grantCols.has('shared_with_all')) {
578
+ sqlite.exec('ALTER TABLE gmail_connection_grants ADD COLUMN shared_with_all INTEGER');
579
+ if (grantCols.has('sharing_mode')) {
580
+ sqlite.exec("UPDATE gmail_connection_grants SET shared_with_all = CASE sharing_mode WHEN 'all' THEN 1 WHEN 'explicit' THEN 0 ELSE NULL END");
581
+ }
379
582
  }
380
- if (!grantCols.has('shared_member_ids')) {
381
- sqlite.exec('ALTER TABLE gmail_connection_grants ADD COLUMN shared_member_ids TEXT');
583
+ if (!grantCols.has('granted_member_ids')) {
584
+ sqlite.exec('ALTER TABLE gmail_connection_grants ADD COLUMN granted_member_ids TEXT');
585
+ if (grantCols.has('shared_member_ids')) {
586
+ sqlite.exec('UPDATE gmail_connection_grants SET granted_member_ids = shared_member_ids');
587
+ }
382
588
  }
589
+ if (grantCols.has('member_id'))
590
+ sqlite.exec('ALTER TABLE gmail_connection_grants DROP COLUMN member_id');
591
+ if (grantCols.has('sharing_mode'))
592
+ sqlite.exec('ALTER TABLE gmail_connection_grants DROP COLUMN sharing_mode');
593
+ if (grantCols.has('shared_member_ids')) {
594
+ sqlite.exec('ALTER TABLE gmail_connection_grants DROP COLUMN shared_member_ids');
595
+ }
596
+ // Login emails are case-insensitive. Keep the earliest duplicate address
597
+ // and require later legacy records to receive a new email before enrollment.
598
+ sqlite.exec(`
599
+ UPDATE members
600
+ SET email = NULL
601
+ WHERE email IS NOT NULL
602
+ AND EXISTS (
603
+ SELECT 1 FROM members AS winner
604
+ WHERE winner.email IS NOT NULL
605
+ AND lower(winner.email) = lower(members.email)
606
+ AND (
607
+ winner.created_at < members.created_at
608
+ OR (winner.created_at = members.created_at AND winner.id < members.id)
609
+ )
610
+ )
611
+ `);
612
+ sqlite.exec('DROP INDEX IF EXISTS members_email_unique');
613
+ sqlite.exec('CREATE UNIQUE INDEX IF NOT EXISTS members_email_unique_ci ON members(lower(email))');
383
614
  // Account identity is the mailbox address, regardless of provider. Gmail
384
615
  // wins when an older database contains the same address as both Gmail and IMAP.
385
616
  sqlite.exec(`
@@ -403,6 +634,60 @@ export function openDb(dbPath) {
403
634
  `);
404
635
  sqlite.exec('DROP INDEX IF EXISTS accounts_provider_email_unique');
405
636
  sqlite.exec('CREATE UNIQUE INDEX IF NOT EXISTS accounts_email_unique_ci ON accounts(lower(email))');
406
- return drizzle(sqlite);
637
+ sqlite.exec(`
638
+ INSERT INTO instance_settings (key, value) VALUES ('schema_version', '2')
639
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value
640
+ `);
641
+ sqlite.exec(`
642
+ INSERT OR IGNORE INTO instance_settings (key, value) VALUES ('bootstrap_complete', '0')
643
+ `);
644
+ }
645
+ const MIGRATIONS = [{ format: 1, run: migrateToFormatOne }];
646
+ function openCompatibleDb(dbPath, dataDir, options) {
647
+ const sqlite = new Database(dbPath);
648
+ try {
649
+ sqlite.pragma('busy_timeout = 5000');
650
+ sqlite.pragma('foreign_keys = ON');
651
+ const beforeMigration = compatibilityFor(dbPath, dataDir, readStoreFormat(sqlite));
652
+ assertCompatible(beforeMigration);
653
+ if (beforeMigration.requiresMigration && options.backupBeforeMigration !== false) {
654
+ backupForMigration(sqlite, dbPath, beforeMigration.storeFormat, CURRENT_STORE_FORMAT);
655
+ }
656
+ const migrate = sqlite.transaction(() => {
657
+ let storeFormat = readStoreFormat(sqlite);
658
+ assertCompatible(compatibilityFor(dbPath, dataDir, storeFormat));
659
+ for (const migration of MIGRATIONS) {
660
+ if (storeFormat >= migration.format)
661
+ continue;
662
+ migration.run(sqlite);
663
+ sqlite.pragma(`user_version = ${migration.format}`);
664
+ storeFormat = migration.format;
665
+ }
666
+ if (storeFormat !== CURRENT_STORE_FORMAT) {
667
+ throw new Error(`Fluxmail has no migration from store format ${storeFormat} to ${CURRENT_STORE_FORMAT}`);
668
+ }
669
+ syncLegacyCredentialRows(sqlite);
670
+ });
671
+ migrate.immediate();
672
+ sqlite.pragma('journal_mode = WAL');
673
+ return drizzle(sqlite);
674
+ }
675
+ catch (error) {
676
+ sqlite.close();
677
+ throw error;
678
+ }
679
+ }
680
+ export function openDb(dbPath, options = {}) {
681
+ const dataDir = options.dataDir ?? (dbPath === ':memory:' ? ':memory:' : path.dirname(dbPath));
682
+ const inspected = inspectStoreCompatibility(dbPath, dataDir);
683
+ assertCompatible(inspected);
684
+ if (dbPath === ':memory:' || !inspected.requiresMigration) {
685
+ return openCompatibleDb(dbPath, dataDir, options);
686
+ }
687
+ return withFileLock(`${dbPath}.migration.lock`, {
688
+ timeoutMs: MIGRATION_LOCK_TIMEOUT_MS,
689
+ staleMs: MIGRATION_LOCK_STALE_MS,
690
+ description: `migration of ${dbPath}`,
691
+ }, () => openCompatibleDb(dbPath, dataDir, options));
407
692
  }
408
693
  //# sourceMappingURL=db.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface FileLockOptions {
2
+ timeoutMs: number;
3
+ staleMs: number;
4
+ description: string;
5
+ }
6
+ export declare function withFileLock<T>(lockPath: string, options: FileLockOptions, callback: () => T): T;
7
+ //# sourceMappingURL=fileLock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileLock.d.ts","sourceRoot":"","sources":["../../src/storage/fileLock.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAmJD,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CA2ChG"}