From 6674af8e630bb6c46e79d995d3cc23a24e5d4b89 Mon Sep 17 00:00:00 2001 From: Ferdinand Schober Date: Thu, 18 Jan 2024 22:36:33 +0100 Subject: [PATCH] allow incoming requests from arbitrary ports (#78) closes #77 --- src/client.rs | 11 ++++------- src/frontend/cli.rs | 2 +- src/server.rs | 38 +++++++++++++------------------------- 3 files changed, 18 insertions(+), 33 deletions(-) diff --git a/src/client.rs b/src/client.rs index 0257726..b07de64 100644 --- a/src/client.rs +++ b/src/client.rs @@ -70,10 +70,10 @@ pub struct Client { /// This way any event consumer / producer backend does not /// need to know anything about a client other than its handle. pub handle: ClientHandle, - /// all socket addresses associated with a particular client + /// all ip addresses associated with a particular client /// e.g. Laptops usually have at least an ethernet and a wifi port /// which have different ip addresses - pub addrs: HashSet, + pub ips: HashSet, /// both active_addr and addrs can be None / empty so port needs to be stored seperately pub port: u16, /// position of a client on screen @@ -134,15 +134,12 @@ impl ClientManager { // store fix ip addresses let fix_ips = ips.iter().cloned().collect(); - // map ip addresses to socket addresses - let addrs = HashSet::from_iter(ips.into_iter().map(|ip| SocketAddr::new(ip, port))); - // store the client let client = Client { hostname, fix_ips, handle, - addrs, + ips, port, pos, }; @@ -173,7 +170,7 @@ impl ClientManager { .iter() .position(|c| { if let Some(c) = c { - c.active && c.client.addrs.contains(&addr) + c.active && c.client.ips.contains(&addr.ip()) } else { false } diff --git a/src/frontend/cli.rs b/src/frontend/cli.rs index b808c11..a7666d2 100644 --- a/src/frontend/cli.rs +++ b/src/frontend/cli.rs @@ -118,7 +118,7 @@ pub fn run() -> Result<()> { client.hostname.as_deref().unwrap_or(""), if active { "yes" } else { "no" }, client - .addrs + .ips .into_iter() .map(|a| a.to_string()) .collect::>() diff --git a/src/server.rs b/src/server.rs index cc2815f..370442d 100644 --- a/src/server.rs +++ b/src/server.rs @@ -247,19 +247,11 @@ impl Server { } }; if let Some(state) = server.client_manager.borrow_mut().get_mut(client) { - let port = state.client.port; - let mut addrs = HashSet::from_iter( - state - .client - .fix_ips - .iter() - .map(|a| SocketAddr::new(*a, port)), - ); + let mut addrs = HashSet::from_iter(state.client.fix_ips.iter().cloned()); for ip in ips { - let sock_addr = SocketAddr::new(ip, port); - addrs.insert(sock_addr); + addrs.insert(ip); } - state.client.addrs = addrs; + state.client.ips = addrs; } } }); @@ -347,10 +339,16 @@ impl Server { .iter() .flat_map(|&c| client_manager.get(c)) .flat_map(|state| { - if let Some(a) = state.active_addr { - vec![a] + if state.alive && state.active_addr.is_some() { + vec![state.active_addr.unwrap()] } else { - state.client.addrs.iter().cloned().collect() + state + .client + .ips + .iter() + .cloned() + .map(|ip| SocketAddr::new(ip, state.client.port)) + .collect() } }) .collect() @@ -602,22 +600,12 @@ impl Server { // update port if state.client.port != port { state.client.port = port; - state.client.addrs = state - .client - .addrs - .iter() - .cloned() - .map(|mut a| { - a.set_port(port); - a - }) - .collect(); state.active_addr = state.active_addr.map(|a| SocketAddr::new(a.ip(), port)); } // update hostname if state.client.hostname != hostname { - state.client.addrs = HashSet::new(); + state.client.ips = HashSet::new(); state.active_addr = None; state.client.hostname = hostname; }