@serve.zone/dcrouter 2.12.4
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/.dockerignore +1 -0
- package/.gitea/workflows/docker_nottags.yaml +71 -0
- package/.gitea/workflows/docker_tags.yaml +106 -0
- package/.vscode/launch.json +11 -0
- package/.vscode/settings.json +26 -0
- package/Dockerfile +46 -0
- package/changelog.md +247 -0
- package/cli.child.js +4 -0
- package/cli.child.ts +4 -0
- package/cli.js +4 -0
- package/cli.ts.js +5 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.dcrouter.d.ts +238 -0
- package/dist_ts/classes.dcrouter.js +1008 -0
- package/dist_ts/config/index.d.ts +1 -0
- package/dist_ts/config/index.js +3 -0
- package/dist_ts/config/validator.d.ts +104 -0
- package/dist_ts/config/validator.js +152 -0
- package/dist_ts/deliverability/classes.ipwarmupmanager.d.ts +253 -0
- package/dist_ts/deliverability/classes.ipwarmupmanager.js +639 -0
- package/dist_ts/deliverability/classes.senderreputationmonitor.d.ts +300 -0
- package/dist_ts/deliverability/classes.senderreputationmonitor.js +961 -0
- package/dist_ts/deliverability/index.d.ts +2 -0
- package/dist_ts/deliverability/index.js +3 -0
- package/dist_ts/errors/base.errors.d.ts +224 -0
- package/dist_ts/errors/base.errors.js +310 -0
- package/dist_ts/errors/email.errors.d.ts +175 -0
- package/dist_ts/errors/email.errors.js +265 -0
- package/dist_ts/errors/error-handler.d.ts +98 -0
- package/dist_ts/errors/error-handler.js +282 -0
- package/dist_ts/errors/error.codes.d.ts +115 -0
- package/dist_ts/errors/error.codes.js +136 -0
- package/dist_ts/errors/index.d.ts +56 -0
- package/dist_ts/errors/index.js +138 -0
- package/dist_ts/errors/mta.errors.d.ts +259 -0
- package/dist_ts/errors/mta.errors.js +472 -0
- package/dist_ts/errors/reputation.errors.d.ts +183 -0
- package/dist_ts/errors/reputation.errors.js +292 -0
- package/dist_ts/index.d.ts +4 -0
- package/dist_ts/index.js +6 -0
- package/dist_ts/logger.d.ts +17 -0
- package/dist_ts/logger.js +77 -0
- package/dist_ts/mail/core/classes.bouncemanager.d.ts +200 -0
- package/dist_ts/mail/core/classes.bouncemanager.js +778 -0
- package/dist_ts/mail/core/classes.email.d.ts +291 -0
- package/dist_ts/mail/core/classes.email.js +780 -0
- package/dist_ts/mail/core/classes.emailvalidator.d.ts +61 -0
- package/dist_ts/mail/core/classes.emailvalidator.js +182 -0
- package/dist_ts/mail/core/classes.templatemanager.d.ts +95 -0
- package/dist_ts/mail/core/classes.templatemanager.js +239 -0
- package/dist_ts/mail/core/index.d.ts +4 -0
- package/dist_ts/mail/core/index.js +6 -0
- package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +163 -0
- package/dist_ts/mail/delivery/classes.delivery.queue.js +485 -0
- package/dist_ts/mail/delivery/classes.delivery.system.d.ts +186 -0
- package/dist_ts/mail/delivery/classes.delivery.system.js +846 -0
- package/dist_ts/mail/delivery/classes.emailsendjob.d.ts +84 -0
- package/dist_ts/mail/delivery/classes.emailsendjob.js +362 -0
- package/dist_ts/mail/delivery/classes.emailsignjob.d.ts +18 -0
- package/dist_ts/mail/delivery/classes.emailsignjob.js +44 -0
- package/dist_ts/mail/delivery/classes.mta.config.d.ts +22 -0
- package/dist_ts/mail/delivery/classes.mta.config.js +51 -0
- package/dist_ts/mail/delivery/classes.ratelimiter.d.ts +98 -0
- package/dist_ts/mail/delivery/classes.ratelimiter.js +205 -0
- package/dist_ts/mail/delivery/classes.smtp.client.legacy.d.ts +275 -0
- package/dist_ts/mail/delivery/classes.smtp.client.legacy.js +973 -0
- package/dist_ts/mail/delivery/classes.unified.rate.limiter.d.ts +200 -0
- package/dist_ts/mail/delivery/classes.unified.rate.limiter.js +817 -0
- package/dist_ts/mail/delivery/index.d.ts +12 -0
- package/dist_ts/mail/delivery/index.js +18 -0
- package/dist_ts/mail/delivery/interfaces.d.ts +243 -0
- package/dist_ts/mail/delivery/interfaces.js +17 -0
- package/dist_ts/mail/delivery/smtpclient/auth-handler.d.ts +43 -0
- package/dist_ts/mail/delivery/smtpclient/auth-handler.js +188 -0
- package/dist_ts/mail/delivery/smtpclient/command-handler.d.ts +67 -0
- package/dist_ts/mail/delivery/smtpclient/command-handler.js +276 -0
- package/dist_ts/mail/delivery/smtpclient/connection-manager.d.ts +48 -0
- package/dist_ts/mail/delivery/smtpclient/connection-manager.js +238 -0
- package/dist_ts/mail/delivery/smtpclient/constants.d.ts +129 -0
- package/dist_ts/mail/delivery/smtpclient/constants.js +135 -0
- package/dist_ts/mail/delivery/smtpclient/create-client.d.ts +22 -0
- package/dist_ts/mail/delivery/smtpclient/create-client.js +86 -0
- package/dist_ts/mail/delivery/smtpclient/error-handler.d.ts +28 -0
- package/dist_ts/mail/delivery/smtpclient/error-handler.js +110 -0
- package/dist_ts/mail/delivery/smtpclient/index.d.ts +16 -0
- package/dist_ts/mail/delivery/smtpclient/index.js +21 -0
- package/dist_ts/mail/delivery/smtpclient/interfaces.d.ts +183 -0
- package/dist_ts/mail/delivery/smtpclient/interfaces.js +19 -0
- package/dist_ts/mail/delivery/smtpclient/smtp-client.d.ts +58 -0
- package/dist_ts/mail/delivery/smtpclient/smtp-client.js +279 -0
- package/dist_ts/mail/delivery/smtpclient/tls-handler.d.ts +33 -0
- package/dist_ts/mail/delivery/smtpclient/tls-handler.js +202 -0
- package/dist_ts/mail/delivery/smtpclient/utils/helpers.d.ts +77 -0
- package/dist_ts/mail/delivery/smtpclient/utils/helpers.js +196 -0
- package/dist_ts/mail/delivery/smtpclient/utils/logging.d.ts +46 -0
- package/dist_ts/mail/delivery/smtpclient/utils/logging.js +153 -0
- package/dist_ts/mail/delivery/smtpclient/utils/validation.d.ts +38 -0
- package/dist_ts/mail/delivery/smtpclient/utils/validation.js +139 -0
- package/dist_ts/mail/delivery/smtpserver/certificate-utils.d.ts +45 -0
- package/dist_ts/mail/delivery/smtpserver/certificate-utils.js +345 -0
- package/dist_ts/mail/delivery/smtpserver/command-handler.d.ts +156 -0
- package/dist_ts/mail/delivery/smtpserver/command-handler.js +1159 -0
- package/dist_ts/mail/delivery/smtpserver/connection-manager.d.ts +159 -0
- package/dist_ts/mail/delivery/smtpserver/connection-manager.js +894 -0
- package/dist_ts/mail/delivery/smtpserver/constants.d.ts +130 -0
- package/dist_ts/mail/delivery/smtpserver/constants.js +162 -0
- package/dist_ts/mail/delivery/smtpserver/create-server.d.ts +14 -0
- package/dist_ts/mail/delivery/smtpserver/create-server.js +28 -0
- package/dist_ts/mail/delivery/smtpserver/data-handler.d.ts +123 -0
- package/dist_ts/mail/delivery/smtpserver/data-handler.js +1148 -0
- package/dist_ts/mail/delivery/smtpserver/index.d.ts +20 -0
- package/dist_ts/mail/delivery/smtpserver/index.js +27 -0
- package/dist_ts/mail/delivery/smtpserver/interfaces.d.ts +530 -0
- package/dist_ts/mail/delivery/smtpserver/interfaces.js +10 -0
- package/dist_ts/mail/delivery/smtpserver/secure-server.d.ts +15 -0
- package/dist_ts/mail/delivery/smtpserver/secure-server.js +79 -0
- package/dist_ts/mail/delivery/smtpserver/security-handler.d.ts +86 -0
- package/dist_ts/mail/delivery/smtpserver/security-handler.js +234 -0
- package/dist_ts/mail/delivery/smtpserver/session-manager.d.ts +140 -0
- package/dist_ts/mail/delivery/smtpserver/session-manager.js +469 -0
- package/dist_ts/mail/delivery/smtpserver/smtp-server.d.ts +137 -0
- package/dist_ts/mail/delivery/smtpserver/smtp-server.js +666 -0
- package/dist_ts/mail/delivery/smtpserver/starttls-handler.d.ts +21 -0
- package/dist_ts/mail/delivery/smtpserver/starttls-handler.js +207 -0
- package/dist_ts/mail/delivery/smtpserver/tls-handler.d.ts +66 -0
- package/dist_ts/mail/delivery/smtpserver/tls-handler.js +261 -0
- package/dist_ts/mail/delivery/smtpserver/utils/adaptive-logging.d.ts +117 -0
- package/dist_ts/mail/delivery/smtpserver/utils/adaptive-logging.js +411 -0
- package/dist_ts/mail/delivery/smtpserver/utils/helpers.d.ts +78 -0
- package/dist_ts/mail/delivery/smtpserver/utils/helpers.js +208 -0
- package/dist_ts/mail/delivery/smtpserver/utils/logging.d.ts +106 -0
- package/dist_ts/mail/delivery/smtpserver/utils/logging.js +181 -0
- package/dist_ts/mail/delivery/smtpserver/utils/validation.d.ts +69 -0
- package/dist_ts/mail/delivery/smtpserver/utils/validation.js +360 -0
- package/dist_ts/mail/index.d.ts +8 -0
- package/dist_ts/mail/index.js +13 -0
- package/dist_ts/mail/routing/classes.dns.manager.d.ts +65 -0
- package/dist_ts/mail/routing/classes.dns.manager.js +413 -0
- package/dist_ts/mail/routing/classes.dnsmanager.d.ts +165 -0
- package/dist_ts/mail/routing/classes.dnsmanager.js +430 -0
- package/dist_ts/mail/routing/classes.domain.registry.d.ts +54 -0
- package/dist_ts/mail/routing/classes.domain.registry.js +118 -0
- package/dist_ts/mail/routing/classes.email.config.d.ts +64 -0
- package/dist_ts/mail/routing/classes.email.config.js +2 -0
- package/dist_ts/mail/routing/classes.email.router.d.ts +171 -0
- package/dist_ts/mail/routing/classes.email.router.js +491 -0
- package/dist_ts/mail/routing/classes.unified.email.server.d.ts +426 -0
- package/dist_ts/mail/routing/classes.unified.email.server.js +1454 -0
- package/dist_ts/mail/routing/index.d.ts +5 -0
- package/dist_ts/mail/routing/index.js +7 -0
- package/dist_ts/mail/routing/interfaces.d.ts +187 -0
- package/dist_ts/mail/routing/interfaces.js +2 -0
- package/dist_ts/mail/security/classes.dkimcreator.d.ts +68 -0
- package/dist_ts/mail/security/classes.dkimcreator.js +346 -0
- package/dist_ts/mail/security/classes.dkimverifier.d.ts +46 -0
- package/dist_ts/mail/security/classes.dkimverifier.js +317 -0
- package/dist_ts/mail/security/classes.dmarcverifier.d.ts +123 -0
- package/dist_ts/mail/security/classes.dmarcverifier.js +365 -0
- package/dist_ts/mail/security/classes.spfverifier.d.ts +103 -0
- package/dist_ts/mail/security/classes.spfverifier.js +492 -0
- package/dist_ts/mail/security/index.d.ts +4 -0
- package/dist_ts/mail/security/index.js +6 -0
- package/dist_ts/opsserver/classes.opsserver.d.ts +14 -0
- package/dist_ts/opsserver/classes.opsserver.js +37 -0
- package/dist_ts/opsserver/index.d.ts +1 -0
- package/dist_ts/opsserver/index.js +2 -0
- package/dist_ts/paths.d.ts +14 -0
- package/dist_ts/paths.js +39 -0
- package/dist_ts/plugins.d.ts +43 -0
- package/dist_ts/plugins.js +50 -0
- package/dist_ts/security/classes.contentscanner.d.ts +160 -0
- package/dist_ts/security/classes.contentscanner.js +634 -0
- package/dist_ts/security/classes.ipreputationchecker.d.ts +150 -0
- package/dist_ts/security/classes.ipreputationchecker.js +508 -0
- package/dist_ts/security/classes.securitylogger.d.ts +140 -0
- package/dist_ts/security/classes.securitylogger.js +232 -0
- package/dist_ts/security/index.d.ts +3 -0
- package/dist_ts/security/index.js +4 -0
- package/dist_ts/sms/classes.smsservice.d.ts +15 -0
- package/dist_ts/sms/classes.smsservice.js +72 -0
- package/dist_ts/sms/config/sms.config.d.ts +93 -0
- package/dist_ts/sms/config/sms.config.js +2 -0
- package/dist_ts/sms/config/sms.schema.d.ts +5 -0
- package/dist_ts/sms/config/sms.schema.js +121 -0
- package/dist_ts/sms/index.d.ts +1 -0
- package/dist_ts/sms/index.js +2 -0
- package/dist_ts/storage/classes.storagemanager.d.ts +82 -0
- package/dist_ts/storage/classes.storagemanager.js +341 -0
- package/dist_ts/storage/index.d.ts +1 -0
- package/dist_ts/storage/index.js +3 -0
- package/dist_ts/ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/ts/00_commitinfo_data.js +9 -0
- package/dist_ts/ts/classes.dcrouter.d.ts +238 -0
- package/dist_ts/ts/classes.dcrouter.js +1008 -0
- package/dist_ts/ts/config/index.d.ts +1 -0
- package/dist_ts/ts/config/index.js +3 -0
- package/dist_ts/ts/config/validator.d.ts +104 -0
- package/dist_ts/ts/config/validator.js +152 -0
- package/dist_ts/ts/deliverability/classes.ipwarmupmanager.d.ts +253 -0
- package/dist_ts/ts/deliverability/classes.ipwarmupmanager.js +639 -0
- package/dist_ts/ts/deliverability/classes.senderreputationmonitor.d.ts +300 -0
- package/dist_ts/ts/deliverability/classes.senderreputationmonitor.js +961 -0
- package/dist_ts/ts/deliverability/index.d.ts +2 -0
- package/dist_ts/ts/deliverability/index.js +3 -0
- package/dist_ts/ts/errors/base.errors.d.ts +224 -0
- package/dist_ts/ts/errors/base.errors.js +310 -0
- package/dist_ts/ts/errors/email.errors.d.ts +175 -0
- package/dist_ts/ts/errors/email.errors.js +265 -0
- package/dist_ts/ts/errors/error-handler.d.ts +98 -0
- package/dist_ts/ts/errors/error-handler.js +282 -0
- package/dist_ts/ts/errors/error.codes.d.ts +115 -0
- package/dist_ts/ts/errors/error.codes.js +136 -0
- package/dist_ts/ts/errors/index.d.ts +56 -0
- package/dist_ts/ts/errors/index.js +138 -0
- package/dist_ts/ts/errors/mta.errors.d.ts +259 -0
- package/dist_ts/ts/errors/mta.errors.js +472 -0
- package/dist_ts/ts/errors/reputation.errors.d.ts +183 -0
- package/dist_ts/ts/errors/reputation.errors.js +292 -0
- package/dist_ts/ts/index.d.ts +4 -0
- package/dist_ts/ts/index.js +6 -0
- package/dist_ts/ts/logger.d.ts +17 -0
- package/dist_ts/ts/logger.js +77 -0
- package/dist_ts/ts/mail/core/classes.bouncemanager.d.ts +200 -0
- package/dist_ts/ts/mail/core/classes.bouncemanager.js +778 -0
- package/dist_ts/ts/mail/core/classes.email.d.ts +291 -0
- package/dist_ts/ts/mail/core/classes.email.js +780 -0
- package/dist_ts/ts/mail/core/classes.emailvalidator.d.ts +61 -0
- package/dist_ts/ts/mail/core/classes.emailvalidator.js +182 -0
- package/dist_ts/ts/mail/core/classes.templatemanager.d.ts +95 -0
- package/dist_ts/ts/mail/core/classes.templatemanager.js +239 -0
- package/dist_ts/ts/mail/core/index.d.ts +4 -0
- package/dist_ts/ts/mail/core/index.js +6 -0
- package/dist_ts/ts/mail/delivery/classes.delivery.queue.d.ts +163 -0
- package/dist_ts/ts/mail/delivery/classes.delivery.queue.js +485 -0
- package/dist_ts/ts/mail/delivery/classes.delivery.system.d.ts +186 -0
- package/dist_ts/ts/mail/delivery/classes.delivery.system.js +846 -0
- package/dist_ts/ts/mail/delivery/classes.emailsendjob.d.ts +84 -0
- package/dist_ts/ts/mail/delivery/classes.emailsendjob.js +362 -0
- package/dist_ts/ts/mail/delivery/classes.emailsignjob.d.ts +18 -0
- package/dist_ts/ts/mail/delivery/classes.emailsignjob.js +44 -0
- package/dist_ts/ts/mail/delivery/classes.mta.config.d.ts +22 -0
- package/dist_ts/ts/mail/delivery/classes.mta.config.js +51 -0
- package/dist_ts/ts/mail/delivery/classes.ratelimiter.d.ts +98 -0
- package/dist_ts/ts/mail/delivery/classes.ratelimiter.js +205 -0
- package/dist_ts/ts/mail/delivery/classes.smtp.client.legacy.d.ts +275 -0
- package/dist_ts/ts/mail/delivery/classes.smtp.client.legacy.js +973 -0
- package/dist_ts/ts/mail/delivery/classes.unified.rate.limiter.d.ts +200 -0
- package/dist_ts/ts/mail/delivery/classes.unified.rate.limiter.js +817 -0
- package/dist_ts/ts/mail/delivery/index.d.ts +12 -0
- package/dist_ts/ts/mail/delivery/index.js +18 -0
- package/dist_ts/ts/mail/delivery/interfaces.d.ts +243 -0
- package/dist_ts/ts/mail/delivery/interfaces.js +17 -0
- package/dist_ts/ts/mail/delivery/smtpclient/auth-handler.d.ts +43 -0
- package/dist_ts/ts/mail/delivery/smtpclient/auth-handler.js +188 -0
- package/dist_ts/ts/mail/delivery/smtpclient/command-handler.d.ts +67 -0
- package/dist_ts/ts/mail/delivery/smtpclient/command-handler.js +276 -0
- package/dist_ts/ts/mail/delivery/smtpclient/connection-manager.d.ts +48 -0
- package/dist_ts/ts/mail/delivery/smtpclient/connection-manager.js +238 -0
- package/dist_ts/ts/mail/delivery/smtpclient/constants.d.ts +129 -0
- package/dist_ts/ts/mail/delivery/smtpclient/constants.js +135 -0
- package/dist_ts/ts/mail/delivery/smtpclient/create-client.d.ts +22 -0
- package/dist_ts/ts/mail/delivery/smtpclient/create-client.js +86 -0
- package/dist_ts/ts/mail/delivery/smtpclient/error-handler.d.ts +28 -0
- package/dist_ts/ts/mail/delivery/smtpclient/error-handler.js +110 -0
- package/dist_ts/ts/mail/delivery/smtpclient/index.d.ts +16 -0
- package/dist_ts/ts/mail/delivery/smtpclient/index.js +21 -0
- package/dist_ts/ts/mail/delivery/smtpclient/interfaces.d.ts +183 -0
- package/dist_ts/ts/mail/delivery/smtpclient/interfaces.js +19 -0
- package/dist_ts/ts/mail/delivery/smtpclient/smtp-client.d.ts +58 -0
- package/dist_ts/ts/mail/delivery/smtpclient/smtp-client.js +279 -0
- package/dist_ts/ts/mail/delivery/smtpclient/tls-handler.d.ts +33 -0
- package/dist_ts/ts/mail/delivery/smtpclient/tls-handler.js +202 -0
- package/dist_ts/ts/mail/delivery/smtpclient/utils/helpers.d.ts +77 -0
- package/dist_ts/ts/mail/delivery/smtpclient/utils/helpers.js +196 -0
- package/dist_ts/ts/mail/delivery/smtpclient/utils/logging.d.ts +46 -0
- package/dist_ts/ts/mail/delivery/smtpclient/utils/logging.js +153 -0
- package/dist_ts/ts/mail/delivery/smtpclient/utils/validation.d.ts +38 -0
- package/dist_ts/ts/mail/delivery/smtpclient/utils/validation.js +139 -0
- package/dist_ts/ts/mail/delivery/smtpserver/certificate-utils.d.ts +45 -0
- package/dist_ts/ts/mail/delivery/smtpserver/certificate-utils.js +345 -0
- package/dist_ts/ts/mail/delivery/smtpserver/command-handler.d.ts +156 -0
- package/dist_ts/ts/mail/delivery/smtpserver/command-handler.js +1159 -0
- package/dist_ts/ts/mail/delivery/smtpserver/connection-manager.d.ts +159 -0
- package/dist_ts/ts/mail/delivery/smtpserver/connection-manager.js +894 -0
- package/dist_ts/ts/mail/delivery/smtpserver/constants.d.ts +130 -0
- package/dist_ts/ts/mail/delivery/smtpserver/constants.js +162 -0
- package/dist_ts/ts/mail/delivery/smtpserver/create-server.d.ts +14 -0
- package/dist_ts/ts/mail/delivery/smtpserver/create-server.js +28 -0
- package/dist_ts/ts/mail/delivery/smtpserver/data-handler.d.ts +123 -0
- package/dist_ts/ts/mail/delivery/smtpserver/data-handler.js +1148 -0
- package/dist_ts/ts/mail/delivery/smtpserver/index.d.ts +20 -0
- package/dist_ts/ts/mail/delivery/smtpserver/index.js +27 -0
- package/dist_ts/ts/mail/delivery/smtpserver/interfaces.d.ts +530 -0
- package/dist_ts/ts/mail/delivery/smtpserver/interfaces.js +10 -0
- package/dist_ts/ts/mail/delivery/smtpserver/secure-server.d.ts +15 -0
- package/dist_ts/ts/mail/delivery/smtpserver/secure-server.js +79 -0
- package/dist_ts/ts/mail/delivery/smtpserver/security-handler.d.ts +86 -0
- package/dist_ts/ts/mail/delivery/smtpserver/security-handler.js +234 -0
- package/dist_ts/ts/mail/delivery/smtpserver/session-manager.d.ts +140 -0
- package/dist_ts/ts/mail/delivery/smtpserver/session-manager.js +469 -0
- package/dist_ts/ts/mail/delivery/smtpserver/smtp-server.d.ts +137 -0
- package/dist_ts/ts/mail/delivery/smtpserver/smtp-server.js +666 -0
- package/dist_ts/ts/mail/delivery/smtpserver/starttls-handler.d.ts +21 -0
- package/dist_ts/ts/mail/delivery/smtpserver/starttls-handler.js +207 -0
- package/dist_ts/ts/mail/delivery/smtpserver/tls-handler.d.ts +66 -0
- package/dist_ts/ts/mail/delivery/smtpserver/tls-handler.js +261 -0
- package/dist_ts/ts/mail/delivery/smtpserver/utils/adaptive-logging.d.ts +117 -0
- package/dist_ts/ts/mail/delivery/smtpserver/utils/adaptive-logging.js +411 -0
- package/dist_ts/ts/mail/delivery/smtpserver/utils/helpers.d.ts +78 -0
- package/dist_ts/ts/mail/delivery/smtpserver/utils/helpers.js +208 -0
- package/dist_ts/ts/mail/delivery/smtpserver/utils/logging.d.ts +106 -0
- package/dist_ts/ts/mail/delivery/smtpserver/utils/logging.js +181 -0
- package/dist_ts/ts/mail/delivery/smtpserver/utils/validation.d.ts +69 -0
- package/dist_ts/ts/mail/delivery/smtpserver/utils/validation.js +360 -0
- package/dist_ts/ts/mail/index.d.ts +8 -0
- package/dist_ts/ts/mail/index.js +13 -0
- package/dist_ts/ts/mail/routing/classes.dns.manager.d.ts +65 -0
- package/dist_ts/ts/mail/routing/classes.dns.manager.js +413 -0
- package/dist_ts/ts/mail/routing/classes.dnsmanager.d.ts +165 -0
- package/dist_ts/ts/mail/routing/classes.dnsmanager.js +430 -0
- package/dist_ts/ts/mail/routing/classes.domain.registry.d.ts +54 -0
- package/dist_ts/ts/mail/routing/classes.domain.registry.js +118 -0
- package/dist_ts/ts/mail/routing/classes.email.config.d.ts +64 -0
- package/dist_ts/ts/mail/routing/classes.email.config.js +2 -0
- package/dist_ts/ts/mail/routing/classes.email.router.d.ts +171 -0
- package/dist_ts/ts/mail/routing/classes.email.router.js +491 -0
- package/dist_ts/ts/mail/routing/classes.unified.email.server.d.ts +426 -0
- package/dist_ts/ts/mail/routing/classes.unified.email.server.js +1454 -0
- package/dist_ts/ts/mail/routing/index.d.ts +5 -0
- package/dist_ts/ts/mail/routing/index.js +7 -0
- package/dist_ts/ts/mail/routing/interfaces.d.ts +187 -0
- package/dist_ts/ts/mail/routing/interfaces.js +2 -0
- package/dist_ts/ts/mail/security/classes.dkimcreator.d.ts +68 -0
- package/dist_ts/ts/mail/security/classes.dkimcreator.js +346 -0
- package/dist_ts/ts/mail/security/classes.dkimverifier.d.ts +46 -0
- package/dist_ts/ts/mail/security/classes.dkimverifier.js +317 -0
- package/dist_ts/ts/mail/security/classes.dmarcverifier.d.ts +123 -0
- package/dist_ts/ts/mail/security/classes.dmarcverifier.js +365 -0
- package/dist_ts/ts/mail/security/classes.spfverifier.d.ts +103 -0
- package/dist_ts/ts/mail/security/classes.spfverifier.js +492 -0
- package/dist_ts/ts/mail/security/index.d.ts +4 -0
- package/dist_ts/ts/mail/security/index.js +6 -0
- package/dist_ts/ts/opsserver/classes.opsserver.d.ts +20 -0
- package/dist_ts/ts/opsserver/classes.opsserver.js +44 -0
- package/dist_ts/ts/opsserver/handlers/admin.handler.d.ts +31 -0
- package/dist_ts/ts/opsserver/handlers/admin.handler.js +177 -0
- package/dist_ts/ts/opsserver/handlers/config.handler.d.ts +10 -0
- package/dist_ts/ts/opsserver/handlers/config.handler.js +100 -0
- package/dist_ts/ts/opsserver/handlers/index.d.ts +5 -0
- package/dist_ts/ts/opsserver/handlers/index.js +6 -0
- package/dist_ts/ts/opsserver/handlers/logs.handler.d.ts +10 -0
- package/dist_ts/ts/opsserver/handlers/logs.handler.js +121 -0
- package/dist_ts/ts/opsserver/handlers/security.handler.d.ts +11 -0
- package/dist_ts/ts/opsserver/handlers/security.handler.js +118 -0
- package/dist_ts/ts/opsserver/handlers/stats.handler.d.ts +13 -0
- package/dist_ts/ts/opsserver/handlers/stats.handler.js +233 -0
- package/dist_ts/ts/opsserver/helpers/guards.d.ts +25 -0
- package/dist_ts/ts/opsserver/helpers/guards.js +41 -0
- package/dist_ts/ts/opsserver/index.d.ts +1 -0
- package/dist_ts/ts/opsserver/index.js +2 -0
- package/dist_ts/ts/paths.d.ts +14 -0
- package/dist_ts/ts/paths.js +39 -0
- package/dist_ts/ts/plugins.d.ts +46 -0
- package/dist_ts/ts/plugins.js +53 -0
- package/dist_ts/ts/security/classes.contentscanner.d.ts +160 -0
- package/dist_ts/ts/security/classes.contentscanner.js +634 -0
- package/dist_ts/ts/security/classes.ipreputationchecker.d.ts +150 -0
- package/dist_ts/ts/security/classes.ipreputationchecker.js +508 -0
- package/dist_ts/ts/security/classes.securitylogger.d.ts +140 -0
- package/dist_ts/ts/security/classes.securitylogger.js +232 -0
- package/dist_ts/ts/security/index.d.ts +3 -0
- package/dist_ts/ts/security/index.js +4 -0
- package/dist_ts/ts/sms/classes.smsservice.d.ts +15 -0
- package/dist_ts/ts/sms/classes.smsservice.js +72 -0
- package/dist_ts/ts/sms/config/sms.config.d.ts +93 -0
- package/dist_ts/ts/sms/config/sms.config.js +2 -0
- package/dist_ts/ts/sms/config/sms.schema.d.ts +5 -0
- package/dist_ts/ts/sms/config/sms.schema.js +121 -0
- package/dist_ts/ts/sms/index.d.ts +1 -0
- package/dist_ts/ts/sms/index.js +2 -0
- package/dist_ts/ts/storage/classes.storagemanager.d.ts +82 -0
- package/dist_ts/ts/storage/classes.storagemanager.js +341 -0
- package/dist_ts/ts/storage/index.d.ts +1 -0
- package/dist_ts/ts/storage/index.js +3 -0
- package/dist_ts/ts_interfaces/data/auth.d.ts +8 -0
- package/dist_ts/ts_interfaces/data/auth.js +2 -0
- package/dist_ts/ts_interfaces/data/index.d.ts +2 -0
- package/dist_ts/ts_interfaces/data/index.js +3 -0
- package/dist_ts/ts_interfaces/data/stats.d.ts +93 -0
- package/dist_ts/ts_interfaces/data/stats.js +2 -0
- package/dist_ts/ts_interfaces/index.d.ts +5 -0
- package/dist_ts/ts_interfaces/index.js +8 -0
- package/dist_ts/ts_interfaces/plugins.d.ts +2 -0
- package/dist_ts/ts_interfaces/plugins.js +4 -0
- package/dist_ts/ts_interfaces/requests/admin.d.ts +31 -0
- package/dist_ts/ts_interfaces/requests/admin.js +3 -0
- package/dist_ts/ts_interfaces/requests/config.d.ts +25 -0
- package/dist_ts/ts_interfaces/requests/config.js +3 -0
- package/dist_ts/ts_interfaces/requests/index.d.ts +4 -0
- package/dist_ts/ts_interfaces/requests/index.js +5 -0
- package/dist_ts/ts_interfaces/requests/logs.d.ts +34 -0
- package/dist_ts/ts_interfaces/requests/logs.js +4 -0
- package/dist_ts/ts_interfaces/requests/stats.d.ts +131 -0
- package/dist_ts/ts_interfaces/requests/stats.js +4 -0
- package/html/index.html +121 -0
- package/npmextra.json +45 -0
- package/package.json +83 -0
- package/readme.hints.md +906 -0
- package/readme.md +1253 -0
- package/readme.opsserver.md +351 -0
- package/test/helpers/server.loader.ts +347 -0
- package/test/helpers/smtp.client.ts +209 -0
- package/test/helpers/utils.ts +311 -0
- package/test/readme.md +443 -0
- package/test/suite/smtpclient_commands/test.ccmd-01.ehlo-helo-sending.ts +168 -0
- package/test/suite/smtpclient_commands/test.ccmd-02.mail-from-parameters.ts +277 -0
- package/test/suite/smtpclient_commands/test.ccmd-03.rcpt-to-multiple.ts +283 -0
- package/test/suite/smtpclient_commands/test.ccmd-04.data-transmission.ts +274 -0
- package/test/suite/smtpclient_commands/test.ccmd-05.auth-mechanisms.ts +306 -0
- package/test/suite/smtpclient_commands/test.ccmd-06.command-pipelining.ts +233 -0
- package/test/suite/smtpclient_commands/test.ccmd-07.response-parsing.ts +243 -0
- package/test/suite/smtpclient_commands/test.ccmd-08.rset-command.ts +333 -0
- package/test/suite/smtpclient_commands/test.ccmd-09.noop-command.ts +339 -0
- package/test/suite/smtpclient_commands/test.ccmd-10.vrfy-expn.ts +457 -0
- package/test/suite/smtpclient_commands/test.ccmd-11.help-command.ts +409 -0
- package/test/suite/smtpclient_connection/test.ccm-01.basic-tcp-connection.ts +150 -0
- package/test/suite/smtpclient_connection/test.ccm-02.tls-connection.ts +140 -0
- package/test/suite/smtpclient_connection/test.ccm-03.starttls-upgrade.ts +208 -0
- package/test/suite/smtpclient_connection/test.ccm-04.connection-pooling.ts +250 -0
- package/test/suite/smtpclient_connection/test.ccm-05.connection-reuse.ts +288 -0
- package/test/suite/smtpclient_connection/test.ccm-06.connection-timeout.ts +267 -0
- package/test/suite/smtpclient_connection/test.ccm-07.automatic-reconnection.ts +324 -0
- package/test/suite/smtpclient_connection/test.ccm-08.dns-resolution.ts +139 -0
- package/test/suite/smtpclient_connection/test.ccm-09.ipv6-dual-stack.ts +167 -0
- package/test/suite/smtpclient_connection/test.ccm-10.proxy-support.ts +305 -0
- package/test/suite/smtpclient_connection/test.ccm-11.keepalive.ts +299 -0
- package/test/suite/smtpclient_edge-cases/test.cedge-01.unusual-server-responses.ts +529 -0
- package/test/suite/smtpclient_edge-cases/test.cedge-02.malformed-commands.ts +438 -0
- package/test/suite/smtpclient_edge-cases/test.cedge-03.protocol-violations.ts +446 -0
- package/test/suite/smtpclient_edge-cases/test.cedge-04.resource-constraints.ts +530 -0
- package/test/suite/smtpclient_edge-cases/test.cedge-05.encoding-issues.ts +145 -0
- package/test/suite/smtpclient_edge-cases/test.cedge-06.large-headers.ts +180 -0
- package/test/suite/smtpclient_edge-cases/test.cedge-07.concurrent-operations.ts +204 -0
- package/test/suite/smtpclient_email-composition/test.cep-01.basic-headers.ts +245 -0
- package/test/suite/smtpclient_email-composition/test.cep-02.mime-multipart.ts +321 -0
- package/test/suite/smtpclient_email-composition/test.cep-03.attachment-encoding.ts +334 -0
- package/test/suite/smtpclient_email-composition/test.cep-04.bcc-handling.ts +187 -0
- package/test/suite/smtpclient_email-composition/test.cep-05.reply-to-return-path.ts +277 -0
- package/test/suite/smtpclient_email-composition/test.cep-06.utf8-international.ts +235 -0
- package/test/suite/smtpclient_email-composition/test.cep-07.html-inline-images.ts +489 -0
- package/test/suite/smtpclient_email-composition/test.cep-08.custom-headers.ts +293 -0
- package/test/suite/smtpclient_email-composition/test.cep-09.priority-importance.ts +314 -0
- package/test/suite/smtpclient_email-composition/test.cep-10.receipts-dsn.ts +411 -0
- package/test/suite/smtpclient_error-handling/test.cerr-01.4xx-errors.ts +232 -0
- package/test/suite/smtpclient_error-handling/test.cerr-02.5xx-errors.ts +309 -0
- package/test/suite/smtpclient_error-handling/test.cerr-03.network-failures.ts +299 -0
- package/test/suite/smtpclient_error-handling/test.cerr-04.greylisting-handling.ts +255 -0
- package/test/suite/smtpclient_error-handling/test.cerr-05.quota-exceeded.ts +273 -0
- package/test/suite/smtpclient_error-handling/test.cerr-06.invalid-recipients.ts +320 -0
- package/test/suite/smtpclient_error-handling/test.cerr-07.message-size-limits.ts +320 -0
- package/test/suite/smtpclient_error-handling/test.cerr-08.rate-limiting.ts +261 -0
- package/test/suite/smtpclient_error-handling/test.cerr-09.connection-pool-errors.ts +299 -0
- package/test/suite/smtpclient_error-handling/test.cerr-10.partial-failure.ts +373 -0
- package/test/suite/smtpclient_performance/test.cperf-01.bulk-sending.ts +332 -0
- package/test/suite/smtpclient_performance/test.cperf-02.message-throughput.ts +304 -0
- package/test/suite/smtpclient_performance/test.cperf-03.memory-usage.ts +332 -0
- package/test/suite/smtpclient_performance/test.cperf-04.cpu-utilization.ts +373 -0
- package/test/suite/smtpclient_performance/test.cperf-05.network-efficiency.ts +181 -0
- package/test/suite/smtpclient_performance/test.cperf-06.caching-strategies.ts +190 -0
- package/test/suite/smtpclient_performance/test.cperf-07.queue-management.ts +171 -0
- package/test/suite/smtpclient_performance/test.cperf-08.dns-caching.ts +50 -0
- package/test/suite/smtpclient_reliability/test.crel-01.reconnection-logic.ts +305 -0
- package/test/suite/smtpclient_reliability/test.crel-02.network-interruption.ts +207 -0
- package/test/suite/smtpclient_reliability/test.crel-03.queue-persistence.ts +469 -0
- package/test/suite/smtpclient_reliability/test.crel-04.crash-recovery.ts +520 -0
- package/test/suite/smtpclient_reliability/test.crel-05.memory-leaks.ts +503 -0
- package/test/suite/smtpclient_reliability/test.crel-06.concurrency-safety.ts +558 -0
- package/test/suite/smtpclient_reliability/test.crel-07.resource-cleanup.ts +52 -0
- package/test/suite/smtpclient_rfc-compliance/test.crfc-01.rfc5321-client.ts +283 -0
- package/test/suite/smtpclient_rfc-compliance/test.crfc-02.esmtp-compliance.ts +77 -0
- package/test/suite/smtpclient_rfc-compliance/test.crfc-03.command-syntax.ts +67 -0
- package/test/suite/smtpclient_rfc-compliance/test.crfc-04.response-codes.ts +54 -0
- package/test/suite/smtpclient_rfc-compliance/test.crfc-05.state-machine.ts +703 -0
- package/test/suite/smtpclient_rfc-compliance/test.crfc-06.protocol-negotiation.ts +688 -0
- package/test/suite/smtpclient_rfc-compliance/test.crfc-07.interoperability.ts +728 -0
- package/test/suite/smtpclient_rfc-compliance/test.crfc-08.smtp-extensions.ts +656 -0
- package/test/suite/smtpclient_security/test.csec-01.tls-verification.ts +88 -0
- package/test/suite/smtpclient_security/test.csec-02.oauth2-authentication.ts +132 -0
- package/test/suite/smtpclient_security/test.csec-03.dkim-signing.ts +138 -0
- package/test/suite/smtpclient_security/test.csec-04.spf-compliance.ts +163 -0
- package/test/suite/smtpclient_security/test.csec-05.dmarc-policy.ts +200 -0
- package/test/suite/smtpclient_security/test.csec-06.certificate-validation.ts +145 -0
- package/test/suite/smtpclient_security/test.csec-07.cipher-suites.ts +153 -0
- package/test/suite/smtpclient_security/test.csec-08.authentication-fallback.ts +154 -0
- package/test/suite/smtpclient_security/test.csec-09.relay-restrictions.ts +166 -0
- package/test/suite/smtpclient_security/test.csec-10.anti-spam-measures.ts +196 -0
- package/test/suite/smtpserver_commands/test.cmd-01.ehlo-command.ts +193 -0
- package/test/suite/smtpserver_commands/test.cmd-02.mail-from.ts +330 -0
- package/test/suite/smtpserver_commands/test.cmd-03.rcpt-to.ts +296 -0
- package/test/suite/smtpserver_commands/test.cmd-04.data-command.ts +395 -0
- package/test/suite/smtpserver_commands/test.cmd-05.noop-command.ts +320 -0
- package/test/suite/smtpserver_commands/test.cmd-06.rset-command.ts +399 -0
- package/test/suite/smtpserver_commands/test.cmd-07.vrfy-command.ts +391 -0
- package/test/suite/smtpserver_commands/test.cmd-08.expn-command.ts +450 -0
- package/test/suite/smtpserver_commands/test.cmd-09.size-extension.ts +465 -0
- package/test/suite/smtpserver_commands/test.cmd-10.help-command.ts +454 -0
- package/test/suite/smtpserver_commands/test.cmd-11.command-pipelining.ts +334 -0
- package/test/suite/smtpserver_commands/test.cmd-12.helo-command.ts +420 -0
- package/test/suite/smtpserver_commands/test.cmd-13.quit-command.ts +384 -0
- package/test/suite/smtpserver_connection/test.cm-01.tls-connection.ts +61 -0
- package/test/suite/smtpserver_connection/test.cm-02.multiple-connections.ts +112 -0
- package/test/suite/smtpserver_connection/test.cm-03.connection-timeout.ts +134 -0
- package/test/suite/smtpserver_connection/test.cm-04.connection-limits.ts +374 -0
- package/test/suite/smtpserver_connection/test.cm-05.connection-rejection.ts +296 -0
- package/test/suite/smtpserver_connection/test.cm-06.starttls-upgrade.ts +468 -0
- package/test/suite/smtpserver_connection/test.cm-07.abrupt-disconnection.ts +321 -0
- package/test/suite/smtpserver_connection/test.cm-08.tls-versions.ts +361 -0
- package/test/suite/smtpserver_connection/test.cm-09.tls-ciphers.ts +556 -0
- package/test/suite/smtpserver_connection/test.cm-10.plain-connection.ts +293 -0
- package/test/suite/smtpserver_connection/test.cm-11.keepalive.ts +382 -0
- package/test/suite/smtpserver_edge-cases/test.edge-01.very-large-email.ts +239 -0
- package/test/suite/smtpserver_edge-cases/test.edge-02.very-small-email.ts +389 -0
- package/test/suite/smtpserver_edge-cases/test.edge-03.invalid-character-handling.ts +479 -0
- package/test/suite/smtpserver_edge-cases/test.edge-04.empty-commands.ts +430 -0
- package/test/suite/smtpserver_edge-cases/test.edge-05.extremely-long-lines.ts +425 -0
- package/test/suite/smtpserver_edge-cases/test.edge-06.extremely-long-headers.ts +404 -0
- package/test/suite/smtpserver_edge-cases/test.edge-07.unusual-mime-types.ts +333 -0
- package/test/suite/smtpserver_edge-cases/test.edge-08.nested-mime-structures.ts +379 -0
- package/test/suite/smtpserver_email-processing/test.ep-01.basic-email-sending.ts +338 -0
- package/test/suite/smtpserver_email-processing/test.ep-02.invalid-email-addresses.ts +315 -0
- package/test/suite/smtpserver_email-processing/test.ep-03.multiple-recipients.ts +493 -0
- package/test/suite/smtpserver_email-processing/test.ep-04.large-email.ts +528 -0
- package/test/suite/smtpserver_email-processing/test.ep-05.mime-handling.ts +515 -0
- package/test/suite/smtpserver_email-processing/test.ep-06.attachment-handling.ts +629 -0
- package/test/suite/smtpserver_email-processing/test.ep-07.special-character-handling.ts +462 -0
- package/test/suite/smtpserver_email-processing/test.ep-08.email-routing.ts +527 -0
- package/test/suite/smtpserver_email-processing/test.ep-09.delivery-status-notifications.ts +486 -0
- package/test/suite/smtpserver_error-handling/test.err-01.syntax-errors.ts +475 -0
- package/test/suite/smtpserver_error-handling/test.err-02.invalid-sequence.ts +450 -0
- package/test/suite/smtpserver_error-handling/test.err-03.temporary-failures.ts +453 -0
- package/test/suite/smtpserver_error-handling/test.err-04.permanent-failures.ts +325 -0
- package/test/suite/smtpserver_error-handling/test.err-05.resource-exhaustion.ts +302 -0
- package/test/suite/smtpserver_error-handling/test.err-06.malformed-mime.ts +374 -0
- package/test/suite/smtpserver_error-handling/test.err-07.exception-handling.ts +333 -0
- package/test/suite/smtpserver_error-handling/test.err-08.error-logging.ts +324 -0
- package/test/suite/smtpserver_performance/test.perf-01.throughput.ts +183 -0
- package/test/suite/smtpserver_performance/test.perf-02.concurrency.ts +388 -0
- package/test/suite/smtpserver_performance/test.perf-03.cpu-utilization.ts +245 -0
- package/test/suite/smtpserver_performance/test.perf-04.memory-usage.ts +238 -0
- package/test/suite/smtpserver_performance/test.perf-05.connection-processing-time.ts +363 -0
- package/test/suite/smtpserver_performance/test.perf-06.message-processing-time.ts +252 -0
- package/test/suite/smtpserver_performance/test.perf-07.resource-cleanup.ts +317 -0
- package/test/suite/smtpserver_reliability/test.rel-01.long-running-operation.ts +344 -0
- package/test/suite/smtpserver_reliability/test.rel-02.restart-recovery.ts +328 -0
- package/test/suite/smtpserver_reliability/test.rel-03.resource-leak-detection.ts +394 -0
- package/test/suite/smtpserver_reliability/test.rel-04.error-recovery.ts +401 -0
- package/test/suite/smtpserver_reliability/test.rel-05.dns-resolution-failure.ts +335 -0
- package/test/suite/smtpserver_reliability/test.rel-06.network-interruption.ts +410 -0
- package/test/suite/smtpserver_rfc-compliance/test.rfc-01.rfc5321-compliance.ts +382 -0
- package/test/suite/smtpserver_rfc-compliance/test.rfc-02.rfc5322-compliance.ts +428 -0
- package/test/suite/smtpserver_rfc-compliance/test.rfc-03.rfc7208-spf-compliance.ts +330 -0
- package/test/suite/smtpserver_rfc-compliance/test.rfc-04.rfc6376-dkim-compliance.ts +450 -0
- package/test/suite/smtpserver_rfc-compliance/test.rfc-05.rfc7489-dmarc-compliance.ts +408 -0
- package/test/suite/smtpserver_rfc-compliance/test.rfc-06.rfc8314-tls-compliance.ts +366 -0
- package/test/suite/smtpserver_rfc-compliance/test.rfc-07.rfc3461-dsn-compliance.ts +399 -0
- package/test/suite/smtpserver_security/test.sec-01.authentication.ts +218 -0
- package/test/suite/smtpserver_security/test.sec-02.authorization.ts +286 -0
- package/test/suite/smtpserver_security/test.sec-03.dkim-processing.ts +414 -0
- package/test/suite/smtpserver_security/test.sec-04.spf-checking.ts +280 -0
- package/test/suite/smtpserver_security/test.sec-05.dmarc-policy.ts +374 -0
- package/test/suite/smtpserver_security/test.sec-06.ip-reputation.ts +303 -0
- package/test/suite/smtpserver_security/test.sec-07.content-scanning.ts +409 -0
- package/test/suite/smtpserver_security/test.sec-08.rate-limiting.ts +324 -0
- package/test/suite/smtpserver_security/test.sec-09.tls-certificate-validation.ts +312 -0
- package/test/suite/smtpserver_security/test.sec-10.header-injection-prevention.ts +332 -0
- package/test/suite/smtpserver_security/test.sec-11.bounce-management.ts +363 -0
- package/test/test.base.ts +65 -0
- package/test/test.bouncemanager.ts +196 -0
- package/test/test.config.md +175 -0
- package/test/test.contentscanner.ts +265 -0
- package/test/test.dcrouter.email.ts +201 -0
- package/test/test.deliverability.ts +55 -0
- package/test/test.dns-manager-creation.ts +141 -0
- package/test/test.dns-mode-switching.ts +257 -0
- package/test/test.dns-server-config.ts +140 -0
- package/test/test.dns-socket-handler.ts +169 -0
- package/test/test.dns-validation.ts +283 -0
- package/test/test.email-socket-handler.ts +228 -0
- package/test/test.email.integration.ts +377 -0
- package/test/test.email.router.ts +283 -0
- package/test/test.emailauth.ts +195 -0
- package/test/test.errors.ts +408 -0
- package/test/test.integration.storage.ts +313 -0
- package/test/test.integration.ts +75 -0
- package/test/test.ipreputationchecker.ts +179 -0
- package/test/test.ipwarmupmanager.ts +323 -0
- package/test/test.jwt-auth.ts +130 -0
- package/test/test.minimal.ts +66 -0
- package/test/test.opsserver-api.ts +83 -0
- package/test/test.protected-endpoint.ts +115 -0
- package/test/test.rate-limiting-integration.ts +236 -0
- package/test/test.ratelimiter.ts +141 -0
- package/test/test.reputationmonitor.ts +262 -0
- package/test/test.smartmail.ts +248 -0
- package/test/test.smtp.client.compatibility.ts +154 -0
- package/test/test.smtp.client.ts +191 -0
- package/test/test.smtp.server.ts +180 -0
- package/test/test.socket-handler-integration.ts +240 -0
- package/test/test.socket-handler-unit.ts +198 -0
- package/test/test.storagemanager.ts +289 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.dcrouter.ts +1310 -0
- package/ts/config/index.ts +2 -0
- package/ts/config/validator.ts +266 -0
- package/ts/deliverability/classes.ipwarmupmanager.ts +896 -0
- package/ts/deliverability/classes.senderreputationmonitor.ts +1244 -0
- package/ts/deliverability/index.ts +13 -0
- package/ts/errors/base.errors.ts +525 -0
- package/ts/errors/email.errors.ts +383 -0
- package/ts/errors/error-handler.ts +412 -0
- package/ts/errors/error.codes.ts +165 -0
- package/ts/errors/index.ts +195 -0
- package/ts/errors/mta.errors.ts +681 -0
- package/ts/errors/reputation.errors.ts +422 -0
- package/ts/index.ts +7 -0
- package/ts/logger.ts +91 -0
- package/ts/mail/core/classes.bouncemanager.ts +965 -0
- package/ts/mail/core/classes.email.ts +941 -0
- package/ts/mail/core/classes.emailvalidator.ts +239 -0
- package/ts/mail/core/classes.templatemanager.ts +320 -0
- package/ts/mail/core/index.ts +5 -0
- package/ts/mail/delivery/classes.delivery.queue.ts +645 -0
- package/ts/mail/delivery/classes.delivery.system.ts +1089 -0
- package/ts/mail/delivery/classes.emailsendjob.ts +447 -0
- package/ts/mail/delivery/classes.emailsendjob.ts.backup +691 -0
- package/ts/mail/delivery/classes.emailsignjob.ts +67 -0
- package/ts/mail/delivery/classes.mta.config.ts +73 -0
- package/ts/mail/delivery/classes.ratelimiter.ts +281 -0
- package/ts/mail/delivery/classes.smtp.client.legacy.ts +1422 -0
- package/ts/mail/delivery/classes.unified.rate.limiter.ts +1053 -0
- package/ts/mail/delivery/index.ts +24 -0
- package/ts/mail/delivery/interfaces.ts +291 -0
- package/ts/mail/delivery/smtpclient/auth-handler.ts +232 -0
- package/ts/mail/delivery/smtpclient/command-handler.ts +343 -0
- package/ts/mail/delivery/smtpclient/connection-manager.ts +289 -0
- package/ts/mail/delivery/smtpclient/constants.ts +145 -0
- package/ts/mail/delivery/smtpclient/create-client.ts +94 -0
- package/ts/mail/delivery/smtpclient/error-handler.ts +141 -0
- package/ts/mail/delivery/smtpclient/index.ts +24 -0
- package/ts/mail/delivery/smtpclient/interfaces.ts +242 -0
- package/ts/mail/delivery/smtpclient/smtp-client.ts +357 -0
- package/ts/mail/delivery/smtpclient/tls-handler.ts +254 -0
- package/ts/mail/delivery/smtpclient/utils/helpers.ts +224 -0
- package/ts/mail/delivery/smtpclient/utils/logging.ts +212 -0
- package/ts/mail/delivery/smtpclient/utils/validation.ts +170 -0
- package/ts/mail/delivery/smtpserver/certificate-utils.ts +398 -0
- package/ts/mail/delivery/smtpserver/command-handler.ts +1340 -0
- package/ts/mail/delivery/smtpserver/connection-manager.ts +1045 -0
- package/ts/mail/delivery/smtpserver/constants.ts +181 -0
- package/ts/mail/delivery/smtpserver/create-server.ts +31 -0
- package/ts/mail/delivery/smtpserver/data-handler.ts +1283 -0
- package/ts/mail/delivery/smtpserver/index.ts +32 -0
- package/ts/mail/delivery/smtpserver/interfaces.ts +655 -0
- package/ts/mail/delivery/smtpserver/secure-server.ts +97 -0
- package/ts/mail/delivery/smtpserver/security-handler.ts +345 -0
- package/ts/mail/delivery/smtpserver/session-manager.ts +557 -0
- package/ts/mail/delivery/smtpserver/smtp-server.ts +804 -0
- package/ts/mail/delivery/smtpserver/starttls-handler.ts +262 -0
- package/ts/mail/delivery/smtpserver/tls-handler.ts +346 -0
- package/ts/mail/delivery/smtpserver/utils/adaptive-logging.ts +514 -0
- package/ts/mail/delivery/smtpserver/utils/helpers.ts +246 -0
- package/ts/mail/delivery/smtpserver/utils/logging.ts +246 -0
- package/ts/mail/delivery/smtpserver/utils/validation.ts +436 -0
- package/ts/mail/index.ts +19 -0
- package/ts/mail/routing/classes.dns.manager.ts +563 -0
- package/ts/mail/routing/classes.dnsmanager.ts +559 -0
- package/ts/mail/routing/classes.domain.registry.ts +139 -0
- package/ts/mail/routing/classes.email.config.ts +82 -0
- package/ts/mail/routing/classes.email.router.ts +575 -0
- package/ts/mail/routing/classes.unified.email.server.ts +1873 -0
- package/ts/mail/routing/index.ts +6 -0
- package/ts/mail/routing/interfaces.ts +202 -0
- package/ts/mail/security/classes.dkimcreator.ts +431 -0
- package/ts/mail/security/classes.dkimverifier.ts +382 -0
- package/ts/mail/security/classes.dmarcverifier.ts +478 -0
- package/ts/mail/security/classes.spfverifier.ts +606 -0
- package/ts/mail/security/index.ts +5 -0
- package/ts/opsserver/classes.opsserver.ts +65 -0
- package/ts/opsserver/handlers/admin.handler.ts +240 -0
- package/ts/opsserver/handlers/config.handler.ts +150 -0
- package/ts/opsserver/handlers/index.ts +5 -0
- package/ts/opsserver/handlers/logs.handler.ts +195 -0
- package/ts/opsserver/handlers/security.handler.ts +208 -0
- package/ts/opsserver/handlers/stats.handler.ts +344 -0
- package/ts/opsserver/helpers/guards.ts +56 -0
- package/ts/opsserver/index.ts +1 -0
- package/ts/paths.ts +48 -0
- package/ts/plugins.ts +94 -0
- package/ts/security/classes.contentscanner.ts +739 -0
- package/ts/security/classes.ipreputationchecker.ts +592 -0
- package/ts/security/classes.securitylogger.ts +299 -0
- package/ts/security/index.ts +21 -0
- package/ts/sms/classes.smsservice.ts +98 -0
- package/ts/sms/config/sms.config.ts +109 -0
- package/ts/sms/config/sms.schema.ts +122 -0
- package/ts/sms/index.ts +1 -0
- package/ts/storage/classes.storagemanager.ts +400 -0
- package/ts/storage/index.ts +2 -0
- package/ts/tspublish.json +3 -0
- package/ts_interfaces/data/auth.ts +8 -0
- package/ts_interfaces/data/index.ts +2 -0
- package/ts_interfaces/data/stats.ts +101 -0
- package/ts_interfaces/index.ts +9 -0
- package/ts_interfaces/plugins.ts +6 -0
- package/ts_interfaces/requests/admin.ts +46 -0
- package/ts_interfaces/requests/config.ts +35 -0
- package/ts_interfaces/requests/index.ts +4 -0
- package/ts_interfaces/requests/logs.ts +44 -0
- package/ts_interfaces/requests/stats.ts +162 -0
- package/ts_interfaces/tspublish.json +3 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/appstate.ts +361 -0
- package/ts_web/elements/index.ts +7 -0
- package/ts_web/elements/ops-dashboard.ts +165 -0
- package/ts_web/elements/ops-view-config.ts +268 -0
- package/ts_web/elements/ops-view-logs.ts +207 -0
- package/ts_web/elements/ops-view-overview.ts +222 -0
- package/ts_web/elements/ops-view-security.ts +471 -0
- package/ts_web/elements/ops-view-stats.ts +299 -0
- package/ts_web/elements/shared/css.ts +10 -0
- package/ts_web/elements/shared/index.ts +2 -0
- package/ts_web/elements/shared/ops-sectionheading.ts +42 -0
- package/ts_web/index.ts +9 -0
- package/ts_web/plugins.ts +11 -0
- package/ts_web/tspublish.json +3 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,804 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMTP Server
|
|
3
|
+
* Core implementation for the refactored SMTP server
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import * as plugins from '../../../plugins.js';
|
|
7
|
+
import { SmtpState } from './interfaces.js';
|
|
8
|
+
import type { ISmtpServerOptions } from './interfaces.js';
|
|
9
|
+
import type { ISmtpServer, ISmtpServerConfig, ISessionManager, IConnectionManager, ICommandHandler, IDataHandler, ITlsHandler, ISecurityHandler } from './interfaces.js';
|
|
10
|
+
import { SessionManager } from './session-manager.js';
|
|
11
|
+
import { ConnectionManager } from './connection-manager.js';
|
|
12
|
+
import { CommandHandler } from './command-handler.js';
|
|
13
|
+
import { DataHandler } from './data-handler.js';
|
|
14
|
+
import { TlsHandler } from './tls-handler.js';
|
|
15
|
+
import { SecurityHandler } from './security-handler.js';
|
|
16
|
+
import { SMTP_DEFAULTS } from './constants.js';
|
|
17
|
+
import { mergeWithDefaults } from './utils/helpers.js';
|
|
18
|
+
import { SmtpLogger } from './utils/logging.js';
|
|
19
|
+
import { adaptiveLogger } from './utils/adaptive-logging.js';
|
|
20
|
+
import { UnifiedEmailServer } from '../../routing/classes.unified.email.server.js';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* SMTP Server implementation
|
|
24
|
+
* The main server class that coordinates all components
|
|
25
|
+
*/
|
|
26
|
+
export class SmtpServer implements ISmtpServer {
|
|
27
|
+
/**
|
|
28
|
+
* Email server reference
|
|
29
|
+
*/
|
|
30
|
+
private emailServer: UnifiedEmailServer;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Session manager
|
|
34
|
+
*/
|
|
35
|
+
private sessionManager: ISessionManager;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Connection manager
|
|
39
|
+
*/
|
|
40
|
+
private connectionManager: IConnectionManager;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Command handler
|
|
44
|
+
*/
|
|
45
|
+
private commandHandler: ICommandHandler;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Data handler
|
|
49
|
+
*/
|
|
50
|
+
private dataHandler: IDataHandler;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* TLS handler
|
|
54
|
+
*/
|
|
55
|
+
private tlsHandler: ITlsHandler;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Security handler
|
|
59
|
+
*/
|
|
60
|
+
private securityHandler: ISecurityHandler;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* SMTP server options
|
|
64
|
+
*/
|
|
65
|
+
private options: ISmtpServerOptions;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Net server instance
|
|
69
|
+
*/
|
|
70
|
+
private server: plugins.net.Server | null = null;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Secure server instance
|
|
74
|
+
*/
|
|
75
|
+
private secureServer: plugins.tls.Server | null = null;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Whether the server is running
|
|
79
|
+
*/
|
|
80
|
+
private running = false;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Server recovery state
|
|
84
|
+
*/
|
|
85
|
+
private recoveryState = {
|
|
86
|
+
/**
|
|
87
|
+
* Whether recovery is in progress
|
|
88
|
+
*/
|
|
89
|
+
recovering: false,
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Number of consecutive connection failures
|
|
93
|
+
*/
|
|
94
|
+
connectionFailures: 0,
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Last recovery attempt timestamp
|
|
98
|
+
*/
|
|
99
|
+
lastRecoveryAttempt: 0,
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Recovery cooldown in milliseconds
|
|
103
|
+
*/
|
|
104
|
+
recoveryCooldown: 5000,
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Maximum recovery attempts before giving up
|
|
108
|
+
*/
|
|
109
|
+
maxRecoveryAttempts: 3,
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Current recovery attempt
|
|
113
|
+
*/
|
|
114
|
+
currentRecoveryAttempt: 0
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Creates a new SMTP server
|
|
119
|
+
* @param config - Server configuration
|
|
120
|
+
*/
|
|
121
|
+
constructor(config: ISmtpServerConfig) {
|
|
122
|
+
this.emailServer = config.emailServer;
|
|
123
|
+
this.options = mergeWithDefaults(config.options);
|
|
124
|
+
|
|
125
|
+
// Create components - all components now receive the SMTP server instance
|
|
126
|
+
this.sessionManager = config.sessionManager || new SessionManager({
|
|
127
|
+
socketTimeout: this.options.socketTimeout,
|
|
128
|
+
connectionTimeout: this.options.connectionTimeout,
|
|
129
|
+
cleanupInterval: this.options.cleanupInterval
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
this.securityHandler = config.securityHandler || new SecurityHandler(this);
|
|
133
|
+
this.tlsHandler = config.tlsHandler || new TlsHandler(this);
|
|
134
|
+
this.dataHandler = config.dataHandler || new DataHandler(this);
|
|
135
|
+
this.commandHandler = config.commandHandler || new CommandHandler(this);
|
|
136
|
+
this.connectionManager = config.connectionManager || new ConnectionManager(this);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Start the SMTP server
|
|
141
|
+
* @returns Promise that resolves when server is started
|
|
142
|
+
*/
|
|
143
|
+
public async listen(): Promise<void> {
|
|
144
|
+
if (this.running) {
|
|
145
|
+
throw new Error('SMTP server is already running');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
// Create the server
|
|
150
|
+
this.server = plugins.net.createServer((socket) => {
|
|
151
|
+
// Check IP reputation before handling connection
|
|
152
|
+
this.securityHandler.checkIpReputation(socket)
|
|
153
|
+
.then(allowed => {
|
|
154
|
+
if (allowed) {
|
|
155
|
+
this.connectionManager.handleNewConnection(socket);
|
|
156
|
+
} else {
|
|
157
|
+
// Close connection if IP is not allowed
|
|
158
|
+
socket.destroy();
|
|
159
|
+
}
|
|
160
|
+
})
|
|
161
|
+
.catch(error => {
|
|
162
|
+
SmtpLogger.error(`IP reputation check error: ${error instanceof Error ? error.message : String(error)}`, {
|
|
163
|
+
remoteAddress: socket.remoteAddress,
|
|
164
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Allow connection on error (fail open)
|
|
168
|
+
this.connectionManager.handleNewConnection(socket);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Set up error handling with recovery
|
|
173
|
+
this.server.on('error', (err) => {
|
|
174
|
+
SmtpLogger.error(`SMTP server error: ${err.message}`, { error: err });
|
|
175
|
+
|
|
176
|
+
// Try to recover from specific errors
|
|
177
|
+
if (this.shouldAttemptRecovery(err)) {
|
|
178
|
+
this.attemptServerRecovery('standard', err);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// Start listening
|
|
183
|
+
await new Promise<void>((resolve, reject) => {
|
|
184
|
+
if (!this.server) {
|
|
185
|
+
reject(new Error('Server not initialized'));
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
this.server.listen(this.options.port, this.options.host, () => {
|
|
190
|
+
SmtpLogger.info(`SMTP server listening on ${this.options.host || '0.0.0.0'}:${this.options.port}`);
|
|
191
|
+
resolve();
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
this.server.on('error', reject);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
// Start secure server if configured
|
|
198
|
+
if (this.options.securePort && this.tlsHandler.isTlsEnabled()) {
|
|
199
|
+
try {
|
|
200
|
+
// Import the secure server creation utility from our new module
|
|
201
|
+
// This gives us better certificate handling and error resilience
|
|
202
|
+
const { createSecureTlsServer } = await import('./secure-server.js');
|
|
203
|
+
|
|
204
|
+
// Create secure server with the certificates
|
|
205
|
+
// This uses a more robust approach to certificate loading and validation
|
|
206
|
+
this.secureServer = createSecureTlsServer({
|
|
207
|
+
key: this.options.key,
|
|
208
|
+
cert: this.options.cert,
|
|
209
|
+
ca: this.options.ca
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
SmtpLogger.info(`Created secure TLS server for port ${this.options.securePort}`);
|
|
213
|
+
|
|
214
|
+
if (this.secureServer) {
|
|
215
|
+
// Use explicit error handling for secure connections
|
|
216
|
+
this.secureServer.on('tlsClientError', (err, tlsSocket) => {
|
|
217
|
+
SmtpLogger.error(`TLS client error: ${err.message}`, {
|
|
218
|
+
error: err,
|
|
219
|
+
remoteAddress: tlsSocket.remoteAddress,
|
|
220
|
+
remotePort: tlsSocket.remotePort,
|
|
221
|
+
stack: err.stack
|
|
222
|
+
});
|
|
223
|
+
// No need to destroy, the error event will handle that
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// Register the secure connection handler
|
|
227
|
+
this.secureServer.on('secureConnection', (socket) => {
|
|
228
|
+
SmtpLogger.info(`New secure connection from ${socket.remoteAddress}:${socket.remotePort}`, {
|
|
229
|
+
protocol: socket.getProtocol(),
|
|
230
|
+
cipher: socket.getCipher()?.name
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// Check IP reputation before handling connection
|
|
234
|
+
this.securityHandler.checkIpReputation(socket)
|
|
235
|
+
.then(allowed => {
|
|
236
|
+
if (allowed) {
|
|
237
|
+
// Pass the connection to the connection manager
|
|
238
|
+
this.connectionManager.handleNewSecureConnection(socket);
|
|
239
|
+
} else {
|
|
240
|
+
// Close connection if IP is not allowed
|
|
241
|
+
socket.destroy();
|
|
242
|
+
}
|
|
243
|
+
})
|
|
244
|
+
.catch(error => {
|
|
245
|
+
SmtpLogger.error(`IP reputation check error: ${error instanceof Error ? error.message : String(error)}`, {
|
|
246
|
+
remoteAddress: socket.remoteAddress,
|
|
247
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
248
|
+
stack: error instanceof Error ? error.stack : 'No stack trace available'
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
// Allow connection on error (fail open)
|
|
252
|
+
this.connectionManager.handleNewSecureConnection(socket);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
// Global error handler for the secure server with recovery
|
|
257
|
+
this.secureServer.on('error', (err) => {
|
|
258
|
+
SmtpLogger.error(`SMTP secure server error: ${err.message}`, {
|
|
259
|
+
error: err,
|
|
260
|
+
stack: err.stack
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// Try to recover from specific errors
|
|
264
|
+
if (this.shouldAttemptRecovery(err)) {
|
|
265
|
+
this.attemptServerRecovery('secure', err);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// Start listening on secure port
|
|
270
|
+
await new Promise<void>((resolve, reject) => {
|
|
271
|
+
if (!this.secureServer) {
|
|
272
|
+
reject(new Error('Secure server not initialized'));
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
this.secureServer.listen(this.options.securePort, this.options.host, () => {
|
|
277
|
+
SmtpLogger.info(`SMTP secure server listening on ${this.options.host || '0.0.0.0'}:${this.options.securePort}`);
|
|
278
|
+
resolve();
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
// Only use error event for startup issues
|
|
282
|
+
this.secureServer.once('error', reject);
|
|
283
|
+
});
|
|
284
|
+
} else {
|
|
285
|
+
SmtpLogger.warn('Failed to create secure server, TLS may not be properly configured');
|
|
286
|
+
}
|
|
287
|
+
} catch (error) {
|
|
288
|
+
SmtpLogger.error(`Error setting up secure server: ${error instanceof Error ? error.message : String(error)}`, {
|
|
289
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
290
|
+
stack: error instanceof Error ? error.stack : 'No stack trace available'
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
this.running = true;
|
|
296
|
+
} catch (error) {
|
|
297
|
+
SmtpLogger.error(`Failed to start SMTP server: ${error instanceof Error ? error.message : String(error)}`, {
|
|
298
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// Clean up on error
|
|
302
|
+
this.close();
|
|
303
|
+
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Stop the SMTP server
|
|
310
|
+
* @returns Promise that resolves when server is stopped
|
|
311
|
+
*/
|
|
312
|
+
public async close(): Promise<void> {
|
|
313
|
+
if (!this.running) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
SmtpLogger.info('Stopping SMTP server');
|
|
318
|
+
|
|
319
|
+
try {
|
|
320
|
+
// Close all active connections
|
|
321
|
+
this.connectionManager.closeAllConnections();
|
|
322
|
+
|
|
323
|
+
// Clear all sessions
|
|
324
|
+
this.sessionManager.clearAllSessions();
|
|
325
|
+
|
|
326
|
+
// Clean up adaptive logger to prevent hanging timers
|
|
327
|
+
adaptiveLogger.destroy();
|
|
328
|
+
|
|
329
|
+
// Destroy all components to clean up their resources
|
|
330
|
+
await this.destroy();
|
|
331
|
+
|
|
332
|
+
// Close servers
|
|
333
|
+
const closePromises: Promise<void>[] = [];
|
|
334
|
+
|
|
335
|
+
if (this.server) {
|
|
336
|
+
closePromises.push(
|
|
337
|
+
new Promise<void>((resolve, reject) => {
|
|
338
|
+
if (!this.server) {
|
|
339
|
+
resolve();
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
this.server.close((err) => {
|
|
344
|
+
if (err) {
|
|
345
|
+
reject(err);
|
|
346
|
+
} else {
|
|
347
|
+
resolve();
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
})
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (this.secureServer) {
|
|
355
|
+
closePromises.push(
|
|
356
|
+
new Promise<void>((resolve, reject) => {
|
|
357
|
+
if (!this.secureServer) {
|
|
358
|
+
resolve();
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
this.secureServer.close((err) => {
|
|
363
|
+
if (err) {
|
|
364
|
+
reject(err);
|
|
365
|
+
} else {
|
|
366
|
+
resolve();
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
})
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Add timeout to prevent hanging on close
|
|
374
|
+
await Promise.race([
|
|
375
|
+
Promise.all(closePromises),
|
|
376
|
+
new Promise<void>((resolve) => {
|
|
377
|
+
setTimeout(() => {
|
|
378
|
+
SmtpLogger.warn('Server close timed out after 3 seconds, forcing shutdown');
|
|
379
|
+
resolve();
|
|
380
|
+
}, 3000);
|
|
381
|
+
})
|
|
382
|
+
]);
|
|
383
|
+
|
|
384
|
+
this.server = null;
|
|
385
|
+
this.secureServer = null;
|
|
386
|
+
this.running = false;
|
|
387
|
+
|
|
388
|
+
SmtpLogger.info('SMTP server stopped');
|
|
389
|
+
} catch (error) {
|
|
390
|
+
SmtpLogger.error(`Error stopping SMTP server: ${error instanceof Error ? error.message : String(error)}`, {
|
|
391
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
throw error;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Get the session manager
|
|
400
|
+
* @returns Session manager instance
|
|
401
|
+
*/
|
|
402
|
+
public getSessionManager(): ISessionManager {
|
|
403
|
+
return this.sessionManager;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Get the connection manager
|
|
408
|
+
* @returns Connection manager instance
|
|
409
|
+
*/
|
|
410
|
+
public getConnectionManager(): IConnectionManager {
|
|
411
|
+
return this.connectionManager;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Get the command handler
|
|
416
|
+
* @returns Command handler instance
|
|
417
|
+
*/
|
|
418
|
+
public getCommandHandler(): ICommandHandler {
|
|
419
|
+
return this.commandHandler;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Get the data handler
|
|
424
|
+
* @returns Data handler instance
|
|
425
|
+
*/
|
|
426
|
+
public getDataHandler(): IDataHandler {
|
|
427
|
+
return this.dataHandler;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Get the TLS handler
|
|
432
|
+
* @returns TLS handler instance
|
|
433
|
+
*/
|
|
434
|
+
public getTlsHandler(): ITlsHandler {
|
|
435
|
+
return this.tlsHandler;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Get the security handler
|
|
440
|
+
* @returns Security handler instance
|
|
441
|
+
*/
|
|
442
|
+
public getSecurityHandler(): ISecurityHandler {
|
|
443
|
+
return this.securityHandler;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Get the server options
|
|
448
|
+
* @returns SMTP server options
|
|
449
|
+
*/
|
|
450
|
+
public getOptions(): ISmtpServerOptions {
|
|
451
|
+
return this.options;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Get the email server reference
|
|
456
|
+
* @returns Email server instance
|
|
457
|
+
*/
|
|
458
|
+
public getEmailServer(): UnifiedEmailServer {
|
|
459
|
+
return this.emailServer;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Check if the server is running
|
|
464
|
+
* @returns Whether the server is running
|
|
465
|
+
*/
|
|
466
|
+
public isRunning(): boolean {
|
|
467
|
+
return this.running;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Check if we should attempt to recover from an error
|
|
472
|
+
* @param error - The error that occurred
|
|
473
|
+
* @returns Whether recovery should be attempted
|
|
474
|
+
*/
|
|
475
|
+
private shouldAttemptRecovery(error: Error): boolean {
|
|
476
|
+
// Skip recovery if we're already in recovery mode
|
|
477
|
+
if (this.recoveryState.recovering) {
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// Check if we've reached the maximum number of recovery attempts
|
|
482
|
+
if (this.recoveryState.currentRecoveryAttempt >= this.recoveryState.maxRecoveryAttempts) {
|
|
483
|
+
SmtpLogger.warn('Maximum recovery attempts reached, not attempting further recovery');
|
|
484
|
+
return false;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// Check if enough time has passed since the last recovery attempt
|
|
488
|
+
const now = Date.now();
|
|
489
|
+
if (now - this.recoveryState.lastRecoveryAttempt < this.recoveryState.recoveryCooldown) {
|
|
490
|
+
SmtpLogger.warn('Recovery cooldown period not elapsed, skipping recovery attempt');
|
|
491
|
+
return false;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Recoverable errors include:
|
|
495
|
+
// - EADDRINUSE: Address already in use (port conflict)
|
|
496
|
+
// - ECONNRESET: Connection reset by peer
|
|
497
|
+
// - EPIPE: Broken pipe
|
|
498
|
+
// - ETIMEDOUT: Connection timed out
|
|
499
|
+
const recoverableErrors = [
|
|
500
|
+
'EADDRINUSE',
|
|
501
|
+
'ECONNRESET',
|
|
502
|
+
'EPIPE',
|
|
503
|
+
'ETIMEDOUT',
|
|
504
|
+
'ECONNABORTED',
|
|
505
|
+
'EPROTO',
|
|
506
|
+
'EMFILE' // Too many open files
|
|
507
|
+
];
|
|
508
|
+
|
|
509
|
+
// Check if this is a recoverable error
|
|
510
|
+
const errorCode = (error as any).code;
|
|
511
|
+
return recoverableErrors.includes(errorCode);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Attempt to recover the server after a critical error
|
|
516
|
+
* @param serverType - The type of server to recover ('standard' or 'secure')
|
|
517
|
+
* @param error - The error that triggered recovery
|
|
518
|
+
*/
|
|
519
|
+
private async attemptServerRecovery(serverType: 'standard' | 'secure', error: Error): Promise<void> {
|
|
520
|
+
// Set recovery flag to prevent multiple simultaneous recovery attempts
|
|
521
|
+
if (this.recoveryState.recovering) {
|
|
522
|
+
SmtpLogger.warn('Recovery already in progress, skipping new recovery attempt');
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
this.recoveryState.recovering = true;
|
|
527
|
+
this.recoveryState.lastRecoveryAttempt = Date.now();
|
|
528
|
+
this.recoveryState.currentRecoveryAttempt++;
|
|
529
|
+
|
|
530
|
+
SmtpLogger.info(`Attempting server recovery for ${serverType} server after error: ${error.message}`, {
|
|
531
|
+
attempt: this.recoveryState.currentRecoveryAttempt,
|
|
532
|
+
maxAttempts: this.recoveryState.maxRecoveryAttempts,
|
|
533
|
+
errorCode: (error as any).code
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
try {
|
|
537
|
+
// Determine which server to restart
|
|
538
|
+
const isStandardServer = serverType === 'standard';
|
|
539
|
+
|
|
540
|
+
// Close the affected server
|
|
541
|
+
if (isStandardServer && this.server) {
|
|
542
|
+
await new Promise<void>((resolve) => {
|
|
543
|
+
if (!this.server) {
|
|
544
|
+
resolve();
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// First try a clean shutdown
|
|
549
|
+
this.server.close((err) => {
|
|
550
|
+
if (err) {
|
|
551
|
+
SmtpLogger.warn(`Error during server close in recovery: ${err.message}`);
|
|
552
|
+
}
|
|
553
|
+
resolve();
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
// Set a timeout to force close
|
|
557
|
+
setTimeout(() => {
|
|
558
|
+
resolve();
|
|
559
|
+
}, 3000);
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
this.server = null;
|
|
563
|
+
} else if (!isStandardServer && this.secureServer) {
|
|
564
|
+
await new Promise<void>((resolve) => {
|
|
565
|
+
if (!this.secureServer) {
|
|
566
|
+
resolve();
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// First try a clean shutdown
|
|
571
|
+
this.secureServer.close((err) => {
|
|
572
|
+
if (err) {
|
|
573
|
+
SmtpLogger.warn(`Error during secure server close in recovery: ${err.message}`);
|
|
574
|
+
}
|
|
575
|
+
resolve();
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
// Set a timeout to force close
|
|
579
|
+
setTimeout(() => {
|
|
580
|
+
resolve();
|
|
581
|
+
}, 3000);
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
this.secureServer = null;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// Short delay before restarting
|
|
588
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 1000));
|
|
589
|
+
|
|
590
|
+
// Clean up any lingering connections
|
|
591
|
+
this.connectionManager.closeAllConnections();
|
|
592
|
+
this.sessionManager.clearAllSessions();
|
|
593
|
+
|
|
594
|
+
// Restart the affected server
|
|
595
|
+
if (isStandardServer) {
|
|
596
|
+
// Create and start the standard server
|
|
597
|
+
this.server = plugins.net.createServer((socket) => {
|
|
598
|
+
// Check IP reputation before handling connection
|
|
599
|
+
this.securityHandler.checkIpReputation(socket)
|
|
600
|
+
.then(allowed => {
|
|
601
|
+
if (allowed) {
|
|
602
|
+
this.connectionManager.handleNewConnection(socket);
|
|
603
|
+
} else {
|
|
604
|
+
// Close connection if IP is not allowed
|
|
605
|
+
socket.destroy();
|
|
606
|
+
}
|
|
607
|
+
})
|
|
608
|
+
.catch(error => {
|
|
609
|
+
SmtpLogger.error(`IP reputation check error: ${error instanceof Error ? error.message : String(error)}`, {
|
|
610
|
+
remoteAddress: socket.remoteAddress,
|
|
611
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
// Allow connection on error (fail open)
|
|
615
|
+
this.connectionManager.handleNewConnection(socket);
|
|
616
|
+
});
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
// Set up error handling with recovery
|
|
620
|
+
this.server.on('error', (err) => {
|
|
621
|
+
SmtpLogger.error(`SMTP server error after recovery: ${err.message}`, { error: err });
|
|
622
|
+
|
|
623
|
+
// Try to recover again if needed
|
|
624
|
+
if (this.shouldAttemptRecovery(err)) {
|
|
625
|
+
this.attemptServerRecovery('standard', err);
|
|
626
|
+
}
|
|
627
|
+
});
|
|
628
|
+
|
|
629
|
+
// Start listening again
|
|
630
|
+
await new Promise<void>((resolve, reject) => {
|
|
631
|
+
if (!this.server) {
|
|
632
|
+
reject(new Error('Server not initialized during recovery'));
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
this.server.listen(this.options.port, this.options.host, () => {
|
|
637
|
+
SmtpLogger.info(`SMTP server recovered and listening on ${this.options.host || '0.0.0.0'}:${this.options.port}`);
|
|
638
|
+
resolve();
|
|
639
|
+
});
|
|
640
|
+
|
|
641
|
+
// Only use error event for startup issues during recovery
|
|
642
|
+
this.server.once('error', (err) => {
|
|
643
|
+
SmtpLogger.error(`Failed to restart server during recovery: ${err.message}`);
|
|
644
|
+
reject(err);
|
|
645
|
+
});
|
|
646
|
+
});
|
|
647
|
+
} else if (this.options.securePort && this.tlsHandler.isTlsEnabled()) {
|
|
648
|
+
// Try to recreate the secure server
|
|
649
|
+
try {
|
|
650
|
+
// Import the secure server creation utility
|
|
651
|
+
const { createSecureTlsServer } = await import('./secure-server.js');
|
|
652
|
+
|
|
653
|
+
// Create secure server with the certificates
|
|
654
|
+
this.secureServer = createSecureTlsServer({
|
|
655
|
+
key: this.options.key,
|
|
656
|
+
cert: this.options.cert,
|
|
657
|
+
ca: this.options.ca
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
if (this.secureServer) {
|
|
661
|
+
SmtpLogger.info(`Created secure TLS server for port ${this.options.securePort} during recovery`);
|
|
662
|
+
|
|
663
|
+
// Use explicit error handling for secure connections
|
|
664
|
+
this.secureServer.on('tlsClientError', (err, tlsSocket) => {
|
|
665
|
+
SmtpLogger.error(`TLS client error after recovery: ${err.message}`, {
|
|
666
|
+
error: err,
|
|
667
|
+
remoteAddress: tlsSocket.remoteAddress,
|
|
668
|
+
remotePort: tlsSocket.remotePort,
|
|
669
|
+
stack: err.stack
|
|
670
|
+
});
|
|
671
|
+
});
|
|
672
|
+
|
|
673
|
+
// Register the secure connection handler
|
|
674
|
+
this.secureServer.on('secureConnection', (socket) => {
|
|
675
|
+
// Check IP reputation before handling connection
|
|
676
|
+
this.securityHandler.checkIpReputation(socket)
|
|
677
|
+
.then(allowed => {
|
|
678
|
+
if (allowed) {
|
|
679
|
+
// Pass the connection to the connection manager
|
|
680
|
+
this.connectionManager.handleNewSecureConnection(socket);
|
|
681
|
+
} else {
|
|
682
|
+
// Close connection if IP is not allowed
|
|
683
|
+
socket.destroy();
|
|
684
|
+
}
|
|
685
|
+
})
|
|
686
|
+
.catch(error => {
|
|
687
|
+
SmtpLogger.error(`IP reputation check error after recovery: ${error instanceof Error ? error.message : String(error)}`, {
|
|
688
|
+
remoteAddress: socket.remoteAddress,
|
|
689
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
690
|
+
});
|
|
691
|
+
|
|
692
|
+
// Allow connection on error (fail open)
|
|
693
|
+
this.connectionManager.handleNewSecureConnection(socket);
|
|
694
|
+
});
|
|
695
|
+
});
|
|
696
|
+
|
|
697
|
+
// Global error handler for the secure server with recovery
|
|
698
|
+
this.secureServer.on('error', (err) => {
|
|
699
|
+
SmtpLogger.error(`SMTP secure server error after recovery: ${err.message}`, {
|
|
700
|
+
error: err,
|
|
701
|
+
stack: err.stack
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
// Try to recover again if needed
|
|
705
|
+
if (this.shouldAttemptRecovery(err)) {
|
|
706
|
+
this.attemptServerRecovery('secure', err);
|
|
707
|
+
}
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
// Start listening on secure port again
|
|
711
|
+
await new Promise<void>((resolve, reject) => {
|
|
712
|
+
if (!this.secureServer) {
|
|
713
|
+
reject(new Error('Secure server not initialized during recovery'));
|
|
714
|
+
return;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
this.secureServer.listen(this.options.securePort, this.options.host, () => {
|
|
718
|
+
SmtpLogger.info(`SMTP secure server recovered and listening on ${this.options.host || '0.0.0.0'}:${this.options.securePort}`);
|
|
719
|
+
resolve();
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
// Only use error event for startup issues during recovery
|
|
723
|
+
this.secureServer.once('error', (err) => {
|
|
724
|
+
SmtpLogger.error(`Failed to restart secure server during recovery: ${err.message}`);
|
|
725
|
+
reject(err);
|
|
726
|
+
});
|
|
727
|
+
});
|
|
728
|
+
} else {
|
|
729
|
+
SmtpLogger.warn('Failed to create secure server during recovery');
|
|
730
|
+
}
|
|
731
|
+
} catch (error) {
|
|
732
|
+
SmtpLogger.error(`Error setting up secure server during recovery: ${error instanceof Error ? error.message : String(error)}`);
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// Recovery successful
|
|
737
|
+
SmtpLogger.info('Server recovery completed successfully');
|
|
738
|
+
|
|
739
|
+
} catch (recoveryError) {
|
|
740
|
+
SmtpLogger.error(`Server recovery failed: ${recoveryError instanceof Error ? recoveryError.message : String(recoveryError)}`, {
|
|
741
|
+
error: recoveryError instanceof Error ? recoveryError : new Error(String(recoveryError)),
|
|
742
|
+
attempt: this.recoveryState.currentRecoveryAttempt,
|
|
743
|
+
maxAttempts: this.recoveryState.maxRecoveryAttempts
|
|
744
|
+
});
|
|
745
|
+
} finally {
|
|
746
|
+
// Reset recovery flag
|
|
747
|
+
this.recoveryState.recovering = false;
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/**
|
|
752
|
+
* Clean up all component resources
|
|
753
|
+
*/
|
|
754
|
+
public async destroy(): Promise<void> {
|
|
755
|
+
SmtpLogger.info('Destroying SMTP server components');
|
|
756
|
+
|
|
757
|
+
// Destroy all components in parallel
|
|
758
|
+
const destroyPromises: Promise<void>[] = [];
|
|
759
|
+
|
|
760
|
+
if (this.sessionManager && typeof this.sessionManager.destroy === 'function') {
|
|
761
|
+
destroyPromises.push(Promise.resolve(this.sessionManager.destroy()));
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
if (this.connectionManager && typeof this.connectionManager.destroy === 'function') {
|
|
765
|
+
destroyPromises.push(Promise.resolve(this.connectionManager.destroy()));
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
if (this.commandHandler && typeof this.commandHandler.destroy === 'function') {
|
|
769
|
+
destroyPromises.push(Promise.resolve(this.commandHandler.destroy()));
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
if (this.dataHandler && typeof this.dataHandler.destroy === 'function') {
|
|
773
|
+
destroyPromises.push(Promise.resolve(this.dataHandler.destroy()));
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
if (this.tlsHandler && typeof this.tlsHandler.destroy === 'function') {
|
|
777
|
+
destroyPromises.push(Promise.resolve(this.tlsHandler.destroy()));
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
if (this.securityHandler && typeof this.securityHandler.destroy === 'function') {
|
|
781
|
+
destroyPromises.push(Promise.resolve(this.securityHandler.destroy()));
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
await Promise.all(destroyPromises);
|
|
785
|
+
|
|
786
|
+
// Destroy the adaptive logger singleton to clean up its timer
|
|
787
|
+
const { adaptiveLogger } = await import('./utils/adaptive-logging.js');
|
|
788
|
+
if (adaptiveLogger && typeof adaptiveLogger.destroy === 'function') {
|
|
789
|
+
adaptiveLogger.destroy();
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// Clear recovery state
|
|
793
|
+
this.recoveryState = {
|
|
794
|
+
recovering: false,
|
|
795
|
+
connectionFailures: 0,
|
|
796
|
+
lastRecoveryAttempt: 0,
|
|
797
|
+
recoveryCooldown: 5000,
|
|
798
|
+
maxRecoveryAttempts: 3,
|
|
799
|
+
currentRecoveryAttempt: 0
|
|
800
|
+
};
|
|
801
|
+
|
|
802
|
+
SmtpLogger.info('All SMTP server components destroyed');
|
|
803
|
+
}
|
|
804
|
+
}
|