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
@@ -1,339 +0,0 @@
1
- 'use strict';
2
-
3
- const fixtures = require('haraka-test-fixtures');
4
-
5
- function _set_up (done) {
6
-
7
- this.plugin = new fixtures.plugin('relay');
8
- this.plugin.cfg = {};
9
- this.connection = fixtures.connection.createConnection();
10
-
11
- done();
12
- }
13
-
14
- exports.plugin = {
15
- setUp : _set_up,
16
- 'should have register function' (test) {
17
- test.expect(2);
18
- test.ok(this.plugin);
19
- test.equal('function', typeof this.plugin.register);
20
- test.done();
21
- },
22
- 'register function should call register_hook()' (test) {
23
- test.expect(1);
24
- // console.log(this.plugin);
25
- this.plugin.register();
26
- test.ok(this.plugin.register_hook.called);
27
- // console.log(this.plugin);
28
- test.done();
29
- },
30
- }
31
-
32
- exports.load_config_files = {
33
- setUp : _set_up,
34
- 'relay.ini' (test) {
35
- test.expect(3);
36
- this.plugin.load_relay_ini();
37
- test.ok(typeof this.plugin.cfg === 'object');
38
- test.ok(this.plugin.cfg);
39
- test.ok(this.plugin.cfg.relay);
40
- test.done();
41
- },
42
- 'relay_dest_domains.ini' (test) {
43
- test.expect(1);
44
- this.plugin.load_dest_domains();
45
- test.ok(typeof this.plugin.dest === 'object');
46
- test.done();
47
- },
48
- }
49
-
50
- exports.is_acl_allowed = {
51
- setUp : _set_up,
52
- 'bare IP' (test) {
53
- test.expect(3);
54
- this.plugin.acl_allow=['127.0.0.6'];
55
- this.connection.remote.ip='127.0.0.6';
56
- test.equal(true, this.plugin.is_acl_allowed(this.connection));
57
- this.connection.remote.ip='127.0.0.5';
58
- test.equal(false, this.plugin.is_acl_allowed(this.connection));
59
- this.connection.remote.ip='127.0.1.5';
60
- test.equal(false, this.plugin.is_acl_allowed(this.connection));
61
- test.done();
62
- },
63
- 'netmask' (test) {
64
- test.expect(3);
65
- this.plugin.acl_allow=['127.0.0.6/24'];
66
- this.connection.remote.ip='127.0.0.6';
67
- test.equal(true, this.plugin.is_acl_allowed(this.connection));
68
- this.connection.remote.ip='127.0.0.5';
69
- test.equal(true, this.plugin.is_acl_allowed(this.connection));
70
- this.connection.remote.ip='127.0.1.5';
71
- test.equal(false, this.plugin.is_acl_allowed(this.connection));
72
- test.done();
73
- },
74
- 'mixed (ipv4 & ipv6 (Issue #428))' (test) {
75
- test.expect(3);
76
- this.connection.remote.ip='2607:f060:b008:feed::2';
77
- test.equal(false, this.plugin.is_acl_allowed(this.connection));
78
-
79
- this.plugin.acl_allow=['2607:f060:b008:feed::2/64'];
80
- this.connection.remote.ip='2607:f060:b008:feed::2';
81
- test.equal(true, this.plugin.is_acl_allowed(this.connection));
82
-
83
- this.plugin.acl_allow=['127.0.0.6/24'];
84
- this.connection.remote.ip='2607:f060:b008:feed::2';
85
- test.equal(false, this.plugin.is_acl_allowed(this.connection));
86
-
87
- test.done();
88
- },
89
- }
90
-
91
- exports.acl = {
92
- setUp (callback) {
93
- this.plugin = new fixtures.plugin('relay');
94
- this.plugin.cfg = { relay: { dest_domains: true } };
95
- this.connection = fixtures.connection.createConnection();
96
- callback();
97
- },
98
- 'relay.acl=false' (test) {
99
- test.expect(1);
100
- function next (rc) {
101
- test.equal(undefined, rc);
102
- test.done();
103
- }
104
- this.plugin.cfg.relay.acl=false;
105
- this.plugin.acl(() => {}, this.connection);
106
- this.plugin.pass_relaying(next, this.connection);
107
- },
108
- 'relay.acl=true, miss' (test) {
109
- test.expect(2);
110
- const next = function (rc) {
111
- test.equal(undefined, rc);
112
- test.equal(false, this.connection.relaying);
113
- test.done();
114
- }.bind(this);
115
- this.plugin.cfg.relay.acl=true;
116
- this.plugin.acl(() => {}, this.connection);
117
- this.plugin.pass_relaying(next, this.connection);
118
- },
119
- 'relay.acl=true, hit' (test) {
120
- test.expect(2);
121
- const next = function (rc) {
122
- test.equal(OK, rc);
123
- test.equal(true, this.connection.relaying);
124
- test.done();
125
- }.bind(this);
126
- this.plugin.cfg.relay.acl=true;
127
- this.connection.remote.ip='1.1.1.1';
128
- this.plugin.acl_allow=['1.1.1.1/32'];
129
- this.plugin.acl(() => {}, this.connection);
130
- this.plugin.pass_relaying(next, this.connection);
131
- },
132
- 'relay.acl=true, hit, missing mask' (test) {
133
- test.expect(2);
134
- const next = function (rc) {
135
- test.equal(OK, rc);
136
- test.equal(true, this.connection.relaying);
137
- test.done();
138
- }.bind(this);
139
- this.plugin.cfg.relay.acl=true;
140
- this.connection.remote.ip='1.1.1.1';
141
- this.plugin.acl_allow=['1.1.1.1'];
142
- this.plugin.acl(() => {}, this.connection);
143
- this.plugin.pass_relaying(next, this.connection);
144
- },
145
- 'relay.acl=true, hit, net' (test) {
146
- test.expect(2);
147
- const next = function (rc) {
148
- test.equal(OK, rc);
149
- test.equal(true, this.connection.relaying);
150
- test.done();
151
- }.bind(this);
152
- this.plugin.cfg.relay.acl=true;
153
- this.connection.remote.ip='1.1.1.1';
154
- this.plugin.acl_allow=['1.1.1.1/24'];
155
- this.plugin.acl(() => {}, this.connection);
156
- this.plugin.pass_relaying(next, this.connection);
157
- },
158
- }
159
-
160
- exports.dest_domains = {
161
- setUp (callback) {
162
- this.plugin = new fixtures.plugin('relay');
163
- this.plugin.cfg = { relay: { dest_domains: true } };
164
-
165
- this.connection = fixtures.connection.createConnection();
166
- this.connection.transaction = {
167
- results: new fixtures.results(this.connection),
168
- };
169
-
170
- callback();
171
- },
172
- 'relay.dest_domains=false' (test) {
173
- test.expect(1);
174
- function next (rc) {
175
- test.equal(undefined, rc);
176
- test.done();
177
- }
178
- this.plugin.cfg.relay.dest_domains=false;
179
- this.plugin.dest_domains(next, this.connection, [{host:'foo'}]);
180
- },
181
- 'relaying' (test) {
182
- test.expect(2);
183
- const next = function (rc) {
184
- test.equal(undefined, rc);
185
- test.equal(1, this.connection.transaction.results.get('relay').skip.length);
186
- test.done();
187
- }.bind(this);
188
- this.connection.relaying=true;
189
- this.plugin.dest_domains(next, this.connection, [{host:'foo'}]);
190
- },
191
- 'no config' (test) {
192
- test.expect(2);
193
- const next = function (rc) {
194
- test.equal(undefined, rc);
195
- test.equal(1, this.connection.transaction.results.get('relay').err.length);
196
- test.done();
197
- }.bind(this);
198
- this.plugin.dest_domains(next, this.connection, [{host:'foo'}]);
199
- },
200
- 'action=undef' (test) {
201
- test.expect(2);
202
- const next = function (rc) {
203
- test.equal(DENY, rc);
204
- test.equal(1, this.connection.transaction.results.get('relay').fail.length);
205
- test.done();
206
- }.bind(this);
207
- this.plugin.dest = { domains: { foo: '{"action":"dunno"}' } };
208
- this.plugin.dest_domains(next, this.connection, [{host:'foo'}]);
209
- },
210
- 'action=deny' (test) {
211
- test.expect(2);
212
- const next = function (rc) {
213
- test.equal(DENY, rc);
214
- test.equal(1, this.connection.transaction.results.get('relay').fail.length);
215
- test.done();
216
- }.bind(this);
217
- this.plugin.dest = { domains: { foo: '{"action":"deny"}' } };
218
- this.plugin.dest_domains(next, this.connection, [{host:'foo'}]);
219
- },
220
- 'action=continue' (test) {
221
- test.expect(2);
222
- const next = function (rc) {
223
- test.equal(CONT, rc);
224
- test.equal(1, this.connection.transaction.results.get('relay').pass.length);
225
- test.done();
226
- }.bind(this);
227
- this.plugin.dest = { domains: { foo: '{"action":"continue"}' } };
228
- this.plugin.dest_domains(next, this.connection, [{host:'foo'}]);
229
- },
230
- 'action=accept' (test) {
231
- test.expect(2);
232
- const next = function (rc) {
233
- test.equal(CONT, rc);
234
- test.equal(1, this.connection.transaction.results.get('relay').pass.length);
235
- test.done();
236
- }.bind(this);
237
- this.plugin.dest = { domains: { foo: '{"action":"continue"}' } };
238
- this.plugin.dest_domains(next, this.connection, [{host:'foo'}]);
239
- },
240
- }
241
-
242
- exports.force_routing = {
243
- setUp (callback) {
244
- this.plugin = new fixtures.plugin('relay');
245
- this.plugin.cfg = { relay: { force_routing: true } };
246
- this.plugin.dest = {};
247
-
248
- this.connection = fixtures.connection.createConnection();
249
- this.connection.transaction = {
250
- results: new fixtures.results(this.connection),
251
- };
252
-
253
- callback();
254
- },
255
- 'relay.force_routing=false' (test) {
256
- test.expect(1);
257
- function next (rc) {
258
- test.equal(undefined, rc);
259
- test.done();
260
- }
261
- this.plugin.cfg.relay.force_routing=false;
262
- this.plugin.force_routing(next, this.connection, 'foo');
263
- },
264
- 'dest_domains empty' (test) {
265
- test.expect(1);
266
- function next (rc) {
267
- test.equal(undefined, rc);
268
- test.done();
269
- }
270
- this.plugin.force_routing(next, this.connection, 'foo');
271
- },
272
- 'dest_domains, no route' (test) {
273
- test.expect(2);
274
- function next (rc, nexthop) {
275
- // console.log(arguments);
276
- test.equal(undefined, rc);
277
- test.equal(undefined, nexthop);
278
- test.done();
279
- }
280
- this.plugin.dest = { domains: { foo: '{"action":"blah blah"}' } };
281
- this.plugin.force_routing(next, this.connection, 'foo');
282
- },
283
- 'dest_domains, route' (test) {
284
- test.expect(2);
285
- function next (rc, nexthop) {
286
- test.equal(OK, rc);
287
- test.equal('other-server', nexthop);
288
- test.done();
289
- }
290
- this.plugin.dest = { domains: { foo: '{"action":"blah blah","nexthop":"other-server"}' } };
291
- this.plugin.force_routing(next, this.connection, 'foo');
292
- },
293
- 'dest-domains, any' (test) {
294
- test.expect(2);
295
- function next (rc, nexthop) {
296
- test.equal(OK, rc);
297
- test.equal('any-server', nexthop);
298
- test.done();
299
- }
300
- this.plugin.dest = { domains: { foo: '{"action":"blah blah","nexthop":"other-server"}',
301
- any: '{"action":"blah blah","nexthop":"any-server"}'} };
302
- this.plugin.force_routing(next, this.connection, 'not');
303
- }
304
- }
305
-
306
- exports.all = {
307
- setUp : _set_up,
308
- 'register_hook() should register available function' (test) {
309
- test.expect(3);
310
- test.ok(this.plugin.all);
311
- test.equal('function', typeof this.plugin.all);
312
- this.plugin.register();
313
- this.plugin.cfg.relay.all = true;
314
- this.plugin.register_hook('rcpt', 'all'); // register() doesn't b/c config is disabled
315
- // console.log(this.plugin.register_hook.args);
316
- console.log(this.plugin.register_hook.args);
317
- test.equals(this.plugin.register_hook.args[3][1], 'all');
318
- test.done();
319
- },
320
- 'all hook always returns OK' (test) {
321
- function next (action) {
322
- test.expect(1);
323
- test.equals(action, OK);
324
- test.done();
325
- }
326
- this.plugin.cfg.relay = { all: true };
327
- this.plugin.all(next, this.connection, ['foo@bar.com']);
328
- },
329
- 'all hook always sets connection.relaying to 1' (test) {
330
- const next = function (action) {
331
- test.expect(1);
332
- test.equals(this.connection.relaying, 1);
333
- test.done();
334
- }.bind(this);
335
-
336
- this.plugin.cfg.relay = { all: true };
337
- this.plugin.all(next, this.connection, ['foo@bar.com']);
338
- }
339
- }
@@ -1,171 +0,0 @@
1
- 'use strict';
2
-
3
- const Address = require('address-rfc2821');
4
- const fixtures = require('haraka-test-fixtures');
5
-
6
- function _set_up (done) {
7
-
8
- this.plugin = new fixtures.plugin('spamassassin');
9
- this.plugin.cfg = {
10
- main: {
11
- spamc_auth_header: 'X-Haraka-Relaying123'
12
- },
13
- check: {},
14
- };
15
-
16
- this.connection = fixtures.connection.createConnection();
17
- this.connection.transaction = fixtures.transaction.createTransaction()
18
-
19
- done();
20
- }
21
-
22
- exports.register = {
23
- setUp : _set_up,
24
- 'loads the spamassassin plugin' (test) {
25
- test.expect(1);
26
- test.equal('spamassassin', this.plugin.name);
27
- test.done();
28
- },
29
- 'register loads spamassassin.ini' (test) {
30
- test.expect(2);
31
- this.plugin.register();
32
- test.ok(this.plugin.cfg);
33
- test.ok(this.plugin.cfg.main.spamd_socket);
34
- test.done();
35
- },
36
- }
37
-
38
- exports.load_spamassassin_ini = {
39
- setUp : _set_up,
40
- 'loads spamassassin.ini' (test) {
41
- test.expect(3);
42
- test.equal(undefined, this.plugin.cfg.main.spamd_socket);
43
- this.plugin.load_spamassassin_ini();
44
- test.ok(this.plugin.cfg.main.spamd_socket);
45
- test.equal(this.plugin.cfg.main.spamc_auth_header, 'X-Haraka-Relay');
46
- test.done();
47
- },
48
- }
49
-
50
- exports.should_skip = {
51
- setUp : _set_up,
52
- 'max_size not set' (test) {
53
- // this.plugin.cfg = { main: {}}
54
- test.expect(1);
55
- test.equal(false, this.plugin.should_skip(this.connection));
56
- test.done();
57
- },
58
- 'max_size 10, data_bytes 9 = false' (test) {
59
- test.expect(1);
60
- this.plugin.cfg.main = { max_size: 10 };
61
- this.connection.transaction.data_bytes = 9;
62
- test.equal(false, this.plugin.should_skip(this.connection));
63
- test.done();
64
- },
65
- 'max_size 10, data_bytes 11 = true' (test) {
66
- test.expect(1);
67
- this.plugin.cfg.main = { max_size: 10 };
68
- this.connection.transaction.data_bytes = 11;
69
- test.equal(true, this.plugin.should_skip(this.connection));
70
- test.done();
71
- },
72
- }
73
-
74
- // console.log(this.plugin.cfg);
75
-
76
- exports.get_spamd_headers = {
77
- setUp : _set_up,
78
- 'returns a spamd protocol request' (test) {
79
- test.expect(1);
80
- this.connection.transaction.mail_from = new Address.Address('<matt@example.com>');
81
- this.connection.transaction.uuid = 'THIS-IS-A-TEST-UUID';
82
- const headers = this.plugin.get_spamd_headers(this.connection, 'test_user');
83
- const expected_headers = [
84
- 'HEADERS SPAMC/1.4',
85
- 'User: test_user',
86
- '',
87
- 'X-Envelope-From: matt@example.com',
88
- 'X-Haraka-UUID: THIS-IS-A-TEST-UUID'
89
- ];
90
- test.deepEqual(headers, expected_headers);
91
- test.done();
92
- },
93
- }
94
-
95
- exports.get_spamd_headers_relaying = {
96
- setUp : _set_up,
97
- 'returns a spamd protocol request when relaying' (test) {
98
- test.expect(1);
99
- this.connection.transaction.mail_from = new Address.Address('<matt@example.com>');
100
- this.connection.transaction.uuid = 'THIS-IS-A-TEST-UUID';
101
- this.connection.set('relaying', true);
102
- const headers = this.plugin.get_spamd_headers(this.connection, 'test_user');
103
- const expected_headers = [
104
- 'HEADERS SPAMC/1.4',
105
- 'User: test_user',
106
- '',
107
- 'X-Envelope-From: matt@example.com',
108
- 'X-Haraka-UUID: THIS-IS-A-TEST-UUID',
109
- 'X-Haraka-Relaying123: true',
110
- ];
111
- test.deepEqual(headers, expected_headers);
112
- test.done();
113
- },
114
- }
115
-
116
- exports.get_spamd_username = {
117
- setUp : _set_up,
118
- 'default' (test) {
119
- test.expect(1);
120
- test.equal('default', this.plugin.get_spamd_username(this.connection));
121
- test.done();
122
- },
123
- 'set in txn.notes.spamd_user' (test) {
124
- test.expect(1);
125
- this.connection.transaction.notes.spamd_user = 'txuser';
126
- test.equal('txuser', this.plugin.get_spamd_username(this.connection));
127
- test.done();
128
- },
129
- 'set in cfg.main.spamd_user' (test) {
130
- test.expect(1);
131
- this.plugin.cfg.main.spamd_user = 'cfguser';
132
- test.equal('cfguser', this.plugin.get_spamd_username(this.connection));
133
- test.done();
134
- },
135
- 'set to first-recipient' (test) {
136
- this.plugin.cfg.main.spamd_user = 'first-recipient';
137
- this.connection.transaction.rcpt_to = [ new Address.Address('<matt@example.com>') ];
138
- test.equal('matt@example.com', this.plugin.get_spamd_username(this.connection));
139
-
140
- test.done();
141
- },
142
- }
143
-
144
- exports.score_too_high = {
145
- setUp : _set_up,
146
- 'no threshhold is not too high' (test) {
147
- test.expect(1);
148
- test.ok(!this.plugin.score_too_high(this.connection, {score: 5}));
149
- test.done();
150
- },
151
- 'too high score is too high' (test) {
152
- test.expect(1);
153
- this.plugin.cfg.main.reject_threshold = 5;
154
- test.equal('spam score exceeded threshold', this.plugin.score_too_high(this.connection, {score: 6}));
155
- test.done();
156
- },
157
- 'ok score with relaying is ok' (test) {
158
- test.expect(1);
159
- this.connection.relaying = true;
160
- this.plugin.cfg.main.relay_reject_threshold = 7;
161
- test.equal('', this.plugin.score_too_high(this.connection, {score: 6}));
162
- test.done();
163
- },
164
- 'too high score with relaying is too high' (test) {
165
- test.expect(1);
166
- this.connection.relaying = true;
167
- this.plugin.cfg.main.relay_reject_threshold = 7;
168
- test.equal('spam score exceeded relay threshold', this.plugin.score_too_high(this.connection, {score: 8}));
169
- test.done();
170
- },
171
- }
@@ -1,138 +0,0 @@
1
- 'use strict';
2
-
3
- const fixtures = require('haraka-test-fixtures');
4
- const outbound = require('../../outbound');
5
- const TimerQueue = require('../../outbound/timer_queue');
6
-
7
- const Connection = fixtures.connection;
8
-
9
- function _set_up (done) {
10
- this.plugin = new fixtures.plugin('status');
11
- this.plugin.outbound = outbound;
12
-
13
- this.connection = Connection.createConnection();
14
- this.connection.remote.is_local = true;
15
- done();
16
- }
17
-
18
- exports.register = {
19
- setUp : _set_up,
20
- 'loads the status plugin' (test) {
21
- test.expect(1);
22
- test.equal('status', this.plugin.name);
23
- test.done();
24
- },
25
- }
26
-
27
- exports.access = {
28
- setUp : _set_up,
29
- 'remote' (test) {
30
-
31
- test.expect(1);
32
- function cb (code) {
33
- test.equal(DENY, code);
34
- test.done();
35
- }
36
-
37
- this.connection.remote.is_local = false;
38
-
39
- this.plugin.hook_unrecognized_command(cb, this.connection, ['STATUS', 'POOL LIST']);
40
- }
41
- }
42
-
43
- exports.pools = {
44
- setUp : _set_up,
45
- 'list_pools' (test) {
46
-
47
- test.expect(1);
48
- this.connection.respond = (code, message) => {
49
- const data = JSON.parse(message);
50
- test.equal('object', typeof data); // there should be one pools array for noncluster and more for cluster
51
- test.done();
52
- };
53
-
54
- this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'POOL LIST']);
55
- }
56
- }
57
-
58
- exports.queues = {
59
- setUp : _set_up,
60
- 'inspect_queue' (test) {
61
- // should list delivery_queue and temp_fail_queue per cluster children
62
- test.expect(2);
63
-
64
- outbound.temp_fail_queue = new TimerQueue(10);
65
- outbound.temp_fail_queue.add('file1', 100, () => {});
66
- outbound.temp_fail_queue.add('file2', 100, () => {});
67
-
68
- this.connection.respond = (code, message) => {
69
- const data = JSON.parse(message);
70
- test.equal(0, data.delivery_queue.length);
71
- test.equal(2, data.temp_fail_queue.length);
72
- test.done();
73
- };
74
- this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'QUEUE INSPECT']);
75
- },
76
- 'stat_queue' (test) {
77
- // should list files only
78
- test.expect(1);
79
-
80
- this.connection.respond = (code, message) => {
81
- const data = JSON.parse(message);
82
- test.ok(/^\d+\/\d+\/\d+$/.test(data));
83
- test.done();
84
- };
85
- this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'QUEUE STATS']);
86
- },
87
- 'list_queue' (test) {
88
- // should list files only
89
- test.expect(1);
90
-
91
- this.connection.respond = (code, message) => {
92
- const data = JSON.parse(message);
93
- test.equal(0, data.length);
94
- test.done();
95
- };
96
- this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'QUEUE LIST']);
97
- },
98
- 'discard_from_queue' (test) {
99
- const self = this;
100
-
101
- test.expect(1);
102
-
103
- outbound.temp_fail_queue = new TimerQueue(10);
104
- outbound.temp_fail_queue.add('file1', 10, () => {
105
- test.ok(false, 'This callback should not be called');
106
- test.done();
107
- });
108
- outbound.temp_fail_queue.add('file2', 2000, () => {});
109
-
110
- function res () {
111
- self.connection.respond = (code, message) => {
112
- const data = JSON.parse(message);
113
- test.equal(1, data.temp_fail_queue.length);
114
- test.done();
115
- };
116
- self.plugin.hook_unrecognized_command(() => {}, self.connection, ['STATUS', 'QUEUE INSPECT']);
117
- }
118
-
119
- this.plugin.hook_unrecognized_command(res, this.connection, ['STATUS', 'QUEUE DISCARD file1']);
120
- },
121
- 'push_email_at_queue' (test) {
122
- test.expect(1);
123
-
124
- const timeout = setTimeout(() => {
125
- test.ok(false, 'Timeout');
126
- test.done();
127
- }, 1000);
128
-
129
- outbound.temp_fail_queue.add('file', 1500, () => {
130
- clearTimeout(timeout);
131
-
132
- test.ok(true);
133
- test.done();
134
- });
135
-
136
- this.plugin.hook_unrecognized_command(() => {}, this.connection, ['STATUS', 'QUEUE PUSH file']);
137
- },
138
- }