Move TorClientBuilder into tor_client::config, for consistency.
This commit is contained in:
parent
d245147c7f
commit
ed6ca1bc18
|
@ -5,19 +5,17 @@
|
||||||
//! connections ("streams") over the Tor network using
|
//! connections ("streams") over the Tor network using
|
||||||
//! `TorClient::connect()`.
|
//! `TorClient::connect()`.
|
||||||
use crate::address::IntoTorAddr;
|
use crate::address::IntoTorAddr;
|
||||||
use crate::config::ClientAddrConfig;
|
use crate::config::{ClientAddrConfig, TorClientConfig};
|
||||||
use tor_circmgr::{CircMgrConfig, IsolationToken, TargetPort};
|
use tor_circmgr::{IsolationToken, TargetPort};
|
||||||
use tor_dirmgr::{DirEvent, DirMgrConfig};
|
use tor_dirmgr::DirEvent;
|
||||||
use tor_proto::circuit::{ClientCirc, IpVersionPreference};
|
use tor_proto::circuit::{ClientCirc, IpVersionPreference};
|
||||||
use tor_proto::stream::DataStream;
|
use tor_proto::stream::DataStream;
|
||||||
use tor_rtcompat::{Runtime, SleepProviderExt};
|
use tor_rtcompat::{Runtime, SleepProviderExt};
|
||||||
|
|
||||||
use derive_builder::Builder;
|
|
||||||
use futures::stream::StreamExt;
|
use futures::stream::StreamExt;
|
||||||
use futures::task::SpawnExt;
|
use futures::task::SpawnExt;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::{Arc, Weak};
|
use std::sync::{Arc, Weak};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
@ -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> {
|
impl<R: Runtime> TorClient<R> {
|
||||||
/// Bootstrap a network connection configured by `dir_cfg` and `circ_cfg`.
|
/// Bootstrap a network connection configured by `dir_cfg` and `circ_cfg`.
|
||||||
///
|
///
|
||||||
|
|
|
@ -2,8 +2,10 @@
|
||||||
//!
|
//!
|
||||||
//! Some of these are re-exported from lower-level crates.
|
//! Some of these are re-exported from lower-level crates.
|
||||||
|
|
||||||
|
use crate::{Error, Result};
|
||||||
use derive_builder::Builder;
|
use derive_builder::Builder;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
/// Types for configuring how Tor circuits are built.
|
/// Types for configuring how Tor circuits are built.
|
||||||
pub mod circ {
|
pub mod circ {
|
||||||
|
@ -46,3 +48,58 @@ impl Default for ClientAddrConfig {
|
||||||
ClientAddrConfigBuilder::default().build().unwrap()
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -101,7 +101,8 @@ mod client;
|
||||||
pub mod config;
|
pub mod config;
|
||||||
|
|
||||||
pub use address::{DangerouslyIntoTorAddr, IntoTorAddr, TorAddr, TorAddrError};
|
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;
|
pub use tor_circmgr::IsolationToken;
|
||||||
/// An anonymized stream over the Tor network.
|
/// An anonymized stream over the Tor network.
|
||||||
|
|
Loading…
Reference in New Issue