Haraka 3.0.3 → 3.0.5

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 (239) hide show
  1. package/.eslintrc.yaml +4 -9
  2. package/CONTRIBUTORS.md +11 -0
  3. package/Changes.md +1397 -1213
  4. package/Plugins.md +117 -105
  5. package/README.md +4 -13
  6. package/bin/haraka +198 -298
  7. package/config/auth_flat_file.ini +1 -0
  8. package/config/dhparams.pem +8 -0
  9. package/config/mail_from.is_resolvable.ini +4 -2
  10. package/config/me +1 -0
  11. package/config/outbound.ini +0 -2
  12. package/config/plugins +35 -36
  13. package/config/smtp.ini +1 -1
  14. package/config/smtp.json +17 -0
  15. package/config/tls.ini +2 -0
  16. package/config/tls_cert.pem +23 -0
  17. package/config/tls_key.pem +28 -0
  18. package/connection.js +46 -73
  19. package/contrib/bsd-rc.d/haraka +3 -1
  20. package/contrib/plugin2npm.sh +6 -36
  21. package/docs/CoreConfig.md +2 -2
  22. package/docs/Logging.md +7 -21
  23. package/docs/Outbound.md +104 -201
  24. package/docs/Plugins.md +2 -2
  25. package/docs/Transaction.md +59 -82
  26. package/docs/plugins/queue/smtp_proxy.md +5 -10
  27. package/docs/plugins/tls.md +37 -9
  28. package/endpoint.js +16 -13
  29. package/haraka.js +10 -14
  30. package/host_pool.js +5 -5
  31. package/http/html/index.html +6 -5
  32. package/line_socket.js +3 -4
  33. package/logger.js +44 -28
  34. package/outbound/client_pool.js +27 -23
  35. package/outbound/config.js +4 -6
  36. package/outbound/fsync_writestream.js +1 -1
  37. package/outbound/hmail.js +178 -218
  38. package/outbound/index.js +86 -99
  39. package/outbound/qfile.js +1 -1
  40. package/outbound/queue.js +51 -44
  41. package/outbound/timer_queue.js +3 -2
  42. package/outbound/tls.js +19 -7
  43. package/package.json +60 -51
  44. package/plugins/.eslintrc.yaml +0 -6
  45. package/plugins/auth/auth_base.js +4 -2
  46. package/plugins/auth/auth_proxy.js +14 -12
  47. package/plugins/auth/auth_vpopmaild.js +1 -1
  48. package/plugins/block_me.js +1 -1
  49. package/plugins/data.signatures.js +2 -4
  50. package/plugins/early_talker.js +2 -1
  51. package/plugins/mail_from.is_resolvable.js +65 -135
  52. package/plugins/queue/deliver.js +4 -5
  53. package/plugins/queue/lmtp.js +11 -12
  54. package/plugins/queue/qmail-queue.js +2 -2
  55. package/plugins/queue/quarantine.js +2 -2
  56. package/plugins/queue/rabbitmq.js +16 -17
  57. package/plugins/queue/smtp_forward.js +3 -3
  58. package/plugins/queue/smtp_proxy.js +10 -1
  59. package/plugins/queue/test.js +2 -2
  60. package/plugins/rcpt_to.host_list_base.js +5 -5
  61. package/plugins/rcpt_to.in_host_list.js +2 -2
  62. package/plugins/relay.js +6 -7
  63. package/plugins/reseed_rng.js +1 -1
  64. package/plugins/status.js +37 -33
  65. package/plugins/tls.js +2 -2
  66. package/plugins/xclient.js +3 -2
  67. package/plugins.js +50 -54
  68. package/run_tests +3 -30
  69. package/server.js +190 -190
  70. package/smtp_client.js +30 -23
  71. package/{tests → test}/config/plugins +0 -2
  72. package/{tests → test}/config/smtp.ini +3 -1
  73. package/test/config/tls/example.com/_.example.com.key +28 -0
  74. package/test/config/tls/example.com/example.com.crt +25 -0
  75. package/{tests/loud → test}/config/tls.ini +4 -2
  76. package/test/connection.js +302 -0
  77. package/test/endpoint.js +94 -0
  78. package/{tests → test}/fixtures/line_socket.js +1 -1
  79. package/{tests → test}/fixtures/util_hmailitem.js +19 -25
  80. package/{tests → test}/host_pool.js +42 -57
  81. package/test/logger.js +258 -0
  82. package/test/outbound/hmail.js +141 -0
  83. package/test/outbound/index.js +220 -0
  84. package/test/outbound/qfile.js +126 -0
  85. package/test/outbound_bounce_net_errors.js +142 -0
  86. package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
  87. package/test/plugins/auth/auth_base.js +484 -0
  88. package/test/plugins/auth/auth_vpopmaild.js +83 -0
  89. package/test/plugins/early_talker.js +104 -0
  90. package/test/plugins/mail_from.is_resolvable.js +35 -0
  91. package/test/plugins/queue/smtp_forward.js +206 -0
  92. package/test/plugins/rcpt_to.host_list_base.js +122 -0
  93. package/test/plugins/rcpt_to.in_host_list.js +193 -0
  94. package/test/plugins/relay.js +303 -0
  95. package/test/plugins/status.js +130 -0
  96. package/test/plugins/tls.js +70 -0
  97. package/test/plugins.js +228 -0
  98. package/test/rfc1869.js +73 -0
  99. package/test/server.js +491 -0
  100. package/test/smtp_client.js +299 -0
  101. package/test/tls_socket.js +277 -0
  102. package/test/transaction.js +270 -0
  103. package/tls_socket.js +202 -252
  104. package/transaction.js +8 -23
  105. package/CONTRIBUTING.md +0 -1
  106. package/bin/dkimverify +0 -40
  107. package/config/access.domains +0 -13
  108. package/config/attachment.ctype.regex +0 -2
  109. package/config/attachment.filename.regex +0 -1
  110. package/config/avg.ini +0 -5
  111. package/config/bounce.ini +0 -15
  112. package/config/data.headers.ini +0 -61
  113. package/config/dkim/dkim_key_gen.sh +0 -78
  114. package/config/dkim_sign.ini +0 -4
  115. package/config/dkim_verify.ini +0 -7
  116. package/config/dnsbl.ini +0 -23
  117. package/config/greylist.ini +0 -43
  118. package/config/helo.checks.ini +0 -52
  119. package/config/messagesniffer.ini +0 -18
  120. package/config/spamassassin.ini +0 -56
  121. package/dkim.js +0 -614
  122. package/docs/plugins/avg.md +0 -35
  123. package/docs/plugins/bounce.md +0 -69
  124. package/docs/plugins/clamd.md +0 -147
  125. package/docs/plugins/esets.md +0 -8
  126. package/docs/plugins/greylist.md +0 -90
  127. package/docs/plugins/helo.checks.md +0 -135
  128. package/docs/plugins/messagesniffer.md +0 -163
  129. package/docs/plugins/spamassassin.md +0 -180
  130. package/outbound/mx_lookup.js +0 -70
  131. package/plugins/auth/auth_ldap.js +0 -3
  132. package/plugins/avg.js +0 -162
  133. package/plugins/backscatterer.js +0 -25
  134. package/plugins/bounce.js +0 -381
  135. package/plugins/clamd.js +0 -382
  136. package/plugins/data.uribl.js +0 -4
  137. package/plugins/dkim_sign.js +0 -395
  138. package/plugins/dkim_verify.js +0 -62
  139. package/plugins/dns_list_base.js +0 -221
  140. package/plugins/dnsbl.js +0 -146
  141. package/plugins/dnswl.js +0 -58
  142. package/plugins/esets.js +0 -71
  143. package/plugins/graph.js +0 -5
  144. package/plugins/greylist.js +0 -645
  145. package/plugins/helo.checks.js +0 -533
  146. package/plugins/messagesniffer.js +0 -381
  147. package/plugins/rcpt_to.ldap.js +0 -3
  148. package/plugins/rcpt_to.max_count.js +0 -24
  149. package/plugins/spamassassin.js +0 -384
  150. package/tests/config/dkim/example.com/dns +0 -29
  151. package/tests/config/dkim/example.com/private +0 -6
  152. package/tests/config/dkim/example.com/public +0 -4
  153. package/tests/config/dkim/example.com/selector +0 -1
  154. package/tests/config/dkim.private.key +0 -6
  155. package/tests/config/dkim_sign.ini +0 -4
  156. package/tests/config/helo.checks.ini +0 -52
  157. package/tests/connection.js +0 -327
  158. package/tests/endpoint.js +0 -128
  159. package/tests/fixtures/vm_harness.js +0 -59
  160. package/tests/logger.js +0 -327
  161. package/tests/outbound/hmail.js +0 -112
  162. package/tests/outbound/index.js +0 -324
  163. package/tests/outbound/qfile.js +0 -67
  164. package/tests/outbound_bounce_net_errors.js +0 -173
  165. package/tests/plugins/auth/auth_base.js +0 -463
  166. package/tests/plugins/auth/auth_vpopmaild.js +0 -91
  167. package/tests/plugins/bounce.js +0 -307
  168. package/tests/plugins/clamd.js +0 -224
  169. package/tests/plugins/deprecated/relay_acl.js +0 -140
  170. package/tests/plugins/deprecated/relay_all.js +0 -59
  171. package/tests/plugins/dkim_sign.js +0 -315
  172. package/tests/plugins/dkim_signer.js +0 -108
  173. package/tests/plugins/dns_list_base.js +0 -259
  174. package/tests/plugins/dnsbl.js +0 -101
  175. package/tests/plugins/early_talker.js +0 -115
  176. package/tests/plugins/greylist.js +0 -58
  177. package/tests/plugins/helo.checks.js +0 -525
  178. package/tests/plugins/mail_from.is_resolvable.js +0 -116
  179. package/tests/plugins/queue/smtp_forward.js +0 -221
  180. package/tests/plugins/rcpt_to.host_list_base.js +0 -132
  181. package/tests/plugins/rcpt_to.in_host_list.js +0 -218
  182. package/tests/plugins/relay.js +0 -339
  183. package/tests/plugins/spamassassin.js +0 -171
  184. package/tests/plugins/status.js +0 -138
  185. package/tests/plugins/tls.js +0 -84
  186. package/tests/plugins.js +0 -247
  187. package/tests/rfc1869.js +0 -61
  188. package/tests/server.js +0 -510
  189. package/tests/smtp_client/auth.js +0 -105
  190. package/tests/smtp_client/basic.js +0 -101
  191. package/tests/smtp_client.js +0 -80
  192. package/tests/tls_socket.js +0 -333
  193. package/tests/transaction.js +0 -284
  194. /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
  195. /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
  196. /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
  197. /package/docs/{plugins → deprecated}/dnswl.md +0 -0
  198. /package/{tests → test}/.eslintrc.yaml +0 -0
  199. /package/{tests → test}/config/auth_flat_file.ini +0 -0
  200. /package/{tests → test}/config/dhparams.pem +0 -0
  201. /package/{tests → test}/config/host_list +0 -0
  202. /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
  203. /package/{tests → test}/config/outbound_tls_key.pem +0 -0
  204. /package/{tests → test}/config/smtp_forward.ini +0 -0
  205. /package/{tests → test}/config/tls/ec.pem +0 -0
  206. /package/{tests → test}/config/tls/haraka.local.pem +0 -0
  207. /package/{tests → test}/config/tls/mismatched.pem +0 -0
  208. /package/{tests → test}/config/tls_cert.pem +0 -0
  209. /package/{tests → test}/config/tls_key.pem +0 -0
  210. /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
  211. /package/{tests → test}/installation/config/test-plugin-flat +0 -0
  212. /package/{tests → test}/installation/config/test-plugin.ini +0 -0
  213. /package/{tests → test}/installation/config/tls.ini +0 -0
  214. /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
  215. /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
  216. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
  217. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
  218. /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
  219. /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
  220. /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
  221. /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
  222. /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
  223. /package/{tests → test}/installation/plugins/inherits.js +0 -0
  224. /package/{tests → test}/installation/plugins/load_first.js +0 -0
  225. /package/{tests → test}/installation/plugins/plugin.js +0 -0
  226. /package/{tests → test}/installation/plugins/tls.js +0 -0
  227. /package/{tests → test}/loud/config/dhparams.pem +0 -0
  228. /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
  229. /package/{tests → test/loud}/config/tls.ini +0 -0
  230. /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
  231. /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
  232. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
  233. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
  234. /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
  235. /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
  236. /package/{tests → test}/queue/multibyte +0 -0
  237. /package/{tests → test}/queue/plain +0 -0
  238. /package/{tests → test}/queue/zero-length +0 -0
  239. /package/{tests → test}/test-queue/delete-me +0 -0
package/plugins/dnsbl.js DELETED
@@ -1,146 +0,0 @@
1
- // dnsbl plugin
2
-
3
- exports.register = function () {
4
- this.inherits('dns_list_base');
5
-
6
- this.load_config();
7
-
8
- if (this.cfg.main.periodic_checks) {
9
- this.check_zones(this.cfg.main.periodic_checks);
10
- }
11
-
12
- if (this.cfg.main.search === 'all') {
13
- this.register_hook('connect', 'connect_multi');
14
- }
15
- else {
16
- this.register_hook('connect', 'connect_first');
17
- }
18
- }
19
-
20
- exports.load_config = function () {
21
-
22
- this.cfg = this.config.get('dnsbl.ini', {
23
- booleans: ['+main.reject', '-main.enable_stats'],
24
- }, () => {
25
- this.load_config();
26
- });
27
-
28
- if (this.cfg.main.enable_stats && !this.enable_stats) {
29
- this.loginfo('stats reporting enabled');
30
- this.enable_stats = true;
31
- }
32
- if (!this.cfg.main.enable_stats && this.enable_stats) {
33
- this.loginfo('stats reporting disabled');
34
- this.enable_stats = false;
35
- }
36
-
37
- if (this.cfg.main.stats_redis_host &&
38
- this.cfg.main.stats_redis_host !== this.redis_host) {
39
- this.redis_host = this.cfg.main.stats_redis_host;
40
- this.loginfo(`set stats redis host to: ${this.redis_host}`);
41
- }
42
-
43
- this.get_uniq_zones();
44
- }
45
-
46
- exports.get_uniq_zones = function () {
47
- this.zones = [];
48
-
49
- const unique_zones = {};
50
-
51
- // Compatibility with old plugin
52
- const legacy_zones = this.config.get('dnsbl.zones', 'list');
53
- for (const legacyZone of legacy_zones) {
54
- unique_zones[legacyZone] = true;
55
- }
56
-
57
- if (this.cfg.main.zones) {
58
- const new_zones = this.cfg.main.zones.split(/[\s,;]+/);
59
- for (const newZone of new_zones) {
60
- unique_zones[newZone] = true;
61
- }
62
- }
63
-
64
- for (const key in unique_zones) { this.zones.push(key); }
65
- return this.zones;
66
- }
67
-
68
- exports.should_skip = function (connection) {
69
-
70
- if (!connection) { return true; }
71
-
72
- if (connection.remote.is_private) {
73
- connection.logdebug(this, `skip private: ${connection.remote.ip}`);
74
- return true;
75
- }
76
-
77
- if (!this.zones || !this.zones.length) {
78
- connection.logerror(this, "no zones");
79
- return true;
80
- }
81
-
82
- return false;
83
- }
84
-
85
- exports.connect_first = function (next, connection) {
86
- const plugin = this;
87
- const remote_ip = connection.remote.ip;
88
-
89
- if (plugin.should_skip(connection)) { return next(); }
90
-
91
- plugin.first(remote_ip, plugin.zones, (err, zone, a) => {
92
- if (err) {
93
- connection.results.add(plugin, {err: err.message});
94
- return next();
95
- }
96
- if (!a) return next();
97
-
98
- const msg = `host [${remote_ip}] is blacklisted by ${zone}`;
99
- if (plugin.cfg.main.reject) return next(DENY, msg);
100
-
101
- connection.loginfo(plugin, msg);
102
- return next();
103
- }, function each_result (err, zone, a) {
104
- if (err) return;
105
- const result = a ? {fail: zone} : {pass: zone};
106
- connection.results.add(plugin, result);
107
- });
108
- }
109
-
110
- exports.connect_multi = function (next, connection) {
111
- const remote_ip = connection.remote.ip;
112
-
113
- if (this.should_skip(connection)) { return next(); }
114
-
115
- const hits = [];
116
- function get_deny_msg () {
117
- return `host [${remote_ip}] is blacklisted by ${hits.join(', ')}`;
118
- }
119
-
120
- this.multi(remote_ip, this.zones, (err, zone, a, pending) => {
121
- if (err) {
122
- connection.results.add(this, {err: err.message});
123
- if (pending) return;
124
- if (this.cfg.main.reject && hits.length) {
125
- return next(DENY, get_deny_msg());
126
- }
127
- return next();
128
- }
129
-
130
- if (a) {
131
- hits.push(zone);
132
- connection.results.add(this, {fail: zone});
133
- }
134
- else {
135
- if (zone) connection.results.add(this, {pass: zone});
136
- }
137
-
138
- if (pending) return;
139
- connection.results.add(this, {emit: true});
140
-
141
- if (this.cfg.main.reject && hits.length) {
142
- return next(DENY, get_deny_msg());
143
- }
144
- return next();
145
- });
146
- }
package/plugins/dnswl.js DELETED
@@ -1,58 +0,0 @@
1
- 'use strict';
2
- // dnswl plugin
3
-
4
- exports.register = function () {
5
- this.inherits('dns_list_base');
6
-
7
- this.load_dnswl_ini();
8
-
9
- // IMPORTANT: don't run this on hook_rcpt otherwise we're an open relay...
10
- ['ehlo','helo','mail'].forEach(hook => {
11
- this.register_hook(hook, 'check_dnswl');
12
- });
13
- }
14
-
15
- exports.load_dnswl_ini = function () {
16
- this.cfg = this.config.get('dnswl.ini', () => {
17
- this.load_dnswl_ini();
18
- });
19
-
20
- if (this.cfg.main.enable_stats) {
21
- this.logdebug('stats reporting enabled');
22
- this.enable_stats = true;
23
- }
24
-
25
- if (this.cfg.main.stats_redis_host) {
26
- this.redis_host = this.cfg.main.stats_redis_host;
27
- this.logdebug(`set stats redis host to: ${this.redis_host}`);
28
- }
29
-
30
- this.zones = [];
31
- // Compatibility with old-plugin
32
- this.zones = this.zones.concat(
33
- this.config.get('dnswl.zones', 'list')
34
- );
35
- if (this.cfg.main.zones) {
36
- this.zones = this.zones.concat(
37
- this.cfg.main.zones.replace(/\s+/g,'').split(/[;,]/));
38
- }
39
-
40
- if (this.cfg.main.periodic_checks) {
41
- this.check_zones(this.cfg.main.periodic_checks);
42
- }
43
- }
44
-
45
- exports.check_dnswl = (next, connection) => connection.notes.dnswl ? next(OK) : next()
46
-
47
- exports.hook_connect = function (next, connection) {
48
- if (!this.zones || !this.zones.length) {
49
- connection.logerror(this, 'no zones');
50
- return next();
51
- }
52
- this.first(connection.remote.ip, this.zones, (err, zone, a) => {
53
- if (!a) return next();
54
- connection.loginfo(this, `${connection.remote.ip} is whitelisted by ${zone}: ${a}`);
55
- connection.notes.dnswl = true;
56
- return next(OK);
57
- });
58
- }
package/plugins/esets.js DELETED
@@ -1,71 +0,0 @@
1
- // esets
2
- const fs = require('fs');
3
- const child_process = require('child_process');
4
- const virus_re = new RegExp('virus="([^"]+)"');
5
-
6
- exports.hook_data_post = function (next, connection) {
7
- const plugin = this;
8
- const cfg = this.config.get('esets.ini');
9
-
10
- // Write message to temporary file
11
- const tmpdir = cfg.main.tmpdir || '/tmp';
12
- const tmpfile = `${tmpdir}/${connection?.transaction?.uuid}.esets`;
13
- const ws = fs.createWriteStream(tmpfile);
14
-
15
- ws.once('error', err => {
16
- connection.logerror(plugin, `Error writing temporary file: ${err.message}`);
17
- next();
18
- });
19
-
20
- let start_time;
21
-
22
- function wsOnClose (error, stdout, stderr) {
23
- // Remove the temporary file
24
- fs.unlink(tmpfile, () => {});
25
-
26
- // Timing
27
- const end_time = Date.now();
28
- const elapsed = end_time - start_time;
29
-
30
- // Debugging
31
- [stdout, stderr].forEach(channel => {
32
- if (channel) {
33
- const lines = channel.split('\n');
34
- for (const line of lines) {
35
- if (line) connection.logdebug(plugin, `recv: ${line}`);
36
- }
37
- }
38
- });
39
-
40
- // Get virus name
41
- let virus = virus_re.exec(stdout)
42
- if (virus) virus = virus[1];
43
-
44
- // Log a summary
45
- const exit_code = parseInt((error) ? error.code : 0)
46
- connection.loginfo(plugin, `elapsed=${elapsed}ms code=${exit_code
47
- }${exit_code === 0 || (exit_code > 1 && exit_code < 4)
48
- ? ` virus="${virus}"`
49
- : ` error="${(stdout || stderr || 'UNKNOWN').replace('\n',' ').trim()}"`}`);
50
-
51
- // esets_cli returns non-zero exit on virus/error
52
- if (exit_code) {
53
- if (exit_code > 1 && exit_code < 4) {
54
- return next(DENY, `Message is infected with ${virus || 'UNKNOWN'}`);
55
- }
56
- else {
57
- return next(DENYSOFT, 'Virus scanner error');
58
- }
59
- }
60
- next();
61
- }
62
-
63
- ws.once('close', () => {
64
- start_time = Date.now();
65
- child_process.exec(`LANG=C /opt/eset/esets/bin/esets_cli ${tmpfile}`,
66
- { encoding: 'utf8', timeout: 30 * 1000 },
67
- wsOnClose);
68
- });
69
-
70
- connection.transaction.message_stream.pipe(ws, { line_endings: '\r\n' });
71
- }
package/plugins/graph.js DELETED
@@ -1,5 +0,0 @@
1
- 'use strict';
2
-
3
- exports.register = function () {
4
- this.logerror('This plugin has moved. See https://github.com/haraka/haraka-plugin-graph');
5
- }