Haraka 3.0.3 → 3.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/.eslintrc.yaml +4 -9
  2. package/CONTRIBUTORS.md +11 -0
  3. package/Changes.md +1397 -1213
  4. package/Plugins.md +117 -105
  5. package/README.md +4 -13
  6. package/bin/haraka +198 -298
  7. package/config/auth_flat_file.ini +1 -0
  8. package/config/dhparams.pem +8 -0
  9. package/config/mail_from.is_resolvable.ini +4 -2
  10. package/config/me +1 -0
  11. package/config/outbound.ini +0 -2
  12. package/config/plugins +35 -36
  13. package/config/smtp.ini +1 -1
  14. package/config/smtp.json +17 -0
  15. package/config/tls.ini +2 -0
  16. package/config/tls_cert.pem +23 -0
  17. package/config/tls_key.pem +28 -0
  18. package/connection.js +46 -73
  19. package/contrib/bsd-rc.d/haraka +3 -1
  20. package/contrib/plugin2npm.sh +6 -36
  21. package/docs/CoreConfig.md +2 -2
  22. package/docs/Logging.md +7 -21
  23. package/docs/Outbound.md +104 -201
  24. package/docs/Plugins.md +2 -2
  25. package/docs/Transaction.md +59 -82
  26. package/docs/plugins/queue/smtp_proxy.md +5 -10
  27. package/docs/plugins/tls.md +37 -9
  28. package/endpoint.js +16 -13
  29. package/haraka.js +10 -14
  30. package/host_pool.js +5 -5
  31. package/http/html/index.html +6 -5
  32. package/line_socket.js +3 -4
  33. package/logger.js +44 -28
  34. package/outbound/client_pool.js +27 -23
  35. package/outbound/config.js +4 -6
  36. package/outbound/fsync_writestream.js +1 -1
  37. package/outbound/hmail.js +178 -218
  38. package/outbound/index.js +86 -99
  39. package/outbound/qfile.js +1 -1
  40. package/outbound/queue.js +51 -44
  41. package/outbound/timer_queue.js +3 -2
  42. package/outbound/tls.js +19 -7
  43. package/package.json +60 -51
  44. package/plugins/.eslintrc.yaml +0 -6
  45. package/plugins/auth/auth_base.js +4 -2
  46. package/plugins/auth/auth_proxy.js +14 -12
  47. package/plugins/auth/auth_vpopmaild.js +1 -1
  48. package/plugins/block_me.js +1 -1
  49. package/plugins/data.signatures.js +2 -4
  50. package/plugins/early_talker.js +2 -1
  51. package/plugins/mail_from.is_resolvable.js +65 -135
  52. package/plugins/queue/deliver.js +4 -5
  53. package/plugins/queue/lmtp.js +11 -12
  54. package/plugins/queue/qmail-queue.js +2 -2
  55. package/plugins/queue/quarantine.js +2 -2
  56. package/plugins/queue/rabbitmq.js +16 -17
  57. package/plugins/queue/smtp_forward.js +3 -3
  58. package/plugins/queue/smtp_proxy.js +10 -1
  59. package/plugins/queue/test.js +2 -2
  60. package/plugins/rcpt_to.host_list_base.js +5 -5
  61. package/plugins/rcpt_to.in_host_list.js +2 -2
  62. package/plugins/relay.js +6 -7
  63. package/plugins/reseed_rng.js +1 -1
  64. package/plugins/status.js +37 -33
  65. package/plugins/tls.js +2 -2
  66. package/plugins/xclient.js +3 -2
  67. package/plugins.js +50 -54
  68. package/run_tests +3 -30
  69. package/server.js +190 -190
  70. package/smtp_client.js +30 -23
  71. package/{tests → test}/config/plugins +0 -2
  72. package/{tests → test}/config/smtp.ini +3 -1
  73. package/test/config/tls/example.com/_.example.com.key +28 -0
  74. package/test/config/tls/example.com/example.com.crt +25 -0
  75. package/{tests/loud → test}/config/tls.ini +4 -2
  76. package/test/connection.js +302 -0
  77. package/test/endpoint.js +94 -0
  78. package/{tests → test}/fixtures/line_socket.js +1 -1
  79. package/{tests → test}/fixtures/util_hmailitem.js +19 -25
  80. package/{tests → test}/host_pool.js +42 -57
  81. package/test/logger.js +258 -0
  82. package/test/outbound/hmail.js +141 -0
  83. package/test/outbound/index.js +220 -0
  84. package/test/outbound/qfile.js +126 -0
  85. package/test/outbound_bounce_net_errors.js +142 -0
  86. package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
  87. package/test/plugins/auth/auth_base.js +484 -0
  88. package/test/plugins/auth/auth_vpopmaild.js +83 -0
  89. package/test/plugins/early_talker.js +104 -0
  90. package/test/plugins/mail_from.is_resolvable.js +35 -0
  91. package/test/plugins/queue/smtp_forward.js +206 -0
  92. package/test/plugins/rcpt_to.host_list_base.js +122 -0
  93. package/test/plugins/rcpt_to.in_host_list.js +193 -0
  94. package/test/plugins/relay.js +303 -0
  95. package/test/plugins/status.js +130 -0
  96. package/test/plugins/tls.js +70 -0
  97. package/test/plugins.js +228 -0
  98. package/test/rfc1869.js +73 -0
  99. package/test/server.js +491 -0
  100. package/test/smtp_client.js +299 -0
  101. package/test/tls_socket.js +277 -0
  102. package/test/transaction.js +270 -0
  103. package/tls_socket.js +202 -252
  104. package/transaction.js +8 -23
  105. package/CONTRIBUTING.md +0 -1
  106. package/bin/dkimverify +0 -40
  107. package/config/access.domains +0 -13
  108. package/config/attachment.ctype.regex +0 -2
  109. package/config/attachment.filename.regex +0 -1
  110. package/config/avg.ini +0 -5
  111. package/config/bounce.ini +0 -15
  112. package/config/data.headers.ini +0 -61
  113. package/config/dkim/dkim_key_gen.sh +0 -78
  114. package/config/dkim_sign.ini +0 -4
  115. package/config/dkim_verify.ini +0 -7
  116. package/config/dnsbl.ini +0 -23
  117. package/config/greylist.ini +0 -43
  118. package/config/helo.checks.ini +0 -52
  119. package/config/messagesniffer.ini +0 -18
  120. package/config/spamassassin.ini +0 -56
  121. package/dkim.js +0 -614
  122. package/docs/plugins/avg.md +0 -35
  123. package/docs/plugins/bounce.md +0 -69
  124. package/docs/plugins/clamd.md +0 -147
  125. package/docs/plugins/esets.md +0 -8
  126. package/docs/plugins/greylist.md +0 -90
  127. package/docs/plugins/helo.checks.md +0 -135
  128. package/docs/plugins/messagesniffer.md +0 -163
  129. package/docs/plugins/spamassassin.md +0 -180
  130. package/outbound/mx_lookup.js +0 -70
  131. package/plugins/auth/auth_ldap.js +0 -3
  132. package/plugins/avg.js +0 -162
  133. package/plugins/backscatterer.js +0 -25
  134. package/plugins/bounce.js +0 -381
  135. package/plugins/clamd.js +0 -382
  136. package/plugins/data.uribl.js +0 -4
  137. package/plugins/dkim_sign.js +0 -395
  138. package/plugins/dkim_verify.js +0 -62
  139. package/plugins/dns_list_base.js +0 -221
  140. package/plugins/dnsbl.js +0 -146
  141. package/plugins/dnswl.js +0 -58
  142. package/plugins/esets.js +0 -71
  143. package/plugins/graph.js +0 -5
  144. package/plugins/greylist.js +0 -645
  145. package/plugins/helo.checks.js +0 -533
  146. package/plugins/messagesniffer.js +0 -381
  147. package/plugins/rcpt_to.ldap.js +0 -3
  148. package/plugins/rcpt_to.max_count.js +0 -24
  149. package/plugins/spamassassin.js +0 -384
  150. package/tests/config/dkim/example.com/dns +0 -29
  151. package/tests/config/dkim/example.com/private +0 -6
  152. package/tests/config/dkim/example.com/public +0 -4
  153. package/tests/config/dkim/example.com/selector +0 -1
  154. package/tests/config/dkim.private.key +0 -6
  155. package/tests/config/dkim_sign.ini +0 -4
  156. package/tests/config/helo.checks.ini +0 -52
  157. package/tests/connection.js +0 -327
  158. package/tests/endpoint.js +0 -128
  159. package/tests/fixtures/vm_harness.js +0 -59
  160. package/tests/logger.js +0 -327
  161. package/tests/outbound/hmail.js +0 -112
  162. package/tests/outbound/index.js +0 -324
  163. package/tests/outbound/qfile.js +0 -67
  164. package/tests/outbound_bounce_net_errors.js +0 -173
  165. package/tests/plugins/auth/auth_base.js +0 -463
  166. package/tests/plugins/auth/auth_vpopmaild.js +0 -91
  167. package/tests/plugins/bounce.js +0 -307
  168. package/tests/plugins/clamd.js +0 -224
  169. package/tests/plugins/deprecated/relay_acl.js +0 -140
  170. package/tests/plugins/deprecated/relay_all.js +0 -59
  171. package/tests/plugins/dkim_sign.js +0 -315
  172. package/tests/plugins/dkim_signer.js +0 -108
  173. package/tests/plugins/dns_list_base.js +0 -259
  174. package/tests/plugins/dnsbl.js +0 -101
  175. package/tests/plugins/early_talker.js +0 -115
  176. package/tests/plugins/greylist.js +0 -58
  177. package/tests/plugins/helo.checks.js +0 -525
  178. package/tests/plugins/mail_from.is_resolvable.js +0 -116
  179. package/tests/plugins/queue/smtp_forward.js +0 -221
  180. package/tests/plugins/rcpt_to.host_list_base.js +0 -132
  181. package/tests/plugins/rcpt_to.in_host_list.js +0 -218
  182. package/tests/plugins/relay.js +0 -339
  183. package/tests/plugins/spamassassin.js +0 -171
  184. package/tests/plugins/status.js +0 -138
  185. package/tests/plugins/tls.js +0 -84
  186. package/tests/plugins.js +0 -247
  187. package/tests/rfc1869.js +0 -61
  188. package/tests/server.js +0 -510
  189. package/tests/smtp_client/auth.js +0 -105
  190. package/tests/smtp_client/basic.js +0 -101
  191. package/tests/smtp_client.js +0 -80
  192. package/tests/tls_socket.js +0 -333
  193. package/tests/transaction.js +0 -284
  194. /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
  195. /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
  196. /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
  197. /package/docs/{plugins → deprecated}/dnswl.md +0 -0
  198. /package/{tests → test}/.eslintrc.yaml +0 -0
  199. /package/{tests → test}/config/auth_flat_file.ini +0 -0
  200. /package/{tests → test}/config/dhparams.pem +0 -0
  201. /package/{tests → test}/config/host_list +0 -0
  202. /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
  203. /package/{tests → test}/config/outbound_tls_key.pem +0 -0
  204. /package/{tests → test}/config/smtp_forward.ini +0 -0
  205. /package/{tests → test}/config/tls/ec.pem +0 -0
  206. /package/{tests → test}/config/tls/haraka.local.pem +0 -0
  207. /package/{tests → test}/config/tls/mismatched.pem +0 -0
  208. /package/{tests → test}/config/tls_cert.pem +0 -0
  209. /package/{tests → test}/config/tls_key.pem +0 -0
  210. /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
  211. /package/{tests → test}/installation/config/test-plugin-flat +0 -0
  212. /package/{tests → test}/installation/config/test-plugin.ini +0 -0
  213. /package/{tests → test}/installation/config/tls.ini +0 -0
  214. /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
  215. /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
  216. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
  217. /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
  218. /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
  219. /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
  220. /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
  221. /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
  222. /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
  223. /package/{tests → test}/installation/plugins/inherits.js +0 -0
  224. /package/{tests → test}/installation/plugins/load_first.js +0 -0
  225. /package/{tests → test}/installation/plugins/plugin.js +0 -0
  226. /package/{tests → test}/installation/plugins/tls.js +0 -0
  227. /package/{tests → test}/loud/config/dhparams.pem +0 -0
  228. /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
  229. /package/{tests → test/loud}/config/tls.ini +0 -0
  230. /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
  231. /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
  232. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
  233. /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
  234. /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
  235. /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
  236. /package/{tests → test}/queue/multibyte +0 -0
  237. /package/{tests → test}/queue/plain +0 -0
  238. /package/{tests → test}/queue/zero-length +0 -0
  239. /package/{tests → test}/test-queue/delete-me +0 -0
@@ -0,0 +1,228 @@
1
+ 'use strict';
2
+
3
+ process.env.WITHOUT_CONFIG_CACHE=true;
4
+
5
+ const assert = require('node:assert')
6
+ const fs = require('node:fs');
7
+ const path = require('node:path');
8
+
9
+ const plugin = require('../plugins');
10
+
11
+ const piName = 'testPlugin';
12
+
13
+ /*
14
+
15
+ From: https://github.com/haraka/Haraka/pull/1278#issuecomment-172134064
16
+
17
+ * Need to test installed mode + core mode
18
+ * Need to test each variation of loading plugins
19
+ INSTALLED MODE
20
+ * Create test/installation/ with config/, plugins/, and node_modules
21
+ * Plugin in <install_dir>/plugins/<name>.js
22
+ * Plugin in <install_dir>/plugins/<name>/ with package.json
23
+ * Plugin in <install_dir>/node_modules/<name>/ with package.json
24
+ CORE MODE + INSTALLED MODE
25
+ * Plugin in <core>/plugins/<name>.js
26
+ * Plugin in <core>/plugins/<name>/ with package.json
27
+ * Plugin in <core>/node_modules/<name>/ with package.json
28
+ * Need to test conflict on name in various forms
29
+ * Check plugins/<name>.js loads, not node_modules/<name>/package.json
30
+ * Should be enough of a check(?)
31
+ * Need to test plugin not existing
32
+ * Check <bogus_name_guaranteed_to_not_exist> fails
33
+ * Need to test plugin existing and failing to compile
34
+ * Create bad plugin in test/installation/plugins/bad_plugin.js
35
+ * Need to test plugin inheritance
36
+ * Base plugin in test/installation/plugins/base_plugin.js
37
+ * Real plugin in test/installation/plugins/inherits.js
38
+ * Check base methods work
39
+ * Check plugin.base.base_plugin is set/correct
40
+ * Plugin timeouts (already tested)
41
+
42
+ */
43
+
44
+ describe('plugin', () => {
45
+
46
+ it('new Plugin() object', () => {
47
+ const pi = new plugin.Plugin(piName);
48
+ assert.ok(pi);
49
+ })
50
+
51
+ describe('get_timeout', () => {
52
+ const toPath = path.resolve('config', `${piName}.timeout`);
53
+ it('0s', (done) => {
54
+ fs.writeFile(toPath, '0', () => {
55
+ this.plugin = new plugin.Plugin(piName);
56
+ assert.equal(this.plugin.timeout, 0);
57
+ fs.unlink(toPath, done);
58
+ })
59
+ })
60
+
61
+ it('3s', (done) => {
62
+ fs.writeFile(toPath, '3', () => {
63
+ this.plugin = new plugin.Plugin(piName);
64
+ assert.equal(this.plugin.timeout, 3);
65
+ fs.unlink(toPath, done);
66
+ })
67
+ })
68
+
69
+ it('60s', (done) => {
70
+ fs.writeFile(toPath, '60', () => {
71
+ this.plugin = new plugin.Plugin(piName);
72
+ assert.equal(this.plugin.timeout, 60);
73
+ fs.unlink(toPath, done);
74
+ })
75
+ })
76
+
77
+ it('30s default (overrides NaN)', (done) => {
78
+ fs.writeFile(toPath, 'apple', () => {
79
+ this.plugin = new plugin.Plugin(piName);
80
+ assert.equal(this.plugin.timeout, 30);
81
+ fs.unlink(toPath, done);
82
+ })
83
+ })
84
+ })
85
+
86
+ describe('plugin_paths', () => {
87
+ beforeEach((done) => {
88
+ delete process.env.HARAKA;
89
+ done()
90
+ })
91
+
92
+ afterEach((done) => {
93
+ delete process.env.HARAKA;
94
+ done()
95
+ })
96
+
97
+ it('CORE plugin: (tls)', () => {
98
+ const p = new plugin.Plugin('tls');
99
+
100
+ assert.equal(p.plugin_path, path.resolve(__dirname, '..', 'plugins', 'tls.js'));
101
+ })
102
+
103
+ it('INSTALLED override: (tls)', () => {
104
+ process.env.HARAKA = path.resolve(__dirname, '..', 'test', 'installation');
105
+
106
+ const p = new plugin.Plugin('tls');
107
+
108
+ assert.equal(p.plugin_path, path.resolve(__dirname, 'installation', 'plugins', 'tls.js'));
109
+ })
110
+
111
+ it('INSTALLED node_modules package plugin: (test-plugin)', () => {
112
+ process.env.HARAKA = path.resolve(__dirname, '..', 'test', 'installation');
113
+
114
+ const p = new plugin.Plugin('test-plugin');
115
+
116
+ assert.equal(p.plugin_path, path.resolve(__dirname, 'installation', 'node_modules', 'test-plugin', 'package.json'));
117
+ assert.ok(p.hasPackageJson);
118
+ try {
119
+ p._compile();
120
+ assert.ok(true, "compiles OK");
121
+ }
122
+ catch (e) {
123
+ console.error(e.stack);
124
+ assert.ok(false, "compiles OK");
125
+ }
126
+ })
127
+
128
+ it('CORE package plugin: redis', () => {
129
+ const p = new plugin.Plugin('haraka-plugin-redis');
130
+
131
+ assert.equal(p.plugin_path, path.resolve(__dirname, '..', 'node_modules', 'haraka-plugin-redis', 'package.json'));
132
+ assert.ok(p.hasPackageJson);
133
+ })
134
+
135
+ it('plugins overrides node_modules', () => {
136
+ process.env.HARAKA = path.resolve(__dirname, '..', 'test', 'installation');
137
+
138
+ const p = new plugin.Plugin('load_first');
139
+
140
+ assert.equal(p.plugin_path, path.resolve(__dirname, 'installation', 'plugins', 'load_first.js'));
141
+ try {
142
+ p._compile();
143
+ assert.ok(true, "compiles OK");
144
+ }
145
+ catch (e) {
146
+ console.error(e.stack);
147
+ assert.ok(false, "compiles OK");
148
+ }
149
+ assert.ok(p.loaded_first);
150
+ })
151
+
152
+ it('INSTALLED plugins folder plugin: (folder_plugin)', () => {
153
+ process.env.HARAKA = path.resolve(__dirname, '..', 'test', 'installation');
154
+
155
+ const p = new plugin.Plugin('folder_plugin');
156
+
157
+ assert.equal(p.plugin_path, path.resolve(__dirname, 'installation', 'plugins', 'folder_plugin', 'package.json'));
158
+ assert.ok(p.hasPackageJson);
159
+ try {
160
+ p._compile();
161
+ assert.ok(true, "compiles OK");
162
+ }
163
+ catch (e) {
164
+ console.error(e.stack);
165
+ assert.ok(false, "compiles OK");
166
+ }
167
+ })
168
+
169
+ it('Inheritance: (inherits)', () => {
170
+ process.env.HARAKA = path.resolve(__dirname, '..', 'test', 'installation');
171
+
172
+ const p = new plugin.Plugin('inherits');
173
+
174
+ assert.equal(p.plugin_path, path.resolve(__dirname, 'installation', 'plugins', 'inherits.js'));
175
+ try {
176
+ p._compile();
177
+ assert.ok(true, "compiles OK");
178
+ }
179
+ catch (e) {
180
+ console.error(e.stack);
181
+ assert.ok(false, "compiles OK");
182
+ }
183
+ p.register();
184
+ assert.ok(p.base.base_plugin);
185
+ })
186
+ })
187
+
188
+ describe('plugin_config', () => {
189
+ beforeEach((done) => {
190
+ delete process.env.HARAKA;
191
+ done();
192
+ })
193
+
194
+ afterEach((done) => {
195
+ delete process.env.HARAKA;
196
+ done();
197
+ })
198
+
199
+ it('CORE plugin: (tls)', () => {
200
+ const p = new plugin.Plugin('tls');
201
+
202
+ assert.equal(p.config.root_path, path.resolve(__dirname, '..', 'config'));
203
+ assert.equal(p.config.overrides_path, undefined);
204
+ })
205
+
206
+ it('INSTALLED override: (tls)', () => {
207
+
208
+ process.env.HARAKA = path.resolve(__dirname, '..', 'test', 'installation');
209
+
210
+ const p = new plugin.Plugin('tls');
211
+
212
+ assert.equal(p.config.root_path, path.resolve(__dirname, '..', 'config'));
213
+ assert.equal(p.config.overrides_path, path.resolve(__dirname, 'installation', 'config'));
214
+ const tls_ini = p.config.get('tls.ini');
215
+ assert.equal(tls_ini.main.ciphers, 'test');
216
+ })
217
+
218
+ it('INSTALLED node_modules package plugin: (test-plugin)', () => {
219
+
220
+ process.env.HARAKA = path.resolve(__dirname, '..', 'test', 'installation');
221
+
222
+ const p = new plugin.Plugin('test-plugin');
223
+
224
+ assert.equal(p.config.root_path, path.resolve(__dirname, 'installation', 'node_modules', 'test-plugin', 'config'));
225
+ assert.equal(p.config.overrides_path, path.resolve(__dirname, 'installation', 'config'));
226
+ })
227
+ })
228
+ })
@@ -0,0 +1,73 @@
1
+ const assert = require('node:assert')
2
+
3
+ const { parse } = require('../rfc1869');
4
+
5
+ function _check (line, expected) {
6
+ const match = /^(MAIL|RCPT)\s+(.*)$/.exec(line);
7
+ const parsed = parse(match[1].toLowerCase(), match[2]);
8
+ assert.equal(parsed.length, expected.length);
9
+ for (let x = 0; x < expected.length; x++) {
10
+ assert.equal(parsed[x], expected[x]);
11
+ }
12
+ }
13
+
14
+ describe('rfc1869', () => {
15
+ it('MAIL FROM:<>', () => {
16
+ _check('MAIL FROM:<>', ['<>']);
17
+ })
18
+
19
+ it('MAIL FROM:', () => {
20
+ _check('MAIL FROM:', ['<>']);
21
+ })
22
+
23
+ it('MAIL FROM:<postmaster>', () => {
24
+ _check('MAIL FROM:<postmaster>', ['<postmaster>']);
25
+ })
26
+
27
+ it('MAIL FROM:user', () => {
28
+ _check('MAIL FROM:user', ['user']);
29
+ })
30
+
31
+ it('MAIL FROM:user size=1234', () => {
32
+ _check('MAIL FROM:user size=1234', ['user', 'size=1234']);
33
+ })
34
+
35
+ it('MAIL FROM:user@domain size=1234', () => {
36
+ _check('MAIL FROM:user@domain size=1234',
37
+ ['user@domain', 'size=1234']);
38
+ })
39
+
40
+ it('MAIL FROM:<user@domain> size=1234', () => {
41
+ _check('MAIL FROM:<user@domain> size=1234',
42
+ ['<user@domain>', 'size=1234']);
43
+ })
44
+
45
+ it('MAIL FROM:<user@domain> somekey', () => {
46
+ _check('MAIL FROM:<user@domain> somekey',
47
+ ['<user@domain>', 'somekey']);
48
+ })
49
+
50
+ it('MAIL FROM:<user@domain> somekey other=foo', () => {
51
+ _check('MAIL FROM:<user@domain> somekey other=foo',
52
+ ['<user@domain>', 'somekey', 'other=foo']);
53
+ })
54
+
55
+ it('RCPT TO ugly', () => {
56
+ _check('RCPT TO: 0@mailblog.biz 0=9 1=9',
57
+ ['<0@mailblog.biz>', '0=9', '1=9']);
58
+ })
59
+
60
+ it('RCPT TO:<r86x-ray@emailitin.com> state=1', () => {
61
+ _check('RCPT TO:<r86x-ray@emailitin.com> state=1',
62
+ ['<r86x-ray@emailitin.com>', 'state=1']);
63
+ })
64
+
65
+ it('RCPT TO:<user=name@domain.com> foo=bar', () => {
66
+ _check('RCPT TO:<user=name@domain.com> foo=bar',
67
+ ['<user=name@domain.com>', 'foo=bar']);
68
+ })
69
+
70
+ it('RCPT TO:<postmaster>', () => {
71
+ _check('RCPT TO:<postmaster>', ['<postmaster>']);
72
+ })
73
+ })