From 3d33ad7fdfda682309090e6cb867102bea6eacbe Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 21 Mar 2023 17:28:28 +0000 Subject: [PATCH] arti-client: Create an HsClientConnector --- Cargo.lock | 1 + crates/arti-client/Cargo.toml | 3 ++- crates/arti-client/src/client.rs | 15 +++++++++++++++ crates/arti-client/src/err.rs | 7 +++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 5f30c1a6e..0250fbd30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -185,6 +185,7 @@ dependencies = [ "tor-dirmgr", "tor-error", "tor-guardmgr", + "tor-hsclient", "tor-hscrypto", "tor-llcrypto", "tor-netdir", diff --git a/crates/arti-client/Cargo.toml b/crates/arti-client/Cargo.toml index 70759c645..23d0a8edc 100644 --- a/crates/arti-client/Cargo.toml +++ b/crates/arti-client/Cargo.toml @@ -67,7 +67,7 @@ experimental = [ experimental-api = [] dirfilter = ["tor-dirmgr/dirfilter"] error_detail = [] -onion-client = ["tor-hscrypto"] +onion-client = ["tor-hsclient", "tor-hscrypto"] [dependencies] cfg-if = "1.0.0" @@ -96,6 +96,7 @@ tor-dirmgr = { path = "../tor-dirmgr", version = "0.9.2", default-features = fal ] } tor-error = { path = "../tor-error", version = "0.4.1" } tor-guardmgr = { path = "../tor-guardmgr", version = "0.8.2" } +tor-hsclient = { path = "../tor-hsclient", version = "0.1.1", optional = true } tor-hscrypto = { path = "../tor-hscrypto", version = "0.1.1", optional = true } tor-llcrypto = { path = "../tor-llcrypto", version = "0.4.2" } tor-netdir = { path = "../tor-netdir", version = "0.8.0" } diff --git a/crates/arti-client/src/client.rs b/crates/arti-client/src/client.rs index 4c2ef6374..d90bb04ef 100644 --- a/crates/arti-client/src/client.rs +++ b/crates/arti-client/src/client.rs @@ -17,6 +17,8 @@ use tor_dirmgr::bridgedesc::BridgeDescMgr; use tor_dirmgr::{DirMgrStore, Timeliness}; use tor_error::{internal, Bug, ErrorReport}; use tor_guardmgr::GuardMgr; +#[cfg(feature = "onion-client")] +use tor_hsclient::HsClientConnector; use tor_netdir::{params::NetParameters, NetDirProvider}; use tor_persist::{FsStateMgr, StateMgr}; use tor_proto::circuit::ClientCirc; @@ -92,6 +94,10 @@ pub struct TorClient { /// Pluggable transport manager. #[cfg(feature = "pt-client")] pt_mgr: Arc>, + /// HS client connector + #[allow(dead_code)] // TODO HS remove + #[cfg(feature = "onion-client")] + hsclient: HsClientConnector, /// Guard manager #[cfg_attr(not(feature = "bridge-client"), allow(dead_code))] guardmgr: GuardMgr, @@ -521,6 +527,13 @@ impl TorClient { #[cfg(feature = "bridge-client")] let bridge_desc_mgr = Arc::new(Mutex::new(None)); + #[cfg(feature = "onion-client")] + let hsclient = HsClientConnector::new( + runtime.clone(), + circmgr.clone(), + dirmgr.clone().upcast_arc(), + )?; + runtime .spawn(tasks_monitor_dormant( dormant_recv, @@ -558,6 +571,8 @@ impl TorClient { bridge_desc_mgr, #[cfg(feature = "pt-client")] pt_mgr, + #[cfg(feature = "onion-client")] + hsclient, guardmgr, statemgr, addrcfg: Arc::new(addr_cfg.into()), diff --git a/crates/arti-client/src/err.rs b/crates/arti-client/src/err.rs index 73d9c4080..b61ee0c87 100644 --- a/crates/arti-client/src/err.rs +++ b/crates/arti-client/src/err.rs @@ -139,6 +139,11 @@ enum ErrorDetail { #[error("Error setting up the persistent state manager")] StateMgrSetup(#[source] tor_persist::Error), + /// Error setting up the hidden service client connector. + #[error("Error setting up the hidden service client connector")] + #[cfg(feature = "onion-client")] + HsClientConnectorSetup(#[from] tor_hsclient::StartupError), + /// Failed to obtain exit circuit #[error("Failed to obtain exit circuit for ports {exit_ports}")] ObtainExitCircuit { @@ -316,6 +321,8 @@ impl tor_error::HasKind for ErrorDetail { E::CircMgrSetup(e) => e.kind(), E::DirMgrSetup(e) => e.kind(), E::StateMgrSetup(e) => e.kind(), + #[cfg(feature = "onion-client")] + E::HsClientConnectorSetup(e) => e.kind(), E::DirMgrBootstrap(e) => e.kind(), #[cfg(feature = "pt-client")] E::PluggableTransport(e) => e.kind(),