Haraka 3.0.3 → 3.0.5

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 (239) hide show
  1. package/.eslintrc.yaml +4 -9
  2. package/CONTRIBUTORS.md +11 -0
  3. package/Changes.md +1397 -1213
  4. package/Plugins.md +117 -105
  5. package/README.md +4 -13
  6. package/bin/haraka +198 -298
  7. package/config/auth_flat_file.ini +1 -0
  8. package/config/dhparams.pem +8 -0
  9. package/config/mail_from.is_resolvable.ini +4 -2
  10. package/config/me +1 -0
  11. package/config/outbound.ini +0 -2
  12. package/config/plugins +35 -36
  13. package/config/smtp.ini +1 -1
  14. package/config/smtp.json +17 -0
  15. package/config/tls.ini +2 -0
  16. package/config/tls_cert.pem +23 -0
  17. package/config/tls_key.pem +28 -0
  18. package/connection.js +46 -73
  19. package/contrib/bsd-rc.d/haraka +3 -1
  20. package/contrib/plugin2npm.sh +6 -36
  21. package/docs/CoreConfig.md +2 -2
  22. package/docs/Logging.md +7 -21
  23. package/docs/Outbound.md +104 -201
  24. package/docs/Plugins.md +2 -2
  25. package/docs/Transaction.md +59 -82
  26. package/docs/plugins/queue/smtp_proxy.md +5 -10
  27. package/docs/plugins/tls.md +37 -9
  28. package/endpoint.js +16 -13
  29. package/haraka.js +10 -14
  30. package/host_pool.js +5 -5
  31. package/http/html/index.html +6 -5
  32. package/line_socket.js +3 -4
  33. package/logger.js +44 -28
  34. package/outbound/client_pool.js +27 -23
  35. package/outbound/config.js +4 -6
  36. package/outbound/fsync_writestream.js +1 -1
  37. package/outbound/hmail.js +178 -218
  38. package/outbound/index.js +86 -99
  39. package/outbound/qfile.js +1 -1
  40. package/outbound/queue.js +51 -44
  41. package/outbound/timer_queue.js +3 -2
  42. package/outbound/tls.js +19 -7
  43. package/package.json +60 -51
  44. package/plugins/.eslintrc.yaml +0 -6
  45. package/plugins/auth/auth_base.js +4 -2
  46. package/plugins/auth/auth_proxy.js +14 -12
  47. package/plugins/auth/auth_vpopmaild.js +1 -1
  48. package/plugins/block_me.js +1 -1
  49. package/plugins/data.signatures.js +2 -4
  50. package/plugins/early_talker.js +2 -1
  51. package/plugins/mail_from.is_resolvable.js +65 -135
  52. package/plugins/queue/deliver.js +4 -5
  53. package/plugins/queue/lmtp.js +11 -12
  54. package/plugins/queue/qmail-queue.js +2 -2
  55. package/plugins/queue/quarantine.js +2 -2
  56. package/plugins/queue/rabbitmq.js +16 -17
  57. package/plugins/queue/smtp_forward.js +3 -3
  58. package/plugins/queue/smtp_proxy.js +10 -1
  59. package/plugins/queue/test.js +2 -2
  60. package/plugins/rcpt_to.host_list_base.js +5 -5
  61. package/plugins/rcpt_to.in_host_list.js +2 -2
  62. package/plugins/relay.js +6 -7
  63. package/plugins/reseed_rng.js +1 -1
  64. package/plugins/status.js +37 -33
  65. package/plugins/tls.js +2 -2
  66. package/plugins/xclient.js +3 -2
  67. package/plugins.js +50 -54
  68. package/run_tests +3 -30
  69. package/server.js +190 -190
  70. package/smtp_client.js +30 -23
  71. package/{tests → test}/config/plugins +0 -2
  72. package/{tests → test}/config/smtp.ini +3 -1
  73. package/test/config/tls/example.com/_.example.com.key +28 -0
  74. package/test/config/tls/example.com/example.com.crt +25 -0
  75. package/{tests/loud → test}/config/tls.ini +4 -2
  76. package/test/connection.js +302 -0
  77. package/test/endpoint.js +94 -0
  78. package/{tests → test}/fixtures/line_socket.js +1 -1
  79. package/{tests → test}/fixtures/util_hmailitem.js +19 -25
  80. package/{tests → test}/host_pool.js +42 -57
  81. package/test/logger.js +258 -0
  82. package/test/outbound/hmail.js +141 -0
  83. package/test/outbound/index.js +220 -0
  84. package/test/outbound/qfile.js +126 -0
  85. package/test/outbound_bounce_net_errors.js +142 -0
  86. package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
  87. package/test/plugins/auth/auth_base.js +484 -0
  88. package/test/plugins/auth/auth_vpopmaild.js +83 -0
  89. package/test/plugins/early_talker.js +104 -0
  90. package/test/plugins/mail_from.is_resolvable.js +35 -0
  91. package/test/plugins/queue/smtp_forward.js +206 -0
  92. package/test/plugins/rcpt_to.host_list_base.js +122 -0
  93. package/test/plugins/rcpt_to.in_host_list.js +193 -0
  94. package/test/plugins/relay.js +303 -0
  95. package/test/plugins/status.js +130 -0
  96. package/test/plugins/tls.js +70 -0
  97. package/test/plugins.js +228 -0
  98. package/test/rfc1869.js +73 -0
  99. package/test/server.js +491 -0
  100. package/test/smtp_client.js +299 -0
  101. package/test/tls_socket.js +277 -0
  102. package/test/transaction.js +270 -0
  103. package/tls_socket.js +202 -252
  104. package/transaction.js +8 -23
  105. package/CONTRIBUTING.md +0 -1
  106. package/bin/dkimverify +0 -40
  107. package/config/access.domains +0 -13
  108. package/config/attachment.ctype.regex +0 -2
  109. package/config/attachment.filename.regex +0 -1
  110. package/config/avg.ini +0 -5
  111. package/config/bounce.ini +0 -15
  112. package/config/data.headers.ini +0 -61
  113. package/config/dkim/dkim_key_gen.sh +0 -78
  114. package/config/dkim_sign.ini +0 -4
  115. package/config/dkim_verify.ini +0 -7
  116. package/config/dnsbl.ini +0 -23
  117. package/config/greylist.ini +0 -43
  118. package/config/helo.checks.ini +0 -52
  119. package/config/messagesniffer.ini +0 -18
  120. package/config/spamassassin.ini +0 -56
  121. package/dkim.js +0 -614
  122. package/docs/plugins/avg.md +0 -35
  123. package/docs/plugins/bounce.md +0 -69
  124. package/docs/plugins/clamd.md +0 -147
  125. package/docs/plugins/esets.md +0 -8
  126. package/docs/plugins/greylist.md +0 -90
  127. package/docs/plugins/helo.checks.md +0 -135
  128. package/docs/plugins/messagesniffer.md +0 -163
  129. package/docs/plugins/spamassassin.md +0 -180
  130. package/outbound/mx_lookup.js +0 -70
  131. package/plugins/auth/auth_ldap.js +0 -3
  132. package/plugins/avg.js +0 -162
  133. package/plugins/backscatterer.js +0 -25
  134. package/plugins/bounce.js +0 -381
  135. package/plugins/clamd.js +0 -382
  136. package/plugins/data.uribl.js +0 -4
  137. package/plugins/dkim_sign.js +0 -395
  138. package/plugins/dkim_verify.js +0 -62
  139. package/plugins/dns_list_base.js +0 -221
  140. package/plugins/dnsbl.js +0 -146
  141. package/plugins/dnswl.js +0 -58
  142. package/plugins/esets.js +0 -71
  143. package/plugins/graph.js +0 -5
  144. package/plugins/greylist.js +0 -645
  145. package/plugins/helo.checks.js +0 -533
  146. package/plugins/messagesniffer.js +0 -381
  147. package/plugins/rcpt_to.ldap.js +0 -3
  148. package/plugins/rcpt_to.max_count.js +0 -24
  149. package/plugins/spamassassin.js +0 -384
  150. package/tests/config/dkim/example.com/dns +0 -29
  151. package/tests/config/dkim/example.com/private +0 -6
  152. package/tests/config/dkim/example.com/public +0 -4
  153. package/tests/config/dkim/example.com/selector +0 -1
  154. package/tests/config/dkim.private.key +0 -6
  155. package/tests/config/dkim_sign.ini +0 -4
  156. package/tests/config/helo.checks.ini +0 -52
  157. package/tests/connection.js +0 -327
  158. package/tests/endpoint.js +0 -128
  159. package/tests/fixtures/vm_harness.js +0 -59
  160. package/tests/logger.js +0 -327
  161. package/tests/outbound/hmail.js +0 -112
  162. package/tests/outbound/index.js +0 -324
  163. package/tests/outbound/qfile.js +0 -67
  164. package/tests/outbound_bounce_net_errors.js +0 -173
  165. package/tests/plugins/auth/auth_base.js +0 -463
  166. package/tests/plugins/auth/auth_vpopmaild.js +0 -91
  167. package/tests/plugins/bounce.js +0 -307
  168. package/tests/plugins/clamd.js +0 -224
  169. package/tests/plugins/deprecated/relay_acl.js +0 -140
  170. package/tests/plugins/deprecated/relay_all.js +0 -59
  171. package/tests/plugins/dkim_sign.js +0 -315
  172. package/tests/plugins/dkim_signer.js +0 -108
  173. package/tests/plugins/dns_list_base.js +0 -259
  174. package/tests/plugins/dnsbl.js +0 -101
  175. package/tests/plugins/early_talker.js +0 -115
  176. package/tests/plugins/greylist.js +0 -58
  177. package/tests/plugins/helo.checks.js +0 -525
  178. package/tests/plugins/mail_from.is_resolvable.js +0 -116
  179. package/tests/plugins/queue/smtp_forward.js +0 -221
  180. package/tests/plugins/rcpt_to.host_list_base.js +0 -132
  181. package/tests/plugins/rcpt_to.in_host_list.js +0 -218
  182. package/tests/plugins/relay.js +0 -339
  183. package/tests/plugins/spamassassin.js +0 -171
  184. package/tests/plugins/status.js +0 -138
  185. package/tests/plugins/tls.js +0 -84
  186. package/tests/plugins.js +0 -247
  187. package/tests/rfc1869.js +0 -61
  188. package/tests/server.js +0 -510
  189. package/tests/smtp_client/auth.js +0 -105
  190. package/tests/smtp_client/basic.js +0 -101
  191. package/tests/smtp_client.js +0 -80
  192. package/tests/tls_socket.js +0 -333
  193. package/tests/transaction.js +0 -284
  194. /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
  195. /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
  196. /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
  197. /package/docs/{plugins → deprecated}/dnswl.md +0 -0
  198. /package/{tests → test}/.eslintrc.yaml +0 -0
  199. /package/{tests → test}/config/auth_flat_file.ini +0 -0
  200. /package/{tests → test}/config/dhparams.pem +0 -0
  201. /package/{tests → test}/config/host_list +0 -0
  202. /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
  203. /package/{tests → test}/config/outbound_tls_key.pem +0 -0
  204. /package/{tests → test}/config/smtp_forward.ini +0 -0
  205. /package/{tests → test}/config/tls/ec.pem +0 -0
  206. /package/{tests → test}/config/tls/haraka.local.pem +0 -0
  207. /package/{tests → test}/config/tls/mismatched.pem +0 -0
  208. /package/{tests → test}/config/tls_cert.pem +0 -0
  209. /package/{tests → test}/config/tls_key.pem +0 -0
  210. /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
  211. /package/{tests → test}/installation/config/test-plugin-flat +0 -0
  212. /package/{tests → test}/installation/config/test-plugin.ini +0 -0
  213. /package/{tests → test}/installation/config/tls.ini +0 -0
  214. /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
  215. /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
  216. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
  217. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
  218. /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
  219. /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
  220. /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
  221. /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
  222. /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
  223. /package/{tests → test}/installation/plugins/inherits.js +0 -0
  224. /package/{tests → test}/installation/plugins/load_first.js +0 -0
  225. /package/{tests → test}/installation/plugins/plugin.js +0 -0
  226. /package/{tests → test}/installation/plugins/tls.js +0 -0
  227. /package/{tests → test}/loud/config/dhparams.pem +0 -0
  228. /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
  229. /package/{tests → test/loud}/config/tls.ini +0 -0
  230. /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
  231. /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
  232. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
  233. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
  234. /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
  235. /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
  236. /package/{tests → test}/queue/multibyte +0 -0
  237. /package/{tests → test}/queue/plain +0 -0
  238. /package/{tests → test}/queue/zero-length +0 -0
  239. /package/{tests → test}/test-queue/delete-me +0 -0
@@ -1,5 +1,4 @@
1
1
  const amqp = require('amqp');
2
- const logger = require('./logger');
3
2
 
4
3
  let rabbitqueue;
5
4
  let exchangeName;
@@ -12,41 +11,41 @@ exports.exchangeMapping = {}
12
11
 
13
12
  //This method registers the hook and try to initialize the connection to rabbitmq server for later use.
14
13
  exports.register = function () {
15
- logger.logdebug("About to connect and initialize queue object");
14
+ this.logdebug("About to connect and initialize queue object");
16
15
  this.init_rabbitmq_server();
17
- logger.logdebug(`Finished initiating : ${exports.exchangeMapping[exchangeName + queueName]}`);
16
+ this.logdebug(`Finished initiating : ${exports.exchangeMapping[exchangeName + queueName]}`);
18
17
  }
19
18
 
20
19
 
21
20
  //Actual magic of publishing message to rabbit when email comes happen here.
22
- exports.hook_queue = (next, connection) => {
21
+ exports.hook_queue = function (next, connection) {
23
22
  if (!connection?.transaction) return next();
24
23
 
25
24
  //Calling the get_data method and when it gets the data on callback, publish the message to queue with routing key.
26
25
  connection.transaction.message_stream.get_data(buffere => {
27
26
  const exchangeData = exports.exchangeMapping[exchangeName + queueName]
28
- logger.logdebug(`Sending the data: ${ queueName} Routing : ${exchangeData} exchange :${connExchange_}`);
27
+ this.logdebug(`Sending the data: ${ queueName} Routing : ${exchangeData} exchange :${connExchange_}`);
29
28
  if (connExchange_ && routing_) {
30
29
  //This is publish function of rabbitmq amqp library, currently direct queue is configured and routing is fixed.
31
30
  //Needs to be changed.
32
31
  connExchange_.publish(routing_, buffere,{deliveryMode}, error => {
33
32
  if (error) {
34
33
  //There was some error while sending the email to queue.
35
- logger.logdebug("queueFailure: #{JSON.stringify(error)}");
34
+ this.logdebug("queueFailure: #{JSON.stringify(error)}");
36
35
  exports.init_rabbitmq_server();
37
- return next();
36
+ next();
38
37
  }
39
38
  else {
40
39
  //Queueing was successful, send ok as reply
41
- logger.logdebug( "queueSuccess");
42
- return next(OK,"Successfully Queued! in rabbitmq");
40
+ this.logdebug( "queueSuccess");
41
+ next(OK,"Successfully Queued! in rabbitmq");
43
42
  }
44
43
  });
45
44
  }
46
45
  else {
47
46
  //Seems like connExchange is not defined , lets create one for next call
48
47
  exports.init_rabbitmq_server();
49
- return next();
48
+ next();
50
49
  }
51
50
  });
52
51
  }
@@ -88,18 +87,18 @@ exports.init_rabbitmq_server = function () {
88
87
 
89
88
 
90
89
  //Create connection to the rabbitmq server
91
- logger.logdebug("About to Create connection with server");
90
+ this.logdebug("About to Create connection with server");
92
91
  rabbitqueue = amqp.createConnection(options);
93
92
 
94
93
 
95
94
  //Declaring listerner on error on connection.
96
95
  rabbitqueue.on('error', error => {
97
- logger.logdebug(`There was some error on the connection : ${error}`);
96
+ this.logerror(`There was some error on the connection : ${error}`);
98
97
  });
99
98
 
100
99
  //Declaring listerner on close on connection.
101
100
  rabbitqueue.on('close', close => {
102
- logger.logdebug(` Connection is beingclosed : ${close}`);
101
+ this.logdebug(` Connection is being closed : ${close}`);
103
102
  });
104
103
 
105
104
 
@@ -111,16 +110,16 @@ exports.init_rabbitmq_server = function () {
111
110
  */
112
111
 
113
112
  rabbitqueue.on('ready', () => {
114
- logger.logdebug("Connection is ready, will try making exchange");
113
+ this.logdebug("Connection is ready, will try making exchange");
115
114
  // Now connection is ready will try to open exchange with config data.
116
115
  rabbitqueue.exchange(exchangeName, { type: exchangeType, confirm, durable }, connExchange => {
117
116
 
118
117
 
119
- logger.logdebug(`connExchange with server ${connExchange} autoDelete : ${autoDelete}`);
118
+ this.logdebug(`connExchange with server ${connExchange} autoDelete : ${autoDelete}`);
120
119
 
121
120
  //Exchange is now open, will try to open queue.
122
121
  return rabbitqueue.queue(queueName,{autoDelete, durable }, connQueue => {
123
- logger.logdebug(`connQueue with server ${connQueue}`);
122
+ this.logdebug(`connQueue with server ${connQueue}`);
124
123
 
125
124
  //Creating the Routing key to bind the queue and exchange.
126
125
  const routing = `${queueName}Routing`;
@@ -142,7 +141,7 @@ exports.init_rabbitmq_server = function () {
142
141
  routing : routing_,
143
142
  queueName
144
143
  });
145
- logger.logdebug(`exchange: ${exchangeName}, queue: ${queueName} exchange : ${connExchange_} queue : ${connQueue_}` );
144
+ this.logdebug(`exchange: ${exchangeName}, queue: ${queueName} exchange : ${connExchange_} queue : ${connQueue_}` );
146
145
  });
147
146
  });
148
147
  });
@@ -4,7 +4,7 @@
4
4
  // and passes back any errors seen on the ongoing server to the
5
5
  // originating server.
6
6
 
7
- const url = require('url');
7
+ const url = require('node:url');
8
8
 
9
9
  const smtp_client_mod = require('./smtp_client');
10
10
 
@@ -230,6 +230,7 @@ exports.forward_enabled = function (conn, dom_cfg) {
230
230
 
231
231
  exports.queue_forward = function (next, connection) {
232
232
  const plugin = this;
233
+ if (connection.remote.closed) return
233
234
  const txn = connection?.transaction;
234
235
 
235
236
  const cfg = plugin.get_config(connection);
@@ -247,8 +248,7 @@ exports.queue_forward = function (next, connection) {
247
248
  );
248
249
 
249
250
  function get_rs () {
250
- if (txn) return txn.results;
251
- return connection.results;
251
+ return connection?.transaction?.results ? connection.transaction.results : connection.results
252
252
  }
253
253
 
254
254
  function dead_sender () {
@@ -79,6 +79,10 @@ exports.hook_mail = function (next, connection, params) {
79
79
  exports.hook_rcpt_ok = (next, connection, recipient) => {
80
80
  const { smtp_client } = connection.notes;
81
81
  if (!smtp_client) return next();
82
+ if (smtp_client.is_dead_sender(this, connection)) {
83
+ delete connection.notes.smtp_client;
84
+ return;
85
+ }
82
86
  smtp_client.next = next;
83
87
  smtp_client.send_command('RCPT', `TO:${recipient.format(!smtp_client.smtp_utf8)}`);
84
88
  }
@@ -86,6 +90,11 @@ exports.hook_rcpt_ok = (next, connection, recipient) => {
86
90
  exports.hook_data = (next, connection) => {
87
91
  const { smtp_client } = connection.notes;
88
92
  if (!smtp_client) return next();
93
+
94
+ if (smtp_client.is_dead_sender(this, connection)) {
95
+ delete connection.notes.smtp_client;
96
+ return;
97
+ }
89
98
  smtp_client.next = next;
90
99
  smtp_client.send_command("DATA");
91
100
  }
@@ -96,11 +105,11 @@ exports.hook_queue = function (next, connection) {
96
105
  const { smtp_client } = connection.notes;
97
106
  if (!smtp_client) return next();
98
107
 
99
- smtp_client.next = next;
100
108
  if (smtp_client.is_dead_sender(this, connection)) {
101
109
  delete connection.notes.smtp_client;
102
110
  return;
103
111
  }
112
+ smtp_client.next = next;
104
113
  smtp_client.start_data(connection.transaction.message_stream);
105
114
  }
106
115
 
@@ -1,5 +1,5 @@
1
- const fs = require('fs');
2
- const os = require('os');
1
+ const fs = require('node:fs');
2
+ const os = require('node:os');
3
3
 
4
4
  const tempDir = os.tmpdir();
5
5
 
@@ -40,7 +40,7 @@ exports.hook_mail = function (next, connection, params) {
40
40
 
41
41
  const anti_spoof = this.config.get('host_list.anti_spoof') || false;
42
42
 
43
- if (this.in_host_list(domain) || this.in_host_regex(domain)) {
43
+ if (this.in_host_list(domain, connection) || this.in_host_regex(domain, connection)) {
44
44
  if (anti_spoof && !connection.relaying) {
45
45
  txn.results.add(this, {fail: 'mail_from.anti_spoof'});
46
46
  return next(DENY, `Mail from domain '${domain}' is not allowed from your host`);
@@ -54,16 +54,16 @@ exports.hook_mail = function (next, connection, params) {
54
54
  return next();
55
55
  }
56
56
 
57
- exports.in_host_list = function (domain) {
58
- this.logdebug(`checking ${domain} in config/host_list`);
57
+ exports.in_host_list = function (domain, connection) {
58
+ this.logdebug(connection, `checking ${domain} in config/host_list`);
59
59
  return !!(this.host_list[domain]);
60
60
  }
61
61
 
62
- exports.in_host_regex = function (domain) {
62
+ exports.in_host_regex = function (domain, connection) {
63
63
  if (!this.host_list_regex) return false;
64
64
  if (!this.host_list_regex.length) return false;
65
65
 
66
- this.logdebug(`checking ${domain} against config/host_list_regex `);
66
+ this.logdebug(connection, `checking ${domain} against config/host_list_regex `);
67
67
 
68
68
  return !!(this.hl_re.test(domain));
69
69
  }
@@ -32,12 +32,12 @@ exports.hook_rcpt = function (next, connection, params) {
32
32
 
33
33
  const domain = rcpt.host.toLowerCase();
34
34
 
35
- if (this.in_host_list(domain)) {
35
+ if (this.in_host_list(domain, connection)) {
36
36
  txn.results.add(this, {pass: 'rcpt_to'});
37
37
  return next(OK);
38
38
  }
39
39
 
40
- if (this.in_host_regex(domain)) {
40
+ if (this.in_host_regex(domain, connection)) {
41
41
  txn.results.add(this, {pass: 'rcpt_to'});
42
42
  return next(OK);
43
43
  }
package/plugins/relay.js CHANGED
@@ -2,8 +2,9 @@
2
2
  //
3
3
  // documentation via: haraka -h relay
4
4
 
5
+ const net = require('node:net');
6
+
5
7
  const ipaddr = require('ipaddr.js');
6
- const net = require('net');
7
8
 
8
9
  exports.register = function () {
9
10
 
@@ -89,11 +90,9 @@ exports.acl = function (next, connection) {
89
90
  }
90
91
 
91
92
  exports.pass_relaying = (next, connection) => {
92
- if (connection.relaying) {
93
- return next(OK);
94
- }
93
+ if (connection.relaying) return next(OK);
95
94
 
96
- return next();
95
+ next();
97
96
  }
98
97
 
99
98
  exports.is_acl_allowed = function (connection) {
@@ -172,7 +171,7 @@ exports.dest_domains = function (next, connection, params) {
172
171
  }
173
172
 
174
173
  transaction.results.add(this, {fail: 'relay_dest_domain'});
175
- return next(DENY, "Mail for that recipient is not accepted here.");
174
+ next(DENY, "Mail for that recipient is not accepted here.");
176
175
  }
177
176
 
178
177
  exports.force_routing = function (next, hmail, domain) {
@@ -196,7 +195,7 @@ exports.force_routing = function (next, hmail, domain) {
196
195
  }
197
196
 
198
197
  this.logdebug(this, `using ${nexthop} for: ${domain}`);
199
- return next(OK, nexthop);
198
+ next(OK, nexthop);
200
199
  }
201
200
 
202
201
  exports.all = function (next, connection, params) {
@@ -1,4 +1,4 @@
1
- const crypto = require('crypto');
1
+ const crypto = require('node:crypto');
2
2
 
3
3
  exports.hook_init_child = function (next) {
4
4
  Math.seedrandom(crypto.randomBytes(256).toString('hex'));
package/plugins/status.js CHANGED
@@ -1,8 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const fs = require('fs');
4
- const path = require('path');
5
- const async = require('async');
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
6
5
 
7
6
  exports.register = function () {
8
7
  this.outbound = require('../outbound');
@@ -81,38 +80,36 @@ exports.pool_list = cb => {
81
80
  const result = {};
82
81
 
83
82
  if (server.notes.pool) {
84
- Object.keys(server.notes.pool).forEach(name => {
83
+ for (const name of Object.keys(server.notes.pool)) {
85
84
  const instance = server.notes.pool[name];
86
85
 
87
86
  result[name] = {
88
87
  inUse: instance.inUseObjectsCount(),
89
88
  size: instance.getPoolSize()
90
89
  };
91
- });
90
+ }
92
91
  }
93
92
 
94
93
  cb(null, result);
95
94
  }
96
95
 
97
96
  exports.queue_list = function (cb) {
98
- this.outbound.list_queue((err, qlist) => {
99
- if (err) cb(err);
100
-
97
+ this.outbound.list_queue((err, qlist = []) => {
101
98
  const result = [];
102
99
 
103
- if (qlist) {
104
- qlist.forEach((todo) => result.push({
100
+ for (const todo of qlist) {
101
+ result.push({
105
102
  file: todo.file,
106
103
  uuid: todo.uuid,
107
104
  queue_time: todo.queue_time,
108
105
  domain: todo.domain,
109
106
  from: todo.mail_from.toString(),
110
107
  to: todo.rcpt_to.map((r) => r.toString())
111
- }));
108
+ })
112
109
  }
113
110
 
114
111
  cb(err, result);
115
- });
112
+ })
116
113
  }
117
114
 
118
115
  exports.queue_stats = function (cb) {
@@ -165,14 +162,14 @@ exports.queue_push = function (file, cb) {
165
162
  // cluster IPC
166
163
 
167
164
  exports.hook_init_master = function (next) {
168
- const self = this;
165
+ const plugin = this;
169
166
 
170
167
  if (!server.cluster) return next();
171
168
 
172
169
  function message_handler (sender, msg) {
173
170
  if (msg.event !== 'status.request') return;
174
171
 
175
- self.call_workers(msg, (err, response) => {
172
+ plugin.call_workers(msg, (response) => {
176
173
  msg.result = response.filter((el) => el != null);
177
174
  msg.event = 'status.result';
178
175
  sender.send(msg);
@@ -214,32 +211,39 @@ exports.call_master = (cmd, cb) => {
214
211
  }
215
212
 
216
213
  exports.call_workers = function (cmd, cb) {
217
-
218
- async.map(server.cluster.workers, (w, done) => {
219
- this.call_worker(w, cmd, done);
220
- }, cb);
214
+ Promise.allSettled(
215
+ Object.values(server.cluster.workers).map(w => this.call_worker(w, cmd))
216
+ )
217
+ .then(r => {
218
+ cb(
219
+ // r.filter(s => s.status === 'rejected').flatMap(s => s.reason),
220
+ r.filter(s => s.status === 'fulfilled').flatMap(s => s.value),
221
+ )
222
+ })
221
223
  }
222
224
 
223
225
  // sends command to worker and then wait for response or timeout
224
- exports.call_worker = (worker, cmd, cb) => {
225
- let timeout;
226
+ exports.call_worker = (worker, cmd) => {
227
+ return new Promise((resolve) => {
228
+ let timeout;
226
229
 
227
- function message_handler (sender, msg) {
228
- if (sender.id !== worker.id) return;
229
- if (msg.event !== 'status.response') return;
230
+ function message_handler (sender, msg) {
231
+ if (sender.id !== worker.id) return;
232
+ if (msg.event !== 'status.response') return;
230
233
 
231
- clearTimeout(timeout);
232
- server.cluster.removeListener('message', message_handler);
234
+ clearTimeout(timeout);
235
+ server.cluster.removeListener('message', message_handler);
233
236
 
234
- cb(null, msg.result);
235
- }
237
+ resolve(msg.result);
238
+ }
236
239
 
237
- timeout = setTimeout(() => {
238
- server.cluster.removeListener('message', message_handler);
239
- cb();
240
- }, 1000);
240
+ timeout = setTimeout(() => {
241
+ server.cluster.removeListener('message', message_handler);
242
+ resolve();
243
+ }, 1000);
241
244
 
242
245
 
243
- server.cluster.on('message', message_handler);
244
- worker.send(cmd);
246
+ server.cluster.on('message', message_handler);
247
+ worker.send(cmd);
248
+ })
245
249
  }
package/plugins/tls.js CHANGED
@@ -123,7 +123,7 @@ exports.upgrade_connection = function (next, connection, params) {
123
123
 
124
124
  connection.results.add(plugin, connection.tls);
125
125
  plugin.emit_upgrade_msg(connection, verified, verifyErr, cert, cipher);
126
- return next(OK); // Return OK as we responded to the client
126
+ next(OK);
127
127
  })
128
128
  })
129
129
  }
@@ -132,7 +132,7 @@ exports.hook_disconnect = (next, connection) => {
132
132
  if (connection.notes.cleanUpDisconnect) {
133
133
  connection.notes.cleanUpDisconnect(true);
134
134
  }
135
- return next();
135
+ next();
136
136
  }
137
137
 
138
138
  exports.emit_upgrade_msg = function (conn, verified, verifyErr, cert, cipher) {
@@ -1,9 +1,10 @@
1
1
  // Implementation of XCLIENT protocol
2
2
  // See http://www.postfix.org/XCLIENT_README.html
3
3
 
4
+ const net = require('node:net');
5
+
4
6
  const utils = require('haraka-utils');
5
7
  const DSN = require('haraka-dsn');
6
- const net = require('net');
7
8
  let allowed_hosts = {};
8
9
 
9
10
  exports.register = function () {
@@ -119,5 +120,5 @@ exports.hook_unrecognized_command = function (next, connection, params) {
119
120
  connection.xclient = true;
120
121
  if (!xclient.name) return next(NEXT_HOOK, 'lookup_rdns');
121
122
 
122
- return next(NEXT_HOOK, 'connect');
123
+ next(NEXT_HOOK, 'connect');
123
124
  }