rust/hedgewars-server/src/server/handlers/loggingin.rs
changeset 14781 01f8ab45f806
parent 14779 f43ab2bd76ae
child 14870 ce98c37826a7
equal deleted inserted replaced
14780:65861ba8b4e8 14781:01f8ab45f806
     1 use mio;
     1 use mio;
     2 
     2 
     3 use crate::protocol::messages::HWProtocolMessage::LoadRoom;
     3 use crate::protocol::messages::HWProtocolMessage::LoadRoom;
       
     4 use crate::server::client::HWClient;
       
     5 use crate::server::core::HWServer;
     4 use crate::{
     6 use crate::{
     5     protocol::messages::{HWProtocolMessage, HWServerMessage::*},
     7     protocol::messages::{HWProtocolMessage, HWServerMessage::*},
     6     server::{
     8     server::{
     7         core::{HWAnteClient, HWAnteroom},
     9         core::{HWAnteClient, HWAnteroom},
     8         coretypes::ClientId,
    10         coretypes::ClientId,
    21     Unchanged,
    23     Unchanged,
    22     Complete,
    24     Complete,
    23     Exit,
    25     Exit,
    24 }
    26 }
    25 
    27 
    26 fn completion_result(client: &HWAnteClient, response: &mut super::Response) -> LoginResult {
    28 fn completion_result<'a, I>(
    27     #[cfg(feature = "official-server")]
    29     mut other_clients: I,
    28     {
    30     client: &mut HWAnteClient,
    29         response.add(AskPassword(client.server_salt.clone()).send_self());
    31     response: &mut super::Response,
    30         LoginResult::Unchanged
    32 ) -> LoginResult
    31     }
    33 where
       
    34     I: Iterator<Item = (ClientId, &'a HWClient)>,
       
    35 {
       
    36     let has_nick_clash =
       
    37         other_clients.any(|(_, c)| !c.is_checker() && c.nick == *client.nick.as_ref().unwrap());
    32 
    38 
    33     #[cfg(not(feature = "official-server"))]
    39     if has_nick_clash {
    34     {
    40         if client.protocol_number.unwrap().get() < 38 {
    35         LoginResult::Complete
    41             response.add(Bye("User quit: Nickname is already in use".to_string()).send_self());
       
    42             LoginResult::Exit
       
    43         } else {
       
    44             client.nick = None;
       
    45             response.add(Notice("NickAlreadyInUse".to_string()).send_self());
       
    46             LoginResult::Unchanged
       
    47         }
       
    48     } else {
       
    49         #[cfg(feature = "official-server")]
       
    50         {
       
    51             response.add(AskPassword(client.server_salt.clone()).send_self());
       
    52             LoginResult::Unchanged
       
    53         }
       
    54 
       
    55         #[cfg(not(feature = "official-server"))]
       
    56         {
       
    57             LoginResult::Complete
       
    58         }
    36     }
    59     }
    37 }
    60 }
    38 
    61 
    39 pub fn handle(
    62 pub fn handle(
    40     anteroom: &mut HWAnteroom,
    63     server: &mut HWServer,
    41     client_id: ClientId,
    64     client_id: ClientId,
    42     response: &mut super::Response,
    65     response: &mut super::Response,
    43     message: HWProtocolMessage,
    66     message: HWProtocolMessage,
    44 ) -> LoginResult {
    67 ) -> LoginResult {
    45     match message {
    68     match message {
    46         HWProtocolMessage::Quit(_) => {
    69         HWProtocolMessage::Quit(_) => {
    47             response.add(Bye("User quit".to_string()).send_self());
    70             response.add(Bye("User quit".to_string()).send_self());
    48             LoginResult::Exit
    71             LoginResult::Exit
    49         }
    72         }
    50         HWProtocolMessage::Nick(nick) => {
    73         HWProtocolMessage::Nick(nick) => {
    51             let client = &mut anteroom.clients[client_id];
    74             let client = &mut server.anteroom.clients[client_id];
    52             debug!("{} {}", nick, is_name_illegal(&nick));
    75             debug!("{} {}", nick, is_name_illegal(&nick));
    53             if !client.nick.is_some() {
    76             if client.nick.is_some() {
    54                 response.add(Error("Nickname already provided.".to_string()).send_self());
    77                 response.add(Error("Nickname already provided.".to_string()).send_self());
    55                 LoginResult::Unchanged
    78                 LoginResult::Unchanged
    56             } else if is_name_illegal(&nick) {
    79             } else if is_name_illegal(&nick) {
    57                 response.add(Bye("Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self());
    80                 response.add(Bye("Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self());
    58                 LoginResult::Exit
    81                 LoginResult::Exit
    59             } else {
    82             } else {
    60                 client.nick = Some(nick.clone());
    83                 client.nick = Some(nick.clone());
    61                 response.add(Nick(nick).send_self());
    84                 response.add(Nick(nick).send_self());
    62 
    85 
    63                 if client.protocol_number.is_some() {
    86                 if client.protocol_number.is_some() {
    64                     completion_result(&client, response)
    87                     completion_result(server.clients.iter(), client, response)
    65                 } else {
    88                 } else {
    66                     LoginResult::Unchanged
    89                     LoginResult::Unchanged
    67                 }
    90                 }
    68             }
    91             }
    69         }
    92         }
    70         HWProtocolMessage::Proto(proto) => {
    93         HWProtocolMessage::Proto(proto) => {
    71             let client = &mut anteroom.clients[client_id];
    94             let client = &mut server.anteroom.clients[client_id];
    72             if client.protocol_number.is_some() {
    95             if client.protocol_number.is_some() {
    73                 response.add(Error("Protocol already known.".to_string()).send_self());
    96                 response.add(Error("Protocol already known.".to_string()).send_self());
    74                 LoginResult::Unchanged
    97                 LoginResult::Unchanged
    75             } else if proto == 0 {
    98             } else if proto == 0 {
    76                 response.add(Error("Bad number.".to_string()).send_self());
    99                 response.add(Error("Bad number.".to_string()).send_self());
    78             } else {
   101             } else {
    79                 client.protocol_number = NonZeroU16::new(proto);
   102                 client.protocol_number = NonZeroU16::new(proto);
    80                 response.add(Proto(proto).send_self());
   103                 response.add(Proto(proto).send_self());
    81 
   104 
    82                 if client.nick.is_some() {
   105                 if client.nick.is_some() {
    83                     completion_result(&client, response)
   106                     completion_result(server.clients.iter(), client, response)
    84                 } else {
   107                 } else {
    85                     LoginResult::Unchanged
   108                     LoginResult::Unchanged
    86                 }
   109                 }
    87             }
   110             }
    88         }
   111         }
    89         #[cfg(feature = "official-server")]
   112         #[cfg(feature = "official-server")]
    90         HWProtocolMessage::Password(hash, salt) => {
   113         HWProtocolMessage::Password(hash, salt) => {
    91             let client = &anteroom.clients[client_id];
   114             let client = &server.anteroom.clients[client_id];
    92 
   115 
    93             if let (Some(nick), Some(protocol)) = (client.nick.as_ref(), client.protocol_number) {
   116             if let (Some(nick), Some(protocol)) = (client.nick.as_ref(), client.protocol_number) {
    94                 response.request_io(super::IoTask::GetAccount {
   117                 response.request_io(super::IoTask::GetAccount {
    95                     nick: nick.clone(),
   118                     nick: nick.clone(),
    96                     protocol: protocol.get(),
   119                     protocol: protocol.get(),
   102 
   125 
   103             LoginResult::Unchanged
   126             LoginResult::Unchanged
   104         }
   127         }
   105         #[cfg(feature = "official-server")]
   128         #[cfg(feature = "official-server")]
   106         HWProtocolMessage::Checker(protocol, nick, password) => {
   129         HWProtocolMessage::Checker(protocol, nick, password) => {
   107             let client = &mut anteroom.clients[client_id];
   130             let client = &mut server.anteroom.clients[client_id];
   108             client.protocol_number = NonZeroU16::new(protocol);
   131             if protocol == 0 {
   109             client.nick = Some(nick);
   132                 response.add(Error("Bad number.".to_string()).send_self());
   110             //client.set_is_checker(true);
   133                 LoginResult::Unchanged
   111             LoginResult::Complete
   134             } else {
       
   135                 client.protocol_number = NonZeroU16::new(protocol);
       
   136                 client.nick = Some(nick);
       
   137                 client.is_checker = true;
       
   138                 LoginResult::Complete
       
   139             }
   112         }
   140         }
   113         _ => {
   141         _ => {
   114             warn!("Incorrect command in logging-in state");
   142             warn!("Incorrect command in logging-in state");
   115             LoginResult::Unchanged
   143             LoginResult::Unchanged
   116         }
   144         }