fluxmail 0.16.0 → 0.17.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/dist/auth.d.ts +22 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +29 -3
- package/dist/auth.js.map +1 -1
- package/dist/authorization.d.ts +2 -0
- package/dist/authorization.d.ts.map +1 -1
- package/dist/authorization.js +9 -4
- package/dist/authorization.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +93 -5
- package/dist/cli.js.map +1 -1
- package/dist/cliMail.d.ts.map +1 -1
- package/dist/cliMail.js +21 -1
- package/dist/cliMail.js.map +1 -1
- package/dist/deploymentConfig.d.ts +1 -1
- package/dist/deploymentConfig.d.ts.map +1 -1
- package/dist/deploymentConfig.js +1 -1
- package/dist/deploymentConfig.js.map +1 -1
- package/dist/http/app.d.ts +3 -0
- package/dist/http/app.d.ts.map +1 -1
- package/dist/http/app.js +37 -22
- package/dist/http/app.js.map +1 -1
- package/dist/http/identity.d.ts +20 -0
- package/dist/http/identity.d.ts.map +1 -1
- package/dist/http/identity.js +146 -0
- package/dist/http/identity.js.map +1 -1
- package/dist/http/oauth.d.ts +28 -0
- package/dist/http/oauth.d.ts.map +1 -0
- package/dist/http/oauth.js +552 -0
- package/dist/http/oauth.js.map +1 -0
- package/dist/http/oauthPages.d.ts +36 -0
- package/dist/http/oauthPages.d.ts.map +1 -0
- package/dist/http/oauthPages.js +213 -0
- package/dist/http/oauthPages.js.map +1 -0
- package/dist/http/rest.d.ts.map +1 -1
- package/dist/http/rest.js +13 -7
- package/dist/http/rest.js.map +1 -1
- package/dist/mcp/attachmentContent.d.ts +1 -1
- package/dist/mcp/attachmentContent.d.ts.map +1 -1
- package/dist/mcp/buildServer.d.ts +1 -1
- package/dist/mcp/buildServer.d.ts.map +1 -1
- package/dist/mcp/buildServer.js +77 -46
- package/dist/mcp/buildServer.js.map +1 -1
- package/dist/mcp/clientTelemetry.d.ts +19 -0
- package/dist/mcp/clientTelemetry.d.ts.map +1 -0
- package/dist/mcp/clientTelemetry.js +152 -0
- package/dist/mcp/clientTelemetry.js.map +1 -0
- package/dist/mcp/outputSchemas.d.ts +6 -6
- package/dist/oauth/clientMetadata.d.ts +39 -0
- package/dist/oauth/clientMetadata.d.ts.map +1 -0
- package/dist/oauth/clientMetadata.js +234 -0
- package/dist/oauth/clientMetadata.js.map +1 -0
- package/dist/oauth/redirectUris.d.ts +13 -0
- package/dist/oauth/redirectUris.d.ts.map +1 -0
- package/dist/oauth/redirectUris.js +78 -0
- package/dist/oauth/redirectUris.js.map +1 -0
- package/dist/permissions.d.ts +4 -0
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +10 -0
- package/dist/permissions.js.map +1 -1
- package/dist/service/emailService.d.ts.map +1 -1
- package/dist/service/emailService.js +4 -1
- package/dist/service/emailService.js.map +1 -1
- package/dist/service/publicErrors.d.ts +4 -0
- package/dist/service/publicErrors.d.ts.map +1 -1
- package/dist/service/publicErrors.js +16 -1
- package/dist/service/publicErrors.js.map +1 -1
- package/dist/storage/db.d.ts +824 -2
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +142 -1
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/imapState.d.ts +3 -0
- package/dist/storage/imapState.d.ts.map +1 -1
- package/dist/storage/imapState.js +21 -2
- package/dist/storage/imapState.js.map +1 -1
- package/dist/storage/members.d.ts.map +1 -1
- package/dist/storage/members.js +2 -0
- package/dist/storage/members.js.map +1 -1
- package/dist/storage/oauth.d.ts +178 -0
- package/dist/storage/oauth.d.ts.map +1 -0
- package/dist/storage/oauth.js +556 -0
- package/dist/storage/oauth.js.map +1 -0
- package/package.json +9 -6
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { type FluxmailDb } from './db.js';
|
|
2
|
+
import type { MemberRole } from './members.js';
|
|
3
|
+
import { type McpCapability } from '../permissions.js';
|
|
4
|
+
export declare const OAUTH_ACCESS_TOKEN_TTL_MS: number;
|
|
5
|
+
export declare const OAUTH_REFRESH_TOKEN_TTL_MS: number;
|
|
6
|
+
export declare const OAUTH_GRANT_TTL_MS: number;
|
|
7
|
+
export declare const OAUTH_CODE_TTL_MS: number;
|
|
8
|
+
export declare const OAUTH_REQUEST_TTL_MS: number;
|
|
9
|
+
export declare const OAUTH_MAX_CLIENTS = 1000;
|
|
10
|
+
export declare const OAUTH_MAX_CLIENTS_PER_HOST = 20;
|
|
11
|
+
export declare const OFFLINE_ACCESS_SCOPE = "offline_access";
|
|
12
|
+
export declare const OAUTH_SCOPES: readonly ["mail.read", "mail.drafts", "mail.organize", "mail.trash", "mail.delete", "mail.send", "offline_access"];
|
|
13
|
+
export type OAuthScope = (typeof OAUTH_SCOPES)[number];
|
|
14
|
+
export type OAuthClientKind = 'registered' | 'metadata_document';
|
|
15
|
+
export interface OAuthClient {
|
|
16
|
+
id: string;
|
|
17
|
+
kind: OAuthClientKind;
|
|
18
|
+
name: string;
|
|
19
|
+
redirectUris: string[];
|
|
20
|
+
/** Mail scopes the client may request. */
|
|
21
|
+
scopes: McpCapability[];
|
|
22
|
+
metadataHost: string | null;
|
|
23
|
+
metadataExpiresAt: number | null;
|
|
24
|
+
createdAt: number;
|
|
25
|
+
lastUsedAt: number | null;
|
|
26
|
+
}
|
|
27
|
+
export interface OAuthGrantInfo {
|
|
28
|
+
id: string;
|
|
29
|
+
clientId: string;
|
|
30
|
+
clientName: string;
|
|
31
|
+
clientKind: OAuthClientKind;
|
|
32
|
+
memberId: string;
|
|
33
|
+
scopes: McpCapability[];
|
|
34
|
+
/** Mailbox narrowing. null means every mailbox available to the member. */
|
|
35
|
+
accountIds: string[] | null;
|
|
36
|
+
createdAt: number;
|
|
37
|
+
expiresAt: number;
|
|
38
|
+
lastUsedAt: number | null;
|
|
39
|
+
}
|
|
40
|
+
export interface OAuthAuthorizationRequest {
|
|
41
|
+
id: string;
|
|
42
|
+
clientId: string;
|
|
43
|
+
redirectUri: string;
|
|
44
|
+
state: string | null;
|
|
45
|
+
codeChallenge: string;
|
|
46
|
+
scopes: OAuthScope[];
|
|
47
|
+
memberId: string | null;
|
|
48
|
+
expiresAt: number;
|
|
49
|
+
}
|
|
50
|
+
export interface OAuthTokenSet {
|
|
51
|
+
accessToken: string;
|
|
52
|
+
refreshToken?: string;
|
|
53
|
+
expiresIn: number;
|
|
54
|
+
scopes: OAuthScope[];
|
|
55
|
+
}
|
|
56
|
+
export type OAuthTokenResult = {
|
|
57
|
+
ok: true;
|
|
58
|
+
tokens: OAuthTokenSet;
|
|
59
|
+
} | {
|
|
60
|
+
ok: false;
|
|
61
|
+
error: 'invalid_grant' | 'invalid_scope';
|
|
62
|
+
description: string;
|
|
63
|
+
};
|
|
64
|
+
export interface OAuthAccessTokenAuth {
|
|
65
|
+
grantId: string;
|
|
66
|
+
clientId: string;
|
|
67
|
+
memberId: string;
|
|
68
|
+
role: MemberRole;
|
|
69
|
+
scopes: McpCapability[];
|
|
70
|
+
accountIds: string[] | null;
|
|
71
|
+
}
|
|
72
|
+
export declare function isOAuthScope(value: string): value is OAuthScope;
|
|
73
|
+
/** Keep known scopes in canonical order. */
|
|
74
|
+
export declare function canonicalOAuthScopes(scopes: Iterable<string>): OAuthScope[];
|
|
75
|
+
export declare function mailScopesOf(scopes: Iterable<string>): McpCapability[];
|
|
76
|
+
/** Remove expired protocol state, ended grants, and clients nobody uses. */
|
|
77
|
+
export declare function pruneOAuthState(db: FluxmailDb, now?: number): void;
|
|
78
|
+
/**
|
|
79
|
+
* Count an attempt in a fixed window shared across processes. Returns false
|
|
80
|
+
* once the limit is reached.
|
|
81
|
+
*/
|
|
82
|
+
export declare function reserveOAuthRateLimit(db: FluxmailDb, name: string, limit: number, windowMs: number, now?: number): boolean;
|
|
83
|
+
/** Store a dynamically registered public client. Returns null when the client limit is reached. */
|
|
84
|
+
export declare function registerOAuthClient(db: FluxmailDb, input: {
|
|
85
|
+
name: string;
|
|
86
|
+
redirectUris: readonly string[];
|
|
87
|
+
scopes: readonly McpCapability[];
|
|
88
|
+
}, now?: number): OAuthClient | null;
|
|
89
|
+
export type MetadataClientResult = {
|
|
90
|
+
status: 'stored';
|
|
91
|
+
client: OAuthClient;
|
|
92
|
+
} | {
|
|
93
|
+
status: 'limit';
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Create or refresh a client described by a metadata document. New clients
|
|
97
|
+
* count toward the global and per-host limits.
|
|
98
|
+
*/
|
|
99
|
+
export declare function storeMetadataOAuthClient(db: FluxmailDb, input: {
|
|
100
|
+
id: string;
|
|
101
|
+
host: string;
|
|
102
|
+
name: string;
|
|
103
|
+
redirectUris: readonly string[];
|
|
104
|
+
expiresAt: number;
|
|
105
|
+
}, now?: number): MetadataClientResult;
|
|
106
|
+
export declare function getOAuthClient(db: FluxmailDb, id: string): OAuthClient | null;
|
|
107
|
+
export declare function countOAuthClients(db: FluxmailDb, host?: string): number;
|
|
108
|
+
/** Save a validated authorization request. The CSRF token is returned once. */
|
|
109
|
+
export declare function createOAuthAuthorizationRequest(db: FluxmailDb, input: {
|
|
110
|
+
clientId: string;
|
|
111
|
+
redirectUri: string;
|
|
112
|
+
state?: string;
|
|
113
|
+
codeChallenge: string;
|
|
114
|
+
scopes: readonly OAuthScope[];
|
|
115
|
+
}, now?: number): {
|
|
116
|
+
request: OAuthAuthorizationRequest;
|
|
117
|
+
csrf: string;
|
|
118
|
+
};
|
|
119
|
+
/** Find an unexpired request whose CSRF token matches. */
|
|
120
|
+
export declare function getOAuthAuthorizationRequest(db: FluxmailDb, id: string, csrf: string, now?: number): OAuthAuthorizationRequest | null;
|
|
121
|
+
/** Record the signed-in member on a request and rotate its CSRF token. */
|
|
122
|
+
export declare function signInOAuthAuthorizationRequest(db: FluxmailDb, id: string, memberId: string, now?: number): string | null;
|
|
123
|
+
export declare function deleteOAuthAuthorizationRequest(db: FluxmailDb, id: string): void;
|
|
124
|
+
/**
|
|
125
|
+
* Turn a signed-in request into a grant and a single-use authorization code.
|
|
126
|
+
* The request is deleted in the same transaction, so it cannot be approved twice.
|
|
127
|
+
*/
|
|
128
|
+
export declare function approveOAuthAuthorizationRequest(db: FluxmailDb, input: {
|
|
129
|
+
requestId: string;
|
|
130
|
+
memberId: string;
|
|
131
|
+
scopes: readonly McpCapability[];
|
|
132
|
+
accountIds: readonly string[] | null;
|
|
133
|
+
}, now?: number): {
|
|
134
|
+
code: string;
|
|
135
|
+
grantId: string;
|
|
136
|
+
redirectUri: string;
|
|
137
|
+
state: string | null;
|
|
138
|
+
} | null;
|
|
139
|
+
type Tx = Parameters<Parameters<FluxmailDb['transaction']>[0]>[0];
|
|
140
|
+
/** Exchange an authorization code. Replaying a used code revokes its grant. */
|
|
141
|
+
export declare function exchangeOAuthAuthorizationCode(db: FluxmailDb, input: {
|
|
142
|
+
code: string;
|
|
143
|
+
clientId: string;
|
|
144
|
+
redirectUri: string;
|
|
145
|
+
codeVerifier: string;
|
|
146
|
+
}, now?: number): OAuthTokenResult;
|
|
147
|
+
/**
|
|
148
|
+
* Rotate a refresh token. Reusing a rotated token revokes the grant. A refresh
|
|
149
|
+
* can keep or narrow its scopes but never add one.
|
|
150
|
+
*/
|
|
151
|
+
export declare function refreshOAuthTokens(db: FluxmailDb, input: {
|
|
152
|
+
refreshToken: string;
|
|
153
|
+
clientId: string;
|
|
154
|
+
scopes?: readonly string[];
|
|
155
|
+
}, now?: number): OAuthTokenResult;
|
|
156
|
+
/**
|
|
157
|
+
* Revoke the grant behind a token when the token belongs to the client.
|
|
158
|
+
* Unknown tokens are ignored, as RFC 7009 requires.
|
|
159
|
+
*/
|
|
160
|
+
export declare function revokeOAuthToken(db: FluxmailDb, input: {
|
|
161
|
+
token: string;
|
|
162
|
+
clientId: string;
|
|
163
|
+
}, now?: number): void;
|
|
164
|
+
/** Verify an access token against its live grant and member. */
|
|
165
|
+
export declare function authenticateOAuthAccessToken(db: FluxmailDb, token: string, now?: number): OAuthAccessTokenAuth | null;
|
|
166
|
+
/** Active grants, optionally for one member, newest first. */
|
|
167
|
+
export declare function listOAuthGrants(db: FluxmailDb, memberId?: string, now?: number): OAuthGrantInfo[];
|
|
168
|
+
export declare function getOAuthGrant(db: FluxmailDb, grantId: string, now?: number): OAuthGrantInfo | null;
|
|
169
|
+
/** Revoke one active grant. Pass memberId to limit the change to that member's grants. */
|
|
170
|
+
export declare function revokeOAuthGrant(db: FluxmailDb, grantId: string, memberId?: string, now?: number): boolean;
|
|
171
|
+
/** Revoke every grant a member approved, for suspension and password changes. */
|
|
172
|
+
export declare function revokeMemberOAuthGrants(db: FluxmailDb | Tx, memberId: string, now?: number): number;
|
|
173
|
+
/** Replace the mailbox narrowing of an active grant. Existing tokens use it on their next request. */
|
|
174
|
+
export declare function updateOAuthGrantAccounts(db: FluxmailDb, grantId: string, accountIds: readonly string[] | null, now?: number): boolean;
|
|
175
|
+
/** Count active grants per member for listings. */
|
|
176
|
+
export declare function countActiveOAuthGrants(db: FluxmailDb, memberId: string, now?: number): number;
|
|
177
|
+
export {};
|
|
178
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/storage/oauth.ts"],"names":[],"mappings":"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"}
|