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
@@ -0,0 +1,303 @@
1
+ 'use strict';
2
+ const assert = require('node:assert')
3
+
4
+ const fixtures = require('haraka-test-fixtures');
5
+
6
+ const _set_up = (done) => {
7
+ this.plugin = new fixtures.plugin('relay');
8
+ this.plugin.cfg = {};
9
+ this.connection = fixtures.connection.createConnection();
10
+ done();
11
+ }
12
+
13
+ describe('relay', () => {
14
+ describe('plugin', () => {
15
+ beforeEach(_set_up)
16
+
17
+ it('should have register function', () => {
18
+ assert.ok(this.plugin);
19
+ assert.equal('function', typeof this.plugin.register);
20
+ })
21
+
22
+ it('register function should call register_hook()', () => {
23
+ this.plugin.register();
24
+ assert.ok(this.plugin.register_hook.called);
25
+ })
26
+ })
27
+
28
+ describe('load_config_files', () => {
29
+ beforeEach(_set_up)
30
+
31
+ it('relay.ini', () => {
32
+ this.plugin.load_relay_ini();
33
+ assert.ok(typeof this.plugin.cfg === 'object');
34
+ assert.ok(this.plugin.cfg);
35
+ assert.ok(this.plugin.cfg.relay);
36
+ })
37
+
38
+ it('relay_dest_domains.ini', () => {
39
+ this.plugin.load_dest_domains();
40
+ assert.ok(typeof this.plugin.dest === 'object');
41
+ })
42
+ })
43
+
44
+ describe('is_acl_allowed', () => {
45
+ beforeEach(_set_up)
46
+
47
+ it('bare IP', () => {
48
+ this.plugin.acl_allow=['127.0.0.6'];
49
+ this.connection.remote.ip='127.0.0.6';
50
+ assert.equal(true, this.plugin.is_acl_allowed(this.connection));
51
+ this.connection.remote.ip='127.0.0.5';
52
+ assert.equal(false, this.plugin.is_acl_allowed(this.connection));
53
+ this.connection.remote.ip='127.0.1.5';
54
+ assert.equal(false, this.plugin.is_acl_allowed(this.connection));
55
+ })
56
+
57
+ it('netmask', () => {
58
+ this.plugin.acl_allow=['127.0.0.6/24'];
59
+ this.connection.remote.ip='127.0.0.6';
60
+ assert.equal(true, this.plugin.is_acl_allowed(this.connection));
61
+ this.connection.remote.ip='127.0.0.5';
62
+ assert.equal(true, this.plugin.is_acl_allowed(this.connection));
63
+ this.connection.remote.ip='127.0.1.5';
64
+ assert.equal(false, this.plugin.is_acl_allowed(this.connection));
65
+ })
66
+
67
+ it('mixed (ipv4 & ipv6 (Issue #428))', () => {
68
+ this.connection.remote.ip='2607:f060:b008:feed::2';
69
+ assert.equal(false, this.plugin.is_acl_allowed(this.connection));
70
+
71
+ this.plugin.acl_allow=['2607:f060:b008:feed::2/64'];
72
+ this.connection.remote.ip='2607:f060:b008:feed::2';
73
+ assert.equal(true, this.plugin.is_acl_allowed(this.connection));
74
+
75
+ this.plugin.acl_allow=['127.0.0.6/24'];
76
+ this.connection.remote.ip='2607:f060:b008:feed::2';
77
+ assert.equal(false, this.plugin.is_acl_allowed(this.connection));
78
+ })
79
+ })
80
+
81
+ describe('acl', () => {
82
+ beforeEach((done) => {
83
+ this.plugin = new fixtures.plugin('relay');
84
+ this.plugin.cfg = { relay: { dest_domains: true } };
85
+ this.connection = fixtures.connection.createConnection();
86
+ done();
87
+ })
88
+
89
+ it('relay.acl=false', (done) => {
90
+ this.plugin.cfg.relay.acl=false;
91
+ this.plugin.acl(() => {}, this.connection);
92
+ this.plugin.pass_relaying((rc) => {
93
+ assert.equal(undefined, rc);
94
+ done();
95
+ }, this.connection);
96
+ })
97
+
98
+ it('relay.acl=true, miss', (done) => {
99
+ this.plugin.cfg.relay.acl=true;
100
+ this.plugin.acl(() => {}, this.connection);
101
+ this.plugin.pass_relaying((rc) => {
102
+ assert.equal(undefined, rc);
103
+ assert.equal(false, this.connection.relaying);
104
+ done();
105
+ }, this.connection);
106
+ })
107
+
108
+ it('relay.acl=true, hit', (done) => {
109
+ this.plugin.cfg.relay.acl=true;
110
+ this.connection.remote.ip='1.1.1.1';
111
+ this.plugin.acl_allow=['1.1.1.1/32'];
112
+ this.plugin.acl(() => {}, this.connection);
113
+ this.plugin.pass_relaying((rc) => {
114
+ assert.equal(OK, rc);
115
+ assert.equal(true, this.connection.relaying);
116
+ done();
117
+ }, this.connection);
118
+ })
119
+
120
+ it('relay.acl=true, hit, missing mask', (done) => {
121
+ this.plugin.cfg.relay.acl=true;
122
+ this.connection.remote.ip='1.1.1.1';
123
+ this.plugin.acl_allow=['1.1.1.1'];
124
+ this.plugin.acl(() => {}, this.connection);
125
+ this.plugin.pass_relaying((rc) => {
126
+ assert.equal(OK, rc);
127
+ assert.equal(true, this.connection.relaying);
128
+ done();
129
+ }, this.connection);
130
+ })
131
+
132
+ it('relay.acl=true, hit, net', (done) => {
133
+ this.plugin.cfg.relay.acl=true;
134
+ this.connection.remote.ip='1.1.1.1';
135
+ this.plugin.acl_allow=['1.1.1.1/24'];
136
+ this.plugin.acl(() => {}, this.connection);
137
+ this.plugin.pass_relaying((rc) => {
138
+ assert.equal(OK, rc);
139
+ assert.equal(true, this.connection.relaying);
140
+ done();
141
+ }, this.connection);
142
+ })
143
+ })
144
+
145
+ describe('dest_domains', () => {
146
+ beforeEach((done) => {
147
+ this.plugin = new fixtures.plugin('relay');
148
+ this.plugin.cfg = { relay: { dest_domains: true } };
149
+
150
+ this.connection = fixtures.connection.createConnection();
151
+ this.connection.init_transaction();
152
+
153
+ done();
154
+ })
155
+
156
+ it('relay.dest_domains=false', (done) => {
157
+ this.plugin.cfg.relay.dest_domains=false;
158
+ this.plugin.dest_domains((rc) => {
159
+ assert.equal(undefined, rc);
160
+ done();
161
+ }, this.connection, [{host:'foo'}]);
162
+ })
163
+
164
+ it('relaying', (done) => {
165
+ this.connection.relaying=true;
166
+ this.plugin.dest_domains((rc) => {
167
+ assert.equal(undefined, rc);
168
+ assert.equal(1, this.connection.transaction.results.get('relay').skip.length);
169
+ done();
170
+ }, this.connection, [{host:'foo'}]);
171
+ })
172
+
173
+ it('no config', (done) => {
174
+ this.plugin.dest_domains((rc) => {
175
+ assert.equal(undefined, rc);
176
+ assert.equal(1, this.connection.transaction.results.get('relay').err.length);
177
+ done();
178
+ }, this.connection, [{host:'foo'}]);
179
+ })
180
+
181
+ it('action=undef', (done) => {
182
+ this.plugin.dest = { domains: { foo: '{"action":"dunno"}' } };
183
+ this.plugin.dest_domains((rc) => {
184
+ assert.equal(DENY, rc);
185
+ assert.equal(1, this.connection.transaction.results.get('relay').fail.length);
186
+ done();
187
+ }, this.connection, [{host:'foo'}]);
188
+ })
189
+
190
+ it('action=deny', (done) => {
191
+ this.plugin.dest = { domains: { foo: '{"action":"deny"}' } };
192
+ this.plugin.dest_domains((rc) => {
193
+ assert.equal(DENY, rc);
194
+ assert.equal(1, this.connection.transaction.results.get('relay').fail.length);
195
+ done();
196
+ }, this.connection, [{host:'foo'}]);
197
+ })
198
+
199
+ it('action=continue', (done) => {
200
+ this.plugin.dest = { domains: { foo: '{"action":"continue"}' } };
201
+ this.plugin.dest_domains((rc) => {
202
+ assert.equal(CONT, rc);
203
+ assert.equal(1, this.connection.transaction.results.get('relay').pass.length);
204
+ done();
205
+ }, this.connection, [{host:'foo'}]);
206
+ })
207
+
208
+ it('action=accept', (done) => {
209
+ this.plugin.dest = { domains: { foo: '{"action":"continue"}' } };
210
+ this.plugin.dest_domains((rc) => {
211
+ assert.equal(CONT, rc);
212
+ assert.equal(1, this.connection.transaction.results.get('relay').pass.length);
213
+ done();
214
+ }, this.connection, [{host:'foo'}]);
215
+ })
216
+ })
217
+
218
+ describe('force_routing', () => {
219
+ beforeEach((done) => {
220
+ this.plugin = new fixtures.plugin('relay');
221
+ this.plugin.cfg = { relay: { force_routing: true } };
222
+ this.plugin.dest = {};
223
+
224
+ this.connection = fixtures.connection.createConnection();
225
+ this.connection.init_transaction()
226
+
227
+ done();
228
+ })
229
+
230
+ it('relay.force_routing=false', (done) => {
231
+ this.plugin.cfg.relay.force_routing=false;
232
+ this.plugin.force_routing((rc) => {
233
+ assert.equal(undefined, rc);
234
+ done();
235
+ }, this.connection, 'foo');
236
+ })
237
+
238
+ it('dest_domains empty', (done) => {
239
+ this.plugin.force_routing((rc) => {
240
+ assert.equal(undefined, rc);
241
+ done();
242
+ }, this.connection, 'foo');
243
+ })
244
+
245
+ it('dest_domains, no route', (done) => {
246
+ this.plugin.dest = { domains: { foo: '{"action":"blah blah"}' } };
247
+ this.plugin.force_routing((rc, nexthop) => {
248
+ assert.equal(undefined, rc);
249
+ assert.equal(undefined, nexthop);
250
+ done();
251
+ }, this.connection, 'foo');
252
+ })
253
+
254
+ it('dest_domains, route', (done) => {
255
+ this.plugin.dest = { domains: { foo: '{"action":"blah blah","nexthop":"other-server"}' } };
256
+ this.plugin.force_routing((rc, nexthop) => {
257
+ assert.equal(OK, rc);
258
+ assert.equal('other-server', nexthop);
259
+ done();
260
+ }, this.connection, 'foo');
261
+ })
262
+
263
+ it('dest-domains, any', (done) => {
264
+ this.plugin.dest = { domains: { foo: '{"action":"blah blah","nexthop":"other-server"}',
265
+ any: '{"action":"blah blah","nexthop":"any-server"}'} };
266
+ this.plugin.force_routing((rc, nexthop) => {
267
+ assert.equal(OK, rc);
268
+ assert.equal('any-server', nexthop);
269
+ done();
270
+ }, this.connection, 'not');
271
+ })
272
+ })
273
+
274
+ describe('all', () => {
275
+ beforeEach(_set_up)
276
+
277
+ it('register_hook() should register available function', () => {
278
+ assert.ok(this.plugin.all);
279
+ assert.equal('function', typeof this.plugin.all);
280
+ this.plugin.register();
281
+ this.plugin.cfg.relay.all = true;
282
+ this.plugin.register_hook('rcpt', 'all'); // register() doesn't b/c config is disabled
283
+ // console.log(this.plugin.register_hook.args);
284
+ assert.equal(this.plugin.register_hook.args[3][1], 'all');
285
+ })
286
+
287
+ it('all hook always returns OK', (done) => {
288
+ this.plugin.cfg.relay = { all: true };
289
+ this.plugin.all((action) => {
290
+ assert.equal(action, OK);
291
+ done();
292
+ }, this.connection, ['foo@bar.com']);
293
+ })
294
+
295
+ it('all hook always sets connection.relaying to 1', (done) => {
296
+ this.plugin.cfg.relay = { all: true };
297
+ this.plugin.all((action) => {
298
+ assert.equal(this.connection.relaying, 1);
299
+ done();
300
+ }, this.connection, ['foo@bar.com']);
301
+ })
302
+ })
303
+ })
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ const assert = require('node:assert')
4
+
5
+ const fixtures = require('haraka-test-fixtures');
6
+ const outbound = require('../../outbound');
7
+ const TimerQueue = require('../../outbound/timer_queue');
8
+
9
+ const Connection = fixtures.connection;
10
+
11
+ const _set_up = (done) => {
12
+ this.plugin = new fixtures.plugin('status');
13
+ this.plugin.outbound = outbound;
14
+
15
+ this.connection = Connection.createConnection();
16
+ this.connection.remote.is_local = true;
17
+ done();
18
+ }
19
+
20
+ describe('status', () => {
21
+
22
+ describe('register', () => {
23
+ beforeEach(_set_up)
24
+
25
+ it('loads the status plugin', () => {
26
+ assert.equal('status', this.plugin.name);
27
+ })
28
+ })
29
+
30
+ describe('access', () => {
31
+ beforeEach(_set_up)
32
+
33
+ it('remote', (done) => {
34
+ this.connection.remote.is_local = false;
35
+ this.plugin.hook_unrecognized_command((code) => {
36
+ assert.equal(DENY, code);
37
+ done();
38
+ }, this.connection, ['STATUS', 'POOL LIST']);
39
+ })
40
+ })
41
+
42
+ describe('pools', () => {
43
+ beforeEach(_set_up)
44
+
45
+ it('list_pools', (done) => {
46
+ this.connection.respond = (code, message) => {
47
+ const data = JSON.parse(message);
48
+ assert.equal('object', typeof data); // there should be one pools array for noncluster and more for cluster
49
+ done();
50
+ };
51
+ this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'POOL LIST']);
52
+ })
53
+ })
54
+
55
+ describe('queues', () => {
56
+ beforeEach(_set_up)
57
+
58
+ it('inspect_queue', (done) => {
59
+ // should list delivery_queue and temp_fail_queue per cluster children
60
+ outbound.temp_fail_queue = new TimerQueue(10);
61
+ outbound.temp_fail_queue.add('file1', 100, () => {});
62
+ outbound.temp_fail_queue.add('file2', 100, () => {});
63
+
64
+ this.connection.respond = (code, message) => {
65
+ const data = JSON.parse(message);
66
+ assert.equal(0, data.delivery_queue.length);
67
+ assert.equal(2, data.temp_fail_queue.length);
68
+ done();
69
+ };
70
+ this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'QUEUE INSPECT']);
71
+ })
72
+
73
+ it('stat_queue', (done) => {
74
+ // should list files only
75
+ this.connection.respond = (code, message) => {
76
+ const data = JSON.parse(message);
77
+ assert.ok(/^\d+\/\d+\/\d+$/.test(data));
78
+ done();
79
+ };
80
+ this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'QUEUE STATS']);
81
+ })
82
+
83
+ it('list_queue', (done) => {
84
+ // should list files only
85
+ this.connection.respond = (code, message) => {
86
+ const data = JSON.parse(message);
87
+ assert.equal(0, data.length);
88
+ done();
89
+ };
90
+ this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'QUEUE LIST']);
91
+ })
92
+
93
+ it('discard_from_queue', (done) => {
94
+ const self = this;
95
+
96
+ outbound.temp_fail_queue = new TimerQueue(10);
97
+ outbound.temp_fail_queue.add('file1', 10, () => {
98
+ assert.ok(false, 'This callback should not be called');
99
+ done();
100
+ })
101
+
102
+ outbound.temp_fail_queue.add('file2', 2000, () => {});
103
+
104
+ this.plugin.hook_unrecognized_command(() => {
105
+ self.connection.respond = (code, message) => {
106
+ const data = JSON.parse(message);
107
+ assert.equal(1, data.temp_fail_queue.length);
108
+ done();
109
+ }
110
+ self.plugin.hook_unrecognized_command(() => {}, self.connection, ['STATUS', 'QUEUE INSPECT']);
111
+ }, this.connection, ['STATUS', 'QUEUE DISCARD file1']);
112
+ })
113
+
114
+ it('push_email_at_queue', (done) => {
115
+ const timeout = setTimeout(() => {
116
+ assert.ok(false, 'Timeout');
117
+ done();
118
+ }, 1000);
119
+
120
+ outbound.temp_fail_queue.add('file', 1500, () => {
121
+ clearTimeout(timeout);
122
+
123
+ assert.ok(true);
124
+ done();
125
+ });
126
+
127
+ this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'QUEUE PUSH file']);
128
+ })
129
+ })
130
+ })
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ const assert = require('node:assert')
4
+ const path = require('node:path');
5
+
6
+ const fixtures = require('haraka-test-fixtures');
7
+ const Plugin = fixtures.plugin;
8
+
9
+ const _set_up = (done) => {
10
+ this.plugin = new Plugin('tls')
11
+ this.connection = new fixtures.connection.createConnection();
12
+
13
+ // use test/config instead of ./config
14
+ this.plugin.config = this.plugin.config.module_config(path.resolve('test'));
15
+ this.plugin.net_utils.config = this.plugin.net_utils.config.module_config(path.resolve('test'));
16
+
17
+ this.plugin.tls_opts = {};
18
+ done();
19
+ }
20
+
21
+ describe('tls', ()=> {
22
+ beforeEach(_set_up)
23
+
24
+ it('has function register', () => {
25
+ assert.ok(this.plugin);
26
+ assert.equal('function', typeof this.plugin.register);
27
+ })
28
+
29
+ it('has function upgrade_connection', () => {
30
+ assert.equal('function', typeof this.plugin.upgrade_connection);
31
+ })
32
+
33
+ it('has function advertise_starttls', () => {
34
+ assert.equal('function', typeof this.plugin.advertise_starttls);
35
+ })
36
+
37
+ it('has function emit_upgrade_msg', () => {
38
+ assert.equal('function', typeof this.plugin.emit_upgrade_msg);
39
+ })
40
+
41
+ describe('register', ()=> {
42
+ it('with certs, should call register_hook()', () => {
43
+ this.plugin.register();
44
+ assert.ok(this.plugin.register_hook.called);
45
+ })
46
+ })
47
+
48
+ describe('emit_upgrade_msg', ()=> {
49
+
50
+ it('should emit a log message', () => {
51
+ assert.equal(this.plugin.emit_upgrade_msg(this.connection, true, '', {
52
+ subject: {
53
+ CN: 'TLS.subject',
54
+ O: 'TLS.org'
55
+ },
56
+ }),
57
+ 'secured: verified=true cn="TLS.subject" organization="TLS.org"');
58
+ })
59
+
60
+ it('should emit a log message with error', () => {
61
+ assert.equal(this.plugin.emit_upgrade_msg(this.connection, true, 'oops', {
62
+ subject: {
63
+ CN: 'TLS.subject',
64
+ O: 'TLS.org'
65
+ },
66
+ }),
67
+ 'secured: verified=true error="oops" cn="TLS.subject" organization="TLS.org"');
68
+ })
69
+ })
70
+ })