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.
Files changed (267) hide show
  1. package/.eslintrc.yaml +5 -9
  2. package/.prettierrc.yml +1 -0
  3. package/CONTRIBUTORS.md +11 -0
  4. package/Changes.md +1393 -1211
  5. package/Dockerfile +3 -3
  6. package/Plugins.md +119 -106
  7. package/README.md +7 -16
  8. package/TODO +1 -24
  9. package/bin/haraka +197 -298
  10. package/config/auth_flat_file.ini +2 -0
  11. package/config/auth_vpopmaild.ini +4 -2
  12. package/config/dhparams.pem +8 -0
  13. package/config/mail_from.is_resolvable.ini +4 -2
  14. package/config/me +1 -0
  15. package/config/outbound.ini +0 -2
  16. package/config/plugins +36 -35
  17. package/config/rabbitmq_amqplib.ini +8 -1
  18. package/config/smtp.ini +0 -1
  19. package/config/smtp.json +17 -0
  20. package/config/tls_cert.pem +23 -0
  21. package/config/tls_key.pem +28 -0
  22. package/connection.js +46 -73
  23. package/contrib/bsd-rc.d/haraka +3 -1
  24. package/contrib/plugin2npm.sh +6 -36
  25. package/docs/Connection.md +1 -1
  26. package/docs/CoreConfig.md +2 -2
  27. package/docs/Logging.md +7 -21
  28. package/docs/Outbound.md +104 -210
  29. package/docs/Plugins.md +47 -40
  30. package/docs/Transaction.md +59 -82
  31. package/docs/{plugins → deprecated}/connect.rdns_access.md +1 -1
  32. package/docs/{plugins → deprecated}/mail_from.access.md +1 -1
  33. package/docs/{plugins → deprecated}/rcpt_to.access.md +1 -1
  34. package/docs/plugins/auth/auth_vpopmaild.md +15 -19
  35. package/docs/plugins/auth/flat_file.md +23 -30
  36. package/docs/plugins/queue/rabbitmq_amqplib.md +7 -0
  37. package/docs/plugins/queue/smtp_forward.md +1 -1
  38. package/docs/plugins/queue/smtp_proxy.md +5 -10
  39. package/docs/plugins/relay.md +2 -2
  40. package/docs/plugins/tls.md +29 -9
  41. package/endpoint.js +16 -13
  42. package/haraka.js +10 -14
  43. package/host_pool.js +5 -5
  44. package/line_socket.js +3 -4
  45. package/logger.js +44 -28
  46. package/outbound/client_pool.js +27 -23
  47. package/outbound/config.js +4 -6
  48. package/outbound/fsync_writestream.js +1 -1
  49. package/outbound/hmail.js +180 -220
  50. package/outbound/index.js +86 -99
  51. package/outbound/qfile.js +1 -1
  52. package/outbound/queue.js +55 -43
  53. package/outbound/timer_queue.js +3 -2
  54. package/outbound/tls.js +19 -7
  55. package/package.json +66 -55
  56. package/plugins/.eslintrc.yaml +0 -6
  57. package/plugins/auth/auth_base.js +30 -12
  58. package/plugins/auth/auth_proxy.js +14 -12
  59. package/plugins/auth/auth_vpopmaild.js +30 -20
  60. package/plugins/auth/flat_file.js +17 -12
  61. package/plugins/block_me.js +1 -1
  62. package/plugins/data.signatures.js +2 -4
  63. package/plugins/early_talker.js +2 -1
  64. package/plugins/mail_from.is_resolvable.js +65 -135
  65. package/plugins/queue/deliver.js +4 -5
  66. package/plugins/queue/lmtp.js +11 -14
  67. package/plugins/queue/qmail-queue.js +2 -2
  68. package/plugins/queue/quarantine.js +2 -2
  69. package/plugins/queue/rabbitmq.js +16 -17
  70. package/plugins/queue/rabbitmq_amqplib.js +1 -1
  71. package/plugins/queue/smtp_forward.js +6 -6
  72. package/plugins/queue/smtp_proxy.js +10 -1
  73. package/plugins/queue/test.js +2 -2
  74. package/plugins/rcpt_to.host_list_base.js +5 -5
  75. package/plugins/rcpt_to.in_host_list.js +2 -2
  76. package/plugins/relay.js +6 -7
  77. package/plugins/reseed_rng.js +1 -1
  78. package/plugins/status.js +37 -33
  79. package/plugins/tls.js +2 -2
  80. package/plugins/xclient.js +3 -2
  81. package/plugins.js +51 -54
  82. package/run_tests +3 -30
  83. package/server.js +190 -190
  84. package/smtp_client.js +30 -23
  85. package/{tests → test}/config/plugins +0 -2
  86. package/{tests → test}/config/smtp.ini +1 -1
  87. package/test/config/tls/example.com/_.example.com.key +28 -0
  88. package/test/config/tls/example.com/example.com.crt +25 -0
  89. package/test/connection.js +302 -0
  90. package/test/endpoint.js +94 -0
  91. package/{tests → test}/fixtures/line_socket.js +1 -1
  92. package/{tests → test}/fixtures/util_hmailitem.js +19 -25
  93. package/{tests → test}/host_pool.js +42 -57
  94. package/test/logger.js +258 -0
  95. package/test/outbound/hmail.js +141 -0
  96. package/test/outbound/index.js +220 -0
  97. package/test/outbound/qfile.js +126 -0
  98. package/test/outbound_bounce_net_errors.js +142 -0
  99. package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
  100. package/test/plugins/auth/auth_base.js +484 -0
  101. package/test/plugins/auth/auth_vpopmaild.js +83 -0
  102. package/test/plugins/early_talker.js +104 -0
  103. package/test/plugins/mail_from.is_resolvable.js +35 -0
  104. package/test/plugins/queue/smtp_forward.js +206 -0
  105. package/test/plugins/rcpt_to.host_list_base.js +122 -0
  106. package/test/plugins/rcpt_to.in_host_list.js +193 -0
  107. package/test/plugins/relay.js +303 -0
  108. package/test/plugins/status.js +130 -0
  109. package/test/plugins/tls.js +70 -0
  110. package/test/plugins.js +228 -0
  111. package/{tests → test}/queue/multibyte +0 -0
  112. package/{tests → test}/queue/plain +0 -0
  113. package/test/rfc1869.js +73 -0
  114. package/test/server.js +491 -0
  115. package/test/smtp_client.js +299 -0
  116. package/test/tls_socket.js +273 -0
  117. package/test/transaction.js +270 -0
  118. package/tls_socket.js +202 -252
  119. package/transaction.js +9 -24
  120. package/CONTRIBUTING.md +0 -1
  121. package/bin/dkimverify +0 -40
  122. package/config/access.domains +0 -13
  123. package/config/attachment.ctype.regex +0 -2
  124. package/config/attachment.filename.regex +0 -1
  125. package/config/avg.ini +0 -5
  126. package/config/bounce.ini +0 -15
  127. package/config/data.headers.ini +0 -61
  128. package/config/dkim/dkim_key_gen.sh +0 -78
  129. package/config/dkim_sign.ini +0 -4
  130. package/config/dkim_verify.ini +0 -7
  131. package/config/dnsbl.ini +0 -23
  132. package/config/greylist.ini +0 -43
  133. package/config/helo.checks.ini +0 -52
  134. package/config/lookup_rdns.strict.ini +0 -12
  135. package/config/lookup_rdns.strict.timeout +0 -1
  136. package/config/lookup_rdns.strict.whitelist +0 -1
  137. package/config/lookup_rdns.strict.whitelist_regex +0 -5
  138. package/config/messagesniffer.ini +0 -18
  139. package/config/rcpt_to.blocklist +0 -1
  140. package/config/rdns.allow_regexps +0 -0
  141. package/config/rdns.deny_regexps +0 -0
  142. package/config/spamassassin.ini +0 -56
  143. package/config.js +0 -6
  144. package/dkim.js +0 -614
  145. package/docs/plugins/avg.md +0 -35
  146. package/docs/plugins/bounce.md +0 -69
  147. package/docs/plugins/clamd.md +0 -147
  148. package/docs/plugins/esets.md +0 -8
  149. package/docs/plugins/greylist.md +0 -90
  150. package/docs/plugins/helo.checks.md +0 -135
  151. package/docs/plugins/messagesniffer.md +0 -163
  152. package/docs/plugins/relay_acl.md +0 -29
  153. package/docs/plugins/relay_all.md +0 -15
  154. package/docs/plugins/relay_force_routing.md +0 -33
  155. package/docs/plugins/spamassassin.md +0 -180
  156. package/outbound/mx_lookup.js +0 -70
  157. package/plugins/auth/auth_ldap.js +0 -3
  158. package/plugins/avg.js +0 -162
  159. package/plugins/backscatterer.js +0 -25
  160. package/plugins/bounce.js +0 -381
  161. package/plugins/clamd.js +0 -381
  162. package/plugins/data.headers.js +0 -4
  163. package/plugins/data.uribl.js +0 -4
  164. package/plugins/dkim_sign.js +0 -395
  165. package/plugins/dkim_verify.js +0 -62
  166. package/plugins/dns_list_base.js +0 -221
  167. package/plugins/dnsbl.js +0 -146
  168. package/plugins/dnswl.js +0 -58
  169. package/plugins/esets.js +0 -71
  170. package/plugins/graph.js +0 -5
  171. package/plugins/greylist.js +0 -645
  172. package/plugins/helo.checks.js +0 -533
  173. package/plugins/messagesniffer.js +0 -381
  174. package/plugins/rcpt_to.ldap.js +0 -3
  175. package/plugins/rcpt_to.max_count.js +0 -24
  176. package/plugins/relay_all.js +0 -13
  177. package/plugins/spamassassin.js +0 -384
  178. package/tests/config/dkim/example.com/dns +0 -29
  179. package/tests/config/dkim/example.com/private +0 -6
  180. package/tests/config/dkim/example.com/public +0 -4
  181. package/tests/config/dkim/example.com/selector +0 -1
  182. package/tests/config/dkim.private.key +0 -6
  183. package/tests/config/dkim_sign.ini +0 -4
  184. package/tests/config/helo.checks.ini +0 -52
  185. package/tests/connection.js +0 -327
  186. package/tests/endpoint.js +0 -128
  187. package/tests/fixtures/vm_harness.js +0 -59
  188. package/tests/logger.js +0 -327
  189. package/tests/outbound/hmail.js +0 -112
  190. package/tests/outbound/index.js +0 -324
  191. package/tests/outbound/qfile.js +0 -67
  192. package/tests/outbound_bounce_net_errors.js +0 -173
  193. package/tests/plugins/auth/auth_base.js +0 -463
  194. package/tests/plugins/auth/auth_vpopmaild.js +0 -91
  195. package/tests/plugins/bounce.js +0 -307
  196. package/tests/plugins/clamd.js +0 -224
  197. package/tests/plugins/deprecated/relay_acl.js +0 -140
  198. package/tests/plugins/deprecated/relay_all.js +0 -59
  199. package/tests/plugins/dkim_sign.js +0 -315
  200. package/tests/plugins/dkim_signer.js +0 -108
  201. package/tests/plugins/dns_list_base.js +0 -259
  202. package/tests/plugins/dnsbl.js +0 -101
  203. package/tests/plugins/early_talker.js +0 -115
  204. package/tests/plugins/greylist.js +0 -58
  205. package/tests/plugins/helo.checks.js +0 -525
  206. package/tests/plugins/mail_from.is_resolvable.js +0 -116
  207. package/tests/plugins/queue/smtp_forward.js +0 -221
  208. package/tests/plugins/rcpt_to.host_list_base.js +0 -132
  209. package/tests/plugins/rcpt_to.in_host_list.js +0 -218
  210. package/tests/plugins/relay.js +0 -339
  211. package/tests/plugins/spamassassin.js +0 -171
  212. package/tests/plugins/status.js +0 -138
  213. package/tests/plugins/tls.js +0 -84
  214. package/tests/plugins.js +0 -247
  215. package/tests/rfc1869.js +0 -61
  216. package/tests/server.js +0 -510
  217. package/tests/smtp_client/auth.js +0 -105
  218. package/tests/smtp_client/basic.js +0 -101
  219. package/tests/smtp_client.js +0 -80
  220. package/tests/tls_socket.js +0 -333
  221. package/tests/transaction.js +0 -284
  222. /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
  223. /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
  224. /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
  225. /package/docs/{plugins → deprecated}/dnswl.md +0 -0
  226. /package/docs/{plugins → deprecated}/rcpt_to.routes.md +0 -0
  227. /package/{tests → test}/.eslintrc.yaml +0 -0
  228. /package/{tests → test}/config/auth_flat_file.ini +0 -0
  229. /package/{tests → test}/config/dhparams.pem +0 -0
  230. /package/{tests → test}/config/host_list +0 -0
  231. /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
  232. /package/{tests → test}/config/outbound_tls_key.pem +0 -0
  233. /package/{tests → test}/config/smtp_forward.ini +0 -0
  234. /package/{tests → test}/config/tls/ec.pem +0 -0
  235. /package/{tests → test}/config/tls/haraka.local.pem +0 -0
  236. /package/{tests → test}/config/tls/mismatched.pem +0 -0
  237. /package/{tests → test}/config/tls.ini +0 -0
  238. /package/{tests → test}/config/tls_cert.pem +0 -0
  239. /package/{tests → test}/config/tls_key.pem +0 -0
  240. /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
  241. /package/{tests → test}/installation/config/test-plugin-flat +0 -0
  242. /package/{tests → test}/installation/config/test-plugin.ini +0 -0
  243. /package/{tests → test}/installation/config/tls.ini +0 -0
  244. /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
  245. /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
  246. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
  247. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
  248. /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
  249. /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
  250. /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
  251. /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
  252. /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
  253. /package/{tests → test}/installation/plugins/inherits.js +0 -0
  254. /package/{tests → test}/installation/plugins/load_first.js +0 -0
  255. /package/{tests → test}/installation/plugins/plugin.js +0 -0
  256. /package/{tests → test}/installation/plugins/tls.js +0 -0
  257. /package/{tests → test}/loud/config/dhparams.pem +0 -0
  258. /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
  259. /package/{tests → test}/loud/config/tls.ini +0 -0
  260. /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
  261. /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
  262. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
  263. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
  264. /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
  265. /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
  266. /package/{tests → test}/queue/zero-length +0 -0
  267. /package/{tests → test}/test-queue/delete-me +0 -0
package/tests/server.js DELETED
@@ -1,510 +0,0 @@
1
- const path = require('path');
2
- const endpoint = require('../endpoint');
3
- const message = require('haraka-email-message')
4
-
5
- function _set_up (done) {
6
-
7
- this.config = require('haraka-config');
8
- this.server = require('../server');
9
-
10
- done();
11
- }
12
-
13
- exports.get_listen_addrs = {
14
- setUp : _set_up,
15
- 'IPv4 fully qualified' (test) {
16
- test.expect(1);
17
- const listeners = this.server.get_listen_addrs({listen: '127.0.0.1:25'});
18
- test.deepEqual(['127.0.0.1:25'], listeners);
19
- test.done();
20
- },
21
- 'IPv4, default port' (test) {
22
- test.expect(1);
23
- const listeners = this.server.get_listen_addrs({listen: '127.0.0.1'});
24
- test.deepEqual(['127.0.0.1:25'], listeners);
25
- test.done();
26
- },
27
- 'IPv4, custom port' (test) {
28
- test.expect(1);
29
- const listeners = this.server.get_listen_addrs({
30
- listen: '127.0.0.1'
31
- }, 250);
32
- test.deepEqual(['127.0.0.1:250'], listeners);
33
- test.done();
34
- },
35
- 'IPv6 fully qualified' (test) {
36
- test.expect(1);
37
- const listeners = this.server.get_listen_addrs({listen: '[::1]:25'});
38
- test.deepEqual(['[::1]:25'], listeners);
39
- test.done();
40
- },
41
- 'IPv6, default port' (test) {
42
- test.expect(1);
43
- const listeners = this.server.get_listen_addrs({listen: '[::1]'});
44
- test.deepEqual(['[::1]:25'], listeners);
45
- test.done();
46
- },
47
- 'IPv6, custom port' (test) {
48
- test.expect(1);
49
- const listeners = this.server.get_listen_addrs({listen: '[::1]'}, 250);
50
- test.deepEqual(['[::1]:250'], listeners);
51
- test.done();
52
- },
53
- 'IPv4 & IPv6 fully qualified' (test) {
54
- test.expect(1);
55
- const listeners = this.server.get_listen_addrs({
56
- listen: '127.0.0.1:25,[::1]:25'
57
- });
58
- test.deepEqual(['127.0.0.1:25','[::1]:25'], listeners);
59
- test.done();
60
- },
61
- 'IPv4 & IPv6, default port' (test) {
62
- test.expect(1);
63
- const listeners = this.server.get_listen_addrs({
64
- listen: '127.0.0.1:25,[::1]'
65
- });
66
- test.deepEqual(['127.0.0.1:25','[::1]:25'], listeners);
67
- test.done();
68
- },
69
- 'IPv4 & IPv6, custom port' (test) {
70
- test.expect(1);
71
- const listeners = this.server.get_listen_addrs({
72
- listen: '127.0.0.1,[::1]'
73
- }, 250);
74
- test.deepEqual(['127.0.0.1:250','[::1]:250'], listeners);
75
- test.done();
76
- },
77
- }
78
-
79
- exports.load_smtp_ini = {
80
- setUp : _set_up,
81
- 'saves settings to Server.cfg' (test) {
82
- test.expect(3);
83
- this.server.load_smtp_ini();
84
- // console.log(this.server.cfg);
85
- const c = this.server.cfg.main;
86
- test.notEqual(c.daemonize, undefined);
87
- test.notEqual(c.daemon_log_file, undefined);
88
- test.notEqual(c.daemon_pid_file, undefined);
89
- test.done();
90
- }
91
- }
92
-
93
- exports.get_smtp_server = {
94
- setUp (done) {
95
- this.config = require('haraka-config');
96
- this.config = this.config.module_config(path.resolve('tests'));
97
-
98
- this.server = require('../server');
99
- this.server.config = this.config.module_config(path.resolve('tests'));
100
- this.server.plugins.config = this.config.module_config(path.resolve('tests'));
101
-
102
- this.server.load_default_tls_config(() => {
103
- setTimeout(() => {
104
- done();
105
- }, 200);
106
- });
107
- },
108
- 'gets a net server object' (test) {
109
- this.server.get_smtp_server(endpoint('0.0.0.0:2501'), 10, (server) => {
110
- if (!server) {
111
- console.error('unable to bind to 0.0.0.0:2501');
112
- // test.expect(0);
113
- if (process.env.CI) { // can't bind to IP/port (fails on Travis)
114
- test.done();
115
- return;
116
- }
117
- }
118
- test.expect(3);
119
- test.ok(server);
120
- test.equal(server.has_tls, false);
121
- server.getConnections((err, count) => {
122
- test.equal(0, count);
123
- test.done();
124
- });
125
- });
126
- },
127
- 'gets a TLS net server object' (test) {
128
- this.server.cfg.main.smtps_port = 2502;
129
- this.server.get_smtp_server(endpoint('0.0.0.0:2502'), 10, (server) => {
130
- if (!server) {
131
- console.error('unable to bind to 0.0.0.0:2502');
132
- // test.expect(0);
133
- if (process.env.CI) { // can't bind to IP/port (fails on Travis)
134
- test.done();
135
- return;
136
- }
137
- }
138
- test.expect(3);
139
- test.ok(server);
140
- test.equal(server.has_tls, true);
141
- server.getConnections((err, count) => {
142
- test.equal(0, count);
143
- test.done();
144
- });
145
- });
146
- }
147
- }
148
-
149
- exports.get_http_docroot = {
150
- setUp : _set_up,
151
- 'gets a fs path' (test) {
152
- test.expect(1);
153
- const docroot = this.server.get_http_docroot();
154
- test.ok(docroot);
155
- test.done();
156
- },
157
- }
158
-
159
- function _setupServer (test, ip_port, done) {
160
- process.env.YES_REALLY_DO_DISCARD=1; // for queue/discard plugin
161
- process.env.HARAKA_TEST_DIR=path.resolve('tests');
162
-
163
- // test sets the default path for plugin instances to the test dir
164
- const test_cfg_path=path.resolve('tests');
165
-
166
- test.server = require('../server');
167
- test.config = require('haraka-config').module_config(test_cfg_path);
168
- test.server.logger.loglevel = 6; // INFO
169
-
170
- // set the default path for the plugin loader
171
- test.server.config = test.config.module_config(test_cfg_path);
172
- test.server.plugins.config = test.config.module_config(test_cfg_path);
173
- // test.server.outbound.config = test.config.module_config(test_cfg_path);
174
-
175
- test.server.load_smtp_ini();
176
- test.server.cfg.main.listen = ip_port;
177
- test.server.cfg.main.smtps_port = 2465;
178
- // console.log(test.server.cfg);
179
- test.server.load_default_tls_config(() => {
180
- test.server.createServer({});
181
- setTimeout(() => {
182
- done();
183
- }, 200);
184
- })
185
- }
186
-
187
- function _tearDownServer (done) {
188
- delete process.env.YES_REALLY_DO_DISCARD;
189
- delete process.env.HARAKA_TEST_DIR;
190
- this.server.stopListeners();
191
- this.server.plugins.registered_hooks = {};
192
- setTimeout(() => {
193
- done();
194
- }, 200);
195
- }
196
-
197
- exports.smtp_client = {
198
- setUp (done) {
199
- _setupServer(this, 'localhost:2500', done);
200
- },
201
- tearDown: _tearDownServer,
202
- 'accepts SMTP message': test => {
203
-
204
- test.expect(1);
205
- const server = { notes: { } };
206
- const cfg = {
207
- connect_timeout: 2,
208
- }
209
-
210
- const smtp_client = require('../smtp_client');
211
-
212
- smtp_client.get_client(server, (client) => {
213
-
214
- client
215
- .on('greeting', command => {
216
- client.send_command('HELO', 'haraka.local');
217
- })
218
- .on('helo', () => {
219
- client.send_command('MAIL', 'FROM:<test@haraka.local>');
220
- })
221
- .on('mail', () => {
222
- client.send_command('RCPT', 'TO:<nobody-will-see-this@haraka.local>');
223
- })
224
- .on('rcpt', () => {
225
- client.send_command('DATA');
226
- })
227
- .on('data', () => {
228
- const message_stream = new message.stream(
229
- { main : { spool_after : 1024 } }, "theMessageId"
230
- );
231
-
232
- message_stream.on('end', () => {
233
- client.socket.write('.\r\n');
234
- })
235
- message_stream.add_line('Header: test\r\n');
236
- message_stream.add_line('\r\n');
237
- message_stream.add_line('I am body text\r\n');
238
- message_stream.add_line_end();
239
-
240
- client.start_data(message_stream);
241
- })
242
- .on('dot', () => {
243
- test.ok(1);
244
- client.release();
245
- test.done();
246
- })
247
- .on('bad_code', (code, msg) => {
248
- client.release();
249
- test.done();
250
- });
251
-
252
- }, { port: 2500, host: 'localhost', cfg });
253
- },
254
- }
255
-
256
- exports.nodemailer = {
257
- setUp (done) {
258
- _setupServer(this, '127.0.0.1:2503', done);
259
- },
260
- tearDown: _tearDownServer,
261
- 'accepts SMTP message': test => {
262
-
263
- test.expect(1);
264
- const nodemailer = require('nodemailer');
265
- const transporter = nodemailer.createTransport({
266
- host: '127.0.0.1',
267
- port: 2503,
268
- tls: {
269
- // do not fail on invalid certs
270
- rejectUnauthorized: false
271
- }
272
- });
273
- transporter.sendMail({
274
- from: '"Testalicious Matt" <harakamail@gmail.com>',
275
- to: 'nobody-will-see-this@haraka.local',
276
- envelope: {
277
- from: 'Haraka Test <test@haraka.local>',
278
- to: 'Discard Queue <discard@haraka.local>',
279
- },
280
- subject: 'Hello ✔',
281
- text: 'Hello world ?',
282
- html: '<b>Hello world ?</b>',
283
- },
284
- (error, info) => {
285
- if (error){
286
- console.log(error);
287
- test.done();
288
- return;
289
- }
290
- test.deepEqual(info.accepted, [ 'discard@haraka.local' ]);
291
- console.log(`Message sent: ${info.response}`);
292
- test.done();
293
- });
294
- },
295
- 'accepts authenticated SMTP': test => {
296
-
297
- test.expect(1);
298
- const nodemailer = require('nodemailer');
299
- const transporter = nodemailer.createTransport({
300
- host: '127.0.0.1',
301
- port: 2503,
302
- auth: {
303
- user: 'matt',
304
- pass: 'goodPass'
305
- },
306
- requireTLS: true,
307
- tls: {
308
- // do not fail on invalid certs
309
- rejectUnauthorized: false
310
- }
311
- });
312
- transporter.sendMail({
313
- from: '"Testalicious Matt" <harakamail@gmail.com>',
314
- to: 'nobody-will-see-this@haraka.local',
315
- envelope: {
316
- from: 'Haraka Test <test@haraka.local>',
317
- to: 'Discard Queue <discard@haraka.local>',
318
- },
319
- subject: 'Hello ✔',
320
- text: 'Hello world ?',
321
- html: '<b>Hello world ?</b>',
322
- },
323
- (error, info) => {
324
- if (error){
325
- console.log(error);
326
- test.done();
327
- return;
328
- }
329
- test.deepEqual(info.accepted, [ 'discard@haraka.local' ]);
330
- console.log(`Message sent: ${info.response}`);
331
- test.done();
332
- });
333
- },
334
- 'rejects invalid auth': test => {
335
-
336
- test.expect(1);
337
- const nodemailer = require('nodemailer');
338
- const transporter = nodemailer.createTransport({
339
- host: '127.0.0.1',
340
- port: 2503,
341
- auth: {
342
- user: 'matt',
343
- pass: 'badPass'
344
- },
345
- tls: {
346
- // do not fail on invalid certs
347
- rejectUnauthorized: false
348
- }
349
- });
350
- transporter.sendMail({
351
- from: '"Testalicious Matt" <harakamail@gmail.com>',
352
- to: 'nobody-will-see-this@haraka.local',
353
- envelope: {
354
- from: 'Haraka Test <test@haraka.local>',
355
- to: 'Discard Queue <discard@haraka.local>',
356
- },
357
- subject: 'Hello ✔',
358
- text: 'Hello world ?',
359
- html: '<b>Hello world ?</b>',
360
- },
361
- (error, info) => {
362
- if (error){
363
- test.equals(error.code, 'EAUTH');
364
- // console.log(error);
365
- test.done();
366
- return;
367
- }
368
- console.log(info.response);
369
- test.done();
370
- });
371
- },
372
- 'DKIM validates signed message': test => {
373
-
374
- test.expect(1);
375
- const nodemailer = require('nodemailer');
376
- const transporter = nodemailer.createTransport({
377
- host: '127.0.0.1',
378
- port: 2503,
379
- tls: {
380
- // do not fail on invalid certs
381
- rejectUnauthorized: false
382
- }
383
- });
384
- transporter.sendMail({
385
- from: '"Testalicious Matt" <harakamail@gmail.com>',
386
- to: 'nobody-will-see-this@haraka.local',
387
- envelope: {
388
- from: 'Haraka Test <test@haraka.local>',
389
- to: 'Discard Queue <discard@haraka.local>',
390
- },
391
- subject: 'Hello ✔',
392
- text: 'Hello world ?',
393
- html: '<b>Hello world ?</b>',
394
- dkim: {
395
- domainName: "test.simerson.com",
396
- keySelector: "harakatest2017",
397
- privateKey: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAxqoUAnQ9GB3iNnkS7coj0Iggd0nyryW062tpK95NC5UXmmAwIpUMfkYdiHY2o2duWYGF0Bp237M/QXKhJYTXfsgkwP/bq9OGWtRZxHPHhbhdjbiI\nqObi6zvYcxrI77gpWDDvruhMeS9Hwa1R99pLUWd4PsuYTzbV/jwu2pz+XZXXXNEU\nVxzDAAj0yF7mwxHMLzQfR+hdhWcrgN0stUP0o7hm7hoOP8IWgcSW3JiQYavIKoI4\nm4+I9I1LzDJN2rHVnQvmjUrqqpG7X6SyFVFtuTWGaMqf1Cj/t8eSvU9VdgLFllS8\ntThqUZHq5S5hm8M8VzLuQLG9U0dtFolcFmJkbQIDAQABAoIBAB4fUbNhjpXmihM6\nXm1htfZ7fXi45Kw76me7vJGjPklgTNjidsn3kZJf7UBwtC4ok6nMos6ABMA8fH3e\n9KIst0QI8tG0ucke5INHKWlJKNqUrtK7RTVe9M84HsStLgRzBwnRObZqkJXbXmT2\nc7RCDCOGrcvPsQNpzB6lX3FUVpk3x24RXpQV1qSgH8yuHSPc1C6rssXwPAgnESfS\nK3MHRx2CLZvTTkq/YCsT+wS/O9RWPCVOYuWaa5DDDAIp3Yw1wYq9Upoh0BdIFC3U\nWm+5Cr3o9wxcvS6+W2RA6I51eymzvCU5ZakWt/bnUDb6/ByxsWOn5rL4WfPpCwE4\nnuC72v0CgYEA9imEq6a0GoaEsMoR7cxT7uXKimQH+Jaq3CGkuh0iN32F4FXhuUKz\nLYKSLCZzpb1MiDJv6BBchV6uSQ6ATo1cZ8WzYQISikk175bf0SPom591OZElvKA2\nSOrTrXtbl33YbWZEgyEcpTgelVi5ys9rj4eKkMvM0lwRmW6gctEFXRcCgYEAzpqc\nR/wqPjgPhpF1CZtdEwOZg4kkOig8CBcuQ7o/hDG7N69A9ZbeJO8eD+gKDrHRfkYr\nTH/UdkZGjilBk/lxnpIZpyBLxQ6UdhNPuwtxXKAvuSN+aQ0pdJn8tg03OSj2OzTK\nJ4hMsO/wt1xM8EDRobLZEosMadaYZUHzx8VU5RsCgYEAvFZbuXEcT0cocpLIUOaK\nOTf7VRLfvmSYaUAcZoEv0sDpExDiWPodWO6To8/vn5lL2tCsKiOKhkhAlIjRxkgF\nsSfj7I7HXKJS7/LBX6RXrem8qMTS2JTDs9pnBk5hb3DLjDg4pxNIdWiQjbeKvw8f\nvnr3m30yQqhKlte7Tt15exUCgYBzq7RbyR6Nfy2SFdYE7usJPjawohOaS/RwQyov\n2RK+nGlJH+GqnjD5VLbsCOm4mG3F2NtdFSSKo4XVCdwhUMMAGKQsIbTKOwN7qAw3\nmIx7Y2PUr76SakAPfDc0ZenJItnZBBE6WOE3Ht8Siaa5zFCRy2QlMZxdlTv1VRt7\neUuyiQKBgQDdXJO5+3h1HPxbYZcmNm/2CJUNw2ehU8vCiBXCcWPn7JukayHx+TXy\nyj0j/b1SvmKgjB+4JWluiqIU+QBjRjvb397QY1YoCEaGZd0zdFjTZwQksQ5AFst9\nCiD9OFXe/kkmIUQQra6aw1CoppyAfvAblp8uevLWb57xU3VUB3xeGg==\n-----END RSA PRIVATE KEY-----\n',
398
- }
399
- },
400
- (error, info) => {
401
- // console.log(info);
402
- if (error){
403
- console.log(error);
404
- test.done();
405
- return;
406
- }
407
- test.deepEqual(info.accepted, [ 'discard@haraka.local' ]);
408
- console.log(`Message sent: ${info.response}`);
409
- test.done();
410
- });
411
- },
412
- }
413
-
414
- exports.requireAuthorized_SMTPS = {
415
- setUp (done) {
416
- _setupServer(this, '127.0.0.1:2465', done);
417
- },
418
- tearDown: _tearDownServer,
419
- 'rejects non-validated SMTPS connection': test => {
420
-
421
- test.expect(1);
422
- const nodemailer = require('nodemailer');
423
- const transporter = nodemailer.createTransport({
424
- host: '127.0.0.1',
425
- port: 2465,
426
- secure: true,
427
- tls: {
428
- // do not fail on invalid certs
429
- rejectUnauthorized: false
430
- }
431
- });
432
-
433
- // give the SMTPS listener a second to start listening
434
- setTimeout(() => {
435
- transporter.sendMail({
436
- from: '"Testalicious Matt" <harakamail@gmail.com>',
437
- to: 'nobody-will-see-this@haraka.local',
438
- envelope: {
439
- from: 'Haraka Test <test@haraka.local>',
440
- to: 'Discard Queue <discard@haraka.local>',
441
- },
442
- subject: 'Hello ✔',
443
- text: 'Hello world ?',
444
- html: '<b>Hello world ?</b>',
445
- },
446
- (error, info) => {
447
- if (error) {
448
- // console.log(error);
449
- if (error.message === 'socket hang up') { // node 6 & 8
450
- test.equal(error.message, 'socket hang up');
451
- }
452
- else if (/alert certificate required/.test(error.message)) { // node 18
453
- test.ok(/alert certificate required/.test(error.message))
454
- }
455
- else { // node 10+
456
- test.equal(error.message, 'Client network socket disconnected before secure TLS connection was established');
457
- }
458
- }
459
- test.done();
460
- });
461
- }, 500);
462
- },
463
- }
464
-
465
- exports.requireAuthorized_STARTTLS = {
466
- setUp (done) {
467
- _setupServer(this, '127.0.0.1:2587', done);
468
- },
469
- 'rejects non-validated STARTTLS connection': test => {
470
-
471
- test.expect(1);
472
- const nodemailer = require('nodemailer');
473
- const transporter = nodemailer.createTransport({
474
- host: '127.0.0.1',
475
- port: 2587,
476
- secure: false,
477
- tls: {
478
- // do not fail on invalid certs
479
- rejectUnauthorized: false
480
- }
481
- });
482
-
483
- // give the SMTPS listener a second to start listening
484
- setTimeout(() => {
485
- transporter.sendMail({
486
- from: '"Testalicious Matt" <harakamail@gmail.com>',
487
- to: 'nobody-will-see-this@haraka.local',
488
- envelope: {
489
- from: 'Haraka Test <test@haraka.local>',
490
- to: 'Discard Queue <discard@haraka.local>',
491
- },
492
- subject: 'Hello ✔',
493
- text: 'Hello world ?',
494
- html: '<b>Hello world ?</b>',
495
- },
496
- (error, info) => {
497
- if (error) {
498
- // console.log(error);
499
- if (/alert certificate required/.test(error.message)) { // node 18
500
- test.ok(/alert certificate required/.test(error.message))
501
- }
502
- else {
503
- test.equal(error.message, 'Client network socket disconnected before secure TLS connection was established');
504
- }
505
- }
506
- test.done();
507
- });
508
- }, 500);
509
- },
510
- }
@@ -1,105 +0,0 @@
1
- const message = require('haraka-email-message')
2
-
3
- test.expect(15);
4
- const server = {notes: {}};
5
-
6
- exports.get_client(server, (smtp_client) => {
7
-
8
- const message_stream = new message.stream(
9
- { main : { spool_after : 1024 } }, "123456789"
10
- );
11
-
12
- const data = [];
13
- let reading_body = false;
14
- data.push('220 hi');
15
-
16
- smtp_client.on('greeting', command => {
17
- test.equals(smtp_client.response[0], 'hi');
18
- test.equals('EHLO', command);
19
- smtp_client.send_command(command, 'example.com');
20
- });
21
-
22
- data.push('EHLO example.com');
23
- data.push('250 hello');
24
-
25
- smtp_client.on('helo', () => {
26
- test.equals(smtp_client.response[0], 'hello');
27
- smtp_client.send_command('AUTH', 'PLAIN AHRlc3QAdGVzdHBhc3M=');
28
- smtp_client.send_command('MAIL', 'FROM: me@example.com');
29
- });
30
-
31
- data.push('AUTH PLAIN AHRlc3QAdGVzdHBhc3M='); // test/testpass
32
- data.push('235 Authentication successful.');
33
-
34
- data.push('MAIL FROM: me@example.com');
35
- data.push('250 sender ok');
36
-
37
- smtp_client.on('mail', () => {
38
- test.equals(smtp_client.response[0], 'sender ok');
39
- smtp_client.send_command('RCPT', 'TO: you@example.com');
40
- });
41
-
42
- data.push('RCPT TO: you@example.com');
43
- data.push('250 recipient ok');
44
-
45
- smtp_client.on('rcpt', () => {
46
- test.equals(smtp_client.response[0], 'recipient ok');
47
- smtp_client.send_command('DATA');
48
- });
49
-
50
- data.push('DATA');
51
- data.push('354 go ahead');
52
-
53
- smtp_client.on('data', () => {
54
- test.equals(smtp_client.response[0], 'go ahead');
55
- smtp_client.start_data(message_stream);
56
- message_stream.on('end', () => {
57
- smtp_client.socket.write('.\r\n');
58
- });
59
- message_stream.add_line('Header: test\r\n');
60
- message_stream.add_line('\r\n');
61
- message_stream.add_line('hi\r\n');
62
- message_stream.add_line_end();
63
- });
64
-
65
- data.push('.');
66
- data.push('250 message queued');
67
-
68
- smtp_client.on('dot', () => {
69
- test.equals(smtp_client.response[0], 'message queued');
70
- smtp_client.send_command('QUIT');
71
- });
72
-
73
- data.push('QUIT');
74
- data.push('221 goodbye');
75
-
76
- smtp_client.on('quit', () => {
77
- test.equals(smtp_client.response[0], 'goodbye');
78
- test.done();
79
- });
80
-
81
- smtp_client.socket.write = function (line) {
82
- if (data.length == 0) {
83
- test.ok(false);
84
- return;
85
- }
86
- test.equals(`${data.shift()}\r\n`, line);
87
- if (reading_body && line == '.\r\n') {
88
- reading_body = false;
89
- }
90
- if (!reading_body) {
91
- if (line == 'DATA\r\n') {
92
- reading_body = true;
93
- }
94
- while (true) {
95
- const line2 = data.shift();
96
- this.emit('line', `${line2}\r\n`);
97
- if (line2[3] == ' ') break;
98
- }
99
- }
100
-
101
- return true;
102
- };
103
-
104
- smtp_client.socket.emit('line', data.shift());
105
- });