Haraka 3.0.3 → 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 (238) hide show
  1. package/.eslintrc.yaml +5 -9
  2. package/.prettierrc.yml +1 -0
  3. package/CONTRIBUTORS.md +11 -0
  4. package/Changes.md +1365 -1214
  5. package/Plugins.md +117 -105
  6. package/README.md +4 -13
  7. package/bin/haraka +197 -298
  8. package/config/auth_flat_file.ini +1 -0
  9. package/config/dhparams.pem +8 -0
  10. package/config/mail_from.is_resolvable.ini +4 -2
  11. package/config/me +1 -0
  12. package/config/outbound.ini +0 -2
  13. package/config/plugins +36 -35
  14. package/config/smtp.ini +0 -1
  15. package/config/smtp.json +17 -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 +29 -9
  28. package/endpoint.js +16 -13
  29. package/haraka.js +10 -14
  30. package/host_pool.js +5 -5
  31. package/line_socket.js +3 -4
  32. package/logger.js +44 -28
  33. package/outbound/client_pool.js +27 -23
  34. package/outbound/config.js +4 -6
  35. package/outbound/fsync_writestream.js +1 -1
  36. package/outbound/hmail.js +178 -218
  37. package/outbound/index.js +86 -99
  38. package/outbound/qfile.js +1 -1
  39. package/outbound/queue.js +51 -44
  40. package/outbound/timer_queue.js +3 -2
  41. package/outbound/tls.js +19 -7
  42. package/package.json +59 -48
  43. package/plugins/.eslintrc.yaml +0 -6
  44. package/plugins/auth/auth_base.js +4 -2
  45. package/plugins/auth/auth_proxy.js +14 -12
  46. package/plugins/auth/auth_vpopmaild.js +1 -1
  47. package/plugins/block_me.js +1 -1
  48. package/plugins/data.signatures.js +2 -4
  49. package/plugins/early_talker.js +2 -1
  50. package/plugins/mail_from.is_resolvable.js +65 -135
  51. package/plugins/queue/deliver.js +4 -5
  52. package/plugins/queue/lmtp.js +11 -14
  53. package/plugins/queue/qmail-queue.js +2 -2
  54. package/plugins/queue/quarantine.js +2 -2
  55. package/plugins/queue/rabbitmq.js +16 -17
  56. package/plugins/queue/smtp_forward.js +3 -3
  57. package/plugins/queue/smtp_proxy.js +10 -1
  58. package/plugins/queue/test.js +2 -2
  59. package/plugins/rcpt_to.host_list_base.js +5 -5
  60. package/plugins/rcpt_to.in_host_list.js +2 -2
  61. package/plugins/relay.js +6 -7
  62. package/plugins/reseed_rng.js +1 -1
  63. package/plugins/status.js +37 -33
  64. package/plugins/tls.js +2 -2
  65. package/plugins/xclient.js +3 -2
  66. package/plugins.js +50 -54
  67. package/run_tests +3 -30
  68. package/server.js +190 -190
  69. package/smtp_client.js +30 -23
  70. package/{tests → test}/config/plugins +0 -2
  71. package/{tests → test}/config/smtp.ini +1 -1
  72. package/test/config/tls/example.com/_.example.com.key +28 -0
  73. package/test/config/tls/example.com/example.com.crt +25 -0
  74. package/test/connection.js +302 -0
  75. package/test/endpoint.js +94 -0
  76. package/{tests → test}/fixtures/line_socket.js +1 -1
  77. package/{tests → test}/fixtures/util_hmailitem.js +19 -25
  78. package/{tests → test}/host_pool.js +42 -57
  79. package/test/logger.js +258 -0
  80. package/test/outbound/hmail.js +141 -0
  81. package/test/outbound/index.js +220 -0
  82. package/test/outbound/qfile.js +126 -0
  83. package/test/outbound_bounce_net_errors.js +142 -0
  84. package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
  85. package/test/plugins/auth/auth_base.js +484 -0
  86. package/test/plugins/auth/auth_vpopmaild.js +83 -0
  87. package/test/plugins/early_talker.js +104 -0
  88. package/test/plugins/mail_from.is_resolvable.js +35 -0
  89. package/test/plugins/queue/smtp_forward.js +206 -0
  90. package/test/plugins/rcpt_to.host_list_base.js +122 -0
  91. package/test/plugins/rcpt_to.in_host_list.js +193 -0
  92. package/test/plugins/relay.js +303 -0
  93. package/test/plugins/status.js +130 -0
  94. package/test/plugins/tls.js +70 -0
  95. package/test/plugins.js +228 -0
  96. package/test/rfc1869.js +73 -0
  97. package/test/server.js +491 -0
  98. package/test/smtp_client.js +299 -0
  99. package/test/tls_socket.js +273 -0
  100. package/test/transaction.js +270 -0
  101. package/tls_socket.js +202 -252
  102. package/transaction.js +8 -23
  103. package/CONTRIBUTING.md +0 -1
  104. package/bin/dkimverify +0 -40
  105. package/config/access.domains +0 -13
  106. package/config/attachment.ctype.regex +0 -2
  107. package/config/attachment.filename.regex +0 -1
  108. package/config/avg.ini +0 -5
  109. package/config/bounce.ini +0 -15
  110. package/config/data.headers.ini +0 -61
  111. package/config/dkim/dkim_key_gen.sh +0 -78
  112. package/config/dkim_sign.ini +0 -4
  113. package/config/dkim_verify.ini +0 -7
  114. package/config/dnsbl.ini +0 -23
  115. package/config/greylist.ini +0 -43
  116. package/config/helo.checks.ini +0 -52
  117. package/config/messagesniffer.ini +0 -18
  118. package/config/spamassassin.ini +0 -56
  119. package/dkim.js +0 -614
  120. package/docs/plugins/avg.md +0 -35
  121. package/docs/plugins/bounce.md +0 -69
  122. package/docs/plugins/clamd.md +0 -147
  123. package/docs/plugins/esets.md +0 -8
  124. package/docs/plugins/greylist.md +0 -90
  125. package/docs/plugins/helo.checks.md +0 -135
  126. package/docs/plugins/messagesniffer.md +0 -163
  127. package/docs/plugins/spamassassin.md +0 -180
  128. package/outbound/mx_lookup.js +0 -70
  129. package/plugins/auth/auth_ldap.js +0 -3
  130. package/plugins/avg.js +0 -162
  131. package/plugins/backscatterer.js +0 -25
  132. package/plugins/bounce.js +0 -381
  133. package/plugins/clamd.js +0 -382
  134. package/plugins/data.uribl.js +0 -4
  135. package/plugins/dkim_sign.js +0 -395
  136. package/plugins/dkim_verify.js +0 -62
  137. package/plugins/dns_list_base.js +0 -221
  138. package/plugins/dnsbl.js +0 -146
  139. package/plugins/dnswl.js +0 -58
  140. package/plugins/esets.js +0 -71
  141. package/plugins/graph.js +0 -5
  142. package/plugins/greylist.js +0 -645
  143. package/plugins/helo.checks.js +0 -533
  144. package/plugins/messagesniffer.js +0 -381
  145. package/plugins/rcpt_to.ldap.js +0 -3
  146. package/plugins/rcpt_to.max_count.js +0 -24
  147. package/plugins/spamassassin.js +0 -384
  148. package/tests/config/dkim/example.com/dns +0 -29
  149. package/tests/config/dkim/example.com/private +0 -6
  150. package/tests/config/dkim/example.com/public +0 -4
  151. package/tests/config/dkim/example.com/selector +0 -1
  152. package/tests/config/dkim.private.key +0 -6
  153. package/tests/config/dkim_sign.ini +0 -4
  154. package/tests/config/helo.checks.ini +0 -52
  155. package/tests/connection.js +0 -327
  156. package/tests/endpoint.js +0 -128
  157. package/tests/fixtures/vm_harness.js +0 -59
  158. package/tests/logger.js +0 -327
  159. package/tests/outbound/hmail.js +0 -112
  160. package/tests/outbound/index.js +0 -324
  161. package/tests/outbound/qfile.js +0 -67
  162. package/tests/outbound_bounce_net_errors.js +0 -173
  163. package/tests/plugins/auth/auth_base.js +0 -463
  164. package/tests/plugins/auth/auth_vpopmaild.js +0 -91
  165. package/tests/plugins/bounce.js +0 -307
  166. package/tests/plugins/clamd.js +0 -224
  167. package/tests/plugins/deprecated/relay_acl.js +0 -140
  168. package/tests/plugins/deprecated/relay_all.js +0 -59
  169. package/tests/plugins/dkim_sign.js +0 -315
  170. package/tests/plugins/dkim_signer.js +0 -108
  171. package/tests/plugins/dns_list_base.js +0 -259
  172. package/tests/plugins/dnsbl.js +0 -101
  173. package/tests/plugins/early_talker.js +0 -115
  174. package/tests/plugins/greylist.js +0 -58
  175. package/tests/plugins/helo.checks.js +0 -525
  176. package/tests/plugins/mail_from.is_resolvable.js +0 -116
  177. package/tests/plugins/queue/smtp_forward.js +0 -221
  178. package/tests/plugins/rcpt_to.host_list_base.js +0 -132
  179. package/tests/plugins/rcpt_to.in_host_list.js +0 -218
  180. package/tests/plugins/relay.js +0 -339
  181. package/tests/plugins/spamassassin.js +0 -171
  182. package/tests/plugins/status.js +0 -138
  183. package/tests/plugins/tls.js +0 -84
  184. package/tests/plugins.js +0 -247
  185. package/tests/rfc1869.js +0 -61
  186. package/tests/server.js +0 -510
  187. package/tests/smtp_client/auth.js +0 -105
  188. package/tests/smtp_client/basic.js +0 -101
  189. package/tests/smtp_client.js +0 -80
  190. package/tests/tls_socket.js +0 -333
  191. package/tests/transaction.js +0 -284
  192. /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
  193. /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
  194. /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
  195. /package/docs/{plugins → deprecated}/dnswl.md +0 -0
  196. /package/{tests → test}/.eslintrc.yaml +0 -0
  197. /package/{tests → test}/config/auth_flat_file.ini +0 -0
  198. /package/{tests → test}/config/dhparams.pem +0 -0
  199. /package/{tests → test}/config/host_list +0 -0
  200. /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
  201. /package/{tests → test}/config/outbound_tls_key.pem +0 -0
  202. /package/{tests → test}/config/smtp_forward.ini +0 -0
  203. /package/{tests → test}/config/tls/ec.pem +0 -0
  204. /package/{tests → test}/config/tls/haraka.local.pem +0 -0
  205. /package/{tests → test}/config/tls/mismatched.pem +0 -0
  206. /package/{tests → test}/config/tls.ini +0 -0
  207. /package/{tests → test}/config/tls_cert.pem +0 -0
  208. /package/{tests → test}/config/tls_key.pem +0 -0
  209. /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
  210. /package/{tests → test}/installation/config/test-plugin-flat +0 -0
  211. /package/{tests → test}/installation/config/test-plugin.ini +0 -0
  212. /package/{tests → test}/installation/config/tls.ini +0 -0
  213. /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
  214. /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
  215. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
  216. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
  217. /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
  218. /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
  219. /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
  220. /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
  221. /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
  222. /package/{tests → test}/installation/plugins/inherits.js +0 -0
  223. /package/{tests → test}/installation/plugins/load_first.js +0 -0
  224. /package/{tests → test}/installation/plugins/plugin.js +0 -0
  225. /package/{tests → test}/installation/plugins/tls.js +0 -0
  226. /package/{tests → test}/loud/config/dhparams.pem +0 -0
  227. /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
  228. /package/{tests → test}/loud/config/tls.ini +0 -0
  229. /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
  230. /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
  231. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
  232. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
  233. /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
  234. /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
  235. /package/{tests → test}/queue/multibyte +0 -0
  236. /package/{tests → test}/queue/plain +0 -0
  237. /package/{tests → test}/queue/zero-length +0 -0
  238. /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
- }