From 0c7e0c853545a7b7cb8664e75f017a68f6d46396 Mon Sep 17 00:00:00 2001 From: wonfen Date: Mon, 28 Sep 2026 13:06:47 +0800 Subject: [PATCH] fix(dns): persist DNS override confirmation across restarts A confirmed override on a profile with provider DNS was turned off at every startup; it now stays on until that profile's provider DNS changes. Refs #7993 --- Changelog.md | 1 + src-tauri/src/config/dns.rs | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Changelog.md b/Changelog.md index 15bf1dc5c..4fa85f218 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,7 @@ - 修复「代理集合」「规则集合」订阅响应较慢时更新误报失败、且不显示真实失败原因的问题 - 修复读屏软件将普通模式下的侧边栏导航项播报为不可用的可拖拽控件的问题 +- 修复订阅包含自定义 DNS 时,确认开启的 DNS 覆写在重启应用后被自动关闭的问题 **🖥️ Windows** diff --git a/src-tauri/src/config/dns.rs b/src-tauri/src/config/dns.rs index 8c7efaf19..e649b25a2 100644 --- a/src-tauri/src/config/dns.rs +++ b/src-tauri/src/config/dns.rs @@ -108,8 +108,7 @@ impl DnsOverrideState { #[derive(Debug, Clone, Default, Deserialize, Serialize)] pub struct ProfileDnsSettings { pub enabled: bool, - // Force-enable confirmation is valid only for the current app session. - #[serde(skip)] + #[serde(default, skip_serializing_if = "Option::is_none")] pub confirmation: Option, } @@ -195,7 +194,7 @@ mod tests { } #[test] - fn dns_override_confirmation_expires_on_restart() -> Result<()> { + fn dns_override_confirmation_survives_restart_only_for_the_same_source() -> Result<()> { let source = Some("provider-dns".into()); let confirmed = IVerge { profile_dns_settings: [( @@ -208,15 +207,22 @@ mod tests { .into(), ..IVerge::default() }; - let settings = confirmed.dns_settings_for("one"); - assert!(DnsOverrideState::new("one", source.clone(), settings.enabled, settings.confirmation).enabled); - for saved in [ - serde_yaml_ng::to_string(&confirmed)?, - "enable_dns_settings: true\ndns_override_confirmation: provider-dns".to_owned(), + let saved = serde_yaml_ng::to_string(&confirmed)?; + let mut restarted: IVerge = serde_yaml_ng::from_str(&saved)?; + let settings = restarted.dns_settings_for("one"); + let state = DnsOverrideState::new("one", source.clone(), settings.enabled, settings.confirmation); + assert!(state.enabled); + assert!(!state.apply_to(&mut restarted)); + for (saved, source) in [ + (saved, Some("updated".into())), + ( + "enable_dns_settings: true\ndns_override_confirmation: provider-dns".to_owned(), + source, + ), ] { let mut restarted: IVerge = serde_yaml_ng::from_str(&saved)?; let settings = restarted.dns_settings_for("one"); - let state = DnsOverrideState::new("one", source.clone(), settings.enabled, settings.confirmation); + let state = DnsOverrideState::new("one", source, settings.enabled, settings.confirmation); assert!(!state.enabled, "a previous session must not bypass startup protection"); assert!(state.apply_to(&mut restarted)); assert!(!restarted.dns_settings_for("one").enabled);