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.
- package/.eslintrc.yaml +4 -9
- package/CONTRIBUTORS.md +11 -0
- package/Changes.md +1397 -1213
- package/Plugins.md +117 -105
- package/README.md +4 -13
- package/bin/haraka +198 -298
- package/config/auth_flat_file.ini +1 -0
- package/config/dhparams.pem +8 -0
- package/config/mail_from.is_resolvable.ini +4 -2
- package/config/me +1 -0
- package/config/outbound.ini +0 -2
- package/config/plugins +35 -36
- package/config/smtp.ini +1 -1
- package/config/smtp.json +17 -0
- package/config/tls.ini +2 -0
- package/config/tls_cert.pem +23 -0
- package/config/tls_key.pem +28 -0
- package/connection.js +46 -73
- package/contrib/bsd-rc.d/haraka +3 -1
- package/contrib/plugin2npm.sh +6 -36
- package/docs/CoreConfig.md +2 -2
- package/docs/Logging.md +7 -21
- package/docs/Outbound.md +104 -201
- package/docs/Plugins.md +2 -2
- package/docs/Transaction.md +59 -82
- package/docs/plugins/queue/smtp_proxy.md +5 -10
- package/docs/plugins/tls.md +37 -9
- package/endpoint.js +16 -13
- package/haraka.js +10 -14
- package/host_pool.js +5 -5
- package/http/html/index.html +6 -5
- package/line_socket.js +3 -4
- package/logger.js +44 -28
- package/outbound/client_pool.js +27 -23
- package/outbound/config.js +4 -6
- package/outbound/fsync_writestream.js +1 -1
- package/outbound/hmail.js +178 -218
- package/outbound/index.js +86 -99
- package/outbound/qfile.js +1 -1
- package/outbound/queue.js +51 -44
- package/outbound/timer_queue.js +3 -2
- package/outbound/tls.js +19 -7
- package/package.json +60 -51
- package/plugins/.eslintrc.yaml +0 -6
- package/plugins/auth/auth_base.js +4 -2
- package/plugins/auth/auth_proxy.js +14 -12
- package/plugins/auth/auth_vpopmaild.js +1 -1
- package/plugins/block_me.js +1 -1
- package/plugins/data.signatures.js +2 -4
- package/plugins/early_talker.js +2 -1
- package/plugins/mail_from.is_resolvable.js +65 -135
- package/plugins/queue/deliver.js +4 -5
- package/plugins/queue/lmtp.js +11 -12
- package/plugins/queue/qmail-queue.js +2 -2
- package/plugins/queue/quarantine.js +2 -2
- package/plugins/queue/rabbitmq.js +16 -17
- package/plugins/queue/smtp_forward.js +3 -3
- package/plugins/queue/smtp_proxy.js +10 -1
- package/plugins/queue/test.js +2 -2
- package/plugins/rcpt_to.host_list_base.js +5 -5
- package/plugins/rcpt_to.in_host_list.js +2 -2
- package/plugins/relay.js +6 -7
- package/plugins/reseed_rng.js +1 -1
- package/plugins/status.js +37 -33
- package/plugins/tls.js +2 -2
- package/plugins/xclient.js +3 -2
- package/plugins.js +50 -54
- package/run_tests +3 -30
- package/server.js +190 -190
- package/smtp_client.js +30 -23
- package/{tests → test}/config/plugins +0 -2
- package/{tests → test}/config/smtp.ini +3 -1
- package/test/config/tls/example.com/_.example.com.key +28 -0
- package/test/config/tls/example.com/example.com.crt +25 -0
- package/{tests/loud → test}/config/tls.ini +4 -2
- package/test/connection.js +302 -0
- package/test/endpoint.js +94 -0
- package/{tests → test}/fixtures/line_socket.js +1 -1
- package/{tests → test}/fixtures/util_hmailitem.js +19 -25
- package/{tests → test}/host_pool.js +42 -57
- package/test/logger.js +258 -0
- package/test/outbound/hmail.js +141 -0
- package/test/outbound/index.js +220 -0
- package/test/outbound/qfile.js +126 -0
- package/test/outbound_bounce_net_errors.js +142 -0
- package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
- package/test/plugins/auth/auth_base.js +484 -0
- package/test/plugins/auth/auth_vpopmaild.js +83 -0
- package/test/plugins/early_talker.js +104 -0
- package/test/plugins/mail_from.is_resolvable.js +35 -0
- package/test/plugins/queue/smtp_forward.js +206 -0
- package/test/plugins/rcpt_to.host_list_base.js +122 -0
- package/test/plugins/rcpt_to.in_host_list.js +193 -0
- package/test/plugins/relay.js +303 -0
- package/test/plugins/status.js +130 -0
- package/test/plugins/tls.js +70 -0
- package/test/plugins.js +228 -0
- package/test/rfc1869.js +73 -0
- package/test/server.js +491 -0
- package/test/smtp_client.js +299 -0
- package/test/tls_socket.js +277 -0
- package/test/transaction.js +270 -0
- package/tls_socket.js +202 -252
- package/transaction.js +8 -23
- package/CONTRIBUTING.md +0 -1
- package/bin/dkimverify +0 -40
- package/config/access.domains +0 -13
- package/config/attachment.ctype.regex +0 -2
- package/config/attachment.filename.regex +0 -1
- package/config/avg.ini +0 -5
- package/config/bounce.ini +0 -15
- package/config/data.headers.ini +0 -61
- package/config/dkim/dkim_key_gen.sh +0 -78
- package/config/dkim_sign.ini +0 -4
- package/config/dkim_verify.ini +0 -7
- package/config/dnsbl.ini +0 -23
- package/config/greylist.ini +0 -43
- package/config/helo.checks.ini +0 -52
- package/config/messagesniffer.ini +0 -18
- package/config/spamassassin.ini +0 -56
- package/dkim.js +0 -614
- package/docs/plugins/avg.md +0 -35
- package/docs/plugins/bounce.md +0 -69
- package/docs/plugins/clamd.md +0 -147
- package/docs/plugins/esets.md +0 -8
- package/docs/plugins/greylist.md +0 -90
- package/docs/plugins/helo.checks.md +0 -135
- package/docs/plugins/messagesniffer.md +0 -163
- package/docs/plugins/spamassassin.md +0 -180
- package/outbound/mx_lookup.js +0 -70
- package/plugins/auth/auth_ldap.js +0 -3
- package/plugins/avg.js +0 -162
- package/plugins/backscatterer.js +0 -25
- package/plugins/bounce.js +0 -381
- package/plugins/clamd.js +0 -382
- package/plugins/data.uribl.js +0 -4
- package/plugins/dkim_sign.js +0 -395
- package/plugins/dkim_verify.js +0 -62
- package/plugins/dns_list_base.js +0 -221
- package/plugins/dnsbl.js +0 -146
- package/plugins/dnswl.js +0 -58
- package/plugins/esets.js +0 -71
- package/plugins/graph.js +0 -5
- package/plugins/greylist.js +0 -645
- package/plugins/helo.checks.js +0 -533
- package/plugins/messagesniffer.js +0 -381
- package/plugins/rcpt_to.ldap.js +0 -3
- package/plugins/rcpt_to.max_count.js +0 -24
- package/plugins/spamassassin.js +0 -384
- package/tests/config/dkim/example.com/dns +0 -29
- package/tests/config/dkim/example.com/private +0 -6
- package/tests/config/dkim/example.com/public +0 -4
- package/tests/config/dkim/example.com/selector +0 -1
- package/tests/config/dkim.private.key +0 -6
- package/tests/config/dkim_sign.ini +0 -4
- package/tests/config/helo.checks.ini +0 -52
- package/tests/connection.js +0 -327
- package/tests/endpoint.js +0 -128
- package/tests/fixtures/vm_harness.js +0 -59
- package/tests/logger.js +0 -327
- package/tests/outbound/hmail.js +0 -112
- package/tests/outbound/index.js +0 -324
- package/tests/outbound/qfile.js +0 -67
- package/tests/outbound_bounce_net_errors.js +0 -173
- package/tests/plugins/auth/auth_base.js +0 -463
- package/tests/plugins/auth/auth_vpopmaild.js +0 -91
- package/tests/plugins/bounce.js +0 -307
- package/tests/plugins/clamd.js +0 -224
- package/tests/plugins/deprecated/relay_acl.js +0 -140
- package/tests/plugins/deprecated/relay_all.js +0 -59
- package/tests/plugins/dkim_sign.js +0 -315
- package/tests/plugins/dkim_signer.js +0 -108
- package/tests/plugins/dns_list_base.js +0 -259
- package/tests/plugins/dnsbl.js +0 -101
- package/tests/plugins/early_talker.js +0 -115
- package/tests/plugins/greylist.js +0 -58
- package/tests/plugins/helo.checks.js +0 -525
- package/tests/plugins/mail_from.is_resolvable.js +0 -116
- package/tests/plugins/queue/smtp_forward.js +0 -221
- package/tests/plugins/rcpt_to.host_list_base.js +0 -132
- package/tests/plugins/rcpt_to.in_host_list.js +0 -218
- package/tests/plugins/relay.js +0 -339
- package/tests/plugins/spamassassin.js +0 -171
- package/tests/plugins/status.js +0 -138
- package/tests/plugins/tls.js +0 -84
- package/tests/plugins.js +0 -247
- package/tests/rfc1869.js +0 -61
- package/tests/server.js +0 -510
- package/tests/smtp_client/auth.js +0 -105
- package/tests/smtp_client/basic.js +0 -101
- package/tests/smtp_client.js +0 -80
- package/tests/tls_socket.js +0 -333
- package/tests/transaction.js +0 -284
- /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
- /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
- /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
- /package/docs/{plugins → deprecated}/dnswl.md +0 -0
- /package/{tests → test}/.eslintrc.yaml +0 -0
- /package/{tests → test}/config/auth_flat_file.ini +0 -0
- /package/{tests → test}/config/dhparams.pem +0 -0
- /package/{tests → test}/config/host_list +0 -0
- /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
- /package/{tests → test}/config/outbound_tls_key.pem +0 -0
- /package/{tests → test}/config/smtp_forward.ini +0 -0
- /package/{tests → test}/config/tls/ec.pem +0 -0
- /package/{tests → test}/config/tls/haraka.local.pem +0 -0
- /package/{tests → test}/config/tls/mismatched.pem +0 -0
- /package/{tests → test}/config/tls_cert.pem +0 -0
- /package/{tests → test}/config/tls_key.pem +0 -0
- /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
- /package/{tests → test}/installation/config/test-plugin-flat +0 -0
- /package/{tests → test}/installation/config/test-plugin.ini +0 -0
- /package/{tests → test}/installation/config/tls.ini +0 -0
- /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
- /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
- /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
- /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
- /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
- /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
- /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
- /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
- /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
- /package/{tests → test}/installation/plugins/inherits.js +0 -0
- /package/{tests → test}/installation/plugins/load_first.js +0 -0
- /package/{tests → test}/installation/plugins/plugin.js +0 -0
- /package/{tests → test}/installation/plugins/tls.js +0 -0
- /package/{tests → test}/loud/config/dhparams.pem +0 -0
- /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
- /package/{tests → test/loud}/config/tls.ini +0 -0
- /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
- /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
- /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
- /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
- /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
- /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
- /package/{tests → test}/queue/multibyte +0 -0
- /package/{tests → test}/queue/plain +0 -0
- /package/{tests → test}/queue/zero-length +0 -0
- /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
|
-
|
|
14
|
+
this.logdebug("About to connect and initialize queue object");
|
|
16
15
|
this.init_rabbitmq_server();
|
|
17
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
+
this.logdebug("queueFailure: #{JSON.stringify(error)}");
|
|
36
35
|
exports.init_rabbitmq_server();
|
|
37
|
-
|
|
36
|
+
next();
|
|
38
37
|
}
|
|
39
38
|
else {
|
|
40
39
|
//Queueing was successful, send ok as reply
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/plugins/queue/test.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
198
|
+
next(OK, nexthop);
|
|
200
199
|
}
|
|
201
200
|
|
|
202
201
|
exports.all = function (next, connection, params) {
|
package/plugins/reseed_rng.js
CHANGED
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)
|
|
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
|
-
|
|
104
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
|
225
|
-
|
|
226
|
+
exports.call_worker = (worker, cmd) => {
|
|
227
|
+
return new Promise((resolve) => {
|
|
228
|
+
let timeout;
|
|
226
229
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
+
function message_handler (sender, msg) {
|
|
231
|
+
if (sender.id !== worker.id) return;
|
|
232
|
+
if (msg.event !== 'status.response') return;
|
|
230
233
|
|
|
231
|
-
|
|
232
|
-
|
|
234
|
+
clearTimeout(timeout);
|
|
235
|
+
server.cluster.removeListener('message', message_handler);
|
|
233
236
|
|
|
234
|
-
|
|
235
|
-
|
|
237
|
+
resolve(msg.result);
|
|
238
|
+
}
|
|
236
239
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
240
|
+
timeout = setTimeout(() => {
|
|
241
|
+
server.cluster.removeListener('message', message_handler);
|
|
242
|
+
resolve();
|
|
243
|
+
}, 1000);
|
|
241
244
|
|
|
242
245
|
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
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
|
-
|
|
135
|
+
next();
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
exports.emit_upgrade_msg = function (conn, verified, verifyErr, cert, cipher) {
|
package/plugins/xclient.js
CHANGED
|
@@ -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
|
-
|
|
123
|
+
next(NEXT_HOOK, 'connect');
|
|
123
124
|
}
|