rust/hedgewars-server/src/handlers.rs
changeset 15554 f1205f33bf5b
parent 15548 24f692e791d3
child 15556 bb93e9642b5b
--- a/rust/hedgewars-server/src/handlers.rs	Thu Dec 26 21:55:51 2019 +0300
+++ b/rust/hedgewars-server/src/handlers.rs	Fri Dec 27 22:36:19 2019 +0300
@@ -115,6 +115,10 @@
         client_salt: String,
         server_salt: String,
     },
+    GetCheckerAccount {
+        nick: String,
+        password: String,
+    },
     GetReplay {
         id: u32,
     },
@@ -133,6 +137,7 @@
 pub enum IoResult {
     AccountRegistered(bool),
     Account(Option<AccountInfo>),
+    CheckerAccount { is_registered: bool },
     Replay(Option<Replay>),
     SaveRoom(RoomId, bool),
     LoadRoom(RoomId, Option<String>),
@@ -410,13 +415,17 @@
                 response.add(Bye(REGISTRATION_REQUIRED.to_string()).send_self());
                 response.remove_client(client_id);
             } else if is_registered {
-                let salt = state.anteroom.clients[client_id].server_salt.clone();
-                response.add(AskPassword(salt).send_self());
+                let client = &state.anteroom.clients[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);
                 common::get_lobby_join_data(&state.server, response);
             }
         }
+        IoResult::Account(None) => {
+            response.add(Bye(AUTHENTICATION_FAILED.to_string()).send_self());
+            response.remove_client(client_id);
+        }
         IoResult::Account(Some(info)) => {
             response.add(ServerAuth(format!("{:x}", info.server_hash)).send_self());
             if let Some(mut client) = state.anteroom.remove_client(client_id) {
@@ -427,9 +436,16 @@
                 common::get_lobby_join_data(&state.server, response);
             }
         }
-        IoResult::Account(None) => {
-            response.error(AUTHENTICATION_FAILED);
-            response.remove_client(client_id);
+        IoResult::CheckerAccount { is_registered } => {
+            if is_registered {
+                if let Some(client) = state.anteroom.remove_client(client_id) {
+                    state.server.add_client(client_id, client);
+                    response.add(LogonPassed.send_self());
+                }
+            } else {
+                response.add(Bye(NO_CHECKER_RIGHTS.to_string()).send_self());
+                response.remove_client(client_id);
+            }
         }
         IoResult::Replay(Some(replay)) => {
             let client = state.server.client(client_id);