# HG changeset patch # User alfadur # Date 1577551265 -10800 # Node ID 0606f89698e7bdeeed1eb1da61eeff0a067b3043 # Parent f1205f33bf5b1427c9f7f26189a9be5945514e34 check the room passwords diff -r f1205f33bf5b -r 0606f89698e7 rust/hedgewars-server/src/core/server.rs --- a/rust/hedgewars-server/src/core/server.rs Fri Dec 27 22:36:19 2019 +0300 +++ b/rust/hedgewars-server/src/core/server.rs Sat Dec 28 19:41:05 2019 +0300 @@ -5,9 +5,8 @@ room::HwRoom, types::{ClientId, GameCfg, RoomId, ServerVar, TeamInfo, Vote, VoteType, Voting}, }; -use crate::{protocol::messages::HwProtocolMessage::Greeting, utils}; +use crate::utils; -use bitflags::_core::hint::unreachable_unchecked; use bitflags::*; use log::*; use slab::Slab; @@ -23,6 +22,7 @@ pub enum JoinRoomError { DoesntExist, WrongProtocol, + WrongPassword, Full, Restricted, } @@ -290,11 +290,6 @@ } #[inline] - pub fn get_client_nick(&self, client_id: ClientId) -> &str { - &self.clients[client_id].nick - } - - #[inline] pub fn create_room( &mut self, creator_id: ClientId, @@ -320,6 +315,7 @@ &mut self, client_id: ClientId, room_id: RoomId, + room_password: Option<&str>, ) -> Result<(&HwClient, &HwRoom, impl Iterator + Clone), JoinRoomError> { use JoinRoomError::*; let room = &mut self.rooms[room_id]; @@ -327,6 +323,8 @@ if client.protocol_number != room.protocol_number { Err(WrongProtocol) + } else if room.password.is_some() && room_password != room.password.as_deref() { + Err(WrongPassword) } else if room.is_join_restricted() { Err(Restricted) } else if room.players_number == u8::max_value() { @@ -347,12 +345,13 @@ &mut self, client_id: ClientId, room_name: &str, + room_password: Option<&str>, ) -> Result<(&HwClient, &HwRoom, impl Iterator + Clone), JoinRoomError> { use JoinRoomError::*; let room = self.rooms.iter().find(|(_, r)| r.name == room_name); if let Some((_, room)) = room { let room_id = room.id; - self.join_room(client_id, room_id) + self.join_room(client_id, room_id, room_password) } else { Err(DoesntExist) } @@ -1082,7 +1081,11 @@ client.room_id = Some(room.id); client.set_is_master(true); client.set_is_ready(true); + client.set_is_in_game(false); client.set_is_joined_mid_game(false); + client.clan = None; + client.teams_in_game = 0; + client.team_indices = vec![]; (client, room) } diff -r f1205f33bf5b -r 0606f89698e7 rust/hedgewars-server/src/handlers/common.rs --- a/rust/hedgewars-server/src/handlers/common.rs Fri Dec 27 22:36:19 2019 +0300 +++ b/rust/hedgewars-server/src/handlers/common.rs Sat Dec 28 19:41:05 2019 +0300 @@ -159,6 +159,9 @@ match error { JoinRoomError::DoesntExist => response.warn(NO_ROOM), JoinRoomError::WrongProtocol => response.warn(WRONG_PROTOCOL), + JoinRoomError::WrongPassword => { + response.add(Notice("WrongPassword".to_string()).send_self()) + } JoinRoomError::Full => response.warn(ROOM_FULL), JoinRoomError::Restricted => response.warn(ROOM_JOIN_RESTRICTED), } diff -r f1205f33bf5b -r 0606f89698e7 rust/hedgewars-server/src/handlers/inlobby.rs --- a/rust/hedgewars-server/src/handlers/inlobby.rs Fri Dec 27 22:36:19 2019 +0300 +++ b/rust/hedgewars-server/src/handlers/inlobby.rs Sat Dec 28 19:41:05 2019 +0300 @@ -35,20 +35,17 @@ response.add(RoomJoined(vec![client.nick.clone()]).send_self()); response.add( ClientFlags( - add_flags(&[Flags::RoomMaster, Flags::Ready]), + add_flags(&[Flags::RoomMaster, Flags::Ready, Flags::InRoom]), vec![client.nick.clone()], ) - .send_self(), - ); - response.add( - ClientFlags(add_flags(&[Flags::InRoom]), vec![client.nick.clone()]).send_self(), + .send_all(), ); } }, Chat(msg) => { response.add( ChatMsg { - nick: server.get_client_nick(client_id).to_string(), + nick: server.client(client_id).nick.clone(), msg, } .send_all() @@ -56,16 +53,18 @@ .but_self(), ); } - JoinRoom(name, _password) => match server.join_room_by_name(client_id, &name) { - Err(error) => super::common::get_room_join_error(error, response), - Ok((client, room, room_clients)) => { - super::common::get_room_join_data(client, room, room_clients, response) + JoinRoom(name, password) => { + match server.join_room_by_name(client_id, &name, password.as_deref()) { + Err(error) => super::common::get_room_join_error(error, response), + Ok((client, room, room_clients)) => { + super::common::get_room_join_data(client, room, room_clients, response) + } } - }, + } Follow(nick) => { if let Some(client) = server.find_client(&nick) { if let Some(room_id) = client.room_id { - match server.join_room(client_id, room_id) { + match server.join_room(client_id, room_id, None) { Err(error) => super::common::get_room_join_error(error, response), Ok((client, room, room_clients)) => { super::common::get_room_join_data(client, room, room_clients, response)