diff --git a/src/configure.rs b/src/configure.rs index 59f624ed5..09a4d86e4 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -13,6 +13,8 @@ mod auto_mozilla; mod auto_outlook; pub(crate) mod server_params; +use std::net::IpAddr; + use anyhow::{Context as _, Result, bail, ensure, format_err}; use auto_mozilla::moz_autoconfigure; use auto_outlook::outlk_autodiscover; @@ -557,6 +559,25 @@ async fn configure(ctx: &Context, param: &EnteredLoginParam) -> Result = Vec::new(); + for ip in ¶m.dns_prefill { + match ip.parse::() { + Ok(ip) => ips.push(ip), + Err(err) => { + error!( + ctx, + "IP address prefill failed: parsing of address '{ip}' failed: {err}" + ); + } + } + } + ctx.dns_memory_cache + .write() + .await + .insert(param.imap.server.clone(), ips); + } + let configured_param = get_configured_param(ctx, param).await?; let proxy_config = ProxyConfig::load(ctx).await?; let strict_tls = configured_param.strict_tls(proxy_config.is_some()); diff --git a/src/context.rs b/src/context.rs index 5461dc824..367aaf3ee 100644 --- a/src/context.rs +++ b/src/context.rs @@ -318,6 +318,11 @@ pub struct InnerContext { ) -> mail_builder::mime::MimePart<'a>, >, >, + + /// Short lived DNS cache which only lives in memory. + /// Used for configuration from `dcaccount` links with ip address. + /// Like `dcaccount:example.org?a=127.0.0.1,[::1]` + pub(crate) dns_memory_cache: Arc>>>, } /// The state of ongoing process. diff --git a/src/net/dns.rs b/src/net/dns.rs index ac6956446..6165e5f19 100644 --- a/src/net/dns.rs +++ b/src/net/dns.rs @@ -860,6 +860,14 @@ pub(crate) async fn lookup_host_with_cache( } } } + if let Some(ips) = context.dns_memory_cache.read().await.get(hostname) { + for ip in ips { + let addr = SocketAddr::new(*ip, port); + if !cache.contains(&addr) { + cache.push(addr); + } + } + } merge_with_cache(resolved_addrs, cache) } else {