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/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "server",
10
10
  "email"
11
11
  ],
12
- "version": "3.0.2",
12
+ "version": "3.0.4",
13
13
  "homepage": "http://haraka.github.io",
14
14
  "repository": {
15
15
  "type": "git",
@@ -17,68 +17,76 @@
17
17
  },
18
18
  "main": "haraka.js",
19
19
  "engines": {
20
- "node": ">=16"
20
+ "node": ">=18"
21
21
  },
22
22
  "dependencies": {
23
- "address-rfc2821": "^2.0.1",
24
- "address-rfc2822": "^2.1.0",
25
- "async": "^3.2.4",
23
+ "address-rfc2821": "^2.1.2",
24
+ "address-rfc2822": "^2.2.2",
25
+ "async": "^3.2.6",
26
26
  "daemon": "~1.1.0",
27
- "ipaddr.js": "~2.1.0",
28
- "node-gyp": "^9.4.0",
29
- "nopt": "~7.2.0",
27
+ "haraka-config": "^1.4.0",
28
+ "haraka-constants": "^1.0.7",
29
+ "haraka-dsn": "^1.1.0",
30
+ "haraka-email-message": "^1.2.3",
31
+ "haraka-message-stream": "^1.2.2",
32
+ "haraka-net-utils": "^1.7.0",
33
+ "haraka-notes": "^1.1.0",
34
+ "haraka-plugin-redis": "^2.0.7",
35
+ "haraka-results": "^2.2.4",
36
+ "haraka-tld": "^1.2.1",
37
+ "haraka-utils": "^1.1.3",
38
+ "ipaddr.js": "~2.2.0",
39
+ "node-gyp": "^10.2.0",
40
+ "nopt": "^7.2.1",
30
41
  "npid": "~0.4.0",
31
- "semver": "~7.5.2",
32
- "sprintf-js": "~1.1.2",
33
- "haraka-config": "^1.1.0",
34
- "haraka-constants": "^1.0.6",
35
- "haraka-dsn": "^1.0.4",
36
- "haraka-email-message": "^1.2.0",
37
- "haraka-message-stream": "^1.2.0",
38
- "haraka-net-utils": "^1.5.0",
39
- "haraka-notes": "^1.0.6",
40
- "haraka-plugin-attachment": "^1.0.7",
41
- "haraka-plugin-spf": "1.2.0",
42
- "haraka-plugin-redis": "^2.0.5",
43
- "haraka-results": "^2.2.3",
44
- "haraka-tld": "^1.1.1",
45
- "haraka-utils": "^1.0.3",
46
- "openssl-wrapper": "^0.3.4",
47
- "sockaddr": "^1.0.1"
42
+ "redis": "~4.7.0",
43
+ "semver": "^7.6.3",
44
+ "sockaddr": "^1.0.1",
45
+ "sprintf-js": "~1.1.3"
48
46
  },
49
47
  "optionalDependencies": {
50
- "haraka-plugin-access": "^1.1.5",
51
- "haraka-plugin-aliases": "^1.0.1",
52
- "haraka-plugin-asn": "^2.0.1",
53
- "haraka-plugin-auth-ldap": "^1.0.2",
54
- "haraka-plugin-dcc": "^1.0.1",
55
- "haraka-plugin-elasticsearch": "^1.0.6",
48
+ "haraka-plugin-access": "^1.1.6",
49
+ "haraka-plugin-aliases": "^1.0.2",
50
+ "haraka-plugin-asn": "^2.0.3",
51
+ "haraka-plugin-attachment": "^1.1.2",
52
+ "haraka-plugin-auth-ldap": "^1.1.0",
53
+ "haraka-plugin-avg": "^1.1.0",
54
+ "haraka-plugin-bounce": "1.0.2",
55
+ "haraka-plugin-clamd": "1.0.1",
56
+ "haraka-plugin-dcc": "^1.0.2",
57
+ "haraka-plugin-dkim": "^1.0.4",
58
+ "haraka-plugin-dns-list": "^1.2.0",
59
+ "haraka-plugin-elasticsearch": "^8.0.2",
60
+ "haraka-plugin-esets": "^1.0.0",
56
61
  "haraka-plugin-fcrdns": "^1.1.0",
62
+ "haraka-plugin-geoip": "^1.1.0",
57
63
  "haraka-plugin-graph": "^1.0.5",
58
- "haraka-plugin-geoip": "^1.0.17",
59
- "haraka-plugin-headers": "^1.0.3",
60
- "haraka-plugin-karma": "^2.1.0",
61
- "haraka-plugin-limit": "^1.1.0",
64
+ "haraka-plugin-greylist": "^1.0.0",
65
+ "haraka-plugin-headers": "^1.0.4",
66
+ "haraka-plugin-helo.checks": "^1.0.0",
67
+ "haraka-plugin-karma": "^2.1.5",
68
+ "haraka-plugin-known-senders": "^1.1.0",
69
+ "haraka-plugin-limit": "^1.2.5",
70
+ "haraka-plugin-messagesniffer": "^1.0.0",
62
71
  "haraka-plugin-p0f": "^1.0.9",
63
- "haraka-plugin-qmail-deliverable": "^1.2.1",
64
- "haraka-plugin-known-senders": "^1.0.8",
65
- "haraka-plugin-rcpt-ldap": "^1.0.0",
66
- "haraka-plugin-recipient-routes": "^1.0.4",
67
- "haraka-plugin-rspamd": "^1.2.0",
68
- "haraka-plugin-syslog": "^1.0.3",
69
- "haraka-plugin-uribl": "^1.0.6",
70
- "haraka-plugin-watch": "^2.0.2",
72
+ "haraka-plugin-qmail-deliverable": "^1.2.3",
73
+ "haraka-plugin-rcpt-ldap": "^1.1.0",
74
+ "haraka-plugin-recipient-routes": "^1.2.0",
75
+ "haraka-plugin-rspamd": "^1.3.1",
76
+ "haraka-plugin-spamassassin": "^1.0.0",
77
+ "haraka-plugin-spf": "1.2.7",
78
+ "haraka-plugin-syslog": "^1.0.6",
79
+ "haraka-plugin-uribl": "^1.0.8",
80
+ "haraka-plugin-watch": "^2.0.4",
71
81
  "ocsp": "~1.2.0",
72
- "redis": "^4.5.1",
73
- "tmp": "~0.2.1"
82
+ "tmp": "~0.2.3"
74
83
  },
75
84
  "devDependencies": {
76
- "nodeunit-x": "^0.16.0",
77
- "haraka-test-fixtures": "^1.3.0",
85
+ "@haraka/eslint-config": "^1.1.5",
86
+ "haraka-test-fixtures": "^1.3.7",
87
+ "mocha": "^10.7.3",
78
88
  "mock-require": "^3.0.3",
79
- "eslint": "^8.42.0",
80
- "eslint-plugin-haraka": "^1.0.15",
81
- "nodemailer": "^6.9.3"
89
+ "nodemailer": "^6.9.14"
82
90
  },
83
91
  "bugs": {
84
92
  "mail": "haraka.mail@gmail.com",
@@ -86,13 +94,16 @@
86
94
  },
87
95
  "bin": {
88
96
  "haraka": "./bin/haraka",
89
- "dkimverify": "./bin/dkimverify",
90
97
  "haraka_grep": "./bin/haraka_grep"
91
98
  },
92
99
  "scripts": {
93
- "test": "node run_tests",
94
- "lint": "npx eslint *.js outbound plugins plugins/*/*.js tests tests/*/*.js tests/*/*/*.js bin/haraka bin/dkimverify",
95
- "lintfix": "npx eslint --fix *.js outbound plugins plugins/*/*.js tests tests/*/*.js tests/*/*/*.js bin/haraka bin/dkimverify",
96
- "versions": "npx dependency-version-checker check"
100
+ "format": "npm run prettier:fix && npm run lint:fix",
101
+ "lint": "npx eslint@^8 *.js outbound plugins plugins/*/*.js test test/*/*.js test/*/*/*.js bin/haraka",
102
+ "lint:fix": "npx eslint@^8 --fix *.js outbound plugins plugins/*/*.js test test/*/*.js test/*/*/*.js bin/haraka",
103
+ "prettier": "npx prettier . --check",
104
+ "prettier:fix": "npx prettier . --write --log-level=warn",
105
+ "test": "npx mocha --exit --timeout=4000 test test/outbound test/plugins/auth test/plugins/queue test/plugins",
106
+ "versions": "npx dependency-version-checker check",
107
+ "versions:fix": "npx dependency-version-checker update && npm run prettier:fix"
97
108
  }
98
109
  }
@@ -1,10 +1,4 @@
1
1
 
2
2
  globals:
3
3
  server: true
4
- OK: true
5
- CONT: true
6
- DENY: true
7
- DENYSOFT: true
8
- DENYDISCONNECT: true
9
- DENYSOFTDISCONNECT: true
10
4
  NEXT_HOOK: true
@@ -4,8 +4,11 @@
4
4
 
5
5
  // Note: You can disable setting `connection.notes.auth_passwd` by `plugin.blankout_password = true`
6
6
 
7
- const crypto = require('crypto');
8
- const utils = require('haraka-utils');
7
+ const crypto = require('node:crypto');
8
+
9
+ const tlds = require('haraka-tld')
10
+ const utils = require('haraka-utils');
11
+
9
12
  const AUTH_COMMAND = 'AUTH';
10
13
  const AUTH_METHOD_CRAM_MD5 = 'CRAM-MD5';
11
14
  const AUTH_METHOD_PLAIN = 'PLAIN';
@@ -15,7 +18,7 @@ const LOGIN_STRING2 = 'UGFzc3dvcmQ6'; //Password: base64 coded
15
18
 
16
19
  exports.hook_capabilities = (next, connection) => {
17
20
  // Don't offer AUTH capabilities unless session is encrypted
18
- if (!connection.tls.enabled) { return next(); }
21
+ if (!connection.tls.enabled) return next();
19
22
 
20
23
  const methods = [ 'PLAIN', 'LOGIN', 'CRAM-MD5' ];
21
24
  connection.capabilities.push(`AUTH ${methods.join(' ')}`);
@@ -47,9 +50,7 @@ exports.hook_unrecognized_command = function (next, connection, params) {
47
50
 
48
51
  exports.check_plain_passwd = function (connection, user, passwd, cb) {
49
52
  function callback (plain_pw) {
50
- if (plain_pw === null ) return cb(false);
51
- if (plain_pw !== passwd) return cb(false);
52
- cb(true);
53
+ cb(plain_pw === null ? false : plain_pw === passwd);
53
54
  }
54
55
  if (this.get_plain_passwd.length == 2) {
55
56
  this.get_plain_passwd(user, callback);
@@ -71,7 +72,7 @@ exports.check_cram_md5_passwd = function (connection, user, passwd, cb) {
71
72
 
72
73
  if (hmac.digest('hex') === passwd) return cb(true);
73
74
 
74
- return cb(false);
75
+ cb(false);
75
76
  }
76
77
  if (this.get_plain_passwd.length == 2) {
77
78
  this.get_plain_passwd(user, callback);
@@ -117,7 +118,7 @@ exports.check_user = function (next, connection, credentials, method) {
117
118
  connection.auth_results(`auth=pass (${method.toLowerCase()})`);
118
119
  connection.notes.auth_user = credentials[0];
119
120
  if (!plugin.blankout_password) connection.notes.auth_passwd = credentials[1];
120
- return next(OK);
121
+ next(OK);
121
122
  });
122
123
  return;
123
124
  }
@@ -125,9 +126,7 @@ exports.check_user = function (next, connection, credentials, method) {
125
126
  if (!connection.notes.auth_fails) connection.notes.auth_fails = 0;
126
127
 
127
128
  connection.notes.auth_fails++;
128
- connection.results.add({name: 'auth'}, {
129
- fail:`${plugin.name}/${method}`,
130
- });
129
+ connection.results.add({name: 'auth'}, { fail:`${plugin.name}/${method}` });
131
130
 
132
131
  let delay = Math.pow(2, connection.notes.auth_fails - 1);
133
132
  if (plugin.timeout && delay >= plugin.timeout) {
@@ -230,7 +229,7 @@ exports.auth_cram_md5 = function (next, connection, params) {
230
229
  return this.check_user(next, connection, credentials, AUTH_METHOD_CRAM_MD5);
231
230
  }
232
231
 
233
- const ticket = `<${this.hexi(Math.floor(Math.random() * 1000000))}. ${this.hexi(Date.now())}@${connection.local.host}>`;
232
+ const ticket = `<${this.hexi(Math.floor(Math.random() * 1000000))}.${this.hexi(Date.now())}@${connection.local.host}>`;
234
233
 
235
234
  connection.loginfo(this, `ticket: ${ticket}`);
236
235
  connection.respond(334, utils.base64(ticket), () => {
@@ -240,3 +239,22 @@ exports.auth_cram_md5 = function (next, connection, params) {
240
239
  }
241
240
 
242
241
  exports.hexi = number => String(Math.abs(parseInt(number)).toString(16))
242
+
243
+ exports.constrain_sender = function (next, connection, params) {
244
+ if (this?.cfg?.main?.constrain_sender === false) return next()
245
+
246
+ const au = connection.results.get('auth')?.user
247
+ if (!au) return next()
248
+
249
+ const ad = /@/.test(au) ? au.split('@').pop() : null
250
+ const ed = params[0].host
251
+
252
+ if (!ad || !ed) return next()
253
+
254
+ const auth_od = tlds.get_organizational_domain(ad)
255
+ const envelope_od = tlds.get_organizational_domain(ed)
256
+
257
+ if (auth_od === envelope_od) return next()
258
+
259
+ next(DENY, `Envelope domain '${envelope_od}' doesn't match AUTH domain '${auth_od}'`)
260
+ }
@@ -1,7 +1,9 @@
1
1
  // Proxy AUTH requests selectively by domain
2
2
 
3
- const sock = require('./line_socket');
3
+ const net = require('node:net')
4
+
4
5
  const utils = require('haraka-utils');
6
+ const net_utils = require('haraka-net-utils')
5
7
 
6
8
  const smtp_regexp = /^(\d{3})([ -])(.*)/;
7
9
 
@@ -16,7 +18,6 @@ exports.load_tls_ini = function () {
16
18
  });
17
19
  }
18
20
 
19
-
20
21
  exports.hook_capabilities = (next, connection) => {
21
22
  if (connection.tls.enabled) {
22
23
  const methods = [ 'PLAIN', 'LOGIN' ];
@@ -54,7 +55,8 @@ exports.try_auth_proxy = function (connection, hosts, user, passwd, cb) {
54
55
  }
55
56
 
56
57
  const self = this;
57
- const host = hosts.shift();
58
+ let [ host, port ] = hosts.shift().split(':'); /* eslint prefer-const: 0 */
59
+ if (!port) port = 25
58
60
  let methods = [];
59
61
  let auth_complete = false;
60
62
  let auth_success = false;
@@ -62,27 +64,27 @@ exports.try_auth_proxy = function (connection, hosts, user, passwd, cb) {
62
64
  let response = [];
63
65
  let secure = false;
64
66
 
65
- const hostport = host.split(/:/);
66
- const socket = sock.connect(((hostport[1]) ? hostport[1] : 25), hostport[0]);
67
- connection.logdebug(self, `attempting connection to host=${hostport[0]} port=${(hostport[1]) ? hostport[1] : 25}`);
67
+ const socket = net.connect({ host, port });
68
+ net_utils.add_line_processor(socket)
69
+ connection.logdebug(this, `attempting connection to host=${host} port=${port}`);
68
70
  socket.setTimeout(30 * 1000);
69
71
  socket.on('connect', () => { });
70
72
  socket.on('close', () => {
71
73
  if (!auth_complete) {
72
74
  // Try next host
73
- return self.try_auth_proxy(connection, hosts, user, passwd, cb);
75
+ return this.try_auth_proxy(connection, hosts, user, passwd, cb);
74
76
  }
75
- connection.loginfo(self, `AUTH user="${user}" host="${host}" success=${auth_success}`);
76
- return cb(auth_success);
77
+ connection.loginfo(this, `AUTH user="${user}" host="${host}" success=${auth_success}`);
78
+ cb(auth_success);
77
79
  });
78
80
  socket.on('timeout', () => {
79
- connection.logerror(self, "connection timed out");
81
+ connection.logerror(this, "connection timed out");
80
82
  socket.end();
81
83
  // Try next host
82
- return self.try_auth_proxy(connection, hosts, user, passwd, cb);
84
+ this.try_auth_proxy(connection, hosts, user, passwd, cb);
83
85
  });
84
86
  socket.on('error', err => {
85
- connection.logerror(self, `connection failed to host ${host}: ${err}`);
87
+ connection.logerror(this, `connection failed to host ${host}: ${err}`);
86
88
  socket.end();
87
89
  });
88
90
  socket.send_command = function (cmd, data) {
@@ -1,28 +1,39 @@
1
1
  // Auth against vpopmaild
2
2
 
3
- const net = require('net');
3
+ const net = require('node:net');
4
4
 
5
5
  exports.register = function () {
6
6
  this.inherits('auth/auth_base');
7
- this.load_vpop_ini();
7
+ this.blankout_password=true
8
+
9
+ this.load_vpopmaild_ini();
10
+
11
+ if (this.cfg.main.constrain_sender) {
12
+ this.register_hook('mail', 'constrain_sender')
13
+ }
8
14
  }
9
15
 
10
- exports.load_vpop_ini = function () {
11
- this.cfg = this.config.get('auth_vpopmaild.ini', () => {
12
- this.load_vpop_ini();
16
+ exports.load_vpopmaild_ini = function () {
17
+ this.cfg = this.config.get('auth_vpopmaild.ini', {
18
+ booleans: [
19
+ '+main.constrain_sender',
20
+ ]
21
+ },
22
+ () => {
23
+ this.load_vpopmaild_ini();
13
24
  });
14
25
  }
15
26
 
16
27
  exports.hook_capabilities = function (next, connection) {
17
- if (!connection.tls.enabled) { return next(); }
28
+ if (!connection.tls.enabled) return next();
18
29
 
19
30
  const methods = [ 'PLAIN', 'LOGIN' ];
20
- if (this.cfg.main.sysadmin) { methods.push('CRAM-MD5'); }
31
+ if (this.cfg.main.sysadmin) methods.push('CRAM-MD5');
21
32
 
22
33
  connection.capabilities.push(`AUTH ${methods.join(' ')}`);
23
34
  connection.notes.allowed_auth_methods = methods;
24
35
 
25
- return next();
36
+ next();
26
37
  }
27
38
 
28
39
  exports.check_plain_passwd = function (connection, user, passwd, cb) {
@@ -49,11 +60,12 @@ exports.check_plain_passwd = function (connection, user, passwd, cb) {
49
60
  }
50
61
  socket.end(); // disconnect
51
62
  }
52
- });
63
+ })
64
+
53
65
  socket.on('end', () => {
54
66
  connection.loginfo(this, `AUTH user="${user}" success=${auth_success}`);
55
- return cb(auth_success);
56
- });
67
+ cb(auth_success);
68
+ })
57
69
  }
58
70
 
59
71
  exports.get_sock_opts = function (user) {
@@ -66,13 +78,11 @@ exports.get_sock_opts = function (user) {
66
78
 
67
79
  const domain = (user.split('@'))[1];
68
80
  let sect = this.cfg.main;
69
- if (domain && this.cfg[domain]) {
70
- sect = this.cfg[domain];
71
- }
81
+ if (domain && this.cfg[domain]) sect = this.cfg[domain];
72
82
 
73
- if (sect.port) { this.sock_opts.port = sect.port; }
74
- if (sect.host) { this.sock_opts.host = sect.host; }
75
- if (sect.sysadmin) { this.sock_opts.sysadmin = sect.sysadmin; }
83
+ if (sect.port) this.sock_opts.port = sect.port;
84
+ if (sect.host) this.sock_opts.host = sect.host;
85
+ if (sect.sysadmin) this.sock_opts.sysadmin = sect.sysadmin;
76
86
 
77
87
  this.logdebug(`sock: ${this.sock_opts.host}:${this.sock_opts.port}`);
78
88
  return this.sock_opts;
@@ -89,14 +99,14 @@ exports.get_vpopmaild_socket = function (user) {
89
99
  socket.on('timeout', () => {
90
100
  this.logerror("vpopmaild connection timed out");
91
101
  socket.end();
92
- });
102
+ })
93
103
  socket.on('error', err => {
94
104
  this.logerror(`vpopmaild connection failed: ${err}`);
95
105
  socket.end();
96
- });
106
+ })
97
107
  socket.on('connect', () => {
98
108
  this.logdebug('vpopmail connected');
99
- });
109
+ })
100
110
  return socket;
101
111
  }
102
112
 
@@ -3,26 +3,32 @@
3
3
  exports.register = function () {
4
4
  this.inherits('auth/auth_base');
5
5
  this.load_flat_ini();
6
+
7
+ if (this.cfg.core.constrain_sender) {
8
+ this.register_hook('mail', 'constrain_sender')
9
+ }
6
10
  }
7
11
 
8
12
  exports.load_flat_ini = function () {
9
- this.cfg = this.config.get('auth_flat_file.ini', () => {
13
+ this.cfg = this.config.get('auth_flat_file.ini', {
14
+ booleans: [
15
+ '+core.constrain_sender',
16
+ ]
17
+ },
18
+ () => {
10
19
  this.load_flat_ini();
11
20
  });
21
+
22
+ if (this.cfg.users === undefined) this.cfg.users = {}
12
23
  }
13
24
 
14
25
  exports.hook_capabilities = function (next, connection) {
15
- // don't allow AUTH unless private IP or encrypted
16
26
  if (!connection.remote.is_private && !connection.tls.enabled) {
17
- connection.logdebug(this,
18
- "Auth disabled for insecure public connection");
27
+ connection.logdebug(this, "Auth disabled for insecure public connection");
19
28
  return next();
20
29
  }
21
30
 
22
- let methods = null;
23
- if (this.cfg.core?.methods ) {
24
- methods = this.cfg.core.methods.split(',');
25
- }
31
+ const methods = this.cfg.core?.methods ? this.cfg.core.methods.split(',') : null
26
32
  if (methods && methods.length > 0) {
27
33
  connection.capabilities.push(`AUTH ${methods.join(' ')}`);
28
34
  connection.notes.allowed_auth_methods = methods;
@@ -31,8 +37,7 @@ exports.hook_capabilities = function (next, connection) {
31
37
  }
32
38
 
33
39
  exports.get_plain_passwd = function (user, connection, cb) {
34
- if (this.cfg.users[user]) {
35
- return cb(this.cfg.users[user].toString());
36
- }
37
- return cb();
40
+ if (this.cfg.users[user]) return cb(this.cfg.users[user].toString());
41
+
42
+ cb();
38
43
  }
@@ -3,7 +3,7 @@
3
3
  // in the mail_from.blocklist file. You need to be running the
4
4
  // mail_from.blocklist plugin for this to work fully.
5
5
 
6
- const fs = require('fs');
6
+ const fs = require('node:fs');
7
7
  const utils = require('haraka-utils');
8
8
 
9
9
  exports.hook_data = (next, connection) => {
@@ -3,9 +3,7 @@
3
3
 
4
4
  exports.hook_data = (next, connection) => {
5
5
  // enable mail body parsing
6
- if (!connection?.transaction) return next();
7
-
8
- connection.transaction.parse_body = true;
6
+ if (connection?.transaction) connection.transaction.parse_body = true;
9
7
  next();
10
8
  }
11
9
 
@@ -17,7 +15,7 @@ exports.hook_data_post = function (next, connection) {
17
15
  if (check_sigs(sigs, connection.transaction.body)) {
18
16
  return next(DENY, "Mail matches a known spam signature");
19
17
  }
20
- return next();
18
+ next();
21
19
  }
22
20
 
23
21
  function check_sigs (sigs, body) {
@@ -1,7 +1,8 @@
1
1
  // This plugin checks for clients that talk before we sent a response
2
2
 
3
+ const { isIPv6 } = require('node:net');
4
+
3
5
  const ipaddr = require('ipaddr.js');
4
- const { isIPv6 } = require('net');
5
6
 
6
7
  exports.register = function () {
7
8
  this.load_config();