Author: Kevin Schoon [me@kevinschoon.com]
Hash: c2d1bdda7abfff258bf03f4fe8b7c041ca71a128
Timestamp: Mon, 02 Sep 2024 21:17:22 +0000 (1 month ago)

+1152 -72 +/-6 browse
implement dkim sender verification
1diff --git a/Cargo.lock b/Cargo.lock
2index a525bcc..d6d781b 100644
3--- a/Cargo.lock
4+++ b/Cargo.lock
5 @@ -18,12 +18,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
6 checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
7
8 [[package]]
9+ name = "adler2"
10+ version = "2.0.0"
11+ source = "registry+https://github.com/rust-lang/crates.io-index"
12+ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
13+
14+ [[package]]
15+ name = "aes"
16+ version = "0.8.4"
17+ source = "registry+https://github.com/rust-lang/crates.io-index"
18+ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
19+ dependencies = [
20+ "cfg-if",
21+ "cipher",
22+ "cpufeatures",
23+ ]
24+
25+ [[package]]
26 name = "ahash"
27 version = "0.8.11"
28 source = "registry+https://github.com/rust-lang/crates.io-index"
29 checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
30 dependencies = [
31 "cfg-if",
32+ "getrandom",
33 "once_cell",
34 "version_check",
35 "zerocopy",
36 @@ -36,6 +54,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
37 checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
38
39 [[package]]
40+ name = "arbitrary"
41+ version = "1.3.2"
42+ source = "registry+https://github.com/rust-lang/crates.io-index"
43+ checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110"
44+ dependencies = [
45+ "derive_arbitrary",
46+ ]
47+
48+ [[package]]
49 name = "async-trait"
50 version = "0.1.81"
51 source = "registry+https://github.com/rust-lang/crates.io-index"
52 @@ -62,13 +89,19 @@ dependencies = [
53 "cc",
54 "cfg-if",
55 "libc",
56- "miniz_oxide",
57+ "miniz_oxide 0.7.4",
58 "object",
59 "rustc-demangle",
60 ]
61
62 [[package]]
63 name = "base64"
64+ version = "0.21.7"
65+ source = "registry+https://github.com/rust-lang/crates.io-index"
66+ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
67+
68+ [[package]]
69+ name = "base64"
70 version = "0.22.1"
71 source = "registry+https://github.com/rust-lang/crates.io-index"
72 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
73 @@ -80,16 +113,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
74 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
75
76 [[package]]
77+ name = "block-buffer"
78+ version = "0.10.4"
79+ source = "registry+https://github.com/rust-lang/crates.io-index"
80+ checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
81+ dependencies = [
82+ "generic-array",
83+ ]
84+
85+ [[package]]
86+ name = "bumpalo"
87+ version = "3.16.0"
88+ source = "registry+https://github.com/rust-lang/crates.io-index"
89+ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
90+
91+ [[package]]
92+ name = "byteorder"
93+ version = "1.5.0"
94+ source = "registry+https://github.com/rust-lang/crates.io-index"
95+ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
96+
97+ [[package]]
98 name = "bytes"
99 version = "1.6.1"
100 source = "registry+https://github.com/rust-lang/crates.io-index"
101 checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952"
102
103 [[package]]
104+ name = "bzip2"
105+ version = "0.4.4"
106+ source = "registry+https://github.com/rust-lang/crates.io-index"
107+ checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8"
108+ dependencies = [
109+ "bzip2-sys",
110+ "libc",
111+ ]
112+
113+ [[package]]
114+ name = "bzip2-sys"
115+ version = "0.1.11+1.0.8"
116+ source = "registry+https://github.com/rust-lang/crates.io-index"
117+ checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
118+ dependencies = [
119+ "cc",
120+ "libc",
121+ "pkg-config",
122+ ]
123+
124+ [[package]]
125 name = "cc"
126 version = "1.1.6"
127 source = "registry+https://github.com/rust-lang/crates.io-index"
128 checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f"
129+ dependencies = [
130+ "jobserver",
131+ "libc",
132+ ]
133
134 [[package]]
135 name = "cfg-if"
136 @@ -98,6 +177,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
137 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
138
139 [[package]]
140+ name = "cipher"
141+ version = "0.4.4"
142+ source = "registry+https://github.com/rust-lang/crates.io-index"
143+ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
144+ dependencies = [
145+ "crypto-common",
146+ "inout",
147+ ]
148+
149+ [[package]]
150+ name = "constant_time_eq"
151+ version = "0.3.1"
152+ source = "registry+https://github.com/rust-lang/crates.io-index"
153+ checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
154+
155+ [[package]]
156+ name = "cpufeatures"
157+ version = "0.2.13"
158+ source = "registry+https://github.com/rust-lang/crates.io-index"
159+ checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad"
160+ dependencies = [
161+ "libc",
162+ ]
163+
164+ [[package]]
165+ name = "crc"
166+ version = "3.2.1"
167+ source = "registry+https://github.com/rust-lang/crates.io-index"
168+ checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
169+ dependencies = [
170+ "crc-catalog",
171+ ]
172+
173+ [[package]]
174+ name = "crc-catalog"
175+ version = "2.4.0"
176+ source = "registry+https://github.com/rust-lang/crates.io-index"
177+ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
178+
179+ [[package]]
180+ name = "crc32fast"
181+ version = "1.4.2"
182+ source = "registry+https://github.com/rust-lang/crates.io-index"
183+ checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
184+ dependencies = [
185+ "cfg-if",
186+ ]
187+
188+ [[package]]
189 name = "crossbeam-deque"
190 version = "0.8.5"
191 source = "registry+https://github.com/rust-lang/crates.io-index"
192 @@ -123,6 +251,70 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
193 checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
194
195 [[package]]
196+ name = "crypto-common"
197+ version = "0.1.6"
198+ source = "registry+https://github.com/rust-lang/crates.io-index"
199+ checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
200+ dependencies = [
201+ "generic-array",
202+ "typenum",
203+ ]
204+
205+ [[package]]
206+ name = "data-encoding"
207+ version = "2.6.0"
208+ source = "registry+https://github.com/rust-lang/crates.io-index"
209+ checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2"
210+
211+ [[package]]
212+ name = "deflate64"
213+ version = "0.1.9"
214+ source = "registry+https://github.com/rust-lang/crates.io-index"
215+ checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b"
216+
217+ [[package]]
218+ name = "deranged"
219+ version = "0.3.11"
220+ source = "registry+https://github.com/rust-lang/crates.io-index"
221+ checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
222+ dependencies = [
223+ "powerfmt",
224+ ]
225+
226+ [[package]]
227+ name = "derive_arbitrary"
228+ version = "1.3.2"
229+ source = "registry+https://github.com/rust-lang/crates.io-index"
230+ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
231+ dependencies = [
232+ "proc-macro2",
233+ "quote",
234+ "syn",
235+ ]
236+
237+ [[package]]
238+ name = "digest"
239+ version = "0.10.7"
240+ source = "registry+https://github.com/rust-lang/crates.io-index"
241+ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
242+ dependencies = [
243+ "block-buffer",
244+ "crypto-common",
245+ "subtle",
246+ ]
247+
248+ [[package]]
249+ name = "displaydoc"
250+ version = "0.2.5"
251+ source = "registry+https://github.com/rust-lang/crates.io-index"
252+ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
253+ dependencies = [
254+ "proc-macro2",
255+ "quote",
256+ "syn",
257+ ]
258+
259+ [[package]]
260 name = "email_address"
261 version = "0.2.9"
262 source = "registry+https://github.com/rust-lang/crates.io-index"
263 @@ -141,6 +333,34 @@ dependencies = [
264 ]
265
266 [[package]]
267+ name = "enum-as-inner"
268+ version = "0.6.0"
269+ source = "registry+https://github.com/rust-lang/crates.io-index"
270+ checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a"
271+ dependencies = [
272+ "heck",
273+ "proc-macro2",
274+ "quote",
275+ "syn",
276+ ]
277+
278+ [[package]]
279+ name = "equivalent"
280+ version = "1.0.1"
281+ source = "registry+https://github.com/rust-lang/crates.io-index"
282+ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
283+
284+ [[package]]
285+ name = "flate2"
286+ version = "1.0.33"
287+ source = "registry+https://github.com/rust-lang/crates.io-index"
288+ checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253"
289+ dependencies = [
290+ "crc32fast",
291+ "miniz_oxide 0.8.0",
292+ ]
293+
294+ [[package]]
295 name = "form_urlencoded"
296 version = "1.2.1"
297 source = "registry+https://github.com/rust-lang/crates.io-index"
298 @@ -239,6 +459,37 @@ dependencies = [
299 ]
300
301 [[package]]
302+ name = "generic-array"
303+ version = "0.14.7"
304+ source = "registry+https://github.com/rust-lang/crates.io-index"
305+ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
306+ dependencies = [
307+ "typenum",
308+ "version_check",
309+ ]
310+
311+ [[package]]
312+ name = "gethostname"
313+ version = "0.4.3"
314+ source = "registry+https://github.com/rust-lang/crates.io-index"
315+ checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818"
316+ dependencies = [
317+ "libc",
318+ "windows-targets 0.48.5",
319+ ]
320+
321+ [[package]]
322+ name = "getrandom"
323+ version = "0.2.15"
324+ source = "registry+https://github.com/rust-lang/crates.io-index"
325+ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
326+ dependencies = [
327+ "cfg-if",
328+ "libc",
329+ "wasi",
330+ ]
331+
332+ [[package]]
333 name = "gimli"
334 version = "0.29.0"
335 source = "registry+https://github.com/rust-lang/crates.io-index"
336 @@ -255,12 +506,99 @@ dependencies = [
337 ]
338
339 [[package]]
340+ name = "heck"
341+ version = "0.4.1"
342+ source = "registry+https://github.com/rust-lang/crates.io-index"
343+ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
344+
345+ [[package]]
346 name = "hermit-abi"
347 version = "0.3.9"
348 source = "registry+https://github.com/rust-lang/crates.io-index"
349 checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
350
351 [[package]]
352+ name = "hickory-proto"
353+ version = "0.24.1"
354+ source = "registry+https://github.com/rust-lang/crates.io-index"
355+ checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512"
356+ dependencies = [
357+ "async-trait",
358+ "cfg-if",
359+ "data-encoding",
360+ "enum-as-inner",
361+ "futures-channel",
362+ "futures-io",
363+ "futures-util",
364+ "idna 0.4.0",
365+ "ipnet",
366+ "once_cell",
367+ "rand",
368+ "ring 0.16.20",
369+ "rustls",
370+ "rustls-pemfile 1.0.4",
371+ "thiserror",
372+ "tinyvec",
373+ "tokio",
374+ "tokio-rustls",
375+ "tracing",
376+ "url",
377+ ]
378+
379+ [[package]]
380+ name = "hickory-resolver"
381+ version = "0.24.1"
382+ source = "registry+https://github.com/rust-lang/crates.io-index"
383+ checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243"
384+ dependencies = [
385+ "cfg-if",
386+ "futures-util",
387+ "hickory-proto",
388+ "ipconfig",
389+ "lru-cache",
390+ "once_cell",
391+ "parking_lot",
392+ "rand",
393+ "resolv-conf",
394+ "rustls",
395+ "smallvec",
396+ "thiserror",
397+ "tokio",
398+ "tokio-rustls",
399+ "tracing",
400+ ]
401+
402+ [[package]]
403+ name = "hmac"
404+ version = "0.12.1"
405+ source = "registry+https://github.com/rust-lang/crates.io-index"
406+ checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
407+ dependencies = [
408+ "digest",
409+ ]
410+
411+ [[package]]
412+ name = "hostname"
413+ version = "0.3.1"
414+ source = "registry+https://github.com/rust-lang/crates.io-index"
415+ checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867"
416+ dependencies = [
417+ "libc",
418+ "match_cfg",
419+ "winapi",
420+ ]
421+
422+ [[package]]
423+ name = "idna"
424+ version = "0.4.0"
425+ source = "registry+https://github.com/rust-lang/crates.io-index"
426+ checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
427+ dependencies = [
428+ "unicode-bidi",
429+ "unicode-normalization",
430+ ]
431+
432+ [[package]]
433 name = "idna"
434 version = "0.5.0"
435 source = "registry+https://github.com/rust-lang/crates.io-index"
436 @@ -271,6 +609,67 @@ dependencies = [
437 ]
438
439 [[package]]
440+ name = "indexmap"
441+ version = "2.5.0"
442+ source = "registry+https://github.com/rust-lang/crates.io-index"
443+ checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5"
444+ dependencies = [
445+ "equivalent",
446+ "hashbrown",
447+ ]
448+
449+ [[package]]
450+ name = "inout"
451+ version = "0.1.3"
452+ source = "registry+https://github.com/rust-lang/crates.io-index"
453+ checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
454+ dependencies = [
455+ "generic-array",
456+ ]
457+
458+ [[package]]
459+ name = "ipconfig"
460+ version = "0.3.2"
461+ source = "registry+https://github.com/rust-lang/crates.io-index"
462+ checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f"
463+ dependencies = [
464+ "socket2",
465+ "widestring",
466+ "windows-sys 0.48.0",
467+ "winreg",
468+ ]
469+
470+ [[package]]
471+ name = "ipnet"
472+ version = "2.9.0"
473+ source = "registry+https://github.com/rust-lang/crates.io-index"
474+ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
475+
476+ [[package]]
477+ name = "itoa"
478+ version = "1.0.11"
479+ source = "registry+https://github.com/rust-lang/crates.io-index"
480+ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
481+
482+ [[package]]
483+ name = "jobserver"
484+ version = "0.1.32"
485+ source = "registry+https://github.com/rust-lang/crates.io-index"
486+ checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
487+ dependencies = [
488+ "libc",
489+ ]
490+
491+ [[package]]
492+ name = "js-sys"
493+ version = "0.3.70"
494+ source = "registry+https://github.com/rust-lang/crates.io-index"
495+ checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
496+ dependencies = [
497+ "wasm-bindgen",
498+ ]
499+
500+ [[package]]
501 name = "lazy_static"
502 version = "1.5.0"
503 source = "registry+https://github.com/rust-lang/crates.io-index"
504 @@ -283,6 +682,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
505 checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
506
507 [[package]]
508+ name = "linked-hash-map"
509+ version = "0.5.6"
510+ source = "registry+https://github.com/rust-lang/crates.io-index"
511+ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
512+
513+ [[package]]
514 name = "lock_api"
515 version = "0.4.12"
516 source = "registry+https://github.com/rust-lang/crates.io-index"
517 @@ -293,12 +698,67 @@ dependencies = [
518 ]
519
520 [[package]]
521+ name = "lockfree-object-pool"
522+ version = "0.1.6"
523+ source = "registry+https://github.com/rust-lang/crates.io-index"
524+ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
525+
526+ [[package]]
527 name = "log"
528 version = "0.4.22"
529 source = "registry+https://github.com/rust-lang/crates.io-index"
530 checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
531
532 [[package]]
533+ name = "lru-cache"
534+ version = "0.1.2"
535+ source = "registry+https://github.com/rust-lang/crates.io-index"
536+ checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
537+ dependencies = [
538+ "linked-hash-map",
539+ ]
540+
541+ [[package]]
542+ name = "lzma-rs"
543+ version = "0.3.0"
544+ source = "registry+https://github.com/rust-lang/crates.io-index"
545+ checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e"
546+ dependencies = [
547+ "byteorder",
548+ "crc",
549+ ]
550+
551+ [[package]]
552+ name = "mail-auth"
553+ version = "0.5.0"
554+ source = "registry+https://github.com/rust-lang/crates.io-index"
555+ checksum = "aaee4c38f4df428c6732f3d5472a013fa248d2772f48c8932295b32c683a23c4"
556+ dependencies = [
557+ "ahash",
558+ "flate2",
559+ "hickory-resolver",
560+ "lru-cache",
561+ "mail-builder",
562+ "mail-parser",
563+ "parking_lot",
564+ "quick-xml",
565+ "ring 0.17.8",
566+ "rustls-pemfile 2.1.3",
567+ "serde",
568+ "serde_json",
569+ "zip",
570+ ]
571+
572+ [[package]]
573+ name = "mail-builder"
574+ version = "0.3.2"
575+ source = "registry+https://github.com/rust-lang/crates.io-index"
576+ checksum = "25f5871d5270ed80f2ee750b95600c8d69b05f8653ad3be913b2ad2e924fefcb"
577+ dependencies = [
578+ "gethostname",
579+ ]
580+
581+ [[package]]
582 name = "mail-parser"
583 version = "0.9.3"
584 source = "registry+https://github.com/rust-lang/crates.io-index"
585 @@ -313,11 +773,13 @@ name = "maitred"
586 version = "0.1.0"
587 dependencies = [
588 "async-trait",
589- "base64",
590+ "base64 0.22.1",
591 "bytes",
592 "crossbeam-deque",
593 "email_address",
594 "futures",
595+ "mail-auth",
596+ "mail-builder",
597 "mail-parser",
598 "md5",
599 "smtp-proto",
600 @@ -343,6 +805,12 @@ dependencies = [
601 ]
602
603 [[package]]
604+ name = "match_cfg"
605+ version = "0.1.0"
606+ source = "registry+https://github.com/rust-lang/crates.io-index"
607+ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4"
608+
609+ [[package]]
610 name = "md5"
611 version = "0.7.0"
612 source = "registry+https://github.com/rust-lang/crates.io-index"
613 @@ -364,6 +832,15 @@ dependencies = [
614 ]
615
616 [[package]]
617+ name = "miniz_oxide"
618+ version = "0.8.0"
619+ source = "registry+https://github.com/rust-lang/crates.io-index"
620+ checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
621+ dependencies = [
622+ "adler2",
623+ ]
624+
625+ [[package]]
626 name = "mio"
627 version = "1.0.1"
628 source = "registry+https://github.com/rust-lang/crates.io-index"
629 @@ -372,7 +849,7 @@ dependencies = [
630 "hermit-abi",
631 "libc",
632 "wasi",
633- "windows-sys",
634+ "windows-sys 0.52.0",
635 ]
636
637 [[package]]
638 @@ -386,99 +863,274 @@ dependencies = [
639 ]
640
641 [[package]]
642+ name = "num-conv"
643+ version = "0.1.0"
644+ source = "registry+https://github.com/rust-lang/crates.io-index"
645+ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
646+
647+ [[package]]
648 name = "object"
649 version = "0.36.2"
650 source = "registry+https://github.com/rust-lang/crates.io-index"
651- checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e"
652+ checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e"
653+ dependencies = [
654+ "memchr",
655+ ]
656+
657+ [[package]]
658+ name = "once_cell"
659+ version = "1.19.0"
660+ source = "registry+https://github.com/rust-lang/crates.io-index"
661+ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
662+
663+ [[package]]
664+ name = "overload"
665+ version = "0.1.1"
666+ source = "registry+https://github.com/rust-lang/crates.io-index"
667+ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
668+
669+ [[package]]
670+ name = "parking_lot"
671+ version = "0.12.3"
672+ source = "registry+https://github.com/rust-lang/crates.io-index"
673+ checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
674+ dependencies = [
675+ "lock_api",
676+ "parking_lot_core",
677+ ]
678+
679+ [[package]]
680+ name = "parking_lot_core"
681+ version = "0.9.10"
682+ source = "registry+https://github.com/rust-lang/crates.io-index"
683+ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
684+ dependencies = [
685+ "cfg-if",
686+ "libc",
687+ "redox_syscall",
688+ "smallvec",
689+ "windows-targets 0.52.6",
690+ ]
691+
692+ [[package]]
693+ name = "pbkdf2"
694+ version = "0.12.2"
695+ source = "registry+https://github.com/rust-lang/crates.io-index"
696+ checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2"
697+ dependencies = [
698+ "digest",
699+ "hmac",
700+ ]
701+
702+ [[package]]
703+ name = "percent-encoding"
704+ version = "2.3.1"
705+ source = "registry+https://github.com/rust-lang/crates.io-index"
706+ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
707+
708+ [[package]]
709+ name = "pin-project-lite"
710+ version = "0.2.14"
711+ source = "registry+https://github.com/rust-lang/crates.io-index"
712+ checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
713+
714+ [[package]]
715+ name = "pin-utils"
716+ version = "0.1.0"
717+ source = "registry+https://github.com/rust-lang/crates.io-index"
718+ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
719+
720+ [[package]]
721+ name = "pkg-config"
722+ version = "0.3.30"
723+ source = "registry+https://github.com/rust-lang/crates.io-index"
724+ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
725+
726+ [[package]]
727+ name = "powerfmt"
728+ version = "0.2.0"
729+ source = "registry+https://github.com/rust-lang/crates.io-index"
730+ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
731+
732+ [[package]]
733+ name = "ppv-lite86"
734+ version = "0.2.20"
735+ source = "registry+https://github.com/rust-lang/crates.io-index"
736+ checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
737+ dependencies = [
738+ "zerocopy",
739+ ]
740+
741+ [[package]]
742+ name = "proc-macro2"
743+ version = "1.0.86"
744+ source = "registry+https://github.com/rust-lang/crates.io-index"
745+ checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
746+ dependencies = [
747+ "unicode-ident",
748+ ]
749+
750+ [[package]]
751+ name = "quick-error"
752+ version = "1.2.3"
753+ source = "registry+https://github.com/rust-lang/crates.io-index"
754+ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
755+
756+ [[package]]
757+ name = "quick-xml"
758+ version = "0.36.1"
759+ source = "registry+https://github.com/rust-lang/crates.io-index"
760+ checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc"
761+ dependencies = [
762+ "memchr",
763+ ]
764+
765+ [[package]]
766+ name = "quote"
767+ version = "1.0.36"
768+ source = "registry+https://github.com/rust-lang/crates.io-index"
769+ checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
770+ dependencies = [
771+ "proc-macro2",
772+ ]
773+
774+ [[package]]
775+ name = "rand"
776+ version = "0.8.5"
777+ source = "registry+https://github.com/rust-lang/crates.io-index"
778+ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
779+ dependencies = [
780+ "libc",
781+ "rand_chacha",
782+ "rand_core",
783+ ]
784+
785+ [[package]]
786+ name = "rand_chacha"
787+ version = "0.3.1"
788+ source = "registry+https://github.com/rust-lang/crates.io-index"
789+ checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
790+ dependencies = [
791+ "ppv-lite86",
792+ "rand_core",
793+ ]
794+
795+ [[package]]
796+ name = "rand_core"
797+ version = "0.6.4"
798+ source = "registry+https://github.com/rust-lang/crates.io-index"
799+ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
800 dependencies = [
801- "memchr",
802+ "getrandom",
803 ]
804
805 [[package]]
806- name = "once_cell"
807- version = "1.19.0"
808+ name = "redox_syscall"
809+ version = "0.5.3"
810 source = "registry+https://github.com/rust-lang/crates.io-index"
811- checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
812+ checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
813+ dependencies = [
814+ "bitflags",
815+ ]
816
817 [[package]]
818- name = "overload"
819- version = "0.1.1"
820+ name = "resolv-conf"
821+ version = "0.7.0"
822 source = "registry+https://github.com/rust-lang/crates.io-index"
823- checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
824+ checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00"
825+ dependencies = [
826+ "hostname",
827+ "quick-error",
828+ ]
829
830 [[package]]
831- name = "parking_lot"
832- version = "0.12.3"
833+ name = "ring"
834+ version = "0.16.20"
835 source = "registry+https://github.com/rust-lang/crates.io-index"
836- checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
837+ checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
838 dependencies = [
839- "lock_api",
840- "parking_lot_core",
841+ "cc",
842+ "libc",
843+ "once_cell",
844+ "spin 0.5.2",
845+ "untrusted 0.7.1",
846+ "web-sys",
847+ "winapi",
848 ]
849
850 [[package]]
851- name = "parking_lot_core"
852- version = "0.9.10"
853+ name = "ring"
854+ version = "0.17.8"
855 source = "registry+https://github.com/rust-lang/crates.io-index"
856- checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
857+ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
858 dependencies = [
859+ "cc",
860 "cfg-if",
861+ "getrandom",
862 "libc",
863- "redox_syscall",
864- "smallvec",
865- "windows-targets",
866+ "spin 0.9.8",
867+ "untrusted 0.9.0",
868+ "windows-sys 0.52.0",
869 ]
870
871 [[package]]
872- name = "percent-encoding"
873- version = "2.3.1"
874+ name = "rustc-demangle"
875+ version = "0.1.24"
876 source = "registry+https://github.com/rust-lang/crates.io-index"
877- checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
878+ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
879
880 [[package]]
881- name = "pin-project-lite"
882- version = "0.2.14"
883+ name = "rustls"
884+ version = "0.21.12"
885 source = "registry+https://github.com/rust-lang/crates.io-index"
886- checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
887+ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
888+ dependencies = [
889+ "log",
890+ "ring 0.17.8",
891+ "rustls-webpki",
892+ "sct",
893+ ]
894
895 [[package]]
896- name = "pin-utils"
897- version = "0.1.0"
898+ name = "rustls-pemfile"
899+ version = "1.0.4"
900 source = "registry+https://github.com/rust-lang/crates.io-index"
901- checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
902+ checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
903+ dependencies = [
904+ "base64 0.21.7",
905+ ]
906
907 [[package]]
908- name = "proc-macro2"
909- version = "1.0.86"
910+ name = "rustls-pemfile"
911+ version = "2.1.3"
912 source = "registry+https://github.com/rust-lang/crates.io-index"
913- checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
914+ checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
915 dependencies = [
916- "unicode-ident",
917+ "base64 0.22.1",
918+ "rustls-pki-types",
919 ]
920
921 [[package]]
922- name = "quote"
923- version = "1.0.36"
924+ name = "rustls-pki-types"
925+ version = "1.8.0"
926 source = "registry+https://github.com/rust-lang/crates.io-index"
927- checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
928- dependencies = [
929- "proc-macro2",
930- ]
931+ checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
932
933 [[package]]
934- name = "redox_syscall"
935- version = "0.5.3"
936+ name = "rustls-webpki"
937+ version = "0.101.7"
938 source = "registry+https://github.com/rust-lang/crates.io-index"
939- checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
940+ checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
941 dependencies = [
942- "bitflags",
943+ "ring 0.17.8",
944+ "untrusted 0.9.0",
945 ]
946
947 [[package]]
948- name = "rustc-demangle"
949- version = "0.1.24"
950+ name = "ryu"
951+ version = "1.0.18"
952 source = "registry+https://github.com/rust-lang/crates.io-index"
953- checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
954+ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
955
956 [[package]]
957 name = "scopeguard"
958 @@ -487,6 +1139,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
959 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
960
961 [[package]]
962+ name = "sct"
963+ version = "0.7.1"
964+ source = "registry+https://github.com/rust-lang/crates.io-index"
965+ checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
966+ dependencies = [
967+ "ring 0.17.8",
968+ "untrusted 0.9.0",
969+ ]
970+
971+ [[package]]
972 name = "serde"
973 version = "1.0.204"
974 source = "registry+https://github.com/rust-lang/crates.io-index"
975 @@ -507,6 +1169,29 @@ dependencies = [
976 ]
977
978 [[package]]
979+ name = "serde_json"
980+ version = "1.0.127"
981+ source = "registry+https://github.com/rust-lang/crates.io-index"
982+ checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
983+ dependencies = [
984+ "itoa",
985+ "memchr",
986+ "ryu",
987+ "serde",
988+ ]
989+
990+ [[package]]
991+ name = "sha1"
992+ version = "0.10.6"
993+ source = "registry+https://github.com/rust-lang/crates.io-index"
994+ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
995+ dependencies = [
996+ "cfg-if",
997+ "cpufeatures",
998+ "digest",
999+ ]
1000+
1001+ [[package]]
1002 name = "sharded-slab"
1003 version = "0.1.7"
1004 source = "registry+https://github.com/rust-lang/crates.io-index"
1005 @@ -525,6 +1210,12 @@ dependencies = [
1006 ]
1007
1008 [[package]]
1009+ name = "simd-adler32"
1010+ version = "0.3.7"
1011+ source = "registry+https://github.com/rust-lang/crates.io-index"
1012+ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
1013+
1014+ [[package]]
1015 name = "slab"
1016 version = "0.4.9"
1017 source = "registry+https://github.com/rust-lang/crates.io-index"
1018 @@ -555,10 +1246,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1019 checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
1020 dependencies = [
1021 "libc",
1022- "windows-sys",
1023+ "windows-sys 0.52.0",
1024 ]
1025
1026 [[package]]
1027+ name = "spin"
1028+ version = "0.5.2"
1029+ source = "registry+https://github.com/rust-lang/crates.io-index"
1030+ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
1031+
1032+ [[package]]
1033+ name = "spin"
1034+ version = "0.9.8"
1035+ source = "registry+https://github.com/rust-lang/crates.io-index"
1036+ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
1037+
1038+ [[package]]
1039 name = "stringprep"
1040 version = "0.1.5"
1041 source = "registry+https://github.com/rust-lang/crates.io-index"
1042 @@ -570,6 +1273,12 @@ dependencies = [
1043 ]
1044
1045 [[package]]
1046+ name = "subtle"
1047+ version = "2.6.1"
1048+ source = "registry+https://github.com/rust-lang/crates.io-index"
1049+ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1050+
1051+ [[package]]
1052 name = "syn"
1053 version = "2.0.72"
1054 source = "registry+https://github.com/rust-lang/crates.io-index"
1055 @@ -611,6 +1320,25 @@ dependencies = [
1056 ]
1057
1058 [[package]]
1059+ name = "time"
1060+ version = "0.3.36"
1061+ source = "registry+https://github.com/rust-lang/crates.io-index"
1062+ checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
1063+ dependencies = [
1064+ "deranged",
1065+ "num-conv",
1066+ "powerfmt",
1067+ "serde",
1068+ "time-core",
1069+ ]
1070+
1071+ [[package]]
1072+ name = "time-core"
1073+ version = "0.1.2"
1074+ source = "registry+https://github.com/rust-lang/crates.io-index"
1075+ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
1076+
1077+ [[package]]
1078 name = "tinyvec"
1079 version = "1.8.0"
1080 source = "registry+https://github.com/rust-lang/crates.io-index"
1081 @@ -640,7 +1368,7 @@ dependencies = [
1082 "signal-hook-registry",
1083 "socket2",
1084 "tokio-macros",
1085- "windows-sys",
1086+ "windows-sys 0.52.0",
1087 ]
1088
1089 [[package]]
1090 @@ -655,6 +1383,16 @@ dependencies = [
1091 ]
1092
1093 [[package]]
1094+ name = "tokio-rustls"
1095+ version = "0.24.1"
1096+ source = "registry+https://github.com/rust-lang/crates.io-index"
1097+ checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
1098+ dependencies = [
1099+ "rustls",
1100+ "tokio",
1101+ ]
1102+
1103+ [[package]]
1104 name = "tokio-stream"
1105 version = "0.1.15"
1106 source = "registry+https://github.com/rust-lang/crates.io-index"
1107 @@ -742,6 +1480,12 @@ dependencies = [
1108 ]
1109
1110 [[package]]
1111+ name = "typenum"
1112+ version = "1.17.0"
1113+ source = "registry+https://github.com/rust-lang/crates.io-index"
1114+ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
1115+
1116+ [[package]]
1117 name = "unicode-bidi"
1118 version = "0.3.15"
1119 source = "registry+https://github.com/rust-lang/crates.io-index"
1120 @@ -769,13 +1513,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1121 checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524"
1122
1123 [[package]]
1124+ name = "untrusted"
1125+ version = "0.7.1"
1126+ source = "registry+https://github.com/rust-lang/crates.io-index"
1127+ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
1128+
1129+ [[package]]
1130+ name = "untrusted"
1131+ version = "0.9.0"
1132+ source = "registry+https://github.com/rust-lang/crates.io-index"
1133+ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
1134+
1135+ [[package]]
1136 name = "url"
1137 version = "2.5.2"
1138 source = "registry+https://github.com/rust-lang/crates.io-index"
1139 checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
1140 dependencies = [
1141 "form_urlencoded",
1142- "idna",
1143+ "idna 0.5.0",
1144 "percent-encoding",
1145 ]
1146
1147 @@ -798,6 +1554,77 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1148 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
1149
1150 [[package]]
1151+ name = "wasm-bindgen"
1152+ version = "0.2.93"
1153+ source = "registry+https://github.com/rust-lang/crates.io-index"
1154+ checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
1155+ dependencies = [
1156+ "cfg-if",
1157+ "once_cell",
1158+ "wasm-bindgen-macro",
1159+ ]
1160+
1161+ [[package]]
1162+ name = "wasm-bindgen-backend"
1163+ version = "0.2.93"
1164+ source = "registry+https://github.com/rust-lang/crates.io-index"
1165+ checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
1166+ dependencies = [
1167+ "bumpalo",
1168+ "log",
1169+ "once_cell",
1170+ "proc-macro2",
1171+ "quote",
1172+ "syn",
1173+ "wasm-bindgen-shared",
1174+ ]
1175+
1176+ [[package]]
1177+ name = "wasm-bindgen-macro"
1178+ version = "0.2.93"
1179+ source = "registry+https://github.com/rust-lang/crates.io-index"
1180+ checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
1181+ dependencies = [
1182+ "quote",
1183+ "wasm-bindgen-macro-support",
1184+ ]
1185+
1186+ [[package]]
1187+ name = "wasm-bindgen-macro-support"
1188+ version = "0.2.93"
1189+ source = "registry+https://github.com/rust-lang/crates.io-index"
1190+ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
1191+ dependencies = [
1192+ "proc-macro2",
1193+ "quote",
1194+ "syn",
1195+ "wasm-bindgen-backend",
1196+ "wasm-bindgen-shared",
1197+ ]
1198+
1199+ [[package]]
1200+ name = "wasm-bindgen-shared"
1201+ version = "0.2.93"
1202+ source = "registry+https://github.com/rust-lang/crates.io-index"
1203+ checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
1204+
1205+ [[package]]
1206+ name = "web-sys"
1207+ version = "0.3.70"
1208+ source = "registry+https://github.com/rust-lang/crates.io-index"
1209+ checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0"
1210+ dependencies = [
1211+ "js-sys",
1212+ "wasm-bindgen",
1213+ ]
1214+
1215+ [[package]]
1216+ name = "widestring"
1217+ version = "1.1.0"
1218+ source = "registry+https://github.com/rust-lang/crates.io-index"
1219+ checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311"
1220+
1221+ [[package]]
1222 name = "winapi"
1223 version = "0.3.9"
1224 source = "registry+https://github.com/rust-lang/crates.io-index"
1225 @@ -821,11 +1648,35 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1226
1227 [[package]]
1228 name = "windows-sys"
1229+ version = "0.48.0"
1230+ source = "registry+https://github.com/rust-lang/crates.io-index"
1231+ checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
1232+ dependencies = [
1233+ "windows-targets 0.48.5",
1234+ ]
1235+
1236+ [[package]]
1237+ name = "windows-sys"
1238 version = "0.52.0"
1239 source = "registry+https://github.com/rust-lang/crates.io-index"
1240 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
1241 dependencies = [
1242- "windows-targets",
1243+ "windows-targets 0.52.6",
1244+ ]
1245+
1246+ [[package]]
1247+ name = "windows-targets"
1248+ version = "0.48.5"
1249+ source = "registry+https://github.com/rust-lang/crates.io-index"
1250+ checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
1251+ dependencies = [
1252+ "windows_aarch64_gnullvm 0.48.5",
1253+ "windows_aarch64_msvc 0.48.5",
1254+ "windows_i686_gnu 0.48.5",
1255+ "windows_i686_msvc 0.48.5",
1256+ "windows_x86_64_gnu 0.48.5",
1257+ "windows_x86_64_gnullvm 0.48.5",
1258+ "windows_x86_64_msvc 0.48.5",
1259 ]
1260
1261 [[package]]
1262 @@ -834,30 +1685,48 @@ version = "0.52.6"
1263 source = "registry+https://github.com/rust-lang/crates.io-index"
1264 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
1265 dependencies = [
1266- "windows_aarch64_gnullvm",
1267- "windows_aarch64_msvc",
1268- "windows_i686_gnu",
1269+ "windows_aarch64_gnullvm 0.52.6",
1270+ "windows_aarch64_msvc 0.52.6",
1271+ "windows_i686_gnu 0.52.6",
1272 "windows_i686_gnullvm",
1273- "windows_i686_msvc",
1274- "windows_x86_64_gnu",
1275- "windows_x86_64_gnullvm",
1276- "windows_x86_64_msvc",
1277+ "windows_i686_msvc 0.52.6",
1278+ "windows_x86_64_gnu 0.52.6",
1279+ "windows_x86_64_gnullvm 0.52.6",
1280+ "windows_x86_64_msvc 0.52.6",
1281 ]
1282
1283 [[package]]
1284 name = "windows_aarch64_gnullvm"
1285+ version = "0.48.5"
1286+ source = "registry+https://github.com/rust-lang/crates.io-index"
1287+ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
1288+
1289+ [[package]]
1290+ name = "windows_aarch64_gnullvm"
1291 version = "0.52.6"
1292 source = "registry+https://github.com/rust-lang/crates.io-index"
1293 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
1294
1295 [[package]]
1296 name = "windows_aarch64_msvc"
1297+ version = "0.48.5"
1298+ source = "registry+https://github.com/rust-lang/crates.io-index"
1299+ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
1300+
1301+ [[package]]
1302+ name = "windows_aarch64_msvc"
1303 version = "0.52.6"
1304 source = "registry+https://github.com/rust-lang/crates.io-index"
1305 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
1306
1307 [[package]]
1308 name = "windows_i686_gnu"
1309+ version = "0.48.5"
1310+ source = "registry+https://github.com/rust-lang/crates.io-index"
1311+ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
1312+
1313+ [[package]]
1314+ name = "windows_i686_gnu"
1315 version = "0.52.6"
1316 source = "registry+https://github.com/rust-lang/crates.io-index"
1317 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
1318 @@ -870,34 +1739,69 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
1319
1320 [[package]]
1321 name = "windows_i686_msvc"
1322+ version = "0.48.5"
1323+ source = "registry+https://github.com/rust-lang/crates.io-index"
1324+ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
1325+
1326+ [[package]]
1327+ name = "windows_i686_msvc"
1328 version = "0.52.6"
1329 source = "registry+https://github.com/rust-lang/crates.io-index"
1330 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
1331
1332 [[package]]
1333 name = "windows_x86_64_gnu"
1334+ version = "0.48.5"
1335+ source = "registry+https://github.com/rust-lang/crates.io-index"
1336+ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
1337+
1338+ [[package]]
1339+ name = "windows_x86_64_gnu"
1340 version = "0.52.6"
1341 source = "registry+https://github.com/rust-lang/crates.io-index"
1342 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
1343
1344 [[package]]
1345 name = "windows_x86_64_gnullvm"
1346+ version = "0.48.5"
1347+ source = "registry+https://github.com/rust-lang/crates.io-index"
1348+ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
1349+
1350+ [[package]]
1351+ name = "windows_x86_64_gnullvm"
1352 version = "0.52.6"
1353 source = "registry+https://github.com/rust-lang/crates.io-index"
1354 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
1355
1356 [[package]]
1357 name = "windows_x86_64_msvc"
1358+ version = "0.48.5"
1359+ source = "registry+https://github.com/rust-lang/crates.io-index"
1360+ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
1361+
1362+ [[package]]
1363+ name = "windows_x86_64_msvc"
1364 version = "0.52.6"
1365 source = "registry+https://github.com/rust-lang/crates.io-index"
1366 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1367
1368 [[package]]
1369+ name = "winreg"
1370+ version = "0.50.0"
1371+ source = "registry+https://github.com/rust-lang/crates.io-index"
1372+ checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
1373+ dependencies = [
1374+ "cfg-if",
1375+ "windows-sys 0.48.0",
1376+ ]
1377+
1378+ [[package]]
1379 name = "zerocopy"
1380 version = "0.7.35"
1381 source = "registry+https://github.com/rust-lang/crates.io-index"
1382 checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
1383 dependencies = [
1384+ "byteorder",
1385 "zerocopy-derive",
1386 ]
1387
1388 @@ -911,3 +1815,94 @@ dependencies = [
1389 "quote",
1390 "syn",
1391 ]
1392+
1393+ [[package]]
1394+ name = "zeroize"
1395+ version = "1.8.1"
1396+ source = "registry+https://github.com/rust-lang/crates.io-index"
1397+ checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
1398+ dependencies = [
1399+ "zeroize_derive",
1400+ ]
1401+
1402+ [[package]]
1403+ name = "zeroize_derive"
1404+ version = "1.4.2"
1405+ source = "registry+https://github.com/rust-lang/crates.io-index"
1406+ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
1407+ dependencies = [
1408+ "proc-macro2",
1409+ "quote",
1410+ "syn",
1411+ ]
1412+
1413+ [[package]]
1414+ name = "zip"
1415+ version = "2.2.0"
1416+ source = "registry+https://github.com/rust-lang/crates.io-index"
1417+ checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494"
1418+ dependencies = [
1419+ "aes",
1420+ "arbitrary",
1421+ "bzip2",
1422+ "constant_time_eq",
1423+ "crc32fast",
1424+ "crossbeam-utils",
1425+ "deflate64",
1426+ "displaydoc",
1427+ "flate2",
1428+ "hmac",
1429+ "indexmap",
1430+ "lzma-rs",
1431+ "memchr",
1432+ "pbkdf2",
1433+ "rand",
1434+ "sha1",
1435+ "thiserror",
1436+ "time",
1437+ "zeroize",
1438+ "zopfli",
1439+ "zstd",
1440+ ]
1441+
1442+ [[package]]
1443+ name = "zopfli"
1444+ version = "0.8.1"
1445+ source = "registry+https://github.com/rust-lang/crates.io-index"
1446+ checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946"
1447+ dependencies = [
1448+ "bumpalo",
1449+ "crc32fast",
1450+ "lockfree-object-pool",
1451+ "log",
1452+ "once_cell",
1453+ "simd-adler32",
1454+ ]
1455+
1456+ [[package]]
1457+ name = "zstd"
1458+ version = "0.13.2"
1459+ source = "registry+https://github.com/rust-lang/crates.io-index"
1460+ checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
1461+ dependencies = [
1462+ "zstd-safe",
1463+ ]
1464+
1465+ [[package]]
1466+ name = "zstd-safe"
1467+ version = "7.2.1"
1468+ source = "registry+https://github.com/rust-lang/crates.io-index"
1469+ checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059"
1470+ dependencies = [
1471+ "zstd-sys",
1472+ ]
1473+
1474+ [[package]]
1475+ name = "zstd-sys"
1476+ version = "2.0.13+zstd.1.5.6"
1477+ source = "registry+https://github.com/rust-lang/crates.io-index"
1478+ checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
1479+ dependencies = [
1480+ "cc",
1481+ "pkg-config",
1482+ ]
1483 diff --git a/README.md b/README.md
1484index 0f79c33..6b90c30 100644
1485--- a/README.md
1486+++ b/README.md
1487 @@ -38,17 +38,17 @@ for _absolutely nothing_ that is important.
1488
1489 ### SMTP Base server and Commands [RFC5321](rfcs/rfc5321.txt)
1490
1491- | Name | Status | Notes |
1492- |-----------|--------|------------------------|
1493- | HELO | ✅ | |
1494- | EHLO | ✅ | |
1495- | MAIL | ✅ | |
1496- | RCPT | ✅ | |
1497- | BDAT | ✅ | |
1498- | DATA | ✅ | |
1499- | AUTH | ✅ | SASL PLAIN only |
1500- | VRFY | ✅ | |
1501- | EXPN | ✅ | |
1502+ | Name | Status | Notes |
1503+ |-----------|--------|-------------------------------------------------------|
1504+ | HELO | ✅ | |
1505+ | EHLO | ✅ | |
1506+ | MAIL | ✅ | |
1507+ | RCPT | ✅ | |
1508+ | BDAT | ✅ | |
1509+ | DATA | ✅ | |
1510+ | AUTH | ✅ | SASL PLAIN only |
1511+ | VRFY | ✅ | |
1512+ | EXPN | ✅ | |
1513 | STARTTLS | ❌ | For the moment there is no plan to implement STARTTLS |
1514
1515
1516 @@ -59,7 +59,7 @@ for _absolutely nothing_ that is important.
1517 | SIZE | ✅ | [RFC1870](rfcs/rfc1870.txt) |
1518 | PIPELINING | ✅ | [RFC2920](rfcs/rfc2920.txt) |
1519 | 8BITMIME | ✅ | [RFC6152](rfcs/rfc6152.txt) |
1520- | ENHANCED STATUS CODES | TODO | [RFC2920](rfcs/rfc3463.txt) |
1521+ | ENHANCED STATUS CODES | ⚠️ | [RFC2920](rfcs/rfc3463.txt) |
1522 | SMTPUTF8 | TODO | [RFC6531](rfcs/rfc6531.txt) |
1523 | CHUNKING | TODO | [RFC3030](rfcs/rfc3030.txt) |
1524 | DSN | TODO | [RFC3461](rfcs/rfc3461.txt) |
1525 @@ -67,6 +67,20 @@ for _absolutely nothing_ that is important.
1526 | ATRN | ❌ | RFC2645 |
1527 | BURL | ❌ | RFC4468 |
1528
1529+ ### Authentication Extensions
1530+
1531+ All authentication extensions are implemented with the
1532+ [mail-auth](https://crates.io/crates/mail-auth) package from Stalwart.
1533+
1534+ |name | status |
1535+ |---------------------------|--------|
1536+ | DKIM Verification | ✅ |
1537+ | ARC Chain Verification | TODO |
1538+ | SPF Policy Evaluation | TODO |
1539+ | DMARC Policy Evaluation | TODO |
1540+
1541+
1542+
1543 ## Attributions
1544
1545 Several of the free software libraries released by
1546 diff --git a/maitred/Cargo.toml b/maitred/Cargo.toml
1547index d91b51e..514da87 100644
1548--- a/maitred/Cargo.toml
1549+++ b/maitred/Cargo.toml
1550 @@ -10,6 +10,8 @@ bytes = "1.6.1"
1551 crossbeam-deque = "0.8.5"
1552 email_address = "0.2.9"
1553 futures = "0.3.30"
1554+ mail-auth = "0.5.0"
1555+ mail-builder = "0.3.2"
1556 mail-parser = { version = "0.9.3", features = ["serde", "serde_support"] }
1557 md5 = "0.7.0"
1558 smtp-proto = { version = "0.1.5", features = ["serde", "serde_support"] }
1559 diff --git a/maitred/src/server.rs b/maitred/src/server.rs
1560index 2906b8e..e7a90db 100644
1561--- a/maitred/src/server.rs
1562+++ b/maitred/src/server.rs
1563 @@ -7,6 +7,7 @@ use crossbeam_deque::Stealer;
1564 use crossbeam_deque::Worker as WorkQueue;
1565 use futures::SinkExt;
1566 use futures::StreamExt;
1567+ use mail_auth::Resolver;
1568 use smtp_proto::Request;
1569 use tokio::net::TcpListener;
1570 use tokio::sync::mpsc::Sender;
1571 @@ -22,6 +23,7 @@ use crate::milter::Milter;
1572 use crate::session::{Session, SessionOptions};
1573 use crate::smtp_response;
1574 use crate::transport::{Command, Transport, TransportError};
1575+ use crate::worker::AuthSystem;
1576 use crate::worker::{Packet, Worker};
1577 use crate::{Response, SmtpResponse};
1578
1579 @@ -63,6 +65,7 @@ pub struct Server {
1580 delivery: Option<Arc<dyn Delivery>>,
1581 n_threads: usize,
1582 shutdown_handles: Vec<Sender<bool>>,
1583+ dkim_verification: bool,
1584 }
1585
1586 impl Default for Server {
1587 @@ -75,6 +78,7 @@ impl Default for Server {
1588 delivery: None,
1589 n_threads: std::thread::available_parallelism().unwrap().into(),
1590 shutdown_handles: vec![],
1591+ dkim_verification: false,
1592 }
1593 }
1594 }
1595 @@ -120,6 +124,11 @@ impl Server {
1596 self
1597 }
1598
1599+ pub fn dkim_verification(mut self, enabled: bool) -> Self {
1600+ self.dkim_verification = enabled;
1601+ self
1602+ }
1603+
1604 async fn process<T>(
1605 &self,
1606 mut framed: Framed<T, Transport>,
1607 @@ -252,7 +261,10 @@ impl Server {
1608 let stealers = stealers.clone();
1609 let milter = self.milter.clone();
1610 let delivery = self.delivery.clone();
1611+ let dkim_verification = self.dkim_verification;
1612 tokio::task::spawn(async move {
1613+ let mut auth = AuthSystem::new().await;
1614+ auth.dkim_verification = dkim_verification;
1615 let mut worker = Worker {
1616 milter,
1617 delivery,
1618 @@ -260,6 +272,7 @@ impl Server {
1619 stealers,
1620 local_queue: Arc::new(Mutex::new(local_queue)),
1621 shutdown_rx,
1622+ auth,
1623 };
1624 worker.process().await
1625 })
1626 diff --git a/maitred/src/transport.rs b/maitred/src/transport.rs
1627index 74e3c4c..3d11cdc 100644
1628--- a/maitred/src/transport.rs
1629+++ b/maitred/src/transport.rs
1630 @@ -93,6 +93,9 @@ impl Display for Command {
1631 }
1632 }
1633
1634+ /// Line oriented transport
1635+ /// TODO: BDAT
1636+ /// TODO: BINARYMIME
1637 #[derive(Default)]
1638 pub(crate) struct Transport {
1639 receiver: Option<Box<Receiver>>,
1640 diff --git a/maitred/src/worker.rs b/maitred/src/worker.rs
1641index e8c2b94..78bda79 100644
1642--- a/maitred/src/worker.rs
1643+++ b/maitred/src/worker.rs
1644 @@ -3,15 +3,34 @@ use std::{iter, time::Duration};
1645
1646 use crossbeam_deque::{Injector, Stealer, Worker as WorkQueue};
1647 use email_address::EmailAddress;
1648+ use mail_auth::{AuthenticatedMessage, DkimResult, Resolver};
1649 use mail_parser::Message;
1650 use tokio::sync::{mpsc::Receiver, Mutex};
1651 use url::Host;
1652
1653 use crate::delivery::Delivery;
1654 use crate::milter::Milter;
1655+ use crate::rewrite::Rewrite;
1656 use crate::session::Session;
1657 use crate::Error;
1658
1659+ const HEADER_DKIM_RESULT: &str = "Maitred-Dkim-Result";
1660+
1661+ pub struct AuthSystem {
1662+ resolver: Resolver,
1663+ pub dkim_verification: bool,
1664+ }
1665+
1666+ impl AuthSystem {
1667+ pub async fn new() -> Self {
1668+ let resolver = Resolver::new_system_conf().unwrap();
1669+ AuthSystem {
1670+ resolver,
1671+ dkim_verification: false,
1672+ }
1673+ }
1674+ }
1675+
1676 /// Session details to be passed internally for processing
1677 #[derive(Clone, Debug)]
1678 pub(crate) struct Packet {
1679 @@ -46,6 +65,7 @@ pub(crate) struct Worker {
1680 pub stealers: Vec<Stealer<Packet>>,
1681 pub local_queue: Arc<Mutex<WorkQueue<Packet>>>,
1682 pub shutdown_rx: Receiver<bool>,
1683+ pub auth: AuthSystem,
1684 }
1685
1686 impl Worker {
1687 @@ -75,7 +95,31 @@ impl Worker {
1688
1689 if let Some(packet) = self.next_packet().await {
1690 let mut message = packet.body.unwrap();
1691+ let message_id = message
1692+ .message_id()
1693+ .map(|id| id.to_string())
1694+ .unwrap_or(String::from("Unknown Message"));
1695+ let message_bytes = message.raw_message().to_vec();
1696+ let mut dkim_passed: Option<bool> = None;
1697+ if self.auth.dkim_verification {
1698+ let authenticated =
1699+ AuthenticatedMessage::parse(message_bytes.as_slice()).unwrap();
1700+ tracing::info!("DKIM Verification for {}", message_id);
1701+ let passed = self
1702+ .auth
1703+ .resolver
1704+ .verify_dkim(&authenticated)
1705+ .await
1706+ .iter()
1707+ .all(|s| {
1708+ tracing::info!("{:?}", s);
1709+ matches!(s.result(), DkimResult::Pass)
1710+ });
1711+ dkim_passed = Some(passed);
1712+ }
1713+
1714 if let Some(milter) = &self.milter {
1715+ tracing::info!("Applying Milter to message {}", message_id);
1716 match milter.apply(&message).await {
1717 Ok(modified) => {
1718 tracing::info!("Milter finished successfully");
1719 @@ -87,8 +131,17 @@ impl Worker {
1720 };
1721 }
1722
1723+ let mut modified_message_bytes = message.raw_message().to_vec();
1724+ let mut modified = Rewrite(&mut modified_message_bytes);
1725+ if let Some(dkim_passed) = dkim_passed {
1726+ modified.with_header(HEADER_DKIM_RESULT, &dkim_passed.to_string())
1727+ }
1728+
1729+ let to_deliver = modified.message().unwrap();
1730+
1731 if let Some(delivery) = &self.delivery {
1732- match delivery.deliver(&message).await {
1733+ tracing::info!("Delivering message {}", message_id);
1734+ match delivery.deliver(&to_deliver.into_owned()).await {
1735 Ok(_) => tracing::info!("Message successfully delivered"),
1736 // TODO: Implement retry here
1737 Err(err) => tracing::warn!("Message could not be delievered: {:?}", err),