Haraka 3.0.3 → 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.
Files changed (238) hide show
  1. package/.eslintrc.yaml +5 -9
  2. package/.prettierrc.yml +1 -0
  3. package/CONTRIBUTORS.md +11 -0
  4. package/Changes.md +1365 -1214
  5. package/Plugins.md +117 -105
  6. package/README.md +4 -13
  7. package/bin/haraka +197 -298
  8. package/config/auth_flat_file.ini +1 -0
  9. package/config/dhparams.pem +8 -0
  10. package/config/mail_from.is_resolvable.ini +4 -2
  11. package/config/me +1 -0
  12. package/config/outbound.ini +0 -2
  13. package/config/plugins +36 -35
  14. package/config/smtp.ini +0 -1
  15. package/config/smtp.json +17 -0
  16. package/config/tls_cert.pem +23 -0
  17. package/config/tls_key.pem +28 -0
  18. package/connection.js +46 -73
  19. package/contrib/bsd-rc.d/haraka +3 -1
  20. package/contrib/plugin2npm.sh +6 -36
  21. package/docs/CoreConfig.md +2 -2
  22. package/docs/Logging.md +7 -21
  23. package/docs/Outbound.md +104 -201
  24. package/docs/Plugins.md +2 -2
  25. package/docs/Transaction.md +59 -82
  26. package/docs/plugins/queue/smtp_proxy.md +5 -10
  27. package/docs/plugins/tls.md +29 -9
  28. package/endpoint.js +16 -13
  29. package/haraka.js +10 -14
  30. package/host_pool.js +5 -5
  31. package/line_socket.js +3 -4
  32. package/logger.js +44 -28
  33. package/outbound/client_pool.js +27 -23
  34. package/outbound/config.js +4 -6
  35. package/outbound/fsync_writestream.js +1 -1
  36. package/outbound/hmail.js +178 -218
  37. package/outbound/index.js +86 -99
  38. package/outbound/qfile.js +1 -1
  39. package/outbound/queue.js +51 -44
  40. package/outbound/timer_queue.js +3 -2
  41. package/outbound/tls.js +19 -7
  42. package/package.json +59 -48
  43. package/plugins/.eslintrc.yaml +0 -6
  44. package/plugins/auth/auth_base.js +4 -2
  45. package/plugins/auth/auth_proxy.js +14 -12
  46. package/plugins/auth/auth_vpopmaild.js +1 -1
  47. package/plugins/block_me.js +1 -1
  48. package/plugins/data.signatures.js +2 -4
  49. package/plugins/early_talker.js +2 -1
  50. package/plugins/mail_from.is_resolvable.js +65 -135
  51. package/plugins/queue/deliver.js +4 -5
  52. package/plugins/queue/lmtp.js +11 -14
  53. package/plugins/queue/qmail-queue.js +2 -2
  54. package/plugins/queue/quarantine.js +2 -2
  55. package/plugins/queue/rabbitmq.js +16 -17
  56. package/plugins/queue/smtp_forward.js +3 -3
  57. package/plugins/queue/smtp_proxy.js +10 -1
  58. package/plugins/queue/test.js +2 -2
  59. package/plugins/rcpt_to.host_list_base.js +5 -5
  60. package/plugins/rcpt_to.in_host_list.js +2 -2
  61. package/plugins/relay.js +6 -7
  62. package/plugins/reseed_rng.js +1 -1
  63. package/plugins/status.js +37 -33
  64. package/plugins/tls.js +2 -2
  65. package/plugins/xclient.js +3 -2
  66. package/plugins.js +50 -54
  67. package/run_tests +3 -30
  68. package/server.js +190 -190
  69. package/smtp_client.js +30 -23
  70. package/{tests → test}/config/plugins +0 -2
  71. package/{tests → test}/config/smtp.ini +1 -1
  72. package/test/config/tls/example.com/_.example.com.key +28 -0
  73. package/test/config/tls/example.com/example.com.crt +25 -0
  74. package/test/connection.js +302 -0
  75. package/test/endpoint.js +94 -0
  76. package/{tests → test}/fixtures/line_socket.js +1 -1
  77. package/{tests → test}/fixtures/util_hmailitem.js +19 -25
  78. package/{tests → test}/host_pool.js +42 -57
  79. package/test/logger.js +258 -0
  80. package/test/outbound/hmail.js +141 -0
  81. package/test/outbound/index.js +220 -0
  82. package/test/outbound/qfile.js +126 -0
  83. package/test/outbound_bounce_net_errors.js +142 -0
  84. package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
  85. package/test/plugins/auth/auth_base.js +484 -0
  86. package/test/plugins/auth/auth_vpopmaild.js +83 -0
  87. package/test/plugins/early_talker.js +104 -0
  88. package/test/plugins/mail_from.is_resolvable.js +35 -0
  89. package/test/plugins/queue/smtp_forward.js +206 -0
  90. package/test/plugins/rcpt_to.host_list_base.js +122 -0
  91. package/test/plugins/rcpt_to.in_host_list.js +193 -0
  92. package/test/plugins/relay.js +303 -0
  93. package/test/plugins/status.js +130 -0
  94. package/test/plugins/tls.js +70 -0
  95. package/test/plugins.js +228 -0
  96. package/test/rfc1869.js +73 -0
  97. package/test/server.js +491 -0
  98. package/test/smtp_client.js +299 -0
  99. package/test/tls_socket.js +273 -0
  100. package/test/transaction.js +270 -0
  101. package/tls_socket.js +202 -252
  102. package/transaction.js +8 -23
  103. package/CONTRIBUTING.md +0 -1
  104. package/bin/dkimverify +0 -40
  105. package/config/access.domains +0 -13
  106. package/config/attachment.ctype.regex +0 -2
  107. package/config/attachment.filename.regex +0 -1
  108. package/config/avg.ini +0 -5
  109. package/config/bounce.ini +0 -15
  110. package/config/data.headers.ini +0 -61
  111. package/config/dkim/dkim_key_gen.sh +0 -78
  112. package/config/dkim_sign.ini +0 -4
  113. package/config/dkim_verify.ini +0 -7
  114. package/config/dnsbl.ini +0 -23
  115. package/config/greylist.ini +0 -43
  116. package/config/helo.checks.ini +0 -52
  117. package/config/messagesniffer.ini +0 -18
  118. package/config/spamassassin.ini +0 -56
  119. package/dkim.js +0 -614
  120. package/docs/plugins/avg.md +0 -35
  121. package/docs/plugins/bounce.md +0 -69
  122. package/docs/plugins/clamd.md +0 -147
  123. package/docs/plugins/esets.md +0 -8
  124. package/docs/plugins/greylist.md +0 -90
  125. package/docs/plugins/helo.checks.md +0 -135
  126. package/docs/plugins/messagesniffer.md +0 -163
  127. package/docs/plugins/spamassassin.md +0 -180
  128. package/outbound/mx_lookup.js +0 -70
  129. package/plugins/auth/auth_ldap.js +0 -3
  130. package/plugins/avg.js +0 -162
  131. package/plugins/backscatterer.js +0 -25
  132. package/plugins/bounce.js +0 -381
  133. package/plugins/clamd.js +0 -382
  134. package/plugins/data.uribl.js +0 -4
  135. package/plugins/dkim_sign.js +0 -395
  136. package/plugins/dkim_verify.js +0 -62
  137. package/plugins/dns_list_base.js +0 -221
  138. package/plugins/dnsbl.js +0 -146
  139. package/plugins/dnswl.js +0 -58
  140. package/plugins/esets.js +0 -71
  141. package/plugins/graph.js +0 -5
  142. package/plugins/greylist.js +0 -645
  143. package/plugins/helo.checks.js +0 -533
  144. package/plugins/messagesniffer.js +0 -381
  145. package/plugins/rcpt_to.ldap.js +0 -3
  146. package/plugins/rcpt_to.max_count.js +0 -24
  147. package/plugins/spamassassin.js +0 -384
  148. package/tests/config/dkim/example.com/dns +0 -29
  149. package/tests/config/dkim/example.com/private +0 -6
  150. package/tests/config/dkim/example.com/public +0 -4
  151. package/tests/config/dkim/example.com/selector +0 -1
  152. package/tests/config/dkim.private.key +0 -6
  153. package/tests/config/dkim_sign.ini +0 -4
  154. package/tests/config/helo.checks.ini +0 -52
  155. package/tests/connection.js +0 -327
  156. package/tests/endpoint.js +0 -128
  157. package/tests/fixtures/vm_harness.js +0 -59
  158. package/tests/logger.js +0 -327
  159. package/tests/outbound/hmail.js +0 -112
  160. package/tests/outbound/index.js +0 -324
  161. package/tests/outbound/qfile.js +0 -67
  162. package/tests/outbound_bounce_net_errors.js +0 -173
  163. package/tests/plugins/auth/auth_base.js +0 -463
  164. package/tests/plugins/auth/auth_vpopmaild.js +0 -91
  165. package/tests/plugins/bounce.js +0 -307
  166. package/tests/plugins/clamd.js +0 -224
  167. package/tests/plugins/deprecated/relay_acl.js +0 -140
  168. package/tests/plugins/deprecated/relay_all.js +0 -59
  169. package/tests/plugins/dkim_sign.js +0 -315
  170. package/tests/plugins/dkim_signer.js +0 -108
  171. package/tests/plugins/dns_list_base.js +0 -259
  172. package/tests/plugins/dnsbl.js +0 -101
  173. package/tests/plugins/early_talker.js +0 -115
  174. package/tests/plugins/greylist.js +0 -58
  175. package/tests/plugins/helo.checks.js +0 -525
  176. package/tests/plugins/mail_from.is_resolvable.js +0 -116
  177. package/tests/plugins/queue/smtp_forward.js +0 -221
  178. package/tests/plugins/rcpt_to.host_list_base.js +0 -132
  179. package/tests/plugins/rcpt_to.in_host_list.js +0 -218
  180. package/tests/plugins/relay.js +0 -339
  181. package/tests/plugins/spamassassin.js +0 -171
  182. package/tests/plugins/status.js +0 -138
  183. package/tests/plugins/tls.js +0 -84
  184. package/tests/plugins.js +0 -247
  185. package/tests/rfc1869.js +0 -61
  186. package/tests/server.js +0 -510
  187. package/tests/smtp_client/auth.js +0 -105
  188. package/tests/smtp_client/basic.js +0 -101
  189. package/tests/smtp_client.js +0 -80
  190. package/tests/tls_socket.js +0 -333
  191. package/tests/transaction.js +0 -284
  192. /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
  193. /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
  194. /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
  195. /package/docs/{plugins → deprecated}/dnswl.md +0 -0
  196. /package/{tests → test}/.eslintrc.yaml +0 -0
  197. /package/{tests → test}/config/auth_flat_file.ini +0 -0
  198. /package/{tests → test}/config/dhparams.pem +0 -0
  199. /package/{tests → test}/config/host_list +0 -0
  200. /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
  201. /package/{tests → test}/config/outbound_tls_key.pem +0 -0
  202. /package/{tests → test}/config/smtp_forward.ini +0 -0
  203. /package/{tests → test}/config/tls/ec.pem +0 -0
  204. /package/{tests → test}/config/tls/haraka.local.pem +0 -0
  205. /package/{tests → test}/config/tls/mismatched.pem +0 -0
  206. /package/{tests → test}/config/tls.ini +0 -0
  207. /package/{tests → test}/config/tls_cert.pem +0 -0
  208. /package/{tests → test}/config/tls_key.pem +0 -0
  209. /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
  210. /package/{tests → test}/installation/config/test-plugin-flat +0 -0
  211. /package/{tests → test}/installation/config/test-plugin.ini +0 -0
  212. /package/{tests → test}/installation/config/tls.ini +0 -0
  213. /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
  214. /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
  215. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
  216. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
  217. /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
  218. /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
  219. /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
  220. /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
  221. /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
  222. /package/{tests → test}/installation/plugins/inherits.js +0 -0
  223. /package/{tests → test}/installation/plugins/load_first.js +0 -0
  224. /package/{tests → test}/installation/plugins/plugin.js +0 -0
  225. /package/{tests → test}/installation/plugins/tls.js +0 -0
  226. /package/{tests → test}/loud/config/dhparams.pem +0 -0
  227. /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
  228. /package/{tests → test}/loud/config/tls.ini +0 -0
  229. /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
  230. /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
  231. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
  232. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
  233. /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
  234. /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
  235. /package/{tests → test}/queue/multibyte +0 -0
  236. /package/{tests → test}/queue/plain +0 -0
  237. /package/{tests → test}/queue/zero-length +0 -0
  238. /package/{tests → test}/test-queue/delete-me +0 -0
@@ -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