Haraka 3.0.2 → 3.0.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 (267) hide show
  1. package/.eslintrc.yaml +5 -9
  2. package/.prettierrc.yml +1 -0
  3. package/CONTRIBUTORS.md +11 -0
  4. package/Changes.md +1393 -1211
  5. package/Dockerfile +3 -3
  6. package/Plugins.md +119 -106
  7. package/README.md +7 -16
  8. package/TODO +1 -24
  9. package/bin/haraka +197 -298
  10. package/config/auth_flat_file.ini +2 -0
  11. package/config/auth_vpopmaild.ini +4 -2
  12. package/config/dhparams.pem +8 -0
  13. package/config/mail_from.is_resolvable.ini +4 -2
  14. package/config/me +1 -0
  15. package/config/outbound.ini +0 -2
  16. package/config/plugins +36 -35
  17. package/config/rabbitmq_amqplib.ini +8 -1
  18. package/config/smtp.ini +0 -1
  19. package/config/smtp.json +17 -0
  20. package/config/tls_cert.pem +23 -0
  21. package/config/tls_key.pem +28 -0
  22. package/connection.js +46 -73
  23. package/contrib/bsd-rc.d/haraka +3 -1
  24. package/contrib/plugin2npm.sh +6 -36
  25. package/docs/Connection.md +1 -1
  26. package/docs/CoreConfig.md +2 -2
  27. package/docs/Logging.md +7 -21
  28. package/docs/Outbound.md +104 -210
  29. package/docs/Plugins.md +47 -40
  30. package/docs/Transaction.md +59 -82
  31. package/docs/{plugins → deprecated}/connect.rdns_access.md +1 -1
  32. package/docs/{plugins → deprecated}/mail_from.access.md +1 -1
  33. package/docs/{plugins → deprecated}/rcpt_to.access.md +1 -1
  34. package/docs/plugins/auth/auth_vpopmaild.md +15 -19
  35. package/docs/plugins/auth/flat_file.md +23 -30
  36. package/docs/plugins/queue/rabbitmq_amqplib.md +7 -0
  37. package/docs/plugins/queue/smtp_forward.md +1 -1
  38. package/docs/plugins/queue/smtp_proxy.md +5 -10
  39. package/docs/plugins/relay.md +2 -2
  40. package/docs/plugins/tls.md +29 -9
  41. package/endpoint.js +16 -13
  42. package/haraka.js +10 -14
  43. package/host_pool.js +5 -5
  44. package/line_socket.js +3 -4
  45. package/logger.js +44 -28
  46. package/outbound/client_pool.js +27 -23
  47. package/outbound/config.js +4 -6
  48. package/outbound/fsync_writestream.js +1 -1
  49. package/outbound/hmail.js +180 -220
  50. package/outbound/index.js +86 -99
  51. package/outbound/qfile.js +1 -1
  52. package/outbound/queue.js +55 -43
  53. package/outbound/timer_queue.js +3 -2
  54. package/outbound/tls.js +19 -7
  55. package/package.json +66 -55
  56. package/plugins/.eslintrc.yaml +0 -6
  57. package/plugins/auth/auth_base.js +30 -12
  58. package/plugins/auth/auth_proxy.js +14 -12
  59. package/plugins/auth/auth_vpopmaild.js +30 -20
  60. package/plugins/auth/flat_file.js +17 -12
  61. package/plugins/block_me.js +1 -1
  62. package/plugins/data.signatures.js +2 -4
  63. package/plugins/early_talker.js +2 -1
  64. package/plugins/mail_from.is_resolvable.js +65 -135
  65. package/plugins/queue/deliver.js +4 -5
  66. package/plugins/queue/lmtp.js +11 -14
  67. package/plugins/queue/qmail-queue.js +2 -2
  68. package/plugins/queue/quarantine.js +2 -2
  69. package/plugins/queue/rabbitmq.js +16 -17
  70. package/plugins/queue/rabbitmq_amqplib.js +1 -1
  71. package/plugins/queue/smtp_forward.js +6 -6
  72. package/plugins/queue/smtp_proxy.js +10 -1
  73. package/plugins/queue/test.js +2 -2
  74. package/plugins/rcpt_to.host_list_base.js +5 -5
  75. package/plugins/rcpt_to.in_host_list.js +2 -2
  76. package/plugins/relay.js +6 -7
  77. package/plugins/reseed_rng.js +1 -1
  78. package/plugins/status.js +37 -33
  79. package/plugins/tls.js +2 -2
  80. package/plugins/xclient.js +3 -2
  81. package/plugins.js +51 -54
  82. package/run_tests +3 -30
  83. package/server.js +190 -190
  84. package/smtp_client.js +30 -23
  85. package/{tests → test}/config/plugins +0 -2
  86. package/{tests → test}/config/smtp.ini +1 -1
  87. package/test/config/tls/example.com/_.example.com.key +28 -0
  88. package/test/config/tls/example.com/example.com.crt +25 -0
  89. package/test/connection.js +302 -0
  90. package/test/endpoint.js +94 -0
  91. package/{tests → test}/fixtures/line_socket.js +1 -1
  92. package/{tests → test}/fixtures/util_hmailitem.js +19 -25
  93. package/{tests → test}/host_pool.js +42 -57
  94. package/test/logger.js +258 -0
  95. package/test/outbound/hmail.js +141 -0
  96. package/test/outbound/index.js +220 -0
  97. package/test/outbound/qfile.js +126 -0
  98. package/test/outbound_bounce_net_errors.js +142 -0
  99. package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
  100. package/test/plugins/auth/auth_base.js +484 -0
  101. package/test/plugins/auth/auth_vpopmaild.js +83 -0
  102. package/test/plugins/early_talker.js +104 -0
  103. package/test/plugins/mail_from.is_resolvable.js +35 -0
  104. package/test/plugins/queue/smtp_forward.js +206 -0
  105. package/test/plugins/rcpt_to.host_list_base.js +122 -0
  106. package/test/plugins/rcpt_to.in_host_list.js +193 -0
  107. package/test/plugins/relay.js +303 -0
  108. package/test/plugins/status.js +130 -0
  109. package/test/plugins/tls.js +70 -0
  110. package/test/plugins.js +228 -0
  111. package/{tests → test}/queue/multibyte +0 -0
  112. package/{tests → test}/queue/plain +0 -0
  113. package/test/rfc1869.js +73 -0
  114. package/test/server.js +491 -0
  115. package/test/smtp_client.js +299 -0
  116. package/test/tls_socket.js +273 -0
  117. package/test/transaction.js +270 -0
  118. package/tls_socket.js +202 -252
  119. package/transaction.js +9 -24
  120. package/CONTRIBUTING.md +0 -1
  121. package/bin/dkimverify +0 -40
  122. package/config/access.domains +0 -13
  123. package/config/attachment.ctype.regex +0 -2
  124. package/config/attachment.filename.regex +0 -1
  125. package/config/avg.ini +0 -5
  126. package/config/bounce.ini +0 -15
  127. package/config/data.headers.ini +0 -61
  128. package/config/dkim/dkim_key_gen.sh +0 -78
  129. package/config/dkim_sign.ini +0 -4
  130. package/config/dkim_verify.ini +0 -7
  131. package/config/dnsbl.ini +0 -23
  132. package/config/greylist.ini +0 -43
  133. package/config/helo.checks.ini +0 -52
  134. package/config/lookup_rdns.strict.ini +0 -12
  135. package/config/lookup_rdns.strict.timeout +0 -1
  136. package/config/lookup_rdns.strict.whitelist +0 -1
  137. package/config/lookup_rdns.strict.whitelist_regex +0 -5
  138. package/config/messagesniffer.ini +0 -18
  139. package/config/rcpt_to.blocklist +0 -1
  140. package/config/rdns.allow_regexps +0 -0
  141. package/config/rdns.deny_regexps +0 -0
  142. package/config/spamassassin.ini +0 -56
  143. package/config.js +0 -6
  144. package/dkim.js +0 -614
  145. package/docs/plugins/avg.md +0 -35
  146. package/docs/plugins/bounce.md +0 -69
  147. package/docs/plugins/clamd.md +0 -147
  148. package/docs/plugins/esets.md +0 -8
  149. package/docs/plugins/greylist.md +0 -90
  150. package/docs/plugins/helo.checks.md +0 -135
  151. package/docs/plugins/messagesniffer.md +0 -163
  152. package/docs/plugins/relay_acl.md +0 -29
  153. package/docs/plugins/relay_all.md +0 -15
  154. package/docs/plugins/relay_force_routing.md +0 -33
  155. package/docs/plugins/spamassassin.md +0 -180
  156. package/outbound/mx_lookup.js +0 -70
  157. package/plugins/auth/auth_ldap.js +0 -3
  158. package/plugins/avg.js +0 -162
  159. package/plugins/backscatterer.js +0 -25
  160. package/plugins/bounce.js +0 -381
  161. package/plugins/clamd.js +0 -381
  162. package/plugins/data.headers.js +0 -4
  163. package/plugins/data.uribl.js +0 -4
  164. package/plugins/dkim_sign.js +0 -395
  165. package/plugins/dkim_verify.js +0 -62
  166. package/plugins/dns_list_base.js +0 -221
  167. package/plugins/dnsbl.js +0 -146
  168. package/plugins/dnswl.js +0 -58
  169. package/plugins/esets.js +0 -71
  170. package/plugins/graph.js +0 -5
  171. package/plugins/greylist.js +0 -645
  172. package/plugins/helo.checks.js +0 -533
  173. package/plugins/messagesniffer.js +0 -381
  174. package/plugins/rcpt_to.ldap.js +0 -3
  175. package/plugins/rcpt_to.max_count.js +0 -24
  176. package/plugins/relay_all.js +0 -13
  177. package/plugins/spamassassin.js +0 -384
  178. package/tests/config/dkim/example.com/dns +0 -29
  179. package/tests/config/dkim/example.com/private +0 -6
  180. package/tests/config/dkim/example.com/public +0 -4
  181. package/tests/config/dkim/example.com/selector +0 -1
  182. package/tests/config/dkim.private.key +0 -6
  183. package/tests/config/dkim_sign.ini +0 -4
  184. package/tests/config/helo.checks.ini +0 -52
  185. package/tests/connection.js +0 -327
  186. package/tests/endpoint.js +0 -128
  187. package/tests/fixtures/vm_harness.js +0 -59
  188. package/tests/logger.js +0 -327
  189. package/tests/outbound/hmail.js +0 -112
  190. package/tests/outbound/index.js +0 -324
  191. package/tests/outbound/qfile.js +0 -67
  192. package/tests/outbound_bounce_net_errors.js +0 -173
  193. package/tests/plugins/auth/auth_base.js +0 -463
  194. package/tests/plugins/auth/auth_vpopmaild.js +0 -91
  195. package/tests/plugins/bounce.js +0 -307
  196. package/tests/plugins/clamd.js +0 -224
  197. package/tests/plugins/deprecated/relay_acl.js +0 -140
  198. package/tests/plugins/deprecated/relay_all.js +0 -59
  199. package/tests/plugins/dkim_sign.js +0 -315
  200. package/tests/plugins/dkim_signer.js +0 -108
  201. package/tests/plugins/dns_list_base.js +0 -259
  202. package/tests/plugins/dnsbl.js +0 -101
  203. package/tests/plugins/early_talker.js +0 -115
  204. package/tests/plugins/greylist.js +0 -58
  205. package/tests/plugins/helo.checks.js +0 -525
  206. package/tests/plugins/mail_from.is_resolvable.js +0 -116
  207. package/tests/plugins/queue/smtp_forward.js +0 -221
  208. package/tests/plugins/rcpt_to.host_list_base.js +0 -132
  209. package/tests/plugins/rcpt_to.in_host_list.js +0 -218
  210. package/tests/plugins/relay.js +0 -339
  211. package/tests/plugins/spamassassin.js +0 -171
  212. package/tests/plugins/status.js +0 -138
  213. package/tests/plugins/tls.js +0 -84
  214. package/tests/plugins.js +0 -247
  215. package/tests/rfc1869.js +0 -61
  216. package/tests/server.js +0 -510
  217. package/tests/smtp_client/auth.js +0 -105
  218. package/tests/smtp_client/basic.js +0 -101
  219. package/tests/smtp_client.js +0 -80
  220. package/tests/tls_socket.js +0 -333
  221. package/tests/transaction.js +0 -284
  222. /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
  223. /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
  224. /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
  225. /package/docs/{plugins → deprecated}/dnswl.md +0 -0
  226. /package/docs/{plugins → deprecated}/rcpt_to.routes.md +0 -0
  227. /package/{tests → test}/.eslintrc.yaml +0 -0
  228. /package/{tests → test}/config/auth_flat_file.ini +0 -0
  229. /package/{tests → test}/config/dhparams.pem +0 -0
  230. /package/{tests → test}/config/host_list +0 -0
  231. /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
  232. /package/{tests → test}/config/outbound_tls_key.pem +0 -0
  233. /package/{tests → test}/config/smtp_forward.ini +0 -0
  234. /package/{tests → test}/config/tls/ec.pem +0 -0
  235. /package/{tests → test}/config/tls/haraka.local.pem +0 -0
  236. /package/{tests → test}/config/tls/mismatched.pem +0 -0
  237. /package/{tests → test}/config/tls.ini +0 -0
  238. /package/{tests → test}/config/tls_cert.pem +0 -0
  239. /package/{tests → test}/config/tls_key.pem +0 -0
  240. /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
  241. /package/{tests → test}/installation/config/test-plugin-flat +0 -0
  242. /package/{tests → test}/installation/config/test-plugin.ini +0 -0
  243. /package/{tests → test}/installation/config/tls.ini +0 -0
  244. /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
  245. /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
  246. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
  247. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
  248. /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
  249. /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
  250. /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
  251. /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
  252. /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
  253. /package/{tests → test}/installation/plugins/inherits.js +0 -0
  254. /package/{tests → test}/installation/plugins/load_first.js +0 -0
  255. /package/{tests → test}/installation/plugins/plugin.js +0 -0
  256. /package/{tests → test}/installation/plugins/tls.js +0 -0
  257. /package/{tests → test}/loud/config/dhparams.pem +0 -0
  258. /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
  259. /package/{tests → test}/loud/config/tls.ini +0 -0
  260. /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
  261. /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
  262. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
  263. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
  264. /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
  265. /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
  266. /package/{tests → test}/queue/zero-length +0 -0
  267. /package/{tests → test}/test-queue/delete-me +0 -0
package/host_pool.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const net = require('net');
3
+ const net = require('node:net');
4
4
  const utils = require('haraka-utils');
5
5
 
6
6
  /* HostPool:
@@ -61,7 +61,7 @@ class HostPool {
61
61
  self.dead_hosts[key] = true;
62
62
 
63
63
  function cb_if_still_dead () {
64
- logger.logwarn(`${host} ${key} is still dead, will retry in ${self.retry_secs} secs`);
64
+ logger.warn(`${host} ${key} is still dead, will retry in ${self.retry_secs} secs`);
65
65
  self.dead_hosts[key] = true;
66
66
  // console.log(1);
67
67
  setTimeout(() => {
@@ -71,7 +71,7 @@ class HostPool {
71
71
 
72
72
  function cb_if_alive () {
73
73
  // console.log(2);
74
- logger.loginfo(`${host} ${key} is back! adding back into pool`);
74
+ logger.info(`${host} ${key} is back! adding back into pool`);
75
75
  delete self.dead_hosts[key];
76
76
  }
77
77
 
@@ -90,7 +90,7 @@ class HostPool {
90
90
  probe_dead_host (
91
91
  host, port, cb_if_still_dead, cb_if_alive
92
92
  ){
93
- logger.loginfo(`probing dead host ${host}:${port}`);
93
+ logger.info(`probing dead host ${host}:${port}`);
94
94
 
95
95
  const connect_timeout_ms = 200; // keep it snappy
96
96
  let s;
@@ -162,7 +162,7 @@ class HostPool {
162
162
  return host;
163
163
  }
164
164
  else {
165
- logger.logwarn(
165
+ logger.warn(
166
166
  `no working hosts found, retrying a dead one, config (probably from smtp_forward.forwarding_host_pool) is '${this.hostports_str}'`);
167
167
  this.last_i = first_i;
168
168
  return this.hosts[first_i];
package/line_socket.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
  // A subclass of Socket which reads data by line
3
3
 
4
- const net = require('net');
4
+ const net = require('node:net');
5
5
  const utils = require('haraka-utils');
6
6
 
7
7
  const tls_socket = require('./tls_socket');
@@ -37,17 +37,16 @@ function setup_line_processor (socket) {
37
37
  exports.Socket = Socket;
38
38
 
39
39
  // New interface - uses TLS
40
- exports.connect = (port, host, cb) => {
40
+ exports.connect = (port, host) => {
41
41
  let options = {};
42
42
  if (typeof port === 'object') {
43
43
  options = port;
44
- cb = host;
45
44
  }
46
45
  else {
47
46
  options.port = port;
48
47
  options.host = host;
49
48
  }
50
- const sock = tls_socket.connect(options, cb);
49
+ const sock = tls_socket.connect(options);
51
50
  setup_line_processor(sock);
52
51
  return sock;
53
52
  }
package/logger.js CHANGED
@@ -1,15 +1,13 @@
1
1
  'use strict';
2
2
  // Log class
3
3
 
4
- const util = require('util');
5
- const tty = require('tty');
4
+ const util = require('node:util');
5
+ const tty = require('node:tty');
6
6
 
7
7
  const config = require('haraka-config');
8
8
  const constants = require('haraka-constants');
9
9
 
10
10
  let plugins;
11
- let connection;
12
- let outbound;
13
11
 
14
12
  const regex = /(^$|[ ="\\])/;
15
13
  const escape_replace_regex = /["\\]/g;
@@ -48,6 +46,7 @@ logger.levels = {
48
46
  ALERT: 1,
49
47
  EMERG: 0,
50
48
  }
49
+ const level_names = Object.keys(logger.levels)
51
50
 
52
51
  for (const le in logger.levels) {
53
52
  logger.levels[`LOG${le}`] = logger.levels[le];
@@ -64,6 +63,7 @@ logger.loglevel = logger.levels.WARN;
64
63
  logger.format = logger.formats.DEFAULT;
65
64
  logger.timestamps = false;
66
65
  logger.deferred_logs = [];
66
+ logger.name = 'logger'
67
67
 
68
68
  logger.colors = {
69
69
  "DATA" : "green",
@@ -235,14 +235,16 @@ logger._init_timestamps = function () {
235
235
 
236
236
  logger._init();
237
237
 
238
- logger.log_if_level = (level, key, plugin) => function () {
239
- if (logger.loglevel < logger[key]) { return; }
238
+ logger.log_if_level = (level, key, origin) => function () {
239
+ if (logger.loglevel < logger[key]) return;
240
+
240
241
  let logobj = {
241
242
  level,
242
243
  uuid: '-',
243
- origin: (plugin || 'core'),
244
+ origin: (origin || 'core'),
244
245
  message: ''
245
246
  };
247
+
246
248
  for (const data of arguments) {
247
249
  if (typeof data !== 'object') {
248
250
  logobj.message += (data);
@@ -251,24 +253,17 @@ logger.log_if_level = (level, key, plugin) => function () {
251
253
  if (!data) continue;
252
254
 
253
255
  // if the object is a connection, add the connection id
254
- if (data instanceof connection.Connection) {
256
+ if (data.constructor?.name === 'Connection') {
255
257
  logobj.uuid = data.uuid;
256
258
  if (data.tran_count > 0) logobj.uuid += `.${data.tran_count}`;
257
259
  }
258
260
  else if (data instanceof plugins.Plugin) {
259
261
  logobj.origin = data.name;
260
262
  }
261
- else if (data.name) {
263
+ else if (Object.hasOwn(data, 'name')) { // outbound
262
264
  logobj.origin = data.name;
263
- }
264
- else if (data instanceof outbound.HMailItem) {
265
- logobj.origin = 'outbound';
266
- if (data.todo) {
267
- if (data.todo.uuid) logobj.uuid = data.todo.uuid;
268
- if (data.todo.client_uuid) { // dirty hack
269
- logobj.origin = `outbound] [${data.todo.client_uuid}`;
270
- }
271
- }
265
+ if (Object.hasOwn(data, 'uuid')) logobj.uuid = data.uuid;
266
+ if (data.todo?.uuid) logobj.uuid = data.todo.uuid; // outbound/hmail
272
267
  }
273
268
  else if (
274
269
  logger.format === logger.formats.LOGFMT && data.constructor === Object) {
@@ -278,7 +273,7 @@ logger.log_if_level = (level, key, plugin) => function () {
278
273
  logger.format === logger.formats.JSON && data.constructor === Object) {
279
274
  logobj = Object.assign(logobj, data);
280
275
  }
281
- else if (typeof data === 'object' && Object.prototype.hasOwnProperty.call(data, "uuid")) {
276
+ else if (Object.hasOwn(data, 'uuid')) { // outbound/client_pool
282
277
  logobj.uuid = data.uuid;
283
278
  }
284
279
  else if (data.constructor === Object) {
@@ -313,14 +308,37 @@ logger.log_if_level = (level, key, plugin) => function () {
313
308
  return true;
314
309
  }
315
310
 
316
- logger.add_log_methods = (object, plugin) => {
317
- if (!object) return;
318
- if (typeof(object) !== 'object') return;
311
+ logger.add_log_methods = (object, logName) => {
312
+ if (!object) return
319
313
 
320
- for (const level in logger.levels) {
321
- const fname = `log${level.toLowerCase()}`;
322
- if (object[fname]) continue; // already added
323
- object[fname] = logger.log_if_level(level, `LOG${level}`, plugin);
314
+ if (typeof object === 'function') {
315
+ // add logging methods to class prototypes (Connection, Plugin, etc.)
316
+
317
+ for (const level of level_names.map(l => l.toLowerCase())) {
318
+ object.prototype[`log${level}`] = (function (level) {
319
+ return function () {
320
+ logger[level].apply(logger, [ this, ...arguments ]);
321
+ };
322
+ })(`log${level}`);
323
+ }
324
+ }
325
+ else if (typeof object === 'object') {
326
+ // add logging methods to objects
327
+
328
+ for (const level of level_names) {
329
+ // objects gets log function names: loginfo, logwarn, logdebug, ...
330
+ const fnNames = [`log${level.toLowerCase()}`]
331
+
332
+ // logger also gets short names
333
+ if (Object.hasOwn(object, 'name') && object.name === 'logger') {
334
+ fnNames.push(level.toLowerCase())
335
+ }
336
+
337
+ for (const fnName of fnNames) {
338
+ if (Object.hasOwn(object, fnName)) continue; // already added
339
+ object[fnName] = logger.log_if_level(level, `LOG${level}`, logName);
340
+ }
341
+ }
324
342
  }
325
343
  }
326
344
 
@@ -328,5 +346,3 @@ logger.add_log_methods(logger);
328
346
 
329
347
  // load these down here so it sees all the logger methods compiled above
330
348
  plugins = require('./plugins');
331
- connection = require('./connection');
332
- outbound = require('./outbound');
@@ -1,48 +1,52 @@
1
1
  'use strict';
2
2
 
3
- const utils = require('haraka-utils');
3
+ const utils = require('haraka-utils');
4
+ const net_utils = require('haraka-net-utils')
4
5
 
5
- const sock = require('../line_socket');
6
- const logger = require('../logger');
6
+ const tls_socket = require('../tls_socket');
7
+ const logger = require('../logger');
8
+ const obc = require('./config');
7
9
 
8
- const obc = require('./config');
10
+ exports.name = 'outbound'
9
11
 
10
- function _create_socket (name, port, host, local_addr, is_unix_socket, callback) {
12
+ // Get a socket for the given attributes.
13
+ exports.get_client = function (mx, callback) {
14
+ const socketArgs = mx.path ? { path: mx.path } : { port: mx.port, host: mx.exchange, localAddress: mx.bind };
15
+
16
+ const socket = tls_socket.connect(socketArgs);
17
+ net_utils.add_line_processor(socket);
11
18
 
12
- const socket = is_unix_socket ? sock.connect({path: host}) : sock.connect({port, host, localAddress: local_addr});
13
- socket.name = name;
19
+ socket.name = `outbound::${JSON.stringify(socketArgs)}`;
14
20
  socket.__uuid = utils.uuid();
15
21
  socket.setTimeout(obc.cfg.connect_timeout * 1000);
16
- logger.logdebug(`[outbound] created. host: ${host} port: ${port}`, { uuid: socket.__uuid });
22
+
23
+ logger.debug(exports, `created ${socket.name}`, { uuid: socket.__uuid });
24
+
17
25
  socket.once('connect', () => {
18
26
  socket.removeAllListeners('error'); // these get added after callback
19
27
  socket.removeAllListeners('timeout');
20
28
  callback(null, socket);
21
- });
29
+ })
30
+
22
31
  socket.once('error', err => {
23
32
  socket.end();
24
33
  socket.removeAllListeners();
25
34
  socket.destroy();
26
- callback(`Outbound connection error: ${err}`, null);
27
- });
35
+ callback(err.message, null);
36
+ })
37
+
28
38
  socket.once('timeout', () => {
29
39
  socket.end();
30
40
  socket.removeAllListeners();
31
41
  socket.destroy();
32
- callback(`Outbound connection timed out to ${host}:${port}`, null);
33
- });
34
- }
35
-
36
-
37
- // Get a socket for the given attributes.
38
- exports.get_client = (port = 25, host = 'localhost', local_addr, is_unix_socket, callback) => {
39
- const name = `outbound::${port}:${host}:${local_addr}`;
40
-
41
- _create_socket(name, port, host, local_addr, is_unix_socket, callback)
42
+ callback(`connection timed out to ${socket.name}`, null);
43
+ })
42
44
  }
43
45
 
44
- exports.release_client = (socket, port, host, local_addr, error) => {
45
- logger.logdebug(`[outbound] release_client: ${socket.__uuid} ${host}:${port} to ${local_addr}`);
46
+ exports.release_client = (socket, mx) => {
47
+ let logMsg = `release_client: ${socket.name}`
48
+ if (mx.bind) logMsg += ` from ${mx.bind}`
49
+ logger.debug(exports, logMsg);
46
50
  socket.removeAllListeners();
47
51
  socket.destroy();
48
52
  }
@@ -3,13 +3,14 @@
3
3
  const config = require('haraka-config');
4
4
  const logger = require('../logger');
5
5
 
6
+ exports.name = 'outbound/config'
7
+
6
8
  function load_config () {
7
9
  const cfg = exports.cfg = config.get('outbound.ini', {
8
10
  booleans: [
9
11
  '-disabled',
10
12
  '-always_split',
11
13
  '+enable_tls',
12
- '-ipv6_enabled',
13
14
  '-local_mx_ok',
14
15
  ],
15
16
  }, () => {
@@ -35,9 +36,6 @@ function load_config () {
35
36
  if (!cfg.connect_timeout) {
36
37
  cfg.connect_timeout = 30;
37
38
  }
38
- if (!cfg.ipv6_enabled && config.get('outbound.ipv6_enabled')) {
39
- cfg.ipv6_enabled = true;
40
- }
41
39
  if (!cfg.received_header) {
42
40
  cfg.received_header = config.get('outbound.received_header') || 'Haraka outbound';
43
41
  }
@@ -64,8 +62,8 @@ exports.set_temp_fail_intervals = function () {
64
62
 
65
63
  // Helpful error function in case of parsing failure
66
64
  function error (i, msg) {
67
- logger.logerror(`outbound temp_fail_intervals syntax error parsing element ${i}: ${msg}`);
68
- logger.logwarn('Setting outbound temp_fail_intervals to old defaults because of previous error');
65
+ logger.error(exports, `temp_fail_intervals syntax error parsing element ${i}: ${msg}`);
66
+ logger.warn(exports, 'Setting outbound temp_fail_intervals to old defaults');
69
67
  set_old_defaults();
70
68
  }
71
69
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const fs = require('fs');
3
+ const fs = require('node:fs');
4
4
 
5
5
  class FsyncWriteStream extends fs.WriteStream {
6
6
  constructor (path, options) {