diff --git a/Cargo.lock b/Cargo.lock index d03f181..f7d6db6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "askama" @@ -142,9 +142,15 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.12.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "blake2" @@ -172,15 +178,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "camino" -version = "1.2.2" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" dependencies = [ "serde_core", ] @@ -210,9 +216,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.63" +version = "1.2.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" +checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38" dependencies = [ "find-msvc-tools", "shlex", @@ -238,7 +244,7 @@ checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -319,6 +325,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -326,7 +341,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "typenum", ] @@ -337,9 +352,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "fiat-crypto 0.2.9", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", "curve25519-dalek-derive", - "fiat-crypto", + "fiat-crypto 0.3.0", "rustc_version", "subtle", "zeroize", @@ -379,12 +409,12 @@ dependencies = [ "tracing", "uniffi", "untrusted", - "x25519-dalek", + "x25519-dalek 2.0.1", ] [[package]] name = "defguard_wireguard_rs" -version = "0.10.0" +version = "0.11.0" dependencies = [ "base64", "defguard_boringtun", @@ -406,7 +436,38 @@ dependencies = [ "tracing-subscriber", "windows", "wireguard-nt", - "x25519-dalek", + "x25519-dalek 3.0.0", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", ] [[package]] @@ -422,9 +483,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "1.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" dependencies = [ "log", "regex", @@ -432,9 +493,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" dependencies = [ "anstream", "anstyle", @@ -472,16 +533,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] -name = "find-msvc-tools" -version = "0.1.9" +name = "fiat-crypto" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" [[package]] -name = "foldhash" -version = "0.1.5" +name = "find-msvc-tools" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fs-err" @@ -515,15 +576,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", "r-efi", - "wasip2", - "wasip3", ] [[package]] @@ -543,15 +602,6 @@ dependencies = [ "scroll", ] -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - [[package]] name = "hashbrown" version = "0.17.1" @@ -579,12 +629,6 @@ dependencies = [ "digest", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "indexmap" version = "2.14.0" @@ -592,7 +636,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.1", + "hashbrown", "serde", "serde_core", ] @@ -648,10 +692,11 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.28" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4603d3033e49e2b0e31229fcab20a5d40089c607d975cd9c80551dc69eed9102" +checksum = "961d16382652bfdd8c6f68b223b26a8c93e0d475c672f414411db31c6c5c900e" dependencies = [ + "defmt", "jiff-static", "log", "portable-atomic", @@ -661,9 +706,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.28" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782d32378dddf207193ac91cefb848ad41abb58195c95168e1291227a0832b47" +checksum = "d0879bd39df99c4c5e2c6615ccc026391a423dde10532c573e6086eb94a802cc" dependencies = [ "proc-macro2", "quote", @@ -676,12 +721,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" version = "0.2.186" @@ -715,15 +754,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "memchr" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "minimal-lexical" @@ -751,11 +790,11 @@ dependencies = [ [[package]] name = "netlink-packet-route" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8919612f6028ab4eacbbfe1234a9a43e3722c6e0915e7ff519066991905092" +checksum = "e2288fcb784eb3defd5fb16f4c4160d5f477de192eac730f43e1d11c24d9a007" dependencies = [ - "bitflags", + "bitflags 2.13.0", "libc", "log", "netlink-packet-core", @@ -778,7 +817,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb217ca08c02978c3ea5ef0f013d20c602f2a17a9f00d9e4b1518a3500c2f332" dependencies = [ - "bitflags", + "bitflags 2.13.0", "libc", "log", "netlink-packet-core", @@ -802,7 +841,7 @@ version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ - "bitflags", + "bitflags 2.13.0", "cfg-if", "cfg_aliases", "libc", @@ -904,7 +943,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] @@ -924,16 +963,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.106" @@ -945,9 +974,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.45" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -967,20 +996,26 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.13.0", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2" dependencies = [ "aho-corasick", "memchr", @@ -990,9 +1025,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "1f388202e4b80542a0921078cc23b6333bcf1409c1e3f86404cae4766a6131db" dependencies = [ "aho-corasick", "memchr", @@ -1001,9 +1036,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "ring" @@ -1021,9 +1056,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -1040,7 +1075,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys", @@ -1167,21 +1202,21 @@ checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "smawk" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" [[package]] name = "socket2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -1207,9 +1242,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -1223,7 +1258,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -1280,9 +1315,9 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] @@ -1317,14 +1352,14 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tracing" @@ -1395,17 +1430,11 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "uniffi" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5f2297ee5b893405bed1a6929faec4713a061df158ecf5198089f23910d470" +checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" dependencies = [ "anyhow", "camino", @@ -1420,9 +1449,9 @@ dependencies = [ [[package]] name = "uniffi_bindgen" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bc0c60a9607e7ab77a2ad47ec5530178015014839db25af7512447d2238016c" +checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" dependencies = [ "anyhow", "askama", @@ -1446,9 +1475,9 @@ dependencies = [ [[package]] name = "uniffi_build" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c39413c43b955e4aa8a4e2b34bbd1b6b5ff6bd85532b52f9eb92fbe88c14458" +checksum = "744fe15bcd3e2b1712a4573a45ce749af19cf28d69027ca5789619014955668c" dependencies = [ "anyhow", "camino", @@ -1457,9 +1486,9 @@ dependencies = [ [[package]] name = "uniffi_core" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77baf5d539fe2e1ad6805e942dbc5dbdeb2b83eb5f2b3a6535d422ca4b02a12f" +checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" dependencies = [ "anyhow", "bytes", @@ -1469,9 +1498,9 @@ dependencies = [ [[package]] name = "uniffi_internal_macros" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b42137524f4be6400fcaca9d02c1d4ecb6ad917e4013c0b93235526d8396e5" +checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" dependencies = [ "anyhow", "indexmap", @@ -1482,9 +1511,9 @@ dependencies = [ [[package]] name = "uniffi_macros" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9273ec45330d8fe9a3701b7b983cea7a4e218503359831967cb95d26b873561" +checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" dependencies = [ "camino", "fs-err", @@ -1499,9 +1528,9 @@ dependencies = [ [[package]] name = "uniffi_meta" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "431d2f443e7828a6c29d188de98b6771a6491ee98bba2d4372643bf93f988a18" +checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" dependencies = [ "anyhow", "siphasher", @@ -1511,9 +1540,9 @@ dependencies = [ [[package]] name = "uniffi_pipeline" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761ef74f6175e15603d0424cc5f98854c5baccfe7bf4ccb08e5816f9ab8af689" +checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" dependencies = [ "anyhow", "heck", @@ -1524,9 +1553,9 @@ dependencies = [ [[package]] name = "uniffi_udl" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68773ec0e1c067b6505a73bbf6a5782f31a7f9209333a0df97b87565c46bf370" +checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" dependencies = [ "anyhow", "textwrap", @@ -1574,58 +1603,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasip2" -version = "1.0.3+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" -dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", -] - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap", - "semver", -] - [[package]] name = "weedle2" version = "5.0.0" @@ -1853,9 +1830,9 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" [[package]] name = "wireguard-nt" @@ -1863,7 +1840,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22b4dbcc6c93786cf22e420ef96e8976bfb92a455070282302b74de5848191f4" dependencies = [ - "bitflags", + "bitflags 2.13.0", "getrandom 0.2.17", "ipnet", "libloading", @@ -1874,125 +1851,43 @@ dependencies = [ ] [[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease", - "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" +name = "x25519-dalek" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", + "curve25519-dalek 4.1.3", + "rand_core 0.6.4", "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", + "zeroize", ] [[package]] name = "x25519-dalek" -version = "2.0.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +checksum = "e7e8131a03190127fb2263afc72b322ecadae46b6ff8c6f399ff5d02f5559af6" dependencies = [ - "curve25519-dalek", - "rand_core", - "serde", + "curve25519-dalek 5.0.0", + "getrandom 0.4.3", + "rand_core 0.10.1", "zeroize", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", @@ -2001,6 +1896,6 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index 9fd902a..066708c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "defguard_wireguard_rs" -version = "0.10.0" +version = "0.11.0" edition = "2024" -rust-version = "1.87" +rust-version = "1.91" description = "A unified multi-platform high-level API for managing WireGuard interfaces" license = "Apache-2.0" readme = "README.md" @@ -16,7 +16,7 @@ base64 = "0.22" log = "0.4" serde = { version = "1.0", features = ["derive"], optional = true } thiserror = "2.0" -x25519-dalek = { version = "2.0", features = ["getrandom", "static_secrets"] } +x25519-dalek = { version = "3.0", features = ["getrandom", "static_secrets"] } [dev-dependencies] env_logger = "0.11" @@ -43,7 +43,7 @@ wireguard-nt = "0.5" [target.'cfg(target_os = "linux")'.dependencies] netlink-packet-core = "0.8" netlink-packet-generic = "0.4" -netlink-packet-route = "0.30" +netlink-packet-route = "0.31" netlink-packet-utils = "0.6" netlink-packet-wireguard = "0.4" netlink-sys = "0.8" diff --git a/src/bsd/ifconfig.rs b/src/bsd/ifconfig.rs index 7dbcc3d..787290e 100644 --- a/src/bsd/ifconfig.rs +++ b/src/bsd/ifconfig.rs @@ -1,6 +1,7 @@ use std::{ net::{Ipv4Addr, Ipv6Addr}, os::fd::AsRawFd, + ptr::from_mut, }; use libc::{AF_INET, AF_INET6, AF_UNIX, IF_NAMESIZE, IFF_UP, c_ulong, ioctl}; @@ -94,9 +95,9 @@ impl IfReq { pub(super) fn create(&mut self) -> Result<(), IoError> { let socket = create_socket(AF_UNIX)?; #[cfg(target_os = "netbsd")] - let result = unsafe { ioctl(socket.as_raw_fd(), SIOCIFCREATE, &*self) }; + let result = unsafe { ioctl(socket.as_raw_fd(), SIOCIFCREATE, from_mut::(self)) }; #[cfg(any(target_os = "freebsd", target_os = "macos"))] - let result = unsafe { ioctl(socket.as_raw_fd(), SIOCIFCREATE2, &*self) }; + let result = unsafe { ioctl(socket.as_raw_fd(), SIOCIFCREATE2, from_mut::(self)) }; c_int_to_error(result)?; Ok(()) @@ -148,7 +149,7 @@ impl IfMtu { pub(super) fn get_mtu(&mut self) -> Result { let socket = create_socket(AF_UNIX)?; - let result = unsafe { ioctl(socket.as_raw_fd(), SIOCGIFMTU, &*self) }; + let result = unsafe { ioctl(socket.as_raw_fd(), SIOCGIFMTU, from_mut::(self)) }; c_int_to_error(result)?; Ok(self.ifru_mtu) @@ -308,7 +309,7 @@ impl IfReqFlags { let socket = create_socket(AF_UNIX)?; // Get current interface flags. - let _result = unsafe { ioctl(socket.as_raw_fd(), SIOCGIFFLAGS, &*self) }; + let _result = unsafe { ioctl(socket.as_raw_fd(), SIOCGIFFLAGS, from_mut::(self)) }; // Set interface up flag. self.ifr_flags |= IFF_UP as u64; diff --git a/src/bsd/mod.rs b/src/bsd/mod.rs index 8c6e57f..6363bee 100644 --- a/src/bsd/mod.rs +++ b/src/bsd/mod.rs @@ -63,9 +63,15 @@ static NV_CIDR: &str = "cidr"; static NV_IPV4: &str = "ipv4"; static NV_IPV6: &str = "ipv6"; -/// Cast bytes to `T`. -unsafe fn cast_ref(bytes: &[u8]) -> &T { - unsafe { bytes.as_ptr().cast::().as_ref().unwrap() } +/// Read a `T` out of a byte buffer that may not be aligned to `T`. +/// This returns an owned value rather than a reference. +/// +/// # Safety +/// `bytes` must contain a valid bit pattern for `T` in its first `size_of::()` +/// bytes; `T` must be a plain-old-data type (no meaningful `Drop`). +unsafe fn read_unaligned(bytes: &[u8]) -> T { + assert!(bytes.len() >= size_of::()); + unsafe { bytes.as_ptr().cast::().read_unaligned() } } /// Cast `T' to bytes. @@ -102,6 +108,8 @@ pub enum IoError { Unpack, #[error("Failed to load kernel module")] KernelModule, + #[error("Failed to parse NvList: {0}")] + NvList(#[from] nvlist::NvListError), } impl From for IoError { @@ -291,18 +299,14 @@ pub fn get_host(if_name: &str) -> Result { wg_data.read_data()?; let mut nvlist = NvList::new(); - // FIXME: use proper error, here and above - nvlist - .unpack(wg_data.as_slice()) - .map_err(|_| IoError::MemAlloc)?; + nvlist.unpack(wg_data.as_slice())?; Ok(Host::from_nvlist(&nvlist)) } pub fn set_host(if_name: &str, host: &Host) -> Result<(), IoError> { let nvlist = host.as_nvlist(); - // FIXME: use proper error, here and above - let mut buf = nvlist.pack().map_err(|_| IoError::MemAlloc)?; + let mut buf = nvlist.pack()?; let mut wg_data = WgWriteIo::new(if_name, &mut buf); wg_data.write_data() @@ -311,8 +315,7 @@ pub fn set_host(if_name: &str, host: &Host) -> Result<(), IoError> { pub fn set_peer(if_name: &str, peer: &Peer) -> Result<(), IoError> { let mut nvlist = NvList::new(); nvlist.append_nvlist_array(NV_PEERS, vec![peer.as_nvlist()]); - // FIXME: use proper error, here and above - let mut buf = nvlist.pack().map_err(|_| IoError::MemAlloc)?; + let mut buf = nvlist.pack()?; let mut wg_data = WgWriteIo::new(if_name, &mut buf); wg_data.write_data() @@ -321,8 +324,7 @@ pub fn set_peer(if_name: &str, peer: &Peer) -> Result<(), IoError> { pub fn delete_peer(if_name: &str, public_key: &Key) -> Result<(), IoError> { let mut nvlist = NvList::new(); nvlist.append_nvlist_array(NV_PEERS, vec![public_key.as_nvlist_for_removal()]); - // FIXME: use proper error, here and above - let mut buf = nvlist.pack().map_err(|_| IoError::MemAlloc)?; + let mut buf = nvlist.pack()?; let mut wg_data = WgWriteIo::new(if_name, &mut buf); wg_data.write_data() @@ -420,20 +422,19 @@ pub fn flush_interface(if_name: &str) -> Result<(), IoError> { let name = CStr::from_ptr((*addr).ifa_name); if name == ifname_c.as_c_str() { let ifa_addr = (*addr).ifa_addr; - if ifa_addr.is_null() { - continue; - } - // Convert `ifa_addr` to `IpAddr`. - // Note: `ifa_addr` is actually `sockaddr_in` or `sockaddr_in6` depending on - // `sa_len` and `sa_family`. - if (*ifa_addr).sa_len == SA_IN_SIZE && (*ifa_addr).sa_family == AF_INET { - if let Some(sockaddr) = SockAddrIn::from_raw(ifa_addr) { - addr_to_remove.push(sockaddr.ip_addr()); - } - } else if (*ifa_addr).sa_len == SA_IN6_SIZE - && (*ifa_addr).sa_family == libc::AF_INET6 as u8 - { - if let Some(sockaddr) = SockAddrIn6::from_raw(ifa_addr) { + // Skip entries without an address, but still advance to the next one. + if !ifa_addr.is_null() { + // Convert `ifa_addr` to `IpAddr`. + // Note: `ifa_addr` is actually `sockaddr_in` or `sockaddr_in6` depending on + // `sa_len` and `sa_family`. + if (*ifa_addr).sa_len == SA_IN_SIZE && (*ifa_addr).sa_family == AF_INET { + if let Some(sockaddr) = SockAddrIn::from_raw(ifa_addr) { + addr_to_remove.push(sockaddr.ip_addr()); + } + } else if (*ifa_addr).sa_len == SA_IN6_SIZE + && (*ifa_addr).sa_family == libc::AF_INET6 as u8 + && let Some(sockaddr) = SockAddrIn6::from_raw(ifa_addr) + { addr_to_remove.push(sockaddr.ip_addr()); } } diff --git a/src/bsd/nvlist.rs b/src/bsd/nvlist.rs index 27fdf77..02acf21 100644 --- a/src/bsd/nvlist.rs +++ b/src/bsd/nvlist.rs @@ -143,12 +143,12 @@ impl Error for NvListError {} impl fmt::Display for NvListError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::NameTooLong => write!(f, "name is too long"), - Self::NotEnoughBytes => write!(f, "not enough bytes"), - Self::WrongHeader => write!(f, "wrong header"), - Self::WrongName => write!(f, "wrong name"), - Self::WrongPair => write!(f, "wrong name-value pair"), - Self::WrongPairData => write!(f, "wrong name-value pair data"), + Self::NameTooLong => f.write_str("name is too long"), + Self::NotEnoughBytes => f.write_str("not enough bytes"), + Self::WrongHeader => f.write_str("wrong header"), + Self::WrongName => f.write_str("wrong name"), + Self::WrongPair => f.write_str("wrong name-value pair"), + Self::WrongPairData => f.write_str("wrong name-value pair data"), } } } diff --git a/src/bsd/route.rs b/src/bsd/route.rs index d87fb19..36bbf62 100644 --- a/src/bsd/route.rs +++ b/src/bsd/route.rs @@ -9,7 +9,7 @@ use std::{ use libc::{ESRCH, PF_ROUTE, SHUT_RD, SOCK_RAW, read, shutdown, socket, write}; use super::{ - IoError, c_int_to_error, cast_bytes, cast_ref, + IoError, c_int_to_error, cast_bytes, read_unaligned, sockaddr::{SockAddrDl, SocketFromRaw, unpack_sockaddr}, }; @@ -219,10 +219,10 @@ fn if_addr(if_name: &str) -> Option { let mut addr = addrs; while !addr.is_null() { let name = unsafe { CStr::from_ptr((*addr).ifa_name) }; - if name == ifname_c.as_c_str() { - if let Some(sockaddr) = unsafe { S::from_raw((*addr).ifa_addr) } { - return Some(sockaddr); - } + if name == ifname_c.as_c_str() + && let Some(sockaddr) = unsafe { S::from_raw((*addr).ifa_addr) } + { + return Some(sockaddr); } addr = unsafe { (*addr).ifa_next }; } @@ -370,7 +370,7 @@ impl RtMessage { { // not in table } else { - return Err(err)?; + Err(err)?; } } @@ -388,7 +388,7 @@ impl RtMessage { { return Ok(None); // not in table } - return Err(err)?; + Err(err)?; } let mut buf = [0u8; 256]; // FIXME: fixed buffer size @@ -400,7 +400,7 @@ impl RtMessage { return Err(IoError::Unpack); } - let header = unsafe { cast_ref::(&buf) }; + let header = unsafe { read_unaligned::(&buf) }; let mut offset = size_of::(); if header.rtm_addrs & RTA_DST != 0 { diff --git a/src/bsd/sockaddr.rs b/src/bsd/sockaddr.rs index 4182c90..a1fe8fb 100644 --- a/src/bsd/sockaddr.rs +++ b/src/bsd/sockaddr.rs @@ -5,7 +5,7 @@ use std::{ ptr::{copy, from_mut}, }; -use super::{AF_INET, AF_INET6, AF_LINK, SA_IN_SIZE, SA_IN6_SIZE, cast_bytes, cast_ref}; +use super::{AF_INET, AF_INET6, AF_LINK, SA_IN_SIZE, SA_IN6_SIZE, cast_bytes, read_unaligned}; pub(super) trait SocketFromRaw { unsafe fn from_raw(addr: *const libc::sockaddr) -> Option @@ -212,20 +212,22 @@ pub(super) fn pack_sockaddr(sockaddr: &SocketAddr) -> Vec { pub(super) fn unpack_sockaddr(buf: &[u8]) -> Option { match buf.first() { - Some(&SA_IN_SIZE) => { - let sockaddr_in = unsafe { cast_ref::(buf) }; + // The leading byte is `sa_len`; verify the buffer actually holds a whole struct + // before reading it, otherwise a truncated buffer would be an out-of-bounds read. + Some(&SA_IN_SIZE) if buf.len() >= size_of::() => { + let sockaddr_in = unsafe { read_unaligned::(buf) }; // sanity checks if sockaddr_in.family == AF_INET { - Some(sockaddr_in.into()) + Some((&sockaddr_in).into()) } else { None } } - Some(&SA_IN6_SIZE) => { - let sockaddr_in6 = unsafe { cast_ref::(buf) }; + Some(&SA_IN6_SIZE) if buf.len() >= size_of::() => { + let sockaddr_in6 = unsafe { read_unaligned::(buf) }; // sanity checks if sockaddr_in6.family == AF_INET6 { - Some(sockaddr_in6.into()) + Some((&sockaddr_in6).into()) } else { None } diff --git a/src/bsd/timespec.rs b/src/bsd/timespec.rs index c6582e3..4aac9bb 100644 --- a/src/bsd/timespec.rs +++ b/src/bsd/timespec.rs @@ -3,7 +3,7 @@ use std::{ time::{Duration, SystemTime}, }; -use super::{cast_bytes, cast_ref}; +use super::{cast_bytes, read_unaligned}; #[repr(C)] struct TimeSpec { @@ -50,8 +50,8 @@ pub(super) fn unpack_timespec(buf: &[u8]) -> Option { const TS_SIZE: usize = size_of::(); match buf.len() { TS_SIZE => { - let ts = unsafe { cast_ref::(buf) }; - Some(ts.into()) + let ts = unsafe { read_unaligned::(buf) }; + Some((&ts).into()) } _ => None, } diff --git a/src/bsd/wgio.rs b/src/bsd/wgio.rs index 22da516..4bda427 100644 --- a/src/bsd/wgio.rs +++ b/src/bsd/wgio.rs @@ -1,7 +1,7 @@ use std::{ alloc::{Layout, alloc, dealloc}, os::fd::AsRawFd, - ptr::null_mut, + ptr::{from_mut, from_ref, null_mut}, slice::from_raw_parts, }; @@ -42,19 +42,22 @@ impl WgReadIo { /// Allocate data buffer. fn alloc_data(&mut self) -> Result<(), IoError> { - if self.wgd_data.is_null() { - if let Ok(layout) = Layout::array::(self.wgd_size) { - unsafe { - self.wgd_data = alloc(layout); - } - return Ok(()); + // Note: `alloc` with a zero-sized layout is undefined behaviour. + if self.wgd_size != 0 + && self.wgd_data.is_null() + && let Ok(layout) = Layout::array::(self.wgd_size) + { + unsafe { + self.wgd_data = alloc(layout); } + Ok(()) + } else { + Err(IoError::MemAlloc) } - Err(IoError::MemAlloc) } /// Return buffer as slice. - pub(super) fn as_slice<'a>(&self) -> &'a [u8] { + pub(super) fn as_slice(&self) -> &[u8] { unsafe { from_raw_parts(self.wgd_data, self.wgd_size) } } @@ -62,13 +65,14 @@ impl WgReadIo { let socket = create_socket(AF_UNIX)?; // First do ioctl with empty `wg_data` to obtain buffer size. - let result = unsafe { ioctl(socket.as_raw_fd(), SIOCGWG, &*self) }; + // IMPORTANT: Pass a raw mutable pointer, so it's not optimized out.. + let result = unsafe { ioctl(socket.as_raw_fd(), SIOCGWG, from_mut::(self)) }; c_int_to_error(result)?; // Allocate buffer. self.alloc_data()?; // Second call to ioctl with allocated buffer. - let result = unsafe { ioctl(socket.as_raw_fd(), SIOCGWG, &*self) }; + let result = unsafe { ioctl(socket.as_raw_fd(), SIOCGWG, from_mut::(self)) }; c_int_to_error(result)?; Ok(()) @@ -113,7 +117,8 @@ impl WgWriteIo { pub(super) fn write_data(&mut self) -> Result<(), IoError> { let socket = create_socket(AF_UNIX)?; - let result = unsafe { ioctl(socket.as_raw_fd(), SIOCSWG, &*self) }; + // `SIOCSWG` only reads the struct, so a shared pointer is correct here. + let result = unsafe { ioctl(socket.as_raw_fd(), SIOCSWG, from_ref::(self)) }; c_int_to_error(result)?; Ok(()) diff --git a/src/host.rs b/src/host.rs index d7767e2..bfc5dbd 100644 --- a/src/host.rs +++ b/src/host.rs @@ -126,10 +126,10 @@ impl Host { } } "allowed_ip" => { - if let Some(ref mut peer) = peer_ref { - if let Ok(addr) = value.parse() { - peer.allowed_ips.push(addr); - } + if let Some(ref mut peer) = peer_ref + && let Ok(addr) = value.parse() + { + peer.allowed_ips.push(addr); } } "last_handshake_time_sec" => { @@ -158,11 +158,11 @@ impl Host { } // "errno" ends config "errno" => { - if let Ok(errno) = value.parse::() { - if errno == 0 { - // Break here, or BufReader will wait for EOF. - break; - } + if let Ok(errno) = value.parse::() + && errno == 0 + { + // Break here, or BufReader will wait for EOF. + break; } return Err(io::Error::other("error reading UAPI")); } diff --git a/src/key.rs b/src/key.rs index 2390d7b..d88017f 100644 --- a/src/key.rs +++ b/src/key.rs @@ -167,13 +167,13 @@ impl Eq for Key {} impl fmt::Debug for Key { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.to_lower_hex()) + f.write_str(&self.to_lower_hex()) } } impl fmt::Display for Key { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", BASE64_STANDARD.encode(self.0)) + f.write_str(&BASE64_STANDARD.encode(self.0)) } } diff --git a/src/net.rs b/src/net.rs index 38ba885..3aa6432 100644 --- a/src/net.rs +++ b/src/net.rs @@ -137,7 +137,7 @@ impl error::Error for IpAddrParseError {} impl fmt::Display for IpAddrParseError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "IP address/mask parse error") + f.write_str("IP address/mask parse error") } } @@ -198,10 +198,7 @@ mod tests { assert_eq!( "::1".parse::(), - Ok(IpAddrMask::new( - IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), - 128 - )) + Ok(IpAddrMask::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 128)) ); assert_eq!( @@ -229,7 +226,7 @@ mod tests { assert_eq!(ip.broadcast(), IpAddr::V4(Ipv4Addr::new(192, 168, 0, 255))); assert_eq!(ip.mask(), IpAddr::V4(Ipv4Addr::new(255, 255, 255, 0))); - let ip = IpAddrMask::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8); + let ip = IpAddrMask::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 8); assert_eq!( ip.broadcast(), IpAddr::V4(Ipv4Addr::new(127, 255, 255, 255)) @@ -243,16 +240,13 @@ mod tests { ); assert_eq!(ip.mask(), IpAddr::V4(Ipv4Addr::new(255, 255, 0, 0))); - let ip = IpAddrMask::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0); - assert_eq!( - ip.broadcast(), - IpAddr::V4(Ipv4Addr::new(255, 255, 255, 255)) - ); - assert_eq!(ip.mask(), IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))); + let ip = IpAddrMask::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 0); + assert_eq!(ip.broadcast(), IpAddr::V4(Ipv4Addr::BROADCAST)); + assert_eq!(ip.mask(), IpAddr::V4(Ipv4Addr::UNSPECIFIED)); let ip = IpAddrMask::new(IpAddr::V4(Ipv4Addr::new(12, 34, 56, 78)), 32); assert_eq!(ip.broadcast(), IpAddr::V4(Ipv4Addr::new(12, 34, 56, 78))); - assert_eq!(ip.mask(), IpAddr::V4(Ipv4Addr::new(255, 255, 255, 255))); + assert_eq!(ip.mask(), IpAddr::V4(Ipv4Addr::BROADCAST)); } #[test] diff --git a/src/peer.rs b/src/peer.rs index 6c83f07..929b4d2 100644 --- a/src/peer.rs +++ b/src/peer.rs @@ -78,7 +78,9 @@ impl Peer { #[must_use] pub fn as_uapi_update(&self) -> String { - let mut output = format!("public_key={}\n", self.public_key.to_lower_hex()); + let mut output = String::from("public_key="); + output.push_str(&self.public_key.to_lower_hex()); + output.push('\n'); if let Some(key) = &self.preshared_key { output.push_str("preshared_key="); output.push_str(&key.to_lower_hex()); diff --git a/src/utils.rs b/src/utils.rs index 63c7821..d18301a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -2,10 +2,13 @@ use std::io::{Cursor, Error as IoError}; #[cfg(any(target_os = "freebsd", target_os = "macos", target_os = "netbsd"))] use std::net::{Ipv4Addr, Ipv6Addr}; -#[cfg(any(target_os = "freebsd", target_os = "linux", target_os = "netbsd"))] -use std::path::Path; #[cfg(target_os = "linux")] use std::{collections::HashSet, fs::OpenOptions}; +#[cfg(any(target_os = "freebsd", target_os = "linux", target_os = "netbsd"))] +use std::{ + fs::{File, symlink_metadata}, + path::Path, +}; #[cfg(any( feature = "check_dependencies", target_os = "freebsd", @@ -51,30 +54,32 @@ fn construct_resolvconf_ifname(base_ifname: &str) -> String { let iface_order = Path::new(IFACE_ORDER_PATH); if iface_order.exists() { // Check if resolvconf command is a symlink or a binary - if let Ok(Some(resolvconf_path)) = get_command_path("resolvconf") { - if let Ok(metadata) = std::fs::symlink_metadata(&resolvconf_path) { - if !metadata.file_type().is_symlink() { - // It's a binary, proceed to read interface_order file - let iface_regex = regex::Regex::new(r"^([A-Za-z0-9-]+)\*$").unwrap(); - if let Ok(file) = std::fs::File::open(iface_order) { - let reader = BufReader::new(file); - if let Some(constructed_ifname) = reader.lines().map_while(Result::ok).find_map(|line| { - let iface = line.trim(); - iface_regex.captures(iface).and_then(|captures| { - captures.get(1).map(|matched_iface| { - // Output format: . - let constructed_ifname = - format!("{}.{base_ifname}", matched_iface.as_str()); - debug!( - "Constructed interface name from interface_order: {constructed_ifname}" - ); - constructed_ifname - }) + if let Ok(Some(resolvconf_path)) = get_command_path("resolvconf") + && let Ok(metadata) = symlink_metadata(&resolvconf_path) + && !metadata.file_type().is_symlink() + { + // It's a binary, proceed to read interface_order file + let iface_regex = regex::Regex::new(r"^([A-Za-z0-9-]+)\*$").unwrap(); + if let Ok(file) = File::open(iface_order) { + let reader = BufReader::new(file); + if let Some(constructed_ifname) = + reader.lines().map_while(Result::ok).find_map(|line| { + let iface = line.trim(); + iface_regex.captures(iface).and_then(|captures| { + captures.get(1).map(|matched_iface| { + // Output format: . + let constructed_ifname = + format!("{}.{base_ifname}", matched_iface.as_str()); + debug!( + "Constructed interface name from interface_order: \ + {constructed_ifname}" + ); + constructed_ifname }) - }) { - return constructed_ifname; - } - } + }) + }) + { + return constructed_ifname; } } } diff --git a/src/wgapi_freebsd.rs b/src/wgapi_freebsd.rs index 13e2205..c7958eb 100644 --- a/src/wgapi_freebsd.rs +++ b/src/wgapi_freebsd.rs @@ -135,10 +135,10 @@ impl WireguardInterfaceApi for WGApi { } fn configure_peer(&self, peer: &Peer) -> Result<(), WireguardInterfaceError> { - debug!("Configuring peer {peer:?} on interface {}", self.ifname); + debug!("Configuring {peer:?} on interface {}", self.ifname); bsd::set_peer(&self.ifname, peer)?; debug!( - "Peer {peer:?} configured successfully on interface {}", + "{peer:?} configured successfully on interface {}", self.ifname ); Ok(()) diff --git a/src/wgapi_userspace.rs b/src/wgapi_userspace.rs index 907e40a..6a2fe17 100644 --- a/src/wgapi_userspace.rs +++ b/src/wgapi_userspace.rs @@ -49,14 +49,14 @@ impl WGApi { continue; } }; - if let Some((keyword, value)) = line.split_once('=') { - if keyword == "errno" { - match value.parse() { - Ok(errno) => return errno, - Err(err) => { - error!("Failed to parse errno: {err}, using default value 0"); - return 0; - } + if let Some((keyword, value)) = line.split_once('=') + && keyword == "errno" + { + match value.parse() { + Ok(errno) => return errno, + Err(err) => { + error!("Failed to parse errno: {err}, using default value 0"); + return 0; } } }