Skip to content

Commit 799775e

Browse files
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
1 parent 4a0429a commit 799775e

File tree

5 files changed

+24
-5
lines changed

5 files changed

+24
-5
lines changed

Diff for: Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "defguard_wireguard_rs"
3-
version = "0.4.2"
3+
version = "0.4.3"
44
edition = "2021"
55
description = "A unified multi-platform high-level API for managing WireGuard interfaces"
66
license = "Apache-2.0"

Diff for: src/host.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use netlink_packet_wireguard::{
1616
};
1717
use serde::{Deserialize, Serialize};
1818

19-
use crate::{key::Key, net::IpAddrMask};
19+
use crate::{error::WireguardInterfaceError, key::Key, net::IpAddrMask, utils::resolve};
2020

2121
/// WireGuard peer representation.
2222
#[derive(Debug, Default, PartialEq, Clone, Serialize, Deserialize)]
@@ -53,6 +53,12 @@ impl Peer {
5353
self.allowed_ips = allowed_ips;
5454
}
5555

56+
/// Resolves endpoint address to [SocketAddr] and sets the field
57+
pub fn set_endpoint(&mut self, endpoint: &str) -> Result<(), WireguardInterfaceError> {
58+
self.endpoint = Some(resolve(endpoint)?);
59+
Ok(())
60+
}
61+
5662
#[must_use]
5763
pub fn as_uapi_update(&self) -> String {
5864
let mut output = format!("public_key={}\n", self.public_key.to_lower_hex());

Diff for: src/netlink.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ where
121121
});
122122
let responses = netlink_request_genl::<GenlCtrl>(genlmsg, NLM_F_REQUEST | NLM_F_ACK)?;
123123

124-
match responses.get(0) {
124+
match responses.first() {
125125
Some(NetlinkMessage {
126126
payload:
127127
NetlinkPayload::InnerMessage(GenlMessage {

Diff for: src/utils.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ use crate::netlink;
33
use crate::{check_command_output_status, Peer, WireguardInterfaceError};
44
use std::{collections::HashSet, process::Command};
55
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
6-
use std::{io::Write, net::IpAddr, process::Stdio};
6+
use std::{
7+
io::Write,
8+
net::{IpAddr, SocketAddr, ToSocketAddrs},
9+
process::Stdio,
10+
};
711
#[cfg(target_os = "macos")]
812
use std::{
913
io::{BufRead, BufReader, Cursor, Error as IoError},
@@ -340,3 +344,12 @@ pub(crate) fn clean_fwmark_rules(fwmark: u32) -> Result<(), WireguardInterfaceEr
340344
netlink::delete_main_table_rule(IpVersion::IPv6, 0)?;
341345
Ok(())
342346
}
347+
348+
/// Resolves domain name to [SocketAddr]
349+
pub fn resolve(addr: &str) -> Result<SocketAddr, WireguardInterfaceError> {
350+
let error = || WireguardInterfaceError::PeerConfigurationError;
351+
addr.to_socket_addrs()
352+
.map_err(|_| error())?
353+
.next()
354+
.ok_or_else(error)
355+
}

0 commit comments

Comments
 (0)