diff --git a/Changelog.md b/Changelog.md index 38fde271b..389aaf81e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,7 @@ - 修复「代理集合」「规则集合」订阅响应较慢时更新误报失败、且不显示真实失败原因的问题 - 修复读屏软件将普通模式下的侧边栏导航项播报为不可用的可拖拽控件的问题 +- 修复订阅包含自定义 DNS 时,确认开启的 DNS 覆写在重启应用后被自动关闭的问题 - 修复通过 URL 导入订阅时,即使导入的订阅并非当前使用的订阅,也会重新加载当前配置的问题 **🖥️ 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);