119 lines
6.8 KiB
JavaScript
119 lines
6.8 KiB
JavaScript
|
|
import { logger } from '../../logger.js';
|
||
|
|
/**
|
||
|
|
* Registry for email domain configurations
|
||
|
|
* Provides fast lookups and validation for domains
|
||
|
|
*/
|
||
|
|
export class DomainRegistry {
|
||
|
|
domains = new Map();
|
||
|
|
defaults;
|
||
|
|
constructor(domainConfigs, defaults) {
|
||
|
|
// Set defaults
|
||
|
|
this.defaults = {
|
||
|
|
dnsMode: defaults?.dnsMode || 'external-dns',
|
||
|
|
...this.getDefaultDkimConfig(),
|
||
|
|
...defaults?.dkim,
|
||
|
|
rateLimits: defaults?.rateLimits
|
||
|
|
};
|
||
|
|
// Process and store domain configurations
|
||
|
|
for (const config of domainConfigs) {
|
||
|
|
const processedConfig = this.applyDefaults(config);
|
||
|
|
this.domains.set(config.domain.toLowerCase(), processedConfig);
|
||
|
|
logger.log('info', `Registered domain: ${config.domain} with DNS mode: ${processedConfig.dnsMode}`);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Get default DKIM configuration
|
||
|
|
*/
|
||
|
|
getDefaultDkimConfig() {
|
||
|
|
return {
|
||
|
|
selector: 'default',
|
||
|
|
keySize: 2048,
|
||
|
|
rotateKeys: false,
|
||
|
|
rotationInterval: 90
|
||
|
|
};
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Apply defaults to a domain configuration
|
||
|
|
*/
|
||
|
|
applyDefaults(config) {
|
||
|
|
return {
|
||
|
|
...config,
|
||
|
|
dnsMode: config.dnsMode || this.defaults.dnsMode,
|
||
|
|
dkim: {
|
||
|
|
...this.getDefaultDkimConfig(),
|
||
|
|
...this.defaults,
|
||
|
|
...config.dkim
|
||
|
|
},
|
||
|
|
rateLimits: {
|
||
|
|
...this.defaults.rateLimits,
|
||
|
|
...config.rateLimits,
|
||
|
|
outbound: {
|
||
|
|
...this.defaults.rateLimits?.outbound,
|
||
|
|
...config.rateLimits?.outbound
|
||
|
|
},
|
||
|
|
inbound: {
|
||
|
|
...this.defaults.rateLimits?.inbound,
|
||
|
|
...config.rateLimits?.inbound
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Check if a domain is registered
|
||
|
|
*/
|
||
|
|
isDomainRegistered(domain) {
|
||
|
|
return this.domains.has(domain.toLowerCase());
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Check if an email address belongs to a registered domain
|
||
|
|
*/
|
||
|
|
isEmailRegistered(email) {
|
||
|
|
const domain = this.extractDomain(email);
|
||
|
|
if (!domain)
|
||
|
|
return false;
|
||
|
|
return this.isDomainRegistered(domain);
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Get domain configuration
|
||
|
|
*/
|
||
|
|
getDomainConfig(domain) {
|
||
|
|
return this.domains.get(domain.toLowerCase());
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Get domain configuration for an email address
|
||
|
|
*/
|
||
|
|
getEmailDomainConfig(email) {
|
||
|
|
const domain = this.extractDomain(email);
|
||
|
|
if (!domain)
|
||
|
|
return undefined;
|
||
|
|
return this.getDomainConfig(domain);
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Extract domain from email address
|
||
|
|
*/
|
||
|
|
extractDomain(email) {
|
||
|
|
const parts = email.toLowerCase().split('@');
|
||
|
|
if (parts.length !== 2)
|
||
|
|
return null;
|
||
|
|
return parts[1];
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Get all registered domains
|
||
|
|
*/
|
||
|
|
getAllDomains() {
|
||
|
|
return Array.from(this.domains.keys());
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Get all domain configurations
|
||
|
|
*/
|
||
|
|
getAllConfigs() {
|
||
|
|
return Array.from(this.domains.values());
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Get domains by DNS mode
|
||
|
|
*/
|
||
|
|
getDomainsByMode(mode) {
|
||
|
|
return Array.from(this.domains.values()).filter(config => config.dnsMode === mode);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb21haW4ucmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tYWlsL3JvdXRpbmcvY2xhc3Nlcy5kb21haW4ucmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ2pCLE9BQU8sR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNyRCxRQUFRLENBR2Q7SUFFRixZQUNFLGFBQW1DLEVBQ25DLFFBSUM7UUFFRCxlQUFlO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxJQUFJLGNBQWM7WUFDNUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDOUIsR0FBRyxRQUFRLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVU7U0FDakMsQ0FBQztRQUVGLDBDQUEwQztRQUMxQyxLQUFLLE1BQU0sTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUMvRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0I7UUFDMUIsT0FBTztZQUNMLFFBQVEsRUFBRSxTQUFTO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1lBQ2IsVUFBVSxFQUFFLEtBQUs7WUFDakIsZ0JB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
|