Haraka 3.1.1 → 3.1.3

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 (168) hide show
  1. package/.prettierignore +4 -0
  2. package/CONTRIBUTORS.md +5 -5
  3. package/Changes.md +72 -50
  4. package/Plugins.md +3 -1
  5. package/README.md +1 -1
  6. package/bin/haraka +475 -479
  7. package/config/connection.ini +10 -0
  8. package/config/outbound.ini +3 -0
  9. package/config/smtp.ini +0 -9
  10. package/connection.js +1072 -1108
  11. package/docs/Connection.md +29 -30
  12. package/docs/CoreConfig.md +38 -40
  13. package/docs/CustomReturnCodes.md +0 -1
  14. package/docs/HAProxy.md +2 -2
  15. package/docs/Header.md +1 -1
  16. package/docs/Logging.md +29 -5
  17. package/docs/Outbound.md +93 -78
  18. package/docs/Plugins.md +103 -108
  19. package/docs/Transaction.md +49 -51
  20. package/docs/Tutorial.md +127 -143
  21. package/docs/deprecated/access.md +0 -1
  22. package/docs/deprecated/backscatterer.md +2 -3
  23. package/docs/deprecated/connect.rdns_access.md +18 -27
  24. package/docs/deprecated/data.headers.md +0 -1
  25. package/docs/deprecated/data.nomsgid.md +1 -2
  26. package/docs/deprecated/data.noreceived.md +1 -2
  27. package/docs/deprecated/data.rfc5322_header_checks.md +1 -2
  28. package/docs/deprecated/dkim_sign.md +13 -17
  29. package/docs/deprecated/dkim_verify.md +9 -17
  30. package/docs/deprecated/dnsbl.md +36 -38
  31. package/docs/deprecated/dnswl.md +41 -43
  32. package/docs/deprecated/lookup_rdns.strict.md +21 -34
  33. package/docs/deprecated/mail_from.access.md +17 -25
  34. package/docs/deprecated/mail_from.blocklist.md +9 -12
  35. package/docs/deprecated/mail_from.nobounces.md +1 -2
  36. package/docs/deprecated/rcpt_to.access.md +20 -27
  37. package/docs/deprecated/rcpt_to.blocklist.md +10 -13
  38. package/docs/deprecated/rcpt_to.routes.md +0 -1
  39. package/docs/deprecated/rdns.regexp.md +13 -15
  40. package/docs/plugins/aliases.md +89 -89
  41. package/docs/plugins/auth/auth_bridge.md +5 -7
  42. package/docs/plugins/auth/auth_ldap.md +11 -14
  43. package/docs/plugins/auth/auth_proxy.md +10 -12
  44. package/docs/plugins/auth/auth_vpopmaild.md +5 -6
  45. package/docs/plugins/auth/flat_file.md +4 -4
  46. package/docs/plugins/block_me.md +3 -3
  47. package/docs/plugins/data.signatures.md +1 -2
  48. package/docs/plugins/delay_deny.md +3 -4
  49. package/docs/plugins/max_unrecognized_commands.md +4 -4
  50. package/docs/plugins/prevent_credential_leaks.md +6 -6
  51. package/docs/plugins/process_title.md +18 -18
  52. package/docs/plugins/queue/deliver.md +2 -3
  53. package/docs/plugins/queue/discard.md +4 -4
  54. package/docs/plugins/queue/lmtp.md +1 -3
  55. package/docs/plugins/queue/qmail-queue.md +7 -9
  56. package/docs/plugins/queue/quarantine.md +16 -21
  57. package/docs/plugins/queue/rabbitmq.md +8 -11
  58. package/docs/plugins/queue/rabbitmq_amqplib.md +43 -39
  59. package/docs/plugins/queue/smtp_bridge.md +7 -10
  60. package/docs/plugins/queue/smtp_forward.md +42 -34
  61. package/docs/plugins/queue/smtp_proxy.md +30 -29
  62. package/docs/plugins/queue/test.md +1 -3
  63. package/docs/plugins/rcpt_to.in_host_list.md +6 -6
  64. package/docs/plugins/rcpt_to.max_count.md +1 -1
  65. package/docs/plugins/record_envelope_addresses.md +3 -3
  66. package/docs/plugins/reseed_rng.md +6 -6
  67. package/docs/plugins/status.md +9 -8
  68. package/docs/plugins/tarpit.md +7 -11
  69. package/docs/plugins/tls.md +12 -17
  70. package/docs/plugins/toobusy.md +4 -4
  71. package/docs/plugins/xclient.md +3 -3
  72. package/docs/tutorials/Migrating_from_v1_to_v2.md +19 -41
  73. package/docs/tutorials/SettingUpOutbound.md +6 -9
  74. package/endpoint.js +35 -38
  75. package/eslint.config.mjs +22 -19
  76. package/haraka.js +42 -47
  77. package/host_pool.js +75 -79
  78. package/http/html/404.html +45 -49
  79. package/http/html/index.html +39 -28
  80. package/http/package.json +2 -4
  81. package/line_socket.js +27 -28
  82. package/logger.js +182 -201
  83. package/outbound/client_pool.js +33 -33
  84. package/outbound/config.js +64 -59
  85. package/outbound/fsync_writestream.js +24 -25
  86. package/outbound/hmail.js +888 -835
  87. package/outbound/index.js +194 -187
  88. package/outbound/qfile.js +49 -52
  89. package/outbound/queue.js +197 -190
  90. package/outbound/timer_queue.js +41 -43
  91. package/outbound/tls.js +68 -61
  92. package/outbound/todo.js +11 -11
  93. package/package.json +35 -36
  94. package/plugins/.eslintrc.yaml +0 -1
  95. package/plugins/auth/auth_base.js +123 -127
  96. package/plugins/auth/auth_bridge.js +7 -7
  97. package/plugins/auth/auth_proxy.js +121 -126
  98. package/plugins/auth/auth_vpopmaild.js +84 -85
  99. package/plugins/auth/flat_file.js +18 -17
  100. package/plugins/block_me.js +31 -31
  101. package/plugins/data.signatures.js +13 -13
  102. package/plugins/delay_deny.js +65 -61
  103. package/plugins/prevent_credential_leaks.js +23 -23
  104. package/plugins/process_title.js +125 -128
  105. package/plugins/profile.js +5 -5
  106. package/plugins/queue/deliver.js +3 -3
  107. package/plugins/queue/discard.js +13 -14
  108. package/plugins/queue/lmtp.js +16 -17
  109. package/plugins/queue/qmail-queue.js +54 -55
  110. package/plugins/queue/quarantine.js +68 -70
  111. package/plugins/queue/rabbitmq.js +80 -87
  112. package/plugins/queue/rabbitmq_amqplib.js +75 -54
  113. package/plugins/queue/smtp_bridge.js +16 -16
  114. package/plugins/queue/smtp_forward.js +175 -179
  115. package/plugins/queue/smtp_proxy.js +69 -71
  116. package/plugins/queue/test.js +9 -9
  117. package/plugins/rcpt_to.host_list_base.js +30 -34
  118. package/plugins/rcpt_to.in_host_list.js +19 -19
  119. package/plugins/record_envelope_addresses.js +4 -4
  120. package/plugins/reseed_rng.js +4 -4
  121. package/plugins/status.js +90 -97
  122. package/plugins/tarpit.js +25 -14
  123. package/plugins/tls.js +68 -68
  124. package/plugins/toobusy.js +21 -23
  125. package/plugins/xclient.js +51 -53
  126. package/plugins.js +276 -293
  127. package/rfc1869.js +30 -35
  128. package/server.js +308 -299
  129. package/smtp_client.js +244 -228
  130. package/test/.eslintrc.yaml +0 -1
  131. package/test/connection.js +127 -134
  132. package/test/endpoint.js +53 -47
  133. package/test/fixtures/line_socket.js +12 -12
  134. package/test/fixtures/util_hmailitem.js +89 -85
  135. package/test/host_pool.js +90 -92
  136. package/test/installation/plugins/base_plugin.js +2 -2
  137. package/test/installation/plugins/folder_plugin/index.js +2 -3
  138. package/test/installation/plugins/inherits.js +3 -3
  139. package/test/installation/plugins/load_first.js +2 -3
  140. package/test/installation/plugins/plugin.js +1 -3
  141. package/test/installation/plugins/tls.js +2 -4
  142. package/test/logger.js +135 -116
  143. package/test/outbound/hmail.js +49 -35
  144. package/test/outbound/index.js +118 -101
  145. package/test/outbound/qfile.js +51 -53
  146. package/test/outbound_bounce_net_errors.js +84 -69
  147. package/test/outbound_bounce_rfc3464.js +235 -165
  148. package/test/plugins/auth/auth_base.js +420 -279
  149. package/test/plugins/auth/auth_vpopmaild.js +38 -39
  150. package/test/plugins/queue/smtp_forward.js +126 -104
  151. package/test/plugins/rcpt_to.host_list_base.js +85 -67
  152. package/test/plugins/rcpt_to.in_host_list.js +159 -112
  153. package/test/plugins/status.js +71 -64
  154. package/test/plugins/tls.js +37 -34
  155. package/test/plugins.js +97 -92
  156. package/test/rfc1869.js +19 -26
  157. package/test/server.js +293 -272
  158. package/test/smtp_client.js +180 -176
  159. package/test/tls_socket.js +62 -66
  160. package/test/transaction.js +159 -160
  161. package/tls_socket.js +331 -333
  162. package/transaction.js +129 -137
  163. package/config/me +0 -1
  164. package/config/tls_cert.pem +0 -23
  165. package/config/tls_key.pem +0 -28
  166. package/test/queue/multibyte +0 -0
  167. package/test/queue/plain +0 -0
  168. package/test/test-queue/delete-me +0 -0
package/outbound/tls.js CHANGED
@@ -1,119 +1,126 @@
1
- 'use strict';
1
+ 'use strict'
2
2
 
3
- const net = require('node:net')
3
+ const net = require('node:net')
4
4
 
5
- const config = require('haraka-config');
6
- const hkredis = require('haraka-plugin-redis');
5
+ const config = require('haraka-config')
6
+ const hkredis = require('haraka-plugin-redis')
7
7
 
8
- const logger = require('../logger');
9
- const tls_socket = require('../tls_socket');
8
+ const logger = require('../logger')
9
+ const tls_socket = require('../tls_socket')
10
10
 
11
11
  const inheritable_opts = [
12
- 'key', 'cert', 'ciphers', 'minVersion', 'dhparam',
13
- 'requestCert', 'honorCipherOrder', 'rejectUnauthorized',
14
- 'force_tls_hosts'
15
- ];
12
+ 'key',
13
+ 'cert',
14
+ 'ciphers',
15
+ 'minVersion',
16
+ 'dhparam',
17
+ 'requestCert',
18
+ 'honorCipherOrder',
19
+ 'rejectUnauthorized',
20
+ 'force_tls_hosts',
21
+ ]
16
22
 
17
23
  class OutboundTLS {
18
- constructor () {
19
- this.config = config;
20
- this.name = 'OutboundTLS';
21
- logger.add_log_methods(this);
24
+ constructor() {
25
+ this.config = config
26
+ this.name = 'OutboundTLS'
27
+ logger.add_log_methods(this)
22
28
  }
23
29
 
24
- test_config (tls_config, our_config) {
25
- tls_socket.config = tls_config;
26
- this.config = our_config;
30
+ test_config(tls_config, our_config) {
31
+ tls_socket.config = tls_config
32
+ this.config = our_config
27
33
  }
28
34
 
29
- load_config () {
30
- const tls_cfg = tls_socket.load_tls_ini({role: 'client'});
31
- const cfg = JSON.parse(JSON.stringify(tls_cfg.outbound || {}));
32
- cfg.redis = tls_cfg.redis; // Don't clone - contains methods
35
+ load_config() {
36
+ const tls_cfg = tls_socket.load_tls_ini({ role: 'client' })
37
+ const cfg = JSON.parse(JSON.stringify(tls_cfg.outbound || {}))
38
+ cfg.redis = tls_cfg.redis // Don't clone - contains methods
33
39
 
34
40
  for (const opt of inheritable_opts) {
35
- if (cfg[opt] !== undefined) continue; // option set in [outbound]
36
- if (tls_cfg.main[opt] === undefined) continue; // opt unset in tls.ini[main]
37
- cfg[opt] = tls_cfg.main[opt]; // use value from [main] section
41
+ if (cfg[opt] !== undefined) continue // option set in [outbound]
42
+ if (tls_cfg.main[opt] === undefined) continue // opt unset in tls.ini[main]
43
+ cfg[opt] = tls_cfg.main[opt] // use value from [main] section
38
44
  }
39
45
 
40
46
  if (cfg.key) {
41
47
  if (Array.isArray(cfg.key)) {
42
- cfg.key = cfg.key[0];
48
+ cfg.key = cfg.key[0]
43
49
  }
44
- cfg.key = this.config.get(cfg.key, 'binary');
50
+ cfg.key = this.config.get(cfg.key, 'binary')
45
51
  }
46
52
 
47
53
  if (cfg.dhparam) {
48
- cfg.dhparam = this.config.get(cfg.dhparam, 'binary');
54
+ cfg.dhparam = this.config.get(cfg.dhparam, 'binary')
49
55
  }
50
56
 
51
57
  if (cfg.cert) {
52
58
  if (Array.isArray(cfg.cert)) {
53
- cfg.cert = cfg.cert[0];
59
+ cfg.cert = cfg.cert[0]
54
60
  }
55
- cfg.cert = this.config.get(cfg.cert, 'binary');
61
+ cfg.cert = this.config.get(cfg.cert, 'binary')
56
62
  }
57
63
 
58
- if (!cfg.no_tls_hosts) cfg.no_tls_hosts = [];
59
- if (!cfg.force_tls_hosts) cfg.force_tls_hosts = [];
64
+ if (!cfg.no_tls_hosts) cfg.no_tls_hosts = []
65
+ if (!cfg.force_tls_hosts) cfg.force_tls_hosts = []
60
66
 
61
- this.cfg = cfg;
67
+ this.cfg = cfg
62
68
  }
63
69
 
64
- init (cb) {
65
- this.load_config();
70
+ init(cb) {
71
+ this.load_config()
66
72
  // changing this var in-flight won't work
67
- if (this.cfg.redis && !this.cfg.redis.disable_for_failed_hosts) return cb();
68
- logger.debug(this, 'Will disable outbound TLS for failing TLS hosts');
69
- Object.assign(this, hkredis);
70
- this.merge_redis_ini();
71
- this.init_redis_plugin(cb);
73
+ if (this.cfg.redis && !this.cfg.redis.disable_for_failed_hosts) return cb()
74
+ logger.debug(this, 'Will disable outbound TLS for failing TLS hosts')
75
+ Object.assign(this, hkredis)
76
+ this.merge_redis_ini()
77
+ this.init_redis_plugin(cb)
72
78
  }
73
79
 
74
- get_tls_options (mx) {
80
+ get_tls_options(mx) {
75
81
  // do NOT set servername to an IP address
76
82
  if (net.isIP(mx.exchange)) {
77
83
  // when mx.exchange looked up in DNS, from_dns has the hostname
78
84
  if (mx.from_dns) return { ...this.cfg, servername: mx.from_dns }
79
85
  return { ...this.cfg }
80
- }
81
- else {
86
+ } else {
82
87
  // mx.exchange is a hostname
83
88
  return { ...this.cfg, servername: mx.exchange }
84
89
  }
85
90
  }
86
91
 
87
92
  // Check for if host is prohibited from TLS negotiation
88
- check_tls_nogo (host, cb_ok, cb_nogo) {
89
- if (!this.cfg.redis.disable_for_failed_hosts) return cb_ok();
90
-
91
- const dbkey = `no_tls|${host}`;
92
- this.db.get(dbkey)
93
- .then(dbr => {
94
- dbr ? cb_nogo(dbr) : cb_ok();
93
+ check_tls_nogo(host, cb_ok, cb_nogo) {
94
+ if (!this.cfg.redis.disable_for_failed_hosts) return cb_ok()
95
+
96
+ const dbkey = `no_tls|${host}`
97
+ this.db
98
+ .get(dbkey)
99
+ .then((dbr) => {
100
+ dbr ? cb_nogo(dbr) : cb_ok()
95
101
  })
96
- .catch(err => {
97
- logger.debug(this, `Redis returned error: ${err}`);
98
- cb_ok();
102
+ .catch((err) => {
103
+ logger.debug(this, `Redis returned error: ${err}`)
104
+ cb_ok()
99
105
  })
100
106
  }
101
107
 
102
- mark_tls_nogo (host, cb) {
103
- const dbkey = `no_tls|${host}`;
104
- const expiry = this.cfg.redis.disable_expiry || 604800;
108
+ mark_tls_nogo(host, cb) {
109
+ const dbkey = `no_tls|${host}`
110
+ const expiry = this.cfg.redis.disable_expiry || 604800
105
111
 
106
- if (!this.cfg.redis.disable_for_failed_hosts) return cb();
112
+ if (!this.cfg.redis.disable_for_failed_hosts) return cb()
107
113
 
108
- logger.notice(this, `TLS connection failed. Marking ${host} as non-TLS for ${expiry} seconds`);
114
+ logger.notice(this, `TLS connection failed. Marking ${host} as non-TLS for ${expiry} seconds`)
109
115
 
110
- this.db.setEx(dbkey, expiry, (new Date()).toISOString())
116
+ this.db
117
+ .setEx(dbkey, expiry, new Date().toISOString())
111
118
  .then(cb)
112
- .catch(err => {
113
- logger.error(this, `Redis returned error: ${err}`);
119
+ .catch((err) => {
120
+ logger.error(this, `Redis returned error: ${err}`)
114
121
  })
115
122
  }
116
123
  }
117
124
 
118
125
  // this is a singleton
119
- module.exports = new OutboundTLS();
126
+ module.exports = new OutboundTLS()
package/outbound/todo.js CHANGED
@@ -1,17 +1,17 @@
1
- 'use strict';
1
+ 'use strict'
2
2
 
3
3
  // queue file header data
4
4
  class TODOItem {
5
- constructor (domain, recipients, transaction) {
6
- this.queue_time = Date.now();
7
- this.domain = domain;
8
- this.rcpt_to = recipients;
9
- this.mail_from = transaction.mail_from;
10
- this.message_stream = transaction.message_stream;
11
- this.notes = transaction.notes;
12
- this.uuid = transaction.uuid;
13
- this.force_tls = false;
5
+ constructor(domain, recipients, transaction) {
6
+ this.queue_time = Date.now()
7
+ this.domain = domain
8
+ this.rcpt_to = recipients
9
+ this.mail_from = transaction.mail_from
10
+ this.message_stream = transaction.message_stream
11
+ this.notes = transaction.notes
12
+ this.uuid = transaction.uuid
13
+ this.force_tls = false
14
14
  }
15
15
  }
16
16
 
17
- module.exports = TODOItem;
17
+ module.exports = TODOItem
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "server",
10
10
  "email"
11
11
  ],
12
- "version": "3.1.1",
12
+ "version": "3.1.3",
13
13
  "homepage": "http://haraka.github.io",
14
14
  "repository": {
15
15
  "type": "git",
@@ -17,30 +17,30 @@
17
17
  },
18
18
  "main": "haraka.js",
19
19
  "engines": {
20
- "node": ">=18"
20
+ "node": ">=20"
21
21
  },
22
22
  "dependencies": {
23
- "address-rfc2821": "^2.1.3",
23
+ "address-rfc2821": "^2.1.4",
24
24
  "address-rfc2822": "^2.2.3",
25
25
  "async": "^3.2.6",
26
26
  "daemon": "~1.1.0",
27
27
  "haraka-config": "^1.4.2",
28
28
  "haraka-constants": "^1.0.7",
29
29
  "haraka-dsn": "^1.1.0",
30
- "haraka-email-message": "^1.2.5",
31
- "haraka-message-stream": "^1.2.3",
30
+ "haraka-email-message": "^1.2.6",
31
+ "haraka-message-stream": "^1.3.2",
32
32
  "haraka-net-utils": "^1.7.2",
33
33
  "haraka-notes": "^1.1.1",
34
- "haraka-plugin-redis": "^2.0.9",
35
- "haraka-results": "^2.2.5",
36
- "haraka-tld": "^1.2.3",
34
+ "haraka-plugin-redis": "^2.0.11",
35
+ "haraka-results": "^2.2.6",
36
+ "haraka-tld": "^1.3.0",
37
37
  "haraka-utils": "^1.1.4",
38
- "ipaddr.js": "~2.2.0",
39
- "node-gyp": "^11.1.0",
40
- "nopt": "^8.1.0",
38
+ "ipaddr.js": "~2.3.0",
39
+ "node-gyp": "^12.2.0",
40
+ "nopt": "^9.0.0",
41
41
  "npid": "~0.4.0",
42
- "redis": "~4.7.0",
43
- "semver": "^7.7.1",
42
+ "redis": "~5.10.0",
43
+ "semver": "^7.7.4",
44
44
  "sockaddr": "^1.0.1",
45
45
  "sprintf-js": "~1.1.3"
46
46
  },
@@ -48,46 +48,44 @@
48
48
  "haraka-plugin-access": "^1.1.10",
49
49
  "haraka-plugin-aliases": "^1.0.3",
50
50
  "haraka-plugin-asn": "^2.0.5",
51
- "haraka-plugin-attachment": "^1.1.4",
51
+ "haraka-plugin-attachment": "^1.1.5",
52
52
  "haraka-plugin-avg": "^1.1.0",
53
- "haraka-plugin-bounce": "1.0.4",
54
- "haraka-plugin-clamd": "1.0.2",
53
+ "haraka-plugin-bounce": "^2.1.1",
54
+ "haraka-plugin-clamd": "^1.0.2",
55
55
  "haraka-plugin-dcc": "^1.0.3",
56
56
  "haraka-plugin-dkim": "^1.0.11",
57
- "haraka-plugin-dns-list": "^1.2.3",
57
+ "haraka-plugin-dns-list": "^1.2.4",
58
58
  "haraka-plugin-early_talker": "^1.0.2",
59
- "haraka-plugin-elasticsearch": "^8.1.2",
59
+ "haraka-plugin-elasticsearch": "^8.1.5",
60
60
  "haraka-plugin-esets": "^1.0.1",
61
- "haraka-plugin-fcrdns": "^1.1.1",
61
+ "haraka-plugin-fcrdns": "^1.1.2",
62
62
  "haraka-plugin-geoip": "^1.1.1",
63
- "haraka-plugin-graph": "^1.0.5",
64
63
  "haraka-plugin-greylist": "^1.0.1",
65
- "haraka-plugin-headers": "^1.0.6",
66
- "haraka-plugin-helo.checks": "^1.0.3",
67
- "haraka-plugin-karma": "^2.1.7",
68
- "haraka-plugin-known-senders": "^1.1.2",
69
- "haraka-plugin-limit": "^1.2.6",
70
- "haraka-plugin-mail_from.is_resolvable": "^1.0.3",
64
+ "haraka-plugin-headers": "^1.1.0",
65
+ "haraka-plugin-helo.checks": "^1.1.0",
66
+ "haraka-plugin-karma": "^2.1.8",
67
+ "haraka-plugin-known-senders": "^1.1.3",
68
+ "haraka-plugin-limit": "^1.2.7",
69
+ "haraka-plugin-mail_from.is_resolvable": "^1.1.0",
71
70
  "haraka-plugin-messagesniffer": "^1.0.1",
72
71
  "haraka-plugin-p0f": "^1.0.11",
73
72
  "haraka-plugin-qmail-deliverable": "^1.2.5",
74
- "haraka-plugin-recipient-routes": "^1.2.2",
73
+ "haraka-plugin-recipient-routes": "^1.3.1",
75
74
  "haraka-plugin-relay": "^1.0.1",
76
- "haraka-plugin-rspamd": "^1.3.2",
75
+ "haraka-plugin-rspamd": "^1.4.2",
77
76
  "haraka-plugin-spamassassin": "^1.0.3",
78
- "haraka-plugin-spf": "1.2.9",
77
+ "haraka-plugin-spf": "^1.2.10",
79
78
  "haraka-plugin-syslog": "^1.0.7",
80
79
  "haraka-plugin-uribl": "^1.0.10",
81
80
  "haraka-plugin-watch": "^2.0.8",
82
- "@techteamer/ocsp": "^1.0.1",
83
- "tmp": "~0.2.3"
81
+ "@techteamer/ocsp": "^1.0.1"
84
82
  },
85
83
  "devDependencies": {
86
- "@haraka/eslint-config": "^2.0.2",
87
- "haraka-test-fixtures": "^1.3.9",
88
- "mocha": "^11.1.0",
84
+ "@haraka/eslint-config": "^2.0.3",
85
+ "haraka-test-fixtures": "^1.3.10",
86
+ "mocha": "^11.7.5",
89
87
  "mock-require": "^3.0.3",
90
- "nodemailer": "^6.10.0"
88
+ "nodemailer": "^8.0.1"
91
89
  },
92
90
  "bugs": {
93
91
  "mail": "haraka.mail@gmail.com",
@@ -110,6 +108,7 @@
110
108
  },
111
109
  "prettier": {
112
110
  "singleQuote": true,
111
+ "printWidth": 120,
113
112
  "semi": false
114
113
  }
115
- }
114
+ }
@@ -1,4 +1,3 @@
1
-
2
1
  globals:
3
2
  server: true
4
3
  NEXT_HOOK: true