From bdff4bc04cd30b7cedb71b615ef1b690c6d260bf Mon Sep 17 00:00:00 2001 From: tylerlowrey Date: Tue, 11 Aug 2020 13:02:21 -0400 Subject: [PATCH] Prevent client from ignoring Kicked event --- server/src/cmd.rs | 33 ++++++++++++++++++++++++++------- server/src/login_provider.rs | 9 ++++++--- server/src/settings.rs | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 0af600c39c..d8167a094b 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -24,9 +24,9 @@ use std::convert::TryFrom; use vek::*; use world::util::Sampler; +use crate::login_provider::LoginProvider; use scan_fmt::{scan_fmt, scan_fmt_some}; use tracing::error; -use crate::login_provider::LoginProvider; pub trait ChatCommandExt { fn execute(&self, server: &mut Server, entity: EcsEntity, args: String); @@ -1816,6 +1816,11 @@ fn handle_whitelist( } fn kick_player(server: &mut Server, target_player: EcsEntity, reason: &str) { + server + .state + .ecs() + .read_resource::>() + .emit_now(ServerEvent::ClientDisconnect(target_player)); server.notify_client(target_player, ServerMsg::Kicked(reason.to_string())); } @@ -1871,7 +1876,11 @@ fn handle_ban( scan_fmt_some!(&args, &action.arg_fmt(), String, String) { let reason = reason_opt.unwrap_or_default(); - let uuid_result = server.state.ecs().read_resource::().username_to_uuid(&target_alias); + let uuid_result = server + .state + .ecs() + .read_resource::() + .username_to_uuid(&target_alias); if let Ok(uuid) = uuid_result { if server.settings().banlist.contains_key(&uuid) { @@ -1882,7 +1891,8 @@ fn handle_ban( ) } else { server.settings_mut().edit(|s| { - s.banlist.insert(uuid, (target_alias.clone(), reason.clone())); + s.banlist + .insert(uuid, (target_alias.clone(), reason.clone())); }); server.notify_client( client, @@ -1905,7 +1915,10 @@ fn handle_ban( } else { server.notify_client( client, - ChatType::CommandError.server_msg(format!("Unable to determine UUID for username \"{}\"", target_alias)) + ChatType::CommandError.server_msg(format!( + "Unable to determine UUID for username \"{}\"", + target_alias + )), ) } } else { @@ -1924,7 +1937,11 @@ fn handle_unban( action: &ChatCommand, ) { if let Ok(username) = scan_fmt!(&args, &action.arg_fmt(), String) { - let uuid_result = server.state.ecs().read_resource::().username_to_uuid(&username); + let uuid_result = server + .state + .ecs() + .read_resource::() + .username_to_uuid(&username); if let Ok(uuid) = uuid_result { server.settings_mut().edit(|s| { @@ -1937,10 +1954,12 @@ fn handle_unban( } else { server.notify_client( client, - ChatType::CommandError.server_msg(format!("Unable to determine UUID for username \"{}\"", username)) + ChatType::CommandError.server_msg(format!( + "Unable to determine UUID for username \"{}\"", + username + )), ) } - } else { server.notify_client( client, diff --git a/server/src/login_provider.rs b/server/src/login_provider.rs index bf2087c024..5b4e2c0cea 100644 --- a/server/src/login_provider.rs +++ b/server/src/login_provider.rs @@ -1,4 +1,4 @@ -use authc::{AuthClient, AuthToken, Uuid, AuthClientError}; +use authc::{AuthClient, AuthClientError, AuthToken, Uuid}; use common::msg::RegisterError; use hashbrown::HashMap; use std::str::FromStr; @@ -53,7 +53,7 @@ impl LoginProvider { &mut self, username_or_token: &str, whitelist: &[String], - banlist: &HashMap, + banlist: &HashMap, ) -> Result<(String, Uuid), RegisterError> { self // resolve user information @@ -105,6 +105,9 @@ impl LoginProvider { } pub fn username_to_uuid(&self, username: &str) -> Result { - self.auth_server.as_ref().map_or_else(|| Ok(derive_uuid(username)), |auth| auth.username_to_uuid(&username)) + self.auth_server.as_ref().map_or_else( + || Ok(derive_uuid(username)), + |auth| auth.username_to_uuid(&username), + ) } } diff --git a/server/src/settings.rs b/server/src/settings.rs index 0dee4d8c86..28ce571c95 100644 --- a/server/src/settings.rs +++ b/server/src/settings.rs @@ -1,10 +1,10 @@ +use authc::Uuid; use hashbrown::HashMap; use portpicker::pick_unused_port; use serde::{Deserialize, Serialize}; use std::{fs, io::prelude::*, net::SocketAddr, path::PathBuf, time::Duration}; use tracing::{error, warn}; use world::sim::FileOpts; -use authc::Uuid; const DEFAULT_WORLD_SEED: u32 = 59686;