BridgeRelay: Implement more traits.
Also add a BridgeRelayWithDesc type (name tbd) to guarantee that a bridge relay really does have a known descriptor before you try to build a circuit with it.
This commit is contained in:
parent
acb6288621
commit
23b3b0553f
|
@ -3704,6 +3704,7 @@ dependencies = [
|
||||||
"tor-netdoc",
|
"tor-netdoc",
|
||||||
"tor-persist",
|
"tor-persist",
|
||||||
"tor-proto",
|
"tor-proto",
|
||||||
|
"tor-protover",
|
||||||
"tor-rtcompat",
|
"tor-rtcompat",
|
||||||
"tor-rtmock",
|
"tor-rtmock",
|
||||||
"tor-units",
|
"tor-units",
|
||||||
|
|
|
@ -19,7 +19,7 @@ experimental = ["bridge-client"]
|
||||||
# Support for using bridges as a client. Note that this is not the same as
|
# Support for using bridges as a client. Note that this is not the same as
|
||||||
# the pt-client feature, since here we are not concerned with
|
# the pt-client feature, since here we are not concerned with
|
||||||
# pluggable transports necessarily.
|
# pluggable transports necessarily.
|
||||||
bridge-client = ["tor-netdoc/routerdesc"]
|
bridge-client = ["tor-netdoc/routerdesc", "tor-protover"]
|
||||||
# Support for pluggable transports.
|
# Support for pluggable transports.
|
||||||
pt-client = ["bridge-client", "tor-linkspec/pt-client"]
|
pt-client = ["bridge-client", "tor-linkspec/pt-client"]
|
||||||
|
|
||||||
|
@ -51,6 +51,7 @@ tor-netdir = { path = "../tor-netdir", version = "0.6.0" }
|
||||||
tor-netdoc = { path = "../tor-netdoc", version = "0.5.2" } # for address pattern
|
tor-netdoc = { path = "../tor-netdoc", version = "0.5.2" } # for address pattern
|
||||||
tor-persist = { path = "../tor-persist", version = "0.5.1" }
|
tor-persist = { path = "../tor-persist", version = "0.5.1" }
|
||||||
tor-proto = { path = "../tor-proto", version = "0.7.0" }
|
tor-proto = { path = "../tor-proto", version = "0.7.0" }
|
||||||
|
tor-protover = { path = "../tor-protover", version = "0.3.2", optional = true }
|
||||||
tor-rtcompat = { path = "../tor-rtcompat", version = "0.7.0" }
|
tor-rtcompat = { path = "../tor-rtcompat", version = "0.7.0" }
|
||||||
tor-units = { path = "../tor-units", version = "0.3.1" }
|
tor-units = { path = "../tor-units", version = "0.3.1" }
|
||||||
tracing = "0.1.18"
|
tracing = "0.1.18"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use tor_linkspec::{HasRelayIds, RelayIdRef, RelayIdType};
|
use tor_linkspec::{ChanTarget, CircTarget, HasAddrs, HasRelayIds, RelayIdRef, RelayIdType};
|
||||||
|
|
||||||
use super::{Bridge, BridgeDesc};
|
use super::{Bridge, BridgeDesc};
|
||||||
|
|
||||||
|
@ -22,11 +22,26 @@ pub struct BridgeRelay {
|
||||||
desc: Option<BridgeDesc>,
|
desc: Option<BridgeDesc>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A BridgeRelay that is known to have its full information available, and
|
||||||
|
/// which is therefore usable for circuits.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct BridgeRelayWithDesc<'a>(
|
||||||
|
/// This will _always_ be a bridge relay with a non-None desc.
|
||||||
|
&'a BridgeRelay,
|
||||||
|
);
|
||||||
|
|
||||||
impl BridgeRelay {
|
impl BridgeRelay {
|
||||||
/// Return true if this BridgeRelay has a known descriptor and can be used for relays.
|
/// Return true if this BridgeRelay has a known descriptor and can be used for relays.
|
||||||
pub fn has_descriptor(&self) -> bool {
|
pub fn has_descriptor(&self) -> bool {
|
||||||
self.desc.is_some()
|
self.desc.is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If we have enough information about this relay to build a circuit through it,
|
||||||
|
/// return a BridgeRelayWithDesc for it.
|
||||||
|
// TODO pt-client rename XXXX
|
||||||
|
pub fn for_circuit_usage(&self) -> Option<BridgeRelayWithDesc<'_>> {
|
||||||
|
self.desc.is_some().then(|| BridgeRelayWithDesc(self))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HasRelayIds for BridgeRelay {
|
impl HasRelayIds for BridgeRelay {
|
||||||
|
@ -36,3 +51,43 @@ impl HasRelayIds for BridgeRelay {
|
||||||
.or_else(|| self.desc.as_ref().and_then(|d| d.identity(key_type)))
|
.or_else(|| self.desc.as_ref().and_then(|d| d.identity(key_type)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl HasAddrs for BridgeRelay {
|
||||||
|
fn addrs(&self) -> &[std::net::SocketAddr] {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChanTarget for BridgeRelay {}
|
||||||
|
|
||||||
|
impl<'a> HasRelayIds for BridgeRelayWithDesc<'a> {
|
||||||
|
fn identity(&self, key_type: RelayIdType) -> Option<RelayIdRef<'_>> {
|
||||||
|
self.0.identity(key_type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<'a> HasAddrs for BridgeRelayWithDesc<'a> {
|
||||||
|
fn addrs(&self) -> &[std::net::SocketAddr] {
|
||||||
|
self.0.addrs()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<'a> ChanTarget for BridgeRelayWithDesc<'a> {}
|
||||||
|
|
||||||
|
impl<'a> BridgeRelayWithDesc<'a> {
|
||||||
|
/// Return a reference to the BridgeDesc in this reference.
|
||||||
|
fn desc(&self) -> &BridgeDesc {
|
||||||
|
self.0
|
||||||
|
.desc
|
||||||
|
.as_ref()
|
||||||
|
.expect("There was supposed to be a descriptor here")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> CircTarget for BridgeRelayWithDesc<'a> {
|
||||||
|
fn ntor_onion_key(&self) -> &tor_llcrypto::pk::curve25519::PublicKey {
|
||||||
|
self.desc().as_ref().ntor_onion_key()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn protovers(&self) -> &tor_protover::Protocols {
|
||||||
|
self.desc().as_ref().protocols()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue