Loading crates/tor-client/src/client.rs +3 −60 Original line number Diff line number Diff line Loading @@ -5,19 +5,17 @@ //! connections ("streams") over the Tor network using //! `TorClient::connect()`. use crate::address::IntoTorAddr; use crate::config::ClientAddrConfig; use tor_circmgr::{CircMgrConfig, IsolationToken, TargetPort}; use tor_dirmgr::{DirEvent, DirMgrConfig}; use crate::config::{ClientAddrConfig, TorClientConfig}; use tor_circmgr::{IsolationToken, TargetPort}; use tor_dirmgr::DirEvent; use tor_proto::circuit::{ClientCirc, IpVersionPreference}; use tor_proto::stream::DataStream; use tor_rtcompat::{Runtime, SleepProviderExt}; use derive_builder::Builder; use futures::stream::StreamExt; use futures::task::SpawnExt; use std::convert::TryInto; use std::net::IpAddr; use std::path::PathBuf; use std::str::FromStr; use std::sync::{Arc, Weak}; use std::time::Duration; Loading Loading @@ -136,61 +134,6 @@ impl Default for ConnectPrefs { } } /// Configuration used to bootstrap a `TorClient`. #[derive(Clone, Debug, Builder)] pub struct TorClientConfig { /// A directory suitable for storing persistent Tor state in. state_cfg: PathBuf, /// Configuration for the network directory manager. dir_cfg: DirMgrConfig, /// Configuration for the network circuit manager. circ_cfg: CircMgrConfig, /// Other client configuration. addr_cfg: ClientAddrConfig, } impl TorClientConfig { /// Returns a `TorClientConfig` using reasonably sane defaults. /// /// This uses `tor_config`'s definitions for `APP_LOCAL_DATA` and `APP_CACHE` for the state and /// cache directories respectively. pub fn sane_defaults() -> Result<Self> { let state_dir = tor_config::CfgPath::new("${APP_LOCAL_DATA}".into()) .path() .map_err(|e| Error::Configuration(format!("failed to find APP_LOCAL_DATA: {:?}", e)))?; let cache_dir = tor_config::CfgPath::new("${APP_CACHE}".into()) .path() .map_err(|e| Error::Configuration(format!("failed to find APP_CACHE: {:?}", e)))?; Self::with_directories(state_dir, cache_dir) } /// Returns a `TorClientConfig` using the specified state and cache directories, with other /// configuration options set to defaults. pub fn with_directories<P, Q>(state_dir: P, cache_dir: Q) -> Result<Self> where P: Into<PathBuf>, Q: Into<PathBuf>, { Ok(Self { state_cfg: state_dir.into(), dir_cfg: DirMgrConfig::builder() .cache_path(cache_dir.into()) .build() .map_err(|e| { Error::Configuration(format!("failed to build DirMgrConfig: {}", e)) })?, circ_cfg: Default::default(), addr_cfg: Default::default(), }) } /// Return a new builder to construct a `TorClientConfig`. pub fn builder() -> TorClientConfigBuilder { TorClientConfigBuilder::default() } } impl<R: Runtime> TorClient<R> { /// Bootstrap a network connection configured by `dir_cfg` and `circ_cfg`. /// Loading crates/tor-client/src/config.rs +57 −0 Original line number Diff line number Diff line Loading @@ -2,8 +2,10 @@ //! //! Some of these are re-exported from lower-level crates. use crate::{Error, Result}; use derive_builder::Builder; use serde::Deserialize; use std::path::PathBuf; /// Types for configuring how Tor circuits are built. pub mod circ { Loading Loading @@ -46,3 +48,58 @@ impl Default for ClientAddrConfig { ClientAddrConfigBuilder::default().build().unwrap() } } /// Configuration used to bootstrap a `TorClient`. #[derive(Clone, Debug, Builder)] pub struct TorClientConfig { /// A directory suitable for storing persistent Tor state in. pub(crate) state_cfg: PathBuf, /// Configuration for the network directory manager. pub(crate) dir_cfg: dir::DirMgrConfig, /// Configuration for the network circuit manager. pub(crate) circ_cfg: circ::CircMgrConfig, /// Other client configuration. pub(crate) addr_cfg: ClientAddrConfig, } impl TorClientConfig { /// Returns a `TorClientConfig` using reasonably sane defaults. /// /// This uses `tor_config`'s definitions for `APP_LOCAL_DATA` and `APP_CACHE` for the state and /// cache directories respectively. pub fn sane_defaults() -> Result<Self> { let state_dir = tor_config::CfgPath::new("${APP_LOCAL_DATA}".into()) .path() .map_err(|e| Error::Configuration(format!("failed to find APP_LOCAL_DATA: {:?}", e)))?; let cache_dir = tor_config::CfgPath::new("${APP_CACHE}".into()) .path() .map_err(|e| Error::Configuration(format!("failed to find APP_CACHE: {:?}", e)))?; Self::with_directories(state_dir, cache_dir) } /// Returns a `TorClientConfig` using the specified state and cache directories, with other /// configuration options set to defaults. pub fn with_directories<P, Q>(state_dir: P, cache_dir: Q) -> Result<Self> where P: Into<PathBuf>, Q: Into<PathBuf>, { Ok(Self { state_cfg: state_dir.into(), dir_cfg: dir::DirMgrConfig::builder() .cache_path(cache_dir.into()) .build() .map_err(|e| { Error::Configuration(format!("failed to build DirMgrConfig: {}", e)) })?, circ_cfg: Default::default(), addr_cfg: Default::default(), }) } /// Return a new builder to construct a `TorClientConfig`. pub fn builder() -> TorClientConfigBuilder { TorClientConfigBuilder::default() } } crates/tor-client/src/lib.rs +2 −1 Original line number Diff line number Diff line Loading @@ -101,7 +101,8 @@ mod client; pub mod config; pub use address::{DangerouslyIntoTorAddr, IntoTorAddr, TorAddr, TorAddrError}; pub use client::{ConnectPrefs, TorClient, TorClientConfig}; pub use client::{ConnectPrefs, TorClient}; pub use config::TorClientConfig; pub use tor_circmgr::IsolationToken; /// An anonymized stream over the Tor network. Loading Loading
crates/tor-client/src/client.rs +3 −60 Original line number Diff line number Diff line Loading @@ -5,19 +5,17 @@ //! connections ("streams") over the Tor network using //! `TorClient::connect()`. use crate::address::IntoTorAddr; use crate::config::ClientAddrConfig; use tor_circmgr::{CircMgrConfig, IsolationToken, TargetPort}; use tor_dirmgr::{DirEvent, DirMgrConfig}; use crate::config::{ClientAddrConfig, TorClientConfig}; use tor_circmgr::{IsolationToken, TargetPort}; use tor_dirmgr::DirEvent; use tor_proto::circuit::{ClientCirc, IpVersionPreference}; use tor_proto::stream::DataStream; use tor_rtcompat::{Runtime, SleepProviderExt}; use derive_builder::Builder; use futures::stream::StreamExt; use futures::task::SpawnExt; use std::convert::TryInto; use std::net::IpAddr; use std::path::PathBuf; use std::str::FromStr; use std::sync::{Arc, Weak}; use std::time::Duration; Loading Loading @@ -136,61 +134,6 @@ impl Default for ConnectPrefs { } } /// Configuration used to bootstrap a `TorClient`. #[derive(Clone, Debug, Builder)] pub struct TorClientConfig { /// A directory suitable for storing persistent Tor state in. state_cfg: PathBuf, /// Configuration for the network directory manager. dir_cfg: DirMgrConfig, /// Configuration for the network circuit manager. circ_cfg: CircMgrConfig, /// Other client configuration. addr_cfg: ClientAddrConfig, } impl TorClientConfig { /// Returns a `TorClientConfig` using reasonably sane defaults. /// /// This uses `tor_config`'s definitions for `APP_LOCAL_DATA` and `APP_CACHE` for the state and /// cache directories respectively. pub fn sane_defaults() -> Result<Self> { let state_dir = tor_config::CfgPath::new("${APP_LOCAL_DATA}".into()) .path() .map_err(|e| Error::Configuration(format!("failed to find APP_LOCAL_DATA: {:?}", e)))?; let cache_dir = tor_config::CfgPath::new("${APP_CACHE}".into()) .path() .map_err(|e| Error::Configuration(format!("failed to find APP_CACHE: {:?}", e)))?; Self::with_directories(state_dir, cache_dir) } /// Returns a `TorClientConfig` using the specified state and cache directories, with other /// configuration options set to defaults. pub fn with_directories<P, Q>(state_dir: P, cache_dir: Q) -> Result<Self> where P: Into<PathBuf>, Q: Into<PathBuf>, { Ok(Self { state_cfg: state_dir.into(), dir_cfg: DirMgrConfig::builder() .cache_path(cache_dir.into()) .build() .map_err(|e| { Error::Configuration(format!("failed to build DirMgrConfig: {}", e)) })?, circ_cfg: Default::default(), addr_cfg: Default::default(), }) } /// Return a new builder to construct a `TorClientConfig`. pub fn builder() -> TorClientConfigBuilder { TorClientConfigBuilder::default() } } impl<R: Runtime> TorClient<R> { /// Bootstrap a network connection configured by `dir_cfg` and `circ_cfg`. /// Loading
crates/tor-client/src/config.rs +57 −0 Original line number Diff line number Diff line Loading @@ -2,8 +2,10 @@ //! //! Some of these are re-exported from lower-level crates. use crate::{Error, Result}; use derive_builder::Builder; use serde::Deserialize; use std::path::PathBuf; /// Types for configuring how Tor circuits are built. pub mod circ { Loading Loading @@ -46,3 +48,58 @@ impl Default for ClientAddrConfig { ClientAddrConfigBuilder::default().build().unwrap() } } /// Configuration used to bootstrap a `TorClient`. #[derive(Clone, Debug, Builder)] pub struct TorClientConfig { /// A directory suitable for storing persistent Tor state in. pub(crate) state_cfg: PathBuf, /// Configuration for the network directory manager. pub(crate) dir_cfg: dir::DirMgrConfig, /// Configuration for the network circuit manager. pub(crate) circ_cfg: circ::CircMgrConfig, /// Other client configuration. pub(crate) addr_cfg: ClientAddrConfig, } impl TorClientConfig { /// Returns a `TorClientConfig` using reasonably sane defaults. /// /// This uses `tor_config`'s definitions for `APP_LOCAL_DATA` and `APP_CACHE` for the state and /// cache directories respectively. pub fn sane_defaults() -> Result<Self> { let state_dir = tor_config::CfgPath::new("${APP_LOCAL_DATA}".into()) .path() .map_err(|e| Error::Configuration(format!("failed to find APP_LOCAL_DATA: {:?}", e)))?; let cache_dir = tor_config::CfgPath::new("${APP_CACHE}".into()) .path() .map_err(|e| Error::Configuration(format!("failed to find APP_CACHE: {:?}", e)))?; Self::with_directories(state_dir, cache_dir) } /// Returns a `TorClientConfig` using the specified state and cache directories, with other /// configuration options set to defaults. pub fn with_directories<P, Q>(state_dir: P, cache_dir: Q) -> Result<Self> where P: Into<PathBuf>, Q: Into<PathBuf>, { Ok(Self { state_cfg: state_dir.into(), dir_cfg: dir::DirMgrConfig::builder() .cache_path(cache_dir.into()) .build() .map_err(|e| { Error::Configuration(format!("failed to build DirMgrConfig: {}", e)) })?, circ_cfg: Default::default(), addr_cfg: Default::default(), }) } /// Return a new builder to construct a `TorClientConfig`. pub fn builder() -> TorClientConfigBuilder { TorClientConfigBuilder::default() } }
crates/tor-client/src/lib.rs +2 −1 Original line number Diff line number Diff line Loading @@ -101,7 +101,8 @@ mod client; pub mod config; pub use address::{DangerouslyIntoTorAddr, IntoTorAddr, TorAddr, TorAddrError}; pub use client::{ConnectPrefs, TorClient, TorClientConfig}; pub use client::{ConnectPrefs, TorClient}; pub use config::TorClientConfig; pub use tor_circmgr::IsolationToken; /// An anonymized stream over the Tor network. Loading