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.
- package/.eslintrc.yaml +5 -9
- package/.prettierrc.yml +1 -0
- package/CONTRIBUTORS.md +11 -0
- package/Changes.md +1393 -1211
- package/Dockerfile +3 -3
- package/Plugins.md +119 -106
- package/README.md +7 -16
- package/TODO +1 -24
- package/bin/haraka +197 -298
- package/config/auth_flat_file.ini +2 -0
- package/config/auth_vpopmaild.ini +4 -2
- 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 +36 -35
- package/config/rabbitmq_amqplib.ini +8 -1
- package/config/smtp.ini +0 -1
- package/config/smtp.json +17 -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/Connection.md +1 -1
- package/docs/CoreConfig.md +2 -2
- package/docs/Logging.md +7 -21
- package/docs/Outbound.md +104 -210
- package/docs/Plugins.md +47 -40
- package/docs/Transaction.md +59 -82
- package/docs/{plugins → deprecated}/connect.rdns_access.md +1 -1
- package/docs/{plugins → deprecated}/mail_from.access.md +1 -1
- package/docs/{plugins → deprecated}/rcpt_to.access.md +1 -1
- package/docs/plugins/auth/auth_vpopmaild.md +15 -19
- package/docs/plugins/auth/flat_file.md +23 -30
- package/docs/plugins/queue/rabbitmq_amqplib.md +7 -0
- package/docs/plugins/queue/smtp_forward.md +1 -1
- package/docs/plugins/queue/smtp_proxy.md +5 -10
- package/docs/plugins/relay.md +2 -2
- package/docs/plugins/tls.md +29 -9
- package/endpoint.js +16 -13
- package/haraka.js +10 -14
- package/host_pool.js +5 -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 +180 -220
- package/outbound/index.js +86 -99
- package/outbound/qfile.js +1 -1
- package/outbound/queue.js +55 -43
- package/outbound/timer_queue.js +3 -2
- package/outbound/tls.js +19 -7
- package/package.json +66 -55
- package/plugins/.eslintrc.yaml +0 -6
- package/plugins/auth/auth_base.js +30 -12
- package/plugins/auth/auth_proxy.js +14 -12
- package/plugins/auth/auth_vpopmaild.js +30 -20
- package/plugins/auth/flat_file.js +17 -12
- 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 -14
- 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/rabbitmq_amqplib.js +1 -1
- package/plugins/queue/smtp_forward.js +6 -6
- 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 +51 -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 +1 -1
- package/test/config/tls/example.com/_.example.com.key +28 -0
- package/test/config/tls/example.com/example.com.crt +25 -0
- 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/{tests → test}/queue/multibyte +0 -0
- package/{tests → test}/queue/plain +0 -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 +273 -0
- package/test/transaction.js +270 -0
- package/tls_socket.js +202 -252
- package/transaction.js +9 -24
- 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/lookup_rdns.strict.ini +0 -12
- package/config/lookup_rdns.strict.timeout +0 -1
- package/config/lookup_rdns.strict.whitelist +0 -1
- package/config/lookup_rdns.strict.whitelist_regex +0 -5
- package/config/messagesniffer.ini +0 -18
- package/config/rcpt_to.blocklist +0 -1
- package/config/rdns.allow_regexps +0 -0
- package/config/rdns.deny_regexps +0 -0
- package/config/spamassassin.ini +0 -56
- package/config.js +0 -6
- 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/relay_acl.md +0 -29
- package/docs/plugins/relay_all.md +0 -15
- package/docs/plugins/relay_force_routing.md +0 -33
- 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 -381
- package/plugins/data.headers.js +0 -4
- 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/relay_all.js +0 -13
- 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/docs/{plugins → deprecated}/rcpt_to.routes.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.ini +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/zero-length +0 -0
- /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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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,
|
|
239
|
-
if (logger.loglevel < logger[key])
|
|
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: (
|
|
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
|
|
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
|
|
263
|
+
else if (Object.hasOwn(data, 'name')) { // outbound
|
|
262
264
|
logobj.origin = data.name;
|
|
263
|
-
|
|
264
|
-
|
|
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 (
|
|
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,
|
|
317
|
-
if (!object) return
|
|
318
|
-
if (typeof(object) !== 'object') return;
|
|
311
|
+
logger.add_log_methods = (object, logName) => {
|
|
312
|
+
if (!object) return
|
|
319
313
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
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');
|
package/outbound/client_pool.js
CHANGED
|
@@ -1,48 +1,52 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const utils
|
|
3
|
+
const utils = require('haraka-utils');
|
|
4
|
+
const net_utils = require('haraka-net-utils')
|
|
4
5
|
|
|
5
|
-
const
|
|
6
|
-
const logger
|
|
6
|
+
const tls_socket = require('../tls_socket');
|
|
7
|
+
const logger = require('../logger');
|
|
8
|
+
const obc = require('./config');
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
exports.name = 'outbound'
|
|
9
11
|
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(`
|
|
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,
|
|
45
|
-
|
|
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
|
}
|
package/outbound/config.js
CHANGED
|
@@ -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.
|
|
68
|
-
logger.
|
|
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
|
|