diff --git a/crates/arti-client/src/config.rs b/crates/arti-client/src/config.rs index af47a3b0c..778c98c02 100644 --- a/crates/arti-client/src/config.rs +++ b/crates/arti-client/src/config.rs @@ -389,11 +389,12 @@ mod test { .name("Fred") .v3ident([22; 20].into()) .clone(); - let fallback = dir::FallbackDir::builder() + let mut fallback = dir::FallbackDir::builder(); + fallback .rsa_identity([23; 20].into()) .ed_identity([99; 32].into()) - .orports(vec!["127.0.0.7:7".parse().unwrap()]) - .clone(); + .orports() + .push("127.0.0.7:7".parse().unwrap()); let mut bld = TorClientConfig::builder(); bld.tor_network().set_authorities(vec![auth]); diff --git a/crates/arti/src/cfg.rs b/crates/arti/src/cfg.rs index a31a9c719..a766ee6fc 100644 --- a/crates/arti/src/cfg.rs +++ b/crates/arti/src/cfg.rs @@ -226,11 +226,12 @@ mod test { .name("Fred") .v3ident([22; 20].into()) .clone(); - let fallback = dir::FallbackDir::builder() + let mut fallback = dir::FallbackDir::builder(); + fallback .rsa_identity([23; 20].into()) .ed_identity([99; 32].into()) - .orports(vec!["127.0.0.7:7".parse().unwrap()]) - .clone(); + .orports() + .push("127.0.0.7:7".parse().unwrap()); let mut bld = ArtiConfig::builder(); bld.proxy().socks_port(Some(9999)); diff --git a/crates/tor-circmgr/src/path/dirpath.rs b/crates/tor-circmgr/src/path/dirpath.rs index 62ff86e32..ff05468d3 100644 --- a/crates/tor-circmgr/src/path/dirpath.rs +++ b/crates/tor-circmgr/src/path/dirpath.rs @@ -117,18 +117,22 @@ mod test { #[test] fn dirpath_fallback() { let fb_owned = vec![ - FallbackDir::builder() - .rsa_identity([0x01; 20].into()) - .ed_identity([0x01; 32].into()) - .orport("127.0.0.1:9000".parse().unwrap()) - .build() - .unwrap(), - FallbackDir::builder() - .rsa_identity([0x03; 20].into()) - .ed_identity([0x03; 32].into()) - .orport("127.0.0.1:9003".parse().unwrap()) - .build() - .unwrap(), + { + let mut bld = FallbackDir::builder(); + bld.rsa_identity([0x01; 20].into()) + .ed_identity([0x01; 32].into()) + .orports() + .push("127.0.0.1:9000".parse().unwrap()); + bld.build().unwrap() + }, + { + let mut bld = FallbackDir::builder(); + bld.rsa_identity([0x03; 20].into()) + .ed_identity([0x03; 32].into()) + .orports() + .push("127.0.0.1:9003".parse().unwrap()); + bld.build().unwrap() + }, ]; let fb: FallbackList = fb_owned.clone().into(); let dirinfo = (&fb).into(); diff --git a/crates/tor-dirmgr/src/config.rs b/crates/tor-dirmgr/src/config.rs index d7fc79605..c448b1603 100644 --- a/crates/tor-dirmgr/src/config.rs +++ b/crates/tor-dirmgr/src/config.rs @@ -333,12 +333,14 @@ mod test { ]); assert!(bld.build().is_err()); - bld.set_fallback_caches(vec![FallbackDir::builder() - .rsa_identity([b'x'; 20].into()) - .ed_identity([b'y'; 32].into()) - .orport("127.0.0.1:99".parse().unwrap()) - .orport("[::]:99".parse().unwrap()) - .clone()]); + bld.set_fallback_caches(vec![{ + let mut bld = FallbackDir::builder(); + bld.rsa_identity([b'x'; 20].into()) + .ed_identity([b'y'; 32].into()); + bld.orports().push("127.0.0.1:99".parse().unwrap()); + bld.orports().push("[::]:99".parse().unwrap()); + bld + }]); let cfg = bld.build().unwrap(); assert_eq!(cfg.authorities.len(), 2); assert_eq!(cfg.fallback_caches.len(), 1); diff --git a/crates/tor-guardmgr/src/fallback.rs b/crates/tor-guardmgr/src/fallback.rs index 8f77bf6fd..240a20e58 100644 --- a/crates/tor-guardmgr/src/fallback.rs +++ b/crates/tor-guardmgr/src/fallback.rs @@ -15,6 +15,7 @@ mod set; use crate::ids::FallbackId; use derive_builder::Builder; use tor_config::ConfigBuildError; +use tor_config::{define_list_builder_accessors, list_builder::VecBuilder}; use tor_llcrypto::pk::ed25519::Ed25519Identity; use tor_llcrypto::pk::rsa::RsaIdentity; @@ -41,9 +42,16 @@ pub struct FallbackDir { /// Ed25519 identity for the directory relay ed_identity: Ed25519Identity, /// List of ORPorts for the directory relay + #[builder(sub_builder(fn_name = "build"), setter(custom))] orports: Vec, } +define_list_builder_accessors! { + struct FallbackDirBuilder { + pub orports: [SocketAddr], + } +} + impl FallbackDir { /// Return a builder that can be used to make a `FallbackDir`. pub fn builder() -> FallbackDirBuilder { @@ -67,13 +75,6 @@ impl FallbackDirBuilder { pub fn new() -> Self { Self::default() } - /// Add a single OR port for this fallback directory. - /// - /// This field is required, and may be called more than once. - pub fn orport(&mut self, orport: SocketAddr) -> &mut Self { - self.orports.get_or_insert_with(Vec::new).push(orport); - self - } /// Builds a new `FallbackDir`. /// /// ### Errors @@ -108,7 +109,7 @@ pub(crate) fn default_fallbacks() -> Vec { .iter() .map(|s| s.parse().expect("Bad socket address in fallbacklist")) .for_each(|p| { - bld.orport(p); + bld.orports().push(p); }); bld diff --git a/crates/tor-guardmgr/src/fallback/set.rs b/crates/tor-guardmgr/src/fallback/set.rs index 24b625c2b..0dbaf5886 100644 --- a/crates/tor-guardmgr/src/fallback/set.rs +++ b/crates/tor-guardmgr/src/fallback/set.rs @@ -244,12 +244,12 @@ mod test { let ed: [u8; 32] = rng.gen(); let rsa: [u8; 20] = rng.gen(); let ip: u32 = rng.gen(); - FallbackDir::builder() - .ed_identity(ed.into()) + let mut bld = FallbackDir::builder(); + bld.ed_identity(ed.into()) .rsa_identity(rsa.into()) - .orport(std::net::SocketAddrV4::new(ip.into(), 9090).into()) - .build() - .unwrap() + .orports() + .push(std::net::SocketAddrV4::new(ip.into(), 9090).into()); + bld.build().unwrap() } #[test] diff --git a/doc/semver_status.md b/doc/semver_status.md index b6aa777c4..62f6dc024 100644 --- a/doc/semver_status.md +++ b/doc/semver_status.md @@ -60,6 +60,7 @@ BREAKING: DirMgrCfg: schedule and network fields rename (`_config` removed) ### tor-guardmgr +BREAKING: FallbackDirBuilder::orport() removed, and orports() now gives &mut SocketAddrListBuilder MODIFIED: New functions to get estimated clock skew. MODIFIED: New functions to report observed clock skew.