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,59 +0,0 @@
1
- 'use strict';
2
-
3
- const fixtures = require('haraka-test-fixtures');
4
-
5
- function _set_up (callback) {
6
-
7
- this.plugin = new fixtures.plugin('relay_all');
8
- this.connection = fixtures.connection.createConnection();
9
- this.params = ['foo@bar.com'];
10
-
11
- this.plugin.register();
12
-
13
- callback();
14
- }
15
-
16
- exports.relay_all = {
17
- setUp : _set_up,
18
- 'should have register function' (test) {
19
- test.expect(2);
20
- test.isNotNull(this.plugin);
21
- test.isFunction(this.plugin.register);
22
- test.done();
23
- },
24
- 'register function should call register_hook()' (test) {
25
- test.expect(1);
26
- test.ok(this.plugin.register_hook.called);
27
- test.done();
28
- },
29
- 'register_hook() should register for propper hook' (test) {
30
- test.expect(1);
31
- test.equals(this.plugin.register_hook.args[0], 'rcpt');
32
- test.done();
33
- },
34
- 'register_hook() should register available function' (test) {
35
- test.expect(3);
36
- test.equals(this.plugin.register_hook.args[1], 'confirm_all');
37
- test.isNotNull(this.plugin.confirm_all);
38
- test.isFunction(this.plugin.confirm_all);
39
- test.done();
40
- },
41
- 'confirm_all hook always returns OK' (test) {
42
- function next (action) {
43
- test.expect(1);
44
- test.equals(action, OK);
45
- test.done();
46
- }
47
-
48
- this.plugin.confirm_all(next, this.connection, this.params);
49
- },
50
- 'confirm_all hook always sets connection.relaying to 1' (test) {
51
- const next = function (action) {
52
- test.expect(1);
53
- test.equals(this.connection.relaying, 1);
54
- test.done();
55
- }.bind(this);
56
-
57
- this.plugin.confirm_all(next, this.connection, this.params);
58
- }
59
- }
@@ -1,315 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
-
6
- const Address = require('address-rfc2821');
7
- const fixtures = require('haraka-test-fixtures');
8
- const utils = require('haraka-utils');
9
-
10
- const Connection = fixtures.connection;
11
-
12
- function _set_up (done) {
13
-
14
- this.plugin = new fixtures.plugin('dkim_sign');
15
- this.plugin.config.root_path = path.resolve(__dirname, '../config');
16
- this.plugin.cfg = { main: { } };
17
-
18
- this.connection = Connection.createConnection();
19
- this.connection.init_transaction();
20
- this.connection.transaction.mail_from = {};
21
-
22
- done();
23
- }
24
-
25
- exports.register = {
26
- setUp : _set_up,
27
- 'registers plugin' (test) {
28
- test.expect(2);
29
- test.deepEqual(this.plugin.cfg, { main: {} });
30
- this.plugin.register();
31
- test.deepEqual(this.plugin.cfg,
32
- { main:
33
- { disabled: false,
34
- selector: 'mail',
35
- domain: 'example.com',
36
- headers_to_sign: 'From, Sender, Reply-To, Subject, Date, Message-ID, To, Cc, MIME-Version'
37
- },
38
- headers_to_sign: [ 'from','sender','reply-to','subject','date','message-id','to','cc','mime-version' ]
39
- }
40
- );
41
- test.done();
42
- },
43
- }
44
-
45
- exports.load_dkim_sign_ini = {
46
- setUp : _set_up,
47
- 'loads dkim_sign.ini' (test) {
48
- test.expect(2);
49
- test.deepEqual(this.plugin.cfg, { main: {} });
50
- this.plugin.load_dkim_sign_ini();
51
- test.deepEqual(this.plugin.cfg,
52
- { main:
53
- { disabled: false,
54
- selector: 'mail',
55
- domain: 'example.com',
56
- headers_to_sign: 'From, Sender, Reply-To, Subject, Date, Message-ID, To, Cc, MIME-Version'
57
- },
58
- headers_to_sign: [ 'from','sender','reply-to','subject','date','message-id','to','cc','mime-version' ]
59
- }
60
- );
61
- test.done();
62
- },
63
- }
64
-
65
- exports.get_sender_domain = {
66
- setUp : _set_up,
67
- 'no transaction' (test) {
68
- test.expect(1);
69
- delete this.connection.transaction;
70
- test.equal(
71
- this.plugin.get_sender_domain(this.connection),
72
- undefined
73
- );
74
- test.done();
75
- },
76
- 'no headers' (test) {
77
- test.expect(1);
78
- test.equal(
79
- this.plugin.get_sender_domain(this.connection),
80
- undefined
81
- );
82
- test.done();
83
- },
84
- 'no from header' (test) {
85
- test.expect(1);
86
- this.connection.transaction.header.add('Date', utils.date_to_str(new Date()));
87
- test.equal(
88
- this.plugin.get_sender_domain(this.connection),
89
- undefined
90
- );
91
- test.done();
92
- },
93
- 'no from header, env MAIL FROM' (test) {
94
- test.expect(1);
95
- this.connection.transaction.mail_from = new Address.Address('<test@example.com>');
96
- const r = this.plugin.get_sender_domain(this.connection);
97
- test.equal('example.com', r);
98
- test.done();
99
- },
100
- 'env MAIL FROM, case insensitive' (test) {
101
- test.expect(1);
102
- this.connection.transaction.mail_from = new Address.Address('<test@Example.cOm>');
103
- const r = this.plugin.get_sender_domain(this.connection);
104
- test.equal('example.com', r);
105
- test.done();
106
- },
107
- 'From header not a fqdn' (test) {
108
- test.expect(1);
109
- this.connection.transaction.header.add('From', 'root (Cron Daemon)');
110
- const r = this.plugin.get_sender_domain(this.connection);
111
- this.plugin.get_key_dir(this.connection, { domain: r }, (err, dir) => {
112
- test.equal(dir, undefined);
113
- test.done();
114
- });
115
- },
116
- 'from header, simple' (test) {
117
- test.expect(1);
118
- this.connection.transaction.header.add('From', 'John Doe <jdoe@example.com>');
119
- const r = this.plugin.get_sender_domain(this.connection);
120
- test.equal('example.com', r);
121
- test.done();
122
- },
123
- 'from header, case insensitive' (test) {
124
- test.expect(1);
125
- this.connection.transaction.header.add('From', 'John Doe <jdoe@Example.Com>');
126
- const r = this.plugin.get_sender_domain(this.connection);
127
- test.equal('example.com', r);
128
- test.done();
129
- },
130
- 'from header, less simple' (test) {
131
- test.expect(1);
132
- this.connection.transaction.header.add('From', '"Joe Q. Public" <john.q.public@example.com>');
133
- const r = this.plugin.get_sender_domain(this.connection);
134
- test.equal('example.com', r);
135
- test.done();
136
- },
137
- 'from header, RFC 5322 odd' (test) {
138
- test.expect(1);
139
- this.connection.transaction.header.add('From', 'Pete(A nice \\) chap) <pete(his account)@silly.test(his host)>');
140
- const r = this.plugin.get_sender_domain(this.connection);
141
- test.equal('silly.test', r);
142
- test.done();
143
- },
144
- 'from header group' (test) {
145
- test.expect(1);
146
- this.connection.transaction.header.add('From', 'ben@example.com,carol@example.com');
147
- this.connection.transaction.header.add('Sender', 'dave@example.net');
148
- const r = this.plugin.get_sender_domain(this.connection);
149
- test.equal('example.net', r);
150
- test.done();
151
- },
152
- 'from header group, RFC 6854' (test) {
153
- test.expect(1);
154
- // TODO: this test passes, but the parsing isn't correct. The From
155
- // addr parser doesn't support the RFC 6854 Group Syntax
156
- this.connection.transaction.header.add('From', 'Managing Partners:ben@example.com,carol@example.com;');
157
- this.connection.transaction.header.add('Sender', 'dave@example.net');
158
- const r = this.plugin.get_sender_domain(this.connection);
159
- test.equal('example.net', r);
160
- test.done();
161
- },
162
- }
163
-
164
- exports.get_key_dir = {
165
- setUp (done) {
166
- this.plugin = new fixtures.plugin('dkim_sign');
167
- this.plugin.cfg = { main: { } };
168
-
169
- this.connection = Connection.createConnection();
170
- this.connection.init_transaction();
171
-
172
- fs.mkdir(path.resolve('tests','config','dkim'), err => {
173
- // if (err) console.error(err);
174
- fs.mkdir(path.resolve('tests','config','dkim','example.com'), err2 => {
175
- // if (err2) console.error(err2);
176
- done();
177
- });
178
- });
179
- },
180
- 'no transaction' (test) {
181
- test.expect(2);
182
- this.plugin.get_key_dir(this.connection, '', (err, dir) => {
183
- test.ifError(err);
184
- test.equal(dir, undefined);
185
- test.done();
186
- });
187
- },
188
- 'no key dir' (test) {
189
- test.expect(1);
190
- this.connection.transaction.mail_from = new Address.Address('<matt@non-exist.com>');
191
- this.plugin.get_key_dir(this.connection, 'non-exist.com', (err, dir) => {
192
- test.equal(dir, undefined);
193
- test.done();
194
- });
195
- },
196
- 'test example.com key dir' (test) {
197
- test.expect(1);
198
- process.env.HARAKA = path.resolve('tests');
199
- this.connection.transaction.mail_from = new Address.Address('<matt@example.com>');
200
- this.plugin.get_key_dir(this.connection, { domain: 'example.com' }, (err, dir) => {
201
- // console.log(arguments);
202
- const expected = path.resolve('tests','config','dkim','example.com');
203
- test.equal(dir, expected);
204
- test.done();
205
- });
206
- },
207
- }
208
-
209
- exports.get_headers_to_sign = {
210
- setUp : _set_up,
211
- 'none configured, includes from' (test) {
212
- test.expect(1);
213
- test.deepEqual(
214
- this.plugin.get_headers_to_sign(this.plugin.cfg),
215
- ['from']
216
- );
217
- test.done();
218
- },
219
- 'from, subject' (test) {
220
- test.expect(1);
221
- this.plugin.cfg.main.headers_to_sign='from,subject';
222
- test.deepEqual(
223
- this.plugin.get_headers_to_sign(this.plugin.cfg),
224
- ['from','subject']
225
- );
226
- test.done();
227
- },
228
- 'subject configured, subject and from returned' (test) {
229
- test.expect(1);
230
- this.plugin.cfg.main.headers_to_sign='subject';
231
- test.deepEqual(
232
- this.plugin.get_headers_to_sign(this.plugin.cfg),
233
- ['subject', 'from']
234
- );
235
- test.done();
236
- },
237
- }
238
-
239
- const insecure_512b_test_key = '-----BEGIN RSA PRIVATE KEY-----\nMIGqAgEAAiEAsw3E27MbZuxmWpYfjNX5XzKTMxIv8bIAU/MpjiJE5rkCAwEAAQIg\nIVsyTj96nlzx4HRRIlqGXw7wx3C+vGhoM/Ql/eFXRVECEQDbUYF19fyzPDKAqb7p\nEu5tAhEA0QBD5Ns4QgpC8m1Qob05/QIQf1jWWU5aSyC7GmZ2ChQKCQIQIACNZNaY\nZ6xQkfRhG1LxNQIRAIyKwDCULf7Jl5ygc1MIIdk=\n-----END RSA PRIVATE KEY-----';
240
-
241
- exports.get_sign_properties = {
242
- setUp (done) {
243
- this.plugin = new fixtures.plugin('dkim_sign');
244
- this.plugin.cfg = { main: { } };
245
-
246
- this.connection = Connection.createConnection();
247
- this.connection.init_transaction();
248
- this.connection.transaction.mail_from = {};
249
-
250
- this.plugin.config.root_path = path.resolve(__dirname, '../config');
251
- this.plugin.load_dkim_sign_ini();
252
- this.plugin.load_dkim_default_key();
253
-
254
- done();
255
- },
256
- 'example.com from ENV mail from' (test) {
257
- test.expect(1);
258
- this.connection.transaction.mail_from = new Address.Address('<test@example.com>');
259
- this.plugin.get_sign_properties(this.connection, (err, props) => {
260
- if (err) console.error(err);
261
- test.deepEqual(props, {
262
- domain: 'example.com',
263
- selector: 'aug2019',
264
- private_key: insecure_512b_test_key,
265
- });
266
- test.done();
267
- })
268
- },
269
- 'no domain discovered returns default' (test) {
270
- test.expect(1);
271
- this.plugin.get_sign_properties(this.connection, (err, props) => {
272
- if (err) console.error(err);
273
- test.deepEqual(props, {
274
- domain: this.plugin.cfg.main.domain,
275
- selector: this.plugin.cfg.main.selector,
276
- private_key: this.plugin.private_key,
277
- });
278
- test.done();
279
- })
280
- },
281
- }
282
-
283
- exports.has_key_data = {
284
- setUp (done) {
285
- this.plugin = new fixtures.plugin('dkim_sign');
286
- this.plugin.cfg = { main: { } };
287
-
288
- this.connection = Connection.createConnection();
289
- done()
290
- },
291
- 'no data' (test) {
292
- test.expect(1);
293
- test.equal(this.plugin.has_key_data(this.connection, {}), false);
294
- test.done();
295
- },
296
- 'fully populated' (test) {
297
- test.expect(1);
298
- test.equal(this.plugin.has_key_data(this.connection, {
299
- selector: 'foo',
300
- domain: 'bar',
301
- private_key: 'anything',
302
- }), true);
303
- test.done();
304
- },
305
- }
306
-
307
- exports.load_key = {
308
- setUp : _set_up,
309
- 'example.com test key' (test) {
310
- test.expect(1);
311
- const testKey = path.resolve('tests','config','dkim','example.com','private');
312
- test.equal(this.plugin.load_key(testKey), insecure_512b_test_key);
313
- test.done();
314
- },
315
- }
@@ -1,108 +0,0 @@
1
- 'use strict';
2
-
3
- const fixtures = require('haraka-test-fixtures');
4
- const message = require('haraka-email-message')
5
-
6
- const { DKIMSignStream } = require('../../plugins/dkim_sign');
7
-
8
- const privateKey = `-----BEGIN RSA PRIVATE KEY-----
9
- MIICXwIBAAKBgQDwIRP/UC3SBsEmGqZ9ZJW3/DkMoGeLnQg1fWn7/zYtIxN2SnFC
10
- jxOCKG9v3b4jYfcTNh5ijSsq631uBItLa7od+v/RtdC2UzJ1lWT947qR+Rcac2gb
11
- to/NMqJ0fzfVjH4OuKhitdY9tf6mcwGjaNBcWToIMmPSPDdQPNUYckcQ2QIDAQAB
12
- AoGBALmn+XwWk7akvkUlqb+dOxyLB9i5VBVfje89Teolwc9YJT36BGN/l4e0l6QX
13
- /1//6DWUTB3KI6wFcm7TWJcxbS0tcKZX7FsJvUz1SbQnkS54DJck1EZO/BLa5ckJ
14
- gAYIaqlA9C0ZwM6i58lLlPadX/rtHb7pWzeNcZHjKrjM461ZAkEA+itss2nRlmyO
15
- n1/5yDyCluST4dQfO8kAB3toSEVc7DeFeDhnC1mZdjASZNvdHS4gbLIA1hUGEF9m
16
- 3hKsGUMMPwJBAPW5v/U+AWTADFCS22t72NUurgzeAbzb1HWMqO4y4+9Hpjk5wvL/
17
- eVYizyuce3/fGke7aRYw/ADKygMJdW8H/OcCQQDz5OQb4j2QDpPZc0Nc4QlbvMsj
18
- 7p7otWRO5xRa6SzXqqV3+F0VpqvDmshEBkoCydaYwc2o6WQ5EBmExeV8124XAkEA
19
- qZzGsIxVP+sEVRWZmW6KNFSdVUpk3qzK0Tz/WjQMe5z0UunY9Ax9/4PVhp/j61bf
20
- eAYXunajbBSOLlx4D+TunwJBANkPI5S9iylsbLs6NkaMHV6k5ioHBBmgCak95JGX
21
- GMot/L2x0IYyMLAz6oLWh2hm7zwtb0CgOrPo1ke44hFYnfc=
22
- -----END RSA PRIVATE KEY-----`;
23
-
24
- /*
25
- Body hash can be checked by:
26
-
27
- $ echo -e -n 'Hello world!\r\n'| openssl dgst -binary -sha256 | openssl base64
28
- z6TUz85EdYrACGMHYgZhJGvVy5oQI0dooVMKa2ZT7c4=
29
- $ echo -e -n '\r\n' | openssl dgst -binary -sha256 | openssl base64
30
- frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=
31
- */
32
-
33
- function getValueFromDKIM (dkim_header, key) {
34
- const kv = dkim_header.split(';');
35
- for (let i = 0, len = kv.length; i < len; i++) {
36
- const arr = kv[i].match(/^\s*([^=]+)=(.*)$/);
37
- if (arr[1] === key) {
38
- return arr[2];
39
- }
40
- }
41
- throw `Key ${key} not found at ${dkim_header}`;
42
- }
43
-
44
- const props = { selector: 'selector', domain: 'haraka.top', private_key: privateKey };
45
-
46
- exports.sign = {
47
- setUp (done) {
48
- this.plugin = new fixtures.plugin('dkim_sign');
49
- this.plugin.load_dkim_sign_ini();
50
- props.headers = this.plugin.cfg.headers_to_sign;
51
- done()
52
- },
53
- 'body hash simple' (test) {
54
- // took from RFC
55
- test.expect(1);
56
- const email = 'Ignored: header\r\n\r\nHi.\r\n\r\nWe lost the game. Are you hungry yet?\r\n\r\nJoe.\r\n';
57
-
58
- const header = new message.Header();
59
- header.parse(['Ignored: header']);
60
- const signer = new DKIMSignStream(props, header, (n, dkim) => {
61
- test.equal(getValueFromDKIM(dkim, 'bh'), '2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=');
62
- test.done();
63
- });
64
- signer.write(Buffer.from(email));
65
- signer.end();
66
- },
67
- 'empty body hash simple' (test) {
68
- test.expect(1);
69
-
70
- const email = 'Ignored: header\r\n\r\n';
71
-
72
- const header = new message.Header();
73
- header.parse(['Ignored: header']);
74
- const signer = new DKIMSignStream(props, header, (n, dkim) => {
75
- test.equal(getValueFromDKIM(dkim, 'bh'), 'frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=');
76
- test.done();
77
- });
78
- signer.write(Buffer.from(email));
79
- signer.end();
80
- },
81
- 'body hash simple, two writes' (test) {
82
- test.expect(1);
83
-
84
- const header = new message.Header();
85
- header.parse(['Ignored: header']);
86
- const signer = new DKIMSignStream(props, header, (n, dkim) => {
87
- test.equal(getValueFromDKIM(dkim, 'bh'), '2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=');
88
- test.done();
89
- });
90
- signer.write(Buffer.from('Ignored: header\r\n\r\nHi.\r\n\r\nWe lost the game. '));
91
- signer.write(Buffer.from('Are you hungry yet?\r\n\r\nJoe.\r\n'));
92
- signer.end();
93
- },
94
- 'body hash simple, empty lines': test => {
95
- test.expect(1);
96
-
97
- const email = 'Ignored: header\r\n\r\nHi.\r\n\r\nWe lost the game. Are you hungry yet?\r\n\r\nJoe.\r\n\r\n\r\n';
98
-
99
- const header = new message.Header();
100
- header.parse(['Ignored: header']);
101
- const signer = new DKIMSignStream(props, header, (n, dkim) => {
102
- test.equal(getValueFromDKIM(dkim, 'bh'), '2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=');
103
- test.done();
104
- });
105
- signer.write(Buffer.from(email));
106
- signer.end();
107
- },
108
- }