@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.
Files changed (737) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitea/workflows/docker_nottags.yaml +71 -0
  3. package/.gitea/workflows/docker_tags.yaml +106 -0
  4. package/.vscode/launch.json +11 -0
  5. package/.vscode/settings.json +26 -0
  6. package/Dockerfile +46 -0
  7. package/changelog.md +247 -0
  8. package/cli.child.js +4 -0
  9. package/cli.child.ts +4 -0
  10. package/cli.js +4 -0
  11. package/cli.ts.js +5 -0
  12. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  13. package/dist_ts/00_commitinfo_data.js +9 -0
  14. package/dist_ts/classes.dcrouter.d.ts +238 -0
  15. package/dist_ts/classes.dcrouter.js +1008 -0
  16. package/dist_ts/config/index.d.ts +1 -0
  17. package/dist_ts/config/index.js +3 -0
  18. package/dist_ts/config/validator.d.ts +104 -0
  19. package/dist_ts/config/validator.js +152 -0
  20. package/dist_ts/deliverability/classes.ipwarmupmanager.d.ts +253 -0
  21. package/dist_ts/deliverability/classes.ipwarmupmanager.js +639 -0
  22. package/dist_ts/deliverability/classes.senderreputationmonitor.d.ts +300 -0
  23. package/dist_ts/deliverability/classes.senderreputationmonitor.js +961 -0
  24. package/dist_ts/deliverability/index.d.ts +2 -0
  25. package/dist_ts/deliverability/index.js +3 -0
  26. package/dist_ts/errors/base.errors.d.ts +224 -0
  27. package/dist_ts/errors/base.errors.js +310 -0
  28. package/dist_ts/errors/email.errors.d.ts +175 -0
  29. package/dist_ts/errors/email.errors.js +265 -0
  30. package/dist_ts/errors/error-handler.d.ts +98 -0
  31. package/dist_ts/errors/error-handler.js +282 -0
  32. package/dist_ts/errors/error.codes.d.ts +115 -0
  33. package/dist_ts/errors/error.codes.js +136 -0
  34. package/dist_ts/errors/index.d.ts +56 -0
  35. package/dist_ts/errors/index.js +138 -0
  36. package/dist_ts/errors/mta.errors.d.ts +259 -0
  37. package/dist_ts/errors/mta.errors.js +472 -0
  38. package/dist_ts/errors/reputation.errors.d.ts +183 -0
  39. package/dist_ts/errors/reputation.errors.js +292 -0
  40. package/dist_ts/index.d.ts +4 -0
  41. package/dist_ts/index.js +6 -0
  42. package/dist_ts/logger.d.ts +17 -0
  43. package/dist_ts/logger.js +77 -0
  44. package/dist_ts/mail/core/classes.bouncemanager.d.ts +200 -0
  45. package/dist_ts/mail/core/classes.bouncemanager.js +778 -0
  46. package/dist_ts/mail/core/classes.email.d.ts +291 -0
  47. package/dist_ts/mail/core/classes.email.js +780 -0
  48. package/dist_ts/mail/core/classes.emailvalidator.d.ts +61 -0
  49. package/dist_ts/mail/core/classes.emailvalidator.js +182 -0
  50. package/dist_ts/mail/core/classes.templatemanager.d.ts +95 -0
  51. package/dist_ts/mail/core/classes.templatemanager.js +239 -0
  52. package/dist_ts/mail/core/index.d.ts +4 -0
  53. package/dist_ts/mail/core/index.js +6 -0
  54. package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +163 -0
  55. package/dist_ts/mail/delivery/classes.delivery.queue.js +485 -0
  56. package/dist_ts/mail/delivery/classes.delivery.system.d.ts +186 -0
  57. package/dist_ts/mail/delivery/classes.delivery.system.js +846 -0
  58. package/dist_ts/mail/delivery/classes.emailsendjob.d.ts +84 -0
  59. package/dist_ts/mail/delivery/classes.emailsendjob.js +362 -0
  60. package/dist_ts/mail/delivery/classes.emailsignjob.d.ts +18 -0
  61. package/dist_ts/mail/delivery/classes.emailsignjob.js +44 -0
  62. package/dist_ts/mail/delivery/classes.mta.config.d.ts +22 -0
  63. package/dist_ts/mail/delivery/classes.mta.config.js +51 -0
  64. package/dist_ts/mail/delivery/classes.ratelimiter.d.ts +98 -0
  65. package/dist_ts/mail/delivery/classes.ratelimiter.js +205 -0
  66. package/dist_ts/mail/delivery/classes.smtp.client.legacy.d.ts +275 -0
  67. package/dist_ts/mail/delivery/classes.smtp.client.legacy.js +973 -0
  68. package/dist_ts/mail/delivery/classes.unified.rate.limiter.d.ts +200 -0
  69. package/dist_ts/mail/delivery/classes.unified.rate.limiter.js +817 -0
  70. package/dist_ts/mail/delivery/index.d.ts +12 -0
  71. package/dist_ts/mail/delivery/index.js +18 -0
  72. package/dist_ts/mail/delivery/interfaces.d.ts +243 -0
  73. package/dist_ts/mail/delivery/interfaces.js +17 -0
  74. package/dist_ts/mail/delivery/smtpclient/auth-handler.d.ts +43 -0
  75. package/dist_ts/mail/delivery/smtpclient/auth-handler.js +188 -0
  76. package/dist_ts/mail/delivery/smtpclient/command-handler.d.ts +67 -0
  77. package/dist_ts/mail/delivery/smtpclient/command-handler.js +276 -0
  78. package/dist_ts/mail/delivery/smtpclient/connection-manager.d.ts +48 -0
  79. package/dist_ts/mail/delivery/smtpclient/connection-manager.js +238 -0
  80. package/dist_ts/mail/delivery/smtpclient/constants.d.ts +129 -0
  81. package/dist_ts/mail/delivery/smtpclient/constants.js +135 -0
  82. package/dist_ts/mail/delivery/smtpclient/create-client.d.ts +22 -0
  83. package/dist_ts/mail/delivery/smtpclient/create-client.js +86 -0
  84. package/dist_ts/mail/delivery/smtpclient/error-handler.d.ts +28 -0
  85. package/dist_ts/mail/delivery/smtpclient/error-handler.js +110 -0
  86. package/dist_ts/mail/delivery/smtpclient/index.d.ts +16 -0
  87. package/dist_ts/mail/delivery/smtpclient/index.js +21 -0
  88. package/dist_ts/mail/delivery/smtpclient/interfaces.d.ts +183 -0
  89. package/dist_ts/mail/delivery/smtpclient/interfaces.js +19 -0
  90. package/dist_ts/mail/delivery/smtpclient/smtp-client.d.ts +58 -0
  91. package/dist_ts/mail/delivery/smtpclient/smtp-client.js +279 -0
  92. package/dist_ts/mail/delivery/smtpclient/tls-handler.d.ts +33 -0
  93. package/dist_ts/mail/delivery/smtpclient/tls-handler.js +202 -0
  94. package/dist_ts/mail/delivery/smtpclient/utils/helpers.d.ts +77 -0
  95. package/dist_ts/mail/delivery/smtpclient/utils/helpers.js +196 -0
  96. package/dist_ts/mail/delivery/smtpclient/utils/logging.d.ts +46 -0
  97. package/dist_ts/mail/delivery/smtpclient/utils/logging.js +153 -0
  98. package/dist_ts/mail/delivery/smtpclient/utils/validation.d.ts +38 -0
  99. package/dist_ts/mail/delivery/smtpclient/utils/validation.js +139 -0
  100. package/dist_ts/mail/delivery/smtpserver/certificate-utils.d.ts +45 -0
  101. package/dist_ts/mail/delivery/smtpserver/certificate-utils.js +345 -0
  102. package/dist_ts/mail/delivery/smtpserver/command-handler.d.ts +156 -0
  103. package/dist_ts/mail/delivery/smtpserver/command-handler.js +1159 -0
  104. package/dist_ts/mail/delivery/smtpserver/connection-manager.d.ts +159 -0
  105. package/dist_ts/mail/delivery/smtpserver/connection-manager.js +894 -0
  106. package/dist_ts/mail/delivery/smtpserver/constants.d.ts +130 -0
  107. package/dist_ts/mail/delivery/smtpserver/constants.js +162 -0
  108. package/dist_ts/mail/delivery/smtpserver/create-server.d.ts +14 -0
  109. package/dist_ts/mail/delivery/smtpserver/create-server.js +28 -0
  110. package/dist_ts/mail/delivery/smtpserver/data-handler.d.ts +123 -0
  111. package/dist_ts/mail/delivery/smtpserver/data-handler.js +1148 -0
  112. package/dist_ts/mail/delivery/smtpserver/index.d.ts +20 -0
  113. package/dist_ts/mail/delivery/smtpserver/index.js +27 -0
  114. package/dist_ts/mail/delivery/smtpserver/interfaces.d.ts +530 -0
  115. package/dist_ts/mail/delivery/smtpserver/interfaces.js +10 -0
  116. package/dist_ts/mail/delivery/smtpserver/secure-server.d.ts +15 -0
  117. package/dist_ts/mail/delivery/smtpserver/secure-server.js +79 -0
  118. package/dist_ts/mail/delivery/smtpserver/security-handler.d.ts +86 -0
  119. package/dist_ts/mail/delivery/smtpserver/security-handler.js +234 -0
  120. package/dist_ts/mail/delivery/smtpserver/session-manager.d.ts +140 -0
  121. package/dist_ts/mail/delivery/smtpserver/session-manager.js +469 -0
  122. package/dist_ts/mail/delivery/smtpserver/smtp-server.d.ts +137 -0
  123. package/dist_ts/mail/delivery/smtpserver/smtp-server.js +666 -0
  124. package/dist_ts/mail/delivery/smtpserver/starttls-handler.d.ts +21 -0
  125. package/dist_ts/mail/delivery/smtpserver/starttls-handler.js +207 -0
  126. package/dist_ts/mail/delivery/smtpserver/tls-handler.d.ts +66 -0
  127. package/dist_ts/mail/delivery/smtpserver/tls-handler.js +261 -0
  128. package/dist_ts/mail/delivery/smtpserver/utils/adaptive-logging.d.ts +117 -0
  129. package/dist_ts/mail/delivery/smtpserver/utils/adaptive-logging.js +411 -0
  130. package/dist_ts/mail/delivery/smtpserver/utils/helpers.d.ts +78 -0
  131. package/dist_ts/mail/delivery/smtpserver/utils/helpers.js +208 -0
  132. package/dist_ts/mail/delivery/smtpserver/utils/logging.d.ts +106 -0
  133. package/dist_ts/mail/delivery/smtpserver/utils/logging.js +181 -0
  134. package/dist_ts/mail/delivery/smtpserver/utils/validation.d.ts +69 -0
  135. package/dist_ts/mail/delivery/smtpserver/utils/validation.js +360 -0
  136. package/dist_ts/mail/index.d.ts +8 -0
  137. package/dist_ts/mail/index.js +13 -0
  138. package/dist_ts/mail/routing/classes.dns.manager.d.ts +65 -0
  139. package/dist_ts/mail/routing/classes.dns.manager.js +413 -0
  140. package/dist_ts/mail/routing/classes.dnsmanager.d.ts +165 -0
  141. package/dist_ts/mail/routing/classes.dnsmanager.js +430 -0
  142. package/dist_ts/mail/routing/classes.domain.registry.d.ts +54 -0
  143. package/dist_ts/mail/routing/classes.domain.registry.js +118 -0
  144. package/dist_ts/mail/routing/classes.email.config.d.ts +64 -0
  145. package/dist_ts/mail/routing/classes.email.config.js +2 -0
  146. package/dist_ts/mail/routing/classes.email.router.d.ts +171 -0
  147. package/dist_ts/mail/routing/classes.email.router.js +491 -0
  148. package/dist_ts/mail/routing/classes.unified.email.server.d.ts +426 -0
  149. package/dist_ts/mail/routing/classes.unified.email.server.js +1454 -0
  150. package/dist_ts/mail/routing/index.d.ts +5 -0
  151. package/dist_ts/mail/routing/index.js +7 -0
  152. package/dist_ts/mail/routing/interfaces.d.ts +187 -0
  153. package/dist_ts/mail/routing/interfaces.js +2 -0
  154. package/dist_ts/mail/security/classes.dkimcreator.d.ts +68 -0
  155. package/dist_ts/mail/security/classes.dkimcreator.js +346 -0
  156. package/dist_ts/mail/security/classes.dkimverifier.d.ts +46 -0
  157. package/dist_ts/mail/security/classes.dkimverifier.js +317 -0
  158. package/dist_ts/mail/security/classes.dmarcverifier.d.ts +123 -0
  159. package/dist_ts/mail/security/classes.dmarcverifier.js +365 -0
  160. package/dist_ts/mail/security/classes.spfverifier.d.ts +103 -0
  161. package/dist_ts/mail/security/classes.spfverifier.js +492 -0
  162. package/dist_ts/mail/security/index.d.ts +4 -0
  163. package/dist_ts/mail/security/index.js +6 -0
  164. package/dist_ts/opsserver/classes.opsserver.d.ts +14 -0
  165. package/dist_ts/opsserver/classes.opsserver.js +37 -0
  166. package/dist_ts/opsserver/index.d.ts +1 -0
  167. package/dist_ts/opsserver/index.js +2 -0
  168. package/dist_ts/paths.d.ts +14 -0
  169. package/dist_ts/paths.js +39 -0
  170. package/dist_ts/plugins.d.ts +43 -0
  171. package/dist_ts/plugins.js +50 -0
  172. package/dist_ts/security/classes.contentscanner.d.ts +160 -0
  173. package/dist_ts/security/classes.contentscanner.js +634 -0
  174. package/dist_ts/security/classes.ipreputationchecker.d.ts +150 -0
  175. package/dist_ts/security/classes.ipreputationchecker.js +508 -0
  176. package/dist_ts/security/classes.securitylogger.d.ts +140 -0
  177. package/dist_ts/security/classes.securitylogger.js +232 -0
  178. package/dist_ts/security/index.d.ts +3 -0
  179. package/dist_ts/security/index.js +4 -0
  180. package/dist_ts/sms/classes.smsservice.d.ts +15 -0
  181. package/dist_ts/sms/classes.smsservice.js +72 -0
  182. package/dist_ts/sms/config/sms.config.d.ts +93 -0
  183. package/dist_ts/sms/config/sms.config.js +2 -0
  184. package/dist_ts/sms/config/sms.schema.d.ts +5 -0
  185. package/dist_ts/sms/config/sms.schema.js +121 -0
  186. package/dist_ts/sms/index.d.ts +1 -0
  187. package/dist_ts/sms/index.js +2 -0
  188. package/dist_ts/storage/classes.storagemanager.d.ts +82 -0
  189. package/dist_ts/storage/classes.storagemanager.js +341 -0
  190. package/dist_ts/storage/index.d.ts +1 -0
  191. package/dist_ts/storage/index.js +3 -0
  192. package/dist_ts/ts/00_commitinfo_data.d.ts +8 -0
  193. package/dist_ts/ts/00_commitinfo_data.js +9 -0
  194. package/dist_ts/ts/classes.dcrouter.d.ts +238 -0
  195. package/dist_ts/ts/classes.dcrouter.js +1008 -0
  196. package/dist_ts/ts/config/index.d.ts +1 -0
  197. package/dist_ts/ts/config/index.js +3 -0
  198. package/dist_ts/ts/config/validator.d.ts +104 -0
  199. package/dist_ts/ts/config/validator.js +152 -0
  200. package/dist_ts/ts/deliverability/classes.ipwarmupmanager.d.ts +253 -0
  201. package/dist_ts/ts/deliverability/classes.ipwarmupmanager.js +639 -0
  202. package/dist_ts/ts/deliverability/classes.senderreputationmonitor.d.ts +300 -0
  203. package/dist_ts/ts/deliverability/classes.senderreputationmonitor.js +961 -0
  204. package/dist_ts/ts/deliverability/index.d.ts +2 -0
  205. package/dist_ts/ts/deliverability/index.js +3 -0
  206. package/dist_ts/ts/errors/base.errors.d.ts +224 -0
  207. package/dist_ts/ts/errors/base.errors.js +310 -0
  208. package/dist_ts/ts/errors/email.errors.d.ts +175 -0
  209. package/dist_ts/ts/errors/email.errors.js +265 -0
  210. package/dist_ts/ts/errors/error-handler.d.ts +98 -0
  211. package/dist_ts/ts/errors/error-handler.js +282 -0
  212. package/dist_ts/ts/errors/error.codes.d.ts +115 -0
  213. package/dist_ts/ts/errors/error.codes.js +136 -0
  214. package/dist_ts/ts/errors/index.d.ts +56 -0
  215. package/dist_ts/ts/errors/index.js +138 -0
  216. package/dist_ts/ts/errors/mta.errors.d.ts +259 -0
  217. package/dist_ts/ts/errors/mta.errors.js +472 -0
  218. package/dist_ts/ts/errors/reputation.errors.d.ts +183 -0
  219. package/dist_ts/ts/errors/reputation.errors.js +292 -0
  220. package/dist_ts/ts/index.d.ts +4 -0
  221. package/dist_ts/ts/index.js +6 -0
  222. package/dist_ts/ts/logger.d.ts +17 -0
  223. package/dist_ts/ts/logger.js +77 -0
  224. package/dist_ts/ts/mail/core/classes.bouncemanager.d.ts +200 -0
  225. package/dist_ts/ts/mail/core/classes.bouncemanager.js +778 -0
  226. package/dist_ts/ts/mail/core/classes.email.d.ts +291 -0
  227. package/dist_ts/ts/mail/core/classes.email.js +780 -0
  228. package/dist_ts/ts/mail/core/classes.emailvalidator.d.ts +61 -0
  229. package/dist_ts/ts/mail/core/classes.emailvalidator.js +182 -0
  230. package/dist_ts/ts/mail/core/classes.templatemanager.d.ts +95 -0
  231. package/dist_ts/ts/mail/core/classes.templatemanager.js +239 -0
  232. package/dist_ts/ts/mail/core/index.d.ts +4 -0
  233. package/dist_ts/ts/mail/core/index.js +6 -0
  234. package/dist_ts/ts/mail/delivery/classes.delivery.queue.d.ts +163 -0
  235. package/dist_ts/ts/mail/delivery/classes.delivery.queue.js +485 -0
  236. package/dist_ts/ts/mail/delivery/classes.delivery.system.d.ts +186 -0
  237. package/dist_ts/ts/mail/delivery/classes.delivery.system.js +846 -0
  238. package/dist_ts/ts/mail/delivery/classes.emailsendjob.d.ts +84 -0
  239. package/dist_ts/ts/mail/delivery/classes.emailsendjob.js +362 -0
  240. package/dist_ts/ts/mail/delivery/classes.emailsignjob.d.ts +18 -0
  241. package/dist_ts/ts/mail/delivery/classes.emailsignjob.js +44 -0
  242. package/dist_ts/ts/mail/delivery/classes.mta.config.d.ts +22 -0
  243. package/dist_ts/ts/mail/delivery/classes.mta.config.js +51 -0
  244. package/dist_ts/ts/mail/delivery/classes.ratelimiter.d.ts +98 -0
  245. package/dist_ts/ts/mail/delivery/classes.ratelimiter.js +205 -0
  246. package/dist_ts/ts/mail/delivery/classes.smtp.client.legacy.d.ts +275 -0
  247. package/dist_ts/ts/mail/delivery/classes.smtp.client.legacy.js +973 -0
  248. package/dist_ts/ts/mail/delivery/classes.unified.rate.limiter.d.ts +200 -0
  249. package/dist_ts/ts/mail/delivery/classes.unified.rate.limiter.js +817 -0
  250. package/dist_ts/ts/mail/delivery/index.d.ts +12 -0
  251. package/dist_ts/ts/mail/delivery/index.js +18 -0
  252. package/dist_ts/ts/mail/delivery/interfaces.d.ts +243 -0
  253. package/dist_ts/ts/mail/delivery/interfaces.js +17 -0
  254. package/dist_ts/ts/mail/delivery/smtpclient/auth-handler.d.ts +43 -0
  255. package/dist_ts/ts/mail/delivery/smtpclient/auth-handler.js +188 -0
  256. package/dist_ts/ts/mail/delivery/smtpclient/command-handler.d.ts +67 -0
  257. package/dist_ts/ts/mail/delivery/smtpclient/command-handler.js +276 -0
  258. package/dist_ts/ts/mail/delivery/smtpclient/connection-manager.d.ts +48 -0
  259. package/dist_ts/ts/mail/delivery/smtpclient/connection-manager.js +238 -0
  260. package/dist_ts/ts/mail/delivery/smtpclient/constants.d.ts +129 -0
  261. package/dist_ts/ts/mail/delivery/smtpclient/constants.js +135 -0
  262. package/dist_ts/ts/mail/delivery/smtpclient/create-client.d.ts +22 -0
  263. package/dist_ts/ts/mail/delivery/smtpclient/create-client.js +86 -0
  264. package/dist_ts/ts/mail/delivery/smtpclient/error-handler.d.ts +28 -0
  265. package/dist_ts/ts/mail/delivery/smtpclient/error-handler.js +110 -0
  266. package/dist_ts/ts/mail/delivery/smtpclient/index.d.ts +16 -0
  267. package/dist_ts/ts/mail/delivery/smtpclient/index.js +21 -0
  268. package/dist_ts/ts/mail/delivery/smtpclient/interfaces.d.ts +183 -0
  269. package/dist_ts/ts/mail/delivery/smtpclient/interfaces.js +19 -0
  270. package/dist_ts/ts/mail/delivery/smtpclient/smtp-client.d.ts +58 -0
  271. package/dist_ts/ts/mail/delivery/smtpclient/smtp-client.js +279 -0
  272. package/dist_ts/ts/mail/delivery/smtpclient/tls-handler.d.ts +33 -0
  273. package/dist_ts/ts/mail/delivery/smtpclient/tls-handler.js +202 -0
  274. package/dist_ts/ts/mail/delivery/smtpclient/utils/helpers.d.ts +77 -0
  275. package/dist_ts/ts/mail/delivery/smtpclient/utils/helpers.js +196 -0
  276. package/dist_ts/ts/mail/delivery/smtpclient/utils/logging.d.ts +46 -0
  277. package/dist_ts/ts/mail/delivery/smtpclient/utils/logging.js +153 -0
  278. package/dist_ts/ts/mail/delivery/smtpclient/utils/validation.d.ts +38 -0
  279. package/dist_ts/ts/mail/delivery/smtpclient/utils/validation.js +139 -0
  280. package/dist_ts/ts/mail/delivery/smtpserver/certificate-utils.d.ts +45 -0
  281. package/dist_ts/ts/mail/delivery/smtpserver/certificate-utils.js +345 -0
  282. package/dist_ts/ts/mail/delivery/smtpserver/command-handler.d.ts +156 -0
  283. package/dist_ts/ts/mail/delivery/smtpserver/command-handler.js +1159 -0
  284. package/dist_ts/ts/mail/delivery/smtpserver/connection-manager.d.ts +159 -0
  285. package/dist_ts/ts/mail/delivery/smtpserver/connection-manager.js +894 -0
  286. package/dist_ts/ts/mail/delivery/smtpserver/constants.d.ts +130 -0
  287. package/dist_ts/ts/mail/delivery/smtpserver/constants.js +162 -0
  288. package/dist_ts/ts/mail/delivery/smtpserver/create-server.d.ts +14 -0
  289. package/dist_ts/ts/mail/delivery/smtpserver/create-server.js +28 -0
  290. package/dist_ts/ts/mail/delivery/smtpserver/data-handler.d.ts +123 -0
  291. package/dist_ts/ts/mail/delivery/smtpserver/data-handler.js +1148 -0
  292. package/dist_ts/ts/mail/delivery/smtpserver/index.d.ts +20 -0
  293. package/dist_ts/ts/mail/delivery/smtpserver/index.js +27 -0
  294. package/dist_ts/ts/mail/delivery/smtpserver/interfaces.d.ts +530 -0
  295. package/dist_ts/ts/mail/delivery/smtpserver/interfaces.js +10 -0
  296. package/dist_ts/ts/mail/delivery/smtpserver/secure-server.d.ts +15 -0
  297. package/dist_ts/ts/mail/delivery/smtpserver/secure-server.js +79 -0
  298. package/dist_ts/ts/mail/delivery/smtpserver/security-handler.d.ts +86 -0
  299. package/dist_ts/ts/mail/delivery/smtpserver/security-handler.js +234 -0
  300. package/dist_ts/ts/mail/delivery/smtpserver/session-manager.d.ts +140 -0
  301. package/dist_ts/ts/mail/delivery/smtpserver/session-manager.js +469 -0
  302. package/dist_ts/ts/mail/delivery/smtpserver/smtp-server.d.ts +137 -0
  303. package/dist_ts/ts/mail/delivery/smtpserver/smtp-server.js +666 -0
  304. package/dist_ts/ts/mail/delivery/smtpserver/starttls-handler.d.ts +21 -0
  305. package/dist_ts/ts/mail/delivery/smtpserver/starttls-handler.js +207 -0
  306. package/dist_ts/ts/mail/delivery/smtpserver/tls-handler.d.ts +66 -0
  307. package/dist_ts/ts/mail/delivery/smtpserver/tls-handler.js +261 -0
  308. package/dist_ts/ts/mail/delivery/smtpserver/utils/adaptive-logging.d.ts +117 -0
  309. package/dist_ts/ts/mail/delivery/smtpserver/utils/adaptive-logging.js +411 -0
  310. package/dist_ts/ts/mail/delivery/smtpserver/utils/helpers.d.ts +78 -0
  311. package/dist_ts/ts/mail/delivery/smtpserver/utils/helpers.js +208 -0
  312. package/dist_ts/ts/mail/delivery/smtpserver/utils/logging.d.ts +106 -0
  313. package/dist_ts/ts/mail/delivery/smtpserver/utils/logging.js +181 -0
  314. package/dist_ts/ts/mail/delivery/smtpserver/utils/validation.d.ts +69 -0
  315. package/dist_ts/ts/mail/delivery/smtpserver/utils/validation.js +360 -0
  316. package/dist_ts/ts/mail/index.d.ts +8 -0
  317. package/dist_ts/ts/mail/index.js +13 -0
  318. package/dist_ts/ts/mail/routing/classes.dns.manager.d.ts +65 -0
  319. package/dist_ts/ts/mail/routing/classes.dns.manager.js +413 -0
  320. package/dist_ts/ts/mail/routing/classes.dnsmanager.d.ts +165 -0
  321. package/dist_ts/ts/mail/routing/classes.dnsmanager.js +430 -0
  322. package/dist_ts/ts/mail/routing/classes.domain.registry.d.ts +54 -0
  323. package/dist_ts/ts/mail/routing/classes.domain.registry.js +118 -0
  324. package/dist_ts/ts/mail/routing/classes.email.config.d.ts +64 -0
  325. package/dist_ts/ts/mail/routing/classes.email.config.js +2 -0
  326. package/dist_ts/ts/mail/routing/classes.email.router.d.ts +171 -0
  327. package/dist_ts/ts/mail/routing/classes.email.router.js +491 -0
  328. package/dist_ts/ts/mail/routing/classes.unified.email.server.d.ts +426 -0
  329. package/dist_ts/ts/mail/routing/classes.unified.email.server.js +1454 -0
  330. package/dist_ts/ts/mail/routing/index.d.ts +5 -0
  331. package/dist_ts/ts/mail/routing/index.js +7 -0
  332. package/dist_ts/ts/mail/routing/interfaces.d.ts +187 -0
  333. package/dist_ts/ts/mail/routing/interfaces.js +2 -0
  334. package/dist_ts/ts/mail/security/classes.dkimcreator.d.ts +68 -0
  335. package/dist_ts/ts/mail/security/classes.dkimcreator.js +346 -0
  336. package/dist_ts/ts/mail/security/classes.dkimverifier.d.ts +46 -0
  337. package/dist_ts/ts/mail/security/classes.dkimverifier.js +317 -0
  338. package/dist_ts/ts/mail/security/classes.dmarcverifier.d.ts +123 -0
  339. package/dist_ts/ts/mail/security/classes.dmarcverifier.js +365 -0
  340. package/dist_ts/ts/mail/security/classes.spfverifier.d.ts +103 -0
  341. package/dist_ts/ts/mail/security/classes.spfverifier.js +492 -0
  342. package/dist_ts/ts/mail/security/index.d.ts +4 -0
  343. package/dist_ts/ts/mail/security/index.js +6 -0
  344. package/dist_ts/ts/opsserver/classes.opsserver.d.ts +20 -0
  345. package/dist_ts/ts/opsserver/classes.opsserver.js +44 -0
  346. package/dist_ts/ts/opsserver/handlers/admin.handler.d.ts +31 -0
  347. package/dist_ts/ts/opsserver/handlers/admin.handler.js +177 -0
  348. package/dist_ts/ts/opsserver/handlers/config.handler.d.ts +10 -0
  349. package/dist_ts/ts/opsserver/handlers/config.handler.js +100 -0
  350. package/dist_ts/ts/opsserver/handlers/index.d.ts +5 -0
  351. package/dist_ts/ts/opsserver/handlers/index.js +6 -0
  352. package/dist_ts/ts/opsserver/handlers/logs.handler.d.ts +10 -0
  353. package/dist_ts/ts/opsserver/handlers/logs.handler.js +121 -0
  354. package/dist_ts/ts/opsserver/handlers/security.handler.d.ts +11 -0
  355. package/dist_ts/ts/opsserver/handlers/security.handler.js +118 -0
  356. package/dist_ts/ts/opsserver/handlers/stats.handler.d.ts +13 -0
  357. package/dist_ts/ts/opsserver/handlers/stats.handler.js +233 -0
  358. package/dist_ts/ts/opsserver/helpers/guards.d.ts +25 -0
  359. package/dist_ts/ts/opsserver/helpers/guards.js +41 -0
  360. package/dist_ts/ts/opsserver/index.d.ts +1 -0
  361. package/dist_ts/ts/opsserver/index.js +2 -0
  362. package/dist_ts/ts/paths.d.ts +14 -0
  363. package/dist_ts/ts/paths.js +39 -0
  364. package/dist_ts/ts/plugins.d.ts +46 -0
  365. package/dist_ts/ts/plugins.js +53 -0
  366. package/dist_ts/ts/security/classes.contentscanner.d.ts +160 -0
  367. package/dist_ts/ts/security/classes.contentscanner.js +634 -0
  368. package/dist_ts/ts/security/classes.ipreputationchecker.d.ts +150 -0
  369. package/dist_ts/ts/security/classes.ipreputationchecker.js +508 -0
  370. package/dist_ts/ts/security/classes.securitylogger.d.ts +140 -0
  371. package/dist_ts/ts/security/classes.securitylogger.js +232 -0
  372. package/dist_ts/ts/security/index.d.ts +3 -0
  373. package/dist_ts/ts/security/index.js +4 -0
  374. package/dist_ts/ts/sms/classes.smsservice.d.ts +15 -0
  375. package/dist_ts/ts/sms/classes.smsservice.js +72 -0
  376. package/dist_ts/ts/sms/config/sms.config.d.ts +93 -0
  377. package/dist_ts/ts/sms/config/sms.config.js +2 -0
  378. package/dist_ts/ts/sms/config/sms.schema.d.ts +5 -0
  379. package/dist_ts/ts/sms/config/sms.schema.js +121 -0
  380. package/dist_ts/ts/sms/index.d.ts +1 -0
  381. package/dist_ts/ts/sms/index.js +2 -0
  382. package/dist_ts/ts/storage/classes.storagemanager.d.ts +82 -0
  383. package/dist_ts/ts/storage/classes.storagemanager.js +341 -0
  384. package/dist_ts/ts/storage/index.d.ts +1 -0
  385. package/dist_ts/ts/storage/index.js +3 -0
  386. package/dist_ts/ts_interfaces/data/auth.d.ts +8 -0
  387. package/dist_ts/ts_interfaces/data/auth.js +2 -0
  388. package/dist_ts/ts_interfaces/data/index.d.ts +2 -0
  389. package/dist_ts/ts_interfaces/data/index.js +3 -0
  390. package/dist_ts/ts_interfaces/data/stats.d.ts +93 -0
  391. package/dist_ts/ts_interfaces/data/stats.js +2 -0
  392. package/dist_ts/ts_interfaces/index.d.ts +5 -0
  393. package/dist_ts/ts_interfaces/index.js +8 -0
  394. package/dist_ts/ts_interfaces/plugins.d.ts +2 -0
  395. package/dist_ts/ts_interfaces/plugins.js +4 -0
  396. package/dist_ts/ts_interfaces/requests/admin.d.ts +31 -0
  397. package/dist_ts/ts_interfaces/requests/admin.js +3 -0
  398. package/dist_ts/ts_interfaces/requests/config.d.ts +25 -0
  399. package/dist_ts/ts_interfaces/requests/config.js +3 -0
  400. package/dist_ts/ts_interfaces/requests/index.d.ts +4 -0
  401. package/dist_ts/ts_interfaces/requests/index.js +5 -0
  402. package/dist_ts/ts_interfaces/requests/logs.d.ts +34 -0
  403. package/dist_ts/ts_interfaces/requests/logs.js +4 -0
  404. package/dist_ts/ts_interfaces/requests/stats.d.ts +131 -0
  405. package/dist_ts/ts_interfaces/requests/stats.js +4 -0
  406. package/html/index.html +121 -0
  407. package/npmextra.json +45 -0
  408. package/package.json +83 -0
  409. package/readme.hints.md +906 -0
  410. package/readme.md +1253 -0
  411. package/readme.opsserver.md +351 -0
  412. package/test/helpers/server.loader.ts +347 -0
  413. package/test/helpers/smtp.client.ts +209 -0
  414. package/test/helpers/utils.ts +311 -0
  415. package/test/readme.md +443 -0
  416. package/test/suite/smtpclient_commands/test.ccmd-01.ehlo-helo-sending.ts +168 -0
  417. package/test/suite/smtpclient_commands/test.ccmd-02.mail-from-parameters.ts +277 -0
  418. package/test/suite/smtpclient_commands/test.ccmd-03.rcpt-to-multiple.ts +283 -0
  419. package/test/suite/smtpclient_commands/test.ccmd-04.data-transmission.ts +274 -0
  420. package/test/suite/smtpclient_commands/test.ccmd-05.auth-mechanisms.ts +306 -0
  421. package/test/suite/smtpclient_commands/test.ccmd-06.command-pipelining.ts +233 -0
  422. package/test/suite/smtpclient_commands/test.ccmd-07.response-parsing.ts +243 -0
  423. package/test/suite/smtpclient_commands/test.ccmd-08.rset-command.ts +333 -0
  424. package/test/suite/smtpclient_commands/test.ccmd-09.noop-command.ts +339 -0
  425. package/test/suite/smtpclient_commands/test.ccmd-10.vrfy-expn.ts +457 -0
  426. package/test/suite/smtpclient_commands/test.ccmd-11.help-command.ts +409 -0
  427. package/test/suite/smtpclient_connection/test.ccm-01.basic-tcp-connection.ts +150 -0
  428. package/test/suite/smtpclient_connection/test.ccm-02.tls-connection.ts +140 -0
  429. package/test/suite/smtpclient_connection/test.ccm-03.starttls-upgrade.ts +208 -0
  430. package/test/suite/smtpclient_connection/test.ccm-04.connection-pooling.ts +250 -0
  431. package/test/suite/smtpclient_connection/test.ccm-05.connection-reuse.ts +288 -0
  432. package/test/suite/smtpclient_connection/test.ccm-06.connection-timeout.ts +267 -0
  433. package/test/suite/smtpclient_connection/test.ccm-07.automatic-reconnection.ts +324 -0
  434. package/test/suite/smtpclient_connection/test.ccm-08.dns-resolution.ts +139 -0
  435. package/test/suite/smtpclient_connection/test.ccm-09.ipv6-dual-stack.ts +167 -0
  436. package/test/suite/smtpclient_connection/test.ccm-10.proxy-support.ts +305 -0
  437. package/test/suite/smtpclient_connection/test.ccm-11.keepalive.ts +299 -0
  438. package/test/suite/smtpclient_edge-cases/test.cedge-01.unusual-server-responses.ts +529 -0
  439. package/test/suite/smtpclient_edge-cases/test.cedge-02.malformed-commands.ts +438 -0
  440. package/test/suite/smtpclient_edge-cases/test.cedge-03.protocol-violations.ts +446 -0
  441. package/test/suite/smtpclient_edge-cases/test.cedge-04.resource-constraints.ts +530 -0
  442. package/test/suite/smtpclient_edge-cases/test.cedge-05.encoding-issues.ts +145 -0
  443. package/test/suite/smtpclient_edge-cases/test.cedge-06.large-headers.ts +180 -0
  444. package/test/suite/smtpclient_edge-cases/test.cedge-07.concurrent-operations.ts +204 -0
  445. package/test/suite/smtpclient_email-composition/test.cep-01.basic-headers.ts +245 -0
  446. package/test/suite/smtpclient_email-composition/test.cep-02.mime-multipart.ts +321 -0
  447. package/test/suite/smtpclient_email-composition/test.cep-03.attachment-encoding.ts +334 -0
  448. package/test/suite/smtpclient_email-composition/test.cep-04.bcc-handling.ts +187 -0
  449. package/test/suite/smtpclient_email-composition/test.cep-05.reply-to-return-path.ts +277 -0
  450. package/test/suite/smtpclient_email-composition/test.cep-06.utf8-international.ts +235 -0
  451. package/test/suite/smtpclient_email-composition/test.cep-07.html-inline-images.ts +489 -0
  452. package/test/suite/smtpclient_email-composition/test.cep-08.custom-headers.ts +293 -0
  453. package/test/suite/smtpclient_email-composition/test.cep-09.priority-importance.ts +314 -0
  454. package/test/suite/smtpclient_email-composition/test.cep-10.receipts-dsn.ts +411 -0
  455. package/test/suite/smtpclient_error-handling/test.cerr-01.4xx-errors.ts +232 -0
  456. package/test/suite/smtpclient_error-handling/test.cerr-02.5xx-errors.ts +309 -0
  457. package/test/suite/smtpclient_error-handling/test.cerr-03.network-failures.ts +299 -0
  458. package/test/suite/smtpclient_error-handling/test.cerr-04.greylisting-handling.ts +255 -0
  459. package/test/suite/smtpclient_error-handling/test.cerr-05.quota-exceeded.ts +273 -0
  460. package/test/suite/smtpclient_error-handling/test.cerr-06.invalid-recipients.ts +320 -0
  461. package/test/suite/smtpclient_error-handling/test.cerr-07.message-size-limits.ts +320 -0
  462. package/test/suite/smtpclient_error-handling/test.cerr-08.rate-limiting.ts +261 -0
  463. package/test/suite/smtpclient_error-handling/test.cerr-09.connection-pool-errors.ts +299 -0
  464. package/test/suite/smtpclient_error-handling/test.cerr-10.partial-failure.ts +373 -0
  465. package/test/suite/smtpclient_performance/test.cperf-01.bulk-sending.ts +332 -0
  466. package/test/suite/smtpclient_performance/test.cperf-02.message-throughput.ts +304 -0
  467. package/test/suite/smtpclient_performance/test.cperf-03.memory-usage.ts +332 -0
  468. package/test/suite/smtpclient_performance/test.cperf-04.cpu-utilization.ts +373 -0
  469. package/test/suite/smtpclient_performance/test.cperf-05.network-efficiency.ts +181 -0
  470. package/test/suite/smtpclient_performance/test.cperf-06.caching-strategies.ts +190 -0
  471. package/test/suite/smtpclient_performance/test.cperf-07.queue-management.ts +171 -0
  472. package/test/suite/smtpclient_performance/test.cperf-08.dns-caching.ts +50 -0
  473. package/test/suite/smtpclient_reliability/test.crel-01.reconnection-logic.ts +305 -0
  474. package/test/suite/smtpclient_reliability/test.crel-02.network-interruption.ts +207 -0
  475. package/test/suite/smtpclient_reliability/test.crel-03.queue-persistence.ts +469 -0
  476. package/test/suite/smtpclient_reliability/test.crel-04.crash-recovery.ts +520 -0
  477. package/test/suite/smtpclient_reliability/test.crel-05.memory-leaks.ts +503 -0
  478. package/test/suite/smtpclient_reliability/test.crel-06.concurrency-safety.ts +558 -0
  479. package/test/suite/smtpclient_reliability/test.crel-07.resource-cleanup.ts +52 -0
  480. package/test/suite/smtpclient_rfc-compliance/test.crfc-01.rfc5321-client.ts +283 -0
  481. package/test/suite/smtpclient_rfc-compliance/test.crfc-02.esmtp-compliance.ts +77 -0
  482. package/test/suite/smtpclient_rfc-compliance/test.crfc-03.command-syntax.ts +67 -0
  483. package/test/suite/smtpclient_rfc-compliance/test.crfc-04.response-codes.ts +54 -0
  484. package/test/suite/smtpclient_rfc-compliance/test.crfc-05.state-machine.ts +703 -0
  485. package/test/suite/smtpclient_rfc-compliance/test.crfc-06.protocol-negotiation.ts +688 -0
  486. package/test/suite/smtpclient_rfc-compliance/test.crfc-07.interoperability.ts +728 -0
  487. package/test/suite/smtpclient_rfc-compliance/test.crfc-08.smtp-extensions.ts +656 -0
  488. package/test/suite/smtpclient_security/test.csec-01.tls-verification.ts +88 -0
  489. package/test/suite/smtpclient_security/test.csec-02.oauth2-authentication.ts +132 -0
  490. package/test/suite/smtpclient_security/test.csec-03.dkim-signing.ts +138 -0
  491. package/test/suite/smtpclient_security/test.csec-04.spf-compliance.ts +163 -0
  492. package/test/suite/smtpclient_security/test.csec-05.dmarc-policy.ts +200 -0
  493. package/test/suite/smtpclient_security/test.csec-06.certificate-validation.ts +145 -0
  494. package/test/suite/smtpclient_security/test.csec-07.cipher-suites.ts +153 -0
  495. package/test/suite/smtpclient_security/test.csec-08.authentication-fallback.ts +154 -0
  496. package/test/suite/smtpclient_security/test.csec-09.relay-restrictions.ts +166 -0
  497. package/test/suite/smtpclient_security/test.csec-10.anti-spam-measures.ts +196 -0
  498. package/test/suite/smtpserver_commands/test.cmd-01.ehlo-command.ts +193 -0
  499. package/test/suite/smtpserver_commands/test.cmd-02.mail-from.ts +330 -0
  500. package/test/suite/smtpserver_commands/test.cmd-03.rcpt-to.ts +296 -0
  501. package/test/suite/smtpserver_commands/test.cmd-04.data-command.ts +395 -0
  502. package/test/suite/smtpserver_commands/test.cmd-05.noop-command.ts +320 -0
  503. package/test/suite/smtpserver_commands/test.cmd-06.rset-command.ts +399 -0
  504. package/test/suite/smtpserver_commands/test.cmd-07.vrfy-command.ts +391 -0
  505. package/test/suite/smtpserver_commands/test.cmd-08.expn-command.ts +450 -0
  506. package/test/suite/smtpserver_commands/test.cmd-09.size-extension.ts +465 -0
  507. package/test/suite/smtpserver_commands/test.cmd-10.help-command.ts +454 -0
  508. package/test/suite/smtpserver_commands/test.cmd-11.command-pipelining.ts +334 -0
  509. package/test/suite/smtpserver_commands/test.cmd-12.helo-command.ts +420 -0
  510. package/test/suite/smtpserver_commands/test.cmd-13.quit-command.ts +384 -0
  511. package/test/suite/smtpserver_connection/test.cm-01.tls-connection.ts +61 -0
  512. package/test/suite/smtpserver_connection/test.cm-02.multiple-connections.ts +112 -0
  513. package/test/suite/smtpserver_connection/test.cm-03.connection-timeout.ts +134 -0
  514. package/test/suite/smtpserver_connection/test.cm-04.connection-limits.ts +374 -0
  515. package/test/suite/smtpserver_connection/test.cm-05.connection-rejection.ts +296 -0
  516. package/test/suite/smtpserver_connection/test.cm-06.starttls-upgrade.ts +468 -0
  517. package/test/suite/smtpserver_connection/test.cm-07.abrupt-disconnection.ts +321 -0
  518. package/test/suite/smtpserver_connection/test.cm-08.tls-versions.ts +361 -0
  519. package/test/suite/smtpserver_connection/test.cm-09.tls-ciphers.ts +556 -0
  520. package/test/suite/smtpserver_connection/test.cm-10.plain-connection.ts +293 -0
  521. package/test/suite/smtpserver_connection/test.cm-11.keepalive.ts +382 -0
  522. package/test/suite/smtpserver_edge-cases/test.edge-01.very-large-email.ts +239 -0
  523. package/test/suite/smtpserver_edge-cases/test.edge-02.very-small-email.ts +389 -0
  524. package/test/suite/smtpserver_edge-cases/test.edge-03.invalid-character-handling.ts +479 -0
  525. package/test/suite/smtpserver_edge-cases/test.edge-04.empty-commands.ts +430 -0
  526. package/test/suite/smtpserver_edge-cases/test.edge-05.extremely-long-lines.ts +425 -0
  527. package/test/suite/smtpserver_edge-cases/test.edge-06.extremely-long-headers.ts +404 -0
  528. package/test/suite/smtpserver_edge-cases/test.edge-07.unusual-mime-types.ts +333 -0
  529. package/test/suite/smtpserver_edge-cases/test.edge-08.nested-mime-structures.ts +379 -0
  530. package/test/suite/smtpserver_email-processing/test.ep-01.basic-email-sending.ts +338 -0
  531. package/test/suite/smtpserver_email-processing/test.ep-02.invalid-email-addresses.ts +315 -0
  532. package/test/suite/smtpserver_email-processing/test.ep-03.multiple-recipients.ts +493 -0
  533. package/test/suite/smtpserver_email-processing/test.ep-04.large-email.ts +528 -0
  534. package/test/suite/smtpserver_email-processing/test.ep-05.mime-handling.ts +515 -0
  535. package/test/suite/smtpserver_email-processing/test.ep-06.attachment-handling.ts +629 -0
  536. package/test/suite/smtpserver_email-processing/test.ep-07.special-character-handling.ts +462 -0
  537. package/test/suite/smtpserver_email-processing/test.ep-08.email-routing.ts +527 -0
  538. package/test/suite/smtpserver_email-processing/test.ep-09.delivery-status-notifications.ts +486 -0
  539. package/test/suite/smtpserver_error-handling/test.err-01.syntax-errors.ts +475 -0
  540. package/test/suite/smtpserver_error-handling/test.err-02.invalid-sequence.ts +450 -0
  541. package/test/suite/smtpserver_error-handling/test.err-03.temporary-failures.ts +453 -0
  542. package/test/suite/smtpserver_error-handling/test.err-04.permanent-failures.ts +325 -0
  543. package/test/suite/smtpserver_error-handling/test.err-05.resource-exhaustion.ts +302 -0
  544. package/test/suite/smtpserver_error-handling/test.err-06.malformed-mime.ts +374 -0
  545. package/test/suite/smtpserver_error-handling/test.err-07.exception-handling.ts +333 -0
  546. package/test/suite/smtpserver_error-handling/test.err-08.error-logging.ts +324 -0
  547. package/test/suite/smtpserver_performance/test.perf-01.throughput.ts +183 -0
  548. package/test/suite/smtpserver_performance/test.perf-02.concurrency.ts +388 -0
  549. package/test/suite/smtpserver_performance/test.perf-03.cpu-utilization.ts +245 -0
  550. package/test/suite/smtpserver_performance/test.perf-04.memory-usage.ts +238 -0
  551. package/test/suite/smtpserver_performance/test.perf-05.connection-processing-time.ts +363 -0
  552. package/test/suite/smtpserver_performance/test.perf-06.message-processing-time.ts +252 -0
  553. package/test/suite/smtpserver_performance/test.perf-07.resource-cleanup.ts +317 -0
  554. package/test/suite/smtpserver_reliability/test.rel-01.long-running-operation.ts +344 -0
  555. package/test/suite/smtpserver_reliability/test.rel-02.restart-recovery.ts +328 -0
  556. package/test/suite/smtpserver_reliability/test.rel-03.resource-leak-detection.ts +394 -0
  557. package/test/suite/smtpserver_reliability/test.rel-04.error-recovery.ts +401 -0
  558. package/test/suite/smtpserver_reliability/test.rel-05.dns-resolution-failure.ts +335 -0
  559. package/test/suite/smtpserver_reliability/test.rel-06.network-interruption.ts +410 -0
  560. package/test/suite/smtpserver_rfc-compliance/test.rfc-01.rfc5321-compliance.ts +382 -0
  561. package/test/suite/smtpserver_rfc-compliance/test.rfc-02.rfc5322-compliance.ts +428 -0
  562. package/test/suite/smtpserver_rfc-compliance/test.rfc-03.rfc7208-spf-compliance.ts +330 -0
  563. package/test/suite/smtpserver_rfc-compliance/test.rfc-04.rfc6376-dkim-compliance.ts +450 -0
  564. package/test/suite/smtpserver_rfc-compliance/test.rfc-05.rfc7489-dmarc-compliance.ts +408 -0
  565. package/test/suite/smtpserver_rfc-compliance/test.rfc-06.rfc8314-tls-compliance.ts +366 -0
  566. package/test/suite/smtpserver_rfc-compliance/test.rfc-07.rfc3461-dsn-compliance.ts +399 -0
  567. package/test/suite/smtpserver_security/test.sec-01.authentication.ts +218 -0
  568. package/test/suite/smtpserver_security/test.sec-02.authorization.ts +286 -0
  569. package/test/suite/smtpserver_security/test.sec-03.dkim-processing.ts +414 -0
  570. package/test/suite/smtpserver_security/test.sec-04.spf-checking.ts +280 -0
  571. package/test/suite/smtpserver_security/test.sec-05.dmarc-policy.ts +374 -0
  572. package/test/suite/smtpserver_security/test.sec-06.ip-reputation.ts +303 -0
  573. package/test/suite/smtpserver_security/test.sec-07.content-scanning.ts +409 -0
  574. package/test/suite/smtpserver_security/test.sec-08.rate-limiting.ts +324 -0
  575. package/test/suite/smtpserver_security/test.sec-09.tls-certificate-validation.ts +312 -0
  576. package/test/suite/smtpserver_security/test.sec-10.header-injection-prevention.ts +332 -0
  577. package/test/suite/smtpserver_security/test.sec-11.bounce-management.ts +363 -0
  578. package/test/test.base.ts +65 -0
  579. package/test/test.bouncemanager.ts +196 -0
  580. package/test/test.config.md +175 -0
  581. package/test/test.contentscanner.ts +265 -0
  582. package/test/test.dcrouter.email.ts +201 -0
  583. package/test/test.deliverability.ts +55 -0
  584. package/test/test.dns-manager-creation.ts +141 -0
  585. package/test/test.dns-mode-switching.ts +257 -0
  586. package/test/test.dns-server-config.ts +140 -0
  587. package/test/test.dns-socket-handler.ts +169 -0
  588. package/test/test.dns-validation.ts +283 -0
  589. package/test/test.email-socket-handler.ts +228 -0
  590. package/test/test.email.integration.ts +377 -0
  591. package/test/test.email.router.ts +283 -0
  592. package/test/test.emailauth.ts +195 -0
  593. package/test/test.errors.ts +408 -0
  594. package/test/test.integration.storage.ts +313 -0
  595. package/test/test.integration.ts +75 -0
  596. package/test/test.ipreputationchecker.ts +179 -0
  597. package/test/test.ipwarmupmanager.ts +323 -0
  598. package/test/test.jwt-auth.ts +130 -0
  599. package/test/test.minimal.ts +66 -0
  600. package/test/test.opsserver-api.ts +83 -0
  601. package/test/test.protected-endpoint.ts +115 -0
  602. package/test/test.rate-limiting-integration.ts +236 -0
  603. package/test/test.ratelimiter.ts +141 -0
  604. package/test/test.reputationmonitor.ts +262 -0
  605. package/test/test.smartmail.ts +248 -0
  606. package/test/test.smtp.client.compatibility.ts +154 -0
  607. package/test/test.smtp.client.ts +191 -0
  608. package/test/test.smtp.server.ts +180 -0
  609. package/test/test.socket-handler-integration.ts +240 -0
  610. package/test/test.socket-handler-unit.ts +198 -0
  611. package/test/test.storagemanager.ts +289 -0
  612. package/ts/00_commitinfo_data.ts +8 -0
  613. package/ts/classes.dcrouter.ts +1310 -0
  614. package/ts/config/index.ts +2 -0
  615. package/ts/config/validator.ts +266 -0
  616. package/ts/deliverability/classes.ipwarmupmanager.ts +896 -0
  617. package/ts/deliverability/classes.senderreputationmonitor.ts +1244 -0
  618. package/ts/deliverability/index.ts +13 -0
  619. package/ts/errors/base.errors.ts +525 -0
  620. package/ts/errors/email.errors.ts +383 -0
  621. package/ts/errors/error-handler.ts +412 -0
  622. package/ts/errors/error.codes.ts +165 -0
  623. package/ts/errors/index.ts +195 -0
  624. package/ts/errors/mta.errors.ts +681 -0
  625. package/ts/errors/reputation.errors.ts +422 -0
  626. package/ts/index.ts +7 -0
  627. package/ts/logger.ts +91 -0
  628. package/ts/mail/core/classes.bouncemanager.ts +965 -0
  629. package/ts/mail/core/classes.email.ts +941 -0
  630. package/ts/mail/core/classes.emailvalidator.ts +239 -0
  631. package/ts/mail/core/classes.templatemanager.ts +320 -0
  632. package/ts/mail/core/index.ts +5 -0
  633. package/ts/mail/delivery/classes.delivery.queue.ts +645 -0
  634. package/ts/mail/delivery/classes.delivery.system.ts +1089 -0
  635. package/ts/mail/delivery/classes.emailsendjob.ts +447 -0
  636. package/ts/mail/delivery/classes.emailsendjob.ts.backup +691 -0
  637. package/ts/mail/delivery/classes.emailsignjob.ts +67 -0
  638. package/ts/mail/delivery/classes.mta.config.ts +73 -0
  639. package/ts/mail/delivery/classes.ratelimiter.ts +281 -0
  640. package/ts/mail/delivery/classes.smtp.client.legacy.ts +1422 -0
  641. package/ts/mail/delivery/classes.unified.rate.limiter.ts +1053 -0
  642. package/ts/mail/delivery/index.ts +24 -0
  643. package/ts/mail/delivery/interfaces.ts +291 -0
  644. package/ts/mail/delivery/smtpclient/auth-handler.ts +232 -0
  645. package/ts/mail/delivery/smtpclient/command-handler.ts +343 -0
  646. package/ts/mail/delivery/smtpclient/connection-manager.ts +289 -0
  647. package/ts/mail/delivery/smtpclient/constants.ts +145 -0
  648. package/ts/mail/delivery/smtpclient/create-client.ts +94 -0
  649. package/ts/mail/delivery/smtpclient/error-handler.ts +141 -0
  650. package/ts/mail/delivery/smtpclient/index.ts +24 -0
  651. package/ts/mail/delivery/smtpclient/interfaces.ts +242 -0
  652. package/ts/mail/delivery/smtpclient/smtp-client.ts +357 -0
  653. package/ts/mail/delivery/smtpclient/tls-handler.ts +254 -0
  654. package/ts/mail/delivery/smtpclient/utils/helpers.ts +224 -0
  655. package/ts/mail/delivery/smtpclient/utils/logging.ts +212 -0
  656. package/ts/mail/delivery/smtpclient/utils/validation.ts +170 -0
  657. package/ts/mail/delivery/smtpserver/certificate-utils.ts +398 -0
  658. package/ts/mail/delivery/smtpserver/command-handler.ts +1340 -0
  659. package/ts/mail/delivery/smtpserver/connection-manager.ts +1045 -0
  660. package/ts/mail/delivery/smtpserver/constants.ts +181 -0
  661. package/ts/mail/delivery/smtpserver/create-server.ts +31 -0
  662. package/ts/mail/delivery/smtpserver/data-handler.ts +1283 -0
  663. package/ts/mail/delivery/smtpserver/index.ts +32 -0
  664. package/ts/mail/delivery/smtpserver/interfaces.ts +655 -0
  665. package/ts/mail/delivery/smtpserver/secure-server.ts +97 -0
  666. package/ts/mail/delivery/smtpserver/security-handler.ts +345 -0
  667. package/ts/mail/delivery/smtpserver/session-manager.ts +557 -0
  668. package/ts/mail/delivery/smtpserver/smtp-server.ts +804 -0
  669. package/ts/mail/delivery/smtpserver/starttls-handler.ts +262 -0
  670. package/ts/mail/delivery/smtpserver/tls-handler.ts +346 -0
  671. package/ts/mail/delivery/smtpserver/utils/adaptive-logging.ts +514 -0
  672. package/ts/mail/delivery/smtpserver/utils/helpers.ts +246 -0
  673. package/ts/mail/delivery/smtpserver/utils/logging.ts +246 -0
  674. package/ts/mail/delivery/smtpserver/utils/validation.ts +436 -0
  675. package/ts/mail/index.ts +19 -0
  676. package/ts/mail/routing/classes.dns.manager.ts +563 -0
  677. package/ts/mail/routing/classes.dnsmanager.ts +559 -0
  678. package/ts/mail/routing/classes.domain.registry.ts +139 -0
  679. package/ts/mail/routing/classes.email.config.ts +82 -0
  680. package/ts/mail/routing/classes.email.router.ts +575 -0
  681. package/ts/mail/routing/classes.unified.email.server.ts +1873 -0
  682. package/ts/mail/routing/index.ts +6 -0
  683. package/ts/mail/routing/interfaces.ts +202 -0
  684. package/ts/mail/security/classes.dkimcreator.ts +431 -0
  685. package/ts/mail/security/classes.dkimverifier.ts +382 -0
  686. package/ts/mail/security/classes.dmarcverifier.ts +478 -0
  687. package/ts/mail/security/classes.spfverifier.ts +606 -0
  688. package/ts/mail/security/index.ts +5 -0
  689. package/ts/opsserver/classes.opsserver.ts +65 -0
  690. package/ts/opsserver/handlers/admin.handler.ts +240 -0
  691. package/ts/opsserver/handlers/config.handler.ts +150 -0
  692. package/ts/opsserver/handlers/index.ts +5 -0
  693. package/ts/opsserver/handlers/logs.handler.ts +195 -0
  694. package/ts/opsserver/handlers/security.handler.ts +208 -0
  695. package/ts/opsserver/handlers/stats.handler.ts +344 -0
  696. package/ts/opsserver/helpers/guards.ts +56 -0
  697. package/ts/opsserver/index.ts +1 -0
  698. package/ts/paths.ts +48 -0
  699. package/ts/plugins.ts +94 -0
  700. package/ts/security/classes.contentscanner.ts +739 -0
  701. package/ts/security/classes.ipreputationchecker.ts +592 -0
  702. package/ts/security/classes.securitylogger.ts +299 -0
  703. package/ts/security/index.ts +21 -0
  704. package/ts/sms/classes.smsservice.ts +98 -0
  705. package/ts/sms/config/sms.config.ts +109 -0
  706. package/ts/sms/config/sms.schema.ts +122 -0
  707. package/ts/sms/index.ts +1 -0
  708. package/ts/storage/classes.storagemanager.ts +400 -0
  709. package/ts/storage/index.ts +2 -0
  710. package/ts/tspublish.json +3 -0
  711. package/ts_interfaces/data/auth.ts +8 -0
  712. package/ts_interfaces/data/index.ts +2 -0
  713. package/ts_interfaces/data/stats.ts +101 -0
  714. package/ts_interfaces/index.ts +9 -0
  715. package/ts_interfaces/plugins.ts +6 -0
  716. package/ts_interfaces/requests/admin.ts +46 -0
  717. package/ts_interfaces/requests/config.ts +35 -0
  718. package/ts_interfaces/requests/index.ts +4 -0
  719. package/ts_interfaces/requests/logs.ts +44 -0
  720. package/ts_interfaces/requests/stats.ts +162 -0
  721. package/ts_interfaces/tspublish.json +3 -0
  722. package/ts_web/00_commitinfo_data.ts +8 -0
  723. package/ts_web/appstate.ts +361 -0
  724. package/ts_web/elements/index.ts +7 -0
  725. package/ts_web/elements/ops-dashboard.ts +165 -0
  726. package/ts_web/elements/ops-view-config.ts +268 -0
  727. package/ts_web/elements/ops-view-logs.ts +207 -0
  728. package/ts_web/elements/ops-view-overview.ts +222 -0
  729. package/ts_web/elements/ops-view-security.ts +471 -0
  730. package/ts_web/elements/ops-view-stats.ts +299 -0
  731. package/ts_web/elements/shared/css.ts +10 -0
  732. package/ts_web/elements/shared/index.ts +2 -0
  733. package/ts_web/elements/shared/ops-sectionheading.ts +42 -0
  734. package/ts_web/index.ts +9 -0
  735. package/ts_web/plugins.ts +11 -0
  736. package/ts_web/tspublish.json +3 -0
  737. package/tsconfig.json +15 -0
@@ -0,0 +1,1310 @@
1
+ import * as plugins from './plugins.js';
2
+ import * as paths from './paths.js';
3
+
4
+ // Certificate types are available via plugins.tsclass
5
+
6
+ // Import the email server and its configuration
7
+ import { UnifiedEmailServer, type IUnifiedEmailServerOptions } from './mail/routing/classes.unified.email.server.js';
8
+ import type { IEmailRoute } from './mail/routing/interfaces.js';
9
+ import { logger } from './logger.js';
10
+ // Import the email configuration helpers directly from mail/delivery
11
+ import { configureEmailStorage, configureEmailServer } from './mail/delivery/index.js';
12
+ // Import storage manager
13
+ import { StorageManager, type IStorageConfig } from './storage/index.js';
14
+
15
+ import { OpsServer } from './opsserver/index.js';
16
+
17
+ export interface IDcRouterOptions {
18
+ /**
19
+ * Direct SmartProxy configuration - gives full control over HTTP/HTTPS and TCP/SNI traffic
20
+ * This is the preferred way to configure HTTP/HTTPS and general TCP/SNI traffic
21
+ */
22
+ smartProxyConfig?: plugins.smartproxy.ISmartProxyOptions;
23
+
24
+ /**
25
+ * Email server configuration
26
+ * This enables all email handling with pattern-based routing
27
+ */
28
+ emailConfig?: IUnifiedEmailServerOptions;
29
+
30
+ /**
31
+ * Custom email port configuration
32
+ * Allows configuring specific ports for email handling
33
+ * This overrides the default port mapping in the emailConfig
34
+ */
35
+ emailPortConfig?: {
36
+ /** External to internal port mapping */
37
+ portMapping?: Record<number, number>;
38
+ /** Custom port configuration for specific ports */
39
+ portSettings?: Record<number, any>;
40
+ /** Path to store received emails */
41
+ receivedEmailsPath?: string;
42
+ };
43
+
44
+ /** TLS/certificate configuration */
45
+ tls?: {
46
+ /** Contact email for ACME certificates */
47
+ contactEmail: string;
48
+ /** Domain for main certificate */
49
+ domain?: string;
50
+ /** Path to certificate file (if not using auto-provisioning) */
51
+ certPath?: string;
52
+ /** Path to key file (if not using auto-provisioning) */
53
+ keyPath?: string;
54
+ /** Path to CA certificate file (for custom CAs) */
55
+ caPath?: string;
56
+ };
57
+
58
+ /**
59
+ * The nameserver domains (e.g., ['ns1.example.com', 'ns2.example.com'])
60
+ * These will automatically get A records pointing to publicIp or proxyIps[0]
61
+ * These are what go in the NS records for ALL domains in dnsScopes
62
+ */
63
+ dnsNsDomains?: string[];
64
+
65
+ /**
66
+ * Domains this DNS server is authoritative for (e.g., ['example.com', 'mail.example.org'])
67
+ * NS records will be auto-generated for these domains
68
+ * Any DNS record outside these scopes will trigger a warning
69
+ * Email domains with `internal-dns` mode must be included here
70
+ */
71
+ dnsScopes?: string[];
72
+
73
+ /**
74
+ * IPs of proxies that forward traffic to your server (optional)
75
+ * When defined AND useIngressProxy is true, A records with server IP are replaced with proxy IPs
76
+ * If not defined or empty, all A records use the real server IP
77
+ * Helps hide real server IP for security/privacy
78
+ */
79
+ proxyIps?: string[];
80
+
81
+ /**
82
+ * Public IP address for nameserver A records (required if proxyIps not set)
83
+ * This is the IP that will be used for the nameserver domains (dnsNsDomains)
84
+ * If proxyIps is set, the first proxy IP will be used instead
85
+ */
86
+ publicIp?: string;
87
+
88
+ /**
89
+ * DNS records to register
90
+ * Must be within the defined dnsScopes (or receive warning)
91
+ * Only need A, CNAME, TXT, MX records (NS records auto-generated, SOA handled by smartdns)
92
+ * Can use `useIngressProxy: false` to expose real server IP (defaults to true)
93
+ */
94
+ dnsRecords?: Array<{
95
+ name: string;
96
+ type: 'A' | 'AAAA' | 'CNAME' | 'MX' | 'TXT' | 'NS' | 'SOA';
97
+ value: string;
98
+ ttl?: number;
99
+ useIngressProxy?: boolean; // Whether to replace server IP with proxy IP (default: true)
100
+ }>;
101
+
102
+ /** DNS challenge configuration for ACME (optional) */
103
+ dnsChallenge?: {
104
+ /** Cloudflare API key for DNS challenges */
105
+ cloudflareApiKey?: string;
106
+ /** Other DNS providers can be added here */
107
+ };
108
+
109
+ /** Storage configuration */
110
+ storage?: IStorageConfig;
111
+ }
112
+
113
+ /**
114
+ * DcRouter can be run on ingress and egress to and from a datacenter site.
115
+ */
116
+ /**
117
+ * Context passed to HTTP routing rules
118
+ */
119
+ /**
120
+ * Context passed to port proxy (SmartProxy) routing rules
121
+ */
122
+ export interface PortProxyRuleContext {
123
+ proxy: plugins.smartproxy.SmartProxy;
124
+ routes: plugins.smartproxy.IRouteConfig[];
125
+ }
126
+
127
+ export class DcRouter {
128
+ public options: IDcRouterOptions;
129
+
130
+ // Core services
131
+ public smartProxy?: plugins.smartproxy.SmartProxy;
132
+ public dnsServer?: plugins.smartdns.dnsServerMod.DnsServer;
133
+ public emailServer?: UnifiedEmailServer;
134
+ public storageManager: StorageManager;
135
+ public opsServer: OpsServer;
136
+
137
+ // TypedRouter for API endpoints
138
+ public typedrouter = new plugins.typedrequest.TypedRouter();
139
+
140
+ // Environment access
141
+ private qenv = new plugins.qenv.Qenv('./', '.nogit/');
142
+
143
+ constructor(optionsArg: IDcRouterOptions) {
144
+ // Set defaults in options
145
+ this.options = {
146
+ ...optionsArg
147
+ };
148
+
149
+ // Initialize storage manager
150
+ this.storageManager = new StorageManager(this.options.storage);
151
+ }
152
+
153
+ public async start() {
154
+ console.log('╔═══════════════════════════════════════════════════════════════════╗');
155
+ console.log('║ Starting DcRouter Services ║');
156
+ console.log('╚═══════════════════════════════════════════════════════════════════╝');
157
+
158
+
159
+ this.opsServer = new OpsServer(this);
160
+ await this.opsServer.start();
161
+
162
+ try {
163
+ // Set up SmartProxy for HTTP/HTTPS and all traffic including email routes
164
+ await this.setupSmartProxy();
165
+
166
+ // Set up unified email handling if configured
167
+ if (this.options.emailConfig) {
168
+ await this.setupUnifiedEmailHandling();
169
+
170
+ // Apply custom email storage configuration if available
171
+ if (this.emailServer && this.options.emailPortConfig?.receivedEmailsPath) {
172
+ logger.log('info', 'Applying custom email storage configuration');
173
+ configureEmailStorage(this.emailServer, this.options);
174
+ }
175
+ }
176
+
177
+ // Set up DNS server if configured with nameservers and scopes
178
+ if (this.options.dnsNsDomains && this.options.dnsNsDomains.length > 0 &&
179
+ this.options.dnsScopes && this.options.dnsScopes.length > 0) {
180
+ await this.setupDnsWithSocketHandler();
181
+ }
182
+
183
+ this.logStartupSummary();
184
+ } catch (error) {
185
+ console.error('❌ Error starting DcRouter:', error);
186
+ // Try to clean up any services that may have started
187
+ await this.stop();
188
+ throw error;
189
+ }
190
+ }
191
+
192
+ /**
193
+ * Log comprehensive startup summary
194
+ */
195
+ private logStartupSummary(): void {
196
+ console.log('\n╔═══════════════════════════════════════════════════════════════════╗');
197
+ console.log('║ DcRouter Started Successfully ║');
198
+ console.log('╚═══════════════════════════════════════════════════════════════════╝\n');
199
+
200
+ // SmartProxy summary
201
+ if (this.smartProxy) {
202
+ console.log('🌐 SmartProxy Service:');
203
+ const routeCount = this.options.smartProxyConfig?.routes?.length || 0;
204
+ console.log(` ├─ Routes configured: ${routeCount}`);
205
+ console.log(` ├─ ACME enabled: ${this.options.smartProxyConfig?.acme?.enabled || false}`);
206
+ if (this.options.smartProxyConfig?.acme?.enabled) {
207
+ console.log(` ├─ ACME email: ${this.options.smartProxyConfig.acme.email || 'not set'}`);
208
+ console.log(` └─ ACME mode: ${this.options.smartProxyConfig.acme.useProduction ? 'production' : 'staging'}`);
209
+ } else {
210
+ console.log(' └─ ACME: disabled');
211
+ }
212
+ }
213
+
214
+ // Email service summary
215
+ if (this.emailServer && this.options.emailConfig) {
216
+ console.log('\n📧 Email Service:');
217
+ const ports = this.options.emailConfig.ports || [];
218
+ console.log(` ├─ Ports: ${ports.join(', ')}`);
219
+ console.log(` ├─ Hostname: ${this.options.emailConfig.hostname || 'localhost'}`);
220
+ console.log(` ├─ Domains configured: ${this.options.emailConfig.domains?.length || 0}`);
221
+ if (this.options.emailConfig.domains && this.options.emailConfig.domains.length > 0) {
222
+ this.options.emailConfig.domains.forEach((domain, index) => {
223
+ const isLast = index === this.options.emailConfig!.domains!.length - 1;
224
+ console.log(` ${isLast ? '└─' : '├─'} ${domain.domain} (${domain.dnsMode || 'default'})`);
225
+ });
226
+ }
227
+ console.log(` └─ DKIM: Initialized for all domains`);
228
+ }
229
+
230
+ // DNS service summary
231
+ if (this.dnsServer && this.options.dnsNsDomains && this.options.dnsScopes) {
232
+ console.log('\n🌍 DNS Service:');
233
+ console.log(` ├─ Nameservers: ${this.options.dnsNsDomains.join(', ')}`);
234
+ console.log(` ├─ Primary NS: ${this.options.dnsNsDomains[0]}`);
235
+ console.log(` ├─ Authoritative for: ${this.options.dnsScopes.length} domains`);
236
+ console.log(` ├─ UDP Port: 53`);
237
+ console.log(` ├─ DNS-over-HTTPS: Enabled via socket handler`);
238
+ console.log(` └─ DNSSEC: ${this.options.dnsNsDomains[0] ? 'Enabled' : 'Disabled'}`);
239
+
240
+ // Show authoritative domains
241
+ if (this.options.dnsScopes.length > 0) {
242
+ console.log('\n Authoritative Domains:');
243
+ this.options.dnsScopes.forEach((domain, index) => {
244
+ const isLast = index === this.options.dnsScopes!.length - 1;
245
+ console.log(` ${isLast ? '└─' : '├─'} ${domain}`);
246
+ });
247
+ }
248
+ }
249
+
250
+ // Storage summary
251
+ if (this.storageManager && this.options.storage) {
252
+ console.log('\n💾 Storage:');
253
+ console.log(` └─ Path: ${this.options.storage.fsPath || 'default'}`);
254
+ }
255
+
256
+ console.log('\n✅ All services are running\n');
257
+ }
258
+
259
+ /**
260
+ * Set up SmartProxy with direct configuration and automatic email routes
261
+ */
262
+ private async setupSmartProxy(): Promise<void> {
263
+ console.log('[DcRouter] Setting up SmartProxy...');
264
+ let routes: plugins.smartproxy.IRouteConfig[] = [];
265
+ let acmeConfig: plugins.smartproxy.IAcmeOptions | undefined;
266
+
267
+ // If user provides full SmartProxy config, use it directly
268
+ if (this.options.smartProxyConfig) {
269
+ routes = this.options.smartProxyConfig.routes || [];
270
+ acmeConfig = this.options.smartProxyConfig.acme;
271
+ console.log(`[DcRouter] Found ${routes.length} routes in config`);
272
+ console.log(`[DcRouter] ACME config present: ${!!acmeConfig}`);
273
+ }
274
+
275
+ // If email config exists, automatically add email routes
276
+ if (this.options.emailConfig) {
277
+ const emailRoutes = this.generateEmailRoutes(this.options.emailConfig);
278
+ console.log(`Email Routes are:`)
279
+ console.log(emailRoutes)
280
+ routes = [...routes, ...emailRoutes]; // Enable email routing through SmartProxy
281
+ }
282
+
283
+ // If DNS is configured, add DNS routes
284
+ if (this.options.dnsNsDomains && this.options.dnsNsDomains.length > 0) {
285
+ const dnsRoutes = this.generateDnsRoutes();
286
+ console.log(`DNS Routes for nameservers ${this.options.dnsNsDomains.join(', ')}:`, dnsRoutes);
287
+ routes = [...routes, ...dnsRoutes];
288
+ }
289
+
290
+ // Merge TLS/ACME configuration if provided at root level
291
+ if (this.options.tls && !acmeConfig) {
292
+ acmeConfig = {
293
+ accountEmail: this.options.tls.contactEmail,
294
+ enabled: true,
295
+ useProduction: true,
296
+ autoRenew: true,
297
+ renewThresholdDays: 30
298
+ };
299
+ }
300
+
301
+ // Configure DNS challenge if available
302
+ let challengeHandlers: any[] = [];
303
+ if (this.options.dnsChallenge?.cloudflareApiKey) {
304
+ console.log('Configuring Cloudflare DNS challenge for ACME');
305
+ const cloudflareAccount = new plugins.cloudflare.CloudflareAccount(this.options.dnsChallenge.cloudflareApiKey);
306
+ const dns01Handler = new plugins.smartacme.handlers.Dns01Handler(cloudflareAccount);
307
+ challengeHandlers.push(dns01Handler);
308
+ }
309
+
310
+ // If we have routes or need a basic SmartProxy instance, create it
311
+ if (routes.length > 0 || this.options.smartProxyConfig) {
312
+ console.log('Setting up SmartProxy with combined configuration');
313
+
314
+ // Create SmartProxy configuration
315
+ const smartProxyConfig: plugins.smartproxy.ISmartProxyOptions = {
316
+ ...this.options.smartProxyConfig,
317
+ routes,
318
+ acme: acmeConfig
319
+ };
320
+
321
+ // If we have DNS challenge handlers, enhance the config
322
+ if (challengeHandlers.length > 0) {
323
+ // We'll need to pass this to SmartProxy somehow
324
+ // For now, we'll set it as a property
325
+ (smartProxyConfig as any).acmeChallengeHandlers = challengeHandlers;
326
+ (smartProxyConfig as any).acmeChallengePriority = ['dns-01', 'http-01'];
327
+ }
328
+
329
+ // Create SmartProxy instance
330
+ console.log('[DcRouter] Creating SmartProxy instance with config:', JSON.stringify({
331
+ routeCount: smartProxyConfig.routes?.length,
332
+ acmeEnabled: smartProxyConfig.acme?.enabled,
333
+ acmeEmail: smartProxyConfig.acme?.email,
334
+ certProvisionFunction: !!smartProxyConfig.certProvisionFunction
335
+ }, null, 2));
336
+
337
+ this.smartProxy = new plugins.smartproxy.SmartProxy(smartProxyConfig);
338
+
339
+ // Set up event listeners
340
+ this.smartProxy.on('error', (err) => {
341
+ console.error('[DcRouter] SmartProxy error:', err);
342
+ console.error('[DcRouter] Error stack:', err.stack);
343
+ });
344
+
345
+ if (acmeConfig) {
346
+ this.smartProxy.on('certificate-issued', (event) => {
347
+ console.log(`[DcRouter] Certificate issued for ${event.domain}, expires ${event.expiryDate}`);
348
+ });
349
+
350
+ this.smartProxy.on('certificate-renewed', (event) => {
351
+ console.log(`[DcRouter] Certificate renewed for ${event.domain}, expires ${event.expiryDate}`);
352
+ });
353
+
354
+ this.smartProxy.on('certificate-failed', (event) => {
355
+ console.error(`[DcRouter] Certificate failed for ${event.domain}:`, event.error);
356
+ });
357
+ }
358
+
359
+ // Start SmartProxy
360
+ console.log('[DcRouter] Starting SmartProxy...');
361
+ await this.smartProxy.start();
362
+ console.log('[DcRouter] SmartProxy started successfully');
363
+
364
+ console.log(`SmartProxy started with ${routes.length} routes`);
365
+ }
366
+ }
367
+
368
+
369
+
370
+ /**
371
+ * Generate SmartProxy routes for email configuration
372
+ */
373
+ private generateEmailRoutes(emailConfig: IUnifiedEmailServerOptions): plugins.smartproxy.IRouteConfig[] {
374
+ const emailRoutes: plugins.smartproxy.IRouteConfig[] = [];
375
+
376
+ // Create routes for each email port
377
+ for (const port of emailConfig.ports) {
378
+ // Create a descriptive name for the route based on the port
379
+ let routeName = 'email-route';
380
+ let tlsMode = 'passthrough';
381
+
382
+ // Handle different email ports differently
383
+ switch (port) {
384
+ case 25: // SMTP
385
+ routeName = 'smtp-route';
386
+ tlsMode = 'passthrough'; // STARTTLS handled by email server
387
+ break;
388
+
389
+ case 587: // Submission
390
+ routeName = 'submission-route';
391
+ tlsMode = 'passthrough'; // STARTTLS handled by email server
392
+ break;
393
+
394
+ case 465: // SMTPS
395
+ routeName = 'smtps-route';
396
+ tlsMode = 'terminate'; // Terminate TLS and re-encrypt to email server
397
+ break;
398
+
399
+ default:
400
+ routeName = `email-port-${port}-route`;
401
+ tlsMode = 'passthrough';
402
+
403
+ // Check if we have specific settings for this port
404
+ if (this.options.emailPortConfig?.portSettings &&
405
+ this.options.emailPortConfig.portSettings[port]) {
406
+ const portSettings = this.options.emailPortConfig.portSettings[port];
407
+
408
+ // If this port requires TLS termination, set the mode accordingly
409
+ if (portSettings.terminateTls) {
410
+ tlsMode = 'terminate';
411
+ }
412
+
413
+ // Override the route name if specified
414
+ if (portSettings.routeName) {
415
+ routeName = portSettings.routeName;
416
+ }
417
+ }
418
+ break;
419
+ }
420
+
421
+ // Create action based on mode
422
+ let action: any;
423
+
424
+ if (emailConfig.useSocketHandler) {
425
+ // Socket-handler mode
426
+ action = {
427
+ type: 'socket-handler' as any,
428
+ socketHandler: this.createMailSocketHandler(port)
429
+ };
430
+ } else {
431
+ // Traditional forwarding mode
432
+ const defaultPortMapping = {
433
+ 25: 10025, // SMTP
434
+ 587: 10587, // Submission
435
+ 465: 10465 // SMTPS
436
+ };
437
+
438
+ const portMapping = this.options.emailPortConfig?.portMapping || defaultPortMapping;
439
+ const internalPort = portMapping[port] || port + 10000;
440
+
441
+ action = {
442
+ type: 'forward',
443
+ target: {
444
+ host: 'localhost', // Forward to internal email server
445
+ port: internalPort
446
+ },
447
+ tls: {
448
+ mode: tlsMode as any
449
+ }
450
+ };
451
+ }
452
+
453
+ // For TLS terminate mode, add certificate info
454
+ if (tlsMode === 'terminate' && action.tls) {
455
+ action.tls.certificate = 'auto';
456
+ }
457
+
458
+ // Create the route configuration
459
+ const routeConfig: plugins.smartproxy.IRouteConfig = {
460
+ name: routeName,
461
+ match: {
462
+ ports: [port]
463
+ },
464
+ action: action
465
+ };
466
+
467
+ // Add the route to our list
468
+ emailRoutes.push(routeConfig);
469
+ }
470
+
471
+ // Add email domain-based routes if configured
472
+ if (emailConfig.routes) {
473
+ for (const route of emailConfig.routes) {
474
+ emailRoutes.push({
475
+ name: route.name,
476
+ match: {
477
+ ports: emailConfig.ports,
478
+ domains: route.match.recipients ? [route.match.recipients.toString().split('@')[1]] : []
479
+ },
480
+ action: {
481
+ type: 'forward',
482
+ target: route.action.type === 'forward' && route.action.forward ? {
483
+ host: route.action.forward.host,
484
+ port: route.action.forward.port || 25
485
+ } : undefined,
486
+ tls: {
487
+ mode: 'passthrough'
488
+ }
489
+ }
490
+ });
491
+ }
492
+ }
493
+
494
+ return emailRoutes;
495
+ }
496
+
497
+ /**
498
+ * Generate SmartProxy routes for DNS configuration
499
+ */
500
+ private generateDnsRoutes(): plugins.smartproxy.IRouteConfig[] {
501
+ if (!this.options.dnsNsDomains || this.options.dnsNsDomains.length === 0) {
502
+ return [];
503
+ }
504
+
505
+ const dnsRoutes: plugins.smartproxy.IRouteConfig[] = [];
506
+
507
+ // Create routes for DNS-over-HTTPS paths
508
+ const dohPaths = ['/dns-query', '/resolve'];
509
+
510
+ // Use the first nameserver domain for DoH routes
511
+ const primaryNameserver = this.options.dnsNsDomains[0];
512
+
513
+ for (const path of dohPaths) {
514
+ const dohRoute: plugins.smartproxy.IRouteConfig = {
515
+ name: `dns-over-https-${path.replace('/', '')}`,
516
+ match: {
517
+ ports: [443], // HTTPS port for DoH
518
+ domains: [primaryNameserver],
519
+ path: path
520
+ },
521
+ action: {
522
+ type: 'socket-handler' as any,
523
+ socketHandler: this.createDnsSocketHandler()
524
+ } as any
525
+ };
526
+
527
+ dnsRoutes.push(dohRoute);
528
+ }
529
+
530
+ return dnsRoutes;
531
+ }
532
+
533
+ /**
534
+ * Check if a domain matches a pattern (including wildcard support)
535
+ * @param domain The domain to check
536
+ * @param pattern The pattern to match against (e.g., "*.example.com")
537
+ * @returns Whether the domain matches the pattern
538
+ */
539
+ private isDomainMatch(domain: string, pattern: string): boolean {
540
+ // Normalize inputs
541
+ domain = domain.toLowerCase();
542
+ pattern = pattern.toLowerCase();
543
+
544
+ // Check for exact match
545
+ if (domain === pattern) {
546
+ return true;
547
+ }
548
+
549
+ // Check for wildcard match (*.example.com)
550
+ if (pattern.startsWith('*.')) {
551
+ const patternSuffix = pattern.slice(2); // Remove the "*." prefix
552
+
553
+ // Check if domain ends with the pattern suffix and has at least one character before it
554
+ return domain.endsWith(patternSuffix) && domain.length > patternSuffix.length;
555
+ }
556
+
557
+ // No match
558
+ return false;
559
+ }
560
+
561
+ public async stop() {
562
+ console.log('Stopping DcRouter services...');
563
+
564
+ await this.opsServer.stop();
565
+
566
+ try {
567
+ // Stop all services in parallel for faster shutdown
568
+ await Promise.all([
569
+ // Stop unified email server if running
570
+ this.emailServer ? this.emailServer.stop().catch(err => console.error('Error stopping email server:', err)) : Promise.resolve(),
571
+
572
+ // Stop HTTP SmartProxy if running
573
+ this.smartProxy ? this.smartProxy.stop().catch(err => console.error('Error stopping SmartProxy:', err)) : Promise.resolve(),
574
+
575
+ // Stop DNS server if running
576
+ this.dnsServer ?
577
+ this.dnsServer.stop().catch(err => console.error('Error stopping DNS server:', err)) :
578
+ Promise.resolve()
579
+ ]);
580
+
581
+ console.log('All DcRouter services stopped');
582
+ } catch (error) {
583
+ console.error('Error during DcRouter shutdown:', error);
584
+ throw error;
585
+ }
586
+ }
587
+
588
+ /**
589
+ * Update SmartProxy configuration
590
+ * @param config New SmartProxy configuration
591
+ */
592
+ public async updateSmartProxyConfig(config: plugins.smartproxy.ISmartProxyOptions): Promise<void> {
593
+ // Stop existing SmartProxy if running
594
+ if (this.smartProxy) {
595
+ await this.smartProxy.stop();
596
+ this.smartProxy = undefined;
597
+ }
598
+
599
+ // Update configuration
600
+ this.options.smartProxyConfig = config;
601
+
602
+ // Start new SmartProxy with updated configuration (will include email routes if configured)
603
+ await this.setupSmartProxy();
604
+
605
+ console.log('SmartProxy configuration updated');
606
+ }
607
+
608
+
609
+
610
+ /**
611
+ * Set up unified email handling with pattern-based routing
612
+ * This implements the consolidated emailConfig approach
613
+ */
614
+ private async setupUnifiedEmailHandling(): Promise<void> {
615
+ if (!this.options.emailConfig) {
616
+ throw new Error('Email configuration is required for unified email handling');
617
+ }
618
+
619
+ // Apply port mapping if behind SmartProxy
620
+ const portMapping = this.options.emailPortConfig?.portMapping || {
621
+ 25: 10025, // SMTP
622
+ 587: 10587, // Submission
623
+ 465: 10465 // SMTPS
624
+ };
625
+
626
+ // Create config with mapped ports
627
+ const emailConfig: IUnifiedEmailServerOptions = {
628
+ ...this.options.emailConfig,
629
+ ports: this.options.emailConfig.ports.map(port => portMapping[port] || port + 10000),
630
+ hostname: 'localhost' // Listen on localhost for SmartProxy forwarding
631
+ };
632
+
633
+ // Create unified email server
634
+ this.emailServer = new UnifiedEmailServer(this, emailConfig);
635
+
636
+ // Set up error handling
637
+ this.emailServer.on('error', (err: Error) => {
638
+ logger.log('error', `UnifiedEmailServer error: ${err.message}`);
639
+ });
640
+
641
+ // Start the server
642
+ await this.emailServer.start();
643
+
644
+ logger.log('info', `Email server started on ports: ${emailConfig.ports.join(', ')}`);
645
+ }
646
+
647
+ /**
648
+ * Update the unified email configuration
649
+ * @param config New email configuration
650
+ */
651
+ public async updateEmailConfig(config: IUnifiedEmailServerOptions): Promise<void> {
652
+ // Stop existing email components
653
+ await this.stopUnifiedEmailComponents();
654
+
655
+ // Update configuration
656
+ this.options.emailConfig = config;
657
+
658
+ // Start email handling with new configuration
659
+ await this.setupUnifiedEmailHandling();
660
+
661
+ console.log('Unified email configuration updated');
662
+ }
663
+
664
+ /**
665
+ * Stop all unified email components
666
+ */
667
+ private async stopUnifiedEmailComponents(): Promise<void> {
668
+ try {
669
+ // Stop the unified email server which contains all components
670
+ if (this.emailServer) {
671
+ await this.emailServer.stop();
672
+ logger.log('info', 'Unified email server stopped');
673
+ this.emailServer = undefined;
674
+ }
675
+
676
+ logger.log('info', 'All unified email components stopped');
677
+ } catch (error) {
678
+ logger.log('error', `Error stopping unified email components: ${error.message}`);
679
+ throw error;
680
+ }
681
+ }
682
+
683
+ /**
684
+ * Update domain rules for email routing
685
+ * @param rules New domain rules to apply
686
+ */
687
+ public async updateEmailRoutes(routes: IEmailRoute[]): Promise<void> {
688
+ // Validate that email config exists
689
+ if (!this.options.emailConfig) {
690
+ throw new Error('Email configuration is required before updating routes');
691
+ }
692
+
693
+ // Update the configuration
694
+ this.options.emailConfig.routes = routes;
695
+
696
+ // Update the unified email server if it exists
697
+ if (this.emailServer) {
698
+ this.emailServer.updateRoutes(routes);
699
+ }
700
+
701
+ console.log(`Email routes updated with ${routes.length} routes`);
702
+ }
703
+
704
+ /**
705
+ * Get statistics from all components
706
+ */
707
+ public getStats(): any {
708
+ const stats: any = {
709
+ emailServer: this.emailServer?.getStats()
710
+ };
711
+
712
+ return stats;
713
+ }
714
+
715
+ /**
716
+ * Configure MTA for email handling with custom port and storage settings
717
+ * @param config Configuration for the MTA service
718
+ */
719
+ public async configureEmailMta(config: {
720
+ internalPort: number;
721
+ host?: string;
722
+ secure?: boolean;
723
+ storagePath?: string;
724
+ portMapping?: Record<number, number>;
725
+ }): Promise<boolean> {
726
+ logger.log('info', 'Configuring MTA service with custom settings');
727
+
728
+
729
+ // Update email port configuration
730
+ if (!this.options.emailPortConfig) {
731
+ this.options.emailPortConfig = {};
732
+ }
733
+
734
+ // Configure storage paths for received emails
735
+ if (config.storagePath) {
736
+ // Set the storage path for received emails
737
+ this.options.emailPortConfig.receivedEmailsPath = config.storagePath;
738
+ }
739
+
740
+ // Apply port mapping if provided
741
+ if (config.portMapping) {
742
+ this.options.emailPortConfig.portMapping = {
743
+ ...this.options.emailPortConfig.portMapping,
744
+ ...config.portMapping
745
+ };
746
+
747
+ logger.log('info', `Updated MTA port mappings: ${JSON.stringify(this.options.emailPortConfig.portMapping)}`);
748
+ }
749
+
750
+ // Use the dedicated helper to configure the email server
751
+ // Pass through the options specified by the implementation
752
+ if (this.emailServer) {
753
+ configureEmailServer(this.emailServer, {
754
+ ports: [config.internalPort], // Use whatever port the implementation specifies
755
+ hostname: config.host,
756
+ tls: config.secure ? {
757
+ // Basic TLS settings if secure mode is enabled
758
+ certPath: this.options.tls?.certPath,
759
+ keyPath: this.options.tls?.keyPath,
760
+ caPath: this.options.tls?.caPath
761
+ } : undefined,
762
+ storagePath: config.storagePath
763
+ });
764
+ }
765
+
766
+ // If email handling is already set up, restart it to apply changes
767
+ if (this.emailServer) {
768
+ logger.log('info', 'Restarting unified email handling to apply MTA configuration changes');
769
+ await this.stopUnifiedEmailComponents();
770
+ await this.setupUnifiedEmailHandling();
771
+ }
772
+
773
+ return true;
774
+ }
775
+
776
+ /**
777
+ * Register DNS records with the DNS server
778
+ * @param records Array of DNS records to register
779
+ */
780
+ private registerDnsRecords(records: Array<{name: string; type: string; value: string; ttl?: number}>): void {
781
+ if (!this.dnsServer) return;
782
+
783
+ // Register a separate handler for each record
784
+ // This ensures multiple records of the same type (like NS records) are all served
785
+ for (const record of records) {
786
+ // Register handler for this specific record
787
+ this.dnsServer.registerHandler(record.name, [record.type], (question) => {
788
+ // Check if this handler matches the question
789
+ if (question.name === record.name && question.type === record.type) {
790
+ return {
791
+ name: record.name,
792
+ type: record.type,
793
+ class: 'IN',
794
+ ttl: record.ttl || 300,
795
+ data: this.parseDnsRecordData(record.type, record.value)
796
+ };
797
+ }
798
+
799
+ return null;
800
+ });
801
+ }
802
+
803
+ logger.log('info', `Registered ${records.length} DNS handlers (one per record)`);
804
+ }
805
+
806
+ /**
807
+ * Parse DNS record data based on record type
808
+ * @param type DNS record type
809
+ * @param value DNS record value
810
+ * @returns Parsed data for the DNS response
811
+ */
812
+ private parseDnsRecordData(type: string, value: string): any {
813
+ switch (type) {
814
+ case 'A':
815
+ return value; // IP address as string
816
+ case 'MX':
817
+ const [priority, exchange] = value.split(' ');
818
+ return { priority: parseInt(priority), exchange };
819
+ case 'TXT':
820
+ return value;
821
+ case 'NS':
822
+ return value;
823
+ case 'SOA':
824
+ // SOA format: primary-ns admin-email serial refresh retry expire minimum
825
+ const parts = value.split(' ');
826
+ return {
827
+ mname: parts[0],
828
+ rname: parts[1],
829
+ serial: parseInt(parts[2]),
830
+ refresh: parseInt(parts[3]),
831
+ retry: parseInt(parts[4]),
832
+ expire: parseInt(parts[5]),
833
+ minimum: parseInt(parts[6])
834
+ };
835
+ default:
836
+ return value;
837
+ }
838
+ }
839
+
840
+ /**
841
+ * Set up DNS server with socket handler for DoH
842
+ */
843
+ private async setupDnsWithSocketHandler(): Promise<void> {
844
+ if (!this.options.dnsNsDomains || this.options.dnsNsDomains.length === 0) {
845
+ throw new Error('dnsNsDomains is required for DNS server setup');
846
+ }
847
+
848
+ if (!this.options.dnsScopes || this.options.dnsScopes.length === 0) {
849
+ throw new Error('dnsScopes is required for DNS server setup');
850
+ }
851
+
852
+ const primaryNameserver = this.options.dnsNsDomains[0];
853
+ logger.log('info', `Setting up DNS server with primary nameserver: ${primaryNameserver}`);
854
+
855
+ // Get VM IP address for UDP binding
856
+ const networkInterfaces = plugins.os.networkInterfaces();
857
+ let vmIpAddress = '0.0.0.0'; // Default to all interfaces
858
+
859
+ // Try to find the VM's internal IP address
860
+ for (const [_name, interfaces] of Object.entries(networkInterfaces)) {
861
+ if (interfaces) {
862
+ for (const iface of interfaces) {
863
+ if (!iface.internal && iface.family === 'IPv4') {
864
+ vmIpAddress = iface.address;
865
+ break;
866
+ }
867
+ }
868
+ }
869
+ }
870
+
871
+ // Create DNS server instance with manual HTTPS mode
872
+ this.dnsServer = new plugins.smartdns.dnsServerMod.DnsServer({
873
+ udpPort: 53,
874
+ udpBindInterface: vmIpAddress,
875
+ httpsPort: 443, // Required but won't bind due to manual mode
876
+ manualHttpsMode: true, // Enable manual HTTPS socket handling
877
+ dnssecZone: primaryNameserver,
878
+ primaryNameserver: primaryNameserver, // Automatically generates correct SOA records
879
+ // For now, use self-signed cert until we integrate with Let's Encrypt
880
+ httpsKey: '',
881
+ httpsCert: ''
882
+ });
883
+
884
+ // Start the DNS server (UDP only)
885
+ await this.dnsServer.start();
886
+ logger.log('info', `DNS server started on UDP ${vmIpAddress}:53`);
887
+
888
+ // Validate DNS configuration
889
+ await this.validateDnsConfiguration();
890
+
891
+ // Generate and register authoritative records
892
+ const authoritativeRecords = await this.generateAuthoritativeRecords();
893
+
894
+ // Generate email DNS records
895
+ const emailDnsRecords = await this.generateEmailDnsRecords();
896
+
897
+ // Initialize DKIM for all email domains
898
+ await this.initializeDkimForEmailDomains();
899
+
900
+ // Load DKIM records from JSON files (they should now exist)
901
+ const dkimRecords = await this.loadDkimRecords();
902
+
903
+ // Combine all records: authoritative, email, DKIM, and user-defined
904
+ const allRecords = [...authoritativeRecords, ...emailDnsRecords, ...dkimRecords];
905
+ if (this.options.dnsRecords && this.options.dnsRecords.length > 0) {
906
+ allRecords.push(...this.options.dnsRecords);
907
+ }
908
+
909
+ // Apply proxy IP replacement if configured
910
+ await this.applyProxyIpReplacement(allRecords);
911
+
912
+ // Register all DNS records
913
+ if (allRecords.length > 0) {
914
+ this.registerDnsRecords(allRecords);
915
+ logger.log('info', `Registered ${allRecords.length} DNS records (${authoritativeRecords.length} authoritative, ${emailDnsRecords.length} email, ${dkimRecords.length} DKIM, ${this.options.dnsRecords?.length || 0} user-defined)`);
916
+ }
917
+ }
918
+
919
+ /**
920
+ * Create DNS socket handler for DoH
921
+ */
922
+ private createDnsSocketHandler(): (socket: plugins.net.Socket) => Promise<void> {
923
+ return async (socket: plugins.net.Socket) => {
924
+ if (!this.dnsServer) {
925
+ logger.log('error', 'DNS socket handler called but DNS server not initialized');
926
+ socket.end();
927
+ return;
928
+ }
929
+
930
+ logger.log('debug', 'DNS socket handler: passing socket to DnsServer');
931
+
932
+ try {
933
+ // Use the built-in socket handler from smartdns
934
+ // This handles HTTP/2, DoH protocol, etc.
935
+ await (this.dnsServer as any).handleHttpsSocket(socket);
936
+ } catch (error) {
937
+ logger.log('error', `DNS socket handler error: ${error.message}`);
938
+ socket.destroy();
939
+ }
940
+ };
941
+ }
942
+
943
+ /**
944
+ * Validate DNS configuration
945
+ */
946
+ private async validateDnsConfiguration(): Promise<void> {
947
+ if (!this.options.dnsNsDomains || !this.options.dnsScopes) {
948
+ return;
949
+ }
950
+
951
+ logger.log('info', 'Validating DNS configuration...');
952
+
953
+ // Check if email domains with internal-dns are in dnsScopes
954
+ if (this.options.emailConfig?.domains) {
955
+ for (const domainConfig of this.options.emailConfig.domains) {
956
+ if (domainConfig.dnsMode === 'internal-dns' &&
957
+ !this.options.dnsScopes.includes(domainConfig.domain)) {
958
+ logger.log('warn', `Email domain '${domainConfig.domain}' with internal-dns mode is not in dnsScopes. It should be added to dnsScopes.`);
959
+ }
960
+ }
961
+ }
962
+
963
+ // Validate user-provided DNS records are within scopes
964
+ if (this.options.dnsRecords) {
965
+ for (const record of this.options.dnsRecords) {
966
+ const recordDomain = this.extractDomain(record.name);
967
+ const isInScope = this.options.dnsScopes.some(scope =>
968
+ recordDomain === scope || recordDomain.endsWith(`.${scope}`)
969
+ );
970
+
971
+ if (!isInScope) {
972
+ logger.log('warn', `DNS record for '${record.name}' is outside defined scopes [${this.options.dnsScopes.join(', ')}]`);
973
+ }
974
+ }
975
+ }
976
+ }
977
+
978
+ /**
979
+ * Generate email DNS records for domains with internal-dns mode
980
+ */
981
+ private async generateEmailDnsRecords(): Promise<Array<{name: string; type: string; value: string; ttl?: number}>> {
982
+ const records: Array<{name: string; type: string; value: string; ttl?: number}> = [];
983
+
984
+ if (!this.options.emailConfig?.domains) {
985
+ return records;
986
+ }
987
+
988
+ // Filter domains with internal-dns mode
989
+ const internalDnsDomains = this.options.emailConfig.domains.filter(
990
+ domain => domain.dnsMode === 'internal-dns'
991
+ );
992
+
993
+ for (const domainConfig of internalDnsDomains) {
994
+ const domain = domainConfig.domain;
995
+ const ttl = domainConfig.dns?.internal?.ttl || 3600;
996
+ const mxPriority = domainConfig.dns?.internal?.mxPriority || 10;
997
+
998
+ // MX record - points to the domain itself for email handling
999
+ records.push({
1000
+ name: domain,
1001
+ type: 'MX',
1002
+ value: `${mxPriority} ${domain}`,
1003
+ ttl
1004
+ });
1005
+
1006
+ // SPF record - using sensible defaults
1007
+ const spfRecord = 'v=spf1 a mx ~all';
1008
+ records.push({
1009
+ name: domain,
1010
+ type: 'TXT',
1011
+ value: spfRecord,
1012
+ ttl
1013
+ });
1014
+
1015
+ // DMARC record - using sensible defaults
1016
+ const dmarcPolicy = 'none'; // Start with 'none' policy for monitoring
1017
+ const dmarcEmail = `dmarc@${domain}`;
1018
+ records.push({
1019
+ name: `_dmarc.${domain}`,
1020
+ type: 'TXT',
1021
+ value: `v=DMARC1; p=${dmarcPolicy}; rua=mailto:${dmarcEmail}`,
1022
+ ttl
1023
+ });
1024
+
1025
+ // Note: DKIM records will be generated later when DKIM keys are available
1026
+ // They require the DKIMCreator which is part of the email server
1027
+ }
1028
+
1029
+ logger.log('info', `Generated ${records.length} email DNS records for ${internalDnsDomains.length} internal-dns domains`);
1030
+ return records;
1031
+ }
1032
+
1033
+ /**
1034
+ * Load DKIM records from JSON files
1035
+ * Reads all *.dkimrecord.json files from the DNS records directory
1036
+ */
1037
+ private async loadDkimRecords(): Promise<Array<{name: string; type: string; value: string; ttl?: number}>> {
1038
+ const records: Array<{name: string; type: string; value: string; ttl?: number}> = [];
1039
+
1040
+ try {
1041
+ // Ensure paths are imported
1042
+ const dnsDir = paths.dnsRecordsDir;
1043
+
1044
+ // Check if directory exists
1045
+ if (!plugins.fs.existsSync(dnsDir)) {
1046
+ logger.log('debug', 'No DNS records directory found, skipping DKIM record loading');
1047
+ return records;
1048
+ }
1049
+
1050
+ // Read all files in the directory
1051
+ const files = plugins.fs.readdirSync(dnsDir);
1052
+ const dkimFiles = files.filter(f => f.endsWith('.dkimrecord.json'));
1053
+
1054
+ logger.log('info', `Found ${dkimFiles.length} DKIM record files`);
1055
+
1056
+ // Load each DKIM record
1057
+ for (const file of dkimFiles) {
1058
+ try {
1059
+ const filePath = plugins.path.join(dnsDir, file);
1060
+ const fileContent = plugins.fs.readFileSync(filePath, 'utf8');
1061
+ const dkimRecord = JSON.parse(fileContent);
1062
+
1063
+ // Validate record structure
1064
+ if (dkimRecord.name && dkimRecord.type === 'TXT' && dkimRecord.value) {
1065
+ records.push({
1066
+ name: dkimRecord.name,
1067
+ type: 'TXT',
1068
+ value: dkimRecord.value,
1069
+ ttl: 3600 // Standard DKIM TTL
1070
+ });
1071
+
1072
+ logger.log('info', `Loaded DKIM record for ${dkimRecord.name}`);
1073
+ } else {
1074
+ logger.log('warn', `Invalid DKIM record structure in ${file}`);
1075
+ }
1076
+ } catch (error) {
1077
+ logger.log('error', `Failed to load DKIM record from ${file}: ${error.message}`);
1078
+ }
1079
+ }
1080
+ } catch (error) {
1081
+ logger.log('error', `Failed to load DKIM records: ${error.message}`);
1082
+ }
1083
+
1084
+ return records;
1085
+ }
1086
+
1087
+ /**
1088
+ * Initialize DKIM keys for all configured email domains
1089
+ * This ensures DKIM records are available immediately at startup
1090
+ */
1091
+ private async initializeDkimForEmailDomains(): Promise<void> {
1092
+ if (!this.options.emailConfig?.domains || !this.emailServer) {
1093
+ return;
1094
+ }
1095
+
1096
+ logger.log('info', 'Initializing DKIM keys for email domains...');
1097
+
1098
+ // Get DKIMCreator instance from email server
1099
+ const dkimCreator = (this.emailServer as any).dkimCreator;
1100
+ if (!dkimCreator) {
1101
+ logger.log('warn', 'DKIMCreator not available, skipping DKIM initialization');
1102
+ return;
1103
+ }
1104
+
1105
+ // Ensure necessary directories exist
1106
+ paths.ensureDirectories();
1107
+
1108
+ // Generate DKIM keys for each email domain
1109
+ for (const domainConfig of this.options.emailConfig.domains) {
1110
+ try {
1111
+ // Generate DKIM keys for all domains, regardless of DNS mode
1112
+ // This ensures keys are ready even if DNS mode changes later
1113
+ await dkimCreator.handleDKIMKeysForDomain(domainConfig.domain);
1114
+ logger.log('info', `DKIM keys initialized for ${domainConfig.domain}`);
1115
+ } catch (error) {
1116
+ logger.log('error', `Failed to initialize DKIM for ${domainConfig.domain}: ${error.message}`);
1117
+ }
1118
+ }
1119
+
1120
+ logger.log('info', 'DKIM initialization complete');
1121
+ }
1122
+
1123
+ /**
1124
+ * Generate authoritative DNS records (NS only) for all domains in dnsScopes
1125
+ * SOA records are now automatically generated by smartdns with primaryNameserver setting
1126
+ */
1127
+ private async generateAuthoritativeRecords(): Promise<Array<{name: string; type: string; value: string; ttl?: number}>> {
1128
+ const records: Array<{name: string; type: string; value: string; ttl?: number}> = [];
1129
+
1130
+ if (!this.options.dnsNsDomains || !this.options.dnsScopes) {
1131
+ return records;
1132
+ }
1133
+
1134
+ // Determine the public IP for nameserver A records
1135
+ let publicIp: string | null = null;
1136
+
1137
+ // Use proxy IPs if configured (these should be public IPs)
1138
+ if (this.options.proxyIps && this.options.proxyIps.length > 0) {
1139
+ publicIp = this.options.proxyIps[0]; // Use first proxy IP
1140
+ logger.log('info', `Using proxy IP for nameserver A records: ${publicIp}`);
1141
+ } else if (this.options.publicIp) {
1142
+ // Use explicitly configured public IP
1143
+ publicIp = this.options.publicIp;
1144
+ logger.log('info', `Using configured public IP for nameserver A records: ${publicIp}`);
1145
+ } else {
1146
+ // Auto-discover public IP using smartnetwork
1147
+ try {
1148
+ logger.log('info', 'Auto-discovering public IP address...');
1149
+ const smartNetwork = new plugins.smartnetwork.SmartNetwork();
1150
+ const publicIps = await smartNetwork.getPublicIps();
1151
+
1152
+ if (publicIps.v4) {
1153
+ publicIp = publicIps.v4;
1154
+ logger.log('info', `Auto-discovered public IPv4: ${publicIp}`);
1155
+ } else {
1156
+ logger.log('warn', 'Could not auto-discover public IPv4 address');
1157
+ }
1158
+ } catch (error) {
1159
+ logger.log('error', `Failed to auto-discover public IP: ${error.message}`);
1160
+ }
1161
+
1162
+ if (!publicIp) {
1163
+ logger.log('warn', 'No public IP available. Nameserver A records require either proxyIps, publicIp, or successful auto-discovery.');
1164
+ }
1165
+ }
1166
+
1167
+ // Generate A records for nameservers if we have a public IP
1168
+ if (publicIp) {
1169
+ for (const nsDomain of this.options.dnsNsDomains) {
1170
+ records.push({
1171
+ name: nsDomain,
1172
+ type: 'A',
1173
+ value: publicIp,
1174
+ ttl: 3600
1175
+ });
1176
+ }
1177
+ logger.log('info', `Generated A records for ${this.options.dnsNsDomains.length} nameservers`);
1178
+ }
1179
+
1180
+ // Generate NS records for each domain in scopes
1181
+ for (const domain of this.options.dnsScopes) {
1182
+ // Add NS records for all nameservers
1183
+ for (const nsDomain of this.options.dnsNsDomains) {
1184
+ records.push({
1185
+ name: domain,
1186
+ type: 'NS',
1187
+ value: nsDomain,
1188
+ ttl: 3600
1189
+ });
1190
+ }
1191
+
1192
+ // SOA records are now automatically generated by smartdns DnsServer
1193
+ // with the primaryNameserver configuration option
1194
+ }
1195
+
1196
+ logger.log('info', `Generated ${records.length} total records (A + NS) for ${this.options.dnsScopes.length} domains`);
1197
+ return records;
1198
+ }
1199
+
1200
+ /**
1201
+ * Extract the base domain from a DNS record name
1202
+ */
1203
+ private extractDomain(recordName: string): string {
1204
+ // Handle wildcards
1205
+ if (recordName.startsWith('*.')) {
1206
+ recordName = recordName.substring(2);
1207
+ }
1208
+ return recordName;
1209
+ }
1210
+
1211
+ /**
1212
+ * Apply proxy IP replacement logic to DNS records
1213
+ */
1214
+ private async applyProxyIpReplacement(records: Array<{name: string; type: string; value: string; ttl?: number; useIngressProxy?: boolean}>): Promise<void> {
1215
+ if (!this.options.proxyIps || this.options.proxyIps.length === 0) {
1216
+ return; // No proxy IPs configured, skip replacement
1217
+ }
1218
+
1219
+ // Get server's public IP
1220
+ const serverIp = await this.detectServerPublicIp();
1221
+ if (!serverIp) {
1222
+ logger.log('warn', 'Could not detect server public IP, skipping proxy IP replacement');
1223
+ return;
1224
+ }
1225
+
1226
+ logger.log('info', `Applying proxy IP replacement. Server IP: ${serverIp}, Proxy IPs: ${this.options.proxyIps.join(', ')}`);
1227
+
1228
+ let proxyIndex = 0;
1229
+ for (const record of records) {
1230
+ if (record.type === 'A' &&
1231
+ record.value === serverIp &&
1232
+ record.useIngressProxy !== false) {
1233
+ // Round-robin through proxy IPs
1234
+ const proxyIp = this.options.proxyIps[proxyIndex % this.options.proxyIps.length];
1235
+ logger.log('info', `Replacing A record for ${record.name}: ${record.value} → ${proxyIp}`);
1236
+ record.value = proxyIp;
1237
+ proxyIndex++;
1238
+ }
1239
+ }
1240
+ }
1241
+
1242
+ /**
1243
+ * Detect the server's public IP address
1244
+ */
1245
+ private async detectServerPublicIp(): Promise<string | null> {
1246
+ try {
1247
+ const smartNetwork = new plugins.smartnetwork.SmartNetwork();
1248
+ const publicIps = await smartNetwork.getPublicIps();
1249
+
1250
+ if (publicIps.v4) {
1251
+ return publicIps.v4;
1252
+ }
1253
+
1254
+ return null;
1255
+ } catch (error) {
1256
+ logger.log('warn', `Failed to detect public IP: ${error.message}`);
1257
+ return null;
1258
+ }
1259
+ }
1260
+
1261
+ /**
1262
+ * Create mail socket handler for email traffic
1263
+ */
1264
+ private createMailSocketHandler(port: number): (socket: plugins.net.Socket) => Promise<void> {
1265
+ return async (socket: plugins.net.Socket) => {
1266
+ if (!this.emailServer) {
1267
+ logger.log('error', 'Mail socket handler called but email server not initialized');
1268
+ socket.end();
1269
+ return;
1270
+ }
1271
+
1272
+ logger.log('debug', `Mail socket handler: handling connection for port ${port}`);
1273
+
1274
+ try {
1275
+ // Port 465 requires immediate TLS
1276
+ if (port === 465) {
1277
+ // Wrap the socket in TLS
1278
+ const tlsOptions = {
1279
+ isServer: true,
1280
+ key: this.options.tls?.keyPath ? plugins.fs.readFileSync(this.options.tls.keyPath, 'utf8') : undefined,
1281
+ cert: this.options.tls?.certPath ? plugins.fs.readFileSync(this.options.tls.certPath, 'utf8') : undefined
1282
+ };
1283
+
1284
+ const tlsSocket = new plugins.tls.TLSSocket(socket, tlsOptions);
1285
+
1286
+ tlsSocket.on('secure', () => {
1287
+ // Pass the secure socket to the email server
1288
+ this.emailServer!.handleSocket(tlsSocket, port);
1289
+ });
1290
+
1291
+ tlsSocket.on('error', (err) => {
1292
+ logger.log('error', `TLS handshake error on port ${port}: ${err.message}`);
1293
+ socket.destroy();
1294
+ });
1295
+ } else {
1296
+ // For ports 25 and 587, pass raw socket (STARTTLS handled by email server)
1297
+ await this.emailServer.handleSocket(socket, port);
1298
+ }
1299
+ } catch (error) {
1300
+ logger.log('error', `Mail socket handler error on port ${port}: ${error.message}`);
1301
+ socket.destroy();
1302
+ }
1303
+ };
1304
+ }
1305
+ }
1306
+
1307
+ // Re-export email server types for convenience
1308
+ export type { IUnifiedEmailServerOptions };
1309
+
1310
+ export default DcRouter;