@serve.zone/dcrouter 18.0.1 → 18.1.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/deno.json +1 -1
- package/dist_serve/bundle.js +1522 -1375
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +3 -1
- package/dist_ts/classes.dcrouter.js +32 -4
- package/dist_ts/db/documents/classes.smtp-account.doc.d.ts +31 -0
- package/dist_ts/db/documents/classes.smtp-account.doc.js +176 -0
- package/dist_ts/db/documents/index.d.ts +1 -0
- package/dist_ts/db/documents/index.js +2 -1
- package/dist_ts/email/classes.email-settings.manager.d.ts +7 -0
- package/dist_ts/email/classes.email-settings.manager.js +30 -1
- package/dist_ts/email/classes.smtp-account.manager.d.ts +110 -0
- package/dist_ts/email/classes.smtp-account.manager.js +507 -0
- package/dist_ts/email/classes.workapp-mail-manager.d.ts +23 -4
- package/dist_ts/email/classes.workapp-mail-manager.js +39 -46
- package/dist_ts/email/index.d.ts +2 -0
- package/dist_ts/email/index.js +3 -1
- package/dist_ts/email/smtp-scram.d.ts +13 -0
- package/dist_ts/email/smtp-scram.js +19 -0
- package/dist_ts/opsserver/classes.opsserver.d.ts +1 -0
- package/dist_ts/opsserver/classes.opsserver.js +3 -1
- package/dist_ts/opsserver/handlers/email-settings.handler.js +14 -2
- package/dist_ts/opsserver/handlers/index.d.ts +1 -0
- package/dist_ts/opsserver/handlers/index.js +2 -1
- package/dist_ts/opsserver/handlers/smtp-account.handler.d.ts +20 -0
- package/dist_ts/opsserver/handlers/smtp-account.handler.js +155 -0
- package/dist_ts_interfaces/data/email-settings.d.ts +10 -0
- package/dist_ts_interfaces/data/index.d.ts +1 -0
- package/dist_ts_interfaces/data/index.js +2 -1
- package/dist_ts_interfaces/data/route-management.d.ts +1 -1
- package/dist_ts_interfaces/data/route-management.js +3 -1
- package/dist_ts_interfaces/data/smtp-account.d.ts +50 -0
- package/dist_ts_interfaces/data/smtp-account.js +9 -0
- package/dist_ts_interfaces/requests/index.d.ts +1 -0
- package/dist_ts_interfaces/requests/index.js +2 -1
- package/dist_ts_interfaces/requests/smtp-accounts.d.ts +125 -0
- package/dist_ts_interfaces/requests/smtp-accounts.js +2 -0
- package/dist_ts_migrations/index.js +198 -9
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate/smtp-accounts.d.ts +38 -0
- package/dist_ts_web/appstate/smtp-accounts.js +94 -0
- package/dist_ts_web/appstate.d.ts +1 -0
- package/dist_ts_web/appstate.js +2 -1
- package/dist_ts_web/elements/email/index.d.ts +1 -0
- package/dist_ts_web/elements/email/index.js +2 -1
- package/dist_ts_web/elements/email/ops-view-smtp-accounts.d.ts +25 -0
- package/dist_ts_web/elements/email/ops-view-smtp-accounts.js +598 -0
- package/dist_ts_web/elements/ops-dashboard.js +3 -1
- package/dist_ts_web/router.js +2 -2
- package/package.json +2 -2
- package/readme.md +12 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +35 -3
- package/ts/db/documents/classes.smtp-account.doc.ts +103 -0
- package/ts/db/documents/index.ts +1 -0
- package/ts/email/classes.email-settings.manager.ts +34 -0
- package/ts/email/classes.smtp-account.manager.ts +601 -0
- package/ts/email/classes.workapp-mail-manager.ts +53 -55
- package/ts/email/index.ts +2 -0
- package/ts/email/smtp-scram.ts +24 -0
- package/ts/opsserver/classes.opsserver.ts +2 -0
- package/ts/opsserver/handlers/email-settings.handler.ts +13 -1
- package/ts/opsserver/handlers/index.ts +1 -0
- package/ts/opsserver/handlers/smtp-account.handler.ts +199 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate/smtp-accounts.ts +143 -0
- package/ts_web/appstate.ts +1 -0
- package/ts_web/elements/email/index.ts +1 -0
- package/ts_web/elements/email/ops-view-smtp-accounts.ts +586 -0
- package/ts_web/elements/ops-dashboard.ts +2 -0
- package/ts_web/router.ts +1 -1
|
@@ -21,6 +21,7 @@ export * from './dns-authority.handler.js';
|
|
|
21
21
|
export * from './dns-record.handler.js';
|
|
22
22
|
export * from './acme-config.handler.js';
|
|
23
23
|
export * from './email-domain.handler.js';
|
|
24
|
+
export * from './smtp-account.handler.js';
|
|
24
25
|
export * from './gatewayclient.handler.js';
|
|
25
26
|
export * from './realtime.handler.js';
|
|
26
27
|
export * from './config-event.handler.js';
|
|
@@ -21,9 +21,10 @@ export * from './dns-authority.handler.js';
|
|
|
21
21
|
export * from './dns-record.handler.js';
|
|
22
22
|
export * from './acme-config.handler.js';
|
|
23
23
|
export * from './email-domain.handler.js';
|
|
24
|
+
export * from './smtp-account.handler.js';
|
|
24
25
|
export * from './gatewayclient.handler.js';
|
|
25
26
|
export * from './realtime.handler.js';
|
|
26
27
|
export * from './config-event.handler.js';
|
|
27
28
|
export * from './webpush-control.handler.js';
|
|
28
29
|
export * from './webpush-app.handler.js';
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDBCQUEwQixDQUFDIn0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { OpsServer } from '../classes.opsserver.js';
|
|
3
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* CRUD handler for operator-managed SMTP submission accounts, plus the
|
|
6
|
+
* legacy-route retirement lever.
|
|
7
|
+
*
|
|
8
|
+
* Auth: admin JWT or API token with `smtp-accounts:read` / `smtp-accounts:write`
|
|
9
|
+
* scope; every write additionally requires an admin identity when a JWT is
|
|
10
|
+
* used. Successful admin actions are audit-logged to the ops log.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SmtpAccountHandler {
|
|
13
|
+
private opsServerRef;
|
|
14
|
+
typedrouter: plugins.typedrequest.TypedRouter<interfaces.typedrequestInterfaces.ITypedRequest>;
|
|
15
|
+
constructor(opsServerRef: OpsServer);
|
|
16
|
+
private requireAuth;
|
|
17
|
+
private get manager();
|
|
18
|
+
private failure;
|
|
19
|
+
private registerHandlers;
|
|
20
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
3
|
+
import { requireOpsAuth } from '../helpers/auth.js';
|
|
4
|
+
import { logger } from '../../logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* CRUD handler for operator-managed SMTP submission accounts, plus the
|
|
7
|
+
* legacy-route retirement lever.
|
|
8
|
+
*
|
|
9
|
+
* Auth: admin JWT or API token with `smtp-accounts:read` / `smtp-accounts:write`
|
|
10
|
+
* scope; every write additionally requires an admin identity when a JWT is
|
|
11
|
+
* used. Successful admin actions are audit-logged to the ops log.
|
|
12
|
+
*/
|
|
13
|
+
export class SmtpAccountHandler {
|
|
14
|
+
opsServerRef;
|
|
15
|
+
typedrouter = new plugins.typedrequest.TypedRouter();
|
|
16
|
+
constructor(opsServerRef) {
|
|
17
|
+
this.opsServerRef = opsServerRef;
|
|
18
|
+
this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
|
|
19
|
+
this.registerHandlers();
|
|
20
|
+
}
|
|
21
|
+
async requireAuth(request, requiredScope) {
|
|
22
|
+
const auth = await requireOpsAuth(this.opsServerRef, request, {
|
|
23
|
+
scope: requiredScope,
|
|
24
|
+
requireAdminIdentity: requiredScope.endsWith(':write'),
|
|
25
|
+
});
|
|
26
|
+
return auth.userId;
|
|
27
|
+
}
|
|
28
|
+
get manager() {
|
|
29
|
+
return this.opsServerRef.dcRouterRef.smtpAccountManager;
|
|
30
|
+
}
|
|
31
|
+
failure(errorArg, fallbackMessageArg) {
|
|
32
|
+
return {
|
|
33
|
+
success: false,
|
|
34
|
+
message: errorArg instanceof Error ? errorArg.message : fallbackMessageArg,
|
|
35
|
+
code: 'SMTP_ACCOUNT_ACTION_FAILED',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
registerHandlers() {
|
|
39
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getSmtpAccounts', async (dataArg) => {
|
|
40
|
+
await this.requireAuth(dataArg, 'smtp-accounts:read');
|
|
41
|
+
if (!this.manager?.isStarted())
|
|
42
|
+
return { accounts: [] };
|
|
43
|
+
return { accounts: await this.manager.listAccounts() };
|
|
44
|
+
}));
|
|
45
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createSmtpAccount', async (dataArg) => {
|
|
46
|
+
const userId = await this.requireAuth(dataArg, 'smtp-accounts:write');
|
|
47
|
+
if (!this.manager?.isStarted()) {
|
|
48
|
+
return { success: false, message: 'SmtpAccountManager not initialized', code: 'SMTP_ACCOUNT_MANAGER_UNAVAILABLE' };
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const result = await this.manager.createAccount({
|
|
52
|
+
username: dataArg.username,
|
|
53
|
+
description: dataArg.description,
|
|
54
|
+
senderScope: dataArg.senderScope,
|
|
55
|
+
recipientScope: dataArg.recipientScope,
|
|
56
|
+
mailPolicy: dataArg.mailPolicy,
|
|
57
|
+
createdBy: userId,
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
success: true,
|
|
61
|
+
warnings: result.warnings.length > 0 ? result.warnings : undefined,
|
|
62
|
+
account: result.account,
|
|
63
|
+
password: result.password,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return this.failure(err, 'Failed to create SMTP account');
|
|
68
|
+
}
|
|
69
|
+
}));
|
|
70
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateSmtpAccount', async (dataArg) => {
|
|
71
|
+
const userId = await this.requireAuth(dataArg, 'smtp-accounts:write');
|
|
72
|
+
if (!this.manager?.isStarted()) {
|
|
73
|
+
return { success: false, message: 'SmtpAccountManager not initialized', code: 'SMTP_ACCOUNT_MANAGER_UNAVAILABLE' };
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const result = await this.manager.updateAccount(dataArg.id, {
|
|
77
|
+
description: dataArg.description,
|
|
78
|
+
senderScope: dataArg.senderScope,
|
|
79
|
+
recipientScope: dataArg.recipientScope,
|
|
80
|
+
mailPolicy: dataArg.mailPolicy,
|
|
81
|
+
}, userId);
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
warnings: result.warnings.length > 0 ? result.warnings : undefined,
|
|
85
|
+
account: result.account,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return this.failure(err, 'Failed to update SMTP account');
|
|
90
|
+
}
|
|
91
|
+
}));
|
|
92
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('toggleSmtpAccount', async (dataArg) => {
|
|
93
|
+
const userId = await this.requireAuth(dataArg, 'smtp-accounts:write');
|
|
94
|
+
if (!this.manager?.isStarted()) {
|
|
95
|
+
return { success: false, message: 'SmtpAccountManager not initialized', code: 'SMTP_ACCOUNT_MANAGER_UNAVAILABLE' };
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
const result = await this.manager.toggleAccount(dataArg.id, dataArg.enabled, userId);
|
|
99
|
+
return { success: true, account: result.account };
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return this.failure(err, 'Failed to toggle SMTP account');
|
|
103
|
+
}
|
|
104
|
+
}));
|
|
105
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('rotateSmtpAccountPassword', async (dataArg) => {
|
|
106
|
+
const userId = await this.requireAuth(dataArg, 'smtp-accounts:write');
|
|
107
|
+
if (!this.manager?.isStarted()) {
|
|
108
|
+
return { success: false, message: 'SmtpAccountManager not initialized', code: 'SMTP_ACCOUNT_MANAGER_UNAVAILABLE' };
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const result = await this.manager.rotatePassword(dataArg.id, userId);
|
|
112
|
+
return { success: true, account: result.account, password: result.password };
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
return this.failure(err, 'Failed to rotate SMTP account password');
|
|
116
|
+
}
|
|
117
|
+
}));
|
|
118
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteSmtpAccount', async (dataArg) => {
|
|
119
|
+
const userId = await this.requireAuth(dataArg, 'smtp-accounts:write');
|
|
120
|
+
if (!this.manager?.isStarted()) {
|
|
121
|
+
return { success: false, message: 'SmtpAccountManager not initialized', code: 'SMTP_ACCOUNT_MANAGER_UNAVAILABLE' };
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
await this.manager.deleteAccount(dataArg.id, userId);
|
|
125
|
+
return { success: true };
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return this.failure(err, 'Failed to delete SMTP account');
|
|
129
|
+
}
|
|
130
|
+
}));
|
|
131
|
+
// Internal-relay retirement lever: removes one persisted legacy route by
|
|
132
|
+
// exact name through the standard settings restart path. Guarded in
|
|
133
|
+
// EmailSettingsManager (unknown names and generated managed names fail).
|
|
134
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('removeLegacyEmailRoute', async (dataArg) => {
|
|
135
|
+
const userId = await this.requireAuth(dataArg, 'smtp-accounts:write');
|
|
136
|
+
const routeName = (dataArg.routeName || '').trim();
|
|
137
|
+
logger.log('info', `removeLegacyEmailRoute invoked by ${userId} for route '${routeName}'`);
|
|
138
|
+
if (!routeName) {
|
|
139
|
+
return { success: false, message: 'routeName is required', code: 'SMTP_ACCOUNT_ACTION_FAILED' };
|
|
140
|
+
}
|
|
141
|
+
if (!this.opsServerRef.dcRouterRef.emailSettingsManager) {
|
|
142
|
+
return { success: false, message: 'EmailSettingsManager not initialized', code: 'EMAIL_SETTINGS_MANAGER_UNAVAILABLE' };
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
await this.opsServerRef.dcRouterRef.updateEmailServerSettings({ removeRouteNames: [routeName] }, userId);
|
|
146
|
+
logger.log('info', `Legacy email route '${routeName}' removed from persisted settings by ${userId}`);
|
|
147
|
+
return { success: true, message: `Route '${routeName}' removed` };
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
return this.failure(err, 'Failed to remove legacy email route');
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic210cC1hY2NvdW50LmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvc210cC1hY2NvdW50LmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFHVDtJQUZiLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFNUQsWUFBb0IsWUFBdUI7UUFBdkIsaUJBQVksR0FBWixZQUFZLENBQVc7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FDdkIsT0FBb0UsRUFDcEUsYUFBNkM7UUFFN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUU7WUFDNUQsS0FBSyxFQUFFLGFBQWE7WUFDcEIsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDdkQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFZLE9BQU87UUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztJQUMxRCxDQUFDO0lBRU8sT0FBTyxDQUFDLFFBQWlCLEVBQUUsa0JBQTBCO1FBQzNELE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSztZQUNkLE9BQU8sRUFBRSxRQUFRLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7WUFDMUUsSUFBSSxFQUFFLDRCQUE0QjtTQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FDOUIsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FDbkMsaUJBQWlCLEVBQ2pCLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNoQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLG9CQUFvQixDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFO2dCQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQ0YsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ25DLG1CQUFtQixFQUNuQixLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQztZQUNySCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7b0JBQzlDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtvQkFDMUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO29CQUNoQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7b0JBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztvQkFDdEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO29CQUM5QixTQUFTLEVBQUUsTUFBTTtpQkFDbEIsQ0FBQyxDQUFDO2dCQUNILE9BQU87b0JBQ0wsT0FBTyxFQUFFLElBQUk7b0JBQ2IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUztvQkFDbEUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO29CQUN2QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7aUJBQzFCLENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ25DLG1CQUFtQixFQUNuQixLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQztZQUNySCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtvQkFDMUQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO29CQUNoQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7b0JBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztvQkFDdEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO2lCQUMvQixFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLE9BQU87b0JBQ0wsT0FBTyxFQUFFLElBQUk7b0JBQ2IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUztvQkFDbEUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2lCQUN4QixDQUFDO1lBQ0osQ0FBQztZQUFDLE9BQU8sR0FBWSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsK0JBQStCLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQyxDQUNGLENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUM5QixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUNuQyxtQkFBbUIsRUFDbkIsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUMvQixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLENBQUM7WUFDckgsQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckYsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwRCxDQUFDO1lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ25DLDJCQUEyQixFQUMzQixLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQztZQUNySCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvRSxDQUFDO1lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ25DLG1CQUFtQixFQUNuQixLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQztZQUNySCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMzQixDQUFDO1lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FDRixDQUFDO1FBRUYseUVBQXlFO1FBQ3pFLG9FQUFvRTtRQUNwRSx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ25DLHdCQUF3QixFQUN4QixLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxxQ0FBcUMsTUFBTSxlQUFlLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDM0YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQztZQUNsRyxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxJQUFJLEVBQUUsb0NBQW9DLEVBQUUsQ0FBQztZQUN6SCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQzNELEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUNqQyxNQUFNLENBQ1AsQ0FBQztnQkFDRixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsU0FBUyx3Q0FBd0MsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDckcsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsU0FBUyxXQUFXLEVBQUUsQ0FBQztZQUNwRSxDQUFDO1lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGIn0=
|
|
@@ -34,6 +34,10 @@ export interface IEmailServerSettings {
|
|
|
34
34
|
domainCount: number;
|
|
35
35
|
routeCount: number;
|
|
36
36
|
authUserCount: number;
|
|
37
|
+
/** Operator-managed SMTP submission accounts (hashed credentials, DB-backed). */
|
|
38
|
+
smtpAccountCount?: number;
|
|
39
|
+
/** Present when the email server is running: whether the SMTP listener is accepting connections. */
|
|
40
|
+
smtpListenerActive?: boolean;
|
|
37
41
|
/** Present when outboundMode is 'remoteIngress': whether a mail egress edge is currently available. */
|
|
38
42
|
outboundEgress?: IEmailOutboundEgressStatus;
|
|
39
43
|
/** Present when the email server is running: current state of the Rust mailer bridge. */
|
|
@@ -55,4 +59,10 @@ export type TEmailServerSettingsUpdate = {
|
|
|
55
59
|
portMapping?: Record<number, number> | null;
|
|
56
60
|
receivedEmailsPath?: string | null;
|
|
57
61
|
maxMessageSize?: number | null;
|
|
62
|
+
/**
|
|
63
|
+
* Exact names of persisted legacy routes to remove (the internal-relay
|
|
64
|
+
* retirement lever). Fails loudly on unknown names and refuses generated
|
|
65
|
+
* managed routes ('workapp-mail-*', 'smtp-account-*').
|
|
66
|
+
*/
|
|
67
|
+
removeRouteNames?: string[];
|
|
58
68
|
};
|
|
@@ -12,5 +12,6 @@ export * from './dns-record.js';
|
|
|
12
12
|
export * from './acme-config.js';
|
|
13
13
|
export * from './email-domain.js';
|
|
14
14
|
export * from './email-settings.js';
|
|
15
|
+
export * from './smtp-account.js';
|
|
15
16
|
export * from './security-policy.js';
|
|
16
17
|
export * from './config-events.js';
|
|
@@ -12,6 +12,7 @@ export * from './dns-record.js';
|
|
|
12
12
|
export * from './acme-config.js';
|
|
13
13
|
export * from './email-domain.js';
|
|
14
14
|
export * from './email-settings.js';
|
|
15
|
+
export * from './smtp-account.js';
|
|
15
16
|
export * from './security-policy.js';
|
|
16
17
|
export * from './config-events.js';
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxvQkFBb0IsQ0FBQyJ9
|
|
@@ -12,7 +12,7 @@ export interface IRouteSecurity extends TSmartProxyRouteSecurityBase {
|
|
|
12
12
|
rateLimit?: IRouteRateLimit | null;
|
|
13
13
|
challenge?: IRouteChallengeConfig | null;
|
|
14
14
|
}
|
|
15
|
-
export declare const apiTokenScopes: readonly ["*", "routes:read", "routes:write", "config:read", "stats:read", "logs:read", "config-events:read", "config-events:write", "security:read", "security:write", "emails:read", "emails:write", "certificates:read", "certificates:write", "tokens:read", "tokens:manage", "users:read", "users:manage", "source-profiles:read", "source-profiles:write", "target-profiles:read", "target-profiles:write", "targets:read", "targets:write", "dns-providers:read", "dns-providers:write", "domains:read", "domains:write", "dns-authority:read", "dns-authority:write", "dns-records:read", "dns-records:write", "acme-config:read", "acme-config:write", "email-domains:read", "email-domains:write", "remote-ingress:read", "remote-ingress:write", "vpn:read", "vpn:write", "radius:read", "radius:write", "gateway-clients:read", "gateway-clients:write", "workhosters:read", "workhosters:write"];
|
|
15
|
+
export declare const apiTokenScopes: readonly ["*", "routes:read", "routes:write", "config:read", "stats:read", "logs:read", "config-events:read", "config-events:write", "security:read", "security:write", "emails:read", "emails:write", "certificates:read", "certificates:write", "tokens:read", "tokens:manage", "users:read", "users:manage", "source-profiles:read", "source-profiles:write", "target-profiles:read", "target-profiles:write", "targets:read", "targets:write", "dns-providers:read", "dns-providers:write", "domains:read", "domains:write", "dns-authority:read", "dns-authority:write", "dns-records:read", "dns-records:write", "acme-config:read", "acme-config:write", "email-domains:read", "email-domains:write", "smtp-accounts:read", "smtp-accounts:write", "remote-ingress:read", "remote-ingress:write", "vpn:read", "vpn:write", "radius:read", "radius:write", "gateway-clients:read", "gateway-clients:write", "workhosters:read", "workhosters:write"];
|
|
16
16
|
export type TApiTokenScope = typeof apiTokenScopes[number];
|
|
17
17
|
export type TGatewayClientType = 'onebox' | 'cloudly' | 'custom';
|
|
18
18
|
export interface IApiTokenPolicy {
|
|
@@ -38,6 +38,8 @@ export const apiTokenScopes = [
|
|
|
38
38
|
'acme-config:write',
|
|
39
39
|
'email-domains:read',
|
|
40
40
|
'email-domains:write',
|
|
41
|
+
'smtp-accounts:read',
|
|
42
|
+
'smtp-accounts:write',
|
|
41
43
|
'remote-ingress:read',
|
|
42
44
|
'remote-ingress:write',
|
|
43
45
|
'vpn:read',
|
|
@@ -122,4 +124,4 @@ export function canonicalizeSourceRouteId(routeId) {
|
|
|
122
124
|
const sourceVariantIndex = routeId.indexOf(':source:');
|
|
123
125
|
return sourceVariantIndex === -1 ? routeId : routeId.slice(0, sourceVariantIndex);
|
|
124
126
|
}
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvZGF0YS9yb3V0ZS1tYW5hZ2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSwrRUFBK0U7QUFDL0UsOEJBQThCO0FBQzlCLCtFQUErRTtBQUUvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRztJQUNILGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLFVBQVU7SUFDVixXQUFXO0lBQ1gsYUFBYTtJQUNiLGNBQWM7SUFDZCxzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixtQkFBbUI7Q0FDWCxDQUFDO0FBaUZYLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixLQUFLO0lBQ0wsU0FBUztDQUNELENBQUM7QUFJWCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBb0M7SUFDeEUsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLGFBQWEsRUFBRSxhQUFhO0lBQzVCLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNsQyxHQUFHLEVBQUUsV0FBVztJQUNoQixPQUFPLEVBQUUsVUFBVTtDQUNwQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQXNDO0lBQzVFLGdCQUFnQixFQUFFO1FBQ2hCLG9CQUFvQjtRQUNwQiwwQkFBMEI7UUFDMUIsMkJBQTJCO1FBQzNCLG1CQUFtQjtRQUNuQixxQkFBcUI7S0FDdEI7SUFDRCxNQUFNLEVBQUU7UUFDTixXQUFXO1FBQ1gsWUFBWTtRQUNaLGlCQUFpQjtRQUNqQixnQkFBZ0I7UUFDaEIsUUFBUTtRQUNSLFFBQVE7UUFDUixPQUFPO1FBQ1AsVUFBVTtRQUNWLGNBQWM7S0FDZjtJQUNELGFBQWEsRUFBRSxFQUFFO0lBQ2pCLGdCQUFnQixFQUFFO1FBQ2hCLFlBQVk7UUFDWixTQUFTO1FBQ1QsV0FBVztRQUNYLFFBQVE7UUFDUixVQUFVO1FBQ1YsU0FBUztRQUNULGdCQUFnQjtRQUNoQixZQUFZO1FBQ1osZUFBZTtRQUNmLFlBQVk7UUFDWixZQUFZO1FBQ1osZUFBZTtRQUNmLGFBQWE7UUFDYixZQUFZO1FBQ1osZUFBZTtRQUNmLGNBQWM7UUFDZCxlQUFlO0tBQ2hCO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsWUFBWTtRQUNaLFlBQVk7S0FDYjtJQUNELE9BQU8sRUFBRTtRQUNQLGdCQUFnQjtRQUNoQiwwQkFBMEI7S0FDM0I7Q0FDRixDQUFDO0FBbURGLCtFQUErRTtBQUMvRSx1QkFBdUI7QUFDdkIsK0VBQStFO0FBRS9FLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsNEJBQTRCLENBQVUsQ0FBQztBQWdHekUsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxPQUFlO0lBQ3ZELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2RCxPQUFPLGtCQUFrQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDcEYsQ0FBQyJ9
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Send AS who" scope. `addresses` are literal or local-part-wildcard address
|
|
3
|
+
* patterns (e.g. 'billing@example.com', '*@example.com' is expressed via
|
|
4
|
+
* `domains` instead); `domains` authorize every address of a domain.
|
|
5
|
+
* Both lists empty = unrestricted sender scope.
|
|
6
|
+
*/
|
|
7
|
+
export interface ISmtpAccountSenderScope {
|
|
8
|
+
addresses: string[];
|
|
9
|
+
domains: string[];
|
|
10
|
+
}
|
|
11
|
+
/** 'any' = unrestricted recipients; 'restricted' = only listed addresses/domains. */
|
|
12
|
+
export type TSmtpRecipientScopeMode = 'any' | 'restricted';
|
|
13
|
+
/** "Send TO who" scope. Lists are only enforced when mode is 'restricted'. */
|
|
14
|
+
export interface ISmtpAccountRecipientScope {
|
|
15
|
+
mode: TSmtpRecipientScopeMode;
|
|
16
|
+
addresses: string[];
|
|
17
|
+
domains: string[];
|
|
18
|
+
}
|
|
19
|
+
/** Per-account outbound mail policy applied to generated relay routes. */
|
|
20
|
+
export interface ISmtpAccountMailPolicy {
|
|
21
|
+
/** Sign outbound mail with the sender domain's active managed DKIM key. */
|
|
22
|
+
dkimSign: boolean;
|
|
23
|
+
/** SmartMTA delivery queue (default 'normal'). */
|
|
24
|
+
queue?: 'normal' | 'priority' | 'bulk';
|
|
25
|
+
}
|
|
26
|
+
/** Per-sender-domain outbound readiness as reported by EmailDomainManager. */
|
|
27
|
+
export interface ISmtpAccountDomainReadiness {
|
|
28
|
+
domain: string;
|
|
29
|
+
ready: boolean;
|
|
30
|
+
reason?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Public representation of an SMTP submission account. Never includes the
|
|
34
|
+
* password or the stored SCRAM verifier.
|
|
35
|
+
*/
|
|
36
|
+
export interface ISmtpAccountInfo {
|
|
37
|
+
id: string;
|
|
38
|
+
username: string;
|
|
39
|
+
description: string;
|
|
40
|
+
enabled: boolean;
|
|
41
|
+
senderScope: ISmtpAccountSenderScope;
|
|
42
|
+
recipientScope: ISmtpAccountRecipientScope;
|
|
43
|
+
mailPolicy: ISmtpAccountMailPolicy;
|
|
44
|
+
createdAt: number;
|
|
45
|
+
updatedAt: number;
|
|
46
|
+
createdBy: string;
|
|
47
|
+
lastRotatedAt?: number;
|
|
48
|
+
/** Outbound readiness of each sender-scope domain (managed domains only). */
|
|
49
|
+
domainReadiness?: ISmtpAccountDomainReadiness[];
|
|
50
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// SMTP Account Data Types
|
|
3
|
+
// ============================================================================
|
|
4
|
+
//
|
|
5
|
+
// Operator-managed authenticated SMTP submission accounts. Wire types never
|
|
6
|
+
// carry secrets: passwords are machine-generated, shown exactly once at
|
|
7
|
+
// create/rotate time, and only a hashed SCRAM verifier is persisted.
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic210cC1hY2NvdW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfaW50ZXJmYWNlcy9kYXRhL3NtdHAtYWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrRUFBK0U7QUFDL0UsMEJBQTBCO0FBQzFCLCtFQUErRTtBQUMvRSxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLHdFQUF3RTtBQUN4RSxxRUFBcUUifQ==
|
|
@@ -21,6 +21,7 @@ export * from './dns-records.js';
|
|
|
21
21
|
export * from './acme-config.js';
|
|
22
22
|
export * from './email-domains.js';
|
|
23
23
|
export * from './email-settings.js';
|
|
24
|
+
export * from './smtp-accounts.js';
|
|
24
25
|
export * from './realtime.js';
|
|
25
26
|
export * from './workhoster.js';
|
|
26
27
|
export * from './security-policy.js';
|
|
@@ -21,8 +21,9 @@ export * from './dns-records.js';
|
|
|
21
21
|
export * from './acme-config.js';
|
|
22
22
|
export * from './email-domains.js';
|
|
23
23
|
export * from './email-settings.js';
|
|
24
|
+
export * from './smtp-accounts.js';
|
|
24
25
|
export * from './realtime.js';
|
|
25
26
|
export * from './workhoster.js';
|
|
26
27
|
export * from './security-policy.js';
|
|
27
28
|
export * from './config-events.js';
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL3JlcXVlc3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsb0JBQW9CLENBQUMifQ==
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type * as authInterfaces from '../data/auth.js';
|
|
3
|
+
import type { ISmtpAccountInfo, ISmtpAccountMailPolicy, ISmtpAccountRecipientScope, ISmtpAccountSenderScope } from '../data/smtp-account.js';
|
|
4
|
+
/**
|
|
5
|
+
* Shared mutation result. `warnings` carries non-blocking findings such as
|
|
6
|
+
* sender domains that are not managed email domains (warn-and-allow).
|
|
7
|
+
*/
|
|
8
|
+
export interface ISmtpAccountActionResult {
|
|
9
|
+
success: boolean;
|
|
10
|
+
message?: string;
|
|
11
|
+
code?: string;
|
|
12
|
+
warnings?: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* List all SMTP submission accounts (never includes credentials).
|
|
16
|
+
*/
|
|
17
|
+
export interface IReq_GetSmtpAccounts extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetSmtpAccounts> {
|
|
18
|
+
method: 'getSmtpAccounts';
|
|
19
|
+
request: {
|
|
20
|
+
identity?: authInterfaces.IIdentity;
|
|
21
|
+
apiToken?: string;
|
|
22
|
+
};
|
|
23
|
+
response: {
|
|
24
|
+
accounts: ISmtpAccountInfo[];
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create an SMTP submission account. The password is machine-generated and
|
|
29
|
+
* returned exactly once in this response; only a SCRAM verifier is persisted.
|
|
30
|
+
*/
|
|
31
|
+
export interface IReq_CreateSmtpAccount extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_CreateSmtpAccount> {
|
|
32
|
+
method: 'createSmtpAccount';
|
|
33
|
+
request: {
|
|
34
|
+
identity?: authInterfaces.IIdentity;
|
|
35
|
+
apiToken?: string;
|
|
36
|
+
username: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
senderScope?: ISmtpAccountSenderScope;
|
|
39
|
+
recipientScope?: ISmtpAccountRecipientScope;
|
|
40
|
+
mailPolicy?: ISmtpAccountMailPolicy;
|
|
41
|
+
};
|
|
42
|
+
response: ISmtpAccountActionResult & {
|
|
43
|
+
account?: ISmtpAccountInfo;
|
|
44
|
+
/** Shown once; never retrievable again. */
|
|
45
|
+
password?: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Update an SMTP account's description, scopes, or mail policy.
|
|
50
|
+
*/
|
|
51
|
+
export interface IReq_UpdateSmtpAccount extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_UpdateSmtpAccount> {
|
|
52
|
+
method: 'updateSmtpAccount';
|
|
53
|
+
request: {
|
|
54
|
+
identity?: authInterfaces.IIdentity;
|
|
55
|
+
apiToken?: string;
|
|
56
|
+
id: string;
|
|
57
|
+
description?: string;
|
|
58
|
+
senderScope?: ISmtpAccountSenderScope;
|
|
59
|
+
recipientScope?: ISmtpAccountRecipientScope;
|
|
60
|
+
mailPolicy?: ISmtpAccountMailPolicy;
|
|
61
|
+
};
|
|
62
|
+
response: ISmtpAccountActionResult & {
|
|
63
|
+
account?: ISmtpAccountInfo;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Enable or disable an SMTP account. Disabled accounts always fail
|
|
68
|
+
* authentication (and still shadow same-named legacy static users).
|
|
69
|
+
*/
|
|
70
|
+
export interface IReq_ToggleSmtpAccount extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_ToggleSmtpAccount> {
|
|
71
|
+
method: 'toggleSmtpAccount';
|
|
72
|
+
request: {
|
|
73
|
+
identity?: authInterfaces.IIdentity;
|
|
74
|
+
apiToken?: string;
|
|
75
|
+
id: string;
|
|
76
|
+
enabled: boolean;
|
|
77
|
+
};
|
|
78
|
+
response: ISmtpAccountActionResult & {
|
|
79
|
+
account?: ISmtpAccountInfo;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Rotate an SMTP account's password. The new password is returned exactly
|
|
84
|
+
* once; the previous credential stops working immediately.
|
|
85
|
+
*/
|
|
86
|
+
export interface IReq_RotateSmtpAccountPassword extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_RotateSmtpAccountPassword> {
|
|
87
|
+
method: 'rotateSmtpAccountPassword';
|
|
88
|
+
request: {
|
|
89
|
+
identity?: authInterfaces.IIdentity;
|
|
90
|
+
apiToken?: string;
|
|
91
|
+
id: string;
|
|
92
|
+
};
|
|
93
|
+
response: ISmtpAccountActionResult & {
|
|
94
|
+
account?: ISmtpAccountInfo;
|
|
95
|
+
/** Shown once; never retrievable again. */
|
|
96
|
+
password?: string;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Delete an SMTP account.
|
|
101
|
+
*/
|
|
102
|
+
export interface IReq_DeleteSmtpAccount extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_DeleteSmtpAccount> {
|
|
103
|
+
method: 'deleteSmtpAccount';
|
|
104
|
+
request: {
|
|
105
|
+
identity?: authInterfaces.IIdentity;
|
|
106
|
+
apiToken?: string;
|
|
107
|
+
id: string;
|
|
108
|
+
};
|
|
109
|
+
response: ISmtpAccountActionResult;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Remove a named legacy route from the persisted email server settings
|
|
113
|
+
* (EmailServerSettingsDoc.emailConfig.routes) — the retirement lever for
|
|
114
|
+
* legacy internal-relay routes once scoped SMTP accounts replace them.
|
|
115
|
+
* Applies through the standard email settings restart path.
|
|
116
|
+
*/
|
|
117
|
+
export interface IReq_RemoveLegacyEmailRoute extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_RemoveLegacyEmailRoute> {
|
|
118
|
+
method: 'removeLegacyEmailRoute';
|
|
119
|
+
request: {
|
|
120
|
+
identity?: authInterfaces.IIdentity;
|
|
121
|
+
apiToken?: string;
|
|
122
|
+
routeName: string;
|
|
123
|
+
};
|
|
124
|
+
response: ISmtpAccountActionResult;
|
|
125
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic210cC1hY2NvdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvcmVxdWVzdHMvc210cC1hY2NvdW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQyJ9
|