From d9e3d38bd642015132a4e523825bb987970e2bef Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 4 Oct 2022 13:13:05 -0400 Subject: [PATCH] Start on a new BridgeRelay type. This is the one we'll actually use to connect to bridges. It has a `Bridge` line, and an optional `BridgeDesc`. Maybe this will turn into a `BridgeRelay<'a>` by analogy to `Relay` some time; I'm not sure. --- crates/tor-guardmgr/src/bridge.rs | 4 ++- crates/tor-guardmgr/src/bridge/relay.rs | 38 +++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 crates/tor-guardmgr/src/bridge/relay.rs diff --git a/crates/tor-guardmgr/src/bridge.rs b/crates/tor-guardmgr/src/bridge.rs index 3a9391ac1..01f3e0e5c 100644 --- a/crates/tor-guardmgr/src/bridge.rs +++ b/crates/tor-guardmgr/src/bridge.rs @@ -12,6 +12,8 @@ mod config; mod descs; +mod relay; pub use config::Bridge; -pub use descs::{BridgeDescEvent, BridgeDescList, BridgeDescProvider}; +pub use descs::{BridgeDesc, BridgeDescEvent, BridgeDescList, BridgeDescProvider}; +pub use relay::BridgeRelay; diff --git a/crates/tor-guardmgr/src/bridge/relay.rs b/crates/tor-guardmgr/src/bridge/relay.rs new file mode 100644 index 000000000..21b1cfb41 --- /dev/null +++ b/crates/tor-guardmgr/src/bridge/relay.rs @@ -0,0 +1,38 @@ +//! Implementation code to make a bridge something that we can connect to and use to relay traffic. + +use std::sync::Arc; + +use tor_linkspec::{HasRelayIds, RelayIdRef, RelayIdType}; + +use super::{Bridge, BridgeDesc}; + +/// The information about a Bridge that is necessary to connect to it and relay traffic. +#[derive(Clone, Debug)] + +pub struct BridgeRelay { + /// The local configurations for the bridge. + /// + /// This is _always_ necessary, since it without it we can't know whether + /// any pluggable transports are needed. + bridge_line: Arc, + + /// A descriptor for the bridge. + /// + /// If present, it MUST have every RelayId that the `bridge_line` does. + desc: Option, +} + +impl BridgeRelay { + /// Return true if this BridgeRelay has a known descriptor and can be used for relays. + pub fn has_descriptor(&self) -> bool { + self.desc.is_some() + } +} + +impl HasRelayIds for BridgeRelay { + fn identity(&self, key_type: RelayIdType) -> Option> { + self.bridge_line + .identity(key_type) + .or_else(|| self.desc.as_ref().and_then(|d| d.identity(key_type))) + } +}