arti-client: address: Plumb StreamPrefs into enforce_config

No functional change yet.  We'll use this shortly.
This commit is contained in:
Ian Jackson 2023-06-16 13:26:12 +01:00
parent bf93519cdd
commit 60cfb09e77
2 changed files with 12 additions and 7 deletions

View File

@ -2,6 +2,7 @@
//! Tor can connect to.
use crate::err::ErrorDetail;
use crate::StreamPrefs;
use std::fmt::Display;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
use std::str::FromStr;
@ -233,8 +234,9 @@ impl TorAddr {
pub(crate) fn into_stream_instructions(
self,
cfg: &crate::config::ClientAddrConfig,
prefs: &StreamPrefs,
) -> Result<StreamInstructions, ErrorDetail> {
self.enforce_config(cfg)?;
self.enforce_config(cfg, prefs)?;
let port = self.port;
Ok(match self.host {
@ -265,8 +267,9 @@ impl TorAddr {
pub(crate) fn into_resolve_instructions(
self,
cfg: &crate::config::ClientAddrConfig,
prefs: &StreamPrefs,
) -> Result<ResolveInstructions, ErrorDetail> {
self.enforce_config(cfg)?;
self.enforce_config(cfg, prefs)?;
Ok(match self.host {
Host::Hostname(hostname) => ResolveInstructions::Exit(hostname),
@ -285,6 +288,8 @@ impl TorAddr {
fn enforce_config(
&self,
cfg: &crate::config::ClientAddrConfig,
#[allow(unused_variables)] // will only be used in certain configurations
prefs: &StreamPrefs,
) -> Result<(), ErrorDetail> {
if !cfg.allow_local_addrs && self.is_local() {
return Err(ErrorDetail::LocalAddress);
@ -557,7 +562,7 @@ mod test {
use crate::err::ErrorDetail;
fn val<A: IntoTorAddr>(addr: A) -> Result<TorAddr, ErrorDetail> {
let toraddr = addr.into_tor_addr()?;
toraddr.enforce_config(&Default::default())?;
toraddr.enforce_config(&Default::default(), &Default::default())?;
Ok(toraddr)
}
@ -633,7 +638,7 @@ mod test {
use StreamInstructions as SI;
fn sap(s: &str) -> Result<StreamInstructions, ErrorDetail> {
TorAddr::from(s).unwrap().into_stream_instructions(&Default::default())
TorAddr::from(s).unwrap().into_stream_instructions(&Default::default(), &Default::default())
}
assert_eq!(
@ -676,7 +681,7 @@ mod test {
use ResolveInstructions as RI;
fn sap(s: &str) -> Result<ResolveInstructions, ErrorDetail> {
TorAddr::from(s).unwrap().into_resolve_instructions(&Default::default())
TorAddr::from(s).unwrap().into_resolve_instructions(&Default::default(), &Default::default())
}
assert_eq!(

View File

@ -934,7 +934,7 @@ impl<R: Runtime> TorClient<R> {
) -> crate::Result<DataStream> {
let addr = target.into_tor_addr().map_err(wrap_err)?;
let (circ, addr, port) = match addr.into_stream_instructions(&self.addrcfg.get())? {
let (circ, addr, port) = match addr.into_stream_instructions(&self.addrcfg.get(), prefs)? {
StreamInstructions::Exit {
hostname: addr,
port,
@ -1073,7 +1073,7 @@ impl<R: Runtime> TorClient<R> {
// should be a method on `Host`, not `TorAddr`. -Diziet.
let addr = (hostname, 1).into_tor_addr().map_err(wrap_err)?;
match addr.into_resolve_instructions(&self.addrcfg.get())? {
match addr.into_resolve_instructions(&self.addrcfg.get(), prefs)? {
ResolveInstructions::Exit(hostname) => {
let circ = self.get_or_launch_exit_circ(&[], prefs).await?;