diff --git a/Cargo.lock b/Cargo.lock index 1284bdac..d81ffb10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "8b5ace29ee3216de37c0546865ad08edef58b0f9e76838ed8959a84a990e58c5" [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -135,9 +135,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "c900954614442c827787a2ffcd8c0602eb53ff7b95a8fbfcdaf5e406197bf3be" [[package]] name = "anstyle-parse" @@ -170,9 +170,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" @@ -272,7 +272,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", ] @@ -347,9 +347,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.30" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" +checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" dependencies = [ "compression-codecs", "compression-core", @@ -397,7 +397,7 @@ dependencies = [ "thiserror 1.0.69", "time", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "tokio-websockets", "tracing", @@ -463,7 +463,7 @@ checksum = "07a9b245ba0739fc90935094c29adbaee3f977218b5fb95e822e261cda7f56a3" dependencies = [ "http 1.3.1", "log", - "rustls 0.23.31", + "rustls 0.23.32", "serde", "serde_json", "url", @@ -590,9 +590,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -600,7 +600,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.0", ] [[package]] @@ -900,9 +900,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytecheck" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50690fb3370fb9fe3550372746084c46f2ac8c9685c583d2be10eefd89d3d1a3" +checksum = "0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -912,9 +912,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb7846e0cb180355c2dec69e721edafa36919850f1a9f52ffba4ebc0393cb71" +checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" dependencies = [ "proc-macro2", "quote", @@ -1016,9 +1016,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.37" +version = "1.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" dependencies = [ "find-msvc-tools", "jobserver", @@ -1140,9 +1140,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.47" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", "clap_derive", @@ -1150,9 +1150,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.47" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" dependencies = [ "anstream", "anstyle", @@ -1241,7 +1241,7 @@ dependencies = [ "idna", "imagesize", "imap_proto", - "indexmap 2.11.1", + "indexmap 2.11.4", "infer 0.19.0", "jmap_proto", "libc", @@ -1271,7 +1271,7 @@ dependencies = [ "ring 0.17.14", "rkyv", "rsa", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -1283,7 +1283,7 @@ dependencies = [ "store", "tinyvec", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "trc", "types", "unicode-security", @@ -1312,9 +1312,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485abf41ac0c8047c07c87c72c8fb3eb5197f6e9d7ded615dfd1a00ae00a0f64" +checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" dependencies = [ "compression-core", "flate2", @@ -1662,6 +1662,16 @@ dependencies = [ "darling_macro 0.20.11", ] +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + [[package]] name = "darling_core" version = "0.13.4" @@ -1690,6 +1700,20 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.106", +] + [[package]] name = "darling_macro" version = "0.13.4" @@ -1713,10 +1737,21 @@ dependencies = [ ] [[package]] -name = "dary_heap" -version = "0.3.7" +name = "darling_macro" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d2cd9c18b9f454ed67da600630b021a8a80bf33f8c95896ab33aaf1c26b728" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "dary_heap" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d2e3287df1c007e74221c49ca10a95d557349e54b3a75dc2fb14712c751f04" [[package]] name = "data-encoding" @@ -1890,12 +1925,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -1963,7 +1998,7 @@ dependencies = [ "regex", "reqwest 0.12.23", "rkyv", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", "scrypt", "serde", @@ -1973,7 +2008,7 @@ dependencies = [ "smtp-proto", "store", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "totp-rs", "trc", "types", @@ -2008,7 +2043,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -2302,7 +2337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -2427,9 +2462,9 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "find-msvc-tools" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "fixedbitset" @@ -2500,7 +2535,7 @@ dependencies = [ "memchr", "mime", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -2686,20 +2721,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generator" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2764,7 +2785,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.5+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -2780,9 +2801,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "git-version" @@ -2854,7 +2875,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.11.1", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -2873,7 +2894,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.11.1", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -2907,6 +2928,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "hashify" version = "0.2.7" @@ -3022,13 +3049,13 @@ dependencies = [ "once_cell", "rand 0.9.2", "ring 0.17.14", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", "tinyvec", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tracing", "url", ] @@ -3048,11 +3075,11 @@ dependencies = [ "parking_lot", "rand 0.9.2", "resolv-conf", - "rustls 0.23.31", + "rustls 0.23.32", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tracing", ] @@ -3336,10 +3363,10 @@ dependencies = [ "http 1.3.1", "hyper 1.7.0", "hyper-util", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tower-service", "webpki-roots 1.0.2", ] @@ -3359,9 +3386,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", @@ -3393,7 +3420,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.0", + "windows-core", ] [[package]] @@ -3543,18 +3570,18 @@ dependencies = [ "directory", "email", "imap_proto", - "indexmap 2.11.1", + "indexmap 2.11.4", "mail-parser", "mail-send", "md5 0.8.0", "nlp", "parking_lot", "rand 0.9.2", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "store", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "trc", "types", "utils", @@ -3625,13 +3652,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.1" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -3876,18 +3904,18 @@ dependencies = [ "spam-filter", "store", "tokio", - "tokio-tungstenite 0.28.0", + "tokio-tungstenite", "trc", - "tungstenite 0.28.0", + "tungstenite", "types", "utils", ] [[package]] name = "jmap-client" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12c697483ad894a8184d0fd61848e057f86b16642049993b3e6a80c959dbc90a" +checksum = "c99dea3753873e0017ea5eecc09b1f06ac6a96d180d1ff5c9f38be83b85eb1ee" dependencies = [ "ahash", "async-stream", @@ -3896,18 +3924,20 @@ dependencies = [ "futures-util", "maybe-async", "parking_lot", - "reqwest 0.11.27", - "rustls 0.22.4", + "reqwest 0.12.23", + "rustls 0.23.32", "rustls-pki-types", "serde", "serde_json", "tokio", - "tokio-tungstenite 0.21.0", + "tokio-tungstenite", ] [[package]] name = "jmap-tools" -version = "0.1.1" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91222e1ff860c06e6a48a317b67ffe6012ae08d40a5e8c6bf75987ae7644b4b1" dependencies = [ "hashify", "rkyv", @@ -3968,9 +3998,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.78" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -4011,7 +4041,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.11.4", ] [[package]] @@ -4118,9 +4148,9 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libflate" @@ -4148,19 +4178,19 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-link 0.2.0", ] [[package]] name = "liblzma" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10bf66f4598dc77ff96677c8e763655494f00ff9c1cf79e2eb5bb07bc31f807d" +checksum = "73c36d08cad03a3fbe2c4e7bb3a9e84c57e4ee4135ed0b065cade3d98480c648" dependencies = [ "liblzma-sys", ] @@ -4184,9 +4214,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags 2.9.4", "libc", @@ -4274,19 +4304,6 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", -] - [[package]] name = "lru" version = "0.14.0" @@ -4394,11 +4411,11 @@ dependencies = [ "base64 0.22.1", "gethostname", "md5 0.8.0", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", "smtp-proto", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "webpki-roots 1.0.2", ] @@ -4419,12 +4436,12 @@ dependencies = [ "md5 0.8.0", "parking_lot", "rkyv", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "sieve-rs", "store", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "trc", "types", "utils", @@ -4491,9 +4508,9 @@ checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0" [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memory-stats" @@ -4584,37 +4601,36 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.10" +version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" dependencies = [ "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", - "loom", + "equivalent", "parking_lot", "portable-atomic", "rustc_version 0.4.1", "smallvec", "tagptr", - "thiserror 1.0.69", "uuid", ] [[package]] name = "munge" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7feb0b48aa0a25f9fe0899482c6e1379ee7a11b24a53073eacdecb9adb6dc60" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" dependencies = [ "munge_macro", ] [[package]] name = "munge_macro" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2e3795a5d2da581a8b252fec6022eee01aea10161a4d1bf237d4cbe47f7e988" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" dependencies = [ "proc-macro2", "quote", @@ -4636,7 +4652,7 @@ dependencies = [ "quote", "syn 2.0.106", "termcolor", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -4657,14 +4673,14 @@ dependencies = [ "pem", "percent-encoding", "rand 0.9.2", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "serde", "serde_json", "socket2 0.5.10", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "twox-hash", "url", @@ -4694,7 +4710,7 @@ dependencies = [ "serde_json", "sha1", "sha2 0.10.9", - "thiserror 2.0.16", + "thiserror 2.0.17", "uuid", ] @@ -4925,9 +4941,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -5047,7 +5063,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -5079,7 +5095,7 @@ dependencies = [ "opentelemetry_sdk", "prost", "reqwest 0.12.23", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tonic", "tracing", @@ -5117,7 +5133,7 @@ dependencies = [ "percent-encoding", "rand 0.9.2", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -5265,7 +5281,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e0a3a33733faeaf8651dfee72dd0f388f0c8e5ad496a3478fa5a922f49cfa8" dependencies = [ "memchr", - "thiserror 2.0.16", + "thiserror 2.0.17", "ucd-trie", ] @@ -5309,7 +5325,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.11.1", + "indexmap 2.11.4", ] [[package]] @@ -5524,10 +5540,10 @@ dependencies = [ "imap", "mail-parser", "mail-send", - "rustls 0.23.31", + "rustls 0.23.32", "store", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "trc", "types", "utils", @@ -5541,9 +5557,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "postgres-protocol" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" +checksum = "fbef655056b916eb868048276cfd5d6a7dea4f81560dfd047f97c8c6fe3fcfd4" dependencies = [ "base64 0.22.1", "byteorder", @@ -5559,9 +5575,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" +checksum = "77a120daaabfcb0e324d5bf6e411e9222994cb3795c79943a0ef28ed27ea76e4" dependencies = [ "bytes", "fallible-iterator 0.2.0", @@ -5649,9 +5665,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] @@ -5731,7 +5747,7 @@ dependencies = [ "lazy_static", "memchr", "parking_lot", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -5769,9 +5785,9 @@ dependencies = [ [[package]] name = "psl" -version = "2.1.141" +version = "2.1.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c10a4dce9ad24c1fad826cffc79a624cf626bfaddb466e969368a53d877b30" +checksum = "f9bc7bed4cdf5168c58514ad64f37615f6683882209e2b6ba345cda0c6b8d949" dependencies = [ "psl-types", ] @@ -5784,18 +5800,18 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "ptr_meta" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" +checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" dependencies = [ "ptr_meta_derive", ] [[package]] name = "ptr_meta_derive" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca414edb151b4c8d125c12566ab0d74dc9cdba36fb80eb7b848c15f495fd32d1" +checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" dependencies = [ "proc-macro2", "quote", @@ -5876,9 +5892,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.31", + "rustls 0.23.32", "socket2 0.6.0", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -5897,11 +5913,11 @@ dependencies = [ "rand 0.9.2", "ring 0.17.14", "rustc-hash 2.1.1", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror 2.0.16", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -5923,9 +5939,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -5965,9 +5981,9 @@ dependencies = [ [[package]] name = "rancor" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" +checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" dependencies = [ "ptr_meta", ] @@ -6206,9 +6222,9 @@ dependencies = [ [[package]] name = "redis" -version = "0.32.5" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd3650deebc68526b304898b192fa4102a4ef0b9ada24da096559cb60e0eef8" +checksum = "15965fbccb975c38a08a68beca6bdb57da9081cd0859417c5975a160d968c3cb" dependencies = [ "bytes", "cfg-if", @@ -6222,13 +6238,13 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rand 0.9.2", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-native-certs 0.8.1", "ryu", "sha1_smol", "socket2 0.6.0", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "url", "webpki-roots 1.0.2", @@ -6262,23 +6278,23 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", @@ -6287,9 +6303,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -6299,9 +6315,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -6316,9 +6332,9 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "rend" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35e8a6bf28cd121053a66aa2e6a2e3eaffad4a60012179f0e864aa5ffeff215" +checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" dependencies = [ "bytecheck", ] @@ -6361,7 +6377,6 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", "web-sys", "webpki-roots 0.25.4", "winreg", @@ -6391,14 +6406,14 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "tower 0.5.2", "tower-http", @@ -6486,14 +6501,14 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f5c3e5da784cd8c69d32cdc84673f3204536ca56e1fa01be31a74b92c932ac" +checksum = "35a640b26f007713818e9a9b65d34da1cf58538207b052916a83d80e43f3ffa4" dependencies = [ "bytecheck", "bytes", "hashbrown 0.15.5", - "indexmap 2.11.1", + "indexmap 2.11.4", "munge", "ptr_meta", "rancor", @@ -6505,9 +6520,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4270433626cffc9c4c1d3707dd681f2a2718d3d7b09ad754bec137acecda8d22" +checksum = "bd83f5f173ff41e00337d97f6572e416d022ef8a19f371817259ae960324c482" dependencies = [ "proc-macro2", "quote", @@ -6703,7 +6718,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.26", + "semver 1.0.27", ] [[package]] @@ -6725,7 +6740,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -6742,29 +6757,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.4" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring 0.17.14", - "rustls-pki-types", - "rustls-webpki 0.102.8", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "log", "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.103.5", + "rustls-webpki 0.103.6", "subtle", "zeroize", ] @@ -6803,7 +6804,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.4.0", + "security-framework 3.5.1", ] [[package]] @@ -6845,11 +6846,11 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-native-certs 0.8.1", "rustls-platform-verifier-android", - "rustls-webpki 0.103.5", - "security-framework 3.4.0", + "rustls-webpki 0.103.6", + "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs", "windows-sys 0.59.0", @@ -6884,9 +6885,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.5" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a37813727b78798e53c2bec3f5e8fe12a6d6f8389bf9ca7802add4c9905ad8" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "ring 0.17.14", "rustls-pki-types", @@ -6944,7 +6945,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -7005,12 +7006,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -7084,9 +7079,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags 2.9.4", "core-foundation 0.10.1", @@ -7116,9 +7111,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "semver-parser" @@ -7177,7 +7172,7 @@ dependencies = [ "sha1collisiondetection", "sha2 0.10.9", "sha3", - "thiserror 2.0.16", + "thiserror 2.0.17", "twofish", "typenum", "x25519-dalek", @@ -7186,9 +7181,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.221" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "341877e04a22458705eb4e131a1508483c877dca2792b3781d4e5d8a6019ec43" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -7196,27 +7191,28 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.17" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde_core" -version = "1.0.221" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c459bc0a14c840cb403fc14b148620de1e0778c96ecd6e0c8c3cacb6d8d00fe" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.221" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6185cf75117e20e62b1ff867b9518577271e58abe0037c40bb4794969355ab0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -7236,14 +7232,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.144" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56177480b00303e689183f110b4e727bb4211d692c62d4fcd16d02be93077d40" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.11.4", "itoa", "memchr", "ryu", + "serde", "serde_core", ] @@ -7302,21 +7299,21 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.1", + "indexmap 2.11.4", "schemars 0.9.0", "schemars 1.0.4", "serde", "serde_derive", "serde_json", - "serde_with_macros 3.14.0", + "serde_with_macros 3.14.1", "time", ] @@ -7334,11 +7331,11 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" dependencies = [ - "darling 0.20.11", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.106", @@ -7350,7 +7347,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.11.4", "itoa", "ryu", "serde", @@ -7621,7 +7618,7 @@ dependencies = [ "regex", "reqwest 0.12.23", "rkyv", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -7633,7 +7630,7 @@ dependencies = [ "spam-filter", "store", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "trc", "types", "utils", @@ -7856,13 +7853,13 @@ dependencies = [ "rocksdb", "rusqlite", "rust-s3", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", "serde", "serde_json", "tokio", "tokio-postgres", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "trc", "types", "utils", @@ -8071,7 +8068,7 @@ dependencies = [ "reqwest 0.12.23", "ring 0.17.14", "rkyv", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -8084,7 +8081,7 @@ dependencies = [ "spam-filter", "store", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "trc", "types", "utils", @@ -8101,11 +8098,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -8121,9 +8118,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -8141,11 +8138,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", + "itoa", "js-sys", "num-conv", "powerfmt", @@ -8212,9 +8210,9 @@ checksum = "ab41256c16d6fc2b3021545f20bf77a73200b18bd54040ac656dddfca6205bfa" dependencies = [ "futures-util", "pin-project-lite", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", ] [[package]] @@ -8259,9 +8257,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" +checksum = "a156efe7fff213168257853e1dfde202eed5f487522cbbbf7d219941d753d853" dependencies = [ "async-trait", "byteorder", @@ -8272,12 +8270,12 @@ dependencies = [ "log", "parking_lot", "percent-encoding", - "phf 0.11.3", + "phf 0.13.1", "pin-project-lite", "postgres-protocol", "postgres-types", "rand 0.9.2", - "socket2 0.5.10", + "socket2 0.6.0", "tokio", "tokio-util", "whoami", @@ -8295,22 +8293,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.25.0" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls 0.23.31", + "rustls 0.23.32", "tokio", ] @@ -8325,22 +8312,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tungstenite 0.21.0", - "webpki-roots 0.26.11", -] - [[package]] name = "tokio-tungstenite" version = "0.28.0" @@ -8349,8 +8320,12 @@ checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", + "rustls 0.23.32", + "rustls-pki-types", "tokio", - "tungstenite 0.28.0", + "tokio-rustls 0.26.4", + "tungstenite", + "webpki-roots 0.26.11", ] [[package]] @@ -8383,25 +8358,38 @@ dependencies = [ "ring 0.17.14", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "webpki-roots 0.26.11", ] [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +dependencies = [ + "serde_core", +] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.11.4", "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +dependencies = [ "winnow", ] @@ -8425,7 +8413,7 @@ dependencies = [ "prost", "rustls-pemfile 2.2.0", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-stream", "tower 0.4.13", "tower-layer", @@ -8630,27 +8618,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.3.1", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.28.0" @@ -8663,8 +8630,10 @@ dependencies = [ "httparse", "log", "rand 0.9.2", + "rustls 0.23.32", + "rustls-pki-types", "sha1", - "thiserror 2.0.16", + "thiserror 2.0.17", "utf-8", ] @@ -8912,14 +8881,14 @@ dependencies = [ "reqwest 0.12.23", "ring 0.17.14", "rkyv", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", "smtp-proto", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "trc", "webpki-roots 1.0.2", "x509-parser 0.17.0", @@ -9036,18 +9005,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.5+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ "wasip2", ] [[package]] name = "wasip2" -version = "1.0.0+wasi-0.2.4" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] @@ -9060,9 +9029,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -9073,9 +9042,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -9087,9 +9056,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.51" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -9100,9 +9069,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9110,9 +9079,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -9123,9 +9092,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -9145,9 +9114,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.78" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -9245,7 +9214,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -9254,70 +9223,24 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-core" -version = "0.62.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" dependencies = [ "windows-implement", "windows-interface", "windows-link 0.2.0", - "windows-result 0.4.0", - "windows-strings 0.5.0", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", + "windows-result", + "windows-strings", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ "proc-macro2", "quote", @@ -9326,9 +9249,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" dependencies = [ "proc-macro2", "quote", @@ -9347,25 +9270,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - [[package]] name = "windows-result" version = "0.4.0" @@ -9375,15 +9279,6 @@ dependencies = [ "windows-link 0.2.0", ] -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - [[package]] name = "windows-strings" version = "0.5.0" @@ -9435,14 +9330,14 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.4", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" dependencies = [ "windows-link 0.2.0", ] @@ -9495,11 +9390,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ - "windows-link 0.1.3", + "windows-link 0.2.0", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -9510,15 +9405,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -9720,9 +9606,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.45.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -9797,7 +9683,7 @@ dependencies = [ "nom", "oid-registry 0.8.1", "rusticata-macros", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", ] @@ -9939,7 +9825,7 @@ dependencies = [ "secrecy", "serde", "serde_json", - "serde_with 3.14.0", + "serde_with 3.14.1", "serde_yaml", "tracing", "uhlc", @@ -10021,7 +9907,7 @@ dependencies = [ "flume", "futures", "quinn", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "rustls-pki-types", "rustls-webpki 0.102.8", @@ -10053,7 +9939,7 @@ dependencies = [ "async-trait", "base64 0.22.1", "quinn", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "rustls-webpki 0.102.8", "secrecy", @@ -10096,7 +9982,7 @@ checksum = "d1e59f64bd7c3257c710e05bddc695207f9261d66ad9c699346c8704f0298f3f" dependencies = [ "async-trait", "base64 0.22.1", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "rustls-pki-types", "rustls-webpki 0.102.8", @@ -10105,7 +9991,7 @@ dependencies = [ "time", "tls-listener", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "tracing", "webpki-roots 0.26.11", @@ -10407,7 +10293,7 @@ dependencies = [ "flate2", "getrandom 0.3.3", "hmac 0.12.1", - "indexmap 2.11.1", + "indexmap 2.11.4", "liblzma", "memchr", "pbkdf2", @@ -10434,7 +10320,7 @@ dependencies = [ "flate2", "getrandom 0.3.3", "hmac 0.12.1", - "indexmap 2.11.1", + "indexmap 2.11.4", "lzma-rust2", "memchr", "pbkdf2", diff --git a/crates/cli/src/modules/export.rs b/crates/cli/src/modules/export.rs index 35b00587..49cab451 100644 --- a/crates/cli/src/modules/export.rs +++ b/crates/cli/src/modules/export.rs @@ -147,7 +147,7 @@ pub async fn fetch_mailboxes( mailbox::Property::ParentId, mailbox::Property::Role, mailbox::Property::SortOrder, - mailbox::Property::ACL, + mailbox::Property::ShareWith, ]); let mut response = request diff --git a/crates/cli/src/modules/import.rs b/crates/cli/src/modules/import.rs index 94bba580..6f338ab8 100644 --- a/crates/cli/src/modules/import.rs +++ b/crates/cli/src/modules/import.rs @@ -527,9 +527,9 @@ async fn import_mailboxes( if mailbox.sort_order() > 0 { create_request.sort_order(mailbox.sort_order()); } - if let Some(acls) = mailbox.acl() { + /*if let Some(acls) = mailbox.acl() { create_request.acls(acls.clone().into_iter()); - } + }*/ if mailbox.is_subscribed() { create_request.is_subscribed(true); } diff --git a/crates/jmap-proto/Cargo.toml b/crates/jmap-proto/Cargo.toml index 5e69e2b2..c3277086 100644 --- a/crates/jmap-proto/Cargo.toml +++ b/crates/jmap-proto/Cargo.toml @@ -9,7 +9,7 @@ store = { path = "../store" } utils = { path = "../utils" } types = { path = "../types" } trc = { path = "../trc" } -jmap-tools = { path = "/Users/me/code/jmap-tool" } +jmap-tools = { version = "0.1" } mail-parser = { version = "0.11", features = ["full_encoding", "rkyv"] } serde = { version = "1.0", features = ["derive"]} ahash = { version = "0.8.2", features = ["serde"] } diff --git a/crates/jmap-proto/src/method/changes.rs b/crates/jmap-proto/src/method/changes.rs index d1fe2bec..c7d7de29 100644 --- a/crates/jmap-proto/src/method/changes.rs +++ b/crates/jmap-proto/src/method/changes.rs @@ -54,7 +54,7 @@ impl<'de> DeserializeArguments<'de> for ChangesRequest { b"accountId" => { self.account_id = map.next_value()?; }, - b"sinceQueryState" => { + b"sinceState" => { self.since_state = map.next_value()?; }, b"maxChanges" => { diff --git a/crates/jmap-proto/src/method/import.rs b/crates/jmap-proto/src/method/import.rs index 0879d6ce..1fc38289 100644 --- a/crates/jmap-proto/src/method/import.rs +++ b/crates/jmap-proto/src/method/import.rs @@ -6,6 +6,7 @@ use crate::{ error::set::SetError, + method::JmapDict, object::{ AnyId, email::{EmailProperty, EmailValue}, @@ -93,13 +94,13 @@ impl<'de> DeserializeArguments<'de> for ImportEmail { self.blob_id = map.next_value()?; }, b"keywords" => { - self.keywords = map.next_value()?; + self.keywords = map.next_value::>()?.0; }, b"receivedAt" => { self.received_at = map.next_value()?; }, b"mailboxIds" => { - self.mailbox_ids = MaybeResultReference::Value(map.next_value::>>()?); + self.mailbox_ids = MaybeResultReference::Value(map.next_value::>>()?.0); }, b"#mailboxIds" => { self.mailbox_ids = MaybeResultReference::Reference(map.next_value::()?); diff --git a/crates/jmap-proto/src/method/mod.rs b/crates/jmap-proto/src/method/mod.rs index a1959950..a064e9b1 100644 --- a/crates/jmap-proto/src/method/mod.rs +++ b/crates/jmap-proto/src/method/mod.rs @@ -6,6 +6,11 @@ use ahash::AHashMap; use jmap_tools::Property; +use serde::{ + Deserialize, Deserializer, + de::{self, MapAccess, Visitor}, +}; +use std::{borrow::Cow, fmt, str::FromStr}; pub mod changes; pub mod copy; @@ -37,3 +42,44 @@ impl From for PropertyWrapper { Self(value) } } + +pub(crate) struct JmapDict(pub Vec); + +struct JmapDictVisitor<'de, T: FromStr> { + marker: std::marker::PhantomData<&'de T>, +} + +impl<'de, T: FromStr> Visitor<'de> for JmapDictVisitor<'de, T> { + type Value = JmapDict; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a map") + } + + fn visit_map(self, mut access: M) -> Result + where + M: MapAccess<'de>, + { + let mut vec = Vec::with_capacity(3); + + while let Some(key) = access.next_key::>()? { + let key = T::from_str(&key).map_err(|_| de::Error::custom("invalid dictionary key"))?; + if access.next_value::>()?.unwrap_or(false) { + vec.push(key); + } + } + + Ok(JmapDict(vec)) + } +} + +impl<'de, T: FromStr + 'static> Deserialize<'de> for JmapDict { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_map(JmapDictVisitor { + marker: std::marker::PhantomData, + }) + } +} diff --git a/crates/jmap-proto/src/object/email.rs b/crates/jmap-proto/src/object/email.rs index f16f5ecf..ab284973 100644 --- a/crates/jmap-proto/src/object/email.rs +++ b/crates/jmap-proto/src/object/email.rs @@ -112,6 +112,7 @@ impl Property for EmailProperty { if let Some(Key::Property(key)) = key { match key.patch_or_prop() { EmailProperty::Keywords => EmailProperty::Keyword(Keyword::parse(value)).into(), + EmailProperty::MailboxIds => Id::from_str(value).ok().map(EmailProperty::IdValue), _ => EmailProperty::parse(value, allow_patch), } } else { diff --git a/crates/jmap-proto/src/object/email_submission.rs b/crates/jmap-proto/src/object/email_submission.rs index 482205da..1677ebc6 100644 --- a/crates/jmap-proto/src/object/email_submission.rs +++ b/crates/jmap-proto/src/object/email_submission.rs @@ -114,13 +114,14 @@ impl Element for EmailSubmissionValue { fn try_parse

(key: &Key<'_, Self::Property>, value: &str) -> Option { if let Key::Property(prop) = key { match prop.patch_or_prop() { - EmailSubmissionProperty::Id | EmailSubmissionProperty::ThreadId => { - match parse_ref(value) { - MaybeReference::Value(v) => Some(EmailSubmissionValue::Id(v)), - MaybeReference::Reference(v) => Some(EmailSubmissionValue::IdReference(v)), - MaybeReference::ParseError => None, - } - } + EmailSubmissionProperty::Id + | EmailSubmissionProperty::ThreadId + | EmailSubmissionProperty::IdentityId + | EmailSubmissionProperty::EmailId => match parse_ref(value) { + MaybeReference::Value(v) => Some(EmailSubmissionValue::Id(v)), + MaybeReference::Reference(v) => Some(EmailSubmissionValue::IdReference(v)), + MaybeReference::ParseError => None, + }, EmailSubmissionProperty::MdnBlobIds | EmailSubmissionProperty::DsnBlobIds => { match parse_ref(value) { MaybeReference::Value(v) => Some(EmailSubmissionValue::BlobId(v)), diff --git a/crates/jmap-proto/src/object/mailbox.rs b/crates/jmap-proto/src/object/mailbox.rs index 946cf216..fa20594c 100644 --- a/crates/jmap-proto/src/object/mailbox.rs +++ b/crates/jmap-proto/src/object/mailbox.rs @@ -51,6 +51,7 @@ pub enum MailboxRight { MayRename, MaySubmit, MayDelete, + MayShare, } #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -62,10 +63,16 @@ pub enum MailboxValue { impl Property for MailboxProperty { fn try_parse(key: Option<&Key<'_, Self>>, value: &str) -> Option { - if let Some(Key::Property(MailboxProperty::ShareWith)) = key { - Id::from_str(value).ok().map(MailboxProperty::IdValue) + let allow_patch = key.is_none(); + if let Some(Key::Property(key)) = key { + match key.patch_or_prop() { + MailboxProperty::ShareWith => { + Id::from_str(value).ok().map(MailboxProperty::IdValue) + } + _ => MailboxProperty::parse(value, allow_patch), + } } else { - MailboxProperty::parse(value, key.is_none()) + MailboxProperty::parse(value, allow_patch) } } @@ -103,6 +110,7 @@ impl MailboxRight { MailboxRight::MayRename => "mayRename", MailboxRight::MaySubmit => "maySubmit", MailboxRight::MayDelete => "mayDelete", + MailboxRight::MayShare => "mayShare", } } } @@ -158,6 +166,7 @@ impl MailboxProperty { b"mayRename" => MailboxProperty::Rights(MailboxRight::MayRename), b"maySubmit" => MailboxProperty::Rights(MailboxRight::MaySubmit), b"mayDelete" => MailboxProperty::Rights(MailboxRight::MayDelete), + b"mayShare" => MailboxProperty::Rights(MailboxRight::MayShare), b"isSubscribed" => MailboxProperty::IsSubscribed, ) .or_else(|| { @@ -460,21 +469,23 @@ impl JmapRight for MailboxRight { Acl::Modify => &[MailboxRight::MayRename], Acl::Submit => &[MailboxRight::MaySubmit], Acl::Delete => &[MailboxRight::MayDelete], + Acl::Administer => &[MailboxRight::MayShare], _ => &[], } } - fn to_acl(&self) -> Acl { + fn to_acl(&self) -> &'static [Acl] { match self { - MailboxRight::MayReadItems => Acl::ReadItems, - MailboxRight::MayAddItems => Acl::AddItems, - MailboxRight::MayRemoveItems => Acl::RemoveItems, - MailboxRight::MaySetSeen => Acl::ModifyItems, - MailboxRight::MaySetKeywords => Acl::ModifyItems, - MailboxRight::MayCreateChild => Acl::CreateChild, - MailboxRight::MayRename => Acl::Modify, - MailboxRight::MaySubmit => Acl::Submit, - MailboxRight::MayDelete => Acl::Delete, + MailboxRight::MayReadItems => &[Acl::Read, Acl::ReadItems], + MailboxRight::MayAddItems => &[Acl::AddItems], + MailboxRight::MayRemoveItems => &[Acl::RemoveItems], + MailboxRight::MaySetSeen => &[Acl::ModifyItems], + MailboxRight::MaySetKeywords => &[Acl::ModifyItems], + MailboxRight::MayCreateChild => &[Acl::CreateChild], + MailboxRight::MayRename => &[Acl::Modify], + MailboxRight::MaySubmit => &[Acl::Submit], + MailboxRight::MayDelete => &[Acl::Delete], + MailboxRight::MayShare => &[Acl::Administer], } } @@ -489,6 +500,7 @@ impl JmapRight for MailboxRight { MailboxRight::MayRename, MailboxRight::MaySubmit, MailboxRight::MayDelete, + MailboxRight::MayShare, ] } } diff --git a/crates/jmap-proto/src/object/mod.rs b/crates/jmap-proto/src/object/mod.rs index 2d0796ea..b304a7b5 100644 --- a/crates/jmap-proto/src/object/mod.rs +++ b/crates/jmap-proto/src/object/mod.rs @@ -45,7 +45,7 @@ pub trait JmapObject: std::fmt::Debug { } pub trait JmapSharedObject: JmapObject { - type Right: JmapRight + Into + Debug + Sync + Send; + type Right: JmapRight + Into + Debug + Clone + Copy + Sync + Send; const SHARE_WITH_PROPERTY: Self::Property; } @@ -53,7 +53,7 @@ pub trait JmapSharedObject: JmapObject { pub trait JmapRight: Clone + Copy + Sized + 'static { fn from_acl(acl: Acl) -> &'static [Self]; fn all_rights() -> &'static [Self]; - fn to_acl(&self) -> Acl; + fn to_acl(&self) -> &'static [Acl]; } #[derive(Debug, Clone, PartialEq, Eq, Serialize)] @@ -169,7 +169,7 @@ impl JmapRight for Null { unreachable!() } - fn to_acl(&self) -> Acl { + fn to_acl(&self) -> &'static [Acl] { unreachable!() } } diff --git a/crates/jmap-proto/src/references/resolve.rs b/crates/jmap-proto/src/references/resolve.rs index cc5df2dd..e8d48ff6 100644 --- a/crates/jmap-proto/src/references/resolve.rs +++ b/crates/jmap-proto/src/references/resolve.rs @@ -23,7 +23,7 @@ use crate::{ response::Response, }; use compact_str::format_compact; -use jmap_tools::{Element, Property, Value}; +use jmap_tools::{Element, Key, Property, Value}; use std::collections::HashMap; use types::id::Id; @@ -310,6 +310,8 @@ where fn get_created_id(&self, id_ref: &str) -> Option { self.created .get(id_ref) + .and_then(|v| v.as_object()) + .and_then(|v| v.get(&Key::Property(T::ID_PROPERTY))) .and_then(|v| v.as_element()) .and_then(|v| v.as_any_id()) } diff --git a/crates/jmap-proto/src/request/parser.rs b/crates/jmap-proto/src/request/parser.rs index 0787cfa4..f96a6933 100644 --- a/crates/jmap-proto/src/request/parser.rs +++ b/crates/jmap-proto/src/request/parser.rs @@ -175,7 +175,7 @@ impl<'de> Visitor<'de> for CallVisitor { } }, (MethodFunction::Get, MethodObject::Blob) => match seq.next_element() { - Ok(Some(value)) => RequestMethod::Get(GetRequestMethod::Email(value)), + Ok(Some(value)) => RequestMethod::Get(GetRequestMethod::Blob(value)), Err(err) => RequestMethod::invalid(err), Ok(None) => { return Err(de::Error::invalid_length(1, &self)); diff --git a/crates/jmap-proto/src/request/reference.rs b/crates/jmap-proto/src/request/reference.rs index 07015e85..82159802 100644 --- a/crates/jmap-proto/src/request/reference.rs +++ b/crates/jmap-proto/src/request/reference.rs @@ -6,7 +6,7 @@ use super::method::MethodName; use jmap_tools::{JsonPointer, Null}; -use std::{fmt::Display, str::FromStr}; +use std::{borrow::Cow, fmt::Display, str::FromStr}; #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] pub struct ResultReference { @@ -54,17 +54,34 @@ impl<'de, V: FromStr> serde::Deserialize<'de> for MaybeIdReference { where D: serde::Deserializer<'de>, { - let value = <&str>::deserialize(deserializer)?; + let value = >::deserialize(deserializer)?; if let Some(reference) = value.strip_prefix('#') { if reference.is_empty() { - return Ok(MaybeIdReference::Invalid(value.to_string())); + return Ok(MaybeIdReference::Invalid(value.into_owned())); } Ok(MaybeIdReference::Reference(reference.to_string())) - } else if let Ok(id) = V::from_str(value) { + } else if let Ok(id) = V::from_str(value.as_ref()) { Ok(MaybeIdReference::Id(id)) } else { - Ok(MaybeIdReference::Invalid(value.to_string())) + Ok(MaybeIdReference::Invalid(value.into_owned())) + } + } +} + +impl FromStr for MaybeIdReference { + type Err = V::Err; + + fn from_str(s: &str) -> Result { + if let Some(reference) = s.strip_prefix('#') { + if reference.is_empty() { + return Ok(MaybeIdReference::Invalid(s.to_string())); + } + Ok(MaybeIdReference::Reference(reference.to_string())) + } else if let Ok(id) = V::from_str(s) { + Ok(MaybeIdReference::Id(id)) + } else { + Ok(MaybeIdReference::Invalid(s.to_string())) } } } diff --git a/crates/jmap-proto/src/request/websocket.rs b/crates/jmap-proto/src/request/websocket.rs index d6efcb2d..8de95652 100644 --- a/crates/jmap-proto/src/request/websocket.rs +++ b/crates/jmap-proto/src/request/websocket.rs @@ -168,7 +168,7 @@ impl<'de> Visitor<'de> for WebSocketMessageVisitor { message_type = MessageType::parse(map.next_value()?); }, b"dataTypes" => { - push_enable.data_types = map.next_value()?; + push_enable.data_types = map.next_value::>>()?.unwrap_or_default(); found_push_keys = true; }, b"pushState" => { diff --git a/crates/jmap/Cargo.toml b/crates/jmap/Cargo.toml index fa0456cd..45d26506 100644 --- a/crates/jmap/Cargo.toml +++ b/crates/jmap/Cargo.toml @@ -24,7 +24,7 @@ mail-builder = { version = "0.4" } mail-send = { version = "0.5", default-features = false, features = ["cram-md5", "ring", "tls12"] } mail-auth = { version = "0.7.1", features = ["generate"] } sieve-rs = { version = "0.7", features = ["rkyv"] } -jmap-tools = { path = "/Users/me/code/jmap-tool", features = ["rkyv"] } +jmap-tools = { version = "0.1", features = ["rkyv"] } serde = { version = "1.0", features = ["derive"]} serde_json = "1.0" hyper = { version = "1.0.1", features = ["server", "http1", "http2"] } diff --git a/crates/jmap/src/api/acl.rs b/crates/jmap/src/api/acl.rs index b684729d..77907a4e 100644 --- a/crates/jmap/src/api/acl.rs +++ b/crates/jmap/src/api/acl.rs @@ -96,15 +96,20 @@ impl JmapRights { .ok_or_else(|| { SetError::invalid_properties() .with_property(T::SHARE_WITH_PROPERTY) - .with_description("Invalid permission.") + .with_description(format!( + "Invalid permission {:?}.", + right.to_cow().unwrap_or_default() + )) })? - .to_acl(); + .to_acl() + .iter() + .copied(); if let Some(acl_item) = grants.iter_mut().find(|item| item.account_id == account_id) { if is_set { - acl_item.grants.insert(acl); + acl_item.grants.insert_many(acl); } else { - acl_item.grants.remove(acl); + acl_item.grants.insert_many(acl); if acl_item.grants.is_empty() { grants.retain(|item| item.account_id != account_id); } @@ -112,7 +117,7 @@ impl JmapRights { } else if is_set { grants.push(AclGrant { account_id, - grants: Bitmap::from_iter([acl]), + grants: Bitmap::from_iter(acl), }); } } else { @@ -145,15 +150,17 @@ impl JmapRights { let mut acls = Bitmap::new(); for key in value.into_expanded_boolean_set() { - acls.insert( - key.try_into_property() - .and_then(|p| T::Right::try_from(p).ok()) + acls.insert_many( + key.as_property() + .and_then(|p| T::Right::try_from(p.clone()).ok()) .ok_or_else(|| { SetError::invalid_properties() .with_property(T::SHARE_WITH_PROPERTY) - .with_description("Invalid permission.") + .with_description(format!("Invalid permission {:?}.", key.to_string())) })? - .to_acl(), + .to_acl() + .iter() + .copied(), ); } diff --git a/crates/jmap/src/email/headers.rs b/crates/jmap/src/email/headers.rs index 46f8bcee..2247fd54 100644 --- a/crates/jmap/src/email/headers.rs +++ b/crates/jmap/src/email/headers.rs @@ -177,7 +177,12 @@ impl IntoForm for HeaderValue<'_> { ( HeaderValue::Address(mail_parser::Address::Group(grouplist)), HeaderForm::Addresses, - ) => from_mail_grouplist(grouplist), + ) => Value::Array( + grouplist + .into_iter() + .flat_map(|group| group.addresses.into_iter().map(from_mail_addr)) + .collect(), + ), ( HeaderValue::Address(mail_parser::Address::List(addrlist)), HeaderForm::GroupedAddresses, @@ -190,7 +195,12 @@ impl IntoForm for HeaderValue<'_> { ( HeaderValue::Address(mail_parser::Address::Group(grouplist)), HeaderForm::GroupedAddresses, - ) => from_mail_grouplist(grouplist), + ) => Value::Array( + grouplist + .into_iter() + .map(from_mail_group) + .collect::>>(), + ), _ => Value::Null, } @@ -513,12 +523,3 @@ fn from_mail_addrlist(addrlist: Vec>) -> Value<'static, EmailProperty, .collect::>>(), ) } - -fn from_mail_grouplist(grouplist: Vec>) -> Value<'static, EmailProperty, EmailValue> { - Value::Array( - grouplist - .into_iter() - .map(from_mail_group) - .collect::>>(), - ) -} diff --git a/crates/types/Cargo.toml b/crates/types/Cargo.toml index f83111d5..73f0bb9d 100644 --- a/crates/types/Cargo.toml +++ b/crates/types/Cargo.toml @@ -7,7 +7,7 @@ resolver = "2" [dependencies] utils = { path = "../utils" } trc = { path = "../trc" } -jmap-tools = { path = "/Users/me/code/jmap-tool" } +jmap-tools = { version = "0.1" } hashify = "0.2" serde = { version = "1.0", features = ["derive"]} rkyv = { version = "0.8.10", features = ["little_endian"] } diff --git a/crates/types/src/keyword.rs b/crates/types/src/keyword.rs index 06141fc7..50cbd966 100644 --- a/crates/types/src/keyword.rs +++ b/crates/types/src/keyword.rs @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -use std::fmt::Display; +use std::{fmt::Display, str::FromStr}; use jmap_tools::{Element, Property, Value}; @@ -226,6 +226,14 @@ impl From for Vec { } } +impl FromStr for Keyword { + type Err = (); + + fn from_str(s: &str) -> Result { + Ok(Keyword::parse(s)) + } +} + impl ArchivedKeyword { pub fn id(&self) -> Result { match self { diff --git a/crates/utils/src/map/bitmap.rs b/crates/utils/src/map/bitmap.rs index 5eb9a0d6..22336381 100644 --- a/crates/utils/src/map/bitmap.rs +++ b/crates/utils/src/map/bitmap.rs @@ -69,6 +69,12 @@ impl Bitmap { self.bitmap |= 1 << item.into(); } + pub fn insert_many(&mut self, items: impl IntoIterator) { + for item in items.into_iter() { + self.insert(item); + } + } + #[inline(always)] pub fn with_item(mut self, item: T) -> Self { self.insert(item); diff --git a/tests/src/jmap/auth_acl.rs b/tests/src/jmap/auth_acl.rs index 4e0551d9..2af2d6b6 100644 --- a/tests/src/jmap/auth_acl.rs +++ b/tests/src/jmap/auth_acl.rs @@ -172,7 +172,7 @@ pub async fn test(params: &mut JMAPTest) { // Jane grants Inbox ReadItems access to John jane_client - .mailbox_update_acl(&inbox_id, "jdoe@example.com", [ACL::ReadItems]) + .mailbox_update_acl(&inbox_id, &john_id.to_string(), [ACL::ReadItems]) .await .unwrap(); @@ -256,15 +256,9 @@ pub async fn test(params: &mut JMAPTest) { .await, ); - // John only has ReadItems access to Inbox but no Read access - assert_forbidden( - john_client - .set_default_account_id(jane_id.to_string()) - .mailbox_get(&inbox_id, [mailbox::Property::MyRights].into()) - .await, - ); + // John only has ReadItems access to Inbox jane_client - .mailbox_update_acl(&inbox_id, "jdoe@example.com", [ACL::Read, ACL::ReadItems]) + .mailbox_update_acl(&inbox_id, &john_id.to_string(), [ACL::ReadItems]) .await .unwrap(); assert_eq!( @@ -331,8 +325,8 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &inbox_id, - "jdoe@example.com", - [ACL::Read, ACL::ReadItems, ACL::AddItems], + &john_id.to_string(), + [ACL::ReadItems, ACL::AddItems], ) .await .unwrap(); @@ -396,8 +390,8 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &inbox_id, - "jdoe@example.com", - [ACL::Read, ACL::ReadItems, ACL::AddItems, ACL::RemoveItems], + &john_id.to_string(), + [ACL::ReadItems, ACL::AddItems, ACL::RemoveItems], ) .await .unwrap(); @@ -417,13 +411,12 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &inbox_id, - "jdoe@example.com", + &john_id.to_string(), [ - ACL::Read, ACL::ReadItems, ACL::AddItems, ACL::RemoveItems, - ACL::ModifyItems, + ACL::SetKeywords, ], ) .await @@ -449,13 +442,12 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &inbox_id, - "jdoe@example.com", + &john_id.to_string(), [ - ACL::Read, ACL::ReadItems, ACL::AddItems, ACL::RemoveItems, - ACL::ModifyItems, + ACL::SetKeywords, ACL::CreateChild, ], ) @@ -478,8 +470,8 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &mailbox_id, - "jdoe@example.com", - [ACL::Read, ACL::ReadItems, ACL::Modify], + &john_id.to_string(), + [ACL::ReadItems, ACL::Rename], ) .await .unwrap(); @@ -499,8 +491,8 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &mailbox_id, - "jdoe@example.com", - [ACL::Read, ACL::ReadItems, ACL::Modify, ACL::AddItems], + &john_id.to_string(), + [ACL::ReadItems, ACL::Rename, ACL::AddItems], ) .await .unwrap(); @@ -520,14 +512,8 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &mailbox_id, - "jdoe@example.com", - [ - ACL::Read, - ACL::ReadItems, - ACL::Modify, - ACL::AddItems, - ACL::Delete, - ], + &john_id.to_string(), + [ACL::ReadItems, ACL::Rename, ACL::AddItems, ACL::Delete], ) .await .unwrap(); @@ -540,11 +526,10 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &mailbox_id, - "jdoe@example.com", + &john_id.to_string(), [ - ACL::Read, ACL::ReadItems, - ACL::Modify, + ACL::Rename, ACL::AddItems, ACL::Delete, ACL::RemoveItems, @@ -562,7 +547,7 @@ pub async fn test(params: &mut JMAPTest) { assert_forbidden( john_client .set_default_account_id(jane_id.to_string()) - .mailbox_update_acl(&inbox_id, "bill@example.com", [ACL::Read, ACL::ReadItems]) + .mailbox_update_acl(&inbox_id, &bill_id.to_string(), [ACL::ReadItems]) .await, ); assert_forbidden( @@ -574,15 +559,14 @@ pub async fn test(params: &mut JMAPTest) { jane_client .mailbox_update_acl( &inbox_id, - "jdoe@example.com", + &john_id.to_string(), [ - ACL::Read, ACL::ReadItems, ACL::AddItems, ACL::RemoveItems, - ACL::ModifyItems, + ACL::SetKeywords, ACL::CreateChild, - ACL::Modify, + ACL::Rename, ACL::Administer, ], ) @@ -602,14 +586,15 @@ pub async fn test(params: &mut JMAPTest) { ACL::ReadItems, ACL::AddItems, ACL::RemoveItems, - ACL::ModifyItems, + ACL::SetSeen, + ACL::SetKeywords, ACL::CreateChild, - ACL::Modify + ACL::Rename ] ); john_client .set_default_account_id(jane_id.to_string()) - .mailbox_update_acl(&inbox_id, "bill@example.com", [ACL::Read, ACL::ReadItems]) + .mailbox_update_acl(&inbox_id, &bill_id.to_string(), [ACL::ReadItems]) .await .unwrap(); assert_eq!( @@ -630,7 +615,7 @@ pub async fn test(params: &mut JMAPTest) { // Revoke all access to John jane_client - .mailbox_update_acl(&inbox_id, "jdoe@example.com", []) + .mailbox_update_acl(&inbox_id, &john_id.to_string(), []) .await .unwrap(); assert_forbidden( diff --git a/tests/src/jmap/blob.rs b/tests/src/jmap/blob.rs index 0254945c..a98b3dbf 100644 --- a/tests/src/jmap/blob.rs +++ b/tests/src/jmap/blob.rs @@ -175,7 +175,8 @@ pub async fn test(params: &mut JMAPTest) { }) .unwrap_or_default(), expected, - "Pointer {pointer:?} Response: {response:?}", + "Pointer {pointer:?} Response: {}", + serde_json::to_string_pretty(&response).unwrap() ); } diff --git a/tests/src/jmap/mod.rs b/tests/src/jmap/mod.rs index ad087276..294ea488 100644 --- a/tests/src/jmap/mod.rs +++ b/tests/src/jmap/mod.rs @@ -109,7 +109,7 @@ async fn jmap_tests() { vacation_response::test(&mut params).await; email_submission::test(&mut params).await; websocket::test(&mut params).await; - quota::test(&mut params).await; + quota::test(&mut params).await;* crypto::test(&mut params).await; blob::test(&mut params).await;*/ permissions::test(¶ms).await; @@ -991,6 +991,7 @@ type = "console" level = "{LEVEL}" multiline = false ansi = true +#disabled-events = ["network.*", "telemetry.webhook-error"] disabled-events = ["network.*", "telemetry.webhook-error", "http.request-body"] [webhook."test"]