Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 17 additions & 14 deletions ts_control_serde/src/dns.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand All @@ -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<Option<Resolver<'a>>>,
pub resolvers: Vec<Option<Resolver>>,

/// Map of DNS name suffixes to a set of resolvers to use.
///
Expand All @@ -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<Vec<Option<Resolver<'a>>>>>,
pub routes: BTreeMap<&'a str, Option<Vec<Option<Resolver>>>>,

/// 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: <https://github.com/tailscale/tailscale/issues/1743>
pub fallback_resolvers: Vec<Option<Resolver<'a>>>,
pub fallback_resolvers: Vec<Option<Resolver>>,

/// Search domains to use.
///
Expand Down Expand Up @@ -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.
Expand All @@ -95,26 +98,26 @@ 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),

/// DNS over HTTPS.
///
/// 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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
Expand All @@ -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<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::Error;

let s = <&'a str as serde::Deserialize>::deserialize(deserializer)?;
let s = <String as serde::Deserialize>::deserialize(deserializer)?;

if s.starts_with("https://") {
return Ok(ResolverAddr::Https(s));
Expand Down
4 changes: 2 additions & 2 deletions ts_control_serde/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<DnsResolver<'a>>,
#[serde(rename = "ExitNodeDNSResolvers")]
pub exit_node_dns_resolvers: Vec<DnsResolver>,
}

pub mod legacy_derp_string {
Expand Down
3 changes: 3 additions & 0 deletions ts_control_serde/tests/data/map_response.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
]
},
Expand Down