Move TorClientBuilder into tor_client::config, for consistency.

This commit is contained in:
Nick Mathewson 2021-10-19 15:34:27 -04:00
parent d245147c7f
commit ed6ca1bc18
3 changed files with 62 additions and 61 deletions

View File

@ -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;
@ -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`.
///

View File

@ -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 {
@ -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()
}
}

View File

@ -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.