Commit ed6ca1bc authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

Move TorClientBuilder into tor_client::config, for consistency.

parent d245147c
Loading
Loading
Loading
Loading
+3 −60
Original line number Diff line number Diff line
@@ -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`.
    ///
+57 −0
Original line number Diff line number Diff line
@@ -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()
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -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.