diff -r 278533359a93 -r 5febd2bc5372 rust/hedgewars-server/src/handlers.rs --- a/rust/hedgewars-server/src/handlers.rs Mon Feb 17 16:38:24 2025 +0100 +++ b/rust/hedgewars-server/src/handlers.rs Sat Feb 22 19:39:31 2025 +0300 @@ -28,6 +28,7 @@ types::{GameCfg, TeamInfo}, }; +use crate::core::digest::Sha1Digest; use base64::encode; use log::*; use rand::{thread_rng, RngCore}; @@ -40,53 +41,6 @@ mod inroom; mod strings; -#[derive(PartialEq, Debug)] -pub struct Sha1Digest([u8; 20]); - -impl Sha1Digest { - pub fn new(digest: [u8; 20]) -> Self { - Self(digest) - } -} - -impl LowerHex for Sha1Digest { - fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> { - for byte in &self.0 { - write!(f, "{:02x}", byte)?; - } - Ok(()) - } -} - -impl PartialEq<&str> for Sha1Digest { - fn eq(&self, other: &&str) -> bool { - if other.len() != self.0.len() * 2 { - false - } else { - #[inline] - fn convert(c: u8) -> u8 { - if c > b'9' { - c.wrapping_sub(b'a').saturating_add(10) - } else { - c.wrapping_sub(b'0') - } - } - - other - .as_bytes() - .chunks_exact(2) - .zip(&self.0) - .all(|(chars, byte)| { - if let [hi, lo] = chars { - convert(*lo) == byte & 0x0f && convert(*hi) == (byte & 0xf0) >> 4 - } else { - unreachable!() - } - }) - } - } -} - pub struct ServerState { pub server: HwServer, pub anteroom: HwAnteroom, @@ -270,16 +224,14 @@ HwProtocolMessage::Ping => response.add(Pong.send_self()), HwProtocolMessage::Pong => (), _ => { - if state.anteroom.clients.contains(client_id) { - match inanteroom::handle(state, client_id, response, message) { + if state.anteroom.has_client(client_id) { + match inanteroom::handle(&mut state.anteroom, client_id, response, message) { LoginResult::Unchanged => (), - LoginResult::Complete => { - if let Some(client) = state.anteroom.remove_client(client_id) { - let is_checker = client.is_checker; - state.server.add_client(client_id, client); - if !is_checker { - common::get_lobby_join_data(&state.server, response); - } + LoginResult::Complete(client) => { + let is_checker = client.is_checker; + state.server.add_client(client_id, client); + if !is_checker { + common::get_lobby_join_data(&state.server, response); } } LoginResult::Exit => { @@ -292,12 +244,18 @@ HwProtocolMessage::Quit(Some(msg)) => { common::remove_client( &mut state.server, + &mut state.anteroom, response, "User quit: ".to_string() + &msg, ); } HwProtocolMessage::Quit(None) => { - common::remove_client(&mut state.server, response, "User quit".to_string()); + common::remove_client( + &mut state.server, + &mut state.anteroom, + response, + "User quit".to_string(), + ); } HwProtocolMessage::Info(nick) => { if let Some(client) = state.server.find_client(&nick) { @@ -394,7 +352,7 @@ .filter(|_| !is_local) .and_then(|a| state.anteroom.find_ip_ban(a)); if let Some(reason) = ban_reason { - response.add(HwServerMessage::Bye(reason).send_self()); + response.add(Bye(reason).send_self()); response.remove_client(client_id); false } else { @@ -405,17 +363,20 @@ .anteroom .add_client(client_id, encode(&salt), is_local); - response.add( - HwServerMessage::Connected(utils::SERVER_MESSAGE.to_owned(), utils::SERVER_VERSION) - .send_self(), - ); + response + .add(Connected(utils::SERVER_MESSAGE.to_owned(), utils::SERVER_VERSION).send_self()); true } } pub fn handle_client_loss(state: &mut ServerState, client_id: ClientId, response: &mut Response) { if state.anteroom.remove_client(client_id).is_none() { - common::remove_client(&mut state.server, response, "Connection reset".to_string()); + common::remove_client( + &mut state.server, + &mut state.anteroom, + response, + "Connection reset".to_string(), + ); } } @@ -431,7 +392,7 @@ response.add(Bye(REGISTRATION_REQUIRED.to_string()).send_self()); response.remove_client(client_id); } else if is_registered { - let client = &state.anteroom.clients[client_id]; + let client = state.anteroom.get_client(client_id); response.add(AskPassword(client.server_salt.clone()).send_self()); } else if let Some(client) = state.anteroom.remove_client(client_id) { state.server.add_client(client_id, client); @@ -508,7 +469,7 @@ #[cfg(test)] mod test { - use super::Sha1Digest; + use crate::core::digest::Sha1Digest; #[test] fn hash_cmp_test() {