From 692e55677752547ef930eff937b01b66986a3594 Mon Sep 17 00:00:00 2001 From: Artem Fedorov Date: Sun, 15 Dec 2024 13:06:39 +0100 Subject: [PATCH] Small fixes --- .../dto/config.rs => common/config/gs.rs} | 20 +++++++++-------- .../dto/config.rs => common/config/login.rs} | 22 ++++++++++--------- src/common/config/mod.rs | 4 ++++ src/common/mod.rs | 1 + src/common/packets/gs_2_ls/gs_status.rs | 20 +++++++++++++++-- src/game_server/controller.rs | 2 +- src/game_server/dto/mod.rs | 1 - src/game_server/handlers.rs | 2 +- src/game_server/mod.rs | 3 +-- .../packets/handleable/gs_auth_response.rs | 20 ++++------------- .../handleable/player_auth_response.rs | 7 ++---- src/login_server/client_thread/handler.rs | 10 ++++----- src/login_server/controller/data.rs | 11 +++++----- src/login_server/dto/mod.rs | 1 - src/login_server/gs_thread/handler.rs | 6 ++--- src/login_server/mod.rs | 4 ++-- 16 files changed, 71 insertions(+), 63 deletions(-) rename src/{game_server/dto/config.rs => common/config/gs.rs} (99%) rename src/{login_server/dto/config.rs => common/config/login.rs} (92%) create mode 100644 src/common/config/mod.rs delete mode 100644 src/game_server/dto/mod.rs diff --git a/src/game_server/dto/config.rs b/src/common/config/gs.rs similarity index 99% rename from src/game_server/dto/config.rs rename to src/common/config/gs.rs index c03be30..ef66d8b 100644 --- a/src/game_server/dto/config.rs +++ b/src/common/config/gs.rs @@ -36,15 +36,6 @@ pub struct GSServer { #[serde(default)] pub ip_config: Vec, } -impl GSServer { - pub fn get_hosts(&self) -> Vec { - self.ip_config - .iter() - .flat_map(|h| vec![h.subnet.to_string(), h.ip.to_string()]) - .collect() - } -} - fn deserialize_hex_to_bigint<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, @@ -52,6 +43,7 @@ where let s = String::deserialize(deserializer)?; BigInt::from_str_radix(&s, 16).map_err(Error::custom) } + fn deserialize_server_type<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, @@ -60,6 +52,15 @@ where ServerType::from_str(&s).map_err(Error::custom) } +impl GSServer { + pub fn get_hosts(&self) -> Vec { + self.ip_config + .iter() + .flat_map(|h| vec![h.subnet.to_string(), h.ip.to_string()]) + .collect() + } +} + impl GSServer { fn auto_ip_config(&mut self) { // Get all network interfaces @@ -94,6 +95,7 @@ impl GSServer { } } } + impl ServerConfig for GSServer { fn load(file_name: &str) -> Self { let file = File::open(file_name) diff --git a/src/login_server/dto/config.rs b/src/common/config/login.rs similarity index 92% rename from src/login_server/dto/config.rs rename to src/common/config/login.rs index 21cd57f..823d652 100644 --- a/src/login_server/dto/config.rs +++ b/src/common/config/login.rs @@ -1,6 +1,7 @@ use crate::common::dto::{Database, InboundConnection, Runtime}; use crate::common::traits::ServerConfig; -use num::{BigInt, Num}; +use num::BigInt; +use num_traits::Num; use serde::de::Error; use serde::{Deserialize, Deserializer}; use std::fs::File; @@ -8,7 +9,7 @@ use std::io::BufReader; use tracing::info; #[derive(Debug, Clone, Deserialize)] -pub struct Server { +pub struct LoginServer { pub name: String, pub blowfish_key: String, pub runtime: Option, @@ -20,19 +21,19 @@ pub struct Server { pub client: Client, } -impl ServerConfig for Server { +impl ServerConfig for LoginServer { fn load(file_name: &str) -> Self { let file = File::open(file_name) .unwrap_or_else(|e| panic!("Failed to open config file: {file_name}. Error: {e}")); let reader = BufReader::new(file); - let config: Server = serde_yaml::from_reader(reader).unwrap_or_else(|e| { + let config: LoginServer = serde_yaml::from_reader(reader).unwrap_or_else(|e| { panic!("Unable to parse {file_name}, the format is incorrect, {e}") }); info!("Configuration ok, starting application: {}", config.name); config } fn from_string(conf: &str) -> Self { - serde_yaml::from_str::(conf) + serde_yaml::from_str::(conf) .unwrap_or_else(|e| panic!("Unable to parse {conf}, the format is incorrect, {e}")) } @@ -43,6 +44,7 @@ impl ServerConfig for Server { &self.database } } + // Custom deserialization function to validate that all keys in the HashMap are valid hex strings fn validate_allowed_gs_keys<'de, D>(deserializer: D) -> Result>, D::Error> where @@ -70,11 +72,6 @@ where Ok(None) } -#[derive(Debug, Clone, Deserialize)] -pub struct GSMessages { - pub timeout: u8, -} - #[derive(Debug, Clone, Deserialize)] pub struct GSListener { pub connection: InboundConnection, @@ -98,3 +95,8 @@ pub struct Client { pub show_licence: bool, pub enable_cmdline_login: bool, } + +#[derive(Debug, Clone, Deserialize)] +pub struct GSMessages { + pub timeout: u8, +} diff --git a/src/common/config/mod.rs b/src/common/config/mod.rs new file mode 100644 index 0000000..c94d3b1 --- /dev/null +++ b/src/common/config/mod.rs @@ -0,0 +1,4 @@ +/// All config DTO must be inside common module, +/// as they might be shared between components as arguments +pub mod gs; +pub mod login; diff --git a/src/common/mod.rs b/src/common/mod.rs index c534253..e96b703 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -13,6 +13,7 @@ pub mod str; #[cfg(test)] pub mod tests; pub mod traits; +pub mod config; pub async fn hash_password(password: &str) -> anyhow::Result { let pwd = password.to_owned(); diff --git a/src/common/packets/gs_2_ls/gs_status.rs b/src/common/packets/gs_2_ls/gs_status.rs index d246386..2180b04 100644 --- a/src/common/packets/gs_2_ls/gs_status.rs +++ b/src/common/packets/gs_2_ls/gs_status.rs @@ -2,10 +2,11 @@ use crate::common::packets::common::{GSStatus, ReadablePacket, SendablePacket}; use crate::common::packets::read::ReadablePacketBuffer; use crate::common::packets::write::SendablePacketBuffer; use crate::common::traits::handlers::PacketHandler; +use crate::common::config::gs::GSServer; #[derive(Clone, Debug, Default)] pub struct GSStatusUpdate { - pub buffer: SendablePacketBuffer, + buffer: SendablePacketBuffer, pub status: GSStatus, pub use_square_brackets: bool, pub max_players: u32, @@ -20,7 +21,22 @@ impl GSStatusUpdate { const MAX_PLAYERS: i32 = 0x04; const TEST_SERVER: i32 = 0x05; const SERVER_AGE: i32 = 0x06; - + pub fn new(cfg: &GSServer) -> anyhow::Result { + let mut inst = Self { + buffer: SendablePacketBuffer::new(), + status: if cfg.gm_only { + GSStatus::GmOnly + } else { + GSStatus::Auto + }, + use_square_brackets: cfg.use_brackets, + max_players: cfg.max_players, + server_type: cfg.server_type as i32, + server_age: cfg.server_age, + }; + inst.write_all()?; + Ok(inst) + } #[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)] pub fn write_all(&mut self) -> Result<(), anyhow::Error> { self.buffer.write(0x06)?; diff --git a/src/game_server/controller.rs b/src/game_server/controller.rs index 6d54e86..7089eb7 100644 --- a/src/game_server/controller.rs +++ b/src/game_server/controller.rs @@ -1,6 +1,6 @@ use crate::common::traits::IpBan; -use crate::game_server::dto::config::GSServer; use std::sync::Arc; +use crate::common::config::gs::GSServer; #[derive(Clone, Debug)] pub struct Controller { diff --git a/src/game_server/dto/mod.rs b/src/game_server/dto/mod.rs deleted file mode 100644 index a105933..0000000 --- a/src/game_server/dto/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod config; \ No newline at end of file diff --git a/src/game_server/handlers.rs b/src/game_server/handlers.rs index 9a5ca33..193da0a 100644 --- a/src/game_server/handlers.rs +++ b/src/game_server/handlers.rs @@ -5,7 +5,7 @@ use crate::common::traits::Shutdown; use crate::crypt::login::Encryption; use crate::database::DBPool; use crate::game_server::controller::Controller; -use crate::game_server::dto::config::GSServer; +use crate::common::config::gs::GSServer; use crate::game_server::lsp_factory::build_ls_packet; use anyhow::{bail, Error}; use std::sync::Arc; diff --git a/src/game_server/mod.rs b/src/game_server/mod.rs index 993b3a3..d569d93 100644 --- a/src/game_server/mod.rs +++ b/src/game_server/mod.rs @@ -1,8 +1,7 @@ use crate::common::traits::server::Server; use crate::game_server::controller::Controller; -use crate::game_server::dto::config::GSServer; +use crate::common::config::gs::GSServer; pub mod lsp_factory; -pub mod dto; pub mod controller; pub mod handlers; pub mod packets; diff --git a/src/game_server/packets/handleable/gs_auth_response.rs b/src/game_server/packets/handleable/gs_auth_response.rs index 9bf6422..16eca95 100644 --- a/src/game_server/packets/handleable/gs_auth_response.rs +++ b/src/game_server/packets/handleable/gs_auth_response.rs @@ -1,5 +1,3 @@ -use async_trait::async_trait; -use tracing::{info, instrument}; use crate::common::packets::common::GSStatus; use crate::common::packets::error::PacketRun; use crate::common::packets::gs_2_ls::{GSStatusUpdate, PlayerInGame}; @@ -9,11 +7,13 @@ use crate::{ common::packets::{common::HandleablePacket, ls_2_gs}, game_server::handlers::LoginHandler, }; +use async_trait::async_trait; +use tracing::{info, instrument}; #[async_trait] impl HandleablePacket for ls_2_gs::AuthGS { type HandlerType = LoginHandler; - + #[instrument(skip_all)] async fn handle(&self, lh: &mut Self::HandlerType) -> Result<(), PacketRun> { let controller = lh.get_controller(); @@ -26,19 +26,7 @@ impl HandleablePacket for ls_2_gs::AuthGS { )), }); } - let mut gsu = GSStatusUpdate { - buffer: SendablePacketBuffer::new(), - status: if cfg.gm_only { - GSStatus::GmOnly - } else { - GSStatus::Auto - }, - use_square_brackets: cfg.use_brackets, - max_players: cfg.max_players, - server_type: cfg.server_type as i32, - server_age: cfg.server_age, - }; - gsu.write_all()?; + let gsu = GSStatusUpdate::new(&cfg)?; lh.send_packet(Box::new(gsu)).await?; info!( "Registered on Login server: {:} ({:})", diff --git a/src/game_server/packets/handleable/player_auth_response.rs b/src/game_server/packets/handleable/player_auth_response.rs index c343598..6f9ceec 100644 --- a/src/game_server/packets/handleable/player_auth_response.rs +++ b/src/game_server/packets/handleable/player_auth_response.rs @@ -1,13 +1,10 @@ use async_trait::async_trait; +use crate::common::packets::error::PacketRun; use crate::{ - common::packets::{ - common::HandleablePacket - , ls_2_gs, - }, + common::packets::{common::HandleablePacket, ls_2_gs}, game_server::handlers::LoginHandler, }; -use crate::common::packets::error::PacketRun; #[async_trait] impl HandleablePacket for ls_2_gs::PlayerAuthResponse { diff --git a/src/login_server/client_thread/handler.rs b/src/login_server/client_thread/handler.rs index 41c00c0..be3d7d8 100644 --- a/src/login_server/client_thread/handler.rs +++ b/src/login_server/client_thread/handler.rs @@ -8,7 +8,7 @@ use crate::crypt::login::Encryption; use crate::crypt::{generate_blowfish_key, rsa}; use crate::database::DBPool; use crate::login_server::controller::Login; -use crate::login_server::dto::config::Server; +use crate::common::config::login::LoginServer; use crate::login_server::packet::cp_factory::build_client_packet; use crate::login_server::packet::to_client::Init; use anyhow::{Context, Error}; @@ -82,7 +82,7 @@ impl Shutdown for Client { #[async_trait] impl PacketHandler for Client { - type ConfigType = Server; + type ConfigType = LoginServer; type ControllerType = Login; fn get_handler_name() -> &'static str { "Login client handler" @@ -176,7 +176,7 @@ impl PacketHandler for Client { } impl InboundHandler for Client { - type ConfigType = Server; + type ConfigType = LoginServer; fn get_connection_config(cfg: &Self::ConfigType) -> &InboundConnection { &cfg.listeners.clients.connection @@ -188,7 +188,7 @@ mod test { use super::*; use crate::common::tests::get_test_db; use crate::common::traits::ServerConfig; - use crate::login_server::dto::config::Server; + use crate::common::config::login::LoginServer; use tokio::net::TcpListener; #[tokio::test] @@ -197,7 +197,7 @@ mod test { let listener = TcpListener::bind("127.0.0.1:3333").await.unwrap(); let addr = listener.local_addr().unwrap(); let db_pool = get_test_db().await; - let cfg = Server::from_string(include_str!("../../test_data/test_config.yaml")); + let cfg = LoginServer::from_string(include_str!("../../test_data/test_config.yaml")); let lc = Arc::new(Login::new(Arc::new(cfg))); let cloned_lc = lc.clone(); // Spawn a server task to handle a single connection diff --git a/src/login_server/controller/data.rs b/src/login_server/controller/data.rs index 619774d..0f95740 100644 --- a/src/login_server/controller/data.rs +++ b/src/login_server/controller/data.rs @@ -1,7 +1,8 @@ +use crate::common::config::login; +use crate::crypt::rsa::{generate_rsa_key_pair, ScrambledRSAKeyPair}; use crate::login_server::dto::game_server::GSInfo; -use crate::login_server::dto::{config, player}; +use crate::login_server::dto::player; use crate::login_server::message::Request; -use crate::crypt::rsa::{generate_rsa_key_pair, ScrambledRSAKeyPair}; use dashmap::DashMap; use rand::Rng; use std::sync::Arc; @@ -11,7 +12,7 @@ use tracing::info; #[derive(Clone, Debug)] pub struct Login { key_pairs: Vec, - pub(super) config: Arc, + pub(super) config: Arc, pub(super) game_servers: DashMap, pub(super) ip_ban_list: DashMap, pub(super) players: DashMap, @@ -19,7 +20,7 @@ pub struct Login { } impl Login { - pub fn new(config: Arc) -> Login { + pub fn new(config: Arc) -> Login { info!("Loading LoginController..."); Login { key_pairs: Login::generate_rsa_key_pairs(10), @@ -30,7 +31,7 @@ impl Login { gs_channels: DashMap::new(), } } - pub fn get_config(&self) -> &config::Server { + pub fn get_config(&self) -> &login::LoginServer { &self.config } pub fn get_game_server(&self, gs_id: u8) -> Option { diff --git a/src/login_server/dto/mod.rs b/src/login_server/dto/mod.rs index 75c9c8e..4737edb 100644 --- a/src/login_server/dto/mod.rs +++ b/src/login_server/dto/mod.rs @@ -1,3 +1,2 @@ -pub mod config; pub mod game_server; pub mod player; diff --git a/src/login_server/gs_thread/handler.rs b/src/login_server/gs_thread/handler.rs index 6fc0ce8..0428af2 100644 --- a/src/login_server/gs_thread/handler.rs +++ b/src/login_server/gs_thread/handler.rs @@ -9,7 +9,7 @@ use crate::crypt::login::Encryption; use crate::crypt::rsa::ScrambledRSAKeyPair; use crate::database::DBPool; use crate::login_server::controller::Login; -use crate::login_server::dto::config::Server; +use crate::common::config::login::LoginServer; use crate::login_server::gs_thread::enums; use crate::login_server::message::Request; use crate::login_server::packet::gs_factory::build_gs_packet; @@ -129,7 +129,7 @@ impl Shutdown for GameServer { #[async_trait] impl PacketHandler for GameServer { - type ConfigType = Server; + type ConfigType = LoginServer; type ControllerType = Login; fn get_handler_name() -> &'static str { "Game server handler" @@ -215,7 +215,7 @@ impl PacketHandler for GameServer { } impl InboundHandler for GameServer { - type ConfigType = Server; + type ConfigType = LoginServer; fn get_connection_config(cfg: &Self::ConfigType) -> &InboundConnection { &cfg.listeners.game_servers.connection diff --git a/src/login_server/mod.rs b/src/login_server/mod.rs index 293108e..4c97f31 100644 --- a/src/login_server/mod.rs +++ b/src/login_server/mod.rs @@ -1,8 +1,8 @@ +use crate::common::config::login; use crate::common::traits::handlers::PacketHandler; use crate::common::traits::server::Server; use crate::common::traits::IpBan; use crate::login_server::controller::Login; -use crate::login_server::dto::config; pub mod client_thread; pub mod controller; pub mod dto; @@ -13,6 +13,6 @@ mod packet; pub struct LoginServer; impl Server for LoginServer { - type ConfigType = config::Server; + type ConfigType = login::LoginServer; type ControllerType = Login; }