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
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+ const assert = require('node:assert')
3
+ const dns = require('node:dns');
4
+
5
+ const fixtures = require('haraka-test-fixtures');
6
+ const Address = require('address-rfc2821').Address
7
+
8
+ const _set_up = (done) => {
9
+
10
+ this.plugin = new fixtures.plugin('mail_from.is_resolvable');
11
+ this.plugin.register();
12
+
13
+ this.connection = fixtures.connection.createConnection();
14
+ this.connection.init_transaction()
15
+
16
+ done();
17
+ }
18
+
19
+ describe('mail_from.is_resolvable', () => {
20
+ beforeEach(_set_up)
21
+
22
+ describe('hook_mail', () => {
23
+ it('any.com, no err code', (done) => {
24
+ const txn = this.connection.transaction;
25
+ this.plugin.hook_mail((code, msg) => {
26
+ // console.log()
27
+ assert.deepEqual(txn.results.get('mail_from.is_resolvable').pass, ['has_fwd_dns']);
28
+ done();
29
+ },
30
+ this.connection,
31
+ [new Address('<test@any.com>')]
32
+ )
33
+ })
34
+ })
35
+ })
@@ -0,0 +1,206 @@
1
+ 'use strict';
2
+ const assert = require('node:assert')
3
+ const path = require('node:path');
4
+
5
+ const { Address } = require('address-rfc2821');
6
+ const fixtures = require('haraka-test-fixtures');
7
+ const Notes = require('haraka-notes')
8
+
9
+ const OK = 906;
10
+
11
+ const _setup = (done) => {
12
+ this.plugin = new fixtures.plugin('queue/smtp_forward');
13
+
14
+ // switch config directory to 'test/config'
15
+ this.plugin.config = this.plugin.config.module_config(path.resolve('test'));
16
+
17
+ this.plugin.register();
18
+ this.hmail = { todo: { notes: new Notes() } };
19
+
20
+ this.connection = new fixtures.connection.createConnection();
21
+ this.connection.init_transaction();
22
+
23
+ done();
24
+ }
25
+
26
+ describe('smtp_forward', () => {
27
+ describe('tls config', () => {
28
+ it('TLS enabled but no outbound config in tls.ini', () => {
29
+ const plugin = new fixtures.plugin('queue/smtp_forward');
30
+ plugin.register();
31
+
32
+ assert.equal(plugin.tls_options, undefined);
33
+ assert.equal(plugin.register_hook.called, true);
34
+ })
35
+ })
36
+
37
+ describe('register', () => {
38
+ beforeEach(_setup)
39
+
40
+ it('register', () => {
41
+ this.plugin.register();
42
+ assert.ok(this.plugin.cfg.main);
43
+ })
44
+ })
45
+
46
+ describe('get_config', () => {
47
+ beforeEach(_setup)
48
+
49
+ it('no recipient', () => {
50
+ const cfg = this.plugin.get_config(this.connection);
51
+ assert.equal(cfg.host, 'localhost');
52
+ assert.equal(cfg.enable_tls, true);
53
+ assert.equal(cfg.one_message_per_rcpt, true);
54
+ })
55
+
56
+ it('null recipient', () => {
57
+ this.connection.transaction.rcpt_to.push(new Address('<>'));
58
+ const cfg = this.plugin.get_config(this.connection);
59
+ assert.equal(cfg.host, 'localhost');
60
+ assert.equal(cfg.enable_tls, true);
61
+ assert.equal(cfg.one_message_per_rcpt, true);
62
+ })
63
+
64
+ it('valid recipient', () => {
65
+ this.connection.transaction.rcpt_to.push(
66
+ new Address('<matt@example.com>')
67
+ );
68
+ const cfg = this.plugin.get_config(this.connection);
69
+ assert.equal(cfg.enable_tls, true);
70
+ assert.equal(cfg.one_message_per_rcpt, true);
71
+ assert.equal(cfg.host, 'localhost');
72
+ })
73
+
74
+ it('valid recipient with route', () => {
75
+ this.connection.transaction.rcpt_to.push(
76
+ new Address('<matt@test.com>')
77
+ );
78
+ assert.deepEqual(this.plugin.get_config(this.connection), {
79
+ host: '1.2.3.4',
80
+ enable_tls: true,
81
+ auth_user: 'postmaster@test.com',
82
+ auth_pass: 'superDuperSecret',
83
+ });
84
+ })
85
+
86
+ it('valid recipient with route & diff config', () => {
87
+ this.connection.transaction.rcpt_to.push(
88
+ new Address('<matt@test1.com>')
89
+ );
90
+ const cfg = this.plugin.get_config(this.connection);
91
+ assert.deepEqual(cfg, {
92
+ host: '1.2.3.4',
93
+ enable_tls: false
94
+ });
95
+ })
96
+
97
+ it('valid 2 recipients with same route', () => {
98
+ this.connection.transaction.rcpt_to.push(
99
+ new Address('<matt@test.com>'),
100
+ new Address('<matt@test.com>')
101
+ );
102
+ const cfg = this.plugin.get_config(this.connection);
103
+ assert.deepEqual(cfg.host, '1.2.3.4' );
104
+ })
105
+
106
+ it('null sender', () => {
107
+ this.plugin.cfg.main.domain_selector = 'mail_from';
108
+ this.connection.transaction.mail_from = new Address('<>');
109
+ const cfg = this.plugin.get_config(this.connection);
110
+ assert.equal(cfg.host, 'localhost');
111
+ assert.equal(cfg.enable_tls, true);
112
+ assert.equal(cfg.one_message_per_rcpt, true);
113
+ })
114
+
115
+ it('return mail_from domain configuration', () => {
116
+ this.connection.transaction.mail_from = new Address('<matt@test2.com>');
117
+ this.plugin.cfg.main.domain_selector = 'mail_from';
118
+ const cfg = this.plugin.get_config(this.connection);
119
+ assert.deepEqual(cfg.host, '2.3.4.5');
120
+ delete this.plugin.cfg.main.domain_selector; // clear this for future tests
121
+ })
122
+ })
123
+
124
+ describe('get_mx', () => {
125
+ beforeEach(_setup)
126
+
127
+ it('returns no outbound route for undefined domains', (done) => {
128
+ this.plugin.get_mx((code, mx) => {
129
+ assert.equal(code, undefined);
130
+ assert.deepEqual(mx, undefined);
131
+ done();
132
+ }, this.hmail, 'undefined.com');
133
+ })
134
+
135
+ it('returns no outbound route when queue.wants !== smtp_forward', (done) => {
136
+ this.hmail.todo.notes.set('queue.wants', 'outbound')
137
+ this.hmail.todo.notes.set('queue.next_hop', 'smtp://5.4.3.2:26')
138
+ this.plugin.get_mx((code, mx) => {
139
+ assert.equal(code, undefined);
140
+ assert.deepEqual(mx, undefined);
141
+ done();
142
+ }, this.hmail, 'undefined.com');
143
+ })
144
+
145
+ it('returns an outbound route for defined domains', (done) => {
146
+ this.plugin.get_mx((code, mx) => {
147
+ assert.equal(code, OK);
148
+ assert.deepEqual(mx, {
149
+ priority: 0, exchange: '1.2.3.4', port: 2555,
150
+ auth_user: 'postmaster@test.com',
151
+ auth_pass: 'superDuperSecret'
152
+ });
153
+ done();
154
+ }, this.hmail, 'test.com');
155
+ })
156
+
157
+ it('is enabled when queue.wants is set', (done) => {
158
+ this.hmail.todo.notes.set('queue.wants', 'smtp_forward')
159
+ this.hmail.todo.notes.set('queue.next_hop', 'smtp://4.3.2.1:465')
160
+ this.plugin.get_mx((code, mx) => {
161
+ assert.equal(code, OK);
162
+ assert.deepEqual(mx, { priority: 0, port: 465, exchange: '4.3.2.1' });
163
+ done();
164
+ }, this.hmail, 'undefined.com');
165
+ })
166
+
167
+ it('sets using_lmtp when next_hop URL is lmtp', (done) => {
168
+ this.hmail.todo.notes.set('queue.wants', 'smtp_forward')
169
+ this.hmail.todo.notes.set('queue.next_hop', 'lmtp://4.3.2.1')
170
+ this.plugin.get_mx((code, mx) => {
171
+ assert.equal(code, OK);
172
+ assert.deepEqual(mx, { priority: 0, port: 24, using_lmtp: true, exchange: '4.3.2.1' });
173
+ done();
174
+ }, this.hmail, 'undefined.com');
175
+ })
176
+ })
177
+
178
+ describe('is_outbound_enabled', () => {
179
+ beforeEach(_setup)
180
+
181
+ it('enable_outbound is false by default', () => {
182
+ assert.equal(this.plugin.is_outbound_enabled(this.plugin.cfg), false);
183
+ })
184
+
185
+ it('per-domain enable_outbound is false by default', () => {
186
+ this.connection.transaction.rcpt_to = [ new Address('<postmaster@test.com>') ];
187
+ const cfg = this.plugin.get_config(this.connection);
188
+ assert.equal(this.plugin.is_outbound_enabled(cfg), false);
189
+ })
190
+
191
+ it('per-domain enable_outbound can be set to true', () => {
192
+ this.plugin.cfg['test.com'].enable_outbound = true;
193
+ this.connection.transaction.rcpt_to = [ new Address('<postmaster@test.com>') ];
194
+ const cfg = this.plugin.get_config(this.connection);
195
+ assert.equal(this.plugin.is_outbound_enabled(cfg), true);
196
+ })
197
+
198
+ it('per-domain enable_outbound is false even if top level is false', () => {
199
+ this.plugin.cfg.main.enable_outbound = false; // this will be ignored
200
+ this.plugin.cfg['test.com'].enable_outbound = false;
201
+ this.connection.transaction.rcpt_to = [ new Address('<postmaster@test.com>') ];
202
+ const cfg = this.plugin.get_config(this.connection);
203
+ assert.equal(this.plugin.is_outbound_enabled(cfg), false);
204
+ })
205
+ })
206
+ })
@@ -0,0 +1,122 @@
1
+ 'use strict';
2
+ const assert = require('node:assert')
3
+
4
+ const { Address } = require('address-rfc2821');
5
+ const fixtures = require('haraka-test-fixtures');
6
+
7
+ const _set_up = (done) => {
8
+
9
+ this.plugin = new fixtures.plugin('rcpt_to.host_list_base');
10
+ this.plugin.cfg = {};
11
+ this.plugin.host_list = {};
12
+
13
+ this.connection = fixtures.connection.createConnection();
14
+ this.connection.init_transaction()
15
+
16
+ done();
17
+ }
18
+
19
+ describe('rcpt_to.host_list_base', () => {
20
+
21
+ describe('in_host_list', () => {
22
+ beforeEach(_set_up)
23
+
24
+ it('miss', () => {
25
+ assert.equal(false, this.plugin.in_host_list('test.com'));
26
+ })
27
+
28
+ it('hit', () => {
29
+ this.plugin.host_list['test.com'] = true;
30
+ assert.equal(true, this.plugin.in_host_list('test.com'));
31
+ })
32
+ })
33
+
34
+ describe('in_host_regex', () => {
35
+ beforeEach(_set_up)
36
+
37
+ it('undef', () => {
38
+ const r = this.plugin.in_host_regex('test.com');
39
+ assert.equal(false, r);
40
+ })
41
+
42
+ it('miss', () => {
43
+ this.plugin.host_list_regex=['miss.com'];
44
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
45
+ const r = this.plugin.in_host_regex('test.com');
46
+ assert.equal(false, r);
47
+ })
48
+
49
+ it('exact hit', () => {
50
+ this.plugin.host_list_regex=['test.com'];
51
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
52
+ const r = this.plugin.in_host_regex('test.com');
53
+ assert.equal(true, r);
54
+ })
55
+
56
+ it('re hit', () => {
57
+ this.plugin.host_list_regex=['.*est.com'];
58
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
59
+ const r = this.plugin.in_host_regex('test.com');
60
+ assert.equal(true, r);
61
+ })
62
+ })
63
+
64
+ describe('hook_mail', () => {
65
+ beforeEach(_set_up)
66
+
67
+ it('null sender', (done) => {
68
+ this.connection.relaying=true;
69
+ this.plugin.hook_mail((rc, msg) => {
70
+ assert.equal(undefined, rc);
71
+ assert.equal(undefined, msg);
72
+ done();
73
+ }, this.connection, [new Address('<>')]);
74
+ })
75
+
76
+ it('miss', (done) => {
77
+ this.plugin.host_list = { 'miss.com': true };
78
+ this.plugin.hook_mail((rc, msg) => {
79
+ assert.equal(undefined, rc);
80
+ assert.equal(undefined, msg);
81
+ const res = this.connection.transaction.results.get('rcpt_to.host_list_base');
82
+ assert.notEqual(-1, res.msg.indexOf('mail_from!local'));
83
+ done();
84
+ }, this.connection, [new Address('<user@example.com>')]);
85
+ })
86
+
87
+ it('hit', (done) => {
88
+ this.plugin.host_list = { 'example.com': true };
89
+ this.plugin.hook_mail((rc, msg) => {
90
+ assert.equal(undefined, rc);
91
+ assert.equal(undefined, msg);
92
+ const res = this.connection.transaction.results.get('rcpt_to.host_list_base');
93
+ assert.notEqual(-1, res.pass.indexOf('mail_from'));
94
+ done();
95
+ }, this.connection, [new Address('<user@example.com>')]);
96
+ })
97
+
98
+ it('hit, regex, exact', (done) => {
99
+ this.plugin.host_list_regex = ['example.com'];
100
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
101
+ this.plugin.hook_mail((rc, msg) => {
102
+ assert.equal(undefined, rc);
103
+ assert.equal(undefined, msg);
104
+ const res = this.connection.transaction.results.get('rcpt_to.host_list_base');
105
+ assert.notEqual(-1, res.pass.indexOf('mail_from'));
106
+ done();
107
+ }, this.connection, [new Address('<user@example.com>')]);
108
+ })
109
+
110
+ it('hit, regex, pattern', (done) => {
111
+ this.plugin.host_list_regex = ['.*mple.com'];
112
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
113
+ this.plugin.hook_mail((rc, msg) => {
114
+ assert.equal(undefined, rc);
115
+ assert.equal(undefined, msg);
116
+ const res = this.connection.transaction.results.get('rcpt_to.host_list_base');
117
+ assert.notEqual(-1, res.pass.indexOf('mail_from'));
118
+ done();
119
+ }, this.connection, [new Address('<user@example.com>')]);
120
+ })
121
+ })
122
+ })
@@ -0,0 +1,193 @@
1
+ 'use strict';
2
+ const assert = require('node:assert')
3
+
4
+ const { Address } = require('address-rfc2821');
5
+ const fixtures = require('haraka-test-fixtures');
6
+
7
+ const _set_up = (done) => {
8
+
9
+ this.plugin = new fixtures.plugin('rcpt_to.in_host_list');
10
+ this.plugin.inherits('rcpt_to.host_list_base');
11
+ this.plugin.cfg = {};
12
+ this.plugin.host_list = {};
13
+
14
+ this.connection = fixtures.connection.createConnection();
15
+ this.connection.transaction = {
16
+ results: new fixtures.results(this.connection),
17
+ notes: {},
18
+ };
19
+
20
+ done();
21
+ }
22
+
23
+ describe('in_host_list', () => {
24
+ beforeEach(_set_up)
25
+
26
+ it('miss', () => {
27
+ assert.equal(this.plugin.in_host_list('test.com'), false);
28
+ })
29
+
30
+ it('hit', () => {
31
+ this.plugin.host_list['test.com'] = true;
32
+ assert.equal(this.plugin.in_host_list('test.com'), true);
33
+ })
34
+
35
+ describe('in_host_regex', () => {
36
+ beforeEach(_set_up)
37
+
38
+ it('undef', () => {
39
+ assert.equal(this.plugin.in_host_regex('test.com'), false);
40
+ })
41
+
42
+ it('miss', () => {
43
+ this.plugin.host_list_regex=['miss.com'];
44
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
45
+ assert.equal(this.plugin.in_host_regex('test.com'), false);
46
+ })
47
+
48
+ it('exact hit', () => {
49
+ this.plugin.host_list_regex=['test.com'];
50
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
51
+ assert.equal(this.plugin.in_host_regex('test.com'), true);
52
+ })
53
+
54
+ it('re hit', () => {
55
+ this.plugin.host_list_regex=['.*est.com'];
56
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
57
+ assert.equal(this.plugin.in_host_regex('test.com'), true);
58
+ })
59
+ })
60
+
61
+ describe('hook_mail', () => {
62
+ beforeEach(_set_up)
63
+
64
+ it('null sender', (done) => {
65
+ this.connection.relaying=true;
66
+ this.plugin.hook_mail((rc, msg) => {
67
+ assert.equal(undefined, rc);
68
+ assert.equal(undefined, msg);
69
+ done();
70
+ }, this.connection, [new Address('<>')]);
71
+ })
72
+
73
+ it('miss', (done) => {
74
+ this.plugin.host_list = { 'miss.com': true };
75
+ this.plugin.hook_mail((rc, msg) => {
76
+ assert.equal(undefined, rc);
77
+ assert.equal(undefined, msg);
78
+ const res = this.connection.transaction.results.get('rcpt_to.in_host_list');
79
+ assert.notEqual(-1, res.msg.indexOf('mail_from!local'));
80
+ done();
81
+ }, this.connection, [new Address('<user@example.com>')]);
82
+ })
83
+
84
+ it('hit', (done) => {
85
+ this.plugin.host_list = { 'example.com': true };
86
+ this.plugin.hook_mail((rc, msg) => {
87
+ assert.equal(undefined, rc);
88
+ assert.equal(undefined, msg);
89
+ const res = this.connection.transaction.results.get('rcpt_to.in_host_list');
90
+ assert.notEqual(-1, res.pass.indexOf('mail_from'));
91
+ done();
92
+ }, this.connection, [new Address('<user@example.com>')]);
93
+ })
94
+
95
+ it('hit, regex, exact', (done) => {
96
+ this.plugin.host_list_regex = ['example.com'];
97
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
98
+ this.plugin.hook_mail((rc, msg) => {
99
+ assert.equal(undefined, rc);
100
+ assert.equal(undefined, msg);
101
+ const res = this.connection.transaction.results.get('rcpt_to.in_host_list');
102
+ assert.notEqual(-1, res.pass.indexOf('mail_from'));
103
+ done();
104
+ }, this.connection, [new Address('<user@example.com>')]);
105
+ })
106
+
107
+ it('hit, regex, pattern', (done) => {
108
+ this.plugin.host_list_regex = ['.*mple.com'];
109
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
110
+ this.plugin.hook_mail((rc, msg) => {
111
+ assert.equal(undefined, rc);
112
+ assert.equal(undefined, msg);
113
+ const res = this.connection.transaction.results.get('rcpt_to.in_host_list');
114
+ // console.log(res);
115
+ assert.notEqual(-1, res.pass.indexOf('mail_from'));
116
+ done();
117
+ }, this.connection, [new Address('<user@example.com>')]);
118
+ })
119
+ })
120
+
121
+ describe('hook_rcpt', () => {
122
+ beforeEach(_set_up)
123
+
124
+ it('missing txn', (done) => {
125
+ // sometimes txn goes away, make sure it's handled
126
+ delete this.connection.transaction;
127
+ this.plugin.hook_rcpt((rc, msg) => {
128
+ assert.equal(undefined, rc);
129
+ assert.equal(undefined, msg);
130
+ }, this.connection, [new Address('test@test.com')]);
131
+ assert.ok(true);
132
+ done();
133
+ })
134
+
135
+ it('hit list', (done) => {
136
+ this.plugin.host_list = { 'test.com': true };
137
+ this.plugin.hook_rcpt((rc, msg) => {
138
+ assert.equal(OK, rc);
139
+ assert.equal(undefined, msg);
140
+ done();
141
+ }, this.connection, [new Address('test@test.com')]);
142
+ })
143
+
144
+ it('miss list', (done) => {
145
+ this.plugin.host_list = { 'miss.com': true };
146
+ this.plugin.hook_rcpt((rc, msg) => {
147
+ assert.equal(undefined, rc);
148
+ assert.equal(undefined, msg);
149
+ done();
150
+ }, this.connection, [new Address('test@test.com')]);
151
+ })
152
+
153
+ it('hit regex, exact', (done) => {
154
+ this.plugin.host_list_regex=['test.com'];
155
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
156
+ this.plugin.hook_rcpt((rc, msg) => {
157
+ assert.equal(OK, rc);
158
+ assert.equal(undefined, msg);
159
+ done();
160
+ }, this.connection, [new Address('test@test.com')]);
161
+ })
162
+
163
+ it('hit regex, pattern', (done) => {
164
+ this.plugin.host_list_regex=['.est.com'];
165
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
166
+ this.plugin.hook_rcpt((rc, msg) => {
167
+ assert.equal(OK, rc);
168
+ assert.equal(undefined, msg);
169
+ done();
170
+ }, this.connection, [new Address('test@test.com')]);
171
+ })
172
+
173
+ it('miss regex, pattern', (done) => {
174
+ this.plugin.host_list_regex=['a.est.com'];
175
+ this.plugin.hl_re = new RegExp (`^(?:${this.plugin.host_list_regex.join('|')})$`, 'i');
176
+ this.plugin.hook_rcpt((rc, msg) => {
177
+ assert.equal(undefined, rc);
178
+ assert.equal(undefined, msg);
179
+ done();
180
+ }, this.connection, [new Address('test@test.com')]);
181
+ })
182
+
183
+ it('rcpt miss, relaying to local sender', (done) => {
184
+ this.connection.relaying=true;
185
+ this.connection.transaction.notes = { local_sender: true };
186
+ this.plugin.hook_rcpt((rc, msg) => {
187
+ assert.equal(OK, rc);
188
+ assert.equal(undefined, msg);
189
+ done();
190
+ }, this.connection, [new Address('test@test.com')]);
191
+ })
192
+ })
193
+ })