diff --git a/ts_control_serde/src/dns.rs b/ts_control_serde/src/dns.rs index b9571bea..2d4bd0e9 100644 --- a/ts_control_serde/src/dns.rs +++ b/ts_control_serde/src/dns.rs @@ -1,4 +1,8 @@ -use alloc::{collections::BTreeMap, string::ToString, vec::Vec}; +use alloc::{ + collections::BTreeMap, + string::{String, ToString}, + vec::Vec, +}; use core::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use serde::{Deserializer, Serializer}; @@ -8,7 +12,7 @@ use serde::{Deserializer, Serializer}; #[serde(default, rename_all = "PascalCase")] pub struct Config<'a> { /// DNS resolvers to use, in order of preference. - pub resolvers: Vec>>, + pub resolvers: Vec>, /// Map of DNS name suffixes to a set of resolvers to use. /// @@ -20,13 +24,13 @@ pub struct Config<'a> { /// If the value is `None` or empty, the suffix should still be handled by Tailscale's /// built-in resolver `100.100.100.100`, such as for the purpose of handling /// `extra_records`. - pub routes: BTreeMap<&'a str, Option>>>>, + pub routes: BTreeMap<&'a str, Option>>>, /// Like [`resolvers`][Config::resolvers], but only used if split DNS is requested /// in a configuration that doesn't work yet without explicit default resolvers. /// /// See: - pub fallback_resolvers: Vec>>, + pub fallback_resolvers: Vec>, /// Search domains to use. /// @@ -71,10 +75,9 @@ pub struct Config<'a> { /// Configuration for one DNS resolver. #[derive(serde::Deserialize, serde::Serialize, Debug, Clone)] #[serde(rename_all = "PascalCase")] -pub struct Resolver<'a> { +pub struct Resolver { /// The address of the DNS resolver, as described by [`ResolverAddr`]. - #[serde(borrow)] - pub addr: ResolverAddr<'a>, + pub addr: ResolverAddr, /// Optional suggested resolution for a DNS-over-TLS or DNS-over-HTTPS resolver, if the /// URL doesn't reference an IP address directly. @@ -95,7 +98,7 @@ pub struct Resolver<'a> { /// The address of a DNS resolver. #[derive(Debug, Clone)] -pub enum ResolverAddr<'a> { +pub enum ResolverAddr { /// Classic plaintext DNS on the given address. Plaintext(SocketAddr), @@ -103,18 +106,18 @@ pub enum ResolverAddr<'a> { /// /// As of 2022-09-08, only used for certain well-known resolvers, so bootstrapping isn't /// required. - Https(&'a str), + Https(String), /// DNS over HTTP over WireGuard. /// /// Implemented in the peer API for exit nodes and app connectors. - HttpWireguard(&'a str), + HttpWireguard(String), /// DNS over TLS. - Tls(&'a str), + Tls(String), } -impl serde::Serialize for ResolverAddr<'_> { +impl serde::Serialize for ResolverAddr { fn serialize(&self, serializer: S) -> Result where S: Serializer, @@ -133,14 +136,14 @@ impl serde::Serialize for ResolverAddr<'_> { } } -impl<'a, 'de: 'a> serde::Deserialize<'de> for ResolverAddr<'a> { +impl<'de> serde::Deserialize<'de> for ResolverAddr { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { use serde::de::Error; - let s = <&'a str as serde::Deserialize>::deserialize(deserializer)?; + let s = ::deserialize(deserializer)?; if s.starts_with("https://") { return Ok(ResolverAddr::Https(s)); diff --git a/ts_control_serde/src/node.rs b/ts_control_serde/src/node.rs index 51e0e0d7..438b46f3 100644 --- a/ts_control_serde/src/node.rs +++ b/ts_control_serde/src/node.rs @@ -243,8 +243,8 @@ pub struct Node<'a> { /// The list of DNS servers that should be used when this node is WireGuard-only and being used /// as an exit node. - #[serde(rename = "ExitNodeDNSResolvers", borrow)] - pub exit_node_dns_resolvers: Vec>, + #[serde(rename = "ExitNodeDNSResolvers")] + pub exit_node_dns_resolvers: Vec, } pub mod legacy_derp_string { diff --git a/ts_control_serde/tests/data/map_response.json b/ts_control_serde/tests/data/map_response.json index 900d5c9c..5bf742dd 100644 --- a/ts_control_serde/tests/data/map_response.json +++ b/ts_control_serde/tests/data/map_response.json @@ -1178,6 +1178,9 @@ }, { "Addr": "2620:111:8007::53" + }, + { + "Addr": "https://dns.nextdns.io/abc123?device_id=12345\u0026device_name=nextdns-test\u0026device_model=potato4\u0026device_ip=100.123.123.123" } ] },