@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,399 @@
|
|
|
1
|
+
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
|
2
|
+
import * as plugins from '../../../ts/plugins.js';
|
|
3
|
+
import * as net from 'net';
|
|
4
|
+
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js'
|
|
5
|
+
import type { ITestServer } from '../../helpers/server.loader.js';
|
|
6
|
+
|
|
7
|
+
const TEST_PORT = 2525;
|
|
8
|
+
let testServer: ITestServer;
|
|
9
|
+
|
|
10
|
+
// Helper function to wait for SMTP response
|
|
11
|
+
const waitForResponse = (socket: net.Socket, expectedCode?: string, timeout = 5000): Promise<string> => {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
let buffer = '';
|
|
14
|
+
const timer = setTimeout(() => {
|
|
15
|
+
socket.removeListener('data', handler);
|
|
16
|
+
reject(new Error(`Timeout waiting for ${expectedCode || 'any'} response`));
|
|
17
|
+
}, timeout);
|
|
18
|
+
|
|
19
|
+
const handler = (data: Buffer) => {
|
|
20
|
+
buffer += data.toString();
|
|
21
|
+
const lines = buffer.split('\r\n');
|
|
22
|
+
|
|
23
|
+
// Check if we have a complete response
|
|
24
|
+
for (const line of lines) {
|
|
25
|
+
if (expectedCode) {
|
|
26
|
+
if (line.startsWith(expectedCode + ' ')) {
|
|
27
|
+
clearTimeout(timer);
|
|
28
|
+
socket.removeListener('data', handler);
|
|
29
|
+
resolve(buffer);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
// Any complete response line
|
|
34
|
+
if (line.match(/^\d{3} /)) {
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
socket.removeListener('data', handler);
|
|
37
|
+
resolve(buffer);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
socket.on('data', handler);
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
tap.test('setup - start test server', async (toolsArg) => {
|
|
49
|
+
testServer = await startTestServer({ port: TEST_PORT });
|
|
50
|
+
await toolsArg.delayFor(1000);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
tap.test('RFC 3461 DSN - DSN extension advertised', async (tools) => {
|
|
54
|
+
const done = tools.defer();
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const socket = net.createConnection({
|
|
58
|
+
host: 'localhost',
|
|
59
|
+
port: TEST_PORT,
|
|
60
|
+
timeout: 30000
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await new Promise<void>((resolve, reject) => {
|
|
64
|
+
socket.once('connect', resolve);
|
|
65
|
+
socket.once('error', reject);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Read greeting
|
|
69
|
+
const greeting = await waitForResponse(socket, '220');
|
|
70
|
+
console.log('Server response:', greeting);
|
|
71
|
+
|
|
72
|
+
// Send EHLO
|
|
73
|
+
socket.write('EHLO testclient\r\n');
|
|
74
|
+
const ehloResponse = await waitForResponse(socket, '250');
|
|
75
|
+
console.log('Server response:', ehloResponse);
|
|
76
|
+
|
|
77
|
+
// Check if DSN extension is advertised
|
|
78
|
+
const advertisesDsn = ehloResponse.toLowerCase().includes('dsn');
|
|
79
|
+
console.log('DSN extension advertised:', advertisesDsn);
|
|
80
|
+
|
|
81
|
+
// Parse extensions
|
|
82
|
+
const lines = ehloResponse.split('\r\n');
|
|
83
|
+
const extensions = lines
|
|
84
|
+
.filter(line => line.startsWith('250-') || (line.startsWith('250 ') && lines.indexOf(line) > 0))
|
|
85
|
+
.map(line => line.substring(4).split(' ')[0].toUpperCase());
|
|
86
|
+
|
|
87
|
+
console.log('Server extensions:', extensions);
|
|
88
|
+
|
|
89
|
+
socket.write('QUIT\r\n');
|
|
90
|
+
await waitForResponse(socket, '221');
|
|
91
|
+
socket.end();
|
|
92
|
+
done.resolve();
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error('Socket error:', error);
|
|
95
|
+
done.reject(error);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
tap.test('RFC 3461 DSN - MAIL FROM with DSN parameters', async (tools) => {
|
|
100
|
+
const done = tools.defer();
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
const socket = net.createConnection({
|
|
104
|
+
host: 'localhost',
|
|
105
|
+
port: TEST_PORT,
|
|
106
|
+
timeout: 30000
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
await new Promise<void>((resolve, reject) => {
|
|
110
|
+
socket.once('connect', resolve);
|
|
111
|
+
socket.once('error', reject);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Read greeting
|
|
115
|
+
const greeting = await waitForResponse(socket, '220');
|
|
116
|
+
console.log('Server response:', greeting);
|
|
117
|
+
|
|
118
|
+
// Send EHLO
|
|
119
|
+
socket.write('EHLO testclient\r\n');
|
|
120
|
+
const ehloResponse = await waitForResponse(socket, '250');
|
|
121
|
+
console.log('Server response:', ehloResponse);
|
|
122
|
+
|
|
123
|
+
// Test MAIL FROM with DSN parameters (RFC 3461)
|
|
124
|
+
socket.write('MAIL FROM:<sender@example.com> RET=FULL ENVID=test-envelope-123\r\n');
|
|
125
|
+
const mailResponse = await waitForResponse(socket);
|
|
126
|
+
console.log('Server response:', mailResponse);
|
|
127
|
+
|
|
128
|
+
// Server should either accept (250) or reject with proper error
|
|
129
|
+
const accepted = mailResponse.includes('250');
|
|
130
|
+
const properlyRejected = mailResponse.includes('501') || mailResponse.includes('555');
|
|
131
|
+
|
|
132
|
+
expect(accepted || properlyRejected).toEqual(true);
|
|
133
|
+
console.log(`DSN parameters in MAIL FROM ${accepted ? 'accepted' : 'rejected'}`);
|
|
134
|
+
|
|
135
|
+
if (accepted) {
|
|
136
|
+
// Reset to test other parameters
|
|
137
|
+
socket.write('RSET\r\n');
|
|
138
|
+
const resetResponse = await waitForResponse(socket, '250');
|
|
139
|
+
console.log('Server response:', resetResponse);
|
|
140
|
+
|
|
141
|
+
// Test with RET=HDRS
|
|
142
|
+
socket.write('MAIL FROM:<sender@example.com> RET=HDRS\r\n');
|
|
143
|
+
const mailHdrsResponse = await waitForResponse(socket);
|
|
144
|
+
console.log('Server response:', mailHdrsResponse);
|
|
145
|
+
|
|
146
|
+
const hdrsAccepted = mailHdrsResponse.includes('250');
|
|
147
|
+
console.log(`RET=HDRS parameter ${hdrsAccepted ? 'accepted' : 'rejected'}`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
socket.write('QUIT\r\n');
|
|
151
|
+
await waitForResponse(socket, '221');
|
|
152
|
+
socket.end();
|
|
153
|
+
done.resolve();
|
|
154
|
+
} catch (error) {
|
|
155
|
+
console.error('Socket error:', error);
|
|
156
|
+
done.reject(error);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
tap.test('RFC 3461 DSN - RCPT TO with DSN parameters', async (tools) => {
|
|
161
|
+
const done = tools.defer();
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
const socket = net.createConnection({
|
|
165
|
+
host: 'localhost',
|
|
166
|
+
port: TEST_PORT,
|
|
167
|
+
timeout: 30000
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
await new Promise<void>((resolve, reject) => {
|
|
171
|
+
socket.once('connect', resolve);
|
|
172
|
+
socket.once('error', reject);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Read greeting
|
|
176
|
+
const greeting = await waitForResponse(socket, '220');
|
|
177
|
+
console.log('Server response:', greeting);
|
|
178
|
+
|
|
179
|
+
// Send EHLO
|
|
180
|
+
socket.write('EHLO testclient\r\n');
|
|
181
|
+
const ehloResponse = await waitForResponse(socket, '250');
|
|
182
|
+
console.log('Server response:', ehloResponse);
|
|
183
|
+
|
|
184
|
+
// Send MAIL FROM
|
|
185
|
+
socket.write('MAIL FROM:<sender@example.com>\r\n');
|
|
186
|
+
const mailResponse = await waitForResponse(socket, '250');
|
|
187
|
+
console.log('Server response:', mailResponse);
|
|
188
|
+
|
|
189
|
+
// Test RCPT TO with DSN parameters
|
|
190
|
+
socket.write('RCPT TO:<recipient@example.com> NOTIFY=SUCCESS,FAILURE ORCPT=rfc822;recipient@example.com\r\n');
|
|
191
|
+
const rcptResponse = await waitForResponse(socket);
|
|
192
|
+
console.log('Server response:', rcptResponse);
|
|
193
|
+
|
|
194
|
+
// Server should either accept (250) or reject with proper error
|
|
195
|
+
const accepted = rcptResponse.includes('250');
|
|
196
|
+
const properlyRejected = rcptResponse.includes('501') || rcptResponse.includes('555');
|
|
197
|
+
|
|
198
|
+
expect(accepted || properlyRejected).toEqual(true);
|
|
199
|
+
console.log(`DSN parameters in RCPT TO ${accepted ? 'accepted' : 'rejected'}`);
|
|
200
|
+
|
|
201
|
+
if (accepted) {
|
|
202
|
+
// Reset to test other notify values
|
|
203
|
+
socket.write('RSET\r\n');
|
|
204
|
+
const resetResponse = await waitForResponse(socket, '250');
|
|
205
|
+
console.log('Server response:', resetResponse);
|
|
206
|
+
|
|
207
|
+
// Send MAIL FROM again
|
|
208
|
+
socket.write('MAIL FROM:<sender@example.com>\r\n');
|
|
209
|
+
const mail2Response = await waitForResponse(socket, '250');
|
|
210
|
+
console.log('Server response:', mail2Response);
|
|
211
|
+
|
|
212
|
+
// Test NOTIFY=NEVER
|
|
213
|
+
socket.write('RCPT TO:<recipient@example.com> NOTIFY=NEVER\r\n');
|
|
214
|
+
const rcptNeverResponse = await waitForResponse(socket);
|
|
215
|
+
console.log('Server response:', rcptNeverResponse);
|
|
216
|
+
|
|
217
|
+
const neverAccepted = rcptNeverResponse.includes('250');
|
|
218
|
+
console.log(`NOTIFY=NEVER parameter ${neverAccepted ? 'accepted' : 'rejected'}`);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
socket.write('QUIT\r\n');
|
|
222
|
+
await waitForResponse(socket, '221');
|
|
223
|
+
socket.end();
|
|
224
|
+
done.resolve();
|
|
225
|
+
} catch (error) {
|
|
226
|
+
console.error('Socket error:', error);
|
|
227
|
+
done.reject(error);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
tap.test('RFC 3461 DSN - Complete DSN-enabled email', async (tools) => {
|
|
232
|
+
const done = tools.defer();
|
|
233
|
+
|
|
234
|
+
const socket = net.createConnection({
|
|
235
|
+
host: 'localhost',
|
|
236
|
+
port: TEST_PORT,
|
|
237
|
+
timeout: 30000
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
socket.on('error', (err) => {
|
|
241
|
+
console.error('Socket error:', err);
|
|
242
|
+
done.reject(err);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
socket.on('connect', async () => {
|
|
246
|
+
try {
|
|
247
|
+
// Wait for greeting
|
|
248
|
+
await waitForResponse(socket, '220');
|
|
249
|
+
|
|
250
|
+
// Send EHLO
|
|
251
|
+
socket.write('EHLO testclient\r\n');
|
|
252
|
+
await waitForResponse(socket, '250');
|
|
253
|
+
|
|
254
|
+
// Try with DSN parameters
|
|
255
|
+
socket.write('MAIL FROM:<sender@example.com> RET=FULL ENVID=test123\r\n');
|
|
256
|
+
const mailResponse = await waitForResponse(socket);
|
|
257
|
+
|
|
258
|
+
if (mailResponse.includes('250')) {
|
|
259
|
+
// DSN parameters accepted, continue with DSN RCPT
|
|
260
|
+
socket.write('RCPT TO:<recipient@example.com> NOTIFY=SUCCESS,FAILURE,DELAY\r\n');
|
|
261
|
+
const rcptResponse = await waitForResponse(socket);
|
|
262
|
+
|
|
263
|
+
if (!rcptResponse.includes('250')) {
|
|
264
|
+
// Fallback to plain RCPT if DSN parameters not supported
|
|
265
|
+
console.log('DSN RCPT parameters not supported, using plain RCPT TO');
|
|
266
|
+
socket.write('RCPT TO:<recipient@example.com>\r\n');
|
|
267
|
+
await waitForResponse(socket, '250');
|
|
268
|
+
}
|
|
269
|
+
} else if (mailResponse.includes('501') || mailResponse.includes('555')) {
|
|
270
|
+
// DSN not supported, use plain MAIL FROM
|
|
271
|
+
console.log('DSN parameters not supported, using plain MAIL FROM');
|
|
272
|
+
socket.write('MAIL FROM:<sender@example.com>\r\n');
|
|
273
|
+
await waitForResponse(socket, '250');
|
|
274
|
+
|
|
275
|
+
socket.write('RCPT TO:<recipient@example.com>\r\n');
|
|
276
|
+
await waitForResponse(socket, '250');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Send DATA
|
|
280
|
+
socket.write('DATA\r\n');
|
|
281
|
+
await waitForResponse(socket, '354');
|
|
282
|
+
|
|
283
|
+
// Send email content
|
|
284
|
+
const email = [
|
|
285
|
+
`From: sender@example.com`,
|
|
286
|
+
`To: recipient@example.com`,
|
|
287
|
+
`Subject: RFC 3461 DSN Compliance Test`,
|
|
288
|
+
`Date: ${new Date().toUTCString()}`,
|
|
289
|
+
`Message-ID: <dsn-test-${Date.now()}@example.com>`,
|
|
290
|
+
'',
|
|
291
|
+
'This email tests RFC 3461 DSN (Delivery Status Notification) compliance.',
|
|
292
|
+
'The server should handle DSN parameters according to RFC 3461.',
|
|
293
|
+
'.',
|
|
294
|
+
''
|
|
295
|
+
].join('\r\n');
|
|
296
|
+
|
|
297
|
+
socket.write(email);
|
|
298
|
+
await waitForResponse(socket, '250');
|
|
299
|
+
|
|
300
|
+
console.log('DSN-enabled email accepted');
|
|
301
|
+
|
|
302
|
+
// Quit
|
|
303
|
+
socket.write('QUIT\r\n');
|
|
304
|
+
await waitForResponse(socket, '221');
|
|
305
|
+
|
|
306
|
+
socket.end();
|
|
307
|
+
done.resolve();
|
|
308
|
+
} catch (err) {
|
|
309
|
+
console.error('Test error:', err);
|
|
310
|
+
socket.end();
|
|
311
|
+
done.reject(err);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
await done.promise;
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
tap.test('RFC 3461 DSN - Invalid DSN parameter handling', async (tools) => {
|
|
319
|
+
const done = tools.defer();
|
|
320
|
+
|
|
321
|
+
const socket = net.createConnection({
|
|
322
|
+
host: 'localhost',
|
|
323
|
+
port: TEST_PORT,
|
|
324
|
+
timeout: 30000
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
socket.on('error', (err) => {
|
|
328
|
+
console.error('Socket error:', err);
|
|
329
|
+
done.reject(err);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
socket.on('connect', async () => {
|
|
333
|
+
try {
|
|
334
|
+
// Wait for greeting
|
|
335
|
+
await waitForResponse(socket, '220');
|
|
336
|
+
|
|
337
|
+
// Send EHLO
|
|
338
|
+
socket.write('EHLO testclient\r\n');
|
|
339
|
+
await waitForResponse(socket, '250');
|
|
340
|
+
|
|
341
|
+
// Test with invalid RET value
|
|
342
|
+
socket.write('MAIL FROM:<sender@example.com> RET=INVALID\r\n');
|
|
343
|
+
const mailResponse = await waitForResponse(socket);
|
|
344
|
+
|
|
345
|
+
// Should reject with 501 or similar
|
|
346
|
+
const properlyRejected = mailResponse.includes('501') ||
|
|
347
|
+
mailResponse.includes('555') ||
|
|
348
|
+
mailResponse.includes('500');
|
|
349
|
+
|
|
350
|
+
if (properlyRejected) {
|
|
351
|
+
console.log('Invalid RET parameter properly rejected');
|
|
352
|
+
expect(true).toEqual(true);
|
|
353
|
+
} else if (mailResponse.includes('250')) {
|
|
354
|
+
// Server ignores unknown parameters (also acceptable)
|
|
355
|
+
console.log('Server ignores invalid DSN parameters');
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Reset and test invalid NOTIFY
|
|
359
|
+
socket.write('RSET\r\n');
|
|
360
|
+
await waitForResponse(socket, '250');
|
|
361
|
+
|
|
362
|
+
socket.write('MAIL FROM:<sender@example.com>\r\n');
|
|
363
|
+
await waitForResponse(socket, '250');
|
|
364
|
+
|
|
365
|
+
// Test with invalid NOTIFY value
|
|
366
|
+
socket.write('RCPT TO:<recipient@example.com> NOTIFY=INVALID\r\n');
|
|
367
|
+
const rcptResponse = await waitForResponse(socket);
|
|
368
|
+
|
|
369
|
+
const rcptRejected = rcptResponse.includes('501') ||
|
|
370
|
+
rcptResponse.includes('555') ||
|
|
371
|
+
rcptResponse.includes('500');
|
|
372
|
+
|
|
373
|
+
if (rcptRejected) {
|
|
374
|
+
console.log('Invalid NOTIFY parameter properly rejected');
|
|
375
|
+
} else if (rcptResponse.includes('250')) {
|
|
376
|
+
console.log('Server ignores invalid NOTIFY parameter');
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Quit
|
|
380
|
+
socket.write('QUIT\r\n');
|
|
381
|
+
await waitForResponse(socket, '221');
|
|
382
|
+
|
|
383
|
+
socket.end();
|
|
384
|
+
done.resolve();
|
|
385
|
+
} catch (err) {
|
|
386
|
+
console.error('Test error:', err);
|
|
387
|
+
socket.end();
|
|
388
|
+
done.reject(err);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
await done.promise;
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
tap.test('cleanup - stop test server', async () => {
|
|
396
|
+
await stopTestServer(testServer);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
export default tap.start();
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
|
2
|
+
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
|
3
|
+
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection } from '../../helpers/utils.js';
|
|
4
|
+
|
|
5
|
+
let testServer: ITestServer;
|
|
6
|
+
|
|
7
|
+
tap.test('setup - start SMTP server with authentication', async () => {
|
|
8
|
+
testServer = await startTestServer({
|
|
9
|
+
port: 2530,
|
|
10
|
+
hostname: 'localhost',
|
|
11
|
+
authRequired: true
|
|
12
|
+
});
|
|
13
|
+
expect(testServer).toBeInstanceOf(Object);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
tap.test('SEC-01: Authentication - server advertises AUTH capability', async () => {
|
|
17
|
+
const socket = await connectToSmtp(testServer.hostname, testServer.port);
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
await waitForGreeting(socket);
|
|
21
|
+
|
|
22
|
+
// Send EHLO to get capabilities
|
|
23
|
+
const ehloResponse = await sendSmtpCommand(socket, 'EHLO test.example.com', '250');
|
|
24
|
+
|
|
25
|
+
// Parse capabilities
|
|
26
|
+
const lines = ehloResponse.split('\r\n').filter(line => line.length > 0);
|
|
27
|
+
const capabilities = lines.map(line => line.substring(4).trim());
|
|
28
|
+
|
|
29
|
+
// Check for AUTH capability
|
|
30
|
+
const authCapability = capabilities.find(cap => cap.startsWith('AUTH'));
|
|
31
|
+
expect(authCapability).toBeDefined();
|
|
32
|
+
|
|
33
|
+
// Extract supported mechanisms
|
|
34
|
+
const supportedMechanisms = authCapability?.substring(5).split(' ') || [];
|
|
35
|
+
console.log('📋 Supported AUTH mechanisms:', supportedMechanisms);
|
|
36
|
+
|
|
37
|
+
// Common mechanisms should be supported
|
|
38
|
+
expect(supportedMechanisms).toContain('PLAIN');
|
|
39
|
+
expect(supportedMechanisms).toContain('LOGIN');
|
|
40
|
+
|
|
41
|
+
console.log('✅ AUTH capability test passed');
|
|
42
|
+
|
|
43
|
+
} finally {
|
|
44
|
+
await closeSmtpConnection(socket);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
tap.test('SEC-01: AUTH PLAIN mechanism - correct credentials', async () => {
|
|
49
|
+
const socket = await connectToSmtp(testServer.hostname, testServer.port);
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
await waitForGreeting(socket);
|
|
53
|
+
await sendSmtpCommand(socket, 'EHLO test.example.com', '250');
|
|
54
|
+
|
|
55
|
+
// Create AUTH PLAIN credentials
|
|
56
|
+
// Format: base64(NULL + username + NULL + password)
|
|
57
|
+
const username = 'testuser';
|
|
58
|
+
const password = 'testpass';
|
|
59
|
+
const authString = Buffer.from(`\0${username}\0${password}`).toString('base64');
|
|
60
|
+
|
|
61
|
+
// Send AUTH PLAIN command
|
|
62
|
+
try {
|
|
63
|
+
const authResponse = await sendSmtpCommand(socket, `AUTH PLAIN ${authString}`);
|
|
64
|
+
// Server might accept (235) or reject (535) based on configuration
|
|
65
|
+
expect(authResponse).toMatch(/^(235|535)/);
|
|
66
|
+
|
|
67
|
+
if (authResponse.startsWith('235')) {
|
|
68
|
+
console.log('✅ AUTH PLAIN accepted (test mode)');
|
|
69
|
+
} else {
|
|
70
|
+
console.log('✅ AUTH PLAIN properly rejected (production mode)');
|
|
71
|
+
}
|
|
72
|
+
} catch (error) {
|
|
73
|
+
// Auth failure is expected in test environment
|
|
74
|
+
console.log('✅ AUTH PLAIN handled:', error.message);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
} finally {
|
|
78
|
+
await closeSmtpConnection(socket);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
tap.test('SEC-01: AUTH LOGIN mechanism - interactive authentication', async () => {
|
|
83
|
+
const socket = await connectToSmtp(testServer.hostname, testServer.port);
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
await waitForGreeting(socket);
|
|
87
|
+
await sendSmtpCommand(socket, 'EHLO test.example.com', '250');
|
|
88
|
+
|
|
89
|
+
// Start AUTH LOGIN
|
|
90
|
+
try {
|
|
91
|
+
const authStartResponse = await sendSmtpCommand(socket, 'AUTH LOGIN', '334');
|
|
92
|
+
expect(authStartResponse).toInclude('334');
|
|
93
|
+
|
|
94
|
+
// Server should prompt for username (base64 "Username:")
|
|
95
|
+
const usernamePrompt = Buffer.from(
|
|
96
|
+
authStartResponse.substring(4).trim(),
|
|
97
|
+
'base64'
|
|
98
|
+
).toString();
|
|
99
|
+
console.log('Server prompt:', usernamePrompt);
|
|
100
|
+
|
|
101
|
+
// Send username
|
|
102
|
+
const username = Buffer.from('testuser').toString('base64');
|
|
103
|
+
const passwordPromptResponse = await sendSmtpCommand(socket, username, '334');
|
|
104
|
+
|
|
105
|
+
// Send password
|
|
106
|
+
const password = Buffer.from('testpass').toString('base64');
|
|
107
|
+
const authResult = await sendSmtpCommand(socket, password);
|
|
108
|
+
|
|
109
|
+
// Check result (235 = success, 535 = failure)
|
|
110
|
+
expect(authResult).toMatch(/^(235|535)/);
|
|
111
|
+
|
|
112
|
+
} catch (error) {
|
|
113
|
+
// Auth failure is expected in test environment
|
|
114
|
+
console.log('✅ AUTH LOGIN handled:', error.message);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
} finally {
|
|
118
|
+
await closeSmtpConnection(socket);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
tap.test('SEC-01: Authentication required - reject commands without auth', async () => {
|
|
123
|
+
const socket = await connectToSmtp(testServer.hostname, testServer.port);
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
await waitForGreeting(socket);
|
|
127
|
+
await sendSmtpCommand(socket, 'EHLO test.example.com', '250');
|
|
128
|
+
|
|
129
|
+
// Try to send email without authentication
|
|
130
|
+
try {
|
|
131
|
+
const mailResponse = await sendSmtpCommand(socket, 'MAIL FROM:<test@example.com>');
|
|
132
|
+
|
|
133
|
+
// Server should reject with 530 (authentication required) or similar
|
|
134
|
+
if (mailResponse.startsWith('530') || mailResponse.startsWith('503')) {
|
|
135
|
+
console.log('✅ Server properly requires authentication');
|
|
136
|
+
} else if (mailResponse.startsWith('250')) {
|
|
137
|
+
console.log('⚠️ Server accepted mail without auth (test mode)');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
} catch (error) {
|
|
141
|
+
// Command rejection is expected
|
|
142
|
+
console.log('✅ Server rejected unauthenticated command:', error.message);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
} finally {
|
|
146
|
+
await closeSmtpConnection(socket);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
tap.test('SEC-01: Invalid authentication attempts - rate limiting', async () => {
|
|
151
|
+
const socket = await connectToSmtp(testServer.hostname, testServer.port);
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
await waitForGreeting(socket);
|
|
155
|
+
await sendSmtpCommand(socket, 'EHLO test.example.com', '250');
|
|
156
|
+
|
|
157
|
+
// Try multiple failed authentication attempts
|
|
158
|
+
const maxAttempts = 5;
|
|
159
|
+
let failedAttempts = 0;
|
|
160
|
+
let requiresTLS = false;
|
|
161
|
+
|
|
162
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
163
|
+
try {
|
|
164
|
+
// Send invalid credentials
|
|
165
|
+
const invalidAuth = Buffer.from('\0invalid\0wrong').toString('base64');
|
|
166
|
+
const response = await sendSmtpCommand(socket, `AUTH PLAIN ${invalidAuth}`);
|
|
167
|
+
|
|
168
|
+
// Check if authentication failed
|
|
169
|
+
if (response.startsWith('535')) {
|
|
170
|
+
failedAttempts++;
|
|
171
|
+
console.log(`Failed attempt ${i + 1}: ${response.trim()}`);
|
|
172
|
+
|
|
173
|
+
// Check if server requires TLS (common security practice)
|
|
174
|
+
if (response.includes('TLS')) {
|
|
175
|
+
requiresTLS = true;
|
|
176
|
+
console.log('✅ Server enforces TLS requirement for authentication');
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
} else if (response.startsWith('503')) {
|
|
180
|
+
// Too many failed attempts
|
|
181
|
+
failedAttempts++;
|
|
182
|
+
console.log('✅ Server enforces auth attempt limits');
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
} catch (error) {
|
|
186
|
+
// Handle connection errors
|
|
187
|
+
failedAttempts++;
|
|
188
|
+
console.log(`Failed attempt ${i + 1}: ${error.message}`);
|
|
189
|
+
|
|
190
|
+
// Check if server closed connection or rate limited
|
|
191
|
+
if (error.message.includes('closed') || error.message.includes('timeout')) {
|
|
192
|
+
console.log('✅ Server enforces auth attempt limits by closing connection');
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Either TLS is required or we had failed attempts
|
|
199
|
+
expect(failedAttempts).toBeGreaterThan(0);
|
|
200
|
+
if (requiresTLS) {
|
|
201
|
+
console.log('✅ Authentication properly protected by TLS requirement');
|
|
202
|
+
} else {
|
|
203
|
+
console.log(`✅ Handled ${failedAttempts} failed auth attempts`);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
} finally {
|
|
207
|
+
if (!socket.destroyed) {
|
|
208
|
+
socket.destroy();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
tap.test('cleanup - stop SMTP server', async () => {
|
|
214
|
+
await stopTestServer(testServer);
|
|
215
|
+
console.log('✅ Test server stopped');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
export default tap.start();
|