From 799775e4a76ee5f0c1f3af57fd9a65032ed23876 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Thu, 25 Apr 2024 07:22:09 -0700 Subject: [PATCH] feat: allow domain name as endpoint address (#54) * Add dns resolution for peer endpoint * Handle both domain and IP endpoint * chore: bump version * Markdown links in function docstrings * Leave IP resolution to `to_socket_addr()` function --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/host.rs | 8 +++++++- src/netlink.rs | 2 +- src/utils.rs | 15 ++++++++++++++- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4fd697e..8adf014 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "defguard_wireguard_rs" -version = "0.4.2" +version = "0.4.3" dependencies = [ "base64", "env_logger", diff --git a/Cargo.toml b/Cargo.toml index 01a2948..8915892 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "defguard_wireguard_rs" -version = "0.4.2" +version = "0.4.3" edition = "2021" description = "A unified multi-platform high-level API for managing WireGuard interfaces" license = "Apache-2.0" diff --git a/src/host.rs b/src/host.rs index 2decbc7..ac84b47 100644 --- a/src/host.rs +++ b/src/host.rs @@ -16,7 +16,7 @@ use netlink_packet_wireguard::{ }; use serde::{Deserialize, Serialize}; -use crate::{key::Key, net::IpAddrMask}; +use crate::{error::WireguardInterfaceError, key::Key, net::IpAddrMask, utils::resolve}; /// WireGuard peer representation. #[derive(Debug, Default, PartialEq, Clone, Serialize, Deserialize)] @@ -53,6 +53,12 @@ impl Peer { self.allowed_ips = allowed_ips; } + /// Resolves endpoint address to [SocketAddr] and sets the field + pub fn set_endpoint(&mut self, endpoint: &str) -> Result<(), WireguardInterfaceError> { + self.endpoint = Some(resolve(endpoint)?); + Ok(()) + } + #[must_use] pub fn as_uapi_update(&self) -> String { let mut output = format!("public_key={}\n", self.public_key.to_lower_hex()); diff --git a/src/netlink.rs b/src/netlink.rs index 1788ad0..a642b73 100644 --- a/src/netlink.rs +++ b/src/netlink.rs @@ -121,7 +121,7 @@ where }); let responses = netlink_request_genl::(genlmsg, NLM_F_REQUEST | NLM_F_ACK)?; - match responses.get(0) { + match responses.first() { Some(NetlinkMessage { payload: NetlinkPayload::InnerMessage(GenlMessage { diff --git a/src/utils.rs b/src/utils.rs index f12f5ba..a97f1ee 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -3,7 +3,11 @@ use crate::netlink; use crate::{check_command_output_status, Peer, WireguardInterfaceError}; use std::{collections::HashSet, process::Command}; #[cfg(any(target_os = "linux", target_os = "freebsd"))] -use std::{io::Write, net::IpAddr, process::Stdio}; +use std::{ + io::Write, + net::{IpAddr, SocketAddr, ToSocketAddrs}, + process::Stdio, +}; #[cfg(target_os = "macos")] use std::{ io::{BufRead, BufReader, Cursor, Error as IoError}, @@ -340,3 +344,12 @@ pub(crate) fn clean_fwmark_rules(fwmark: u32) -> Result<(), WireguardInterfaceEr netlink::delete_main_table_rule(IpVersion::IPv6, 0)?; Ok(()) } + +/// Resolves domain name to [SocketAddr] +pub fn resolve(addr: &str) -> Result { + let error = || WireguardInterfaceError::PeerConfigurationError; + addr.to_socket_addrs() + .map_err(|_| error())? + .next() + .ok_or_else(error) +}