@push.rocks/smartmta 5.1.3 → 5.2.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.
Files changed (98) hide show
  1. package/changelog.md +15 -0
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/index.d.ts +3 -0
  5. package/dist_ts/index.js +4 -0
  6. package/dist_ts/logger.d.ts +17 -0
  7. package/dist_ts/logger.js +76 -0
  8. package/dist_ts/mail/core/classes.bouncemanager.d.ts +185 -0
  9. package/dist_ts/mail/core/classes.bouncemanager.js +569 -0
  10. package/dist_ts/mail/core/classes.email.d.ts +291 -0
  11. package/dist_ts/mail/core/classes.email.js +802 -0
  12. package/dist_ts/mail/core/classes.emailvalidator.d.ts +61 -0
  13. package/dist_ts/mail/core/classes.emailvalidator.js +184 -0
  14. package/dist_ts/mail/core/classes.templatemanager.d.ts +95 -0
  15. package/dist_ts/mail/core/classes.templatemanager.js +240 -0
  16. package/dist_ts/mail/core/index.d.ts +4 -0
  17. package/dist_ts/mail/core/index.js +6 -0
  18. package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +163 -0
  19. package/dist_ts/mail/delivery/classes.delivery.queue.js +488 -0
  20. package/dist_ts/mail/delivery/classes.delivery.system.d.ts +160 -0
  21. package/dist_ts/mail/delivery/classes.delivery.system.js +630 -0
  22. package/dist_ts/mail/delivery/classes.unified.rate.limiter.d.ts +200 -0
  23. package/dist_ts/mail/delivery/classes.unified.rate.limiter.js +820 -0
  24. package/dist_ts/mail/delivery/index.d.ts +4 -0
  25. package/dist_ts/mail/delivery/index.js +6 -0
  26. package/dist_ts/mail/delivery/interfaces.d.ts +140 -0
  27. package/dist_ts/mail/delivery/interfaces.js +17 -0
  28. package/dist_ts/mail/index.d.ts +7 -0
  29. package/dist_ts/mail/index.js +12 -0
  30. package/dist_ts/mail/routing/classes.dkim.manager.d.ts +25 -0
  31. package/dist_ts/mail/routing/classes.dkim.manager.js +127 -0
  32. package/dist_ts/mail/routing/classes.dns.manager.d.ts +79 -0
  33. package/dist_ts/mail/routing/classes.dns.manager.js +415 -0
  34. package/dist_ts/mail/routing/classes.domain.registry.d.ts +54 -0
  35. package/dist_ts/mail/routing/classes.domain.registry.js +119 -0
  36. package/dist_ts/mail/routing/classes.email.action.executor.d.ts +33 -0
  37. package/dist_ts/mail/routing/classes.email.action.executor.js +137 -0
  38. package/dist_ts/mail/routing/classes.email.router.d.ts +171 -0
  39. package/dist_ts/mail/routing/classes.email.router.js +494 -0
  40. package/dist_ts/mail/routing/classes.unified.email.server.d.ts +241 -0
  41. package/dist_ts/mail/routing/classes.unified.email.server.js +935 -0
  42. package/dist_ts/mail/routing/index.d.ts +7 -0
  43. package/dist_ts/mail/routing/index.js +9 -0
  44. package/dist_ts/mail/routing/interfaces.d.ts +187 -0
  45. package/dist_ts/mail/routing/interfaces.js +2 -0
  46. package/dist_ts/mail/security/classes.dkimcreator.d.ts +72 -0
  47. package/dist_ts/mail/security/classes.dkimcreator.js +360 -0
  48. package/dist_ts/mail/security/classes.spfverifier.d.ts +62 -0
  49. package/dist_ts/mail/security/classes.spfverifier.js +87 -0
  50. package/dist_ts/mail/security/index.d.ts +2 -0
  51. package/dist_ts/mail/security/index.js +4 -0
  52. package/dist_ts/paths.d.ts +14 -0
  53. package/dist_ts/paths.js +39 -0
  54. package/dist_ts/plugins.d.ts +24 -0
  55. package/dist_ts/plugins.js +28 -0
  56. package/dist_ts/security/classes.contentscanner.d.ts +130 -0
  57. package/dist_ts/security/classes.contentscanner.js +338 -0
  58. package/dist_ts/security/classes.ipreputationchecker.d.ts +73 -0
  59. package/dist_ts/security/classes.ipreputationchecker.js +263 -0
  60. package/dist_ts/security/classes.rustsecuritybridge.d.ts +403 -0
  61. package/dist_ts/security/classes.rustsecuritybridge.js +502 -0
  62. package/dist_ts/security/classes.securitylogger.d.ts +140 -0
  63. package/dist_ts/security/classes.securitylogger.js +235 -0
  64. package/dist_ts/security/index.d.ts +4 -0
  65. package/dist_ts/security/index.js +5 -0
  66. package/package.json +6 -1
  67. package/ts/00_commitinfo_data.ts +8 -0
  68. package/ts/index.ts +3 -0
  69. package/ts/logger.ts +91 -0
  70. package/ts/mail/core/classes.bouncemanager.ts +731 -0
  71. package/ts/mail/core/classes.email.ts +942 -0
  72. package/ts/mail/core/classes.emailvalidator.ts +239 -0
  73. package/ts/mail/core/classes.templatemanager.ts +320 -0
  74. package/ts/mail/core/index.ts +5 -0
  75. package/ts/mail/delivery/classes.delivery.queue.ts +645 -0
  76. package/ts/mail/delivery/classes.delivery.system.ts +816 -0
  77. package/ts/mail/delivery/classes.unified.rate.limiter.ts +1053 -0
  78. package/ts/mail/delivery/index.ts +5 -0
  79. package/ts/mail/delivery/interfaces.ts +167 -0
  80. package/ts/mail/index.ts +17 -0
  81. package/ts/mail/routing/classes.dkim.manager.ts +157 -0
  82. package/ts/mail/routing/classes.dns.manager.ts +573 -0
  83. package/ts/mail/routing/classes.domain.registry.ts +139 -0
  84. package/ts/mail/routing/classes.email.action.executor.ts +175 -0
  85. package/ts/mail/routing/classes.email.router.ts +575 -0
  86. package/ts/mail/routing/classes.unified.email.server.ts +1207 -0
  87. package/ts/mail/routing/index.ts +9 -0
  88. package/ts/mail/routing/interfaces.ts +202 -0
  89. package/ts/mail/security/classes.dkimcreator.ts +447 -0
  90. package/ts/mail/security/classes.spfverifier.ts +126 -0
  91. package/ts/mail/security/index.ts +3 -0
  92. package/ts/paths.ts +48 -0
  93. package/ts/plugins.ts +53 -0
  94. package/ts/security/classes.contentscanner.ts +400 -0
  95. package/ts/security/classes.ipreputationchecker.ts +315 -0
  96. package/ts/security/classes.rustsecuritybridge.ts +964 -0
  97. package/ts/security/classes.securitylogger.ts +299 -0
  98. package/ts/security/index.ts +40 -0
@@ -0,0 +1,4 @@
1
+ export * from './classes.delivery.queue.js';
2
+ export * from './classes.delivery.system.js';
3
+ export { DeliveryStatus } from './classes.delivery.system.js';
4
+ export * from './classes.unified.rate.limiter.js';
@@ -0,0 +1,6 @@
1
+ // Email delivery components
2
+ export * from './classes.delivery.queue.js';
3
+ export * from './classes.delivery.system.js';
4
+ export { DeliveryStatus } from './classes.delivery.system.js';
5
+ export * from './classes.unified.rate.limiter.js';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tYWlsL2RlbGl2ZXJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELGNBQWMsbUNBQW1DLENBQUMifQ==
@@ -0,0 +1,140 @@
1
+ /**
2
+ * SMTP and email delivery interface definitions
3
+ */
4
+ /**
5
+ * SMTP session state enumeration
6
+ */
7
+ export declare enum SmtpState {
8
+ GREETING = "GREETING",
9
+ AFTER_EHLO = "AFTER_EHLO",
10
+ MAIL_FROM = "MAIL_FROM",
11
+ RCPT_TO = "RCPT_TO",
12
+ DATA = "DATA",
13
+ DATA_RECEIVING = "DATA_RECEIVING",
14
+ FINISHED = "FINISHED"
15
+ }
16
+ /**
17
+ * Email processing mode type
18
+ */
19
+ export type EmailProcessingMode = 'forward' | 'mta' | 'process';
20
+ /**
21
+ * Envelope recipient information
22
+ */
23
+ export interface IEnvelopeRecipient {
24
+ /**
25
+ * Email address of the recipient
26
+ */
27
+ address: string;
28
+ /**
29
+ * Additional SMTP command arguments
30
+ */
31
+ args: Record<string, string>;
32
+ }
33
+ /**
34
+ * SMTP session envelope information
35
+ */
36
+ export interface ISmtpEnvelope {
37
+ /**
38
+ * Envelope sender (MAIL FROM) information
39
+ */
40
+ mailFrom: {
41
+ /**
42
+ * Email address of the sender
43
+ */
44
+ address: string;
45
+ /**
46
+ * Additional SMTP command arguments
47
+ */
48
+ args: Record<string, string>;
49
+ };
50
+ /**
51
+ * Envelope recipients (RCPT TO) information
52
+ */
53
+ rcptTo: IEnvelopeRecipient[];
54
+ }
55
+ /**
56
+ * SMTP Session interface - represents an active SMTP connection
57
+ */
58
+ export interface ISmtpSession {
59
+ /**
60
+ * Unique session identifier
61
+ */
62
+ id: string;
63
+ /**
64
+ * Current session state in the SMTP conversation
65
+ */
66
+ state: SmtpState;
67
+ /**
68
+ * Hostname provided by the client in EHLO/HELO command
69
+ */
70
+ clientHostname: string;
71
+ /**
72
+ * MAIL FROM email address (legacy format)
73
+ */
74
+ mailFrom: string;
75
+ /**
76
+ * RCPT TO email addresses (legacy format)
77
+ */
78
+ rcptTo: string[];
79
+ /**
80
+ * Raw email data being received
81
+ */
82
+ emailData: string;
83
+ /**
84
+ * Chunks of email data for more efficient buffer management
85
+ */
86
+ emailDataChunks?: string[];
87
+ /**
88
+ * Whether the connection is using TLS
89
+ */
90
+ useTLS: boolean;
91
+ /**
92
+ * Whether the connection has ended
93
+ */
94
+ connectionEnded: boolean;
95
+ /**
96
+ * Remote IP address of the client
97
+ */
98
+ remoteAddress: string;
99
+ /**
100
+ * Whether the connection is secure (TLS)
101
+ */
102
+ secure: boolean;
103
+ /**
104
+ * Whether the client has been authenticated
105
+ */
106
+ authenticated: boolean;
107
+ /**
108
+ * SMTP envelope information (structured format)
109
+ */
110
+ envelope: ISmtpEnvelope;
111
+ /**
112
+ * Email processing mode to use for this session
113
+ */
114
+ processingMode?: EmailProcessingMode;
115
+ /**
116
+ * Timestamp of last activity for session timeout tracking
117
+ */
118
+ lastActivity?: number;
119
+ /**
120
+ * Timeout ID for DATA command timeout
121
+ */
122
+ dataTimeoutId?: NodeJS.Timeout;
123
+ }
124
+ /**
125
+ * SMTP authentication data
126
+ */
127
+ export interface ISmtpAuth {
128
+ /**
129
+ * Authentication method used
130
+ */
131
+ method: 'PLAIN' | 'LOGIN' | 'OAUTH2' | string;
132
+ /**
133
+ * Username for authentication
134
+ */
135
+ username: string;
136
+ /**
137
+ * Password or token for authentication
138
+ */
139
+ password: string;
140
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * SMTP and email delivery interface definitions
3
+ */
4
+ /**
5
+ * SMTP session state enumeration
6
+ */
7
+ export var SmtpState;
8
+ (function (SmtpState) {
9
+ SmtpState["GREETING"] = "GREETING";
10
+ SmtpState["AFTER_EHLO"] = "AFTER_EHLO";
11
+ SmtpState["MAIL_FROM"] = "MAIL_FROM";
12
+ SmtpState["RCPT_TO"] = "RCPT_TO";
13
+ SmtpState["DATA"] = "DATA";
14
+ SmtpState["DATA_RECEIVING"] = "DATA_RECEIVING";
15
+ SmtpState["FINISHED"] = "FINISHED";
16
+ })(SmtpState || (SmtpState = {}));
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL21haWwvZGVsaXZlcnkvaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVIOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksU0FRWDtBQVJELFdBQVksU0FBUztJQUNuQixrQ0FBcUIsQ0FBQTtJQUNyQixzQ0FBeUIsQ0FBQTtJQUN6QixvQ0FBdUIsQ0FBQTtJQUN2QixnQ0FBbUIsQ0FBQTtJQUNuQiwwQkFBYSxDQUFBO0lBQ2IsOENBQWlDLENBQUE7SUFDakMsa0NBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVJXLFNBQVMsS0FBVCxTQUFTLFFBUXBCIn0=
@@ -0,0 +1,7 @@
1
+ export * from './routing/index.js';
2
+ export * from './security/index.js';
3
+ import * as Core from './core/index.js';
4
+ import * as Delivery from './delivery/index.js';
5
+ export { Core, Delivery };
6
+ import { Email } from './core/classes.email.js';
7
+ export { Email, };
@@ -0,0 +1,12 @@
1
+ // Export all mail modules for simplified imports
2
+ export * from './routing/index.js';
3
+ export * from './security/index.js';
4
+ // Make the core and delivery modules accessible
5
+ import * as Core from './core/index.js';
6
+ import * as Delivery from './delivery/index.js';
7
+ export { Core, Delivery };
8
+ // For direct imports
9
+ import { Email } from './core/classes.email.js';
10
+ // Re-export commonly used classes
11
+ export { Email, };
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tYWlsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlEQUFpRDtBQUNqRCxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFFcEMsZ0RBQWdEO0FBQ2hELE9BQU8sS0FBSyxJQUFJLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBRTFCLHFCQUFxQjtBQUNyQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFDTCxLQUFLLEdBQ04sQ0FBQyJ9
@@ -0,0 +1,25 @@
1
+ import { DKIMCreator } from '../security/classes.dkimcreator.js';
2
+ import { DomainRegistry } from './classes.domain.registry.js';
3
+ import { RustSecurityBridge } from '../../security/classes.rustsecuritybridge.js';
4
+ import { Email } from '../core/classes.email.js';
5
+ /** External DcRouter interface shape used by DkimManager */
6
+ interface DcRouter {
7
+ storageManager: any;
8
+ dnsServer?: any;
9
+ }
10
+ /**
11
+ * Manages DKIM key setup, rotation, and signing for all configured domains
12
+ */
13
+ export declare class DkimManager {
14
+ private dkimCreator;
15
+ private domainRegistry;
16
+ private dcRouter;
17
+ private rustBridge;
18
+ private dkimKeys;
19
+ constructor(dkimCreator: DKIMCreator, domainRegistry: DomainRegistry, dcRouter: DcRouter, rustBridge: RustSecurityBridge);
20
+ setupDkimForDomains(): Promise<void>;
21
+ checkAndRotateDkimKeys(): Promise<void>;
22
+ handleDkimSigning(email: Email, domain: string, selector: string): Promise<void>;
23
+ getDkimKey(domain: string): string | undefined;
24
+ }
25
+ export {};
@@ -0,0 +1,127 @@
1
+ import { logger } from '../../logger.js';
2
+ import { DKIMCreator } from '../security/classes.dkimcreator.js';
3
+ import { DomainRegistry } from './classes.domain.registry.js';
4
+ import { RustSecurityBridge } from '../../security/classes.rustsecuritybridge.js';
5
+ import { Email } from '../core/classes.email.js';
6
+ /**
7
+ * Manages DKIM key setup, rotation, and signing for all configured domains
8
+ */
9
+ export class DkimManager {
10
+ dkimCreator;
11
+ domainRegistry;
12
+ dcRouter;
13
+ rustBridge;
14
+ dkimKeys = new Map();
15
+ constructor(dkimCreator, domainRegistry, dcRouter, rustBridge) {
16
+ this.dkimCreator = dkimCreator;
17
+ this.domainRegistry = domainRegistry;
18
+ this.dcRouter = dcRouter;
19
+ this.rustBridge = rustBridge;
20
+ }
21
+ async setupDkimForDomains() {
22
+ const domainConfigs = this.domainRegistry.getAllConfigs();
23
+ if (domainConfigs.length === 0) {
24
+ logger.log('warn', 'No domains configured for DKIM');
25
+ return;
26
+ }
27
+ for (const domainConfig of domainConfigs) {
28
+ const domain = domainConfig.domain;
29
+ const selector = domainConfig.dkim?.selector || 'default';
30
+ try {
31
+ let keyPair;
32
+ try {
33
+ keyPair = await this.dkimCreator.readDKIMKeys(domain);
34
+ logger.log('info', `Using existing DKIM keys for domain: ${domain}`);
35
+ }
36
+ catch (error) {
37
+ keyPair = await this.dkimCreator.createDKIMKeys();
38
+ await this.dkimCreator.createAndStoreDKIMKeys(domain);
39
+ logger.log('info', `Generated new DKIM keys for domain: ${domain}`);
40
+ }
41
+ this.dkimKeys.set(domain, keyPair.privateKey);
42
+ logger.log('info', `DKIM keys loaded for domain: ${domain} with selector: ${selector}`);
43
+ }
44
+ catch (error) {
45
+ logger.log('error', `Failed to set up DKIM for domain ${domain}: ${error.message}`);
46
+ }
47
+ }
48
+ }
49
+ async checkAndRotateDkimKeys() {
50
+ const domainConfigs = this.domainRegistry.getAllConfigs();
51
+ for (const domainConfig of domainConfigs) {
52
+ const domain = domainConfig.domain;
53
+ const selector = domainConfig.dkim?.selector || 'default';
54
+ const rotateKeys = domainConfig.dkim?.rotateKeys || false;
55
+ const rotationInterval = domainConfig.dkim?.rotationInterval || 90;
56
+ const keySize = domainConfig.dkim?.keySize || 2048;
57
+ if (!rotateKeys) {
58
+ logger.log('debug', `DKIM key rotation disabled for ${domain}`);
59
+ continue;
60
+ }
61
+ try {
62
+ const needsRotation = await this.dkimCreator.needsRotation(domain, selector, rotationInterval);
63
+ if (needsRotation) {
64
+ logger.log('info', `DKIM keys need rotation for ${domain} (selector: ${selector})`);
65
+ const newSelector = await this.dkimCreator.rotateDkimKeys(domain, selector, keySize);
66
+ domainConfig.dkim = {
67
+ ...domainConfig.dkim,
68
+ selector: newSelector
69
+ };
70
+ if (domainConfig.dnsMode === 'internal-dns' && this.dcRouter.dnsServer) {
71
+ const keyPair = await this.dkimCreator.readDKIMKeysForSelector(domain, newSelector);
72
+ const publicKeyBase64 = keyPair.publicKey
73
+ .replace(/-----BEGIN PUBLIC KEY-----/g, '')
74
+ .replace(/-----END PUBLIC KEY-----/g, '')
75
+ .replace(/\s/g, '');
76
+ const ttl = domainConfig.dns?.internal?.ttl || 3600;
77
+ this.dcRouter.dnsServer.registerHandler(`${newSelector}._domainkey.${domain}`, ['TXT'], () => ({
78
+ name: `${newSelector}._domainkey.${domain}`,
79
+ type: 'TXT',
80
+ class: 'IN',
81
+ ttl: ttl,
82
+ data: `v=DKIM1; k=rsa; p=${publicKeyBase64}`
83
+ }));
84
+ logger.log('info', `DKIM DNS handler registered for new selector: ${newSelector}._domainkey.${domain}`);
85
+ await this.dcRouter.storageManager.set(`/email/dkim/${domain}/public.key`, keyPair.publicKey);
86
+ }
87
+ this.dkimCreator.cleanupOldKeys(domain, 30).catch(error => {
88
+ logger.log('warn', `Failed to cleanup old DKIM keys for ${domain}: ${error.message}`);
89
+ });
90
+ }
91
+ else {
92
+ logger.log('debug', `DKIM keys for ${domain} are up to date`);
93
+ }
94
+ }
95
+ catch (error) {
96
+ logger.log('error', `Failed to check/rotate DKIM keys for ${domain}: ${error.message}`);
97
+ }
98
+ }
99
+ }
100
+ async handleDkimSigning(email, domain, selector) {
101
+ try {
102
+ await this.dkimCreator.handleDKIMKeysForDomain(domain);
103
+ const { privateKey } = await this.dkimCreator.readDKIMKeys(domain);
104
+ const rawEmail = email.toRFC822String();
105
+ // Detect key type from PEM header
106
+ const keyType = privateKey.includes('ED25519') ? 'ed25519' : 'rsa';
107
+ const signResult = await this.rustBridge.signDkim({
108
+ rawMessage: rawEmail,
109
+ domain,
110
+ selector,
111
+ privateKey,
112
+ keyType,
113
+ });
114
+ if (signResult.header) {
115
+ email.addHeader('DKIM-Signature', signResult.header);
116
+ logger.log('info', `Successfully added DKIM signature for ${domain}`);
117
+ }
118
+ }
119
+ catch (error) {
120
+ logger.log('error', `Failed to sign email with DKIM: ${error.message}`);
121
+ }
122
+ }
123
+ getDkimKey(domain) {
124
+ return this.dkimKeys.get(domain);
125
+ }
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ka2ltLm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tYWlsL3JvdXRpbmcvY2xhc3Nlcy5ka2ltLm1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbEYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBUWpEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFJWjtJQUNBO0lBQ0E7SUFDQTtJQU5GLFFBQVEsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVsRCxZQUNVLFdBQXdCLEVBQ3hCLGNBQThCLEVBQzlCLFFBQWtCLEVBQ2xCLFVBQThCO1FBSDlCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQW9CO0lBQ3JDLENBQUM7SUFFSixLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFMUQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7WUFDckQsT0FBTztRQUNULENBQUM7UUFFRCxLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENB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
@@ -0,0 +1,79 @@
1
+ import type { IEmailDomainConfig } from './interfaces.js';
2
+ /** External DcRouter interface shape used by DnsManager */
3
+ interface IDcRouterLike {
4
+ storageManager: IStorageManagerLike;
5
+ dnsServer?: any;
6
+ options?: {
7
+ dnsNsDomains?: string[];
8
+ dnsScopes?: string[];
9
+ };
10
+ }
11
+ /** External StorageManager interface shape used by DnsManager */
12
+ interface IStorageManagerLike {
13
+ get(key: string): Promise<string | null>;
14
+ set(key: string, value: string): Promise<void>;
15
+ }
16
+ /**
17
+ * DNS validation result
18
+ */
19
+ export interface IDnsValidationResult {
20
+ valid: boolean;
21
+ errors: string[];
22
+ warnings: string[];
23
+ requiredChanges: string[];
24
+ }
25
+ /**
26
+ * Manages DNS configuration for email domains
27
+ * Handles both validation and creation of DNS records
28
+ */
29
+ export declare class DnsManager {
30
+ private dcRouter;
31
+ private storageManager;
32
+ constructor(dcRouter: IDcRouterLike);
33
+ /**
34
+ * Validate all domain configurations
35
+ */
36
+ validateAllDomains(domainConfigs: IEmailDomainConfig[]): Promise<Map<string, IDnsValidationResult>>;
37
+ /**
38
+ * Validate a single domain configuration
39
+ */
40
+ validateDomain(config: IEmailDomainConfig): Promise<IDnsValidationResult>;
41
+ /**
42
+ * Validate forward mode configuration
43
+ */
44
+ private validateForwardMode;
45
+ /**
46
+ * Validate internal DNS mode configuration
47
+ */
48
+ private validateInternalDnsMode;
49
+ /**
50
+ * Validate external DNS mode configuration
51
+ */
52
+ private validateExternalDnsMode;
53
+ /**
54
+ * Check DNS records for a domain
55
+ */
56
+ private checkDnsRecords;
57
+ /**
58
+ * Resolve NS records for a domain
59
+ */
60
+ private resolveNs;
61
+ /**
62
+ * Get base domain from email domain (e.g., mail.example.com -> example.com)
63
+ */
64
+ private getBaseDomain;
65
+ /**
66
+ * Ensure all DNS records are created for configured domains
67
+ * This is the main entry point for DNS record management
68
+ */
69
+ ensureDnsRecords(domainConfigs: IEmailDomainConfig[], dkimCreator?: any): Promise<void>;
70
+ /**
71
+ * Create DNS records for internal-dns mode domains
72
+ */
73
+ private createInternalDnsRecords;
74
+ /**
75
+ * Create DKIM DNS records for all domains
76
+ */
77
+ private createDkimRecords;
78
+ }
79
+ export {};