tor: update to arti 0.43, do not store secret key, use new hyper to send requests

This commit is contained in:
ardocrat
2026-06-15 14:53:52 +03:00
parent 60d8dc7555
commit 726a51bd0e
8 changed files with 407 additions and 546 deletions
Generated
+189 -150
View File
@@ -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",
+10 -11
View File
@@ -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"
@@ -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();
-258
View File
@@ -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<anyhow::Error>),
}
/// 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<R: Runtime, TC: TlsConn> {
/// The client
client: TorClient<R>,
/// TLS for using across Tor.
tls_conn: Arc<TC>,
}
// #[derive(Clone)] infers a TC: Clone bound
impl<R: Runtime, TC: TlsConn> ArtiHttpConnector<R, TC> {
/// Make a new `ArtiHttpConnector` using an Arti `TorClient` object.
pub fn new(client: TorClient<R>, 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<TC: TlsConn> {
/// The stream
#[pin]
inner: MaybeHttpsStream<TC>,
}
/// The actual stream; might be TLS, might not
#[pin_project(project = MaybeHttpsStreamProj)]
enum MaybeHttpsStream<TC: TlsConn> {
/// http
Http(Pin<Box<DataStream>>), // Tc:TlsStream is generally boxed; box this one too
/// https
Https(#[pin] TC::TlsStream),
}
impl<TC: TlsConn> Connection for ArtiHttpConnection<TC> {
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<TC: TlsConn> AsyncRead for ArtiHttpConnection<TC> {
fn poll_read(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &mut ReadBuf<'_>,
) -> Poll<Result<(), std::io::Error>> {
match self.project().inner.project() {
MaybeHttpsStreamProj::Http(ds) => ds.as_mut().poll_read(cx, buf),
MaybeHttpsStreamProj::Https(t) => t.poll_read(cx, buf),
}
}
}
impl<TC: TlsConn> AsyncWrite for ArtiHttpConnection<TC> {
fn poll_write(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8],
) -> Poll<Result<usize, Error>> {
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<Result<(), Error>> {
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<Result<(), Error>> {
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<R: Runtime, TC: TlsConn> Service<Uri> for ArtiHttpConnector<R, TC> {
type Response = ArtiHttpConnection<TC>;
type Error = ConnectionError;
#[allow(clippy::type_complexity)]
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;
fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
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 })
})
}
}
-2
View File
@@ -20,5 +20,3 @@ pub use tor::Tor;
mod types;
pub use types::*;
mod http;
+174 -84
View File
@@ -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<RwLock<Option<(TorClient<TokioNativeTlsRuntime>, TorClientConfig)>>>,
client_config: Arc<RwLock<Option<(Arc<TorClient<TokioNativeTlsRuntime>>, TorClientConfig)>>>,
/// Flag to check if client is launching.
client_launching: Arc<AtomicBool>,
/// Mapping of running Onion services identifiers to proxy.
run: Arc<
RwLock<
BTreeMap<
String,
(
u16,
SecretKey,
Arc<RunningOnionService>,
Arc<OnionServiceReverseProxy>,
),
>,
>,
RwLock<BTreeMap<String, (u16, Arc<RunningOnionService>, Arc<OnionServiceReverseProxy>)>>,
>,
/// Mapping of starting Onion services identifiers.
start: Arc<RwLock<BTreeMap<String, (u16, SecretKey)>>>,
/// Mapping of starting Onion services identifiers to port.
start: Arc<RwLock<BTreeMap<String, u16>>>,
/// Failed Onion services identifiers.
fail: Arc<RwLock<BTreeSet<String>>>,
/// Checking Onion services identifiers.
@@ -141,7 +132,9 @@ impl Tor {
}
/// Build bootstrapped client from provided config.
fn build_client_bootstrap(config: TorClientConfig) -> Option<TorClient<TokioNativeTlsRuntime>> {
fn build_client_bootstrap(
config: TorClientConfig,
) -> Option<Arc<TorClient<TokioNativeTlsRuntime>>> {
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::<hyper::Uri>() {
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<Bytes>>(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<TokioNativeTlsRuntime>, TorClientConfig)> {
fn client_config() -> Option<(Arc<TorClient<TokioNativeTlsRuntime>>, 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::<Vec<String>>()
};
let mut services: BTreeMap<String, (u16, SecretKey)> = TOR_STATE.start.read().clone();
let mut services: BTreeMap<String, u16> = 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<u16> {
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::<hyper::Uri>() {
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::<Bytes>::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<S>(
client: TorClient<TokioNativeTlsRuntime>,
client: Arc<TorClient<TokioNativeTlsRuntime>>,
addr: SocketAddr,
request: S,
nickname: HsNickname,
+2
View File
@@ -433,4 +433,6 @@ pub enum WalletTask {
/// Delete transaction.
/// * tx id
Delete(u32),
/// Start Tor service.
StartTor,
}
+29 -37
View File
@@ -113,8 +113,6 @@ pub struct Wallet {
/// Running wallet foreign API server and port.
foreign_api_server: Arc<RwLock<Option<(ApiServer, u16)>>>,
/// Wallet secret key for transport service.
secret_key: Arc<RwLock<Option<SecretKey>>>,
/// Flag to check if wallet repairing and restoring missing outputs is needed.
repair_needed: Arc<AtomicBool>,
@@ -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<SecretKey> {
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<SecretKey, Error> {
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);
}
}
};
}