fluxmail 0.3.0 → 0.4.1
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 +10 -8
package/dist/storage/apiKeys.js
CHANGED
|
@@ -1,16 +1,37 @@
|
|
|
1
1
|
import { createHash, randomBytes } from 'node:crypto';
|
|
2
2
|
import { eq } from 'drizzle-orm';
|
|
3
|
+
import { EmailError } from '@fluxmail/core';
|
|
3
4
|
import { apiKeys } from './db.js';
|
|
4
5
|
import { getMember } from './members.js';
|
|
5
|
-
import { deserializePermissionPolicy, FULL_PERMISSION_POLICY, normalizePermissionPolicy, serializeCustomCapabilities, } from '../permissions.js';
|
|
6
|
+
import { deserializePermissionPolicy, FULL_PERMISSION_POLICY, normalizePermissionPolicy, serializeCustomCapabilities, serializeSupplementalCapabilities, hasCapability, } from '../permissions.js';
|
|
7
|
+
function uniqueAccountIds(accountIds) {
|
|
8
|
+
return [...new Set(accountIds)];
|
|
9
|
+
}
|
|
10
|
+
function serializeAccountIds(accountIds) {
|
|
11
|
+
return accountIds === null ? null : JSON.stringify(uniqueAccountIds(accountIds));
|
|
12
|
+
}
|
|
13
|
+
function deserializeAccountIds(value) {
|
|
14
|
+
if (value === null)
|
|
15
|
+
return null;
|
|
16
|
+
const parsed = JSON.parse(value);
|
|
17
|
+
if (!Array.isArray(parsed) || !parsed.every((item) => typeof item === 'string')) {
|
|
18
|
+
throw new Error('API key account scope must be a JSON array of strings.');
|
|
19
|
+
}
|
|
20
|
+
return uniqueAccountIds(parsed);
|
|
21
|
+
}
|
|
6
22
|
function hashKey(key) {
|
|
7
23
|
return createHash('sha256').update(key).digest('hex');
|
|
8
24
|
}
|
|
9
25
|
/** Returns the plaintext key exactly once; only its hash is stored. */
|
|
10
|
-
export function createApiKey(db, name, memberId, permissions = FULL_PERMISSION_POLICY) {
|
|
11
|
-
if (memberId)
|
|
12
|
-
|
|
26
|
+
export function createApiKey(db, name, memberId, permissions = FULL_PERMISSION_POLICY, accountIds = null) {
|
|
27
|
+
if (!memberId) {
|
|
28
|
+
throw new EmailError('invalid_request', 'A member is required when creating an API key.');
|
|
29
|
+
}
|
|
30
|
+
const member = getMember(db, memberId);
|
|
13
31
|
const policy = normalizePermissionPolicy(permissions);
|
|
32
|
+
if (member.role !== 'admin' && policy.capabilities.some((capability) => capability.startsWith('admin.'))) {
|
|
33
|
+
throw new EmailError('permission_denied', 'Administrative capabilities can only be issued to an admin member.');
|
|
34
|
+
}
|
|
14
35
|
const id = `key_${randomBytes(8).toString('hex')}`;
|
|
15
36
|
const key = `fmk_${randomBytes(24).toString('hex')}`;
|
|
16
37
|
const createdAt = Date.now();
|
|
@@ -20,9 +41,11 @@ export function createApiKey(db, name, memberId, permissions = FULL_PERMISSION_P
|
|
|
20
41
|
name,
|
|
21
42
|
keyHash: hashKey(key),
|
|
22
43
|
createdAt,
|
|
23
|
-
memberId
|
|
44
|
+
memberId,
|
|
24
45
|
permissionProfile: policy.profile,
|
|
25
46
|
customCapabilities: serializeCustomCapabilities(policy),
|
|
47
|
+
supplementalCapabilities: serializeSupplementalCapabilities(policy),
|
|
48
|
+
accountIds: serializeAccountIds(accountIds),
|
|
26
49
|
})
|
|
27
50
|
.run();
|
|
28
51
|
return {
|
|
@@ -32,15 +55,17 @@ export function createApiKey(db, name, memberId, permissions = FULL_PERMISSION_P
|
|
|
32
55
|
name,
|
|
33
56
|
createdAt,
|
|
34
57
|
lastUsedAt: null,
|
|
35
|
-
memberId
|
|
58
|
+
memberId,
|
|
36
59
|
permissionProfile: policy.profile,
|
|
37
60
|
capabilities: policy.capabilities,
|
|
61
|
+
supplementalCapabilities: policy.supplementalCapabilities,
|
|
62
|
+
accountIds: accountIds === null ? null : uniqueAccountIds(accountIds),
|
|
38
63
|
},
|
|
39
64
|
};
|
|
40
65
|
}
|
|
41
66
|
/**
|
|
42
|
-
* Verify a key, record its use, and return
|
|
43
|
-
*
|
|
67
|
+
* Verify a key, record its use, and return its live member role and mailbox
|
|
68
|
+
* narrowing. Memberless migrated keys authenticate for management only.
|
|
44
69
|
*/
|
|
45
70
|
export function authenticateApiKey(db, key) {
|
|
46
71
|
const row = db
|
|
@@ -52,13 +77,15 @@ export function authenticateApiKey(db, key) {
|
|
|
52
77
|
return null;
|
|
53
78
|
let permissions;
|
|
54
79
|
try {
|
|
55
|
-
permissions = deserializePermissionPolicy(row.permissionProfile, row.customCapabilities);
|
|
80
|
+
permissions = deserializePermissionPolicy(row.permissionProfile, row.customCapabilities, row.supplementalCapabilities);
|
|
81
|
+
const accountIds = deserializeAccountIds(row.accountIds);
|
|
82
|
+
const member = row.memberId ? getMember(db, row.memberId) : null;
|
|
83
|
+
db.update(apiKeys).set({ lastUsedAt: Date.now() }).where(eq(apiKeys.id, row.id)).run();
|
|
84
|
+
return { keyId: row.id, memberId: row.memberId, role: member?.role ?? null, permissions, accountIds };
|
|
56
85
|
}
|
|
57
86
|
catch {
|
|
58
87
|
return null;
|
|
59
88
|
}
|
|
60
|
-
db.update(apiKeys).set({ lastUsedAt: Date.now() }).where(eq(apiKeys.id, row.id)).run();
|
|
61
|
-
return { memberId: row.memberId, permissions };
|
|
62
89
|
}
|
|
63
90
|
export function verifyApiKey(db, key) {
|
|
64
91
|
return authenticateApiKey(db, key) !== null;
|
|
@@ -69,7 +96,8 @@ export function listApiKeys(db) {
|
|
|
69
96
|
.from(apiKeys)
|
|
70
97
|
.all()
|
|
71
98
|
.map((r) => {
|
|
72
|
-
const permissions = deserializePermissionPolicy(r.permissionProfile, r.customCapabilities);
|
|
99
|
+
const permissions = deserializePermissionPolicy(r.permissionProfile, r.customCapabilities, r.supplementalCapabilities);
|
|
100
|
+
const accountIds = deserializeAccountIds(r.accountIds);
|
|
73
101
|
return {
|
|
74
102
|
id: r.id,
|
|
75
103
|
name: r.name,
|
|
@@ -78,21 +106,85 @@ export function listApiKeys(db) {
|
|
|
78
106
|
memberId: r.memberId,
|
|
79
107
|
permissionProfile: permissions.profile,
|
|
80
108
|
capabilities: permissions.capabilities,
|
|
109
|
+
supplementalCapabilities: permissions.supplementalCapabilities,
|
|
110
|
+
accountIds,
|
|
81
111
|
};
|
|
82
112
|
});
|
|
83
113
|
}
|
|
114
|
+
export function updateApiKeyAccounts(db, id, accountIds) {
|
|
115
|
+
const result = db
|
|
116
|
+
.update(apiKeys)
|
|
117
|
+
.set({ accountIds: serializeAccountIds(accountIds) })
|
|
118
|
+
.where(eq(apiKeys.id, id))
|
|
119
|
+
.run();
|
|
120
|
+
return result.changes > 0;
|
|
121
|
+
}
|
|
84
122
|
export function updateApiKeyPermissions(db, id, permissions) {
|
|
85
123
|
const policy = normalizePermissionPolicy(permissions);
|
|
124
|
+
const existing = db.select().from(apiKeys).where(eq(apiKeys.id, id)).get();
|
|
125
|
+
if (!existing)
|
|
126
|
+
return false;
|
|
127
|
+
const member = existing.memberId ? getMember(db, existing.memberId) : null;
|
|
128
|
+
if (member && member.role !== 'admin' && policy.capabilities.some((capability) => capability.startsWith('admin.'))) {
|
|
129
|
+
throw new EmailError('permission_denied', 'Administrative capabilities can only be issued to an admin member.');
|
|
130
|
+
}
|
|
86
131
|
const result = db
|
|
87
132
|
.update(apiKeys)
|
|
88
133
|
.set({
|
|
89
134
|
permissionProfile: policy.profile,
|
|
90
135
|
customCapabilities: serializeCustomCapabilities(policy),
|
|
136
|
+
supplementalCapabilities: serializeSupplementalCapabilities(policy),
|
|
91
137
|
})
|
|
92
138
|
.where(eq(apiKeys.id, id))
|
|
93
139
|
.run();
|
|
94
140
|
return result.changes > 0;
|
|
95
141
|
}
|
|
142
|
+
/** Replace requested key fields in one write after all validation succeeds. */
|
|
143
|
+
export function updateApiKey(db, id, update) {
|
|
144
|
+
const existing = db.select().from(apiKeys).where(eq(apiKeys.id, id)).get();
|
|
145
|
+
if (!existing)
|
|
146
|
+
return undefined;
|
|
147
|
+
const policy = update.permissions ? normalizePermissionPolicy(update.permissions) : undefined;
|
|
148
|
+
const member = existing.memberId ? getMember(db, existing.memberId) : null;
|
|
149
|
+
if (policy && member && member.role !== 'admin' && policy.capabilities.some((item) => item.startsWith('admin.'))) {
|
|
150
|
+
throw new EmailError('permission_denied', 'Administrative capabilities can only be issued to an admin member.');
|
|
151
|
+
}
|
|
152
|
+
db.update(apiKeys)
|
|
153
|
+
.set({
|
|
154
|
+
...(policy
|
|
155
|
+
? {
|
|
156
|
+
permissionProfile: policy.profile,
|
|
157
|
+
customCapabilities: serializeCustomCapabilities(policy),
|
|
158
|
+
supplementalCapabilities: serializeSupplementalCapabilities(policy),
|
|
159
|
+
}
|
|
160
|
+
: {}),
|
|
161
|
+
...(update.accountIds !== undefined ? { accountIds: serializeAccountIds(update.accountIds) } : {}),
|
|
162
|
+
})
|
|
163
|
+
.where(eq(apiKeys.id, id))
|
|
164
|
+
.run();
|
|
165
|
+
return listApiKeys(db).find((key) => key.id === id);
|
|
166
|
+
}
|
|
167
|
+
export function isUsableRootKey(db, id) {
|
|
168
|
+
const row = db.select().from(apiKeys).where(eq(apiKeys.id, id)).get();
|
|
169
|
+
if (!row)
|
|
170
|
+
return false;
|
|
171
|
+
try {
|
|
172
|
+
const permissions = deserializePermissionPolicy(row.permissionProfile, row.customCapabilities, row.supplementalCapabilities);
|
|
173
|
+
if (!hasCapability(permissions, 'admin.api_keys'))
|
|
174
|
+
return false;
|
|
175
|
+
return row.memberId === null || getMember(db, row.memberId).role === 'admin';
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export function countUsableRootKeys(db, excludingId) {
|
|
182
|
+
return db
|
|
183
|
+
.select({ id: apiKeys.id })
|
|
184
|
+
.from(apiKeys)
|
|
185
|
+
.all()
|
|
186
|
+
.filter((row) => row.id !== excludingId && isUsableRootKey(db, row.id)).length;
|
|
187
|
+
}
|
|
96
188
|
export function revokeApiKey(db, id) {
|
|
97
189
|
const result = db.delete(apiKeys).where(eq(apiKeys.id, id)).run();
|
|
98
190
|
return result.changes > 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiKeys.js","sourceRoot":"","sources":["../../src/storage/apiKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,OAAO,EAAmB,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"apiKeys.js","sourceRoot":"","sources":["../../src/storage/apiKeys.ts"],"names":[],"mappings":"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"}
|