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/tests/transaction.js
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
const transaction = require('../transaction');
|
|
5
|
-
|
|
6
|
-
function _set_up (done) {
|
|
7
|
-
this.transaction = transaction.createTransaction();
|
|
8
|
-
done();
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function _tear_down (done) {
|
|
12
|
-
done();
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
exports.transaction = {
|
|
16
|
-
setUp : _set_up,
|
|
17
|
-
tearDown : _tear_down,
|
|
18
|
-
|
|
19
|
-
'add_body_filter' (test) {
|
|
20
|
-
|
|
21
|
-
test.expect(3);
|
|
22
|
-
|
|
23
|
-
this.transaction.add_body_filter('text/plain', (ct, enc, buf) => {
|
|
24
|
-
// The functionality of these filter functions is tested in
|
|
25
|
-
// haraka-email-message. This just assures the plumbing is in place.
|
|
26
|
-
|
|
27
|
-
test.ok(ct.indexOf('text/plain') === 0, "correct body part");
|
|
28
|
-
test.ok(/utf-?8/i.test(enc), "correct encoding");
|
|
29
|
-
test.equal(buf.toString().trim(), "Text part", "correct body contents");
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
[
|
|
33
|
-
"Content-Type: multipart/alternative; boundary=abcd\n",
|
|
34
|
-
"\n",
|
|
35
|
-
"--abcd\n",
|
|
36
|
-
"Content-Type: text/plain\n",
|
|
37
|
-
"\n",
|
|
38
|
-
"Text part\n",
|
|
39
|
-
"--abcd\n",
|
|
40
|
-
"Content-Type: text/html\n",
|
|
41
|
-
"\n",
|
|
42
|
-
"<p>HTML part</p>\n",
|
|
43
|
-
"--abcd--\n",
|
|
44
|
-
].forEach(line => {
|
|
45
|
-
this.transaction.add_data(line);
|
|
46
|
-
});
|
|
47
|
-
this.transaction.end_data(() => {
|
|
48
|
-
test.done();
|
|
49
|
-
});
|
|
50
|
-
},
|
|
51
|
-
|
|
52
|
-
'regression: attachment_hooks before set_banner/add_body_filter' (test) {
|
|
53
|
-
|
|
54
|
-
test.expect(2);
|
|
55
|
-
|
|
56
|
-
this.transaction.attachment_hooks(() => {});
|
|
57
|
-
this.transaction.set_banner('banner');
|
|
58
|
-
this.transaction.add_body_filter('', () => {
|
|
59
|
-
test.ok(true, "body filter called");
|
|
60
|
-
});
|
|
61
|
-
[
|
|
62
|
-
"Content-Type: text/plain\n",
|
|
63
|
-
"\n",
|
|
64
|
-
"Some text\n",
|
|
65
|
-
].forEach(line => {
|
|
66
|
-
this.transaction.add_data(line);
|
|
67
|
-
});
|
|
68
|
-
this.transaction.end_data(() => {
|
|
69
|
-
this.transaction.message_stream.get_data(body => {
|
|
70
|
-
test.ok(/banner$/.test(body.toString().trim()), "banner applied");
|
|
71
|
-
test.done();
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
},
|
|
75
|
-
|
|
76
|
-
'correct output encoding when content in non-utf8 #2176' (test) {
|
|
77
|
-
const self = this;
|
|
78
|
-
|
|
79
|
-
// Czech panagram "Příliš žluťoučký kůň úpěl ďábelské ódy." in ISO-8859-2 encoding
|
|
80
|
-
const message = [0x50, 0xF8, 0xED, 0x6C, 0x69, 0xB9, 0x20, 0xBE, 0x6C, 0x75, 0xBB, 0x6F, 0x76, 0xE8, 0x6B, 0xFD, 0x20, 0x6B, 0xF9, 0xF2, 0xFA, 0xEC, 0x6C, 0x20, 0xEF, 0xE2, 0x62, 0x65, 0x6C, 0x73, 0x6b, 0xE9, 0x20, 0xF3, 0x64, 0x79, 0x2E];
|
|
81
|
-
const payload = [
|
|
82
|
-
Buffer.from("Content-Type: text/plain; charset=iso-8859-2; format=flowed\n"),
|
|
83
|
-
"\n",
|
|
84
|
-
Buffer.from([...message, 0x0A]), // Add \n
|
|
85
|
-
];
|
|
86
|
-
|
|
87
|
-
test.expect(1);
|
|
88
|
-
|
|
89
|
-
this.transaction.parse_body = true;
|
|
90
|
-
this.transaction.attachment_hooks(function () {});
|
|
91
|
-
|
|
92
|
-
payload.forEach(function (line) {
|
|
93
|
-
self.transaction.add_data(line);
|
|
94
|
-
});
|
|
95
|
-
this.transaction.end_data(function () {
|
|
96
|
-
self.transaction.message_stream.get_data(function (body) {
|
|
97
|
-
test.ok(body.includes(Buffer.from(message)), "message not damaged");
|
|
98
|
-
test.done();
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
},
|
|
102
|
-
|
|
103
|
-
'no munging of bytes if not parsing body' (test) {
|
|
104
|
-
|
|
105
|
-
// Czech panagram "Příliš žluťoučký kůň úpěl ďábelské ódy.\n" in ISO-8859-2 encoding
|
|
106
|
-
const message = Buffer.from([0x50, 0xF8, 0xED, 0x6C, 0x69, 0xB9, 0x20, 0xBE, 0x6C, 0x75, 0xBB, 0x6F, 0x76, 0xE8, 0x6B, 0xFD, 0x20, 0x6B, 0xF9, 0xF2, 0xFA, 0xEC, 0x6C, 0x20, 0xEF, 0xE2, 0x62, 0x65, 0x6C, 0x73, 0x6b, 0xE9, 0x20, 0xF3, 0x64, 0x79, 0x2E, 0x0A]);
|
|
107
|
-
const payload = [
|
|
108
|
-
"Content-Type: text/plain; charset=iso-8859-2; format=flowed\n",
|
|
109
|
-
"\n",
|
|
110
|
-
message
|
|
111
|
-
];
|
|
112
|
-
|
|
113
|
-
test.expect(1);
|
|
114
|
-
|
|
115
|
-
payload.forEach(line => {
|
|
116
|
-
this.transaction.add_data(line);
|
|
117
|
-
});
|
|
118
|
-
this.transaction.end_data(() => {
|
|
119
|
-
this.transaction.message_stream.get_data(body => {
|
|
120
|
-
test.ok(body.includes(message), "message not damaged");
|
|
121
|
-
test.done();
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
},
|
|
125
|
-
|
|
126
|
-
'bannering with nested mime structure' (test) {
|
|
127
|
-
test.expect(4);
|
|
128
|
-
|
|
129
|
-
this.transaction.set_banner('TEXT_BANNER', 'HTML_BANNER');
|
|
130
|
-
[
|
|
131
|
-
'Content-Type: multipart/mixed; boundary="TOP_LEVEL"',
|
|
132
|
-
'',
|
|
133
|
-
'--TOP_LEVEL',
|
|
134
|
-
'Content-Type: multipart/alternative; boundary="INNER_LEVEL"',
|
|
135
|
-
'',
|
|
136
|
-
'--INNER_LEVEL',
|
|
137
|
-
'Content-Type: text/plain; charset=us-ascii',
|
|
138
|
-
'',
|
|
139
|
-
'Hello, this is a text part',
|
|
140
|
-
'--INNER_LEVEL',
|
|
141
|
-
'Content-Type: text/html; charset=us-ascii',
|
|
142
|
-
'',
|
|
143
|
-
'<p>This is an html part</p>',
|
|
144
|
-
'--INNER_LEVEL--',
|
|
145
|
-
'--TOP_LEVEL--',
|
|
146
|
-
].forEach(line => {
|
|
147
|
-
this.transaction.add_data(`${line}\r\n`);
|
|
148
|
-
});
|
|
149
|
-
this.transaction.end_data(() => {
|
|
150
|
-
this.transaction.message_stream.get_data(body => {
|
|
151
|
-
test.ok(/Hello, this is a text part/.test(body.toString()),
|
|
152
|
-
"text content comes through in final message");
|
|
153
|
-
test.ok(/This is an html part/.test(body.toString()),
|
|
154
|
-
"html content comes through in final message");
|
|
155
|
-
test.ok(/TEXT_BANNER/.test(body.toString()),
|
|
156
|
-
"text banner comes through in final message");
|
|
157
|
-
test.ok(/HTML_BANNER/.test(body.toString()),
|
|
158
|
-
"html banner comes through in final message");
|
|
159
|
-
test.done();
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
},
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function write_file_data_to_transaction (test_transaction, filename) {
|
|
166
|
-
const specimen = fs.readFileSync(filename, 'utf8');
|
|
167
|
-
const matcher = /[^\n]*([\n]|$)/g;
|
|
168
|
-
|
|
169
|
-
let line;
|
|
170
|
-
do {
|
|
171
|
-
line = matcher.exec(specimen);
|
|
172
|
-
if (line[0] == '') {
|
|
173
|
-
break;
|
|
174
|
-
}
|
|
175
|
-
test_transaction.add_data(line[0]);
|
|
176
|
-
} while (line[0] != '');
|
|
177
|
-
|
|
178
|
-
test_transaction.end_data();
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
exports.base64_handling = {
|
|
182
|
-
setUp : _set_up,
|
|
183
|
-
tearDown: _tear_down,
|
|
184
|
-
|
|
185
|
-
'varied-base64-fold-lengths-preserve-data' (test) {
|
|
186
|
-
|
|
187
|
-
const parsed_attachments = {};
|
|
188
|
-
this.transaction.parse_body = true;
|
|
189
|
-
//accumulate attachment buffers.
|
|
190
|
-
this.transaction.attachment_hooks((ct, filename, body, stream) => {
|
|
191
|
-
let attachment = Buffer.alloc(0);
|
|
192
|
-
stream.on('data', data => {
|
|
193
|
-
attachment = Buffer.concat([attachment, data]);
|
|
194
|
-
});
|
|
195
|
-
stream.on('end', () => {
|
|
196
|
-
parsed_attachments[filename] = attachment;
|
|
197
|
-
});
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
const specimen_path = path.join(__dirname, 'mail_specimen', 'varied-fold-lengths-preserve-data.txt');
|
|
201
|
-
write_file_data_to_transaction(this.transaction, specimen_path);
|
|
202
|
-
|
|
203
|
-
test.equal(this.transaction.body.children.length, 6);
|
|
204
|
-
|
|
205
|
-
let first_attachment = null;
|
|
206
|
-
for (const i in parsed_attachments) {
|
|
207
|
-
const current_attachment = parsed_attachments[i];
|
|
208
|
-
first_attachment = first_attachment || current_attachment;
|
|
209
|
-
// All buffers from data that was encoded with varied line lengths should
|
|
210
|
-
// still have the same final data.
|
|
211
|
-
test.equal(true, first_attachment.equals(current_attachment),
|
|
212
|
-
`The buffer data for '${i}' doesn't appear to be equal to the other attachments, and is likely corrupted.`);
|
|
213
|
-
}
|
|
214
|
-
test.done();
|
|
215
|
-
},
|
|
216
|
-
|
|
217
|
-
'base64-root-html-decodes-correct-number-of-bytes' (test) {
|
|
218
|
-
|
|
219
|
-
this.transaction.parse_body = true;
|
|
220
|
-
const specimen_path = path.join(__dirname, 'mail_specimen', 'base64-root-part.txt');
|
|
221
|
-
write_file_data_to_transaction(this.transaction, specimen_path);
|
|
222
|
-
|
|
223
|
-
test.equal(this.transaction.body.bodytext.length, 425);
|
|
224
|
-
test.done();
|
|
225
|
-
},
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Test is to ensure boundary marker just after the headers, is in-tact
|
|
229
|
-
// Issue: "User1990" <--abcd
|
|
230
|
-
// Expected: --abcd
|
|
231
|
-
exports.boundarymarkercorrupt_test = {
|
|
232
|
-
setUp : _set_up,
|
|
233
|
-
tearDown: _tear_down,
|
|
234
|
-
|
|
235
|
-
// populate the same email data in transaction (self.transaction.add_data()) and
|
|
236
|
-
// in raw buffer, then compare
|
|
237
|
-
'fix mime boundary corruption issue' (test) {
|
|
238
|
-
const self = this;
|
|
239
|
-
let buffer = '';
|
|
240
|
-
self.transaction.add_data("Content-Type: multipart/alternative; boundary=abcd\r\n");
|
|
241
|
-
buffer += "Content-Type: multipart/alternative; boundary=abcd\r\n";
|
|
242
|
-
self.transaction.add_data('To: "User1_firstname_middlename_lastname" <user1_firstname_middlename_lastname@test.com>,\r\n');
|
|
243
|
-
buffer += 'To: "User1_firstname_middlename_lastname" <user1_firstname_middlename_lastname@test.com>,\r\n';
|
|
244
|
-
// make sure we add headers so that it exceeds 64k bytes to expose this issue
|
|
245
|
-
for (let i=0;i<725;i++){
|
|
246
|
-
self.transaction.add_data(` "User${i}_firstname_middlename_lastname" <user${i}_firstname_middlename_lastname@test.com>,\r\n`);
|
|
247
|
-
buffer += ` "User${i}_firstname_middlename_lastname" <user${i}_firstname_middlename_lastname@test.com>,\r\n`
|
|
248
|
-
}
|
|
249
|
-
self.transaction.add_data(' "Final User_firstname_middlename_lastname" <final_user_firstname_middlename_lastname@test.com>\r\n');
|
|
250
|
-
buffer += ' "Final User_firstname_middlename_lastname" <final_user_firstname_middlename_lastname@test.com>\r\n';
|
|
251
|
-
self.transaction.add_data('Message-ID: <Boundary_Marker_Test>\r\n');
|
|
252
|
-
buffer += 'Message-ID: <Boundary_Marker_Test>\r\n';
|
|
253
|
-
self.transaction.add_data('MIME-Version: 1.0\r\n');
|
|
254
|
-
buffer += 'MIME-Version: 1.0\r\n';
|
|
255
|
-
self.transaction.add_data('Date: Wed, 1 Jun 2022 16:44:39 +0530 (IST)\r\n');
|
|
256
|
-
buffer += 'Date: Wed, 1 Jun 2022 16:44:39 +0530 (IST)\r\n';
|
|
257
|
-
self.transaction.add_data('\r\n');
|
|
258
|
-
buffer += '\r\n';
|
|
259
|
-
self.transaction.add_data("--abcd\r\n");
|
|
260
|
-
buffer += "--abcd\r\n";
|
|
261
|
-
|
|
262
|
-
[
|
|
263
|
-
"Content-Type: text/plain\r\n",
|
|
264
|
-
"\r\n",
|
|
265
|
-
"Text part\r\n",
|
|
266
|
-
"--abcd\r\n",
|
|
267
|
-
"Content-Type: text/html\r\n",
|
|
268
|
-
"\r\n",
|
|
269
|
-
"<p>HTML part</p>\r\n",
|
|
270
|
-
"--abcd--\r\n",
|
|
271
|
-
].forEach(line => {
|
|
272
|
-
self.transaction.add_data(line);
|
|
273
|
-
buffer += line;
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
this.transaction.end_data(function () {
|
|
277
|
-
self.transaction.message_stream.get_data(function (body) {
|
|
278
|
-
test.ok(body.includes(buffer), "message is damaged");
|
|
279
|
-
test.done();
|
|
280
|
-
});
|
|
281
|
-
});
|
|
282
|
-
},
|
|
283
|
-
}
|
|
284
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|