diff --git a/easytier/src/core.rs b/easytier/src/core.rs index 3ff6dc89..5c4d7aa2 100644 --- a/easytier/src/core.rs +++ b/easytier/src/core.rs @@ -1200,21 +1200,33 @@ impl NetworkOptions { cfg.set_udp_whitelist(old_udp_whitelist); if let Some(stun_servers) = &self.stun_servers { - let mut old_stun_servers = cfg.get_stun_servers().unwrap_or_default(); - old_stun_servers.extend(stun_servers.iter().cloned()); - cfg.set_stun_servers(Some(old_stun_servers)); + if stun_servers.is_empty() { + cfg.set_stun_servers(Some(Vec::new())); + } else { + let mut old_stun_servers = cfg.get_stun_servers().unwrap_or_default(); + old_stun_servers.extend(stun_servers.iter().cloned()); + cfg.set_stun_servers(Some(old_stun_servers)); + } } if let Some(stun_servers_v6) = &self.stun_servers_v6 { - let mut old_stun_servers_v6 = cfg.get_stun_servers_v6().unwrap_or_default(); - old_stun_servers_v6.extend(stun_servers_v6.iter().cloned()); - cfg.set_stun_servers_v6(Some(old_stun_servers_v6)); + if stun_servers_v6.is_empty() { + cfg.set_stun_servers_v6(Some(Vec::new())); + } else { + let mut old_stun_servers_v6 = cfg.get_stun_servers_v6().unwrap_or_default(); + old_stun_servers_v6.extend(stun_servers_v6.iter().cloned()); + cfg.set_stun_servers_v6(Some(old_stun_servers_v6)); + } } if let Some(tcp_stun_servers) = &self.tcp_stun_servers { - let mut old_tcp_stun_servers = cfg.get_tcp_stun_servers().unwrap_or_default(); - old_tcp_stun_servers.extend(tcp_stun_servers.iter().cloned()); - cfg.set_tcp_stun_servers(Some(old_tcp_stun_servers)); + if tcp_stun_servers.is_empty() { + cfg.set_tcp_stun_servers(Some(Vec::new())); + } else { + let mut old_tcp_stun_servers = cfg.get_tcp_stun_servers().unwrap_or_default(); + old_tcp_stun_servers.extend(tcp_stun_servers.iter().cloned()); + cfg.set_tcp_stun_servers(Some(old_tcp_stun_servers)); + } } Ok(()) } @@ -1789,4 +1801,29 @@ enabled = true assert_eq!(identity.network_secret_digest, None); assert_eq!(cfg.get_hostname(), "override-host"); } + + #[test] + fn empty_stun_server_options_clear_existing_config() { + let cfg = TomlConfigLoader::new_from_str( + r#" +stun_servers = ["udp.example.com:3478"] +stun_servers_v6 = ["v6.example.com:3478"] +tcp_stun_servers = ["tcp.example.com:3478"] +"#, + ) + .unwrap(); + + NetworkOptions { + stun_servers: Some(Vec::new()), + stun_servers_v6: Some(Vec::new()), + tcp_stun_servers: Some(Vec::new()), + ..Default::default() + } + .merge_into(&cfg) + .unwrap(); + + assert_eq!(cfg.get_stun_servers(), Some(Vec::new())); + assert_eq!(cfg.get_stun_servers_v6(), Some(Vec::new())); + assert_eq!(cfg.get_tcp_stun_servers(), Some(Vec::new())); + } }