diff --git a/core/Cargo.lock b/core/Cargo.lock index fc37c5d09..f81bd8c78 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -17,6 +17,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "bytes", + "crypto-common", + "generic-array", +] + [[package]] name = "aes" version = "0.7.5" @@ -227,6 +238,9 @@ name = "anyhow" version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +dependencies = [ + "backtrace", +] [[package]] name = "arbitrary" @@ -270,7 +284,7 @@ dependencies = [ "cfg-if", "derive-deftly 1.2.0", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "educe", "fs-mistrust", "futures", @@ -412,7 +426,7 @@ dependencies = [ "rcgen", "ring", "rustls 0.23.31", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "serde", "serde_json", "thiserror 1.0.69", @@ -456,19 +470,34 @@ dependencies = [ ] [[package]] -name = "async-compression" -version = "0.4.19" +name = "async-compat" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06575e6a9673580f52661c92107baabffbf41e2141373441cbcdc47cb733003c" +checksum = "a1ba85bc55464dcbf728b56d97e119d673f4cf9062be330a9a26f3acf504a590" +dependencies = [ + "futures-core", + "futures-io", + "once_cell", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-compression" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bee399cc3a623ec5a2db2c5b90ee0190a2260241fbe0c023ac8f7bab426aaf8" dependencies = [ "brotli", + "compression-codecs", + "compression-core", "flate2", "futures-core", "futures-io", + "liblzma", "memchr", "pin-project-lite", "tokio", - "xz2", "zstd", "zstd-safe", ] @@ -672,6 +701,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + [[package]] name = "asynchronous-codec" version = "0.7.0" @@ -709,12 +749,33 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "attohttpc" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" +dependencies = [ + "base64 0.22.1", + "http", + "log", + "url", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -801,7 +862,7 @@ dependencies = [ "sha1", "sync_wrapper", "tokio", - "tokio-tungstenite", + "tokio-tungstenite 0.26.2", "tower 0.5.2", "tower-layer", "tower-service", @@ -850,22 +911,34 @@ dependencies = [ [[package]] name = "backhand" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81e407ed987e67ac147f68f801e84a7628107acae7ac98439ee0c39d33c599dd" +checksum = "c45726a83c67f85d931ef28d331cbc4108b179e06359ed84944313dfc2bb9ce1" dependencies = [ "deku", "flate2", + "liblzma", "lz4_flex", + "rayon", "solana-nohash-hasher", "thiserror 2.0.16", "tracing", "xxhash-rust", - "xz2", "zstd", "zstd-safe", ] +[[package]] +name = "backon" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.75" @@ -889,7 +962,7 @@ checksum = "be5951c75bdabb58753d140dd5802f12ff3a483cb2e16fb5276e111b94b19e87" dependencies = [ "concurrent-queue 1.2.4", "event-listener 2.5.3", - "spin", + "spin 0.9.8", ] [[package]] @@ -933,6 +1006,12 @@ dependencies = [ "regex", ] +[[package]] +name = "bech32" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" + [[package]] name = "bincode" version = "1.3.3" @@ -979,7 +1058,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", "syn 2.0.106", "which", @@ -1074,7 +1153,7 @@ checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" dependencies = [ "arrayref", "arrayvec 0.7.6", - "constant_time_eq", + "constant_time_eq 0.3.1", ] [[package]] @@ -1087,7 +1166,7 @@ dependencies = [ "arrayvec 0.7.6", "cc", "cfg-if", - "constant_time_eq", + "constant_time_eq 0.3.1", "memmap2", "rayon-core", ] @@ -1134,6 +1213,12 @@ dependencies = [ "piper", ] +[[package]] +name = "bounded-integer" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "102dbef1187b1893e6dfe05a774e79fd52265f49f214f6879c8ff49f52c8188b" + [[package]] name = "bounded-vec-deque" version = "0.1.1" @@ -1142,9 +1227,9 @@ checksum = "2225b558afc76c596898f5f1b3fc35cfce0eb1b13635cbd7d1b2a7177dc10ccd" [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1153,9 +1238,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.3" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1172,6 +1257,12 @@ dependencies = [ "serde", ] +[[package]] +name = "btparse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387e80962b798815a2b5c4bcfdb6bf626fa922ffe9f74e373103b858738e9f31" + [[package]] name = "bumpalo" version = "3.19.0" @@ -1208,25 +1299,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -[[package]] -name = "bzip2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" -dependencies = [ - "bzip2-sys", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "cache-padded" version = "1.3.0" @@ -1255,6 +1327,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cexpr" version = "0.6.0" @@ -1276,6 +1354,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher 0.4.4", + "cpufeatures", +] + [[package]] name = "chrono" version = "0.4.41" @@ -1298,6 +1387,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" dependencies = [ "hashbrown 0.14.5", + "stacker", ] [[package]] @@ -1418,6 +1508,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.16", +] + +[[package]] +name = "color-backtrace" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2123a5984bd52ca861c66f66a9ab9883b27115c607f801f86c1bc2a84eb69f0f" +dependencies = [ + "backtrace", + "btparse", + "termcolor", +] + [[package]] name = "color-eyre" version = "0.6.5" @@ -1451,6 +1561,39 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compression-codecs" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7eea68f0e02c2b0aa8856e9a9478444206d4b6828728e7b0697c0f8cca265cb" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "futures-core", + "liblzma", + "memchr", + "pin-project-lite", + "zstd", + "zstd-safe", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + [[package]] name = "concurrent-queue" version = "1.2.4" @@ -1471,15 +1614,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.11" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +checksum = "2e09ced7ebbccb63b4c65413d821f2e00ce54c5ca4514ddc6b3c892fdbcbc69d" dependencies = [ "encode_unicode", "libc", "once_cell", "unicode-width 0.2.1", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1553,6 +1696,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + [[package]] name = "convert_case" version = "0.6.0" @@ -1609,6 +1758,34 @@ dependencies = [ "url", ] +[[package]] +name = "cookie_store" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f" +dependencies = [ + "cookie", + "document-features", + "idna", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1619,6 +1796,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1761,7 +1948,7 @@ checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ "bitflags 2.9.3", "crossterm_winapi", - "derive_more", + "derive_more 2.0.1", "document-features", "futures-core", "mio", @@ -1806,9 +1993,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto_box" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16182b4f39a82ec8a6851155cc4c0cda3065bb1db33651726a29e1951de0f009" +dependencies = [ + "aead", + "chacha20", + "crypto_secretbox", + "curve25519-dalek 4.1.3", + "salsa20", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto_secretbox" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" +dependencies = [ + "aead", + "chacha20", + "cipher 0.4.4", + "generic-array", + "poly1305", + "salsa20", + "subtle", + "zeroize", +] + [[package]] name = "csv" version = "1.3.1" @@ -1872,7 +2092,9 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", + "rand_core 0.6.4", "rustc_version", + "serde", "subtle", "zeroize", ] @@ -1964,17 +2186,11 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" -[[package]] -name = "deflate64" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" - [[package]] name = "deku" -version = "0.18.1" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9711031e209dc1306d66985363b4397d4c7b911597580340b93c9729b55f6eb" +checksum = "f476a022dcfbb013d1365734a42e05b6aca967ebe0d3bb38170086abd9ea3324" dependencies = [ "bitvec 1.0.1", "deku_derive", @@ -1984,9 +2200,9 @@ dependencies = [ [[package]] name = "deku_derive" -version = "0.18.1" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58cb0719583cbe4e81fb40434ace2f0d22ccc3e39a74bb3796c22b451b4f139d" +checksum = "bb216d425bdf810c165a8ae1649523033e88b5f795480ccec63926295541b084" dependencies = [ "darling 0.20.11", "proc-macro-crate", @@ -2154,13 +2370,34 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl", + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "unicode-xid", ] [[package]] @@ -2176,6 +2413,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + [[package]] name = "digest" version = "0.9.0" @@ -2266,10 +2509,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69dde51e8fef5e12c1d65e0929b03d66e4c0c18282bc30ed2ca050ad6f44dd82" [[package]] -name = "dns-lookup" -version = "2.1.1" +name = "dlopen2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf5597a4b7fe5275fc9dcf88ce26326bc8e4cb87d0130f33752d4c5f717793cf" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dns-lookup" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "853d5bcf0b73bd5e6d945b976288621825c7166e9f06c5a035ae1aaf42d1b64f" dependencies = [ "cfg-if", "libc", @@ -2443,6 +2697,34 @@ dependencies = [ "zeroize", ] +[[package]] +name = "email-encoding" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6" +dependencies = [ + "base64 0.22.1", + "memchr", +] + +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "emver" version = "0.1.6" @@ -2749,6 +3031,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "749cff877dc1af878a0b31a41dd221a753634401ea0ef2f87b62d3171522485a" +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2871,6 +3164,19 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-buffered" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin 0.10.0", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -2991,6 +3297,20 @@ 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" @@ -3021,16 +3341,6 @@ dependencies = [ "webpki-roots 0.26.11", ] -[[package]] -name = "gethostname" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" -dependencies = [ - "libc", - "windows-targets 0.48.5", -] - [[package]] name = "getrandom" version = "0.1.16" @@ -3169,6 +3479,15 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -3241,6 +3560,20 @@ dependencies = [ "num-traits", ] +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin 0.9.8", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.4.1" @@ -3292,7 +3625,7 @@ dependencies = [ "data-encoding", "futures-channel", "futures-util", - "hickory-proto 0.25.2", + "hickory-proto", "once_cell", "radix_trie", "rand 0.9.2", @@ -3301,34 +3634,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "hickory-proto" -version = "0.24.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna", - "ipnet", - "once_cell", - "rand 0.8.5", - "ring", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "thiserror 1.0.69", - "tinyvec", - "tokio", - "tokio-rustls 0.24.1", - "tracing", - "url", -] - [[package]] name = "hickory-proto" version = "0.25.2" @@ -3357,24 +3662,22 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.4" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" dependencies = [ "cfg-if", "futures-util", - "hickory-proto 0.24.4", + "hickory-proto", "ipconfig", - "lru-cache", + "moka", "once_cell", "parking_lot", - "rand 0.8.5", + "rand 0.9.2", "resolv-conf", - "rustls 0.21.12", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.16", "tokio", - "tokio-rustls 0.24.1", "tracing", ] @@ -3390,7 +3693,7 @@ dependencies = [ "data-encoding", "enum-as-inner", "futures-util", - "hickory-proto 0.25.2", + "hickory-proto", "ipnet", "prefix-trie", "serde", @@ -3425,6 +3728,22 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "hmac-sha1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b05da5b9e5d4720bfb691eebb2b9d42da3570745da71eac8a1f5bb7e59aab88" +dependencies = [ + "hmac", + "sha1", +] + +[[package]] +name = "hmac-sha256" +version = "1.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad6880c8d4a9ebf39c6e8b77007ce223f646a4d21ce29d99f70cb16420545425" + [[package]] name = "home" version = "0.5.11" @@ -3434,6 +3753,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "hostname" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +dependencies = [ + "cfg-if", + "libc", + "windows-link", +] + [[package]] name = "hostname-validator" version = "1.1.1" @@ -3539,6 +3869,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.2", "tower-service", + "webpki-roots 1.0.2", ] [[package]] @@ -3742,6 +4073,27 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "igd-next" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" +dependencies = [ + "async-trait", + "attohttpc", + "bytes", + "futures", + "http", + "http-body-util", + "hyper", + "hyper-util", + "log", + "rand 0.9.2", + "tokio", + "url", + "xmltree", +] + [[package]] name = "image" version = "0.25.6" @@ -3850,15 +4202,15 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.11" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd" dependencies = [ "console", - "number_prefix", "portable-atomic", "tokio", "unicode-width 0.2.1", + "unit-prefix", "web-time", ] @@ -3893,6 +4245,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "integer-encoding" version = "4.0.2" @@ -3954,6 +4318,215 @@ dependencies = [ "serde", ] +[[package]] +name = "iroh" +version = "0.91.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e52be9b8f33833ec080042f82035f87e90762c44be67b8c1aa0c593ff31a97d3" +dependencies = [ + "aead", + "backon", + "bytes", + "cfg_aliases", + "crypto_box", + "data-encoding", + "der", + "derive_more 2.0.1", + "ed25519-dalek 2.2.0", + "futures-buffered", + "futures-util", + "getrandom 0.3.3", + "hickory-resolver", + "http", + "igd-next", + "instant", + "iroh-base", + "iroh-metrics", + "iroh-quinn", + "iroh-quinn-proto", + "iroh-quinn-udp", + "iroh-relay", + "n0-future", + "n0-snafu", + "n0-watcher", + "nested_enum_utils", + "netdev", + "netwatch", + "pin-project", + "pkarr", + "portmapper", + "rand 0.8.5", + "reqwest", + "ring", + "rustls 0.23.31", + "rustls-pki-types", + "rustls-webpki 0.103.4", + "serde", + "smallvec", + "snafu", + "spki", + "strum", + "stun-rs", + "surge-ping", + "time", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "wasm-bindgen-futures", + "webpki-roots 0.26.11", + "z32", +] + +[[package]] +name = "iroh-base" +version = "0.91.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42393ff3628e5c765acdceb7da693d5f7869ec4c92599a83fa62368b15b0034e" +dependencies = [ + "curve25519-dalek 4.1.3", + "data-encoding", + "derive_more 2.0.1", + "ed25519-dalek 2.2.0", + "n0-snafu", + "nested_enum_utils", + "rand_core 0.6.4", + "serde", + "snafu", + "url", +] + +[[package]] +name = "iroh-metrics" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8922c169f1b84d39d325c02ef1bbe1419d4de6e35f0403462b3c7e60cc19634" +dependencies = [ + "iroh-metrics-derive", + "itoa", + "postcard", + "serde", + "snafu", + "tracing", +] + +[[package]] +name = "iroh-metrics-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d12f5c45c4ed2436302a4e03cad9a0ad34b2962ad0c5791e1019c0ee30eeb09" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "iroh-quinn" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde160ebee7aabede6ae887460cd303c8b809054224815addf1469d54a6fcf7" +dependencies = [ + "bytes", + "cfg_aliases", + "iroh-quinn-proto", + "iroh-quinn-udp", + "pin-project-lite", + "rustc-hash 2.1.1", + "rustls 0.23.31", + "socket2 0.5.10", + "thiserror 2.0.16", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "iroh-quinn-proto" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "929d5d8fa77d5c304d3ee7cae9aede31f13908bd049f9de8c7c0094ad6f7c535" +dependencies = [ + "bytes", + "getrandom 0.2.16", + "rand 0.8.5", + "ring", + "rustc-hash 2.1.1", + "rustls 0.23.31", + "rustls-pki-types", + "slab", + "thiserror 2.0.16", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "iroh-quinn-udp" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c53afaa1049f7c83ea1331f5ebb9e6ebc5fdd69c468b7a22dd598b02c9bcc973" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.10", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "iroh-relay" +version = "0.91.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1e4930e35b95957524aa08af0d27347156ff947f238f2b20d3e6da899fbdba" +dependencies = [ + "blake3", + "bytes", + "cfg_aliases", + "data-encoding", + "derive_more 2.0.1", + "getrandom 0.3.3", + "hickory-resolver", + "http", + "http-body-util", + "hyper", + "hyper-util", + "iroh-base", + "iroh-metrics", + "iroh-quinn", + "iroh-quinn-proto", + "lru", + "n0-future", + "n0-snafu", + "nested_enum_utils", + "num_enum", + "pin-project", + "pkarr", + "postcard", + "rand 0.8.5", + "reqwest", + "rustls 0.23.31", + "rustls-pki-types", + "rustls-webpki 0.103.4", + "serde", + "serde_bytes", + "sha1", + "snafu", + "strum", + "tokio", + "tokio-rustls 0.26.2", + "tokio-util", + "tokio-websockets", + "tracing", + "url", + "webpki-roots 0.26.11", + "ws_stream_wasm", + "z32", +] + [[package]] name = "is-terminal" version = "0.4.16" @@ -4079,6 +4652,28 @@ dependencies = [ "jaq-parse", ] +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.34" @@ -4247,7 +4842,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin", + "spin 0.9.8", ] [[package]] @@ -4256,6 +4851,35 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lettre" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cb54db6ff7a89efac87dba5baeac57bb9ccd726b49a9b6f21fb92b3966aaf56" +dependencies = [ + "async-trait", + "base64 0.22.1", + "chumsky", + "email-encoding", + "email_address", + "fastrand", + "futures-io", + "futures-util", + "hostname", + "httpdate", + "idna", + "mime", + "nom 8.0.0", + "percent-encoding", + "quoted_printable", + "rustls 0.23.31", + "rustls-platform-verifier", + "socket2 0.6.0", + "tokio", + "tokio-rustls 0.26.2", + "url", +] + [[package]] name = "lexical-core" version = "0.7.6" @@ -4285,6 +4909,27 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "liblzma" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10bf66f4598dc77ff96677c8e763655494f00ff9c1cf79e2eb5bb07bc31f807d" +dependencies = [ + "liblzma-sys", + "num_cpus", +] + +[[package]] +name = "liblzma-sys" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01b9596486f6d60c3bbe644c0e1be1aa6ccc472ad630fe8927b456973d7cb736" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "libm" version = "0.2.15" @@ -4332,12 +4977,6 @@ dependencies = [ "zlib-rs", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -4382,13 +5021,32 @@ dependencies = [ ] [[package]] -name = "lru-cache" +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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lz4_flex" @@ -4397,82 +5055,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" [[package]] -name = "lzma-rs" -version = "0.3.0" +name = "mainline" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +checksum = "c258b001fa52b7270dc1a239b36a9b608b024e68733648c1757b025204fdc248" dependencies = [ - "byteorder", "crc", -] - -[[package]] -name = "lzma-sys" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "mail-auth" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd9d657de66a3d5ac360c3eab8c9f5cac2565f2b97cc032d5de4c900ef470de" -dependencies = [ - "ahash 0.8.12", - "flate2", - "hickory-resolver", - "lru-cache", - "mail-builder", - "mail-parser", - "parking_lot", - "quick-xml", - "ring", - "rustls-pemfile 2.2.0", + "document-features", + "dyn-clone", + "ed25519-dalek 2.2.0", + "flume", + "futures-lite", + "getrandom 0.2.16", + "lru", "serde", - "serde_json", - "zip", -] - -[[package]] -name = "mail-builder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f5871d5270ed80f2ee750b95600c8d69b05f8653ad3be913b2ad2e924fefcb" -dependencies = [ - "gethostname", -] - -[[package]] -name = "mail-parser" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93c3b9e5d8b17faf573330bbc43b37d6e918c0a3bf8a88e7d0a220ebc84af9fc" -dependencies = [ - "encoding_rs", -] - -[[package]] -name = "mail-send" -version = "0.4.9" -source = "git+https://github.com/dr-bonez/mail-send.git?branch=main#57545dadab5808d59145d133de64f81b8ba01979" -dependencies = [ - "base64 0.22.1", - "gethostname", - "mail-auth", - "mail-builder", - "md5", - "rand 0.8.5", - "rustls 0.23.31", - "rustls-pki-types", - "smtp-proto", - "tokio", - "tokio-rustls 0.26.2", - "webpki-roots 0.26.11", + "serde_bencode", + "serde_bytes", + "sha1_smol", + "thiserror 2.0.16", + "tracing", ] [[package]] @@ -4616,6 +5217,7 @@ dependencies = [ "gpt", "ipnet", "lazy_static", + "lettre", "mbrman", "num_enum", "openssl", @@ -4636,6 +5238,70 @@ dependencies = [ "zbus", ] +[[package]] +name = "moka" +version = "0.12.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "loom", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "n0-future" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb0e5d99e681ab3c938842b96fcb41bf8a7bb4bfdb11ccbd653a7e83e06c794" +dependencies = [ + "cfg_aliases", + "derive_more 1.0.0", + "futures-buffered", + "futures-lite", + "futures-util", + "js-sys", + "pin-project", + "send_wrapper", + "tokio", + "tokio-util", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "n0-snafu" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4fed465ff57041f29db78a9adc8864296ef93c6c16029f9e192dc303404ebd0" +dependencies = [ + "anyhow", + "btparse", + "color-backtrace", + "snafu", + "tracing-error", +] + +[[package]] +name = "n0-watcher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31462392a10d5ada4b945e840cbec2d5f3fee752b96c4b33eb41414d8f45c2a" +dependencies = [ + "derive_more 1.0.0", + "n0-future", + "snafu", +] + [[package]] name = "native-tls" version = "0.2.14" @@ -4648,11 +5314,155 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] +[[package]] +name = "nested_enum_utils" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fa9161ed44d30e9702fe42bd78693bceac0fed02f647da749f36109023d3a3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "netdev" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862209dce034f82a44c95ce2b5183730d616f2a68746b9c1959aa2572e77c0a1" +dependencies = [ + "dlopen2", + "ipnet", + "libc", + "netlink-packet-core", + "netlink-packet-route 0.22.0", + "netlink-sys", + "once_cell", + "system-configuration", + "windows-sys 0.59.0", +] + +[[package]] +name = "netlink-packet-core" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +dependencies = [ + "anyhow", + "byteorder", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0e7987b28514adf555dc1f9a5c30dfc3e50750bbaffb1aec41ca7b23dcd8e4" +dependencies = [ + "anyhow", + "bitflags 2.9.3", + "byteorder", + "libc", + "log", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d83370a96813d7c977f8b63054f1162df6e5784f1c598d689236564fb5a6f2" +dependencies = [ + "anyhow", + "bitflags 2.9.3", + "byteorder", + "libc", + "log", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror 1.0.69", +] + +[[package]] +name = "netlink-proto" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror 2.0.16", +] + +[[package]] +name = "netlink-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "netwatch" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901dbb408894af3df3fc51420ba0c6faf3a7d896077b797c39b7001e2f787bd" +dependencies = [ + "atomic-waker", + "bytes", + "cfg_aliases", + "derive_more 2.0.1", + "iroh-quinn-udp", + "js-sys", + "libc", + "n0-future", + "n0-watcher", + "nested_enum_utils", + "netdev", + "netlink-packet-core", + "netlink-packet-route 0.24.0", + "netlink-proto", + "netlink-sys", + "pin-project-lite", + "serde", + "snafu", + "socket2 0.6.0", + "time", + "tokio", + "tokio-util", + "tracing", + "web-sys", + "windows", + "windows-result", + "wmi", +] + [[package]] name = "new_debug_unreachable" version = "1.0.6" @@ -4704,10 +5514,16 @@ dependencies = [ ] [[package]] -name = "no_std_io2" -version = "0.8.1" +name = "no-std-net" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3564ce7035b1e4778d8cb6cacebb5d766b5e8fe5a75b9e441e33fb61a872c6" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + +[[package]] +name = "no_std_io2" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2b9acd47481ab557a89a5665891be79e43cce8a29ad77aa9419d7be5a7c06a" dependencies = [ "memchr", ] @@ -4776,6 +5592,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "ntimestamp" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50f94c405726d3e0095e89e72f75ce7f6587b94a8bd8dc8054b73f65c0fd68c" +dependencies = [ + "base32", + "document-features", + "getrandom 0.2.16", + "httpdate", + "js-sys", + "once_cell", + "serde", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -4915,12 +5746,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - [[package]] name = "numtoa" version = "0.2.4" @@ -5316,6 +6141,16 @@ dependencies = [ "indexmap 2.11.0", ] +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + [[package]] name = "phf" version = "0.13.1" @@ -5417,6 +6252,38 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkarr" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb1f2f4311bae1da11f930c804c724c9914cf55ae51a9ee0440fc98826984f7" +dependencies = [ + "async-compat", + "base32", + "bytes", + "cfg_aliases", + "document-features", + "dyn-clone", + "ed25519-dalek 2.2.0", + "futures-buffered", + "futures-lite", + "getrandom 0.2.16", + "log", + "lru", + "mainline", + "ntimestamp", + "reqwest", + "self_cell", + "serde", + "sha1_smol", + "simple-dns", + "thiserror 2.0.16", + "tokio", + "tracing", + "url", + "wasm-bindgen-futures", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -5472,6 +6339,48 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "pnet_base" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cf6fb3ab38b68d01ab2aea03ed3d1132b4868fa4e06285f29f16da01c5f4c" +dependencies = [ + "no-std-net", +] + +[[package]] +name = "pnet_macros" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688b17499eee04a0408aca0aa5cba5fc86401d7216de8a63fdf7a4c227871804" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.106", +] + +[[package]] +name = "pnet_macros_support" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea925b72f4bd37f8eab0f221bbe4c78b63498350c983ffa9dd4bcde7e030f56" +dependencies = [ + "pnet_base", +] + +[[package]] +name = "pnet_packet" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a005825396b7fe7a38a8e288dbc342d5034dac80c15212436424fef8ea90ba" +dependencies = [ + "glob", + "pnet_base", + "pnet_macros", + "pnet_macros_support", +] + [[package]] name = "polling" version = "3.10.0" @@ -5486,12 +6395,54 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +[[package]] +name = "portmapper" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f1975debe62a70557e42b9ff9466e4890cf9d3d156d296408a711f1c5f642b" +dependencies = [ + "base64 0.22.1", + "bytes", + "derive_more 2.0.1", + "futures-lite", + "futures-util", + "hyper-util", + "igd-next", + "iroh-metrics", + "libc", + "nested_enum_utils", + "netwatch", + "num_enum", + "rand 0.9.2", + "serde", + "smallvec", + "snafu", + "socket2 0.6.0", + "time", + "tokio", + "tokio-util", + "tower-layer", + "tracing", + "url", +] + [[package]] name = "postage" version = "0.5.0" @@ -5507,6 +6458,31 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "postcard-derive", + "serde", +] + +[[package]] +name = "postcard-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "potential_utf" version = "0.1.2" @@ -5531,6 +6507,40 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "precis-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2e7b31f132e0c6f8682cfb7bf4a5340dbe925b7986618d0826a56dfe0c8e56" +dependencies = [ + "precis-tools", + "ucd-parse", + "unicode-normalization", +] + +[[package]] +name = "precis-profiles" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc4f67f78f50388f03494794766ba824a704db16fb5d400fe8d545fa7bc0d3f1" +dependencies = [ + "lazy_static", + "precis-core", + "precis-tools", + "unicode-normalization", +] + +[[package]] +name = "precis-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cc1eb2d5887ac7bfd2c0b745764db89edb84b856e4214e204ef48ef96d10c4a" +dependencies = [ + "lazy_static", + "regex", + "ucd-parse", +] + [[package]] name = "precomputed-hash" version = "0.1.1" @@ -5678,9 +6688,9 @@ dependencies = [ [[package]] name = "proptest-derive" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" +checksum = "095a99f75c69734802359b682be8daaf8980296731f6470434ea2c652af1dd30" dependencies = [ "proc-macro2", "quote", @@ -5725,6 +6735,15 @@ version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" +[[package]] +name = "psm" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" +dependencies = [ + "cc", +] + [[package]] name = "pty-process" version = "0.5.3" @@ -5772,12 +6791,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] -name = "quick-xml" -version = "0.32.0" +name = "quinn" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ - "memchr", + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls 0.23.31", + "socket2 0.6.0", + "thiserror 2.0.16", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls 0.23.31", + "rustls-pki-types", + "slab", + "thiserror 2.0.16", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.0", + "tracing", + "windows-sys 0.60.2", ] [[package]] @@ -5789,6 +6854,22 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "quoted-string-parser" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc75379cdb451d001f1cb667a9f74e8b355e9df84cc5193513cbe62b96fc5e9" +dependencies = [ + "pest", + "pest_derive", +] + +[[package]] +name = "quoted_printable" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73" + [[package]] name = "r-efi" version = "5.3.0" @@ -6091,6 +7172,12 @@ dependencies = [ "regex-syntax 0.8.6", ] +[[package]] +name = "regex-lite" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" + [[package]] name = "regex-syntax" version = "0.6.29" @@ -6112,7 +7199,7 @@ dependencies = [ "base64 0.22.1", "bytes", "cookie", - "cookie_store", + "cookie_store 0.21.1", "encoding_rs", "futures-core", "futures-util", @@ -6130,6 +7217,8 @@ dependencies = [ "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls 0.23.31", "rustls-pki-types", "serde", "serde_json", @@ -6137,6 +7226,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", + "tokio-rustls 0.26.2", "tokio-util", "tower 0.5.2", "tower-http", @@ -6146,16 +7236,17 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", + "webpki-roots 1.0.2", ] [[package]] name = "reqwest_cookie_store" -version = "0.8.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2314c325724fea278d44c13a525ebf60074e33c05f13b4345c076eb65b2446b3" +checksum = "5e75bc88d954b228850d19e3685cedb38c030a17da34aa01c307f95d6e33de34" dependencies = [ "bytes", - "cookie_store", + "cookie_store 0.22.0", "reqwest", "url", ] @@ -6282,13 +7373,14 @@ dependencies = [ [[package]] name = "rust-argon2" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d9848531d60c9cbbcf9d166c885316c24bc0e2a9d3eba0956bb6cbbd79bc6e8" +checksum = "8ae76b7506744d254fd0eb2c0ff5c5d108201ccbb083111ac04a44eeda105680" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "blake2b_simd", - "constant_time_eq", + "constant_time_eq 0.4.2", + "crossbeam-utils", ] [[package]] @@ -6303,6 +7395,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -6347,18 +7445,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.22.4" @@ -6390,12 +7476,15 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "1.0.4" +name = "rustls-native-certs" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ - "base64 0.21.7", + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.3.0", ] [[package]] @@ -6413,19 +7502,37 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ + "web-time", "zeroize", ] [[package]] -name = "rustls-webpki" -version = "0.101.7" +name = "rustls-platform-verifier" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "be59af91596cac372a6942530653ad0c3a246cdd491aaa9dcaee47f88d67d5a0" dependencies = [ - "ring", - "untrusted", + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.31", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.4", + "security-framework 3.3.0", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.52.0", ] +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.102.8" @@ -6493,13 +7600,22 @@ name = "safelog" version = "0.4.8" source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit#24730694701a83432d791d80802db8bda0699700" dependencies = [ - "derive_more", + "derive_more 2.0.1", "educe", "either", "fluid-let", "thiserror 2.0.16", ] +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher 0.4.4", +] + [[package]] name = "same-file" version = "1.0.6" @@ -6551,22 +7667,18 @@ dependencies = [ "serde_json", ] +[[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sec1" version = "0.7.3" @@ -6588,7 +7700,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.9.3", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" +dependencies = [ + "bitflags 2.9.3", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -6604,6 +7729,12 @@ dependencies = [ "libc", ] +[[package]] +name = "self_cell" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" + [[package]] name = "semver" version = "1.0.26" @@ -6613,6 +7744,12 @@ dependencies = [ "serde", ] +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + [[package]] name = "serde" version = "1.0.219" @@ -6641,6 +7778,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_bencode" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70dfc7b7438b99896e7f8992363ab8e2c4ba26aa5ec675d32d1c3c2c33d413e" +dependencies = [ + "serde", + "serde_bytes", +] + [[package]] name = "serde_bytes" version = "0.11.17" @@ -6800,6 +7947,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha-crypt" version = "0.5.0" @@ -6823,6 +7980,12 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.9.9" @@ -6936,10 +8099,10 @@ dependencies = [ ] [[package]] -name = "simd-adler32" -version = "0.3.7" +name = "simdutf8" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple-bytes" @@ -6947,6 +8110,15 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c11532d9d241904f095185f35dcdaf930b1427a94d5b01d7002d74ba19b44cc4" +[[package]] +name = "simple-dns" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" +dependencies = [ + "bitflags 2.9.3", +] + [[package]] name = "simple-logging" version = "2.0.2" @@ -7008,10 +8180,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] -name = "smtp-proto" -version = "0.1.6" +name = "snafu" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d3950ab75b03c52f2f13fd52aab91c9d62698b231b67240e85c3ef5301e63e" +checksum = "4800ae0e2ebdfaea32ffb9745642acdc378740dcbd74d3fb3cd87572a34810c6" +dependencies = [ + "backtrace", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f5ba9999528053fb497fdf0dd330efcc69cfe4ad03776c9d704bc54fee10f" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] name = "socket2" @@ -7057,6 +8245,15 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" [[package]] name = "spki" @@ -7263,6 +8460,19 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stacker" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + [[package]] name = "start-os" version = "0.4.0-alpha.10" @@ -7280,6 +8490,7 @@ dependencies = [ "base64 0.22.1", "base64ct", "basic-cookies", + "bech32", "blake3", "bytes", "chrono", @@ -7290,7 +8501,7 @@ dependencies = [ "console-subscriber", "const_format", "cookie", - "cookie_store", + "cookie_store 0.22.0", "der", "digest 0.10.7", "divrem", @@ -7321,6 +8532,7 @@ dependencies = [ "inotify", "integer-encoding", "ipnet", + "iroh", "isocountry", "itertools 0.14.0", "jaq-core", @@ -7330,9 +8542,9 @@ dependencies = [ "lazy_async_pool", "lazy_format", "lazy_static", + "lettre", "libc", "log", - "mail-send", "mbrman", "mio", "models", @@ -7391,9 +8603,9 @@ dependencies = [ "tokio-rustls 0.26.2", "tokio-stream", "tokio-tar", - "tokio-tungstenite", + "tokio-tungstenite 0.27.0", "tokio-util", - "toml 0.8.23", + "toml 0.9.5", "tor-cell", "tor-hscrypto", "tor-hsservice", @@ -7479,12 +8691,52 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "stun-rs" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb921f10397d5669e1af6455e9e2d367bf1f9cebcd6b1dd1dc50e19f6a9ac2ac" +dependencies = [ + "base64 0.22.1", + "bounded-integer", + "byteorder", + "crc", + "enumflags2", + "fallible-iterator", + "hmac-sha1", + "hmac-sha256", + "hostname-validator", + "lazy_static", + "md5", + "paste", + "precis-core", + "precis-profiles", + "quoted-string-parser", + "rand 0.9.2", +] + [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "surge-ping" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fda78103d8016bb25c331ddc54af634e801806463682cc3e549d335df644d95" +dependencies = [ + "hex", + "parking_lot", + "pnet_packet", + "rand 0.9.2", + "socket2 0.5.10", + "thiserror 1.0.69", + "tokio", + "tracing", +] + [[package]] name = "syn" version = "1.0.109" @@ -7548,7 +8800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.9.3", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7562,6 +8814,12 @@ dependencies = [ "libc", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tap" version = "1.0.1" @@ -7713,6 +8971,7 @@ checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", + "js-sys", "num-conv", "powerfmt", "serde", @@ -7822,16 +9081,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.25.0" @@ -7884,13 +9133,25 @@ name = "tokio-tungstenite" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.26.2", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" dependencies = [ "futures-util", "log", "native-tls", "tokio", "tokio-native-tls", - "tungstenite", + "tungstenite 0.27.0", ] [[package]] @@ -7903,10 +9164,33 @@ dependencies = [ "futures-core", "futures-io", "futures-sink", + "futures-util", "pin-project-lite", "tokio", ] +[[package]] +name = "tokio-websockets" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5190767f03b86528ab9f4f6a9158072a6d0ef240d9a9591772eb411f315920f4" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-sink", + "getrandom 0.3.3", + "http", + "httparse", + "rand 0.9.2", + "ring", + "rustls-pki-types", + "simdutf8", + "tokio", + "tokio-rustls 0.26.2", + "tokio-util", +] + [[package]] name = "toml" version = "0.8.23" @@ -8037,7 +9321,7 @@ name = "tor-basic-utils" version = "0.33.0" source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit#24730694701a83432d791d80802db8bda0699700" dependencies = [ - "derive_more", + "derive_more 2.0.1", "hex", "itertools 0.14.0", "libc", @@ -8077,7 +9361,7 @@ dependencies = [ "bytes", "caret", "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "educe", "itertools 0.14.0", "paste", @@ -8104,7 +9388,7 @@ source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit dependencies = [ "caret", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "digest 0.10.7", "thiserror 2.0.16", "tor-bytes", @@ -8120,7 +9404,7 @@ dependencies = [ "async-trait", "caret", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "educe", "futures", "oneshot-fused-workaround", @@ -8169,7 +9453,7 @@ dependencies = [ "cfg-if", "derive-deftly 1.2.0", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "downcast-rs", "dyn-clone", "educe", @@ -8270,7 +9554,7 @@ source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit dependencies = [ "async-compression", "base64ct", - "derive_more", + "derive_more 2.0.1", "futures", "hex", "http", @@ -8298,7 +9582,7 @@ dependencies = [ "async-trait", "base64ct", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "digest 0.10.7", "educe", "event-listener 5.4.1", @@ -8348,7 +9632,7 @@ name = "tor-error" version = "0.33.0" source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit#24730694701a83432d791d80802db8bda0699700" dependencies = [ - "derive_more", + "derive_more 2.0.1", "futures", "paste", "retry-error", @@ -8365,7 +9649,7 @@ version = "0.33.0" source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit#24730694701a83432d791d80802db8bda0699700" dependencies = [ "arbitrary", - "derive_more", + "derive_more 2.0.1", "thiserror 2.0.16", "void", ] @@ -8379,7 +9663,7 @@ dependencies = [ "base64ct", "derive-deftly 1.2.0", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "dyn-clone", "educe", "futures", @@ -8418,7 +9702,7 @@ source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit dependencies = [ "async-trait", "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "educe", "either", "futures", @@ -8462,7 +9746,7 @@ dependencies = [ "cipher 0.4.4", "data-encoding", "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "digest 0.10.7", "equix", "hex", @@ -8497,7 +9781,7 @@ dependencies = [ "cfg-if", "derive-deftly 1.2.0", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "digest 0.10.7", "educe", "fs-mistrust", @@ -8549,7 +9833,7 @@ version = "0.33.0" source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit#24730694701a83432d791d80802db8bda0699700" dependencies = [ "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "downcast-rs", "paste", "rand 0.9.2", @@ -8573,7 +9857,7 @@ dependencies = [ "cfg-if", "derive-deftly 1.2.0", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "downcast-rs", "dyn-clone", "fs-mistrust", @@ -8612,7 +9896,7 @@ dependencies = [ "caret", "derive-deftly 1.2.0", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "hex", "itertools 0.14.0", "safelog", @@ -8639,7 +9923,7 @@ dependencies = [ "curve25519-dalek 4.1.3", "der-parser 10.0.0", "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "digest 0.10.7", "ed25519-dalek 2.2.0", "educe", @@ -8687,7 +9971,7 @@ source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit dependencies = [ "cfg-if", "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "dyn-clone", "educe", "futures", @@ -8716,7 +10000,7 @@ source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit dependencies = [ "async-trait", "bitflags 2.9.3", - "derive_more", + "derive_more 2.0.1", "digest 0.10.7", "futures", "hex", @@ -8752,7 +10036,7 @@ dependencies = [ "cipher 0.4.4", "derive-deftly 1.2.0", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "digest 0.10.7", "educe", "hex", @@ -8794,7 +10078,7 @@ source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit dependencies = [ "amplify", "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "filetime", "fs-mistrust", "fslock", @@ -8831,7 +10115,7 @@ dependencies = [ "criterion-cycles-per-byte", "derive-deftly 1.2.0", "derive_builder_fork_arti", - "derive_more", + "derive_more 2.0.1", "digest 0.10.7", "educe", "futures", @@ -8915,7 +10199,7 @@ dependencies = [ "async_executors", "asynchronous-codec", "coarsetime", - "derive_more", + "derive_more 2.0.1", "dyn-clone", "educe", "futures", @@ -8945,7 +10229,7 @@ dependencies = [ "assert_matches", "async-trait", "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "educe", "futures", "humantime", @@ -8986,7 +10270,7 @@ version = "0.33.0" source = "git+https://github.com/Start9Labs/arti.git?branch=patch%2Fdisable-exit#24730694701a83432d791d80802db8bda0699700" dependencies = [ "derive-deftly 1.2.0", - "derive_more", + "derive_more 2.0.1", "serde", "thiserror 2.0.16", "tor-memquota", @@ -9205,6 +10489,23 @@ name = "tungstenite" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "sha1", + "thiserror 2.0.16", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" dependencies = [ "bytes", "data-encoding", @@ -9255,6 +10556,15 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "ucd-parse" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06ff81122fcbf4df4c1660b15f7e3336058e7aec14437c9f85c6b31a0f279b9" +dependencies = [ + "regex-lite", +] + [[package]] name = "ucd-trie" version = "0.1.7" @@ -9350,6 +10660,22 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unit-prefix" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "unix-named-pipe" version = "0.2.0" @@ -9640,6 +10966,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.26.11" @@ -9830,6 +11165,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -9866,6 +11210,21 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -9923,6 +11282,12 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -9941,6 +11306,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -9959,6 +11330,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -9989,6 +11366,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -10007,6 +11390,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -10025,6 +11414,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -10043,6 +11438,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -10089,12 +11490,46 @@ dependencies = [ "bitflags 2.9.3", ] +[[package]] +name = "wmi" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3de777dce4cbcdc661d5d18e78ce4b46a37adc2bb7c0078a556c7f07bcce2f" +dependencies = [ + "chrono", + "futures", + "log", + "serde", + "thiserror 2.0.16", + "windows", + "windows-core", +] + [[package]] name = "writeable" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "ws_stream_wasm" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper", + "thiserror 2.0.16", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wyz" version = "0.2.0" @@ -10158,21 +11593,27 @@ dependencies = [ "rustix 1.0.8", ] +[[package]] +name = "xml-rs" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + [[package]] name = "xxhash-rust" version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" -[[package]] -name = "xz2" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" -dependencies = [ - "lzma-sys", -] - [[package]] name = "yajrc" version = "0.1.3" @@ -10232,6 +11673,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "z32" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2164e798d9e3d84ee2c91139ace54638059a3b23e361f5c11781c2c6459bde0f" + [[package]] name = "zbus" version = "5.10.0" @@ -10386,54 +11833,12 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "zip" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" -dependencies = [ - "aes 0.8.4", - "arbitrary", - "bzip2", - "constant_time_eq", - "crc32fast", - "crossbeam-utils", - "deflate64", - "displaydoc", - "flate2", - "getrandom 0.3.3", - "hmac", - "indexmap 2.11.0", - "lzma-rs", - "memchr", - "pbkdf2", - "sha1", - "thiserror 2.0.16", - "time", - "xz2", - "zeroize", - "zopfli", - "zstd", -] - [[package]] name = "zlib-rs" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" -[[package]] -name = "zopfli" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" -dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", -] - [[package]] name = "zstd" version = "0.13.3" diff --git a/core/models/Cargo.toml b/core/models/Cargo.toml index 9d489a84e..993aa1e18 100644 --- a/core/models/Cargo.toml +++ b/core/models/Cargo.toml @@ -13,6 +13,7 @@ color-eyre = "0.6.2" ed25519-dalek = { version = "2.0.0", features = ["serde"] } gpt = "4.1.0" lazy_static = "1.4" +lettre = { version = "0.11", default-features = false } mbrman = "0.6.0" exver = { version = "0.2.0", git = "https://github.com/Start9Labs/exver-rs.git", features = [ "serde", diff --git a/core/models/src/errors.rs b/core/models/src/errors.rs index 779e4b1a4..bcc202c8b 100644 --- a/core/models/src/errors.rs +++ b/core/models/src/errors.rs @@ -94,6 +94,7 @@ pub enum ErrorKind { DBus = 75, InstallFailed = 76, UpdateFailed = 77, + Smtp = 78, } impl ErrorKind { pub fn as_str(&self) -> &'static str { @@ -176,6 +177,7 @@ impl ErrorKind { DBus => "DBus Error", InstallFailed => "Install Failed", UpdateFailed => "Update Failed", + Smtp => "SMTP Error", } } } @@ -370,6 +372,21 @@ impl From for Error { } } } +impl From for Error { + fn from(e: lettre::error::Error) -> Self { + Error::new(e, ErrorKind::Smtp) + } +} +impl From for Error { + fn from(e: lettre::transport::smtp::Error) -> Self { + Error::new(e, ErrorKind::Smtp) + } +} +impl From for Error { + fn from(e: lettre::address::AddressError) -> Self { + Error::new(e, ErrorKind::Smtp) + } +} #[derive(Clone, Deserialize, Serialize)] pub struct ErrorData { diff --git a/core/startos/Cargo.toml b/core/startos/Cargo.toml index 48d60b793..c5bc20560 100644 --- a/core/startos/Cargo.toml +++ b/core/startos/Cargo.toml @@ -51,7 +51,7 @@ default = ["cli", "startd", "registry", "cli-container", "tunnel"] dev = [] docker = [] registry = [] -startd = ["mail-send"] +startd = [] test = [] tunnel = [] unstable = ["console-subscriber", "tokio/tracing"] @@ -81,25 +81,26 @@ async-stream = "0.3.5" async-trait = "0.1.74" axum = { version = "0.8.4", features = ["ws"] } barrage = "0.2.3" -backhand = "0.21.0" +backhand = "0.23.0" base32 = "0.5.0" base64 = "0.22.1" base64ct = "1.6.0" basic-cookies = "0.1.4" +bech32 = "0.11.0" blake3 = { version = "1.5.0", features = ["mmap", "rayon"] } bytes = "1" chrono = { version = "0.4.31", features = ["serde"] } clap = { version = "4.4.12", features = ["string"] } color-eyre = "0.6.2" -console = "0.15.7" +console = "0.16.0" console-subscriber = { version = "0.4.1", optional = true } const_format = "0.2.34" cookie = "0.18.0" -cookie_store = "0.21.0" +cookie_store = "0.22.0" der = { version = "0.7.9", features = ["derive", "pem"] } digest = "0.10.7" divrem = "1.0.0" -dns-lookup = "2.1.0" +dns-lookup = "3.0.0" ed25519 = { version = "2.2.3", features = ["pkcs8", "pem", "alloc"] } ed25519-dalek = { version = "2.2.0", features = [ "serde", @@ -141,10 +142,11 @@ imbl = { version = "6", features = ["serde", "small-chunks"] } imbl-value = { version = "0.4.3", features = ["ts-rs"] } include_dir = { version = "0.7.3", features = ["metadata"] } indexmap = { version = "2.0.2", features = ["serde"] } -indicatif = { version = "0.17.7", features = ["tokio"] } +indicatif = { version = "0.18.0", features = ["tokio"] } inotify = "0.11.0" integer-encoding = { version = "4.0.0", features = ["tokio_async"] } ipnet = { version = "2.8.0", features = ["serde"] } +iroh = { version = "0.91.2", features = ["discovery-pkarr-dht"] } isocountry = "0.3.2" itertools = "0.14.0" jaq-core = "0.10.1" @@ -153,7 +155,16 @@ josekit = "0.10.3" jsonpath_lib = { git = "https://github.com/Start9Labs/jsonpath.git" } lazy_async_pool = "0.3.3" lazy_format = "2.0" -lazy_static = "1.4.0" +lazy_static = "1.5.0" +lettre = { version = "0.11.18", default-features = false, features = [ + "smtp-transport", + "pool", + "hostname", + "builder", + "tokio1-rustls", + "rustls-platform-verifier", + "aws-lc-rs", +] } libc = "0.2.149" log = "0.4.20" mio = "1" @@ -186,23 +197,23 @@ pkcs8 = { version = "0.10.2", features = ["std"] } prettytable-rs = "0.10.0" procfs = { version = "0.17.0", optional = true } proptest = "1.3.1" -proptest-derive = "0.5.0" +proptest-derive = "0.6.0" pty-process = { version = "0.5.1", optional = true } qrcode = "0.14.1" rand = "0.9.2" regex = "1.10.2" reqwest = { version = "0.12.4", features = ["stream", "json", "socks"] } -reqwest_cookie_store = "0.8.0" +reqwest_cookie_store = "0.9.0" rpassword = "7.2.0" rpc-toolkit = { git = "https://github.com/Start9Labs/rpc-toolkit.git", branch = "master" } -rust-argon2 = "2.0.0" +rust-argon2 = "3.0.0" rustyline-async = "0.4.1" safelog = { version = "0.4.8", git = "https://github.com/Start9Labs/arti.git", branch = "patch/disable-exit" } semver = { version = "1.0.20", features = ["serde"] } serde = { version = "1.0", features = ["derive", "rc"] } serde_cbor = { package = "ciborium", version = "0.2.1" } serde_json = "1.0" -serde_toml = { package = "toml", version = "0.8.2" } +serde_toml = { package = "toml", version = "0.9.5" } serde_urlencoded = "0.7" serde_with = { version = "3.4.0", features = ["macros", "json"] } serde_yaml = { package = "serde_yml", version = "0.0.12" } @@ -227,7 +238,7 @@ tokio = { version = "1.38.1", features = ["full"] } tokio-rustls = "0.26.0" tokio-stream = { version = "0.1.14", features = ["io-util", "sync", "net"] } tokio-tar = { git = "https://github.com/dr-bonez/tokio-tar.git" } -tokio-tungstenite = { version = "0.26.2", features = ["native-tls", "url"] } +tokio-tungstenite = { version = "0.27.0", features = ["native-tls", "url"] } tokio-util = { version = "0.7.9", features = ["io"] } tor-cell = { version = "0.33", git = "https://github.com/Start9Labs/arti.git", branch = "patch/disable-exit" } tor-hscrypto = { version = "0.33", features = [ @@ -259,7 +270,6 @@ urlencoding = "2.1.3" uuid = { version = "1.4.1", features = ["v4"] } zbus = "5.1.1" zeroize = "1.6.0" -mail-send = { git = "https://github.com/dr-bonez/mail-send.git", branch = "main", optional = true } rustls = "0.23.20" rustls-pki-types = { version = "1.10.1", features = ["alloc"] } diff --git a/core/startos/src/net/iroh.rs b/core/startos/src/net/iroh.rs new file mode 100644 index 000000000..7b1cb7b8c --- /dev/null +++ b/core/startos/src/net/iroh.rs @@ -0,0 +1,585 @@ +use std::collections::{BTreeMap, BTreeSet}; +use std::net::SocketAddr; +use std::str::FromStr; +use std::sync::{Arc, Weak}; + +use clap::Parser; +use color_eyre::eyre::eyre; +use futures::{FutureExt, StreamExt}; +use helpers::NonDetachingJoinHandle; +use imbl_value::InternedString; +use iroh::{Endpoint, NodeId, SecretKey}; +use itertools::Itertools; +use rpc_toolkit::{from_fn_async, Context, Empty, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; +use tokio::net::TcpStream; + +use crate::context::{CliContext, RpcContext}; +use crate::prelude::*; +use crate::util::actor::background::BackgroundJobQueue; +use crate::util::io::ReadWriter; +use crate::util::serde::{ + deserialize_from_str, display_serializable, serialize_display, HandlerExtSerde, Pem, + PemEncoding, WithIoFormat, +}; +use crate::util::sync::{SyncMutex, SyncRwLock, Watch}; + +const HRP: bech32::Hrp = bech32::Hrp::parse_unchecked("iroh"); + +#[derive(Debug, Clone, Copy)] +pub struct IrohAddress(pub NodeId); +impl std::fmt::Display for IrohAddress { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + bech32::encode_lower_to_fmt::(f, HRP, self.0.as_bytes()) + .map_err(|_| std::fmt::Error)?; + write!(f, ".p2p.start9.to") + } +} +impl FromStr for IrohAddress { + type Err = Error; + fn from_str(s: &str) -> Result { + if let Some(b32) = s.strip_suffix(".p2p.start9.to") { + let (hrp, data) = bech32::decode(b32).with_kind(ErrorKind::ParseNetAddress)?; + ensure_code!( + hrp == HRP, + ErrorKind::ParseNetAddress, + "not an iroh address" + ); + Ok(Self( + NodeId::from_bytes(&*>::try_from(data).map_err(|_| { + Error::new(eyre!("invalid length"), ErrorKind::ParseNetAddress) + })?) + .with_kind(ErrorKind::ParseNetAddress)?, + )) + } else { + Err(Error::new( + eyre!("Invalid iroh address"), + ErrorKind::ParseNetAddress, + )) + } + } +} +impl Serialize for IrohAddress { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serialize_display(self, serializer) + } +} +impl<'de> Deserialize<'de> for IrohAddress { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + deserialize_from_str(deserializer) + } +} +impl PartialEq for IrohAddress { + fn eq(&self, other: &Self) -> bool { + self.0.as_ref() == other.0.as_ref() + } +} +impl Eq for IrohAddress {} +impl PartialOrd for IrohAddress { + fn partial_cmp(&self, other: &Self) -> Option { + self.0.as_ref().partial_cmp(other.0.as_ref()) + } +} +impl Ord for IrohAddress { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.0.as_ref().cmp(other.0.as_ref()) + } +} + +#[derive(Clone, Debug)] +pub struct IrohSecretKey(pub SecretKey); +impl IrohSecretKey { + pub fn iroh_address(&self) -> IrohAddress { + IrohAddress(self.0.public()) + } + pub fn generate() -> Self { + Self(SecretKey::generate( + &mut ssh_key::rand_core::OsRng::default(), + )) + } +} +impl PemEncoding for IrohSecretKey { + fn from_pem(pem: &str) -> Result { + ed25519_dalek::SigningKey::from_pem(pem) + .map(From::from) + .map(Self) + } + fn to_pem(&self) -> Result { + self.0.secret().to_pem() + } +} + +#[derive(Default, Debug, Deserialize, Serialize)] +pub struct IrohKeyStore(BTreeMap>); +impl Map for IrohKeyStore { + type Key = IrohAddress; + type Value = Pem; + fn key_str(key: &Self::Key) -> Result, Error> { + Self::key_string(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(InternedString::from_display(key)) + } +} +impl IrohKeyStore { + pub fn new() -> Self { + Self::default() + } + pub fn insert(&mut self, key: IrohSecretKey) { + self.0.insert(key.iroh_address(), Pem::new(key)); + } +} +impl Model { + pub fn new_key(&mut self) -> Result { + let key = IrohSecretKey::generate(); + self.insert(&key.iroh_address(), &Pem::new(key))?; + Ok(key) + } + pub fn insert_key(&mut self, key: &IrohSecretKey) -> Result<(), Error> { + self.insert(&key.iroh_address(), Pem::new_ref(key)) + } + pub fn get_key(&self, address: &IrohAddress) -> Result { + self.as_idx(address) + .or_not_found(lazy_format!("private key for {address}"))? + .de() + .map(|k| k.0) + } +} + +pub fn iroh_api() -> ParentHandler { + ParentHandler::new() + .subcommand( + "list-services", + from_fn_async(list_services) + .with_display_serializable() + .with_custom_display_fn(|handle, result| display_services(handle.params, result)) + .with_about("Display the status of running iroh services") + .with_call_remote::(), + ) + .subcommand( + "key", + key::().with_about("Manage the iroh service key store"), + ) +} + +pub fn key() -> ParentHandler { + ParentHandler::new() + .subcommand( + "generate", + from_fn_async(generate_key) + .with_about("Generate an iroh service key and add it to the key store") + .with_call_remote::(), + ) + .subcommand( + "add", + from_fn_async(add_key) + .with_about("Add an iroh service key to the key store") + .with_call_remote::(), + ) + .subcommand( + "list", + from_fn_async(list_keys) + .with_custom_display_fn(|_, res| { + for addr in res { + println!("{addr}"); + } + Ok(()) + }) + .with_about("List iroh services with keys in the key store") + .with_call_remote::(), + ) +} + +pub async fn generate_key(ctx: RpcContext) -> Result { + ctx.db + .mutate(|db| { + Ok(db + .as_private_mut() + .as_key_store_mut() + .as_iroh_mut() + .new_key()? + .iroh_address()) + }) + .await + .result +} + +#[derive(Deserialize, Serialize, Parser)] +pub struct AddKeyParams { + pub key: Pem, +} + +pub async fn add_key( + ctx: RpcContext, + AddKeyParams { key }: AddKeyParams, +) -> Result { + ctx.db + .mutate(|db| { + db.as_private_mut() + .as_key_store_mut() + .as_iroh_mut() + .insert_key(&key.0) + }) + .await + .result?; + Ok(key.iroh_address()) +} + +pub async fn list_keys(ctx: RpcContext) -> Result, Error> { + ctx.db + .peek() + .await + .into_private() + .into_key_store() + .into_iroh() + .keys() +} + +pub fn display_services( + params: WithIoFormat, + services: BTreeMap, +) -> Result<(), Error> { + use prettytable::*; + + if let Some(format) = params.format { + return display_serializable(format, services); + } + + let mut table = Table::new(); + table.add_row(row![bc => "ADDRESS", "BINDINGS"]); + for (service, info) in services { + let row = row![ + &service.to_string(), + &info + .bindings + .into_iter() + .map(|((subdomain, port), addr)| lazy_format!("{subdomain}:{port} -> {addr}")) + .join("; ") + ]; + table.add_row(row); + } + table.print_tty(false)?; + Ok(()) +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct IrohServiceInfo { + pub bindings: BTreeMap<(InternedString, u16), SocketAddr>, +} + +pub async fn list_services( + ctx: RpcContext, + _: Empty, +) -> Result, Error> { + ctx.net_controller.iroh.list_services().await +} + +#[derive(Clone)] +pub struct IrohController(Arc); +struct IrohControllerInner { + // client: Endpoint, + services: SyncMutex>, +} +impl IrohController { + pub fn new() -> Result { + Ok(Self(Arc::new(IrohControllerInner { + services: SyncMutex::new(BTreeMap::new()), + }))) + } + + pub fn service(&self, key: IrohSecretKey) -> Result { + self.0.services.mutate(|s| { + use std::collections::btree_map::Entry; + let addr = key.iroh_address(); + match s.entry(addr) { + Entry::Occupied(e) => Ok(e.get().clone()), + Entry::Vacant(e) => Ok(e + .insert(IrohService::launch(self.0.client.clone(), key)?) + .clone()), + } + }) + } + + pub async fn gc(&self, addr: Option) -> Result<(), Error> { + if let Some(addr) = addr { + if let Some(s) = self.0.services.mutate(|s| { + let rm = if let Some(s) = s.get(&addr) { + !s.gc() + } else { + false + }; + if rm { + s.remove(&addr) + } else { + None + } + }) { + s.shutdown().await + } else { + Ok(()) + } + } else { + for s in self.0.services.mutate(|s| { + let mut rm = Vec::new(); + s.retain(|_, s| { + if s.gc() { + true + } else { + rm.push(s.clone()); + false + } + }); + rm + }) { + s.shutdown().await?; + } + Ok(()) + } + } + + pub async fn list_services(&self) -> Result, Error> { + Ok(self + .0 + .services + .peek(|s| s.iter().map(|(a, s)| (a.clone(), s.info())).collect())) + } + + pub async fn connect_iroh( + &self, + addr: &IrohAddress, + port: u16, + ) -> Result, Error> { + if let Some(target) = self.0.services.peek(|s| { + s.get(addr).and_then(|s| { + s.0.bindings.peek(|b| { + b.get(&port).and_then(|b| { + b.iter() + .find(|(_, rc)| rc.strong_count() > 0) + .map(|(a, _)| *a) + }) + }) + }) + }) { + Ok(Box::new( + TcpStream::connect(target) + .await + .with_kind(ErrorKind::Network)?, + )) + } else { + todo!() + } + } +} + +#[derive(Clone)] +pub struct IrohService(Arc); +struct IrohServiceData { + service: Endpoint, + bindings: Arc>>>>, + _thread: NonDetachingJoinHandle<()>, +} +impl IrohService { + fn launch( + mut client: Watch<(usize, IrohClient)>, + key: IrohSecretKey, + ) -> Result { + let service = Arc::new(SyncMutex::new(None)); + let bindings = Arc::new(SyncRwLock::new(BTreeMap::< + u16, + BTreeMap>, + >::new())); + Ok(Self(Arc::new(IrohServiceData { + service: service.clone(), + bindings: bindings.clone(), + _thread: tokio::spawn(async move { + let (bg, mut runner) = BackgroundJobQueue::new(); + runner + .run_while(async { + loop { + if let Err(e) = async { + client.wait_for(|(_,c)| c.bootstrap_status().ready_for_traffic()).await; + let epoch = client.peek(|(e, c)| { + ensure_code!(c.bootstrap_status().ready_for_traffic(), ErrorKind::Iroh, "client recycled"); + Ok::<_, Error>(*e) + })?; + let (new_service, stream) = client.peek(|(_, c)| { + c.launch_onion_service_with_hsid( + IrohServiceConfigBuilder::default() + .nickname( + key.iroh_address() + .to_string() + .trim_end_matches(".onion") + .parse::() + .with_kind(ErrorKind::Iroh)?, + ) + .build() + .with_kind(ErrorKind::Iroh)?, + key.clone().0, + ) + .with_kind(ErrorKind::Iroh) + })?; + let mut status_stream = new_service.status_events(); + bg.add_job(async move { + while let Some(status) = status_stream.next().await { + // TODO: health daemon? + } + }); + service.replace(Some(new_service)); + let mut stream = tor_hsservice::handle_rend_requests(stream); + while let Some(req) = tokio::select! { + req = stream.next() => req, + _ = client.wait_for(|(e, _)| *e != epoch) => None + } { + bg.add_job({ + let bg = bg.clone(); + let bindings = bindings.clone(); + async move { + if let Err(e) = async { + let IncomingStreamRequest::Begin(begin) = + req.request() + else { + return req + .reject(tor_cell::relaycell::msg::End::new_with_reason( + tor_cell::relaycell::msg::EndReason::DONE, + )) + .await + .with_kind(ErrorKind::Iroh); + }; + let Some(target) = bindings.peek(|b| { + b.get(&begin.port()).and_then(|a| { + a.iter() + .find(|(_, rc)| rc.strong_count() > 0) + .map(|(addr, _)| *addr) + }) + }) else { + return req + .reject(tor_cell::relaycell::msg::End::new_with_reason( + tor_cell::relaycell::msg::EndReason::DONE, + )) + .await + .with_kind(ErrorKind::Iroh); + }; + bg.add_job(async move { + if let Err(e) = async { + let mut outgoing = + TcpStream::connect(target) + .await + .with_kind(ErrorKind::Network)?; + let mut incoming = req + .accept(Connected::new_empty()) + .await + .with_kind(ErrorKind::Iroh)?; + if let Err(e) = + tokio::io::copy_bidirectional( + &mut outgoing, + &mut incoming, + ) + .await + { + tracing::error!("Iroh Stream Error: {e}"); + tracing::debug!("{e:?}"); + } + + Ok::<_, Error>(()) + } + .await + { + tracing::trace!("Iroh Stream Error: {e}"); + tracing::trace!("{e:?}"); + } + }); + Ok::<_, Error>(()) + } + .await + { + tracing::trace!("Iroh Request Error: {e}"); + tracing::trace!("{e:?}"); + } + } + }); + } + Ok::<_, Error>(()) + } + .await + { + tracing::error!("Iroh Client Error: {e}"); + tracing::debug!("{e:?}"); + } + } + }) + .await + }) + .into(), + }))) + } + + pub fn proxy_all>>( + &self, + bindings: impl IntoIterator, + ) -> Rcs { + self.0.bindings.mutate(|b| { + bindings + .into_iter() + .map(|(subdomain, port, target)| { + let entry = b + .entry((subdomain, port)) + .or_default() + .entry(target) + .or_default(); + if let Some(rc) = entry.upgrade() { + rc + } else { + let rc = Arc::new(()); + *entry = Arc::downgrade(&rc); + rc + } + }) + .collect() + }) + } + + pub fn gc(&self) -> bool { + self.0.bindings.mutate(|b| { + b.retain(|_, targets| { + targets.retain(|_, rc| rc.strong_count() > 0); + !targets.is_empty() + }); + !b.is_empty() + }) + } + + pub async fn shutdown(self) -> Result<(), Error> { + self.0.service.replace(None); + self.0._thread.abort(); + Ok(()) + } + + pub fn state(&self) -> IrohServiceState { + self.0 + .service + .peek(|s| s.as_ref().map(|s| s.status().state().into())) + .unwrap_or(IrohServiceState::Bootstrapping) + } + + pub fn info(&self) -> IrohServiceInfo { + IrohServiceInfo { + state: self.state(), + bindings: self.0.bindings.peek(|b| { + b.iter() + .filter_map(|(port, b)| { + b.iter() + .find(|(_, rc)| rc.strong_count() > 0) + .map(|(addr, _)| (*port, *addr)) + }) + .collect() + }), + } + } +} diff --git a/core/startos/src/net/keys.rs b/core/startos/src/net/keys.rs index 2cfcb025d..1786a13b3 100644 --- a/core/startos/src/net/keys.rs +++ b/core/startos/src/net/keys.rs @@ -2,14 +2,17 @@ use serde::{Deserialize, Serialize}; use crate::account::AccountInfo; use crate::net::acme::AcmeCertStore; +use crate::net::iroh::IrohKeyStore; use crate::net::ssl::CertStore; -use crate::net::tor::OnionStore; +use crate::net::tor::OnionKeyStore; use crate::prelude::*; #[derive(Debug, Deserialize, Serialize, HasModel)] #[model = "Model"] pub struct KeyStore { - pub onion: OnionStore, + pub onion: OnionKeyStore, + #[serde(default)] + pub iroh: IrohKeyStore, pub local_certs: CertStore, #[serde(default)] pub acme: AcmeCertStore, @@ -17,7 +20,8 @@ pub struct KeyStore { impl KeyStore { pub fn new(account: &AccountInfo) -> Result { let mut res = Self { - onion: OnionStore::new(), + onion: OnionKeyStore::new(), + iroh: IrohKeyStore::new(), local_certs: CertStore::new(account)?, acme: AcmeCertStore::new(), }; diff --git a/core/startos/src/net/mod.rs b/core/startos/src/net/mod.rs index 9d1f139a0..e62add961 100644 --- a/core/startos/src/net/mod.rs +++ b/core/startos/src/net/mod.rs @@ -5,6 +5,7 @@ pub mod dns; pub mod forward; pub mod gateway; pub mod host; +pub mod iroh; pub mod keys; pub mod mdns; pub mod net_controller; diff --git a/core/startos/src/net/net_controller.rs b/core/startos/src/net/net_controller.rs index 6ccf901dd..a94aa3058 100644 --- a/core/startos/src/net/net_controller.rs +++ b/core/startos/src/net/net_controller.rs @@ -24,6 +24,7 @@ use crate::net::gateway::{ use crate::net::host::address::HostAddress; use crate::net::host::binding::{AddSslOptions, BindId, BindOptions}; use crate::net::host::{host_for, Host, Hosts}; +use crate::net::iroh::IrohController; use crate::net::service_interface::{HostnameInfo, IpHostname, OnionHostname}; use crate::net::socks::SocksController; use crate::net::tor::{OnionAddress, TorController, TorSecretKey}; @@ -37,6 +38,7 @@ use crate::HOST_IP; pub struct NetController { pub(crate) db: TypedPatchDb, pub(super) tor: TorController, + pub(super) iroh: IrohController, pub(super) vhost: VHostController, pub(crate) net_iface: Arc, pub(super) dns: DnsController, @@ -54,10 +56,12 @@ impl NetController { ) -> Result { let net_iface = Arc::new(NetworkInterfaceController::new(db.clone())); let tor = TorController::new()?; + let iroh = IrohController::new()?; let socks = SocksController::new(socks_listen, tor.clone())?; Ok(Self { db: db.clone(), tor, + iroh, vhost: VHostController::new(db.clone(), net_iface.clone()), dns: DnsController::init(db, &net_iface.watcher).await?, forward: PortForwardController::new(net_iface.watcher.subscribe()), diff --git a/core/startos/src/net/tor.rs b/core/startos/src/net/tor.rs index db5e28b08..aee71d0c0 100644 --- a/core/startos/src/net/tor.rs +++ b/core/startos/src/net/tor.rs @@ -6,7 +6,7 @@ use std::sync::{Arc, Weak}; use std::time::{Duration, Instant}; use arti_client::config::onion_service::OnionServiceConfigBuilder; -use arti_client::{DataStream, TorClient, TorClientConfig}; +use arti_client::{TorClient, TorClientConfig}; use base64::Engine; use clap::Parser; use color_eyre::eyre::eyre; @@ -62,7 +62,7 @@ impl FromStr for OnionAddress { Cow::Owned(format!("{s}.onion")) } .parse::() - .with_kind(ErrorKind::Tor)?, + .with_kind(ErrorKind::ParseNetAddress)?, )) } } @@ -165,8 +165,8 @@ impl<'de> Deserialize<'de> for TorSecretKey { } #[derive(Default, Deserialize, Serialize)] -pub struct OnionStore(BTreeMap); -impl Map for OnionStore { +pub struct OnionKeyStore(BTreeMap); +impl Map for OnionKeyStore { type Key = OnionAddress; type Value = TorSecretKey; fn key_str(key: &Self::Key) -> Result, Error> { @@ -176,7 +176,7 @@ impl Map for OnionStore { Ok(InternedString::from_display(key)) } } -impl OnionStore { +impl OnionKeyStore { pub fn new() -> Self { Self::default() } @@ -184,7 +184,7 @@ impl OnionStore { self.0.insert(key.onion_address(), key); } } -impl Model { +impl Model { pub fn new_key(&mut self) -> Result { let key = TorSecretKey::generate(); self.insert(&key.onion_address(), &key)?; @@ -199,7 +199,7 @@ impl Model { .de() } } -impl std::fmt::Debug for OnionStore { +impl std::fmt::Debug for OnionKeyStore { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { struct OnionStoreMap<'a>(&'a BTreeMap); impl<'a> std::fmt::Debug for OnionStoreMap<'a> { @@ -227,7 +227,7 @@ pub fn tor_api() -> ParentHandler { from_fn_async(list_services) .with_display_serializable() .with_custom_display_fn(|handle, result| display_services(handle.params, result)) - .with_about("Display Tor V3 Onion Addresses") + .with_about("Show the status of running onion services") .with_call_remote::(), ) .subcommand( diff --git a/core/startos/src/system.rs b/core/startos/src/system.rs index e4befb77f..e4fe77118 100644 --- a/core/startos/src/system.rs +++ b/core/startos/src/system.rs @@ -9,7 +9,7 @@ use color_eyre::eyre::eyre; use futures::{FutureExt, TryStreamExt}; use imbl::vector; use imbl_value::InternedString; -use rpc_toolkit::{Context, Empty, HandlerExt, ParentHandler, from_fn_async}; +use rpc_toolkit::{from_fn_async, Context, Empty, HandlerExt, ParentHandler}; use rustls::RootCertStore; use rustls_pki_types::CertificateDer; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -24,12 +24,12 @@ use crate::logs::{LogSource, LogsParams, SYSTEM_UNIT}; use crate::prelude::*; use crate::rpc_continuations::{Guid, RpcContinuation, RpcContinuations}; use crate::shutdown::Shutdown; -use crate::util::Invoke; -use crate::util::cpupower::{Governor, get_available_governors, set_governor}; +use crate::util::cpupower::{get_available_governors, set_governor, Governor}; use crate::util::io::open_file; use crate::util::net::WebSocketExt; -use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; +use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; use crate::util::sync::Watch; +use crate::util::Invoke; use crate::{MAIN_DATA, PACKAGE_DATA}; pub fn experimental() -> ParentHandler { @@ -1024,7 +1024,7 @@ pub struct TestSmtpParams { #[arg(long)] pub login: String, #[arg(long)] - pub password: Option, + pub password: String, } pub async fn test_smtp( _: RpcContext, @@ -1037,74 +1037,23 @@ pub async fn test_smtp( password, }: TestSmtpParams, ) -> Result<(), Error> { - #[cfg(feature = "mail-send")] - { - use mail_send::SmtpClientBuilder; - use mail_send::mail_builder::{self, MessageBuilder}; - use rustls_pki_types::pem::PemObject; + use lettre::message::header::ContentType; + use lettre::transport::smtp::authentication::Credentials; + use lettre::{AsyncSmtpTransport, AsyncTransport, Message, Tokio1Executor}; - let Some(pass_val) = password else { - return Err(Error::new( - eyre!("mail-send requires a password"), - ErrorKind::InvalidRequest, - )); - }; - - let mut root_cert_store = RootCertStore::empty(); - let pem = tokio::fs::read("/etc/ssl/certs/ca-certificates.crt").await?; - for cert in CertificateDer::pem_slice_iter(&pem) { - root_cert_store.add_parsable_certificates([cert.with_kind(ErrorKind::OpenSsl)?]); - } - - let cfg = Arc::new( - rustls::ClientConfig::builder_with_provider(Arc::new( - rustls::crypto::ring::default_provider(), - )) - .with_safe_default_protocol_versions()? - .with_root_certificates(root_cert_store) - .with_no_client_auth(), - ); - let client = SmtpClientBuilder::new_with_tls_config(server, port, cfg) - .implicit_tls(false) - .credentials((login.split("@").next().unwrap().to_owned(), pass_val)); - - fn parse_address<'a>(addr: &'a str) -> mail_builder::headers::address::Address<'a> { - if addr.find("<").map_or(false, |start| { - addr.find(">").map_or(false, |end| start < end) - }) { - addr.split_once("<") - .map(|(name, addr)| (name.trim(), addr.strip_suffix(">").unwrap_or(addr))) - .unwrap() - .into() - } else { - addr.into() - } - } - - let message = MessageBuilder::new() - .from(parse_address(&from)) - .to(parse_address(&to)) - .subject("StartOS Test Email") - .text_body("This is a test email sent from your StartOS Server"); - client - .connect() - .await - .map_err(|e| { - Error::new( - eyre!("mail-send connection error: {:?}", e), - ErrorKind::Unknown, - ) - })? - .send(message) - .await - .map_err(|e| Error::new(eyre!("mail-send send error: {:?}", e), ErrorKind::Unknown))?; - Ok(()) - } - #[cfg(not(feature = "mail-send"))] - Err(Error::new( - eyre!("test-smtp requires mail-send feature to be enabled"), - ErrorKind::InvalidRequest, - )) + AsyncSmtpTransport::::relay(&server)? + .credentials(Credentials::new(login, password)) + .build() + .send( + Message::builder() + .from(from.parse()?) + .to(to.parse()?) + .subject("StartOS Test Email") + .header(ContentType::TEXT_PLAIN) + .body("This is a test email sent from your StartOS Server".to_owned())?, + ) + .await?; + Ok(()) } #[tokio::test]