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,101 +0,0 @@
1
- const message = require('haraka-email-message')
2
-
3
- test.expect(14);
4
- const server = {notes: {}};
5
-
6
- exports.get_client(server, (smtp_client) => {
7
-
8
- const message_stream = new message.stream(
9
- { main : { spool_after : 1024 } }, '123456789'
10
- );
11
-
12
- const data = [];
13
- let reading_body = false;
14
- data.push('220 hi');
15
-
16
- smtp_client.on('greeting', command => {
17
- test.equals(smtp_client.response[0], 'hi');
18
- test.equals('EHLO', command);
19
- smtp_client.send_command(command, 'example.com');
20
- });
21
-
22
- data.push('EHLO example.com');
23
- data.push('250 hello');
24
-
25
- smtp_client.on('helo', () => {
26
- test.equals(smtp_client.response[0], 'hello');
27
- smtp_client.send_command('MAIL', 'FROM: me@example.com');
28
- });
29
-
30
- data.push('MAIL FROM: me@example.com');
31
- data.push('250 sender ok');
32
-
33
- smtp_client.on('mail', () => {
34
- test.equals(smtp_client.response[0], 'sender ok');
35
- smtp_client.send_command('RCPT', 'TO: you@example.com');
36
- });
37
-
38
- data.push('RCPT TO: you@example.com');
39
- data.push('250 recipient ok');
40
-
41
- smtp_client.on('rcpt', () => {
42
- test.equals(smtp_client.response[0], 'recipient ok');
43
- smtp_client.send_command('DATA');
44
- });
45
-
46
- data.push('DATA');
47
- data.push('354 go ahead');
48
-
49
- smtp_client.on('data', () => {
50
- test.equals(smtp_client.response[0], 'go ahead');
51
- smtp_client.start_data(message_stream);
52
- message_stream.on('end', () => {
53
- smtp_client.socket.write('.\r\n');
54
- });
55
- message_stream.add_line('Header: test\r\n');
56
- message_stream.add_line('\r\n');
57
- message_stream.add_line('hi\r\n');
58
- message_stream.add_line_end();
59
- });
60
-
61
- data.push('.');
62
- data.push('250 message queued');
63
-
64
- smtp_client.on('dot', () => {
65
- test.equals(smtp_client.response[0], 'message queued');
66
- smtp_client.send_command('QUIT');
67
- });
68
-
69
- data.push('QUIT');
70
- data.push('221 goodbye');
71
-
72
- smtp_client.on('quit', () => {
73
- test.equals(smtp_client.response[0], 'goodbye');
74
- test.done();
75
- });
76
-
77
- smtp_client.socket.write = function (line) {
78
- if (data.length == 0) {
79
- test.ok(false);
80
- return;
81
- }
82
- test.equals(`${data.shift() }\r\n`, line);
83
- if (reading_body && line == '.\r\n') {
84
- reading_body = false;
85
- }
86
- if (reading_body) return true;
87
-
88
- if (line == 'DATA\r\n') {
89
- reading_body = true;
90
- }
91
- while (true) {
92
- const line2 = data.shift();
93
- this.emit('line', `${line2 }\r\n`);
94
- if (line2[3] == ' ') break;
95
- }
96
-
97
- return true;
98
- };
99
-
100
- smtp_client.socket.emit('line', data.shift());
101
- });
@@ -1,80 +0,0 @@
1
-
2
- const path = require('path');
3
- const vm_harness = require('./fixtures/vm_harness');
4
-
5
- vm_harness.add_tests(
6
- path.join(__dirname, '..', 'smtp_client.js'),
7
- path.join(__dirname, 'smtp_client') + path.sep,
8
- exports
9
- );
10
-
11
- const smtp_client = require('../smtp_client');
12
- const fixtures = require('haraka-test-fixtures');
13
-
14
- function getClientOpts (socket) {
15
- return { port: 25, host: 'localhost', connect_timeout: 30, idle_timeout: 30, socket }
16
- }
17
-
18
- exports.testUpgradeIsCalledOnSTARTTLS = test => {
19
- test.expect(1);
20
-
21
- const plugin = new fixtures.plugin('queue/smtp_forward');
22
-
23
- // switch config directory to 'tests/config'
24
- plugin.config = plugin.config.module_config(path.resolve('tests'));
25
-
26
- plugin.register();
27
-
28
- const cmds = {};
29
- let upgradeArgs = {};
30
-
31
- const socket = {
32
- setTimeout: arg => { },
33
- setKeepAlive: arg => { },
34
- on: (eventName, callback) => {
35
- cmds[eventName] = callback;
36
- },
37
- upgrade: arg => {
38
- upgradeArgs = arg;
39
- }
40
- };
41
-
42
- const client = new smtp_client.smtp_client(getClientOpts(socket));
43
- client.load_tls_config({ key: Buffer.from('OutboundTlsKeyLoaded')});
44
-
45
- client.command = 'starttls';
46
- cmds.line('250 Hello client.example.com\r\n');
47
-
48
- const { StringDecoder } = require('string_decoder');
49
- const decoder = new StringDecoder('utf8');
50
-
51
- const cent = Buffer.from(upgradeArgs.key);
52
- test.equal(decoder.write(cent), 'OutboundTlsKeyLoaded');
53
-
54
- test.done();
55
- }
56
-
57
- exports.startTLS = test => {
58
- test.expect(1);
59
-
60
- let cmd = '';
61
-
62
- const socket = {
63
- setTimeout: arg => { },
64
- setKeepAlive: arg => { },
65
- on: (eventName, callback) => { },
66
- upgrade: arg => { },
67
- write: arg => { cmd = arg; }
68
- };
69
-
70
- const client = new smtp_client.smtp_client(getClientOpts(socket));
71
- client.tls_options = {};
72
-
73
- client.secured = false;
74
- client.response = [ 'STARTTLS' ]
75
-
76
- smtp_client.onCapabilitiesOutbound(client, false, undefined, { 'enable_tls': true });
77
-
78
- test.equal(cmd, 'STARTTLS\r\n');
79
- test.done();
80
- }
@@ -1,333 +0,0 @@
1
- const fs = require('fs')
2
- const path = require('path')
3
- const os = require('os')
4
-
5
- function _setup (done) {
6
- this.socket = require('../tls_socket');
7
-
8
- // use tests/config instead of ./config
9
- this.socket.config = this.socket.config.module_config(path.resolve('tests'));
10
-
11
- done();
12
- }
13
-
14
- exports.tls_socket = {
15
- setUp: _setup,
16
- 'loads' (test) {
17
- test.expect(1);
18
- test.ok(this.socket);
19
- test.done();
20
- },
21
- 'exports createConnection' (test) {
22
- test.expect(1);
23
- test.equal(typeof this.socket.createConnection, 'function');
24
- test.done();
25
- },
26
- 'exports createServer' (test) {
27
- test.expect(1);
28
- // console.log(this.socket);
29
- test.equal(typeof this.socket.createServer, 'function');
30
- test.done();
31
- },
32
- 'exports shutdown' (test) {
33
- test.expect(1);
34
- // console.log(this.socket);
35
- test.equal(typeof this.socket.shutdown, 'function');
36
- test.done();
37
- },
38
- }
39
-
40
- exports.createServer = {
41
- setUp: _setup,
42
- 'returns a net.Server' (test) {
43
- test.expect(1);
44
- const server = this.socket.createServer(sock => {
45
- console.log(sock);
46
- });
47
- test.ok(server);
48
- test.done();
49
- }
50
- }
51
-
52
- exports.saveOpt = {
53
- setUp: _setup,
54
- 'saveOpt' (test) {
55
- test.expect(1);
56
- this.socket.saveOpt('*', 'dhparam', 'a file name');
57
- test.ok(this.socket.certsByHost['*'].dhparam);
58
- // console.log(this.socket.certsByHost['*']);
59
- test.done();
60
- }
61
- }
62
-
63
- exports.load_tls_ini = {
64
- setUp: _setup,
65
- 'tls.ini loads' (test) {
66
- test.expect(2);
67
- test.ok(this.socket.load_tls_ini().main !== undefined);
68
- test.ok(this.socket.certsByHost['*'].key);
69
- // console.log(this.socket.cfg);
70
- // console.log(this.socket.certsByHost);
71
- test.done();
72
- },
73
- }
74
-
75
- exports.get_loud_certs_dir = {
76
- setUp: _setup,
77
- 'loads certs from tests/loud/config/tls' (test) {
78
- test.expect(2);
79
- this.socket.config = this.socket.config.module_config(path.resolve('tests', 'loud'));
80
- this.socket.get_certs_dir('tls', (err, certs) => {
81
- test.ifError(err);
82
- test.ok(certs);
83
- test.done();
84
- })
85
- }
86
- }
87
-
88
- exports.get_certs_dir = {
89
- setUp: _setup,
90
- 'loads certs from tests/config/tls' (test) {
91
- test.expect(2);
92
- this.socket.config = this.socket.config.module_config(path.resolve('tests'));
93
- this.socket.get_certs_dir('tls', (err, certs) => {
94
- test.ifError(err);
95
- test.ok(certs);
96
- test.done();
97
- })
98
- }
99
- }
100
-
101
- exports.getSocketOpts = {
102
- setUp: _setup,
103
- 'gets socket opts for *' (test) {
104
- test.expect(2);
105
- this.socket.get_certs_dir('tls', () => {
106
- this.socket.getSocketOpts('*', (opts) => {
107
- // console.log(opts);
108
- test.ok(opts.key);
109
- test.ok(opts.cert);
110
- test.done();
111
- })
112
- })
113
- },
114
- }
115
-
116
- exports.ensureDhparams = {
117
- setUp : _setup,
118
- 'generates a missing dhparams file' (test) {
119
- test.expect(2);
120
- this.socket.load_tls_ini();
121
- this.socket.ensureDhparams((err, dhparams) => {
122
- // console.log(dhparams);
123
- test.ifError(err);
124
- test.ok(dhparams);
125
- test.done();
126
- })
127
- },
128
- }
129
-
130
- exports.load_tls_ini2 = {
131
- setUp (done) {
132
- this.socket = require('../tls_socket');
133
- delete process.env.HARAKA_TEST_DIR;
134
- done();
135
- },
136
- 'loads missing tls.ini default config' (test) {
137
- test.expect(1);
138
- this.socket.config = this.socket.config.module_config(path.resolve('non-exist'));
139
- test.deepEqual(this.socket.load_tls_ini(),
140
- {
141
- main: {
142
- requestCert: true,
143
- rejectUnauthorized: false,
144
- honorCipherOrder: true,
145
- requestOCSP: false,
146
- // enableOCSPStapling: false,
147
- requireAuthorized: [],
148
- mutual_tls: false,
149
- no_starttls_ports: [],
150
- },
151
- redis: { disable_for_failed_hosts: false },
152
- no_tls_hosts: {},
153
- mutual_auth_hosts: {},
154
- mutual_auth_hosts_exclude: {},
155
- });
156
- test.done();
157
- },
158
- 'loads tls.ini from test dir' (test) {
159
- test.expect(1);
160
- this.socket.config = this.socket.config.module_config(path.resolve('tests'));
161
- test.deepEqual(this.socket.load_tls_ini(), {
162
- main: {
163
- requestCert: true,
164
- rejectUnauthorized: false,
165
- honorCipherOrder: true,
166
- requestOCSP: false,
167
- key: 'tls_key.pem',
168
- cert: 'tls_cert.pem',
169
- dhparam: 'dhparams.pem',
170
- ciphers: 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384',
171
- minVersion: 'TLSv1',
172
- requireAuthorized: [2465, 2587],
173
- mutual_tls: false,
174
- no_starttls_ports: [2525],
175
- },
176
- redis: { disable_for_failed_hosts: false },
177
- no_tls_hosts: {},
178
- mutual_auth_hosts: {},
179
- mutual_auth_hosts_exclude: {},
180
- outbound: {
181
- key: 'outbound_tls_key.pem',
182
- cert: 'outbound_tls_cert.pem',
183
- ciphers: 'ECDHE-RSA-AES256-GCM-SHA384',
184
- minVersion: 'TLSv1',
185
- dhparam: 'dhparams.pem',
186
- rejectUnauthorized: false,
187
- requestCert: false,
188
- honorCipherOrder: false,
189
- force_tls_hosts: ['first.example.com', 'second.example.net'],
190
- }
191
- });
192
- test.done();
193
- },
194
- }
195
-
196
- exports.parse_x509 = {
197
- setUp: _setup,
198
- 'returns empty object on empty input' (test) {
199
- const res = this.socket.parse_x509();
200
- test.deepEqual(res, {});
201
- test.done();
202
- },
203
- 'returns key from BEGIN PRIVATE KEY block' (test) {
204
- const res = this.socket.parse_x509('-BEGIN PRIVATE KEY-\nhello\n--END PRIVATE KEY--\n-its me-\n');
205
- test.deepEqual(
206
- res.key.toString(),
207
- '-BEGIN PRIVATE KEY-\nhello\n--END PRIVATE KEY--'
208
- );
209
- test.deepEqual(res.cert, undefined);
210
- test.done();
211
- },
212
- 'returns key from BEGIN RSA PRIVATE KEY block' (test) {
213
- const res = this.socket.parse_x509('-BEGIN RSA PRIVATE KEY-\nhello\n--END RSA PRIVATE KEY--\n-its me-\n');
214
- test.deepEqual(
215
- res.key.toString(),
216
- '-BEGIN RSA PRIVATE KEY-\nhello\n--END RSA PRIVATE KEY--'
217
- );
218
- test.deepEqual(res.cert, undefined);
219
- test.done();
220
- },
221
- 'returns a key and certificate chain' (test) {
222
- const str = `-----BEGIN RSA PRIVATE KEY-----
223
- MIIEogIBAAKCAQEAoDGOlvw6lQptaNwqxYsW4aJCPIgvjYw3qA9Y0qykp8I8PapT
224
- ercA8BsInrZg5+3wt2PT1+REprBvv6xfHyQ08o/udsSCBRf4Awadp0fxzUulENNi
225
- 3wWuuPy0WgaE4jam7tWItDBeEhXkEfcMTr9XkFxenuTcNw9O1+E8TtNP9KMmJDAe
226
- <snip>
227
- F+T5AoGAMRH1+JrjTpPYcs1hOyHMWnxkHv7fsJMJY/KN2NPoTlI4d4V1W5xyCZ0D
228
- rl7RlVdVTQdZ9VjkWVjJcafNSmNyQEK4IQsaczwOU59IPhC/nUAyRgeoRbKWPQ4r
229
- mj3g7uX9f07j34c01mH1zLgDa24LO9SW7B5ZbYYu4DORk7005B4=
230
- -----END RSA PRIVATE KEY-----
231
- -----BEGIN CERTIFICATE-----
232
- MIIFVzCCBD+gAwIBAgISA/5ofbB6cUAp/PrYaBxTITF2MA0GCSqGSIb3DQEBCwUA
233
- MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
234
- <snip>
235
- kOk4JdlpuBSPwx9wNAEYF15/4LDyev+tyAg7GxCZ9MW53leOxF+j2NQgc4kRIdQc
236
- DYsruShsnwn4HErJKQAfE5Aq77UM32hfKzMb2PH6Ebw0TB2NCLVocOULAGTw4NPO
237
- wBpsGsIFUxeDHZvhKohZyNqLrj7gR+XlKRKM
238
- -----END CERTIFICATE-----
239
-
240
- -----BEGIN CERTIFICATE-----
241
- MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
242
- TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
243
- cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
244
- <snip>
245
- HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
246
- MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
247
- nLRbwHOoq7hHwg==
248
- -----END CERTIFICATE-----
249
-
250
- -----BEGIN CERTIFICATE-----
251
- MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/
252
- MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
253
- DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow
254
- <snip>
255
- WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O
256
- he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC
257
- Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5
258
- -----END CERTIFICATE-----`
259
- const res = this.socket.parse_x509(str);
260
- test.deepEqual(res.key.length, 446);
261
- test.deepEqual(res.cert.length, 1195);
262
- test.done();
263
- },
264
- 'returns cert and key from EC pem' (test) {
265
- const fp = fs.readFileSync(path.join('tests','config','tls','ec.pem'))
266
- const res = this.socket.parse_x509(fp.toString())
267
- test.deepEqual(
268
- res.key.toString().split(os.EOL).join('\n'),
269
- `-----BEGIN EC PRIVATE KEY-----
270
- MHcCAQEEIIDhiI5q6l7txfMJ6kIEYjK12EFcHLvDIkfWIwzdZBsloAoGCCqGSM49
271
- AwEHoUQDQgAEZg2nHEFy9nquFPF3DQyQE28e/ytjXeb4nD/8U+L4KHKFtglaX3R4
272
- uZ+5JcwfcDghpL4Z8h4ouUD/xqe957e2+g==
273
- -----END EC PRIVATE KEY-----`
274
- );
275
- test.deepEqual(
276
- res.cert.toString().split(os.EOL).join('\n'),
277
- `-----BEGIN CERTIFICATE-----
278
- MIICaTCCAg+gAwIBAgIUEDa9VX16wCdo97WvIk7jyEBz1wQwCgYIKoZIzj0EAwIw
279
- gYkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT
280
- ZWF0dGxlMRQwEgYDVQQKDAtIYXJha2EgTWFpbDEXMBUGA1UEAwwObWFpbC5oYXJh
281
- a2EuaW8xJDAiBgkqhkiG9w0BCQEWFWhhcmFrYS5tYWlsQGdtYWlsLmNvbTAeFw0y
282
- MTEwMTQwNjQxMTlaFw0yMjEwMTQwNjQxMTlaMIGJMQswCQYDVQQGEwJVUzETMBEG
283
- A1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEUMBIGA1UECgwLSGFy
284
- YWthIE1haWwxFzAVBgNVBAMMDm1haWwuaGFyYWthLmlvMSQwIgYJKoZIhvcNAQkB
285
- FhVoYXJha2EubWFpbEBnbWFpbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
286
- AARmDaccQXL2eq4U8XcNDJATbx7/K2Nd5vicP/xT4vgocoW2CVpfdHi5n7klzB9w
287
- OCGkvhnyHii5QP/Gp73nt7b6o1MwUTAdBgNVHQ4EFgQU094ROMLHmLEspT4ZoCfX
288
- Rz0mR/YwHwYDVR0jBBgwFoAU094ROMLHmLEspT4ZoCfXRz0mR/YwDwYDVR0TAQH/
289
- BAUwAwEB/zAKBggqhkjOPQQDAgNIADBFAiEAsmshzvMDjmYDHyGRrKdMmsnnESFd
290
- GMtfRXYIv0AZe7ICIGD2Sta9LL0zZ44ARGXhh+sPjxd78I/+0FdIPsofr2I+
291
- -----END CERTIFICATE-----`);
292
- test.done();
293
- },
294
- }
295
-
296
- exports.parse_x509_names = {
297
- setUp: _setup,
298
- 'extracts nictool.com from x509 Subject CN' (test) {
299
- test.expect(1);
300
- const r = this.socket.parse_x509_names(' Validity\n Not Before: Jan 15 22:47:00 2017 GMT\n Not After : Apr 15 22:47:00 2017 GMT\n Subject: CN=nictool.com\n Subject Public Key Info:\n');
301
- test.deepEqual(r, ['nictool.com']);
302
- test.done();
303
- },
304
- 'extracts haraka.local from x509 Subject CN' (test) {
305
- test.expect(1);
306
- const r = this.socket.parse_x509_names(' Validity\n Not Before: Mar 4 23:28:49 2017 GMT\n Not After : Mar 3 23:28:49 2023 GMT\n Subject: C=US, ST=Washington, L=Seattle, O=Haraka, CN=haraka.local/emailAddress=matt@haraka.local\n Subject Public Key Info:\n Public Key Algorithm: rsaEncryption\n');
307
- test.deepEqual(r, ['haraka.local']);
308
- test.done();
309
- },
310
- 'extracts host names from X509v3 Subject Alternative Name' (test) {
311
- test.expect(1);
312
- const r = this.socket.parse_x509_names(' CA Issuers - URI:http://cert.int-x3.letsencrypt.org/\n\n X509v3 Subject Alternative Name: \n DNS:nictool.com, DNS:nictool.org, DNS:www.nictool.com, DNS:www.nictool.org\n X509v3 Certificate Policies: \n Policy: 2.23.140.1.2.1\n');
313
- test.deepEqual(r, ['nictool.com', 'nictool.org', 'www.nictool.com', 'www.nictool.org']);
314
- test.done();
315
- },
316
- 'extracts host names from both' (test) {
317
- test.expect(2);
318
-
319
- let r = this.socket.parse_x509_names(' Validity\n Not Before: Jan 15 22:47:00 2017 GMT\n Not After : Apr 15 22:47:00 2017 GMT\n Subject: CN=nictool.com\n Subject Public Key Info:\n CA Issuers - URI:http://cert.int-x3.letsencrypt.org/\n\n X509v3 Subject Alternative Name: \n DNS:nictool.com, DNS:nictool.org, DNS:www.nictool.com, DNS:www.nictool.org\n X509v3 Certificate Policies: \n Policy: 2.23.140.1.2.1\n');
320
- test.deepEqual(r, ['nictool.com', 'nictool.org', 'www.nictool.com', 'www.nictool.org']);
321
-
322
- r = this.socket.parse_x509_names(' Validity\n Not Before: Jan 15 22:47:00 2017 GMT\n Not After : Apr 15 22:47:00 2017 GMT\n Subject: CN=foo.nictool.com\n Subject Public Key Info:\n CA Issuers - URI:http://cert.int-x3.letsencrypt.org/\n\n X509v3 Subject Alternative Name: \n DNS:nictool.com, DNS:nictool.org, DNS:www.nictool.com, DNS:www.nictool.org\n X509v3 Certificate Policies: \n Policy: 2.23.140.1.2.1\n');
323
- test.deepEqual(r, ['foo.nictool.com', 'nictool.com', 'nictool.org', 'www.nictool.com', 'www.nictool.org']);
324
-
325
- test.done();
326
- },
327
- 'extracts expiration date' (test) {
328
- test.expect(1);
329
- const r = this.socket.parse_x509_expire('foo', 'Validity\n Not Before: Mar 4 23:28:49 2017 GMT\n Not After : Mar 3 23:28:49 2023 GMT\n Subject');
330
- test.deepEqual(r, new Date('2023-03-03T23:28:49.000Z'));
331
- test.done();
332
- },
333
- }