pub struct ChanBuilder<R, H: TransportImplHelper>{
runtime: R,
transport: H,
tls_connector: <R as TlsProvider<H::Stream>>::Connector,
tls_acceptor: Option<<R as TlsProvider<H::Stream>>::Acceptor>,
auth_material: Option<Arc<RelayChannelAuthMaterial>>,
my_addrs: Vec<SocketAddr>,
create_request_handler: Option<Arc<CreateRequestHandler>>,
}Expand description
TLS-based channel builder.
This is a separate type so that we can keep our channel management code network-agnostic.
It uses a provided TransportHelper type to make a connection (possibly
directly over TCP, and possibly over some other protocol). It then
negotiates TLS over that connection, and negotiates a Tor channel over that
TLS session.
This channel builder does not retry on failure, but it does implement a time-out.
Fields§
§runtime: RAsynchronous runtime for TLS, TCP, spawning, and timeouts.
transport: HThe transport object that we use to construct streams.
tls_connector: <R as TlsProvider<H::Stream>>::ConnectorObject to build TLS connections.
tls_acceptor: Option<<R as TlsProvider<H::Stream>>::Acceptor>Object to accept TLS connections.
auth_material: Option<Arc<RelayChannelAuthMaterial>>Relay authentication key material needed for relay channels.
my_addrs: Vec<SocketAddr>Our address(es) to use in the NETINFO cell.
create_request_handler: Option<Arc<CreateRequestHandler>>Provided to each new channel so that they can handle CREATE* requests.
Implementations§
Source§impl<R, H: TransportImplHelper> ChanBuilder<R, H>
impl<R, H: TransportImplHelper> ChanBuilder<R, H>
Sourcepub fn new_client(runtime: R, transport: H) -> Self
pub fn new_client(runtime: R, transport: H) -> Self
Construct a new client specific ChanBuilder.
Sourcepub fn new_relay(
runtime: R,
transport: H,
auth_material: Arc<RelayChannelAuthMaterial>,
my_addrs: Vec<SocketAddr>,
create_request_handler: Option<Arc<CreateRequestHandler>>,
) -> Result<Self>
pub fn new_relay( runtime: R, transport: H, auth_material: Arc<RelayChannelAuthMaterial>, my_addrs: Vec<SocketAddr>, create_request_handler: Option<Arc<CreateRequestHandler>>, ) -> Result<Self>
Construct a new relay specific ChanBuilder.
Sourcepub fn rebuild_with_auth_material(
&self,
auth_material: Arc<RelayChannelAuthMaterial>,
) -> Result<Self>where
H: Clone,
pub fn rebuild_with_auth_material(
&self,
auth_material: Arc<RelayChannelAuthMaterial>,
) -> Result<Self>where
H: Clone,
Build a new ChanBuilder with the given auth_material,
cloning everything else.
This is needed because some relay keys rotate over time.
Sourcepub fn rebuild_with_create_request_handler(
&self,
handler: Arc<CreateRequestHandler>,
) -> Result<Self>where
H: Clone,
pub fn rebuild_with_create_request_handler(
&self,
handler: Arc<CreateRequestHandler>,
) -> Result<Self>where
H: Clone,
Build a new ChanBuilder with the given CREATE* request handler,
cloning everything else.
This is needed so that we can set the handler, which isn’t known when the builder is initially created.
Sourcefn outbound_chan_type(&self) -> ChannelType
fn outbound_chan_type(&self) -> ChannelType
Return the outbound channel type of this config.
The channel type is used when creating outbound channels. Relays always initiate channels as “relay initiator” while client and bridges behave like a “client initiator”.
Important: The wrong channel type is returned if this is called before with_identities()
is called.
Source§impl<R, H> ChanBuilder<R, H>
impl<R, H> ChanBuilder<R, H>
Sourceasync fn connect_no_timeout(
&self,
target: &OwnedChanTarget,
event_sender: Arc<Mutex<ChanMgrEventSender>>,
memquota: ChannelAccount,
) -> Result<Arc<Channel>>
async fn connect_no_timeout( &self, target: &OwnedChanTarget, event_sender: Arc<Mutex<ChanMgrEventSender>>, memquota: ChannelAccount, ) -> Result<Arc<Channel>>
Perform the work of connect_via_transport, but without enforcing a timeout.
Return a Channel on success.
Sourcefn validate_target_as_relay<CT>(&self, target: &CT) -> Result<()>where
CT: ChanTarget,
fn validate_target_as_relay<CT>(&self, target: &CT) -> Result<()>where
CT: ChanTarget,
Validate the given target as we (a relay) are attempting to connect to another relay.
Sourcefn validate_target<CT>(&self, target: &CT) -> Result<()>where
CT: ChanTarget,
fn validate_target<CT>(&self, target: &CT) -> Result<()>where
CT: ChanTarget,
Validate the given target as in if it is fine to connect to it.
There are several rules to follow based on the channel outbound type.
Sourceasync fn build_client_channel<T>(
&self,
tls: T,
peer_addr: MaybeSensitive<PeerAddr>,
target: &OwnedChanTarget,
peer_tls_cert: &[u8],
memquota: ChannelAccount,
event_sender: Arc<Mutex<ChanMgrEventSender>>,
) -> Result<Arc<Channel>>
async fn build_client_channel<T>( &self, tls: T, peer_addr: MaybeSensitive<PeerAddr>, target: &OwnedChanTarget, peer_tls_cert: &[u8], memquota: ChannelAccount, event_sender: Arc<Mutex<ChanMgrEventSender>>, ) -> Result<Arc<Channel>>
Build a client channel (always initiator).
This spawns the Reactor and return the tor_proto::channel::Channel.
Sourceasync fn build_relay_channel<T>(
&self,
tls: T,
peer_addr: MaybeSensitive<PeerAddr>,
target: &OwnedChanTarget,
peer_tls_cert: &[u8],
memquota: ChannelAccount,
event_sender: Arc<Mutex<ChanMgrEventSender>>,
) -> Result<Arc<Channel>>
async fn build_relay_channel<T>( &self, tls: T, peer_addr: MaybeSensitive<PeerAddr>, target: &OwnedChanTarget, peer_tls_cert: &[u8], memquota: ChannelAccount, event_sender: Arc<Mutex<ChanMgrEventSender>>, ) -> Result<Arc<Channel>>
Build a relay initiator channel.
This spawns the Reactor and return the tor_proto::channel::Channel.
Trait Implementations§
Source§impl<R, H> ChannelFactory for ChanBuilder<R, H>
impl<R, H> ChannelFactory for ChanBuilder<R, H>
Source§fn connect_via_transport<'life0, 'life1, 'async_trait>(
&'life0 self,
target: &'life1 OwnedChanTarget,
reporter: BootstrapReporter,
memquota: ChannelAccount,
) -> Pin<Box<dyn Future<Output = Result<Arc<Channel>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn connect_via_transport<'life0, 'life1, 'async_trait>(
&'life0 self,
target: &'life1 OwnedChanTarget,
reporter: BootstrapReporter,
memquota: ChannelAccount,
) -> Pin<Box<dyn Future<Output = Result<Arc<Channel>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
target. Read moreSource§impl<R, H> IncomingChannelFactory for ChanBuilder<R, H>
impl<R, H> IncomingChannelFactory for ChanBuilder<R, H>
Source§type Stream = <H as TransportImplHelper>::Stream
type Stream = <H as TransportImplHelper>::Stream
Source§fn accept_from_transport<'life0, 'async_trait>(
&'life0 self,
peer: Sensitive<SocketAddr>,
stream: Self::Stream,
memquota: ChannelAccount,
) -> Pin<Box<dyn Future<Output = Result<Arc<Channel>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn accept_from_transport<'life0, 'async_trait>(
&'life0 self,
peer: Sensitive<SocketAddr>,
stream: Self::Stream,
memquota: ChannelAccount,
) -> Pin<Box<dyn Future<Output = Result<Arc<Channel>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
peer with the given stream. The channel may or may not be
authenticated.Auto Trait Implementations§
impl<R, H> Freeze for ChanBuilder<R, H>where
R: Freeze,
H: Freeze,
<R as TlsProvider<<H as TransportImplHelper>::Stream>>::Connector: Freeze,
<R as TlsProvider<<H as TransportImplHelper>::Stream>>::Acceptor: Freeze,
impl<R, H> !RefUnwindSafe for ChanBuilder<R, H>
impl<R, H> Send for ChanBuilder<R, H>where
H: Send,
impl<R, H> Sync for ChanBuilder<R, H>where
H: Sync,
impl<R, H> Unpin for ChanBuilder<R, H>
impl<R, H> UnsafeUnpin for ChanBuilder<R, H>where
R: UnsafeUnpin,
H: UnsafeUnpin,
<R as TlsProvider<<H as TransportImplHelper>::Stream>>::Connector: UnsafeUnpin,
<R as TlsProvider<<H as TransportImplHelper>::Stream>>::Acceptor: UnsafeUnpin,
impl<R, H> !UnwindSafe for ChanBuilder<R, H>
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PossiblyOption<T> for T
impl<T> PossiblyOption<T> for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.