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
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
// Testing bounce email contents related to errors occuring during
|
|
3
|
+
// Testing bounce email contents related to errors occuring during SMTP dialog
|
|
4
4
|
|
|
5
5
|
// About running the tests:
|
|
6
6
|
// - Making a folder for queuing files
|
|
7
7
|
// - Creating a HMailItem instance using fixtures/util_hmailitem
|
|
8
|
-
// - Talk some
|
|
8
|
+
// - Talk some SMTP in the playbook
|
|
9
9
|
// - Test the outcome by replacing trigger functions with our testing code (outbound.send_email, HMailItem.temp_fail, ...)
|
|
10
10
|
// At one point, the mocked remote SMTP says "5XX" or "4XX" and we test that
|
|
11
11
|
// * outbound.send_email is called with a RFC3464 bounce message
|
|
12
12
|
// * or, in case of 4XX: that temp_fail is called and dsn vars are available)
|
|
13
13
|
|
|
14
|
-
const
|
|
15
|
-
const
|
|
14
|
+
const assert = require('node:assert')
|
|
15
|
+
const fs = require('node:fs');
|
|
16
|
+
const path = require('node:path');
|
|
16
17
|
|
|
17
18
|
const util_hmailitem = require('./fixtures/util_hmailitem');
|
|
18
19
|
const TODOItem = require('../outbound/todo');
|
|
@@ -30,62 +31,55 @@ const outbound_context = {
|
|
|
30
31
|
|
|
31
32
|
const queue_dir = path.resolve(__dirname, 'test-queue');
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
describe('outbound_bounce_rfc3464', () => {
|
|
35
|
+
beforeEach((done) => {
|
|
35
36
|
fs.exists(queue_dir, exists => {
|
|
36
|
-
if (exists)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
fs.mkdir(queue_dir, err => {
|
|
41
|
-
if (err) {
|
|
42
|
-
return done(err);
|
|
43
|
-
}
|
|
44
|
-
done();
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
},
|
|
49
|
-
tearDown: done => {
|
|
50
|
-
fs.exists(queue_dir, exists => {
|
|
51
|
-
if (exists) {
|
|
52
|
-
const files = fs.readdirSync(queue_dir);
|
|
53
|
-
files.forEach((file,index) => {
|
|
54
|
-
const curPath = path.resolve(queue_dir, file);
|
|
55
|
-
if (fs.lstatSync(curPath).isDirectory()) { // recurse
|
|
56
|
-
return done(new Error(`did not expect an sub folder here ("${curPath}")! cancel`));
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
files.forEach((file,index) => {
|
|
60
|
-
const curPath = path.resolve(queue_dir, file);
|
|
61
|
-
fs.unlinkSync(curPath);
|
|
62
|
-
});
|
|
63
|
-
done();
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
37
|
+
if (exists) return done();
|
|
38
|
+
|
|
39
|
+
fs.mkdir(queue_dir, err => {
|
|
40
|
+
if (err) return done(err);
|
|
66
41
|
done();
|
|
67
|
-
}
|
|
68
|
-
})
|
|
69
|
-
}
|
|
70
|
-
'test MAIL FROM responded with 500 5.0.0 triggers send_email() containing bounce msg with codes and message': test => {
|
|
71
|
-
test.expect(9);
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
})
|
|
72
45
|
|
|
73
|
-
|
|
46
|
+
afterEach((done) => {
|
|
47
|
+
fs.exists(queue_dir, exists => {
|
|
48
|
+
if (!exists) return done()
|
|
49
|
+
|
|
50
|
+
const files = fs.readdirSync(queue_dir);
|
|
51
|
+
files.forEach((file,index) => {
|
|
52
|
+
const curPath = path.resolve(queue_dir, file);
|
|
53
|
+
if (fs.lstatSync(curPath).isDirectory()) { // recurse
|
|
54
|
+
return done(new Error(`did not expect an sub folder here ("${curPath}")! cancel`));
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
files.forEach((file,index) => {
|
|
58
|
+
const curPath = path.resolve(queue_dir, file);
|
|
59
|
+
fs.unlinkSync(curPath);
|
|
60
|
+
})
|
|
61
|
+
done();
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('test MAIL FROM responded with 500 5.0.0 triggers send_email() containing bounce msg with codes and message', (done) => {
|
|
66
|
+
|
|
67
|
+
util_hmailitem.newMockHMailItem(outbound_context, done, {}, (mock_hmail) => {
|
|
74
68
|
const mock_socket = mock_sock.connect('testhost', 'testport');
|
|
75
69
|
mock_socket.writable = true;
|
|
76
70
|
|
|
77
71
|
const orig_send_email = outbound_context.exports.send_email;
|
|
72
|
+
|
|
78
73
|
outbound_context.exports.send_email = (from, to, contents, cb, opts) => {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
74
|
+
assert.ok(true, 'outbound.send_email called');
|
|
75
|
+
assert.ok(contents.match(/^Content-type: message\/delivery-status/m), 'its a bounce report');
|
|
76
|
+
assert.ok(contents.match(/^Final-Recipient: rfc822;recipient@domain/m), 'bounce report contains final recipient');
|
|
77
|
+
assert.ok(contents.match(/^Action: failed/m), 'DATA-5XX: bounce report contains action field');
|
|
78
|
+
assert.ok(contents.match(/^Status: 5\.0\.0/m), 'bounce report contains status field with ext. smtp code');
|
|
79
|
+
assert.ok(contents.match(/Absolutely not acceptable\. Basic Test Only\./), 'original upstream message available');
|
|
85
80
|
outbound_context.exports.send_email = orig_send_email;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
};
|
|
81
|
+
done()
|
|
82
|
+
}
|
|
89
83
|
|
|
90
84
|
// The playbook
|
|
91
85
|
// from remote: This line is to be sent (from an mocked remote SMTP) to haraka outbound. This is done in this test.
|
|
@@ -105,27 +99,27 @@ exports.bounce_3464 = {
|
|
|
105
99
|
{ 'from': 'haraka', 'test': 'QUIT', end_test: true }, // this will trigger calling the callback
|
|
106
100
|
];
|
|
107
101
|
|
|
108
|
-
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket,
|
|
102
|
+
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket, done, testPlaybook, () => {
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
})
|
|
109
106
|
|
|
110
|
-
|
|
111
|
-
});
|
|
112
|
-
},
|
|
113
|
-
'test that early response of 3XX triggers temp_fail': test => {
|
|
114
|
-
test.expect(7);
|
|
107
|
+
it('test that early response of 3XX triggers temp_fail', (done) => {
|
|
115
108
|
|
|
116
|
-
util_hmailitem.newMockHMailItem(outbound_context,
|
|
109
|
+
util_hmailitem.newMockHMailItem(outbound_context, done, {}, mock_hmail => {
|
|
117
110
|
const mock_socket = mock_sock.connect('testhost', 'testport');
|
|
118
111
|
mock_socket.writable = true;
|
|
119
112
|
|
|
120
113
|
const orig_temp_fail = HMailItem.prototype.temp_fail;
|
|
121
114
|
HMailItem.prototype.temp_fail = function (err, opts) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
115
|
+
assert.ok(true, 'early-3XX: outbound.temp_fail called');
|
|
116
|
+
assert.equal('3.0.0', this.todo.rcpt_to[0].dsn_status, 'early-3XX: dsn status = 3.0.0');
|
|
117
|
+
assert.equal('delayed', this.todo.rcpt_to[0].dsn_action, 'early-3XX: dsn action = delayed');
|
|
118
|
+
assert.ok(this.todo.rcpt_to[0].dsn_smtp_response.match(/No time for you right now/), 'early-3XX: original upstream message available');
|
|
126
119
|
HMailItem.prototype.temp_fail = orig_temp_fail;
|
|
127
|
-
|
|
128
|
-
}
|
|
120
|
+
done()
|
|
121
|
+
}
|
|
122
|
+
|
|
129
123
|
const testPlaybook = [
|
|
130
124
|
{ 'from': 'remote', 'line': '220 testing-smtp' },
|
|
131
125
|
|
|
@@ -139,26 +133,26 @@ exports.bounce_3464 = {
|
|
|
139
133
|
{ 'from': 'haraka', 'test': 'QUIT', end_test: true }, // this will trigger calling the callback
|
|
140
134
|
];
|
|
141
135
|
|
|
142
|
-
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket,
|
|
136
|
+
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket, done, testPlaybook, () => {
|
|
137
|
+
|
|
138
|
+
})
|
|
139
|
+
})
|
|
140
|
+
})
|
|
143
141
|
|
|
144
|
-
|
|
145
|
-
});
|
|
146
|
-
},
|
|
147
|
-
'test that response of 4XX for RCPT-TO triggers temp_fail': test => {
|
|
148
|
-
test.expect(8);
|
|
142
|
+
it('test that response of 4XX for RCPT-TO triggers temp_fail', (done) => {
|
|
149
143
|
|
|
150
|
-
util_hmailitem.newMockHMailItem(outbound_context,
|
|
144
|
+
util_hmailitem.newMockHMailItem(outbound_context, done, {}, mock_hmail => {
|
|
151
145
|
const mock_socket = mock_sock.connect('testhost', 'testport');
|
|
152
146
|
mock_socket.writable = true;
|
|
153
147
|
|
|
154
148
|
const orig_temp_fail = HMailItem.prototype.temp_fail;
|
|
155
149
|
HMailItem.prototype.temp_fail = function (err, opts) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
150
|
+
assert.ok(true, 'RCPT-TO-4XX: outbound.temp_fail called');
|
|
151
|
+
assert.equal('4.0.0', this.todo.rcpt_to[0].dsn_status, 'RCPT-TO-4XX: dsn status = 4.0.0');
|
|
152
|
+
assert.equal('delayed', this.todo.rcpt_to[0].dsn_action, 'RCPT-TO-4XX: dsn action = delayed');
|
|
153
|
+
assert.ok(this.todo.rcpt_to[0].dsn_smtp_response.match(/Currently not available\. Try again later\./), 'RCPT-TO-4XX: original upstream message available');
|
|
160
154
|
HMailItem.prototype.temp_fail = orig_temp_fail;
|
|
161
|
-
|
|
155
|
+
done()
|
|
162
156
|
};
|
|
163
157
|
const testPlaybook = [
|
|
164
158
|
{ 'from': 'remote', 'line': '220 testing-smtp' },
|
|
@@ -176,26 +170,24 @@ exports.bounce_3464 = {
|
|
|
176
170
|
{ 'from': 'haraka', 'test': 'QUIT', end_test: true }, // this will trigger calling the callback
|
|
177
171
|
];
|
|
178
172
|
|
|
179
|
-
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket,
|
|
173
|
+
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket, done, testPlaybook, () => {})
|
|
174
|
+
})
|
|
175
|
+
})
|
|
180
176
|
|
|
181
|
-
|
|
182
|
-
});
|
|
183
|
-
},
|
|
184
|
-
'test that response of 4XX for DATA triggers temp_fail': test => {
|
|
185
|
-
test.expect(9);
|
|
177
|
+
it('test that response of 4XX for DATA triggers temp_fail', (done) => {
|
|
186
178
|
|
|
187
|
-
util_hmailitem.newMockHMailItem(outbound_context,
|
|
179
|
+
util_hmailitem.newMockHMailItem(outbound_context, done, {}, mock_hmail => {
|
|
188
180
|
const mock_socket = mock_sock.connect('testhost', 'testport');
|
|
189
181
|
mock_socket.writable = true;
|
|
190
182
|
|
|
191
183
|
const orig_temp_fail = HMailItem.prototype.temp_fail;
|
|
192
184
|
HMailItem.prototype.temp_fail = function (err, opts) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
185
|
+
assert.ok(true, 'DATA-4XX: outbound.temp_fail called');
|
|
186
|
+
assert.equal('4.6.0', this.todo.rcpt_to[0].dsn_status, 'DATA-4XX: dsn status = 4.6.0');
|
|
187
|
+
assert.equal('delayed', this.todo.rcpt_to[0].dsn_action, 'DATA-4XX: dsn action = delayed');
|
|
188
|
+
assert.ok(this.todo.rcpt_to[0].dsn_smtp_response.match(/Currently I do not like ascii art cats\./), 'DATA-4XX: original upstream message available');
|
|
197
189
|
HMailItem.prototype.temp_fail = orig_temp_fail;
|
|
198
|
-
|
|
190
|
+
done()
|
|
199
191
|
};
|
|
200
192
|
const testPlaybook = [
|
|
201
193
|
{ 'from': 'remote', 'line': '220 testing-smtp' },
|
|
@@ -217,28 +209,28 @@ exports.bounce_3464 = {
|
|
|
217
209
|
{ 'from': 'haraka', 'test': 'QUIT', end_test: true }, // this will trigger calling the callback
|
|
218
210
|
];
|
|
219
211
|
|
|
220
|
-
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket,
|
|
212
|
+
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket, done, testPlaybook, () => {
|
|
213
|
+
|
|
214
|
+
})
|
|
215
|
+
})
|
|
216
|
+
})
|
|
221
217
|
|
|
222
|
-
|
|
223
|
-
});
|
|
224
|
-
},
|
|
225
|
-
'test that response of 5XX for RCPT-TO triggers send_email() containing bounce msg with codes and message': test => {
|
|
226
|
-
test.expect(10);
|
|
218
|
+
it('test that response of 5XX for RCPT-TO triggers send_email() containing bounce msg with codes and message', (done) => {
|
|
227
219
|
|
|
228
|
-
util_hmailitem.newMockHMailItem(outbound_context,
|
|
220
|
+
util_hmailitem.newMockHMailItem(outbound_context, done, {}, mock_hmail => {
|
|
229
221
|
const mock_socket = mock_sock.connect('testhost', 'testport');
|
|
230
222
|
mock_socket.writable = true;
|
|
231
223
|
|
|
232
224
|
const orig_send_email = outbound_context.exports.send_email;
|
|
233
225
|
outbound_context.exports.send_email = (from, to, contents, cb, opts) => {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
226
|
+
assert.ok(true, 'RCPT-TO-5XX: outbound.send_email called');
|
|
227
|
+
assert.ok(contents.match(/^Content-type: message\/delivery-status/m), 'RCPT-TO-5XX: its a bounce report');
|
|
228
|
+
assert.ok(contents.match(/^Final-Recipient: rfc822;recipient@domain/m), 'RCPT-TO-5XX: bounce report contains final recipient');
|
|
229
|
+
assert.ok(contents.match(/^Action: failed/m), 'DATA-5XX: bounce report contains action field');
|
|
230
|
+
assert.ok(contents.match(/^Status: 5\.1\.1/m), 'RCPT-TO-5XX: bounce report contains status field with our ext. smtp code');
|
|
231
|
+
assert.ok(contents.match(/Not available and will not come back/), 'RCPT-TO-5XX: original upstream message available');
|
|
240
232
|
outbound_context.exports.send_email = orig_send_email;
|
|
241
|
-
|
|
233
|
+
done()
|
|
242
234
|
};
|
|
243
235
|
const testPlaybook = [
|
|
244
236
|
{ 'from': 'remote', 'line': '220 testing-smtp' },
|
|
@@ -256,28 +248,26 @@ exports.bounce_3464 = {
|
|
|
256
248
|
{ 'from': 'haraka', 'test': 'QUIT', end_test: true }, // this will trigger calling the callback
|
|
257
249
|
];
|
|
258
250
|
|
|
259
|
-
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket,
|
|
251
|
+
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket, done, testPlaybook, () => {})
|
|
252
|
+
})
|
|
253
|
+
})
|
|
260
254
|
|
|
261
|
-
|
|
262
|
-
});
|
|
263
|
-
},
|
|
264
|
-
'test that response of 5XX for DATA triggers send_email() containing bounce msg with codes and message': test => {
|
|
265
|
-
test.expect(11);
|
|
255
|
+
it('test that response of 5XX for DATA triggers send_email() containing bounce msg with codes and message', (done) => {
|
|
266
256
|
|
|
267
|
-
util_hmailitem.newMockHMailItem(outbound_context,
|
|
257
|
+
util_hmailitem.newMockHMailItem(outbound_context, done, {}, mock_hmail => {
|
|
268
258
|
const mock_socket = mock_sock.connect('testhost', 'testport');
|
|
269
259
|
mock_socket.writable = true;
|
|
270
260
|
|
|
271
261
|
const orig_send_email = outbound_context.exports.send_email;
|
|
272
262
|
outbound_context.exports.send_email = (from, to, contents, cb, opts) => {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
263
|
+
assert.ok(true, 'DATA-5XX: outbound.send_email called');
|
|
264
|
+
assert.ok(contents.match(/^Content-type: message\/delivery-status/m), 'DATA-5XX: its a bounce report');
|
|
265
|
+
assert.ok(contents.match(/^Final-Recipient: rfc822;recipient@domain/m), 'DATA-5XX: bounce report contains final recipient');
|
|
266
|
+
assert.ok(contents.match(/^Action: failed/m), 'DATA-5XX: bounce report contains action field');
|
|
267
|
+
assert.ok(contents.match(/^Status: 5\.6\.0/m), 'DATA-5XX: bounce report contains status field with our ext. smtp code');
|
|
268
|
+
assert.ok(contents.match(/I never did and will like ascii art cats/), 'DATA-5XX: original upstream message available');
|
|
279
269
|
outbound_context.exports.send_email = orig_send_email;
|
|
280
|
-
|
|
270
|
+
done()
|
|
281
271
|
};
|
|
282
272
|
const testPlaybook = [
|
|
283
273
|
{ 'from': 'remote', 'line': '220 testing-smtp' },
|
|
@@ -299,10 +289,8 @@ exports.bounce_3464 = {
|
|
|
299
289
|
{ 'from': 'haraka', 'test': 'QUIT', end_test: true }, // this will trigger calling the callback
|
|
300
290
|
];
|
|
301
291
|
|
|
302
|
-
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket,
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
},
|
|
307
|
-
}
|
|
292
|
+
util_hmailitem.playTestSmtpConversation(mock_hmail, mock_socket, done, testPlaybook, () => {})
|
|
293
|
+
})
|
|
294
|
+
})
|
|
295
|
+
})
|
|
308
296
|
|