From 11a8d42ca70e9890c5bc17e4688c30f0f6f15de5 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Thu, 17 Sep 2026 17:49:01 +0200 Subject: [PATCH] Deduplicate relay candidates --- src/autorelay.rs | 23 +++++++++++++++-------- src/configure.rs | 3 ++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/autorelay.rs b/src/autorelay.rs index 056b764d9..5de55e800 100644 --- a/src/autorelay.rs +++ b/src/autorelay.rs @@ -16,6 +16,7 @@ //! [`Config::AutorelayFinished`] is set and nothing is ever added again, //! so deleting a transport later does not pull in a replacement. +use std::collections::BTreeSet; use std::pin::Pin; use anyhow::Result; @@ -53,18 +54,25 @@ const DEFAULT_RELAY_CANDIDATES: &[&str] = &[ pub(crate) async fn init_transports_inner( context: &Context, addrs_from_qr: Vec, + skip_network: bool, ) -> Result<(), anyhow::Error> { - let mut candidates: Vec<&str> = DEFAULT_RELAY_CANDIDATES.into(); - candidates.shuffle(&mut rng()); + let mut default_relays: Vec<&str> = DEFAULT_RELAY_CANDIDATES.into(); + default_relays.shuffle(&mut rng()); let (relays_sender, relays_receiver) = async_channel::unbounded::(); - for addr in addrs_from_qr { - let email = EmailAddress::new(&addr)?; - relays_sender.try_send(email.domain)?; - } - for relay in candidates { + let relays_from_qr: BTreeSet<_> = addrs_from_qr + .into_iter() + .filter_map(|addr| EmailAddress::new(&addr).ok()) + .map(|email| email.domain) + .collect(); + for relay in &relays_from_qr { relays_sender.try_send(relay.to_string())?; } + for relay in default_relays { + if !relays_from_qr.contains(relay) { + relays_sender.try_send(relay.to_string())?; + } + } let mut join_set = JoinSet::new(); for _ in 0..NUM_TRANSPORTS_TARGET { @@ -80,7 +88,6 @@ pub(crate) async fn init_transports_inner( return false; // No more relays to try }; let param = login_param_from_host(&host); - let skip_network = false; let res = crate::configure::configure(&context, ¶m, skip_network).await; if let Err(err) = res { warn!(context, "Failed to init transport {host}: {err:#}."); diff --git a/src/configure.rs b/src/configure.rs index 50885d4ce..c54574177 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -217,7 +217,8 @@ impl Context { } } - autorelay::init_transports_inner(self, addrs_from_qr).await?; + let skip_network = false; + autorelay::init_transports_inner(self, addrs_from_qr, skip_network).await?; self.start_io().await;