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
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
- }