From ff581dff6ff225677638be20721da07436645d22 Mon Sep 17 00:00:00 2001 From: Yureka Date: Sat, 18 Nov 2023 16:26:09 +0100 Subject: [PATCH 1/5] support multiple interfaces --- src/main.rs | 142 +++++++++++++++++++++++++++------------------------- 1 file changed, 75 insertions(+), 67 deletions(-) diff --git a/src/main.rs b/src/main.rs index 88336f4..df66c8a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::net::{IpAddr, SocketAddr, SocketAddrV4, ToSocketAddrs, UdpSocket}; use std::process::Command; use std::sync::Mutex; @@ -32,8 +32,6 @@ type Pubkey = String; #[derive(Deserialize)] struct Config { - /// The Wireguard interface name - interface: Pubkey, /// The port to use for gossip inside the Wireguard mesh (must be the same on all nodes) gossip_port: u16, /// The secret to use to authenticate nodes between them @@ -58,8 +56,12 @@ struct Config { struct Peer { /// The peer's Wireguard public key pubkey: Pubkey, - /// The peer's Wireguard address + /// The destination used for gossip packets address: IpAddr, + /// The Wireguard interface name + interface: String, + /// The endpoint port + port: u16, /// An optionnal Wireguard endpoint used to initialize a connection to this peer endpoint: Option, } @@ -115,9 +117,15 @@ fn kdf(secret: &str) -> xsalsa20poly1305::Key { hash.as_bytes().clone().into() } -fn wg_dump(config: &Config) -> Result<(Pubkey, u16, Vec<(Pubkey, Option, u64)>)> { +struct IfInfo { + our_pubkey: Pubkey, + listen_port: u16, + peers: Vec<(Pubkey, Option, u64)>, +} + +fn wg_dump(interface: &str) -> Result { let output = Command::new("wg") - .args(["show", &config.interface, "dump"]) + .args(["show", interface, "dump"]) .output()?; let mut lines = std::str::from_utf8(&output.stdout)?.split('\n'); @@ -125,7 +133,7 @@ fn wg_dump(config: &Config) -> Result<(Pubkey, u16, Vec<(Pubkey, Option Result<(Pubkey, u16, Vec<(Pubkey, Option>(); - Ok((our_pubkey, listen_port, peers)) + Ok(IfInfo { our_pubkey, listen_port, peers }) } // ============ DAEMON CODE ================= @@ -154,8 +162,6 @@ fn wg_dump(config: &Config) -> Result<(Pubkey, u16, Vec<(Pubkey, Option, } @@ -165,10 +171,10 @@ struct PeerInfo { gossip_ip: IpAddr, gossip_prio: u64, // Info retrieved from wireguard - endpoint: Option, + endpoint: Option, last_seen: u64, // Info received by LAN broadcast - lan_endpoint: Option<(SocketAddr, u64)>, + lan_endpoint: Option<(IpAddr, u64)>, } #[derive(Serialize, Deserialize, Debug)] @@ -177,12 +183,11 @@ enum Gossip { Pong, Announce { pubkey: Pubkey, - endpoints: Vec<(SocketAddr, u64)>, + endpoints: Vec<(IpAddr, u64)>, }, Request, LanBroadcast { pubkey: Pubkey, - listen_port: u16, }, } @@ -190,18 +195,31 @@ impl Daemon { fn new(config: Config) -> Result { let gossip_key = kdf(config.gossip_secret.as_deref().unwrap_or_default()); - let (our_pubkey, listen_port, _peers) = wg_dump(&config)?; + let interface_names = config.peers.iter().map(|peer| peer.interface.clone()).collect::>(); + let interfaces = interface_names.into_iter().map(|interface_name| wg_dump(&interface_name).map(|ifinfo| (interface_name, ifinfo))).collect::>>()?; let socket = UdpSocket::bind(SocketAddr::new("0.0.0.0".parse()?, config.gossip_port))?; socket.set_broadcast(true)?; + let peers = config.peers.iter().map(|peer_cfg| { + ( + peer_cfg.pubkey.clone(), + PeerInfo { + gossip_ip: peer_cfg.address, + gossip_prio: fasthash(format!("{}-{}", interfaces.iter().next().unwrap().1.our_pubkey, peer_cfg.pubkey).as_bytes()), + endpoint: None, // Is resolved as DNS name later + last_seen: u64::MAX, + lan_endpoint: None, + } + ) + }).collect(); + Ok(Daemon { config, gossip_key, - our_pubkey, - listen_port, socket, state: Mutex::new(State { - peers: HashMap::new(), + interfaces, + peers, gossip: HashMap::new(), }), }) @@ -236,7 +254,7 @@ impl Daemon { fn initialize(&self) -> Result<()> { let mut state = self.state.lock().unwrap(); - state.read_wg_peers(self)?; + state.read_wg_peers()?; state.setup_wg_peers(self, 0)?; Ok(()) } @@ -267,7 +285,7 @@ impl Daemon { let mut state = self.state.lock().unwrap(); // 1. Update local peers info of peers - state.read_wg_peers(self)?; + state.read_wg_peers()?; // 2. Send gossip for peers where there is a big update let announces = state @@ -322,12 +340,10 @@ impl Daemon { } Gossip::LanBroadcast { pubkey, - listen_port, } => { if self.config.lan_discovery { if let Some(peer) = state.peers.get_mut(&pubkey) { - let addr = SocketAddr::new(from.ip(), listen_port); - peer.lan_endpoint = Some((addr, time())); + peer.lan_endpoint = Some((from.ip(), time())); } } } @@ -393,8 +409,7 @@ impl Daemon { fn lan_broadcast_iter(&self) -> Result<()> { let packet = self.make_packet(&Gossip::LanBroadcast { - pubkey: self.our_pubkey.clone(), - listen_port: self.listen_port, + pubkey: self.our_pubkey(), })?; let addr = SocketAddr::new("255.255.255.255".parse().unwrap(), self.config.gossip_port); self.socket.send_to(&packet, addr)?; @@ -438,13 +453,16 @@ impl Daemon { gateway.addr, private_ip ); - gateway.add_port( - igd::PortMappingProtocol::UDP, - external_port, - SocketAddrV4::new(private_ip, self.listen_port), - IGD_LEASE_DURATION.as_secs() as u32, - "Wireguard via wgautomesh", - )?; + let ports = self.state.lock().unwrap().interfaces.iter().map(|(_, IfInfo { listen_port, .. })| *listen_port).collect::>(); + for listen_port in ports { + gateway.add_port( + igd::PortMappingProtocol::UDP, + external_port, + SocketAddrV4::new(private_ip, listen_port), + IGD_LEASE_DURATION.as_secs() as u32, + "Wireguard via wgautomesh", + )?; + } Ok(()) } @@ -465,11 +483,16 @@ impl Daemon { Ok([&nonce[..], &ciphertext[..]].concat()) } + + fn our_pubkey(&self) -> String { + self.state.lock().unwrap().interfaces.iter().next().unwrap().1.our_pubkey.clone() + } } struct State { peers: HashMap, - gossip: HashMap>, + gossip: HashMap>, + interfaces: HashMap, } impl State { @@ -499,7 +522,7 @@ impl State { &mut self, daemon: &Daemon, pubkey: Pubkey, - mut endpoints: Vec<(SocketAddr, u64)>, + mut endpoints: Vec<(IpAddr, u64)>, ) -> Result<()> { let propagate = { match self.gossip.get_mut(&pubkey) { @@ -541,36 +564,21 @@ impl State { Ok(()) } - fn read_wg_peers(&mut self, daemon: &Daemon) -> Result<()> { - let (_, _, wg_peers) = wg_dump(&daemon.config)?; + fn read_wg_peers(&mut self) -> Result<()> { // Clear old known endpoints if any for (_, peer) in self.peers.iter_mut() { peer.endpoint = None; } - for (pk, endpoint, last_seen) in wg_peers { - match self.peers.get_mut(&pk) { - Some(i) => { - i.endpoint = endpoint; - i.last_seen = last_seen; - } - None => { - let gossip_ip = match daemon.config.peers.iter().find(|x| x.pubkey == pk) { - Some(x) => x.address, - None => continue, - }; - let gossip_prio = fasthash(format!("{}-{}", daemon.our_pubkey, pk).as_bytes()); - self.peers.insert( - pk, - PeerInfo { - endpoint, - lan_endpoint: None, - gossip_prio, - gossip_ip, - last_seen, - }, - ); + for (ifname, ifinfo) in &mut self.interfaces { + *ifinfo = wg_dump(&ifname)?; + for (pk, endpoint, last_seen) in &mut ifinfo.peers { + if let Some(i) = self.peers.get_mut(&*pk) { + i.endpoint = endpoint.as_ref().map(SocketAddr::ip); + i.last_seen = *last_seen; + } else { + warn!("unknown peer: {}", pk); } } } @@ -582,7 +590,7 @@ impl State { let now = time(); for peer_cfg in daemon.config.peers.iter() { // Skip ourself - if peer_cfg.pubkey == daemon.our_pubkey { + if peer_cfg.pubkey == daemon.our_pubkey() { continue; } @@ -605,7 +613,7 @@ impl State { Command::new("wg") .args([ "set", - &daemon.config.interface, + &peer_cfg.interface, "peer", &peer_cfg.pubkey, "persistent-keepalive", @@ -631,11 +639,11 @@ impl State { .cloned() .unwrap_or_default(); if let Some(endpoint) = &peer_cfg.endpoint { - match endpoint.to_socket_addrs() { + match format!("{}:0", endpoint).to_socket_addrs() { Err(e) => error!("Could not resolve DNS for {}: {}", endpoint, e), Ok(iter) => { for addr in iter { - endpoints.push((addr, 0)); + endpoints.push((addr.ip(), 0)); } } } @@ -662,15 +670,15 @@ impl State { Command::new("wg") .args([ "set", - &daemon.config.interface, + &peer_cfg.interface, "peer", &peer_cfg.pubkey, "endpoint", - &endpoint.to_string(), + &SocketAddr::new(endpoint, peer_cfg.port).to_string(), "persistent-keepalive", "10", "allowed-ips", - &format!("{}/32", peer_cfg.address), + "::/0,0.0.0.0/0" ]) .output()?; let packet = daemon.make_packet(&Gossip::Ping)?; @@ -683,11 +691,11 @@ impl State { Command::new("wg") .args([ "set", - &daemon.config.interface, + &peer_cfg.interface, "peer", &peer_cfg.pubkey, "allowed-ips", - &format!("{}/32", peer_cfg.address), + "::/0,0.0.0.0/0" ]) .output()?; } From 1680284107279ee941097bc8653fb4c56e6c532c Mon Sep 17 00:00:00 2001 From: Yureka Date: Sat, 18 Nov 2023 17:41:40 +0100 Subject: [PATCH 2/5] set ttl --- src/main.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index df66c8a..d2b99d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -197,8 +197,9 @@ impl Daemon { let interface_names = config.peers.iter().map(|peer| peer.interface.clone()).collect::>(); let interfaces = interface_names.into_iter().map(|interface_name| wg_dump(&interface_name).map(|ifinfo| (interface_name, ifinfo))).collect::>>()?; - let socket = UdpSocket::bind(SocketAddr::new("0.0.0.0".parse()?, config.gossip_port))?; - socket.set_broadcast(true)?; + let socket = UdpSocket::bind(SocketAddr::new("[::]".parse()?, config.gossip_port))?; + //socket.set_broadcast(true)?; + socket.set_ttl(1)?; let peers = config.peers.iter().map(|peer_cfg| { ( From d33e26d5ce90b204496dbda4d352fc16c014d3e1 Mon Sep 17 00:00:00 2001 From: Yureka Date: Sat, 18 Nov 2023 18:55:10 +0100 Subject: [PATCH 3/5] fix --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index d2b99d6..af232e8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -197,7 +197,7 @@ impl Daemon { let interface_names = config.peers.iter().map(|peer| peer.interface.clone()).collect::>(); let interfaces = interface_names.into_iter().map(|interface_name| wg_dump(&interface_name).map(|ifinfo| (interface_name, ifinfo))).collect::>>()?; - let socket = UdpSocket::bind(SocketAddr::new("[::]".parse()?, config.gossip_port))?; + let socket = UdpSocket::bind(SocketAddr::new("::".parse()?, config.gossip_port))?; //socket.set_broadcast(true)?; socket.set_ttl(1)?; From 503f94ceebdf5d4c51b63e0dfea0190fa1a5819c Mon Sep 17 00:00:00 2001 From: Yureka Date: Sat, 18 Nov 2023 19:14:06 +0100 Subject: [PATCH 4/5] fix --- src/main.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index af232e8..cc9d545 100644 --- a/src/main.rs +++ b/src/main.rs @@ -164,6 +164,7 @@ struct Daemon { gossip_key: xsalsa20poly1305::Key, socket: UdpSocket, state: Mutex, + our_pubkey: Pubkey, } struct PeerInfo { @@ -201,12 +202,14 @@ impl Daemon { //socket.set_broadcast(true)?; socket.set_ttl(1)?; + let our_pubkey = interfaces.iter().next().unwrap().1.our_pubkey.clone(); + let peers = config.peers.iter().map(|peer_cfg| { ( peer_cfg.pubkey.clone(), PeerInfo { gossip_ip: peer_cfg.address, - gossip_prio: fasthash(format!("{}-{}", interfaces.iter().next().unwrap().1.our_pubkey, peer_cfg.pubkey).as_bytes()), + gossip_prio: fasthash(format!("{}-{}", our_pubkey, peer_cfg.pubkey).as_bytes()), endpoint: None, // Is resolved as DNS name later last_seen: u64::MAX, lan_endpoint: None, @@ -218,6 +221,7 @@ impl Daemon { config, gossip_key, socket, + our_pubkey, state: Mutex::new(State { interfaces, peers, @@ -410,7 +414,7 @@ impl Daemon { fn lan_broadcast_iter(&self) -> Result<()> { let packet = self.make_packet(&Gossip::LanBroadcast { - pubkey: self.our_pubkey(), + pubkey: self.our_pubkey.clone(), })?; let addr = SocketAddr::new("255.255.255.255".parse().unwrap(), self.config.gossip_port); self.socket.send_to(&packet, addr)?; @@ -484,10 +488,6 @@ impl Daemon { Ok([&nonce[..], &ciphertext[..]].concat()) } - - fn our_pubkey(&self) -> String { - self.state.lock().unwrap().interfaces.iter().next().unwrap().1.our_pubkey.clone() - } } struct State { @@ -591,7 +591,7 @@ impl State { let now = time(); for peer_cfg in daemon.config.peers.iter() { // Skip ourself - if peer_cfg.pubkey == daemon.our_pubkey() { + if peer_cfg.pubkey == daemon.our_pubkey { continue; } From e039471e826b4769b0b7dec2de80cb6a180ef1ca Mon Sep 17 00:00:00 2001 From: Yureka Date: Wed, 22 May 2024 11:58:43 +0200 Subject: [PATCH 5/5] update cargo dependencies --- Cargo.lock | 407 ++++++++++++++++++++++++++++------------------------- Cargo.toml | 6 +- 2 files changed, 220 insertions(+), 193 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb28c58..955511a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aead" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", "generic-array", @@ -14,30 +14,30 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "attohttpc" @@ -51,23 +51,6 @@ dependencies = [ "wildmatch", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - [[package]] name = "bincode" version = "1.3.3" @@ -79,32 +62,22 @@ dependencies = [ [[package]] name = "blake3" -version = "1.3.3" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "digest", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", ] [[package]] name = "bytes" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "c_linked_list" @@ -114,9 +87,9 @@ checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" [[package]] name = "cc" -version = "1.0.79" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" [[package]] name = "cfg-if" @@ -137,15 +110,15 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.2.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -161,30 +134,25 @@ dependencies = [ "typenum", ] -[[package]] -name = "digest" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - [[package]] name = "env_logger" -version = "0.7.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ - "atty", "humantime", + "is-terminal", "log", "regex", "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "fnv" version = "1.0.7" @@ -193,9 +161,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -208,9 +176,9 @@ checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -225,7 +193,7 @@ dependencies = [ "c_linked_list", "get_if_addrs-sys", "libc", - "winapi 0.2.8", + "winapi", ] [[package]] @@ -240,9 +208,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -251,24 +219,21 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -277,18 +242,15 @@ dependencies = [ [[package]] name = "humantime" -version = "1.3.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -296,9 +258,9 @@ dependencies = [ [[package]] name = "igd" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4e7ee8b51e541486d7040883fe1f00e2a9954bcc24fd155b7e4f03ed4b93dd" +checksum = "556b5a75cd4adb7c4ea21c64af1c48cefb2ce7d43dc4352c720a1fe47c21f355" dependencies = [ "attohttpc", "log", @@ -309,11 +271,11 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ - "autocfg", + "equivalent", "hashbrown", ] @@ -327,43 +289,51 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.6" +name = "is-terminal" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" - -[[package]] -name = "libc" -version = "0.2.139" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "cfg-if", + "hermit-abi", + "libc", + "windows-sys", ] [[package]] -name = "memchr" -version = "2.5.0" +name = "itoa" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "poly1305" @@ -384,9 +354,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pretty_env_logger" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" dependencies = [ "env_logger", "log", @@ -394,24 +364,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" -version = "1.0.23" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -448,9 +412,21 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -459,9 +435,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "salsa20" @@ -474,18 +450,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.154" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cdd151213925e7f1ab45a9bbfb129316bd00799784b174b7cc7bcd16961c49e" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.154" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc80d722935453bcafdc2c9a73cd6fac4dc1938f0346035d84bf99fa9e33217" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", @@ -494,24 +470,24 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.1" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -520,9 +496,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -544,9 +520,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.7.2" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7afcae9e3f0fe2c370fd4657108972cbb2fa9db1b9f84849cefd80741b01cb6" +checksum = "a4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bba" dependencies = [ "serde", "serde_spanned", @@ -556,18 +532,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.4" +version = "0.22.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1eb0622d28f4b9c90adc4ea4b2b46b47663fde9ac5fafcb14a1369d5508825" +checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c" dependencies = [ "indexmap", "serde", @@ -578,36 +554,36 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.11" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524b68aca1d05e03fdf03fcdce2c6c94b6daf6d16861ddaa7e4f2b6638a9052c" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -615,9 +591,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -665,51 +641,102 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi 0.3.9", + "windows-sys", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.3.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee7b2c67f962bf5042bfd8b6a916178df33a26eec343ae064cb8e069f638fa6f" +checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" dependencies = [ "memchr", ] [[package]] name = "xml-rs" -version = "0.8.4" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" [[package]] name = "xmltree" @@ -722,9 +749,9 @@ dependencies = [ [[package]] name = "xsalsa20poly1305" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "472c385ee974833d7e59979eeb74175d56774be3768b5bcc581337e21396bda3" +checksum = "02a6dad357567f81cd78ee75f7c61f1b30bb2fe4390be8fb7c69e2ac8dffb6c7" dependencies = [ "aead", "poly1305", @@ -735,12 +762,12 @@ dependencies = [ [[package]] name = "xxhash-rust" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "735a71d46c4d68d71d4b24d03fdc2b98e38cea81730595801db779c04fe80d70" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/Cargo.toml b/Cargo.toml index 7a04067..e036b4a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,13 +9,13 @@ edition = "2021" xxhash-rust = { version = "0.8", default-features = false, features = ["xxh3"] } anyhow = "1.0" log = "0.4" -pretty_env_logger = "0.4.0" +pretty_env_logger = "0.5" serde = { version = "1.0", features = ["derive"] } bincode = "1.3" -toml = { version = "0.7", default-features = false, features = ["parse"] } +toml = { version = "0.8", default-features = false, features = ["parse"] } xsalsa20poly1305 = "0.9" -blake3 = "1.3" +blake3 = "1.5" igd = { version = "0.12", default-features = false } get_if_addrs = "0.5"