diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 30628bf..97ded5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,24 +18,26 @@ env: jobs: test: runs-on: [self-hosted, Linux, X64] - container: rust:1.80 + container: rust:1-slim steps: - - name: Debug - run: echo ${{ github.ref_name }} - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive + uses: actions/checkout@v5 + - name: Cache uses: Swatinem/rust-cache@v2 with: key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - name: Check format run: | rustup component add rustfmt cargo fmt -- --check + - name: Run cargo deny - uses: EmbarkStudios/cargo-deny-action@v2 + run: | + cargo install cargo-deny + cargo deny check + - name: Run tests run: cargo test --locked --no-fail-fast diff --git a/Cargo.lock b/Cargo.lock index 79bf09d..3f2bc08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -43,30 +43,24 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", "windows-sys", ] -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - [[package]] name = "autocfg" version = "1.5.0" @@ -81,9 +75,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "byteorder" @@ -99,9 +93,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -152,7 +146,7 @@ dependencies = [ [[package]] name = "defguard_wireguard_rs" -version = "0.7.5" +version = "0.7.6" dependencies = [ "base64", "env_logger", @@ -167,7 +161,7 @@ dependencies = [ "nix", "serde", "serde_test", - "thiserror 2.0.12", + "thiserror", "x25519-dalek", ] @@ -243,15 +237,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "memchr" @@ -270,66 +264,55 @@ dependencies = [ [[package]] name = "netlink-packet-core" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +checksum = "745d789fe0958caf7252f5e1e900ce5c09b6a5bf05c7bba02a9cc600866ce31e" dependencies = [ - "anyhow", - "byteorder", - "netlink-packet-utils", + "pastey", ] [[package]] name = "netlink-packet-generic" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd7eb8ad331c84c6b8cb7f685b448133e5ad82e1ffd5acafac374af4a5a308b" +checksum = "2f891b2e0054cac5a684a06628f59568f841c93da4e551239da6e518f539e775" dependencies = [ - "anyhow", - "byteorder", "netlink-packet-core", - "netlink-packet-utils", ] [[package]] name = "netlink-packet-route" -version = "0.22.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0e7987b28514adf555dc1f9a5c30dfc3e50750bbaffb1aec41ca7b23dcd8e4" +checksum = "3ec2f5b6839be2a19d7fa5aab5bc444380f6311c2b693551cb80f45caaa7b5ef" dependencies = [ - "anyhow", "bitflags", - "byteorder", "libc", "log", "netlink-packet-core", - "netlink-packet-utils", ] [[package]] name = "netlink-packet-utils" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +checksum = "3176f18d11a1ae46053e59ec89d46ba318ae1343615bd3f8c908bfc84edae35c" dependencies = [ - "anyhow", "byteorder", - "paste", - "thiserror 1.0.69", + "pastey", + "thiserror", ] [[package]] name = "netlink-packet-wireguard" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b25b050ff1f6a1e23c6777b72db22790fe5b6b5ccfd3858672587a79876c8f" +checksum = "598962d9067d3153a00106da10e7b8276cea68f396f4a22f5b4a079270d92e29" dependencies = [ - "anyhow", - "byteorder", "libc", "log", + "netlink-packet-core", "netlink-packet-generic", - "netlink-packet-utils", ] [[package]] @@ -363,10 +346,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] -name = "paste" -version = "1.0.15" +name = "pastey" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "portable-atomic" @@ -385,9 +368,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -412,9 +395,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -424,9 +407,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -435,9 +418,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "rustc_version" @@ -491,9 +474,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -502,38 +485,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", @@ -558,21 +521,28 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.52.6" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", @@ -585,51 +555,51 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "x25519-dalek" diff --git a/Cargo.toml b/Cargo.toml index 0aaa63d..b4c3844 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "defguard_wireguard_rs" -version = "0.7.5" -edition = "2021" -rust-version = "1.80" +version = "0.7.6" +edition = "2024" +rust-version = "1.85" description = "A unified multi-platform high-level API for managing WireGuard interfaces" license = "Apache-2.0" readme = "README.md" @@ -27,10 +27,10 @@ libc = { version = "0.2", default-features = false } nix = { version = "0.30", features = ["ioctl", "socket"] } [target.'cfg(target_os = "linux")'.dependencies] -netlink-packet-core = "0.7" -netlink-packet-generic = "0.3" -netlink-packet-route = "0.22" -netlink-packet-utils = "0.5" +netlink-packet-core = "0.8" +netlink-packet-generic = "0.4" +netlink-packet-route = "0.25" +netlink-packet-utils = "0.6" netlink-packet-wireguard = "0.2" netlink-sys = "0.8" diff --git a/examples/client.rs b/examples/client.rs index fe5c1be..bc6f6e6 100644 --- a/examples/client.rs +++ b/examples/client.rs @@ -1,8 +1,8 @@ use std::{net::SocketAddr, str::FromStr}; use defguard_wireguard_rs::{ - host::Peer, key::Key, net::IpAddrMask, InterfaceConfiguration, Kernel, WGApi, - WireguardInterfaceApi, + InterfaceConfiguration, Kernel, WGApi, WireguardInterfaceApi, host::Peer, key::Key, + net::IpAddrMask, }; use x25519_dalek::{EphemeralSecret, PublicKey}; diff --git a/examples/server.rs b/examples/server.rs index 158455e..970a190 100644 --- a/examples/server.rs +++ b/examples/server.rs @@ -1,8 +1,8 @@ use std::str::FromStr; use defguard_wireguard_rs::{ - host::Peer, key::Key, net::IpAddrMask, InterfaceConfiguration, Kernel, WGApi, - WireguardInterfaceApi, + InterfaceConfiguration, Kernel, WGApi, WireguardInterfaceApi, host::Peer, key::Key, + net::IpAddrMask, }; use x25519_dalek::{EphemeralSecret, PublicKey}; diff --git a/examples/userspace.rs b/examples/userspace.rs index 2aeedf5..6020bda 100644 --- a/examples/userspace.rs +++ b/examples/userspace.rs @@ -1,5 +1,5 @@ #[cfg(target_os = "macos")] -use std::io::{stdin, stdout, Read, Write}; +use std::io::{Read, Write, stdin, stdout}; #[cfg(target_os = "macos")] use defguard_wireguard_rs::{Userspace, WGApi, WireguardInterfaceApi}; diff --git a/src/bsd/ifconfig.rs b/src/bsd/ifconfig.rs index d38fad4..a28212d 100644 --- a/src/bsd/ifconfig.rs +++ b/src/bsd/ifconfig.rs @@ -3,13 +3,12 @@ use std::{ os::fd::AsRawFd, }; -use libc::{IFF_UP, IF_NAMESIZE}; +use libc::{IF_NAMESIZE, IFF_UP}; use nix::{ioctl_readwrite, ioctl_write_ptr, sys::socket::AddressFamily}; use super::{ - create_socket, + IoError, create_socket, sockaddr::{SockAddrIn, SockAddrIn6}, - IoError, }; // From `netinet6/in6.h`. diff --git a/src/bsd/mod.rs b/src/bsd/mod.rs index b57a706..2b479c3 100644 --- a/src/bsd/mod.rs +++ b/src/bsd/mod.rs @@ -8,7 +8,7 @@ mod wgio; use std::{ collections::HashMap, ffi::{CStr, CString}, - mem::{size_of, MaybeUninit}, + mem::{MaybeUninit, size_of}, net::IpAddr, os::fd::OwnedFd, ptr::from_ref, @@ -17,7 +17,7 @@ use std::{ use nix::{ errno::Errno, - sys::socket::{socket, AddressFamily, SockFlag, SockType}, + sys::socket::{AddressFamily, SockFlag, SockType, socket}, }; use route::{DestAddrMask, GatewayLink}; use sockaddr::{SockAddrDl, SockAddrIn, SockAddrIn6, SocketFromRaw}; @@ -32,9 +32,9 @@ use self::{ wgio::{WgReadIo, WgWriteIo}, }; use crate::{ + IpVersion, Key, WireguardInterfaceError, host::{Host, Peer}, net::IpAddrMask, - IpVersion, Key, WireguardInterfaceError, }; // Note: these values differ across different platforms. @@ -68,12 +68,12 @@ static NV_IPV6: &str = "ipv6"; /// Cast bytes to `T`. unsafe fn cast_ref(bytes: &[u8]) -> &T { - bytes.as_ptr().cast::().as_ref().unwrap() + unsafe { bytes.as_ptr().cast::().as_ref().unwrap() } } /// Cast `T' to bytes. unsafe fn cast_bytes(p: &T) -> &[u8] { - from_raw_parts(from_ref::(p).cast::(), size_of::()) + unsafe { from_raw_parts(from_ref::(p).cast::(), size_of::()) } } /// Create socket for ioctl communication. diff --git a/src/bsd/nvlist.rs b/src/bsd/nvlist.rs index 48be663..27fdf77 100644 --- a/src/bsd/nvlist.rs +++ b/src/bsd/nvlist.rs @@ -182,7 +182,7 @@ impl<'a> NvList<'a> { } /// Get value for a given `name`. - fn get(&self, name: &str) -> Option<&NvValue> { + fn get(&self, name: &str) -> Option<&NvValue<'_>> { self.items.iter().find(|(n, _)| n == &name).map(|(_, v)| v) } @@ -219,7 +219,7 @@ impl<'a> NvList<'a> { } /// Get value as `Vec` - pub fn get_nvlist_array(&self, name: &str) -> Option<&[NvList]> { + pub fn get_nvlist_array(&self, name: &str) -> Option<&[NvList<'_>]> { self.get(name).and_then(|value| match value { NvValue::NvListArray(array) => Some(array.as_slice()), _ => None, @@ -394,10 +394,14 @@ impl<'a> NvList<'a> { NvValue::Binary(bytes) => buf.extend_from_slice(bytes), NvValue::Bytes(bytes) => buf.extend_from_slice(bytes.as_slice()), NvValue::BoolArray(array) => { - array.iter().for_each(|boolean| buf.push((*boolean).into())); + for boolean in array { + buf.push((*boolean).into()); + } } NvValue::NumberArray(array) => { - array.iter().for_each(|number| self.store_u64(*number, buf)); + for number in array { + self.store_u64(*number, buf); + } } NvValue::StringArray(array) => { for string in array { diff --git a/src/bsd/route.rs b/src/bsd/route.rs index 7e03c34..f74dce1 100644 --- a/src/bsd/route.rs +++ b/src/bsd/route.rs @@ -1,20 +1,19 @@ use std::{ ffi::{CStr, CString}, - mem::{size_of, MaybeUninit}, + mem::{MaybeUninit, size_of}, net::IpAddr, os::fd::{AsFd, AsRawFd}, }; use nix::{ errno::Errno, - sys::socket::{shutdown, socket, AddressFamily, Shutdown, SockFlag, SockType}, + sys::socket::{AddressFamily, Shutdown, SockFlag, SockType, shutdown, socket}, unistd::{read, write}, }; use super::{ - cast_bytes, cast_ref, - sockaddr::{unpack_sockaddr, SockAddrDl, SocketFromRaw}, - IoError, + IoError, cast_bytes, cast_ref, + sockaddr::{SockAddrDl, SocketFromRaw, unpack_sockaddr}, }; // Routing data types are not defined in libc crate, so define then here. diff --git a/src/bsd/sockaddr.rs b/src/bsd/sockaddr.rs index c6bed8b..4182c90 100644 --- a/src/bsd/sockaddr.rs +++ b/src/bsd/sockaddr.rs @@ -5,7 +5,7 @@ use std::{ ptr::{copy, from_mut}, }; -use super::{cast_bytes, cast_ref, AF_INET, AF_INET6, AF_LINK, SA_IN6_SIZE, SA_IN_SIZE}; +use super::{AF_INET, AF_INET6, AF_LINK, SA_IN_SIZE, SA_IN6_SIZE, cast_bytes, cast_ref}; pub(super) trait SocketFromRaw { unsafe fn from_raw(addr: *const libc::sockaddr) -> Option @@ -33,16 +33,18 @@ impl SockAddrIn { impl SocketFromRaw for SockAddrIn { /// Construct `SockAddrIn` from `libc::sockaddr`. unsafe fn from_raw(addr: *const libc::sockaddr) -> Option { - if addr.is_null() || (*addr).sa_family != AF_INET { - None - } else { - let mut sockaddr: Self = zeroed(); - copy( - addr.cast::(), - from_mut::(&mut sockaddr).cast::(), - (*addr).sa_len as usize, - ); - Some(sockaddr) + unsafe { + if addr.is_null() || (*addr).sa_family != AF_INET { + None + } else { + let mut sockaddr: Self = zeroed(); + copy( + addr.cast::(), + from_mut::(&mut sockaddr).cast::(), + (*addr).sa_len as usize, + ); + Some(sockaddr) + } } } } @@ -127,16 +129,18 @@ impl SockAddrIn6 { impl SocketFromRaw for SockAddrIn6 { /// Construct `SockAddrIn6` from `libc::sockaddr`. unsafe fn from_raw(addr: *const libc::sockaddr) -> Option { - if addr.is_null() || (*addr).sa_family != AF_INET6 { - None - } else { - let mut sockaddr: Self = zeroed(); - copy( - addr.cast::(), - from_mut::(&mut sockaddr).cast::(), - (*addr).sa_len as usize, - ); - Some(sockaddr) + unsafe { + if addr.is_null() || (*addr).sa_family != AF_INET6 { + None + } else { + let mut sockaddr: Self = zeroed(); + copy( + addr.cast::(), + from_mut::(&mut sockaddr).cast::(), + (*addr).sa_len as usize, + ); + Some(sockaddr) + } } } } diff --git a/src/bsd/wgio.rs b/src/bsd/wgio.rs index c495c7a..8057506 100644 --- a/src/bsd/wgio.rs +++ b/src/bsd/wgio.rs @@ -1,5 +1,5 @@ use std::{ - alloc::{alloc, dealloc, Layout}, + alloc::{Layout, alloc, dealloc}, os::fd::AsRawFd, ptr::null_mut, slice::from_raw_parts, @@ -8,7 +8,7 @@ use std::{ use libc::IF_NAMESIZE; use nix::{ioctl_readwrite, sys::socket::AddressFamily}; -use super::{create_socket, IoError}; +use super::{IoError, create_socket}; // FIXME: `WgReadIo` and `WgWriteIo` have to be declared public. ioctl_readwrite!(write_wireguard_data, b'i', 210, WgWriteIo); diff --git a/src/key.rs b/src/key.rs index 1998a89..2390d7b 100644 --- a/src/key.rs +++ b/src/key.rs @@ -6,11 +6,11 @@ use std::{ str::FromStr, }; -use base64::{prelude::BASE64_STANDARD, DecodeError, Engine}; +use base64::{DecodeError, Engine, prelude::BASE64_STANDARD}; #[cfg(feature = "serde")] use serde::{ - de::{Unexpected, Visitor}, Deserialize, Deserializer, Serialize, Serializer, + de::{Unexpected, Visitor}, }; use x25519_dalek::{PublicKey, StaticSecret}; @@ -221,7 +221,7 @@ mod tests { use super::*; #[cfg(feature = "serde")] - use serde_test::{assert_tokens, Token}; + use serde_test::{Token, assert_tokens}; // Same `Key` in different representations. static KEY_B64: &str = "AAECAwQFBgcICQoLDA0OD/Dh0sO0pZaHeGlaSzwtHg8="; diff --git a/src/netlink.rs b/src/netlink.rs index 3468fe7..c68365a 100644 --- a/src/netlink.rs +++ b/src/netlink.rs @@ -2,14 +2,15 @@ use std::{fmt::Debug, io::ErrorKind, net::IpAddr}; use netlink_packet_core::{ - NetlinkDeserializable, NetlinkMessage, NetlinkPayload, NetlinkSerializable, NLM_F_ACK, - NLM_F_CREATE, NLM_F_DUMP, NLM_F_EXCL, NLM_F_REPLACE, NLM_F_REQUEST, + NLM_F_ACK, NLM_F_CREATE, NLM_F_DUMP, NLM_F_EXCL, NLM_F_REPLACE, NLM_F_REQUEST, + NetlinkDeserializable, NetlinkMessage, NetlinkPayload, NetlinkSerializable, }; use netlink_packet_generic::{ - ctrl::{nlas::GenlCtrlAttrs, GenlCtrl, GenlCtrlCmd}, GenlFamily, GenlMessage, + ctrl::{GenlCtrl, GenlCtrlCmd, nlas::GenlCtrlAttrs}, }; use netlink_packet_route::{ + AddressFamily, RouteNetlinkMessage, address::{AddressAttribute, AddressMessage}, link::{InfoKind, LinkAttribute, LinkFlags, LinkHeader, LinkInfo, LinkMessage}, route::{ @@ -17,24 +18,22 @@ use netlink_packet_route::{ RouteType, }, rule::{RuleAction, RuleAttribute, RuleFlags, RuleHeader, RuleMessage}, - AddressFamily, RouteNetlinkMessage, }; -use netlink_packet_utils::errors::DecodeError; use netlink_packet_wireguard::{ + Wireguard, WireguardCmd, constants::WGPEER_F_REMOVE_ME, nlas::{WgDeviceAttrs, WgPeer, WgPeerAttrs}, - Wireguard, WireguardCmd, }; use netlink_sys::{ - constants::{NETLINK_GENERIC, NETLINK_ROUTE}, Socket, SocketAddr, + constants::{NETLINK_GENERIC, NETLINK_ROUTE}, }; use thiserror::Error; use crate::{ + IpVersion, Key, WireguardInterfaceError, host::{Host, Peer}, net::IpAddrMask, - IpVersion, Key, WireguardInterfaceError, }; const SOCKET_BUFFER_LENGTH: usize = 12288; @@ -50,7 +49,7 @@ pub(crate) enum NetlinkError { #[error("Socket error: {0}")] SocketError(String), #[error("Failed to read response")] - ResponseError(#[from] DecodeError), + ResponseError(#[from] netlink_packet_core::DecodeError), #[error("Netlink payload error: {0}")] PayloadError(netlink_packet_core::ErrorMessage), #[error("Failed to create WireGuard interface")] @@ -149,7 +148,7 @@ where message.set_resolved_family_id(*family_id); } _ => return Err(NetlinkError::UnexpectedPayload), - }; + } } netlink_request(message, flags, NETLINK_GENERIC) } @@ -208,7 +207,7 @@ where ErrorKind::AlreadyExists => Err(NetlinkError::FileAlreadyExists), ErrorKind::NotFound => Err(NetlinkError::NotFound), _ => Err(NetlinkError::PayloadError(msg)), - } + }; } _ => {} } diff --git a/src/utils.rs b/src/utils.rs index 36e0470..758e29b 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -10,19 +10,19 @@ use std::{io::Write, process::Stdio}; #[cfg(not(target_os = "windows"))] use std::{net::IpAddr, process::Command}; -#[cfg(any(target_os = "freebsd", target_os = "netbsd"))] -use crate::check_command_output_status; #[cfg(not(target_os = "windows"))] use crate::Peer; use crate::WireguardInterfaceError; +#[cfg(any(target_os = "freebsd", target_os = "netbsd"))] +use crate::check_command_output_status; #[cfg(any(target_os = "freebsd", target_os = "macos", target_os = "netbsd"))] use crate::{ + IpVersion, bsd::{add_gateway, add_linked_route, get_gateway}, net::IpAddrMask, - IpVersion, }; #[cfg(target_os = "linux")] -use crate::{check_command_output_status, netlink, IpVersion}; +use crate::{IpVersion, check_command_output_status, netlink}; #[cfg(any(target_os = "freebsd", target_os = "linux", target_os = "netbsd"))] pub(crate) fn configure_dns( @@ -321,7 +321,7 @@ pub(crate) fn add_peer_routing( ) -> Result<(), WireguardInterfaceError> { use nix::errno::Errno; - use crate::bsd::{delete_gateway, IoError}; + use crate::bsd::{IoError, delete_gateway}; debug!("Adding peer routing for interface: {ifname}"); for peer in peers { diff --git a/src/wgapi_freebsd.rs b/src/wgapi_freebsd.rs index acf69cc..d4d6fc8 100644 --- a/src/wgapi_freebsd.rs +++ b/src/wgapi_freebsd.rs @@ -1,11 +1,10 @@ use std::net::IpAddr; use crate::{ - bsd, + Host, InterfaceConfiguration, IpAddrMask, Key, Peer, WireguardInterfaceApi, + WireguardInterfaceError, bsd, utils::{add_peer_routing, clear_dns, configure_dns}, wgapi::{Kernel, WGApi}, - Host, InterfaceConfiguration, IpAddrMask, Key, Peer, WireguardInterfaceApi, - WireguardInterfaceError, }; /// Manages interfaces created with FreeBSD kernel WireGuard module. diff --git a/src/wgapi_linux.rs b/src/wgapi_linux.rs index a7e8f5a..3bdd30e 100644 --- a/src/wgapi_linux.rs +++ b/src/wgapi_linux.rs @@ -1,11 +1,10 @@ use std::net::IpAddr; use crate::{ - netlink, + Host, InterfaceConfiguration, IpAddrMask, Key, Peer, WireguardInterfaceApi, + WireguardInterfaceError, netlink, utils::{add_peer_routing, clean_fwmark_rules, clear_dns, configure_dns}, wgapi::{Kernel, WGApi}, - Host, InterfaceConfiguration, IpAddrMask, Key, Peer, WireguardInterfaceApi, - WireguardInterfaceError, }; /// Manages interfaces created with Linux kernel WireGuard module. diff --git a/src/wgapi_userspace.rs b/src/wgapi_userspace.rs index fde11a8..250f4a6 100644 --- a/src/wgapi_userspace.rs +++ b/src/wgapi_userspace.rs @@ -13,16 +13,15 @@ use crate::dependencies::check_external_dependencies; use crate::netlink; #[cfg(any(target_os = "freebsd", target_os = "linux", target_os = "netbsd"))] use crate::utils::clear_dns; -#[cfg(any(target_os = "freebsd", target_os = "macos", target_os = "netbsd"))] -use crate::{bsd, utils::resolve}; use crate::{ - check_command_output_status, + Host, InterfaceConfiguration, IpAddrMask, Key, Peer, check_command_output_status, error::WireguardInterfaceError, utils::{add_peer_routing, configure_dns}, wgapi::{Userspace, WGApi}, wireguard_interface::WireguardInterfaceApi, - Host, InterfaceConfiguration, IpAddrMask, Key, Peer, }; +#[cfg(any(target_os = "freebsd", target_os = "macos", target_os = "netbsd"))] +use crate::{bsd, utils::resolve}; const USERSPACE_EXECUTABLE: &str = "wireguard-go"; @@ -286,7 +285,10 @@ impl WireguardInterfaceApi for WGApi { debug!("Socket removed for interface {}", self.ifname); } Err(err) if err.kind() == io::ErrorKind::NotFound => { - debug!("Socket not found for interface {}, skipping removal as there is nothing to remove. Continuing with further cleanup.", self.ifname); + debug!( + "Socket not found for interface {}, skipping removal as there is nothing to remove. Continuing with further cleanup.", + self.ifname + ); } Err(err) => { return Err(WireguardInterfaceError::UnixSockerError(format!( @@ -298,7 +300,10 @@ impl WireguardInterfaceApi for WGApi { #[cfg(target_os = "macos")] { - debug!("Clearing DNS entries by applying an empty DNS list to all network services, interface {}", self.ifname); + debug!( + "Clearing DNS entries by applying an empty DNS list to all network services, interface {}", + self.ifname + ); configure_dns(&[], &[])?; } #[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "netbsd"))] @@ -366,7 +371,10 @@ impl WireguardInterfaceApi for WGApi { ); match self.read_host() { Ok(host) => { - debug!("Interface configuration and statistics read successfully for interface {}", self.ifname); + debug!( + "Interface configuration and statistics read successfully for interface {}", + self.ifname + ); trace!("Network information: {host:?}"); Ok(host) } diff --git a/src/wgapi_windows.rs b/src/wgapi_windows.rs index d227e2b..ccd67af 100644 --- a/src/wgapi_windows.rs +++ b/src/wgapi_windows.rs @@ -10,12 +10,12 @@ use std::{ }; use crate::{ + InterfaceConfiguration, WireguardInterfaceApi, error::WireguardInterfaceError, host::{Host, Peer}, key::Key, net::IpAddrMask, wgapi::{Kernel, WGApi}, - InterfaceConfiguration, WireguardInterfaceApi, }; /// Manages interfaces created with Windows kernel using https://git.zx2c4.com/wireguard-nt. @@ -51,7 +51,9 @@ impl WireguardInterfaceApi for WGApi { let mut file = File::create(&file_name)?; - debug!("WireGuard configuration file {file_name} created in {file_path}. Preparing configuration..."); + debug!( + "WireGuard configuration file {file_name} created in {file_path}. Preparing configuration..." + ); let address = config .addresses @@ -176,7 +178,9 @@ impl WireguardInterfaceApi for WGApi { counter += 1; } - debug!("Finished waiting for service to be removed, the service is considered to be removed, proceeding further"); + debug!( + "Finished waiting for service to be removed, the service is considered to be removed, proceeding further" + ); } debug!("Installing the new service for interface {}", self.ifname); @@ -189,7 +193,9 @@ impl WireguardInterfaceApi for WGApi { WireguardInterfaceError::ServiceInstallationFailed(err.to_string()) })?; - debug!("Done installing the new service. Service installation output: {service_installation_output:?}",); + debug!( + "Done installing the new service. Service installation output: {service_installation_output:?}", + ); if !service_installation_output.status.success() { let message = format!( @@ -213,7 +219,9 @@ impl WireguardInterfaceApi for WGApi { WireguardInterfaceError::ServiceInstallationFailed(err.to_string()) })?; - debug!("Done disabling automatic restart for the new service. Service update output: {service_update_output:?}",); + debug!( + "Done disabling automatic restart for the new service. Service update output: {service_update_output:?}", + ); if !service_update_output.status.success() { let message = format!( "Failed to configure WireGuard tunnel service: {:?}", diff --git a/src/wireguard_interface.rs b/src/wireguard_interface.rs index 384febe..9ed993f 100644 --- a/src/wireguard_interface.rs +++ b/src/wireguard_interface.rs @@ -1,6 +1,6 @@ use std::net::IpAddr; -use crate::{error::WireguardInterfaceError, Host, InterfaceConfiguration, IpAddrMask, Key, Peer}; +use crate::{Host, InterfaceConfiguration, IpAddrMask, Key, Peer, error::WireguardInterfaceError}; /// API for managing a WireGuard interface. ///