Fix parsing of IPv6 DNS server addresses

This commit is contained in:
mdecimus
2024-04-18 11:13:20 +02:00
parent 3cc3b726ea
commit 03c0a6e328
4 changed files with 135 additions and 116 deletions

View File

@@ -23,7 +23,7 @@
use std::{
io::Cursor,
net::{Ipv4Addr, Ipv6Addr},
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr},
sync::Arc,
time::Duration,
};
@@ -31,7 +31,7 @@ use std::{
use ahash::{AHashMap, AHashSet};
use arc_swap::ArcSwap;
use base64::{engine::general_purpose::STANDARD, Engine};
use dns_update::{DnsUpdater, TsigAlgorithm};
use dns_update::{providers::rfc2136::DnsAddress, DnsUpdater, TsigAlgorithm};
use rcgen::generate_simple_self_signed;
use rustls::{
crypto::ring::sign::any_supported_type,
@@ -218,18 +218,18 @@ fn build_dns_updater(config: &mut Config, acme_id: &str) -> Option<DnsUpdater> {
)
})
.ok()?;
let host = config.value_require(("acme", acme_id, "host"))?.to_string();
let host = config.property_require::<IpAddr>(("acme", acme_id, "host"))?;
let port = config
.property_or_default::<u16>(("acme", acme_id, "port"), "53")
.unwrap_or(53);
let protocol = if config.value(("acme", acme_id, "protocol")) == Some("tcp") {
"tcp"
let addr = if config.value(("acme", acme_id, "protocol")) == Some("tcp") {
DnsAddress::Tcp(SocketAddr::new(host, port))
} else {
"udp"
DnsAddress::Udp(SocketAddr::new(host, port))
};
DnsUpdater::new_rfc2136_tsig(
format!("{protocol}://{host}:{port}"),
addr,
config.value_require(("acme", acme_id, "key"))?.to_string(),
key,
algorithm,

View File

@@ -113,21 +113,33 @@ impl Resolvers {
} else {
(Protocol::Udp, url)
};
let (host, port) = if let Some((host, port)) = host.split_once(':') {
let (host, port) = if let Some(host) = host.strip_prefix('[') {
let (host, maybe_port) = host.rsplit_once(']').unwrap_or_default();
(
host.to_string(),
port.parse::<u16>()
.map_err(|err| {
config.new_parse_error(
"resolver.custom",
format!("Invalid custom resolver port {port:?}: {err}"),
);
})
.unwrap_or(53),
host,
maybe_port
.rsplit_once(':')
.map(|(_, port)| port)
.unwrap_or("53"),
)
} else if let Some((host, port)) = host.split_once(':') {
(host, port)
} else {
(host, 53)
(host.as_str(), "53")
};
let port = port
.parse::<u16>()
.map_err(|err| {
config.new_parse_error(
"resolver.custom",
format!("Invalid custom resolver port {port:?}: {err}"),
);
})
.unwrap_or(53);
let host = host
.parse::<IpAddr>()
.map_err(|err| {