fluxmail 0.3.0 → 0.4.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/README.md +15 -55
- package/dist/accounts/gmailConnection.d.ts +5 -1
- package/dist/accounts/gmailConnection.d.ts.map +1 -1
- package/dist/accounts/gmailConnection.js +14 -2
- package/dist/accounts/gmailConnection.js.map +1 -1
- package/dist/accounts/googleAuth.js +1 -1
- package/dist/accounts/googleAuth.js.map +1 -1
- package/dist/accounts/microsoftAuth.d.ts +21 -0
- package/dist/accounts/microsoftAuth.d.ts.map +1 -0
- package/dist/accounts/microsoftAuth.js +220 -0
- package/dist/accounts/microsoftAuth.js.map +1 -0
- package/dist/accounts/registry.d.ts +21 -8
- package/dist/accounts/registry.d.ts.map +1 -1
- package/dist/accounts/registry.js +190 -24
- package/dist/accounts/registry.js.map +1 -1
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +857 -647
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +102 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +114 -14
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +7 -1
- package/dist/context.js.map +1 -1
- package/dist/http/admin.d.ts +21 -0
- package/dist/http/admin.d.ts.map +1 -0
- package/dist/http/admin.js +618 -0
- package/dist/http/admin.js.map +1 -0
- package/dist/http/app.d.ts +2 -0
- package/dist/http/app.d.ts.map +1 -1
- package/dist/http/app.js +322 -42
- package/dist/http/app.js.map +1 -1
- package/dist/http/rest.d.ts +28 -0
- package/dist/http/rest.d.ts.map +1 -0
- package/dist/http/rest.js +1130 -0
- package/dist/http/rest.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/licensing/refresher.d.ts +23 -7
- package/dist/licensing/refresher.d.ts.map +1 -1
- package/dist/licensing/refresher.js +93 -37
- package/dist/licensing/refresher.js.map +1 -1
- package/dist/mcp/buildServer.d.ts.map +1 -1
- package/dist/mcp/buildServer.js +1 -1
- package/dist/mcp/buildServer.js.map +1 -1
- package/dist/permissions.d.ts +15 -4
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +61 -12
- package/dist/permissions.js.map +1 -1
- package/dist/service/emailService.d.ts +15 -8
- package/dist/service/emailService.d.ts.map +1 -1
- package/dist/service/emailService.js +42 -17
- package/dist/service/emailService.js.map +1 -1
- package/dist/storage/adminAudit.d.ts +14 -0
- package/dist/storage/adminAudit.d.ts.map +1 -0
- package/dist/storage/adminAudit.js +32 -0
- package/dist/storage/adminAudit.js.map +1 -0
- package/dist/storage/apiKeys.d.ts +25 -7
- package/dist/storage/apiKeys.d.ts.map +1 -1
- package/dist/storage/apiKeys.js +104 -12
- package/dist/storage/apiKeys.js.map +1 -1
- package/dist/storage/db.d.ts +486 -0
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +171 -8
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/gmailConnectionGrants.d.ts +9 -0
- package/dist/storage/gmailConnectionGrants.d.ts.map +1 -1
- package/dist/storage/gmailConnectionGrants.js +30 -7
- package/dist/storage/gmailConnectionGrants.js.map +1 -1
- package/dist/storage/members.d.ts +7 -4
- package/dist/storage/members.d.ts.map +1 -1
- package/dist/storage/members.js +34 -8
- package/dist/storage/members.js.map +1 -1
- package/dist/storage/restIdempotency.d.ts +28 -0
- package/dist/storage/restIdempotency.d.ts.map +1 -0
- package/dist/storage/restIdempotency.js +47 -0
- package/dist/storage/restIdempotency.js.map +1 -0
- package/package.json +7 -5
package/dist/storage/db.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
2
|
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
3
|
-
import { index, integer, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
|
|
3
|
+
import { index, integer, primaryKey, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
|
|
4
4
|
export const members = sqliteTable('members', {
|
|
5
5
|
id: text('id').primaryKey(),
|
|
6
6
|
name: text('name').notNull(),
|
|
7
7
|
email: text('email'),
|
|
8
|
+
role: text('role').notNull().default('member'),
|
|
8
9
|
createdAt: integer('created_at').notNull(),
|
|
9
10
|
}, (table) => [uniqueIndex('members_email_unique').on(table.email)]);
|
|
10
11
|
export const accounts = sqliteTable('accounts', {
|
|
@@ -14,9 +15,18 @@ export const accounts = sqliteTable('accounts', {
|
|
|
14
15
|
displayName: text('display_name'),
|
|
15
16
|
status: text('status').notNull().default('active'),
|
|
16
17
|
createdAt: integer('created_at').notNull(),
|
|
17
|
-
/** Owning member
|
|
18
|
+
/** Owning member. NULL is retained only for migrated installs with no members. */
|
|
18
19
|
memberId: text('member_id').references(() => members.id, { onDelete: 'set null' }),
|
|
20
|
+
sharingMode: text('sharing_mode').notNull().default('private'),
|
|
19
21
|
}, (table) => [uniqueIndex('accounts_provider_email_unique').on(table.provider, table.email)]);
|
|
22
|
+
export const accountMemberShares = sqliteTable('account_member_shares', {
|
|
23
|
+
accountId: text('account_id')
|
|
24
|
+
.notNull()
|
|
25
|
+
.references(() => accounts.id, { onDelete: 'cascade' }),
|
|
26
|
+
memberId: text('member_id')
|
|
27
|
+
.notNull()
|
|
28
|
+
.references(() => members.id, { onDelete: 'cascade' }),
|
|
29
|
+
}, (table) => [primaryKey({ columns: [table.accountId, table.memberId] })]);
|
|
20
30
|
export const oauthTokens = sqliteTable('oauth_tokens', {
|
|
21
31
|
accountId: text('account_id')
|
|
22
32
|
.primaryKey()
|
|
@@ -62,19 +72,36 @@ export const apiKeys = sqliteTable('api_keys', {
|
|
|
62
72
|
keyHash: text('key_hash').notNull().unique(),
|
|
63
73
|
createdAt: integer('created_at').notNull(),
|
|
64
74
|
lastUsedAt: integer('last_used_at'),
|
|
65
|
-
/** Member the key was issued to; NULL
|
|
75
|
+
/** Member the key was issued to; NULL is reserved for migrated system credentials. */
|
|
66
76
|
memberId: text('member_id').references(() => members.id, { onDelete: 'set null' }),
|
|
67
77
|
/** Named MCP permission profile, or "custom" when customCapabilities is populated. */
|
|
68
78
|
permissionProfile: text('permission_profile').notNull().default('full'),
|
|
69
79
|
/** JSON array of explicit MCP capabilities for custom policies. */
|
|
70
80
|
customCapabilities: text('custom_capabilities'),
|
|
81
|
+
/** JSON array of admin capabilities added to a named mail profile. */
|
|
82
|
+
supplementalCapabilities: text('supplemental_capabilities').notNull().default('[]'),
|
|
83
|
+
/** NULL means no extra narrowing; otherwise a JSON array of canonical account ids. */
|
|
84
|
+
accountIds: text('account_ids'),
|
|
71
85
|
});
|
|
86
|
+
export const adminAuditEvents = sqliteTable('admin_audit_events', {
|
|
87
|
+
id: integer('id').primaryKey({ autoIncrement: true }),
|
|
88
|
+
timestamp: integer('timestamp').notNull(),
|
|
89
|
+
operation: text('operation').notNull(),
|
|
90
|
+
outcome: text('outcome').notNull(),
|
|
91
|
+
actorKeyId: text('actor_key_id'),
|
|
92
|
+
actorMemberId: text('actor_member_id'),
|
|
93
|
+
resourceType: text('resource_type'),
|
|
94
|
+
resourceId: text('resource_id'),
|
|
95
|
+
errorCode: text('error_code'),
|
|
96
|
+
}, (table) => [index('admin_audit_events_timestamp').on(table.timestamp)]);
|
|
72
97
|
export const gmailConnectionGrants = sqliteTable('gmail_connection_grants', {
|
|
73
98
|
/** SHA-256 hex digest. The raw token is printed once and never stored. */
|
|
74
99
|
tokenHash: text('token_hash').primaryKey(),
|
|
75
100
|
scope: text('scope').notNull(),
|
|
76
101
|
memberId: text('member_id'),
|
|
77
102
|
reauthorizeAccountId: text('reauthorize_account_id'),
|
|
103
|
+
sharingMode: text('sharing_mode'),
|
|
104
|
+
sharedMemberIds: text('shared_member_ids'),
|
|
78
105
|
createdAt: integer('created_at').notNull(),
|
|
79
106
|
expiresAt: integer('expires_at').notNull(),
|
|
80
107
|
consumedAt: integer('consumed_at'),
|
|
@@ -106,11 +133,25 @@ export const scheduledSends = sqliteTable('scheduled_sends', {
|
|
|
106
133
|
claimToken: text('claim_token'),
|
|
107
134
|
claimUntil: integer('claim_until'),
|
|
108
135
|
}, (table) => [index('scheduled_sends_pending_due').on(table.status, table.sendAt)]);
|
|
136
|
+
export const restIdempotency = sqliteTable('rest_idempotency', {
|
|
137
|
+
principalId: text('principal_id').notNull(),
|
|
138
|
+
idempotencyKey: text('idempotency_key').notNull(),
|
|
139
|
+
requestHash: text('request_hash').notNull(),
|
|
140
|
+
state: text('state').notNull(),
|
|
141
|
+
responseStatus: integer('response_status'),
|
|
142
|
+
responseBody: text('response_body'),
|
|
143
|
+
createdAt: integer('created_at').notNull(),
|
|
144
|
+
expiresAt: integer('expires_at').notNull(),
|
|
145
|
+
}, (table) => [
|
|
146
|
+
primaryKey({ columns: [table.principalId, table.idempotencyKey] }),
|
|
147
|
+
index('rest_idempotency_expires_at').on(table.expiresAt),
|
|
148
|
+
]);
|
|
109
149
|
const BOOTSTRAP_SQL = `
|
|
110
150
|
CREATE TABLE IF NOT EXISTS members (
|
|
111
151
|
id TEXT PRIMARY KEY,
|
|
112
152
|
name TEXT NOT NULL,
|
|
113
153
|
email TEXT,
|
|
154
|
+
role TEXT NOT NULL DEFAULT 'member',
|
|
114
155
|
created_at INTEGER NOT NULL
|
|
115
156
|
);
|
|
116
157
|
CREATE UNIQUE INDEX IF NOT EXISTS members_email_unique ON members(email);
|
|
@@ -121,10 +162,14 @@ CREATE TABLE IF NOT EXISTS accounts (
|
|
|
121
162
|
display_name TEXT,
|
|
122
163
|
status TEXT NOT NULL DEFAULT 'active',
|
|
123
164
|
created_at INTEGER NOT NULL,
|
|
124
|
-
member_id TEXT REFERENCES members(id) ON DELETE SET NULL
|
|
165
|
+
member_id TEXT REFERENCES members(id) ON DELETE SET NULL,
|
|
166
|
+
sharing_mode TEXT NOT NULL DEFAULT 'private'
|
|
167
|
+
);
|
|
168
|
+
CREATE TABLE IF NOT EXISTS account_member_shares (
|
|
169
|
+
account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
|
|
170
|
+
member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
|
|
171
|
+
PRIMARY KEY (account_id, member_id)
|
|
125
172
|
);
|
|
126
|
-
CREATE UNIQUE INDEX IF NOT EXISTS accounts_provider_email_unique
|
|
127
|
-
ON accounts(provider, email);
|
|
128
173
|
CREATE TABLE IF NOT EXISTS oauth_tokens (
|
|
129
174
|
account_id TEXT PRIMARY KEY REFERENCES accounts(id) ON DELETE CASCADE,
|
|
130
175
|
encrypted_tokens TEXT NOT NULL,
|
|
@@ -166,13 +211,30 @@ CREATE TABLE IF NOT EXISTS api_keys (
|
|
|
166
211
|
last_used_at INTEGER,
|
|
167
212
|
member_id TEXT REFERENCES members(id) ON DELETE SET NULL,
|
|
168
213
|
permission_profile TEXT NOT NULL DEFAULT 'full',
|
|
169
|
-
custom_capabilities TEXT
|
|
214
|
+
custom_capabilities TEXT,
|
|
215
|
+
supplemental_capabilities TEXT NOT NULL DEFAULT '[]',
|
|
216
|
+
account_ids TEXT
|
|
170
217
|
);
|
|
218
|
+
CREATE TABLE IF NOT EXISTS admin_audit_events (
|
|
219
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
220
|
+
timestamp INTEGER NOT NULL,
|
|
221
|
+
operation TEXT NOT NULL,
|
|
222
|
+
outcome TEXT NOT NULL,
|
|
223
|
+
actor_key_id TEXT,
|
|
224
|
+
actor_member_id TEXT,
|
|
225
|
+
resource_type TEXT,
|
|
226
|
+
resource_id TEXT,
|
|
227
|
+
error_code TEXT
|
|
228
|
+
);
|
|
229
|
+
CREATE INDEX IF NOT EXISTS admin_audit_events_timestamp
|
|
230
|
+
ON admin_audit_events(timestamp);
|
|
171
231
|
CREATE TABLE IF NOT EXISTS gmail_connection_grants (
|
|
172
232
|
token_hash TEXT PRIMARY KEY,
|
|
173
233
|
scope TEXT NOT NULL,
|
|
174
234
|
member_id TEXT,
|
|
175
235
|
reauthorize_account_id TEXT,
|
|
236
|
+
sharing_mode TEXT,
|
|
237
|
+
shared_member_ids TEXT,
|
|
176
238
|
created_at INTEGER NOT NULL,
|
|
177
239
|
expires_at INTEGER NOT NULL,
|
|
178
240
|
consumed_at INTEGER
|
|
@@ -202,6 +264,19 @@ CREATE TABLE IF NOT EXISTS scheduled_sends (
|
|
|
202
264
|
);
|
|
203
265
|
CREATE INDEX IF NOT EXISTS scheduled_sends_pending_due
|
|
204
266
|
ON scheduled_sends(status, send_at);
|
|
267
|
+
CREATE TABLE IF NOT EXISTS rest_idempotency (
|
|
268
|
+
principal_id TEXT NOT NULL,
|
|
269
|
+
idempotency_key TEXT NOT NULL,
|
|
270
|
+
request_hash TEXT NOT NULL,
|
|
271
|
+
state TEXT NOT NULL,
|
|
272
|
+
response_status INTEGER,
|
|
273
|
+
response_body TEXT,
|
|
274
|
+
created_at INTEGER NOT NULL,
|
|
275
|
+
expires_at INTEGER NOT NULL,
|
|
276
|
+
PRIMARY KEY (principal_id, idempotency_key)
|
|
277
|
+
);
|
|
278
|
+
CREATE INDEX IF NOT EXISTS rest_idempotency_expires_at
|
|
279
|
+
ON rest_idempotency(expires_at);
|
|
205
280
|
`;
|
|
206
281
|
function tableColumns(sqlite, table) {
|
|
207
282
|
return new Set(sqlite.prepare(`PRAGMA table_info(${table})`).all().map((column) => column.name));
|
|
@@ -226,10 +301,38 @@ export function openDb(dbPath) {
|
|
|
226
301
|
sqlite.exec('ALTER TABLE scheduled_sends ADD COLUMN claim_token TEXT');
|
|
227
302
|
if (!scheduledCols.has('claim_until'))
|
|
228
303
|
sqlite.exec('ALTER TABLE scheduled_sends ADD COLUMN claim_until INTEGER');
|
|
229
|
-
|
|
304
|
+
const memberCols = tableColumns(sqlite, 'members');
|
|
305
|
+
if (!memberCols.has('role')) {
|
|
306
|
+
sqlite.exec("ALTER TABLE members ADD COLUMN role TEXT NOT NULL DEFAULT 'member'");
|
|
307
|
+
// Existing installations gain one administrator: the earliest member.
|
|
308
|
+
sqlite.exec(`
|
|
309
|
+
UPDATE members SET role = 'admin'
|
|
310
|
+
WHERE id = (SELECT id FROM members ORDER BY created_at, id LIMIT 1)
|
|
311
|
+
`);
|
|
312
|
+
}
|
|
230
313
|
if (!tableColumns(sqlite, 'accounts').has('member_id')) {
|
|
231
314
|
sqlite.exec('ALTER TABLE accounts ADD COLUMN member_id TEXT REFERENCES members(id) ON DELETE SET NULL');
|
|
232
315
|
}
|
|
316
|
+
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");
|
|
320
|
+
}
|
|
321
|
+
sqlite.exec(`
|
|
322
|
+
CREATE TABLE IF NOT EXISTS account_member_shares (
|
|
323
|
+
account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
|
|
324
|
+
member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
|
|
325
|
+
PRIMARY KEY (account_id, member_id)
|
|
326
|
+
)
|
|
327
|
+
`);
|
|
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
|
+
`);
|
|
233
336
|
if (!tableColumns(sqlite, 'api_keys').has('member_id')) {
|
|
234
337
|
sqlite.exec('ALTER TABLE api_keys ADD COLUMN member_id TEXT REFERENCES members(id) ON DELETE SET NULL');
|
|
235
338
|
}
|
|
@@ -240,6 +343,66 @@ export function openDb(dbPath) {
|
|
|
240
343
|
if (!apiKeyCols.has('custom_capabilities')) {
|
|
241
344
|
sqlite.exec('ALTER TABLE api_keys ADD COLUMN custom_capabilities TEXT');
|
|
242
345
|
}
|
|
346
|
+
if (!apiKeyCols.has('supplemental_capabilities')) {
|
|
347
|
+
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.
|
|
351
|
+
sqlite.exec(`
|
|
352
|
+
UPDATE api_keys
|
|
353
|
+
SET supplemental_capabilities = '["admin.accounts"]'
|
|
354
|
+
WHERE permission_profile != 'custom'
|
|
355
|
+
AND (
|
|
356
|
+
member_id IS NULL
|
|
357
|
+
OR member_id IN (SELECT id FROM members WHERE role = 'admin')
|
|
358
|
+
)
|
|
359
|
+
`);
|
|
360
|
+
sqlite.exec(`
|
|
361
|
+
UPDATE api_keys
|
|
362
|
+
SET custom_capabilities = json_insert(
|
|
363
|
+
COALESCE(custom_capabilities, '[]'),
|
|
364
|
+
'$[#]', 'admin.accounts'
|
|
365
|
+
)
|
|
366
|
+
WHERE permission_profile = 'custom'
|
|
367
|
+
AND (
|
|
368
|
+
member_id IS NULL
|
|
369
|
+
OR member_id IN (SELECT id FROM members WHERE role = 'admin')
|
|
370
|
+
)
|
|
371
|
+
`);
|
|
372
|
+
}
|
|
373
|
+
if (!apiKeyCols.has('account_ids')) {
|
|
374
|
+
sqlite.exec('ALTER TABLE api_keys ADD COLUMN account_ids TEXT');
|
|
375
|
+
}
|
|
376
|
+
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');
|
|
379
|
+
}
|
|
380
|
+
if (!grantCols.has('shared_member_ids')) {
|
|
381
|
+
sqlite.exec('ALTER TABLE gmail_connection_grants ADD COLUMN shared_member_ids TEXT');
|
|
382
|
+
}
|
|
383
|
+
// Account identity is the mailbox address, regardless of provider. Gmail
|
|
384
|
+
// wins when an older database contains the same address as both Gmail and IMAP.
|
|
385
|
+
sqlite.exec(`
|
|
386
|
+
DELETE FROM accounts
|
|
387
|
+
WHERE EXISTS (
|
|
388
|
+
SELECT 1 FROM accounts AS winner
|
|
389
|
+
WHERE lower(winner.email) = lower(accounts.email)
|
|
390
|
+
AND (
|
|
391
|
+
CASE winner.provider WHEN 'gmail' THEN 0 ELSE 1 END
|
|
392
|
+
< CASE accounts.provider WHEN 'gmail' THEN 0 ELSE 1 END
|
|
393
|
+
OR (
|
|
394
|
+
CASE winner.provider WHEN 'gmail' THEN 0 ELSE 1 END
|
|
395
|
+
= CASE accounts.provider WHEN 'gmail' THEN 0 ELSE 1 END
|
|
396
|
+
AND (
|
|
397
|
+
winner.created_at < accounts.created_at
|
|
398
|
+
OR (winner.created_at = accounts.created_at AND winner.id < accounts.id)
|
|
399
|
+
)
|
|
400
|
+
)
|
|
401
|
+
)
|
|
402
|
+
)
|
|
403
|
+
`);
|
|
404
|
+
sqlite.exec('DROP INDEX IF EXISTS accounts_provider_email_unique');
|
|
405
|
+
sqlite.exec('CREATE UNIQUE INDEX IF NOT EXISTS accounts_email_unique_ci ON accounts(lower(email))');
|
|
243
406
|
return drizzle(sqlite);
|
|
244
407
|
}
|
|
245
408
|
//# sourceMappingURL=db.js.map
|
package/dist/storage/db.js.map
CHANGED
|
@@ -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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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { type FluxmailDb } from './db.js';
|
|
2
|
+
import type { AccountSharingMode } from '@fluxmail/core';
|
|
2
3
|
export declare const GMAIL_CONNECTION_GRANT_TTL_MS: number;
|
|
3
4
|
export interface GmailConnectionIntent {
|
|
4
5
|
memberId?: string;
|
|
5
6
|
reauthorizeAccountId?: string;
|
|
7
|
+
sharingMode?: AccountSharingMode;
|
|
8
|
+
sharedMemberIds?: string[];
|
|
6
9
|
}
|
|
7
10
|
export interface GmailConnectionGrant extends GmailConnectionIntent {
|
|
8
11
|
expiresAt: number;
|
|
@@ -20,9 +23,15 @@ export type GmailConnectionClaim = {
|
|
|
20
23
|
export type GmailConnectionGrantStatus = 'available' | 'invalid' | 'expired' | 'used';
|
|
21
24
|
export declare function gmailConnectionTokenHash(token: string): string;
|
|
22
25
|
export declare function inspectGmailConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionGrantStatus;
|
|
26
|
+
export declare function inspectOutlookConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionGrantStatus;
|
|
23
27
|
export declare function createGmailConnectionGrant(db: FluxmailDb, intent?: GmailConnectionIntent, now?: number): {
|
|
24
28
|
token: string;
|
|
25
29
|
expiresAt: number;
|
|
26
30
|
};
|
|
31
|
+
export declare function createOutlookConnectionGrant(db: FluxmailDb, intent?: GmailConnectionIntent, now?: number): {
|
|
32
|
+
token: string;
|
|
33
|
+
expiresAt: number;
|
|
34
|
+
};
|
|
27
35
|
export declare function claimGmailConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionClaim;
|
|
36
|
+
export declare function claimOutlookConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionClaim;
|
|
28
37
|
//# sourceMappingURL=gmailConnectionGrants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmailConnectionGrants.d.ts","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"gmailConnectionGrants.d.ts","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,eAAO,MAAM,6BAA6B,QAAiB,CAAC;AAK5D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,0BAA0B,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAItF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAoBD,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,GAAG,SAAa,GACf,0BAA0B,CAE5B;AAED,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,GAAG,SAAa,GACf,0BAA0B,CAE5B;AA+BD,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,UAAU,EACd,MAAM,GAAE,qBAA0B,EAClC,GAAG,SAAa,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAEtC;AAED,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,UAAU,EACd,MAAM,GAAE,qBAA0B,EAClC,GAAG,SAAa,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAEtC;AA8CD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,oBAAoB,CAE/G;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,oBAAoB,CAEjH"}
|
|
@@ -3,15 +3,16 @@ import { and, eq, gt, isNull, lt } from 'drizzle-orm';
|
|
|
3
3
|
import { gmailConnectionGrants } from './db.js';
|
|
4
4
|
export const GMAIL_CONNECTION_GRANT_TTL_MS = 10 * 60 * 1000;
|
|
5
5
|
const GMAIL_CONNECTION_SCOPE = 'gmail_connect';
|
|
6
|
+
const OUTLOOK_CONNECTION_SCOPE = 'outlook_connect';
|
|
6
7
|
const RETENTION_MS = 24 * 60 * 60 * 1000;
|
|
7
8
|
export function gmailConnectionTokenHash(token) {
|
|
8
9
|
return createHash('sha256').update(token).digest('hex');
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
+
function inspectConnectionGrant(db, token, scope, now = Date.now()) {
|
|
11
12
|
const existing = db
|
|
12
13
|
.select()
|
|
13
14
|
.from(gmailConnectionGrants)
|
|
14
|
-
.where(and(eq(gmailConnectionGrants.tokenHash, gmailConnectionTokenHash(token)), eq(gmailConnectionGrants.scope,
|
|
15
|
+
.where(and(eq(gmailConnectionGrants.tokenHash, gmailConnectionTokenHash(token)), eq(gmailConnectionGrants.scope, scope)))
|
|
15
16
|
.get();
|
|
16
17
|
if (!existing)
|
|
17
18
|
return 'invalid';
|
|
@@ -19,7 +20,13 @@ export function inspectGmailConnectionGrant(db, token, now = Date.now()) {
|
|
|
19
20
|
return 'used';
|
|
20
21
|
return existing.expiresAt > now ? 'available' : 'expired';
|
|
21
22
|
}
|
|
22
|
-
export function
|
|
23
|
+
export function inspectGmailConnectionGrant(db, token, now = Date.now()) {
|
|
24
|
+
return inspectConnectionGrant(db, token, GMAIL_CONNECTION_SCOPE, now);
|
|
25
|
+
}
|
|
26
|
+
export function inspectOutlookConnectionGrant(db, token, now = Date.now()) {
|
|
27
|
+
return inspectConnectionGrant(db, token, OUTLOOK_CONNECTION_SCOPE, now);
|
|
28
|
+
}
|
|
29
|
+
function createConnectionGrant(db, scope, intent = {}, now = Date.now()) {
|
|
23
30
|
const token = randomBytes(32).toString('base64url');
|
|
24
31
|
const expiresAt = now + GMAIL_CONNECTION_GRANT_TTL_MS;
|
|
25
32
|
db.delete(gmailConnectionGrants)
|
|
@@ -28,9 +35,11 @@ export function createGmailConnectionGrant(db, intent = {}, now = Date.now()) {
|
|
|
28
35
|
db.insert(gmailConnectionGrants)
|
|
29
36
|
.values({
|
|
30
37
|
tokenHash: gmailConnectionTokenHash(token),
|
|
31
|
-
scope
|
|
38
|
+
scope,
|
|
32
39
|
memberId: intent.memberId ?? null,
|
|
33
40
|
reauthorizeAccountId: intent.reauthorizeAccountId ?? null,
|
|
41
|
+
sharingMode: intent.sharingMode ?? null,
|
|
42
|
+
sharedMemberIds: intent.sharedMemberIds ? JSON.stringify(intent.sharedMemberIds) : null,
|
|
34
43
|
createdAt: now,
|
|
35
44
|
expiresAt,
|
|
36
45
|
consumedAt: null,
|
|
@@ -38,12 +47,18 @@ export function createGmailConnectionGrant(db, intent = {}, now = Date.now()) {
|
|
|
38
47
|
.run();
|
|
39
48
|
return { token, expiresAt };
|
|
40
49
|
}
|
|
41
|
-
export function
|
|
50
|
+
export function createGmailConnectionGrant(db, intent = {}, now = Date.now()) {
|
|
51
|
+
return createConnectionGrant(db, GMAIL_CONNECTION_SCOPE, intent, now);
|
|
52
|
+
}
|
|
53
|
+
export function createOutlookConnectionGrant(db, intent = {}, now = Date.now()) {
|
|
54
|
+
return createConnectionGrant(db, OUTLOOK_CONNECTION_SCOPE, intent, now);
|
|
55
|
+
}
|
|
56
|
+
function claimConnectionGrant(db, token, scope, now = Date.now()) {
|
|
42
57
|
const tokenHash = gmailConnectionTokenHash(token);
|
|
43
58
|
const claimed = db
|
|
44
59
|
.update(gmailConnectionGrants)
|
|
45
60
|
.set({ consumedAt: now })
|
|
46
|
-
.where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope,
|
|
61
|
+
.where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope, scope), isNull(gmailConnectionGrants.consumedAt), gt(gmailConnectionGrants.expiresAt, now)))
|
|
47
62
|
.returning()
|
|
48
63
|
.get();
|
|
49
64
|
if (claimed) {
|
|
@@ -53,13 +68,15 @@ export function claimGmailConnectionGrant(db, token, now = Date.now()) {
|
|
|
53
68
|
expiresAt: claimed.expiresAt,
|
|
54
69
|
...(claimed.memberId ? { memberId: claimed.memberId } : {}),
|
|
55
70
|
...(claimed.reauthorizeAccountId ? { reauthorizeAccountId: claimed.reauthorizeAccountId } : {}),
|
|
71
|
+
...(claimed.sharingMode ? { sharingMode: claimed.sharingMode } : {}),
|
|
72
|
+
...(claimed.sharedMemberIds ? { sharedMemberIds: JSON.parse(claimed.sharedMemberIds) } : {}),
|
|
56
73
|
},
|
|
57
74
|
};
|
|
58
75
|
}
|
|
59
76
|
const existing = db
|
|
60
77
|
.select()
|
|
61
78
|
.from(gmailConnectionGrants)
|
|
62
|
-
.where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope,
|
|
79
|
+
.where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope, scope)))
|
|
63
80
|
.get();
|
|
64
81
|
if (!existing)
|
|
65
82
|
return { status: 'invalid' };
|
|
@@ -67,4 +84,10 @@ export function claimGmailConnectionGrant(db, token, now = Date.now()) {
|
|
|
67
84
|
return { status: 'used' };
|
|
68
85
|
return { status: 'expired' };
|
|
69
86
|
}
|
|
87
|
+
export function claimGmailConnectionGrant(db, token, now = Date.now()) {
|
|
88
|
+
return claimConnectionGrant(db, token, GMAIL_CONNECTION_SCOPE, now);
|
|
89
|
+
}
|
|
90
|
+
export function claimOutlookConnectionGrant(db, token, now = Date.now()) {
|
|
91
|
+
return claimConnectionGrant(db, token, OUTLOOK_CONNECTION_SCOPE, now);
|
|
92
|
+
}
|
|
70
93
|
//# sourceMappingURL=gmailConnectionGrants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmailConnectionGrants.js","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAmB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"gmailConnectionGrants.js","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAmB,MAAM,SAAS,CAAC;AAGjE,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5D,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAC/C,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AACnD,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAuBzC,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,sBAAsB,CAC7B,EAAc,EACd,KAAa,EACb,KAAsB,EACtB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,QAAQ,GAAG,EAAE;SAChB,MAAM,EAAE;SACR,IAAI,CAAC,qBAAqB,CAAC;SAC3B,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,wBAAwB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAClH;SACA,GAAG,EAAE,CAAC;IACT,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAChD,OAAO,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,EAAc,EACd,KAAa,EACb,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,OAAO,sBAAsB,CAAC,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,EAAc,EACd,KAAa,EACb,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,OAAO,sBAAsB,CAAC,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,qBAAqB,CAC5B,EAAc,EACd,KAAsB,EACtB,SAAgC,EAAE,EAClC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,GAAG,GAAG,6BAA6B,CAAC;IAEtD,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC;SAC7B,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC;SAC9D,GAAG,EAAE,CAAC;IACT,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC;SAC7B,MAAM,CAAC;QACN,SAAS,EAAE,wBAAwB,CAAC,KAAK,CAAC;QAC1C,KAAK;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,IAAI,IAAI;QACzD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;QACvC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;QACvF,SAAS,EAAE,GAAG;QACd,SAAS;QACT,UAAU,EAAE,IAAI;KACjB,CAAC;SACD,GAAG,EAAE,CAAC;IAET,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,EAAc,EACd,SAAgC,EAAE,EAClC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,OAAO,qBAAqB,CAAC,EAAE,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,EAAc,EACd,SAAgC,EAAE,EAClC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,OAAO,qBAAqB,CAAC,EAAE,EAAE,wBAAwB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,oBAAoB,CAC3B,EAAc,EACd,KAAa,EACb,KAAsB,EACtB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,EAAE;SACf,MAAM,CAAC,qBAAqB,CAAC;SAC7B,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;SACxB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,EAC9C,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EACtC,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,EACxC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,GAAG,CAAC,CACzC,CACF;SACA,SAAS,EAAE;SACX,GAAG,EAAE,CAAC;IAET,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE;gBACL,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/F,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1F,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzG;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE;SAChB,MAAM,EAAE;SACR,IAAI,CAAC,qBAAqB,CAAC;SAC3B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;SAClG,GAAG,EAAE,CAAC;IACT,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC5C,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EAAc,EAAE,KAAa,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACvF,OAAO,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,EAAc,EAAE,KAAa,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACzF,OAAO,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -3,27 +3,30 @@ export interface MemberInfo {
|
|
|
3
3
|
id: string;
|
|
4
4
|
name: string;
|
|
5
5
|
email: string | null;
|
|
6
|
+
role: MemberRole;
|
|
6
7
|
createdAt: number;
|
|
7
8
|
/** Mailboxes owned by this member (shared mailboxes are not counted). */
|
|
8
9
|
accountCount: number;
|
|
9
10
|
apiKeyCount: number;
|
|
10
11
|
}
|
|
12
|
+
export type MemberRole = 'admin' | 'member';
|
|
11
13
|
export declare function addMember(db: FluxmailDb, input: {
|
|
12
14
|
name: string;
|
|
13
15
|
email?: string;
|
|
16
|
+
role?: MemberRole;
|
|
14
17
|
}): MemberInfo;
|
|
15
18
|
export declare function getMember(db: FluxmailDb, id: string): MemberInfo;
|
|
16
19
|
/** Resolve a member by id or email, for CLI --member flags. */
|
|
17
20
|
export declare function findMember(db: FluxmailDb, ref: string): MemberInfo;
|
|
18
21
|
export declare function listMembers(db: FluxmailDb): MemberInfo[];
|
|
22
|
+
export declare function setMemberRole(db: FluxmailDb, ref: string, role: MemberRole): MemberInfo;
|
|
19
23
|
/**
|
|
20
|
-
* Delete a member
|
|
21
|
-
*
|
|
22
|
-
*
|
|
24
|
+
* Delete a member after every mailbox they own has been reassigned or removed.
|
|
25
|
+
* Their API keys and selected sharing grants are deleted by the transaction and
|
|
26
|
+
* foreign-key cascades.
|
|
23
27
|
*/
|
|
24
28
|
export declare function removeMember(db: FluxmailDb, id: string): {
|
|
25
29
|
name: string;
|
|
26
|
-
freedAccounts: number;
|
|
27
30
|
revokedApiKeys: number;
|
|
28
31
|
};
|
|
29
32
|
//# sourceMappingURL=members.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/storage/members.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/storage/members.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAa5C,wBAAgB,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,GAAG,UAAU,CA8BhH;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,CAIhE;AAED,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAWlE;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,UAAU,GAAG,UAAU,EAAE,CAMxD;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAIvF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAejG"}
|
package/dist/storage/members.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { randomBytes } from 'node:crypto';
|
|
2
|
-
import { eq } from 'drizzle-orm';
|
|
2
|
+
import { eq, sql } from 'drizzle-orm';
|
|
3
3
|
import { EmailError } from '@fluxmail/core';
|
|
4
4
|
import { accounts, apiKeys, members } from './db.js';
|
|
5
5
|
import { assertMemberLimit, getEntitlements } from '../licensing/entitlements.js';
|
|
6
6
|
function toInfo(db, row) {
|
|
7
7
|
return {
|
|
8
8
|
...row,
|
|
9
|
+
role: row.role,
|
|
9
10
|
accountCount: db.select().from(accounts).where(eq(accounts.memberId, row.id)).all().length,
|
|
10
11
|
apiKeyCount: db.select().from(apiKeys).where(eq(apiKeys.memberId, row.id)).all().length,
|
|
11
12
|
};
|
|
@@ -17,14 +18,26 @@ export function addMember(db, input) {
|
|
|
17
18
|
const email = input.email?.trim().toLowerCase();
|
|
18
19
|
const id = `member_${randomBytes(6).toString('hex')}`;
|
|
19
20
|
db.transaction((tx) => {
|
|
20
|
-
if (email &&
|
|
21
|
+
if (email &&
|
|
22
|
+
tx
|
|
23
|
+
.select()
|
|
24
|
+
.from(members)
|
|
25
|
+
.where(sql `lower(${members.email}) = ${email}`)
|
|
26
|
+
.get()) {
|
|
21
27
|
throw new EmailError('invalid_request', `A member with email ${email} already exists`);
|
|
22
28
|
}
|
|
23
29
|
const memberCount = tx.select().from(members).all().length;
|
|
24
30
|
assertMemberLimit(memberCount, getEntitlements(tx));
|
|
31
|
+
const role = input.role ?? (memberCount === 0 ? 'admin' : 'member');
|
|
25
32
|
tx.insert(members)
|
|
26
|
-
.values({ id, name, email: email ?? null, createdAt: Date.now() })
|
|
33
|
+
.values({ id, name, email: email ?? null, role, createdAt: Date.now() })
|
|
27
34
|
.run();
|
|
35
|
+
if (memberCount === 0) {
|
|
36
|
+
tx.update(accounts)
|
|
37
|
+
.set({ memberId: id })
|
|
38
|
+
.where(sql `${accounts.memberId} IS NULL`)
|
|
39
|
+
.run();
|
|
40
|
+
}
|
|
28
41
|
});
|
|
29
42
|
return getMember(db, id);
|
|
30
43
|
}
|
|
@@ -39,7 +52,12 @@ export function findMember(db, ref) {
|
|
|
39
52
|
const byId = db.select().from(members).where(eq(members.id, ref)).get();
|
|
40
53
|
if (byId)
|
|
41
54
|
return toInfo(db, byId);
|
|
42
|
-
const
|
|
55
|
+
const email = ref.trim().toLowerCase();
|
|
56
|
+
const byEmail = db
|
|
57
|
+
.select()
|
|
58
|
+
.from(members)
|
|
59
|
+
.where(sql `lower(${members.email}) = ${email}`)
|
|
60
|
+
.get();
|
|
43
61
|
if (byEmail)
|
|
44
62
|
return toInfo(db, byEmail);
|
|
45
63
|
throw new EmailError('not_found', `No member with id or email "${ref}". Run "fluxmail members list" to see members.`);
|
|
@@ -51,17 +69,25 @@ export function listMembers(db) {
|
|
|
51
69
|
.all()
|
|
52
70
|
.map((row) => toInfo(db, row));
|
|
53
71
|
}
|
|
72
|
+
export function setMemberRole(db, ref, role) {
|
|
73
|
+
const member = findMember(db, ref);
|
|
74
|
+
db.update(members).set({ role }).where(eq(members.id, member.id)).run();
|
|
75
|
+
return getMember(db, member.id);
|
|
76
|
+
}
|
|
54
77
|
/**
|
|
55
|
-
* Delete a member
|
|
56
|
-
*
|
|
57
|
-
*
|
|
78
|
+
* Delete a member after every mailbox they own has been reassigned or removed.
|
|
79
|
+
* Their API keys and selected sharing grants are deleted by the transaction and
|
|
80
|
+
* foreign-key cascades.
|
|
58
81
|
*/
|
|
59
82
|
export function removeMember(db, id) {
|
|
60
83
|
const info = getMember(db, id);
|
|
84
|
+
if (info.accountCount > 0) {
|
|
85
|
+
throw new EmailError('invalid_request', `${info.name} still owns ${info.accountCount} mailbox${info.accountCount === 1 ? '' : 'es'}. Reassign or remove ${info.accountCount === 1 ? 'it' : 'them'} first.`);
|
|
86
|
+
}
|
|
61
87
|
db.transaction((tx) => {
|
|
62
88
|
tx.delete(apiKeys).where(eq(apiKeys.memberId, id)).run();
|
|
63
89
|
tx.delete(members).where(eq(members.id, id)).run();
|
|
64
90
|
});
|
|
65
|
-
return { name: info.name,
|
|
91
|
+
return { name: info.name, revokedApiKeys: info.apiKeyCount };
|
|
66
92
|
}
|
|
67
93
|
//# sourceMappingURL=members.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/storage/members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/storage/members.ts"],"names":[],"mappings":"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"}
|