diff --git a/Cargo.lock b/Cargo.lock index 68c6b69d..76dcfcb6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -140,7 +140,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if 1.0.4", "cipher 0.4.4", - "cpufeatures", + "cpufeatures 0.2.17", "zeroize", ] @@ -458,9 +458,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "arti-client" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16739ee6ad4ee11073a8d12c34a911ea72977c5ce4abbb21a1f7cf5955f22a01" +checksum = "7ffc89b08e6a475a83d70e52f0ede139a433eb46e986a6cee6eeaa1b73297bf1" dependencies = [ "async-trait", "cfg-if 1.0.4", @@ -476,7 +476,7 @@ dependencies = [ "libc", "once_cell", "postage", - "rand 0.9.2", + "rand 0.10.1", "safelog", "serde", "tempfile", @@ -1509,10 +1509,21 @@ checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" dependencies = [ "cfg-if 1.0.4", "cipher 0.3.0", - "cpufeatures", + "cpufeatures 0.2.17", "zeroize", ] +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chacha20poly1305" version = "0.9.1" @@ -1520,7 +1531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" dependencies = [ "aead", - "chacha20", + "chacha20 0.8.2", "cipher 0.3.0", "poly1305", "zeroize", @@ -1860,6 +1871,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc" version = "3.4.0" @@ -2044,7 +2064,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", @@ -3356,9 +3376,9 @@ dependencies = [ [[package]] name = "fs-mistrust" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f5ac9f88fd18733e0f9ce1f4a95c40eb1d4f83131bf1472e81d1f128fefb7c2" +checksum = "9cfebc7c6bb65d327ded064db65cd260b6c418c27ae790318650cfa2a81bf33f" dependencies = [ "derive_builder_fork_arti", "dirs 6.0.0", @@ -3366,6 +3386,7 @@ dependencies = [ "pwd-grp", "serde", "thiserror 2.0.18", + "void", "walkdir", ] @@ -3379,35 +3400,15 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "fslock" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "fslock-arti-fork" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b21bd626aaab7b904b20bef6d9e06298914a0c8d9fb8b010483766b2e532791" -dependencies = [ - "libc", - "winapi 0.3.9", -] - [[package]] name = "fslock-guard" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f62cb7d296f7d1fabdce7291281d9f0147b06a6e79afae05e1230eab667d85" +checksum = "e77b8a36ee17f9079b53db7281de9b16a8fb2bc97a7cd1e41a2998f3a837af7a" dependencies = [ - "fslock-arti-fork", + "libc", "thiserror 2.0.18", - "winapi 0.3.9", + "windows-sys 0.61.2", ] [[package]] @@ -3664,6 +3665,7 @@ dependencies = [ "js-sys", "libc", "r-efi", + "rand_core 0.10.1", "wasip2", "wasip3", "wasm-bindgen", @@ -3937,7 +3939,6 @@ dependencies = [ "grin_wallet_libwallet", "grin_wallet_util", "http-body-util", - "hyper 0.14.32", "hyper 1.8.1", "hyper-proxy2", "hyper-socks2", @@ -4349,7 +4350,7 @@ dependencies = [ "blake2-rfc", "bs58", "byteorder", - "chacha20", + "chacha20 0.8.2", "chrono", "curve25519-dalek 2.1.3", "ed25519-dalek 1.0.1", @@ -5513,7 +5514,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -5628,9 +5629,9 @@ dependencies = [ [[package]] name = "libgit2-sys" -version = "0.18.3+1.9.2" +version = "0.18.5+1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487" +checksum = "005d6ae6eac1912906073e069f7db60b1fa98e052a68227824afe3e3a1c59ca2" dependencies = [ "cc", "libc", @@ -5698,9 +5699,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.28" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", @@ -7438,7 +7439,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug 0.3.1", "universal-hash", ] @@ -7802,6 +7803,17 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20 0.10.0", + "getrandom 0.4.1", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.1.1" @@ -7842,6 +7854,16 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand_chacha" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6af7f3e25ded52c41df4e0b1af2d047e45896c2f3281792ed68a1c243daedb" +dependencies = [ + "ppv-lite86", + "rand_core 0.10.1", +] + [[package]] name = "rand_core" version = "0.3.1" @@ -7884,6 +7906,12 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "rand_hc" version = "0.1.0" @@ -7924,13 +7952,13 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16df48f071248e67b8fc5e866d9448d45c08ad8b672baaaf796e2f15e606ff0" +checksum = "3fdcd80e68f0a8f9ca5ec7cfd02fd5fbb8fbe6ef4e9b90ea2f48bb929b74f88e" dependencies = [ "libc", - "rand_core 0.9.5", - "winapi 0.3.9", + "rand_core 0.10.1", + "windows-sys 0.59.0", ] [[package]] @@ -8237,6 +8265,15 @@ dependencies = [ "winreg", ] +[[package]] +name = "reseeding_rng" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35d8fa137e1f0bbc1139893fcf4fff5f099d76658e6da2b10fadd04f0cadc2d4" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "resvg" version = "0.45.1" @@ -9029,7 +9066,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -9041,7 +9078,7 @@ checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.4", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.9.0", "opaque-debug 0.3.1", ] @@ -9053,7 +9090,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -10105,9 +10142,9 @@ checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" [[package]] name = "tor-async-utils" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee2d3e0d74d393dea1c73e5e3ca6a0f0c7920c21b4c72ae9820bc85ba86db2b" +checksum = "27fc83e7539ac5f717b722456df991ca8819782d04f7ae2ee28eefacca030eef" dependencies = [ "derive-deftly", "educe", @@ -10121,9 +10158,9 @@ dependencies = [ [[package]] name = "tor-basic-utils" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a20878eacdfbcd1fed2ee27092e66ccee2df871e0a6b92b6658efd59f739230" +checksum = "7bd01b9947f57a99193547f3a40a0bd179e9a332ead855c07e2fb702a1517f74" dependencies = [ "derive_more", "getrandom 0.4.1", @@ -10131,8 +10168,8 @@ dependencies = [ "itertools 0.14.0", "libc", "paste", - "rand 0.9.2", - "rand_chacha 0.9.0", + "rand 0.10.1", + "rand_chacha 0.10.0", "serde", "slab", "smallvec", @@ -10143,9 +10180,9 @@ dependencies = [ [[package]] name = "tor-bytes" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428748cf8cf3f2bd1a4cc30bab33512b1a7d3f8b1f2abd02e39cbcbbebc05aed" +checksum = "de6a7af55881d599cd48c841916520318d5711df17514001aafd5f796f61e337" dependencies = [ "bytes 1.11.1", "derive-deftly", @@ -10161,9 +10198,9 @@ dependencies = [ [[package]] name = "tor-cell" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9efd607ea595674678f73ebf77c245caf04e1d229eae8caf58d2989ff6c63959" +checksum = "dad292658d194b145aaec268ffb91566b7d96c98971eea4980c1bf951d7d082b" dependencies = [ "amplify", "bitflags 2.10.0", @@ -10174,7 +10211,7 @@ dependencies = [ "educe", "itertools 0.14.0", "paste", - "rand 0.9.2", + "rand 0.10.1", "smallvec", "thiserror 2.0.18", "tor-basic-utils", @@ -10192,9 +10229,9 @@ dependencies = [ [[package]] name = "tor-cert" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6baf9c4f05d2c90e46fcb404039c2fe9628c2b56ef0101bb7bcb5f8e8125c8b1" +checksum = "474e732207b1be44f9ae4ddf295fba3644cd3c09494d131846ff9c9a624ab263" dependencies = [ "caret", "derive_builder_fork_arti", @@ -10210,9 +10247,9 @@ dependencies = [ [[package]] name = "tor-chanmgr" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec7e9542c0100f974b0953f3c497755044d46a07fec5e23c1738fb5c5036c9" +checksum = "b2bb088804f54de320ee97dd2a48ae319f0df9d9d0e37eef050d65488194a768" dependencies = [ "async-trait", "base64ct", @@ -10226,7 +10263,7 @@ dependencies = [ "oneshot-fused-workaround", "percent-encoding", "postage", - "rand 0.9.2", + "rand 0.10.1", "safelog", "serde", "serde_with", @@ -10253,9 +10290,9 @@ dependencies = [ [[package]] name = "tor-checkable" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b54e6c8c206b5fc1d49bfb000a19d3feb1b69650eb99bd51d68964882827527" +checksum = "9505791bac25b31b8de88c0e2b02e1690e10ff1308583c6f61c320bab2677959" dependencies = [ "humantime", "signature 2.2.0", @@ -10266,9 +10303,9 @@ dependencies = [ [[package]] name = "tor-circmgr" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2402d71b92ff5221497713f7fdb124bd3861213382f7dee5cd93dd4c98ef5abf" +checksum = "7e986c7c4e1faae8a412b575ce66ff087050525a371db1034f0b24d70b459a2e" dependencies = [ "amplify", "async-trait", @@ -10285,7 +10322,7 @@ dependencies = [ "once_cell", "oneshot-fused-workaround", "pin-project", - "rand 0.9.2", + "rand 0.10.1", "retry-error", "safelog", "serde", @@ -10316,9 +10353,9 @@ dependencies = [ [[package]] name = "tor-config" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b63f57706747de9221c97785c6dca52231af9c798cbcc49ac5c8bf1a70a69ea" +checksum = "224f85aa02b514c384ea5ec32f1b924233bea6b553195fd83da7f1e50a2e0d1b" dependencies = [ "amplify", "cfg-if 1.0.4", @@ -10350,9 +10387,9 @@ dependencies = [ [[package]] name = "tor-config-path" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6010b61d49d2fa3f02957c237a8c70bf37f100e9408473965e67ce7d834e8d9" +checksum = "4232a56a8ce40a47ad6b42c9c7d9e6f4485e6e6a43b3149304c35bc295034107" dependencies = [ "directories", "serde", @@ -10364,9 +10401,9 @@ dependencies = [ [[package]] name = "tor-consdiff" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "499d69ee59f762ed7c4a68d87af2f1bc8a03735d43649217598b339e3031631f" +checksum = "d5fcd0c631a66b45dca4421b8a06309dd02ae5d6aea5daa55399f68638b2abf3" dependencies = [ "derive_more", "digest 0.10.7", @@ -10381,9 +10418,9 @@ dependencies = [ [[package]] name = "tor-dirclient" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d30d7a9a7b17ea5828dc171046f3a29b8e10b5c20a1ade257f744386f25aa4" +checksum = "bf637d6a5d8c886f23ca2df50edfaa56443f23294428f037206fb3a0d07ba57e" dependencies = [ "async-compression", "base64ct", @@ -10410,9 +10447,9 @@ dependencies = [ [[package]] name = "tor-dircommon" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4988c5af5d57fd6590ae7a50015366ebd54fbf2411247ff5a2346119493a078" +checksum = "35e412167d54c3618c3261dc77f1a31fe20c518f59aca5abfdec5f600b6a9b1f" dependencies = [ "base64ct", "derive-deftly", @@ -10431,9 +10468,9 @@ dependencies = [ [[package]] name = "tor-dirmgr" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adeefa259f7d03ceb29bfbb631b786361fcba6234676d2f8ff71ae1820748f04" +checksum = "9b984d2b0f0a2764a1b24d7c4c203ef83600b071c0c5af36e20d4f63e80ce562" dependencies = [ "async-trait", "base64ct", @@ -10443,7 +10480,7 @@ dependencies = [ "educe", "event-listener 5.4.1", "fs-mistrust", - "fslock", + "fslock-guard", "futures 0.3.31", "hex", "humantime", @@ -10453,7 +10490,7 @@ dependencies = [ "oneshot-fused-workaround", "paste", "postage", - "rand 0.9.2", + "rand 0.10.1", "rusqlite", "safelog", "scopeguard", @@ -10488,9 +10525,9 @@ dependencies = [ [[package]] name = "tor-error" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6728477fffe0d1ce98410635b1c690221e3d1d596e436aafa46d6a255d6466" +checksum = "1409b1a9085502c7797405a01fe3f3292a9827c9ed6a3f7c34fbb222572db5ac" dependencies = [ "derive_more", "futures 0.3.31", @@ -10506,9 +10543,9 @@ dependencies = [ [[package]] name = "tor-general-addr" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "163dd5f727f4e98975dbb9f4ddc3e6129f0008985686334d5c5ff86b4733d112" +checksum = "09f17e219140e587e169f71f53e528ca394c39e83593c9fbe9e9366cce7655e1" dependencies = [ "derive_more", "thiserror 2.0.18", @@ -10517,9 +10554,9 @@ dependencies = [ [[package]] name = "tor-guardmgr" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4cc40821c4b68f376a443ddd8530314efa1ebd38a1434b3ddb0c8555d2be972" +checksum = "d56c43d7afa526449c6e6460d373a02624a24c78637ddd7c68e2ac1879ae587c" dependencies = [ "amplify", "base64ct", @@ -10536,7 +10573,7 @@ dependencies = [ "oneshot-fused-workaround", "pin-project", "postage", - "rand 0.9.2", + "rand 0.10.1", "safelog", "serde", "strum 0.28.0", @@ -10562,9 +10599,9 @@ dependencies = [ [[package]] name = "tor-hsclient" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc8df5e4ff97bc4086993c0943687f35f4565b0f767029c75ed46780a584f1eb" +checksum = "1ff8ba0afebc5f76b42240f76b2bfb92aa5862c19ff184492c59c654750ee275" dependencies = [ "async-trait", "derive-deftly", @@ -10575,7 +10612,7 @@ dependencies = [ "itertools 0.14.0", "oneshot-fused-workaround", "postage", - "rand 0.9.2", + "rand 0.10.1", "retry-error", "safelog", "slotmap-careful", @@ -10607,9 +10644,9 @@ dependencies = [ [[package]] name = "tor-hscrypto" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35f1db46a8bd6307f104dcc0a11f56a5b05f5823cc9d11e1748402daa940d3c7" +checksum = "3761c1828e74818cba4eb661d1eb79d4f663b05e8e7d3bc6e35d754968282fc0" dependencies = [ "cipher 0.4.4", "data-encoding", @@ -10620,7 +10657,7 @@ dependencies = [ "humantime", "itertools 0.14.0", "paste", - "rand 0.9.2", + "rand 0.10.1", "safelog", "serde", "signature 2.2.0", @@ -10640,9 +10677,9 @@ dependencies = [ [[package]] name = "tor-hsrproxy" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e395b33b0566970aaa31c79301211b6086d05479a4d3a43c7ed6be40f40b1f0a" +checksum = "cc0d8041225c2721fb68e8406c2121e3168ea3998148df253859fec70ea20741" dependencies = [ "derive-deftly", "futures 0.3.31", @@ -10669,9 +10706,9 @@ dependencies = [ [[package]] name = "tor-hsservice" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aba207bceef6973f0607e92ee5606a001422c52a2c85ee95bf3964d8099c4ee" +checksum = "5fa87ed8d1ccfe8447b4e65bf0e2dfcab6a8ac9d2eadf7b3f37c102e1c18e9bb" dependencies = [ "amplify", "async-trait", @@ -10692,8 +10729,8 @@ dependencies = [ "once_cell", "oneshot-fused-workaround", "postage", - "rand 0.9.2", - "rand_core 0.9.5", + "rand 0.10.1", + "rand_core 0.10.1", "retry-error", "safelog", "serde", @@ -10728,15 +10765,15 @@ dependencies = [ [[package]] name = "tor-key-forge" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d9ae1ee46f439cfeb934bb1815ec460b94c1b6fce51b3b378d5253a1f99ce5b" +checksum = "86c877b95e0679f151743bc2b706320a29e14bd18d9bcb92918df34948e2e9d2" dependencies = [ "derive-deftly", "derive_more", "downcast-rs 2.0.2", "paste", - "rand 0.9.2", + "rand 0.10.1", "rsa", "signature 2.2.0", "ssh-key-fork-arti", @@ -10750,9 +10787,9 @@ dependencies = [ [[package]] name = "tor-keymgr" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0e968a3720ae845d1e4142d86b194cfa34c1e6f1c81eef29a5a285fc897f809" +checksum = "5f59fbec28e31d688822b4c00a6f7fd94539886baccd3ce1b35dc26699c37873" dependencies = [ "amplify", "arrayvec 0.7.6", @@ -10767,7 +10804,7 @@ dependencies = [ "humantime", "inventory", "itertools 0.14.0", - "rand 0.9.2", + "rand 0.10.1", "safelog", "serde", "signature 2.2.0", @@ -10791,9 +10828,9 @@ dependencies = [ [[package]] name = "tor-linkspec" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048c5fe9e697c76f6326d73255ae9cc107a6b4f161b8b552f25f10157e31f85e" +checksum = "0e1cc8d5469c324d1e0761066d868363d3fdccb723b14cdc983a5aef9b67981b" dependencies = [ "base64ct", "by_address", @@ -10818,9 +10855,9 @@ dependencies = [ [[package]] name = "tor-llcrypto" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a40374cd6525a416d5131afeb7b2d9ea9ce838f32bd6175032b5a43a507c16" +checksum = "d0015d521f5e30a2f74879fe4c615fc2c3ace822d7cc88c1dfed0ae816b25f15" dependencies = [ "aes", "base64ct", @@ -10836,12 +10873,13 @@ dependencies = [ "getrandom 0.3.4", "getrandom 0.4.1", "hex", - "rand 0.9.2", - "rand_chacha 0.9.0", + "rand 0.10.1", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "rand_core 0.6.4", - "rand_core 0.9.5", - "rand_jitter 0.5.0", + "rand_jitter 0.6.1", "rdrand 0.8.3", + "reseeding_rng", "rsa", "safelog", "serde", @@ -10860,9 +10898,9 @@ dependencies = [ [[package]] name = "tor-log-ratelim" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ef1a9811152abad23de9783d21f72a1a89cd0655a8fae6f61e9b975679fce6" +checksum = "7d16152b21f2e7b309dfbdcbe587c5adba9547d3119f2933b453d6edbce7e8e0" dependencies = [ "futures 0.3.31", "humantime", @@ -10876,9 +10914,9 @@ dependencies = [ [[package]] name = "tor-memquota" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f170000c5fe0bef7f476b0b683a478e34b70f0ed6c2ad69d4b672aa93c101aa5" +checksum = "38ad2950d88e968572b0de6bb5702f5ed42f36555f362fb741c572c62441476e" dependencies = [ "cfg-if 1.0.4", "derive-deftly", @@ -10907,9 +10945,9 @@ dependencies = [ [[package]] name = "tor-memquota-cost" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17475dcc5d5ddf008043c138a38ec70a8448c9509e099fa86be09ab92ee3601e" +checksum = "993ad5bfd39fb629990da40c2b2086284b1481b7d4843652a959db1d9e5ac463" dependencies = [ "derive-deftly", "itertools 0.14.0", @@ -10919,9 +10957,9 @@ dependencies = [ [[package]] name = "tor-netdir" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1351ffe2fff8bad7d5f2b79ec88ea188e159fe94cf705b1e485d8566526a7b5" +checksum = "6700c5e590818d9873a13e06b49b95cf3a39fa8fb3968bd67ec3295cd584b97c" dependencies = [ "async-trait", "bitflags 2.10.0", @@ -10932,7 +10970,7 @@ dependencies = [ "humantime", "itertools 0.14.0", "num_enum", - "rand 0.9.2", + "rand 0.10.1", "serde", "strum 0.28.0", "thiserror 2.0.18", @@ -10952,9 +10990,9 @@ dependencies = [ [[package]] name = "tor-netdoc" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505b69e589e042276da708f7baa44d9f16ec50074a3f54ebb3bcbbcd6c4d9aa" +checksum = "a497ce4c36f59e4c67c352e3b80cd4642f6c5e660bb003de1922be4c7ed03081" dependencies = [ "amplify", "base64ct", @@ -10972,7 +11010,7 @@ dependencies = [ "memchr", "paste", "phf 0.13.1", - "rand 0.9.2", + "rand 0.10.1", "saturating-time", "serde", "serde_with", @@ -11001,16 +11039,15 @@ dependencies = [ [[package]] name = "tor-persist" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d574ac9a23c15d55d77a7c472294e762a4373bf0030e19d192eb523f1393ea60" +checksum = "b6da1a96a1f6418faac1cd1892e029fd265cf50e67e941a4ba2580d92dd32d47" dependencies = [ "amplify", "derive-deftly", "derive_more", "filetime", "fs-mistrust", - "fslock", "fslock-guard", "futures 0.3.31", "itertools 0.14.0", @@ -11031,9 +11068,9 @@ dependencies = [ [[package]] name = "tor-proto" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c97a19e322dab933540e50ab0b987e7f9946394b4e2884976ba4d371562e531" +checksum = "a0a5fa0e1a365fc089a7f140f4142379dd74c91c15103c2f9d11ea711e16029e" dependencies = [ "amplify", "async-trait", @@ -11059,8 +11096,8 @@ dependencies = [ "oneshot-fused-workaround", "pin-project", "postage", - "rand 0.9.2", - "rand_core 0.9.5", + "rand 0.10.1", + "rand_core 0.10.1", "safelog", "slotmap-careful", "smallvec", @@ -11098,9 +11135,9 @@ dependencies = [ [[package]] name = "tor-protover" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2afba54106ccf364d8d422d7e33510e21e8004129574609ba26d2d8a2da1b81" +checksum = "c4f7f4ee15c9bfa0b700ae06e85fa52abddf17a35531cd3d3833412900e8da5c" dependencies = [ "caret", "paste", @@ -11112,9 +11149,9 @@ dependencies = [ [[package]] name = "tor-ptmgr" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada4837036378c04c3ddf778897d2afa2c8e5a844b8862719d12d6a63bc1b4ec" +checksum = "b4cc37ac22faff9e0233fa287b92819d8819f31cae85a50ff99c51dd549b31c0" dependencies = [ "async-trait", "cfg-if 1.0.4", @@ -11142,11 +11179,11 @@ dependencies = [ [[package]] name = "tor-relay-selection" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede9f32476abff4c61843bf3eba06ce03751fc62f472e0d9622185a5bfd1b009" +checksum = "5b565b6dec2e3edb7b033203a3662edb7b586e486d53e02af4295e05e7562870" dependencies = [ - "rand 0.9.2", + "rand 0.10.1", "serde", "tor-basic-utils", "tor-linkspec", @@ -11156,16 +11193,18 @@ dependencies = [ [[package]] name = "tor-rtcompat" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4cbf776b2c52614b0ebaec7c2b93782bb5b61233f474ae46331976e38d8bbdc" +checksum = "fcd7a4ff4898044b3ec693c0bf098251accf13c58741c44ed9364ce5faa89287" dependencies = [ + "amplify", "async-native-tls", "async-trait", "async_executors", "asynchronous-codec", "cfg-if 1.0.4", "coarsetime", + "derive_builder_fork_arti", "derive_more", "dyn-clone", "educe", @@ -11189,9 +11228,9 @@ dependencies = [ [[package]] name = "tor-rtmock" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a733ab3432e24f36b6f6680cc92413c61bb9a2041e09a17ac465cc3f2a788e5" +checksum = "8331e7d57bf7cf157cf3610ff6dbb5a591de5c3b22fa65ea6be18b08ff81477a" dependencies = [ "amplify", "assert_matches", @@ -11219,9 +11258,9 @@ dependencies = [ [[package]] name = "tor-socksproto" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b29d42752715cdf679ff7537f26457e2aabeabb682deec98beb79f01c8ee7bd" +checksum = "55f432eda94343bdadd73995f0b3082d96637dadb0e20c3f9a1bf2349f623d3c" dependencies = [ "amplify", "caret", @@ -11236,9 +11275,9 @@ dependencies = [ [[package]] name = "tor-units" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527324d70bf67aadaa23fb6ebc585aae5ab7df1b8d16f9d361861d2c4c50dcee" +checksum = "8cf033ee8b22b11abd8272272e19ccbbf58c7b3152f8d224aa8d21f358c43d0d" dependencies = [ "derive-deftly", "derive_more", diff --git a/Cargo.toml b/Cargo.toml index eadfba9c..e1918fee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,20 +92,19 @@ uuid = { version = "0.8.2", features = ["v4"] } num-bigint = "0.4.6" ## tor -arti-client = { version = "0.42.0", features = ["static", "pt-client", "onion-service-service", "onion-service-client"] } -tor-rtcompat = { version = "0.42.0", features = ["static"] } -tor-config = "0.42.0" -fs-mistrust = "0.14.1" -tor-hsservice = "0.42.0" -tor-hsrproxy = "0.42.0" -tor-keymgr = "0.42.0" -tor-llcrypto = "0.42.0" -tor-hscrypto = "0.42.0" -tor-error = "0.42.0" +arti-client = { version = "0.43.0", features = ["static", "pt-client", "onion-service-service", "onion-service-client"] } +tor-rtcompat = { version = "0.43.0", features = ["static"] } +tor-config = "0.43.0" +fs-mistrust = "0.14.2" +tor-hsservice = "0.43.0" +tor-hsrproxy = "0.43.0" +tor-keymgr = "0.43.0" +tor-llcrypto = "0.43.0" +tor-hscrypto = "0.43.0" +tor-error = "0.43.0" sha2 = "0.10.8" ed25519-dalek = "2.1.1" curve25519-dalek = "4.1.3" -hyper-tor = { version = "0.14.32", features = ["full"], package = "hyper" } tls-api = "0.12.0" tls-api-native-tls = "0.12.1" safelog = "0.8.1" diff --git a/src/gui/views/wallets/wallet/transport/content.rs b/src/gui/views/wallets/wallet/transport/content.rs index 668ad4bc..74c2831b 100644 --- a/src/gui/views/wallets/wallet/transport/content.rs +++ b/src/gui/views/wallets/wallet/transport/content.rs @@ -26,6 +26,7 @@ use crate::gui::views::wallets::wallet::types::WalletContentContainer; use crate::gui::views::{Modal, QrCodeContent, View}; use crate::tor::{Tor, TorConfig}; use crate::wallet::Wallet; +use crate::wallet::types::WalletTask; /// Wallet transport panel content. pub struct WalletTransportContent { @@ -148,14 +149,12 @@ impl WalletTransportContent { let service_id = &wallet.identifier(); // Draw button to enable/disable Tor listener for current wallet. - if wallet.foreign_api_port().is_some() && wallet.secret_key().is_some() { - let port = wallet.foreign_api_port().unwrap(); - let key = wallet.secret_key().unwrap(); + if wallet.foreign_api_port().is_some() { if !Tor::is_service_starting(service_id) { if !Tor::is_service_running(service_id) { let r = CornerRadius::default(); View::item_button(ui, r, POWER, Some(Colors::green()), || { - Tor::start_service(port, key.clone(), service_id); + wallet.task(WalletTask::StartTor); }); } else { let r = CornerRadius::default(); diff --git a/src/tor/http.rs b/src/tor/http.rs deleted file mode 100644 index cfc235da..00000000 --- a/src/tor/http.rs +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2024 The Grim Developers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use std::future::Future; -use std::io::Error; -use std::pin::Pin; -use std::sync::Arc; -use std::task::{Context, Poll}; - -use arti_client::{DataStream, IntoTorAddr, TorClient}; -use hyper_tor::client::connect::{Connected, Connection}; -use hyper_tor::http::Uri; -use hyper_tor::http::uri::Scheme; -use hyper_tor::service::Service; -use pin_project::pin_project; -use thiserror::Error; -use tls_api::TlsConnector as TlsConn; // This is different from tor_rtcompat::TlsConnector -use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; -use tor_config::deps::educe::Educe; -use tor_rtcompat::Runtime; - -/// Error making or using http connection -/// -/// This error ends up being passed to hyper and bundled up into a [`hyper::Error`] -#[derive(Error, Clone, Debug)] -#[non_exhaustive] -pub enum ConnectionError { - /// Unsupported URI scheme - #[error("unsupported URI scheme in {uri:?}")] - UnsupportedUriScheme { - /// URI - uri: Uri, - }, - - /// Missing hostname - #[error("Missing hostname in {uri:?}")] - MissingHostname { - /// URI - uri: Uri, - }, - - /// Tor connection failed - #[error("Tor connection failed")] - Arti(#[from] arti_client::Error), - - /// TLS connection failed - #[error("TLS connection failed")] - TLS(#[source] Arc), -} - -/// We implement this for form's sake -impl tor_error::HasKind for ConnectionError { - #[rustfmt::skip] - fn kind(&self) -> tor_error::ErrorKind { - use ConnectionError as CE; - use tor_error::ErrorKind as EK; - match self { - CE::UnsupportedUriScheme{..} => EK::NotImplemented, - CE::MissingHostname{..} => EK::BadApiUsage, - CE::Arti(e) => e.kind(), - CE::TLS(_) => EK::RemoteProtocolViolation, - } - } -} - -/// **Main entrypoint**: `hyper` connector to make HTTP\[S] connections via Tor, using Arti. -/// -/// An `ArtiHttpConnector` combines an Arti Tor client, and a TLS implementation, -/// in a form that can be provided to hyper -/// (e.g. to [`hyper::client::Builder`]'s `build` method) -/// so that hyper can speak HTTP and HTTPS to origin servers via Tor. -/// -/// TC is the TLS to used *across* Tor to connect to the origin server. -/// For example, it could be a [`tls_api_native_tls::TlsConnector`]. -/// This is a different Rust type to the TLS used *by* Tor to connect to relays etc. -/// It might even be a different underlying TLS implementation -/// (although that is usually not a particularly good idea). -#[derive(Educe)] -#[educe(Clone)] // #[derive(Debug)] infers an unwanted bound TC: Clone -pub struct ArtiHttpConnector { - /// The client - client: TorClient, - - /// TLS for using across Tor. - tls_conn: Arc, -} - -// #[derive(Clone)] infers a TC: Clone bound - -impl ArtiHttpConnector { - /// Make a new `ArtiHttpConnector` using an Arti `TorClient` object. - pub fn new(client: TorClient, tls_conn: TC) -> Self { - let tls_conn = tls_conn.into(); - Self { client, tls_conn } - } -} - -/// Wrapper type that makes an Arti `DataStream` implement necessary traits to be used as -/// a `hyper` connection object (mainly `Connection`). -/// -/// This might represent a bare HTTP connection across Tor, -/// or it might represent an HTTPS connection through Tor to an origin server, -/// `TC::TlsStream` as the TLS layer. -/// -/// An `ArtiHttpConnection` is constructed by hyper's use of the [`ArtiHttpConnector`] -/// implementation of [`hyper::service::Service`], -/// and then used by hyper as the transport for hyper's HTTP implementation. -#[pin_project] -pub struct ArtiHttpConnection { - /// The stream - #[pin] - inner: MaybeHttpsStream, -} - -/// The actual stream; might be TLS, might not -#[pin_project(project = MaybeHttpsStreamProj)] -enum MaybeHttpsStream { - /// http - Http(Pin>), // Tc:TlsStream is generally boxed; box this one too - - /// https - Https(#[pin] TC::TlsStream), -} - -impl Connection for ArtiHttpConnection { - fn connected(&self) -> Connected { - Connected::new() - } -} - -// These trait implementations just defer to the inner `DataStream`; the wrapper type is just -// there to implement the `Connection` trait. -impl AsyncRead for ArtiHttpConnection { - fn poll_read( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - match self.project().inner.project() { - MaybeHttpsStreamProj::Http(ds) => ds.as_mut().poll_read(cx, buf), - MaybeHttpsStreamProj::Https(t) => t.poll_read(cx, buf), - } - } -} - -impl AsyncWrite for ArtiHttpConnection { - fn poll_write( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll> { - match self.project().inner.project() { - MaybeHttpsStreamProj::Http(ds) => ds.as_mut().poll_write(cx, buf), - MaybeHttpsStreamProj::Https(t) => t.poll_write(cx, buf), - } - } - - fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match self.project().inner.project() { - MaybeHttpsStreamProj::Http(ds) => ds.as_mut().poll_flush(cx), - MaybeHttpsStreamProj::Https(t) => t.poll_flush(cx), - } - } - - fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match self.project().inner.project() { - MaybeHttpsStreamProj::Http(ds) => ds.as_mut().poll_shutdown(cx), - MaybeHttpsStreamProj::Https(t) => t.poll_shutdown(cx), - } - } -} - -#[derive(Debug, Clone, Copy, Eq, PartialEq)] -/// Are we doing TLS? -enum UseTls { - /// No - Bare, - - /// Yes - Tls, -} - -/// Convert uri to http\[s\] host and port, and whether to do tls -fn uri_to_host_port_tls(uri: Uri) -> Result<(String, u16, UseTls), ConnectionError> { - let use_tls = { - // Scheme doesn't derive PartialEq so can't be matched on - let scheme = uri.scheme(); - if scheme == Some(&Scheme::HTTP) { - UseTls::Bare - } else if scheme == Some(&Scheme::HTTPS) { - UseTls::Tls - } else { - return Err(ConnectionError::UnsupportedUriScheme { uri }); - } - }; - let host = match uri.host() { - Some(h) => h, - _ => return Err(ConnectionError::MissingHostname { uri }), - }; - let port = uri.port().map(|x| x.as_u16()).unwrap_or(match use_tls { - UseTls::Tls => 443, - UseTls::Bare => 80, - }); - - Ok((host.to_owned(), port, use_tls)) -} - -impl Service for ArtiHttpConnector { - type Response = ArtiHttpConnection; - type Error = ConnectionError; - #[allow(clippy::type_complexity)] - type Future = Pin> + Send>>; - - fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: Uri) -> Self::Future { - // `TorClient` objects can be cloned cheaply (the cloned objects refer to the same - // underlying handles required to make Tor connections internally). - // We use this to avoid the returned future having to borrow `self`. - let client = self.client.clone(); - let tls_conn = self.tls_conn.clone(); - Box::pin(async move { - // Extract the host and port to connect to from the URI. - let (host, port, use_tls) = uri_to_host_port_tls(req)?; - // Initiate a new Tor connection, producing a `DataStream` if successful. - let addr = (&host as &str, port) - .into_tor_addr() - .map_err(arti_client::Error::from)?; - let ds = client.connect(addr).await?; - - let inner = match use_tls { - UseTls::Tls => { - let conn = tls_conn - .connect_impl_tls_stream(&host, ds) - .await - .map_err(|e| ConnectionError::TLS(e.into()))?; - MaybeHttpsStream::Https(conn) - } - UseTls::Bare => MaybeHttpsStream::Http(Box::new(ds).into()), - }; - - Ok(ArtiHttpConnection { inner }) - }) - } -} diff --git a/src/tor/mod.rs b/src/tor/mod.rs index 67a3bd81..d789c7a2 100644 --- a/src/tor/mod.rs +++ b/src/tor/mod.rs @@ -20,5 +20,3 @@ pub use tor::Tor; mod types; pub use types::*; - -mod http; diff --git a/src/tor/tor.rs b/src/tor/tor.rs index b13b9957..f9b86887 100644 --- a/src/tor/tor.rs +++ b/src/tor/tor.rs @@ -20,7 +20,8 @@ use curve25519_dalek::digest::Digest; use ed25519_dalek::hazmat::ExpandedSecretKey; use fs_mistrust::Mistrust; use grin_util::secp::SecretKey; -use http_body_util::{BodyExt, Full}; +use http_body_util::{BodyExt, Empty, Full}; +use hyper_util::rt::TokioIo; use lazy_static::lazy_static; use log::error; use parking_lot::RwLock; @@ -46,12 +47,12 @@ use tor_hsservice::{ }; use tor_keymgr::{ArtiNativeKeystore, KeyMgrBuilder, KeystoreSelector}; use tor_llcrypto::pk::ed25519::ExpandedKeypair; -use tor_rtcompat::SpawnExt; use tor_rtcompat::tokio::TokioNativeTlsRuntime; +use tor_rtcompat::{SleepProviderExt, SpawnExt, ToplevelBlockOn}; use crate::http::HttpClient; -use crate::tor::http::ArtiHttpConnector; use crate::tor::{TorBridge, TorConfig, TorProxy}; +use crate::wallet::Wallet; lazy_static! { /// Static thread-aware state of Tor to be updated from separate thread. @@ -62,26 +63,16 @@ lazy_static! { pub struct Tor { runtime: TokioNativeTlsRuntime, /// Tor client and config. - client_config: Arc, TorClientConfig)>>>, + client_config: Arc>, TorClientConfig)>>>, /// Flag to check if client is launching. client_launching: Arc, /// Mapping of running Onion services identifiers to proxy. run: Arc< - RwLock< - BTreeMap< - String, - ( - u16, - SecretKey, - Arc, - Arc, - ), - >, - >, + RwLock, Arc)>>, >, - /// Mapping of starting Onion services identifiers. - start: Arc>>, + /// Mapping of starting Onion services identifiers to port. + start: Arc>>, /// Failed Onion services identifiers. fail: Arc>>, /// Checking Onion services identifiers. @@ -141,7 +132,9 @@ impl Tor { } /// Build bootstrapped client from provided config. - fn build_client_bootstrap(config: TorClientConfig) -> Option> { + fn build_client_bootstrap( + config: TorClientConfig, + ) -> Option>> { let client_res = TorClient::with_runtime(TOR_STATE.runtime.clone()) .config(config.clone()) .create_unbootstrapped(); @@ -315,35 +308,84 @@ impl Tor { error!("Tor: client not launched"); return None; } - // Create http tor-powered client to post data. - let client = Self::client_config().unwrap().0.isolated_client(); - let tls_conn = TlsConnector::builder().unwrap().build().unwrap(); - let conn = ArtiHttpConnector::new(client, tls_conn); - let http = hyper_tor::Client::builder().build::<_, hyper_tor::Body>(conn); - // Create request. - let req = hyper_tor::Request::builder() - .method(hyper_tor::Method::POST) - .uri(url) - .body(hyper_tor::Body::from(body)) - .unwrap(); - // Send request. - let mut resp = None; - match http.request(req).await { - Ok(r) => match hyper_tor::body::to_bytes(r).await { - Ok(raw) => resp = Some(String::from_utf8_lossy(&raw).to_string()), - Err(e) => { - error!("Tor: POST response parse error: {}", e); - } - }, - Err(e) => { - error!("Tor: POST failed: {}", e); - } + let uri = if let Ok(url) = url.parse::() { + Some(url) + } else { + None + }; + if uri.is_none() { + error!("Tor: bad URL {}", url); + return None; } - resp + let uri = uri.unwrap(); + thread::spawn(move || { + let client = Self::client_config().unwrap().0.isolated_client(); + let c = client.clone(); + client + .runtime() + .block_on(async move { + let res = c + .runtime() + .timeout(Duration::from_millis(600000), async { + if let Ok(stream) = c + .connect((uri.host().unwrap(), uri.port_u16().unwrap_or(80))) + .await + { + if let Ok((mut request_sender, connection)) = + hyper::client::conn::http1::handshake(TokioIo::new(stream)) + .await + { + // Spawn a task to poll the connection and drive the HTTP state. + tokio::spawn(async move { + if let Err(e) = connection.await { + error!("Tor connection error: {}", e); + } + }); + + let req = hyper::Request::builder() + .uri(uri) + .method("POST") + .body::>(Full::from(body)) + .ok(); + if req.is_none() { + return None; + } + let req = req.unwrap(); + let resp = request_sender.send_request(req).await.ok(); + if resp.is_none() { + return None; + } + let resp = resp.unwrap(); + let body_resp = resp.into_body().collect().await.ok(); + if body_resp.is_none() { + return None; + } + let body_resp = body_resp.unwrap(); + let body = body_resp.to_bytes().into(); + if let Ok(body_text) = String::from_utf8(body) { + return Some(body_text); + } + } + } + None + }) + .await; + match res { + Err(e) => { + error!("Tor request error: {}", e); + None + } + Ok(body) => Some(body), + } + }) + .unwrap() + }) + .join() + .unwrap() } } - fn client_config() -> Option<(TorClient, TorClientConfig)> { + fn client_config() -> Option<(Arc>, TorClientConfig)> { let r_client_config = TOR_STATE.client_config.read(); r_client_config.clone() } @@ -393,7 +435,7 @@ impl Tor { .map(|s| s.to_string()) .collect::>() }; - let mut services: BTreeMap = TOR_STATE.start.read().clone(); + let mut services: BTreeMap = TOR_STATE.start.read().clone(); for id in service_ids.clone() { if let Some(res) = Self::stop_service(&id) { services.insert(id, res); @@ -424,14 +466,14 @@ impl Tor { } // Start services. for id in services.keys() { - let (port, key) = services.get(id).unwrap(); - Self::start_service(port.clone(), key.clone(), &id); + let port = services.get(id).unwrap(); + Self::start_service(port.clone(), None, &id); } } - /// Stop running Onion service returning port and key. - pub fn stop_service(id: &String) -> Option<(u16, SecretKey)> { - let mut port_key = None; + /// Stop running Onion service returning port. + pub fn stop_service(id: &String) -> Option { + let mut port = None; { // Remove service from checking. let mut w_services = TOR_STATE.check.write(); @@ -440,18 +482,18 @@ impl Tor { // Remove service from starting. { let mut w_services = TOR_STATE.start.write(); - if let Some((port, key)) = w_services.remove(id) { - port_key = Some((port, key)); + if let Some(p) = w_services.remove(id) { + port = Some(p); } } // Remove service from running. { let mut w_services = TOR_STATE.run.write(); - if let Some((port, key, svc, proxy)) = w_services.remove(id) { + if let Some((p, svc, proxy)) = w_services.remove(id) { proxy.shutdown(); drop(proxy); drop(svc); - port_key = Some((port, key)); + port = Some(p); } } // Remove client when no running services left. @@ -461,26 +503,31 @@ impl Tor { // Clear state. fs::remove_dir_all(TorConfig::state_path()).unwrap_or_default(); } - port_key + port } /// Start Onion service from listening local port and [`SecretKey`]. - pub fn start_service(port: u16, key: SecretKey, id: &String) { + pub fn start_service(port: u16, wallet: Option<&Wallet>, id: &String) { // Check if service is already running. if Self::is_service_running(id) { return; } + { + // Save starting service. + let mut w_services = TOR_STATE.start.write(); + w_services.insert(id.clone(), port); + // Remove service from failed. + let mut w_services = TOR_STATE.fail.write(); + w_services.remove(id); + } + // Retrieve key from wallet if needed. + let key = if let Some(w) = wallet { + w.retrieve_secret_key().ok() + } else { + None + }; let service_id = id.clone(); thread::spawn(move || { - { - // Save starting service. - let mut w_services = TOR_STATE.start.write(); - w_services.insert(service_id.clone(), (port, key.clone())); - // Remove service from failed. - let mut w_services = TOR_STATE.fail.write(); - w_services.remove(&service_id); - } - let on_error = |service_id: String| { // Remove service from starting. let mut w_services = TOR_STATE.start.write(); @@ -515,16 +562,19 @@ impl Tor { return; } let (client, config) = client_config.unwrap(); + let hs = HsNickname::new(service_id.clone()).unwrap(); + + // Add service key to keystore if provided. + if let Some(key) = key { + if let Err(_) = Self::add_service_key(config.fs_mistrust(), &key, &hs) { + on_error(service_id); + return; + } + } + // Launch Onion service. client .runtime() .spawn(async move { - // Add service key to keystore. - let hs = HsNickname::new(service_id.clone()).unwrap(); - if let Err(_) = Self::add_service_key(config.fs_mistrust(), &key, &hs) { - on_error(service_id); - return; - } - // Launch Onion service. let service_config = OnionServiceConfigBuilder::default() .nickname(hs.clone()) .build() @@ -545,13 +595,18 @@ impl Tor { { let mut w_services = TOR_STATE.run.write(); let id = service_id.clone(); - w_services.insert(id, (port, key.clone(), service, proxy)); + w_services.insert(id, (port, service, proxy)); } // Remove service from starting. { let mut w_services = TOR_STATE.start.write(); w_services.remove(&service_id); } + // Remove service from failed. + { + let mut w_services = TOR_STATE.fail.write(); + w_services.remove(&service_id); + } // Check service availability. let addr = onion_addr.unwrap().display_unredacted().to_string(); let url = format!("http://{}/", addr); @@ -600,17 +655,51 @@ impl Tor { } let duration = { // Send request. - let tls_conn = TlsConnector::builder().unwrap().build().unwrap(); let client_config = Self::client_config(); if client_config.is_none() { return; } + let uri = if let Ok(url) = url.parse::() { + Some(url) + } else { + None + }; + if uri.is_none() { + return; + } + let uri = uri.unwrap(); let client = client_config.unwrap().0.isolated_client(); - let conn = ArtiHttpConnector::new(client, tls_conn); - let http = - hyper_tor::Client::builder().build::<_, hyper_tor::Body>(conn); - let uri = hyper_tor::Uri::from_str(url.clone().as_str()).unwrap(); - let check = http.get(uri.clone()); + + // Setup check request. + let check = || async { + if let Ok(stream) = client + .connect((uri.host().unwrap(), uri.port_u16().unwrap_or(80))) + .await + { + if let Ok((mut request_sender, connection)) = + hyper::client::conn::http1::handshake(TokioIo::new(stream)) + .await + { + // Spawn a task to poll the connection and drive the HTTP state. + tokio::spawn(async move { + if let Err(e) = connection.await { + error!("Tor connection error: {}", e); + } + }); + + let req = hyper::Request::builder() + .uri(uri) + .body(Empty::::new()) + .ok(); + if let Some(req) = req { + let res = request_sender.send_request(req).await; + return Some(res); + } + } + } + None + }; + // Setup error callback. let mut on_error = |service_id: &String| -> bool { if !Self::check_running(service_id) { @@ -631,10 +720,11 @@ impl Tor { max_errors }; // Check with timeout of 30s. - match tokio::time::timeout(Duration::from_millis(30000), check).await { + match tokio::time::timeout(Duration::from_millis(30000), check()).await + { Ok(resp) => { match resp { - Ok(_) => { + Some(_) => { if !Self::check_running(&service_id) { break; } @@ -642,13 +732,13 @@ impl Tor { // Check again after 60s. Duration::from_millis(60000) } - Err(e) => { + None => { if on_error(&service_id) { break; } error!( - "Tor check failed: {} for {}, errors: {}/{}", - e, service_id, errors_count, MAX_ERRORS + "Tor check failed for {}, errors: {}/{}", + service_id, errors_count, MAX_ERRORS ); // Check again after 5s. Duration::from_millis(5000) @@ -677,7 +767,7 @@ impl Tor { /// Launch Onion service proxy. async fn run_service_proxy( - client: TorClient, + client: Arc>, addr: SocketAddr, request: S, nickname: HsNickname, diff --git a/src/wallet/types.rs b/src/wallet/types.rs index 4c3ecd37..41ffc8e3 100644 --- a/src/wallet/types.rs +++ b/src/wallet/types.rs @@ -433,4 +433,6 @@ pub enum WalletTask { /// Delete transaction. /// * tx id Delete(u32), + /// Start Tor service. + StartTor, } diff --git a/src/wallet/wallet.rs b/src/wallet/wallet.rs index 5ee4dd30..48d04c88 100644 --- a/src/wallet/wallet.rs +++ b/src/wallet/wallet.rs @@ -113,8 +113,6 @@ pub struct Wallet { /// Running wallet foreign API server and port. foreign_api_server: Arc>>, - /// Wallet secret key for transport service. - secret_key: Arc>>, /// Flag to check if wallet repairing and restoring missing outputs is needed. repair_needed: Arc, @@ -169,7 +167,6 @@ impl Wallet { closing: Arc::new(AtomicBool::new(false)), deleted: Arc::new(AtomicBool::new(false)), foreign_api_server: Arc::new(RwLock::new(None)), - secret_key: Arc::new(RwLock::new(None)), repair_needed: Arc::new(AtomicBool::new(false)), repair_progress: Arc::new(AtomicU8::new(0)), files_moving: Arc::new(AtomicBool::new(false)), @@ -391,8 +388,8 @@ impl Wallet { } } - // Update Slatepack address and secret key. - self.update_secret_key_addr()?; + // Update Slatepack address. + self.update_slatepack_addr()?; Ok(()) } @@ -403,14 +400,17 @@ impl Wallet { r_key.clone() } - /// Get wallet [`SecretKey`] for transport. - pub fn secret_key(&self) -> Option { - let r_key = self.secret_key.read(); - r_key.clone() + /// Retrieve wallet Slatepack address for transport. + fn update_slatepack_addr(&self) -> Result<(), Error> { + let sec_key = self.retrieve_secret_key()?; + let addr = SlatepackAddress::try_from(&sec_key)?; + let mut w_address = self.slatepack_address.write(); + *w_address = Some(addr.to_string()); + Ok(()) } - /// Retrieve wallet [`SecretKey`] and Slatepack address for transport. - fn update_secret_key_addr(&self) -> Result<(), Error> { + /// Retrieve wallet [`SecretKey`] for transport. + pub fn retrieve_secret_key(&self) -> Result { let r_inst = self.instance.as_ref().read(); let instance = r_inst.clone().unwrap(); let mut w_lock = instance.lock(); @@ -420,12 +420,7 @@ impl Wallet { let parent_key_id = w_inst.parent_key_id(); let sec_key = address::address_from_derivation_path(&k, &parent_key_id, 0) .map_err(|e| Error::TorConfig(format!("{:?}", e)))?; - let addr = SlatepackAddress::try_from(&sec_key)?; - let mut w_key = self.secret_key.write(); - *w_key = Some(sec_key); - let mut w_address = self.slatepack_address.write(); - *w_address = Some(addr.to_string()); - Ok(()) + Ok(sec_key) } /// Get unique opened wallet identifier, including current account. @@ -790,12 +785,6 @@ impl Wallet { let cur_service_id = self.identifier(); Tor::stop_service(&cur_service_id); - // Clear secret key for previous account. - { - let mut w_key = self.secret_key.write(); - *w_key = None; - } - // Set new active account. let r_inst = self.instance.as_ref().read(); let instance = r_inst.clone().unwrap(); @@ -812,8 +801,8 @@ impl Wallet { }, )?; - // Update Slatepack address and secret key. - self.update_secret_key_addr()?; + // Update Slatepack address. + self.update_slatepack_addr()?; // Save account label into config. let mut w_config = self.config.write(); @@ -1708,18 +1697,14 @@ fn start_sync(wallet: Wallet) -> Thread { } Err(_) => {} } - } - - // Start unfailed Tor service if API server is running. - let service_id = wallet.identifier(); - if wallet.auto_start_tor_listener() - && api_server_running - && !Tor::is_service_failed(&service_id) - { - let r_foreign_api = wallet.foreign_api_server.read(); - let api = r_foreign_api.as_ref().unwrap(); - if let Some(key) = wallet.secret_key() { - Tor::start_service(api.1, key, &wallet.identifier()); + // Start unfailed Tor service if API server is running. + let service_id = wallet.identifier(); + if wallet.auto_start_tor_listener() + && api_server_running && !Tor::is_service_failed(&service_id) + { + let r_foreign_api = wallet.foreign_api_server.read(); + let api = r_foreign_api.as_ref().unwrap(); + Tor::start_service(api.1, Some(&wallet), &service_id); } } } @@ -1993,6 +1978,13 @@ async fn handle_task(w: &Wallet, t: WalletTask) { w.on_tx_error(*id, Some(e)); } }, + WalletTask::StartTor => { + let r_foreign_api = w.foreign_api_server.read(); + if let Some(api) = r_foreign_api.as_ref() { + let id = w.identifier(); + Tor::start_service(api.1, Some(w), &id); + } + } }; }