diff --git a/Cargo.lock b/Cargo.lock index 16e3fe2c3..b97cb73eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -290,7 +290,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", "synstructure 0.13.1", ] @@ -313,7 +313,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -359,7 +359,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -381,7 +381,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -392,7 +392,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -514,7 +514,7 @@ dependencies = [ "pin-project", "quick-xml 0.31.0", "rand 0.8.5", - "reqwest 0.12.9", + "reqwest 0.12.12", "rustc_version 0.4.1", "serde", "serde_json", @@ -677,7 +677,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -697,7 +697,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -715,7 +715,7 @@ dependencies = [ "regex", "rustc-hash 2.1.0", "shlex", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -897,7 +897,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -1016,9 +1016,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" dependencies = [ "jobserver", "libc", @@ -1075,16 +1075,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "charset" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e9079d1a12a2cc2bffb5db039c43661836ead4082120d5844f02555aca2d46" -dependencies = [ - "base64 0.13.1", - "encoding_rs", -] - [[package]] name = "chrono" version = "0.4.39" @@ -1162,7 +1152,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -1257,7 +1247,7 @@ dependencies = [ "pwhash", "rcgen 0.12.1", "regex", - "reqwest 0.12.9", + "reqwest 0.12.12", "ring 0.17.8", "rsa", "rustls 0.23.20", @@ -1560,7 +1550,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -1608,7 +1598,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -1630,7 +1620,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -1788,7 +1778,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -1842,7 +1832,7 @@ dependencies = [ "proc_macros", "pwhash", "regex", - "reqwest 0.12.9", + "reqwest 0.12.12", "rustls 0.23.20", "rustls-pki-types", "scrypt", @@ -1888,7 +1878,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -1907,7 +1897,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14b0a9ca156a0285b2768b7fcb368b231e7736d3c13eef604c5c4203057bed33" dependencies = [ "hickory-client", - "reqwest 0.12.9", + "reqwest 0.12.12", "serde", "serde_json", "serde_urlencoded", @@ -2107,7 +2097,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -2149,7 +2139,7 @@ version = "0.11.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -2325,7 +2315,7 @@ checksum = "afc84a5ff0dba78222551017f5625f3365aa09551c78cfaa44136fc6818c2611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", "try_map", ] @@ -2368,7 +2358,7 @@ checksum = "e99b8b3c28ae0e84b604c75f721c21dc77afb3706076af5e8216d15fd1deaae3" dependencies = [ "frunk_proc_macro_helpers", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -2380,7 +2370,7 @@ dependencies = [ "frunk_core", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -2392,7 +2382,7 @@ dependencies = [ "frunk_core", "frunk_proc_macro_helpers", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -2472,7 +2462,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -2534,16 +2524,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "gethostname" version = "0.4.3" @@ -2596,9 +2576,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "group" @@ -3192,7 +3172,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -3296,7 +3276,7 @@ dependencies = [ "libflate", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -3526,7 +3506,7 @@ dependencies = [ "rasn", "rasn-cms", "rasn-pkix", - "reqwest 0.12.9", + "reqwest 0.12.12", "rev_lines", "rsa", "sequoia-openpgp", @@ -3614,9 +3594,9 @@ dependencies = [ [[package]] name = "konst" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298ddf99f06a97c1ecd0e910932662b7842855046234b0d0376d35d93add087f" +checksum = "4381b9b00c55f251f2ebe9473aef7c117e96828def1a7cb3bd3f0f903c6894e9" dependencies = [ "const_panic", "konst_kernel", @@ -3896,7 +3876,7 @@ dependencies = [ "hickory-resolver", "mail-builder", "mail-parser", - "quick-xml 0.37.1", + "quick-xml 0.37.2", "quick_cache", "rand 0.8.5", "ring 0.17.8", @@ -3913,7 +3893,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25f5871d5270ed80f2ee750b95600c8d69b05f8653ad3be913b2ad2e924fefcb" dependencies = [ - "gethostname 0.4.3", + "gethostname", ] [[package]] @@ -3933,7 +3913,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a575d25cf00ed68e5790b473b29242a47e991c6187785d47b45e31fc5816554" dependencies = [ "base64 0.22.1", - "gethostname 0.4.3", + "gethostname", "md5", "rustls 0.23.20", "rustls-pki-types", @@ -3964,24 +3944,12 @@ dependencies = [ ] [[package]] -name = "maildir" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879a6ae6743ab8219fdee64a569094485bfe18434e82b78b27fac5cce09e1437" -dependencies = [ - "gethostname 0.2.3", - "mailparse", -] - -[[package]] -name = "mailparse" -version = "0.14.1" +name = "maildirpp" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d096594926cab442e054e047eb8c1402f7d5b2272573b97ba68aa40629f9757" +checksum = "6c3815b1275127c863a9830c8007fc79c476f34efbd2c1757e7116e0a2152a81" dependencies = [ - "charset", - "data-encoding", - "quoted_printable", + "gethostname", ] [[package]] @@ -4036,7 +4004,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -4153,7 +4121,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", "termcolor", "thiserror 1.0.69", ] @@ -4443,7 +4411,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -4488,7 +4456,7 @@ dependencies = [ "bytes", "http 1.2.0", "opentelemetry", - "reqwest 0.12.9", + "reqwest 0.12.12", ] [[package]] @@ -4505,7 +4473,7 @@ dependencies = [ "opentelemetry-proto", "opentelemetry_sdk", "prost", - "reqwest 0.12.9", + "reqwest 0.12.12", "thiserror 1.0.69", "tokio", "tonic", @@ -4729,7 +4697,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -4767,7 +4735,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -4903,7 +4871,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -4967,7 +4935,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -4985,7 +4953,7 @@ version = "0.11.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -5022,7 +4990,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -5122,9 +5090,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.37.1" +version = "0.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f22f29bdff3987b4d8632ef95fd6424ec7e4e0a57e2f4fc63e489e75357f6a03" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" dependencies = [ "memchr", ] @@ -5202,12 +5170,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "quoted_printable" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ec282e887b434b68c18fe5c121d38e72a5cf35119b59e54ec5b992ea9c8eb0" - [[package]] name = "r2d2" version = "0.8.10" @@ -5545,9 +5507,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", @@ -5580,6 +5542,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.1", "tokio-util", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", @@ -6008,9 +5971,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" @@ -6044,9 +6007,9 @@ checksum = "ece8e78b2f38ec51c51f5d475df0a7187ba5111b2a28bdc761ee05b075d40a71" [[package]] name = "scc" -version = "2.2.6" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b13f8ea6177672c49d12ed964cca44836f59621981b04a3e26b87e675181de" +checksum = "28e1c91382686d21b5ac7959341fcb9780fa7c03773646995a87c950fa7be640" dependencies = [ "sdd", ] @@ -6225,9 +6188,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -6243,13 +6206,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -6332,7 +6295,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -6506,7 +6469,7 @@ dependencies = [ "rand 0.8.5", "rayon", "regex", - "reqwest 0.12.9", + "reqwest 0.12.12", "rustls 0.23.20", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -6583,7 +6546,7 @@ dependencies = [ "mail-send", "nlp", "psl", - "reqwest 0.12.9", + "reqwest 0.12.12", "sha1", "sha2 0.10.8", "smtp-proto", @@ -6636,12 +6599,12 @@ dependencies = [ "jmap-client", "mail-auth", "mail-parser", - "maildir", + "maildirpp", "num_cpus", "prettytable-rs", "pwhash", "rand 0.8.5", - "reqwest 0.12.9", + "reqwest 0.12.12", "rpassword", "serde", "serde_json", @@ -6686,7 +6649,7 @@ dependencies = [ "rayon", "redis", "regex", - "reqwest 0.12.9", + "reqwest 0.12.12", "ring 0.17.8", "roaring", "rocksdb", @@ -6769,9 +6732,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.91" +version = "2.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" dependencies = [ "proc-macro2", "quote", @@ -6813,7 +6776,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -6898,7 +6861,7 @@ dependencies = [ "num_cpus", "pop3", "rayon", - "reqwest 0.12.9", + "reqwest 0.12.12", "ring 0.17.8", "rustls 0.23.20", "rustls-pemfile 2.2.0", @@ -6943,7 +6906,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -6954,7 +6917,7 @@ checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -7050,7 +7013,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -7254,6 +7217,7 @@ dependencies = [ "futures-util", "pin-project-lite", "sync_wrapper 1.0.2", + "tokio", "tower-layer", "tower-service", ] @@ -7289,7 +7253,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -7312,7 +7276,7 @@ dependencies = [ "mail-auth", "mail-parser", "parking_lot", - "reqwest 0.12.9", + "reqwest 0.12.12", "rtrb", "serde", "serde_json", @@ -7569,7 +7533,7 @@ dependencies = [ "rand 0.8.5", "rcgen 0.13.2", "regex", - "reqwest 0.12.9", + "reqwest 0.12.12", "ring 0.17.8", "rustls 0.23.20", "rustls-pemfile 2.2.0", @@ -7676,7 +7640,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", "wasm-bindgen-shared", ] @@ -7711,7 +7675,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -8037,9 +8001,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "e6f5bb5257f2407a5425c6e749bfd9692192a73e70a6060516ac04f889087d68" dependencies = [ "memchr", ] @@ -8128,9 +8092,9 @@ checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" [[package]] name = "xxhash-rust" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d48f1b18be023c95e7b75f481cac649d74be7c507ff4a407c55cfb957f7934" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" [[package]] name = "yasna" @@ -8161,7 +8125,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", "synstructure 0.13.1", ] @@ -8183,7 +8147,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -8203,7 +8167,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", "synstructure 0.13.1", ] @@ -8224,7 +8188,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] @@ -8246,7 +8210,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.94", ] [[package]] diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index c39a4cbec..686a54683 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -30,8 +30,8 @@ futures = "0.3.28" pwhash = "1.0.0" rand = "0.8.5" mail-auth = { version = "0.6" } -maildir = { version = "0.6.4", default-features = false, optional = true } +maildirpp = { version = "0.4.0", default-features = false, optional = true } [features] default = ["maildir"] -maildir = ["dep:maildir"] +maildir = ["dep:maildirpp"] diff --git a/crates/cli/src/modules/export.rs b/crates/cli/src/modules/export.rs index e264b2c1d..f228331df 100644 --- a/crates/cli/src/modules/export.rs +++ b/crates/cli/src/modules/export.rs @@ -271,31 +271,121 @@ pub async fn fetch_emails( results } +#[cfg(feature = "maildir")] +fn update_mail_id(mut mail_entry: maildirpp::MailEntry, email: &jmap_client::email::Email) { + use std::os::unix::fs::MetadataExt; + use std::{ + fs, + sync::atomic::{AtomicUsize, Ordering}, + time::{Duration, SystemTime, UNIX_EPOCH}, + }; + + let storage_id = email.id().unwrap_or_default(); + let received_at = email.received_at(); + + static COUNTER: AtomicUsize = AtomicUsize::new(0); + let sequence_number = COUNTER.fetch_add(1, Ordering::SeqCst); + + let meta: fs::Metadata = match mail_entry.path().metadata() { + Err(err) => { + eprintln!("Error: email {storage_id} could not fetch metadata for file: {err}"); + return; + } + Ok(meta) => meta, + }; + + let timestamp = match received_at { + None => SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or(Duration::from_secs(0)), + Some(ts) => Duration::from_secs(ts.try_into().unwrap()), + }; + + let secs = timestamp.as_secs(); + let nanos = timestamp.subsec_nanos(); + + #[cfg(unix)] + let dev = meta.dev(); + #[cfg(windows)] + let dev: u64 = 0; + + #[cfg(unix)] + let ino = meta.ino(); + #[cfg(windows)] + let ino: u64 = 0; + + #[cfg(unix)] + let size = meta.size(); + #[cfg(windows)] + let size = meta.file_size(); + + let hostname = "todo".to_string(); //TODO: hostname + + let id = format!("{secs}.#{sequence_number:x}M{nanos}V{dev}I{ino}.{hostname},S={size}"); + + // Update the mail ID + if let Err(err) = mail_entry.set_id(&id) { + eprintln!("Error: email {storage_id} could not update email id to {id}: {err}"); + return; + } +} + #[cfg(feature = "maildir")] async fn export_emails_maildir( client: &jmap_client::client::Client, max_objects_in_get: usize, path: &Path, ) { - use maildir::Maildir; + use maildirpp::Maildir; let emails = fetch_emails(client, max_objects_in_get).await; + let mailboxes: Vec = fetch_mailboxes(client, max_objects_in_get).await; - let maildir = Maildir::from(path.join("maildir")); - if let Err(err) = maildir.create_dirs() { - eprintln!("Error: dirs count not be created: {err}"); - return; - } + let maildir = match Maildir::new(path.join("maildir")) { + Err(err) => { + eprintln!("Error: maildir could not be created: {err}"); + return; + } + Ok(maildir) => maildir, + }; for email in &emails { + let mailbox_names: Vec<&str> = email + .mailbox_ids() + .iter() + .map(|id| { + mailboxes + .iter() + .filter(|mb| mb.name().is_some() && mb.id().is_some()) + .find(|mb| mb.id().unwrap() == *id) + }) + .filter(|mb| mb.is_some()) + .map(|mb| mb.unwrap().name().unwrap()) + .collect(); + if let Some(blob_id) = email.blob_id() { match client.download(&blob_id).await { Ok(bytes) => { - if let Err(err) = maildir.store_new(bytes.as_slice()) { - eprintln!( - "Error: email {:?} could not be stored: {err}", - email.id().unwrap_or_default() - ); + for mailbox_name in mailbox_names { + match maildir.create_folder(mailbox_name) { + Ok(maildir_folder) => { + match maildir_folder.store_cur(bytes.as_slice()) { + Err(err) => { + eprintln!( + "Error: email {:?} could not be stored: {err}", + email.id().unwrap_or_default() + ); + } + Ok(mail_entry) => { + update_mail_id(mail_entry, &email); + } + } + } + Err(err) => { + eprintln!("Error: maildir could not be created: {err}"); + return; + } + } } } Err(err) => {