allow incoming requests from arbitrary ports (#78)

closes #77
This commit is contained in:
Ferdinand Schober
2024-01-18 22:36:33 +01:00
committed by GitHub
parent b3caba99ab
commit 6674af8e63
3 changed files with 18 additions and 33 deletions

View File

@@ -70,10 +70,10 @@ pub struct Client {
/// This way any event consumer / producer backend does not /// This way any event consumer / producer backend does not
/// need to know anything about a client other than its handle. /// need to know anything about a client other than its handle.
pub handle: ClientHandle, 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 /// e.g. Laptops usually have at least an ethernet and a wifi port
/// which have different ip addresses /// which have different ip addresses
pub addrs: HashSet<SocketAddr>, pub ips: HashSet<IpAddr>,
/// both active_addr and addrs can be None / empty so port needs to be stored seperately /// both active_addr and addrs can be None / empty so port needs to be stored seperately
pub port: u16, pub port: u16,
/// position of a client on screen /// position of a client on screen
@@ -134,15 +134,12 @@ impl ClientManager {
// store fix ip addresses // store fix ip addresses
let fix_ips = ips.iter().cloned().collect(); 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 // store the client
let client = Client { let client = Client {
hostname, hostname,
fix_ips, fix_ips,
handle, handle,
addrs, ips,
port, port,
pos, pos,
}; };
@@ -173,7 +170,7 @@ impl ClientManager {
.iter() .iter()
.position(|c| { .position(|c| {
if let Some(c) = c { if let Some(c) = c {
c.active && c.client.addrs.contains(&addr) c.active && c.client.ips.contains(&addr.ip())
} else { } else {
false false
} }

View File

@@ -118,7 +118,7 @@ pub fn run() -> Result<()> {
client.hostname.as_deref().unwrap_or(""), client.hostname.as_deref().unwrap_or(""),
if active { "yes" } else { "no" }, if active { "yes" } else { "no" },
client client
.addrs .ips
.into_iter() .into_iter()
.map(|a| a.to_string()) .map(|a| a.to_string())
.collect::<Vec<String>>() .collect::<Vec<String>>()

View File

@@ -247,19 +247,11 @@ impl Server {
} }
}; };
if let Some(state) = server.client_manager.borrow_mut().get_mut(client) { 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().cloned());
let mut addrs = HashSet::from_iter(
state
.client
.fix_ips
.iter()
.map(|a| SocketAddr::new(*a, port)),
);
for ip in ips { for ip in ips {
let sock_addr = SocketAddr::new(ip, port); addrs.insert(ip);
addrs.insert(sock_addr);
} }
state.client.addrs = addrs; state.client.ips = addrs;
} }
} }
}); });
@@ -347,10 +339,16 @@ impl Server {
.iter() .iter()
.flat_map(|&c| client_manager.get(c)) .flat_map(|&c| client_manager.get(c))
.flat_map(|state| { .flat_map(|state| {
if let Some(a) = state.active_addr { if state.alive && state.active_addr.is_some() {
vec![a] vec![state.active_addr.unwrap()]
} else { } else {
state.client.addrs.iter().cloned().collect() state
.client
.ips
.iter()
.cloned()
.map(|ip| SocketAddr::new(ip, state.client.port))
.collect()
} }
}) })
.collect() .collect()
@@ -602,22 +600,12 @@ impl Server {
// update port // update port
if state.client.port != port { if state.client.port != port {
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)); state.active_addr = state.active_addr.map(|a| SocketAddr::new(a.ip(), port));
} }
// update hostname // update hostname
if state.client.hostname != hostname { if state.client.hostname != hostname {
state.client.addrs = HashSet::new(); state.client.ips = HashSet::new();
state.active_addr = None; state.active_addr = None;
state.client.hostname = hostname; state.client.hostname = hostname;
} }