From 6e4d556073ee4ce60022e5fc7f87b5bd72a021bd Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 14 Aug 2019 01:38:54 -0300 Subject: [PATCH 1/4] Add max chat message length Fixes #115 Credit to @scorpion9979 for the previous implementation (https://gitlab.com/veloren/veloren/merge_requests/215) --- client/src/lib.rs | 13 +++++++++++-- common/src/msg/mod.rs | 15 +++++++++++++++ server/src/lib.rs | 13 +++++++++++-- voxygen/src/hud/chat.rs | 10 +++++++--- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index a2dfee571a..b242c00c70 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -9,7 +9,10 @@ pub use specs::{join::Join, saveload::Marker, Entity as EcsEntity, ReadStorage}; use common::{ comp, - msg::{ClientMsg, ClientState, RequestStateError, ServerError, ServerInfo, ServerMsg}, + msg::{ + validate_chat_msg, ChatMsgValidationError, ClientMsg, ClientState, RequestStateError, + ServerError, ServerInfo, ServerMsg, MAX_BYTES_CHAT_MSG, + }, net::PostBox, state::{State, Uid}, terrain::{block::Block, TerrainChunk, TerrainChunkSize}, @@ -232,7 +235,13 @@ impl Client { /// Send a chat message to the server. #[allow(dead_code)] pub fn send_chat(&mut self, msg: String) { - self.postbox.send_message(ClientMsg::chat(msg)) + match validate_chat_msg(&msg) { + Ok(()) => self.postbox.send_message(ClientMsg::chat(msg)), + Err(ChatMsgValidationError::TooLong) => log::warn!( + "Attempted to send a message that's too long (Over {} bytes)", + MAX_BYTES_CHAT_MSG + ), + } } /// Remove all cached terrain diff --git a/common/src/msg/mod.rs b/common/src/msg/mod.rs index 25644b36de..f3230d50a9 100644 --- a/common/src/msg/mod.rs +++ b/common/src/msg/mod.rs @@ -16,3 +16,18 @@ pub enum ClientState { Dead, Character, } + +pub const MAX_BYTES_CHAT_MSG: usize = 80; + +pub enum ChatMsgValidationError { + TooLong, +} + +pub fn validate_chat_msg(msg: &str) -> Result<(), ChatMsgValidationError> { + // TODO: Consider using grapheme cluster count instead of size in bytes + if msg.len() <= MAX_BYTES_CHAT_MSG { + Ok(()) + } else { + Err(ChatMsgValidationError::TooLong) + } +} diff --git a/server/src/lib.rs b/server/src/lib.rs index ec5b9cf319..8fb719590a 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -999,8 +999,17 @@ impl Server { ClientState::Registered | ClientState::Spectator | ClientState::Dead - | ClientState::Character => new_chat_msgs - .push((Some(entity), ServerMsg::ChatMsg { chat_type, message })), + | ClientState::Character => match validate_chat_msg(&message) { + Ok(()) => new_chat_msgs.push(( + Some(entity), + ServerMsg::ChatMsg { chat_type, message }, + )), + Err(ChatMsgValidationError::TooLong) => log::warn!( + "Recieved a chat message that's too long (max:{} len:{})", + MAX_BYTES_CHAT_MSG, + message.len() + ), + }, ClientState::Pending => {} }, ClientMsg::PlayerPhysics { pos, vel, ori } => match client.client_state { diff --git a/voxygen/src/hud/chat.rs b/voxygen/src/hud/chat.rs index 82de74380f..b9e2119285 100644 --- a/voxygen/src/hud/chat.rs +++ b/voxygen/src/hud/chat.rs @@ -3,7 +3,7 @@ use super::{ KILL_COLOR, META_COLOR, PRIVATE_COLOR, SAY_COLOR, TELL_COLOR, TEXT_COLOR, }; use client::Event as ClientEvent; -use common::ChatType; +use common::{msg::validate_chat_msg, ChatType}; use conrod_core::{ input::Key, position::Dimension, @@ -59,7 +59,9 @@ impl<'a> Chat<'a> { } pub fn input(mut self, input: String) -> Self { - self.force_input = Some(input); + if let Ok(()) = validate_chat_msg(&input) { + self.force_input = Some(input); + } self } @@ -206,7 +208,9 @@ impl<'a> Widget for Chat<'a> { { let mut input = str.to_owned(); input.retain(|c| c != '\n'); - state.update(|s| s.input = input); + if let Ok(()) = validate_chat_msg(&input) { + state.update(|s| s.input = input); + } } } From e8340d88af47f8527af1f98ffd3285f755208d49 Mon Sep 17 00:00:00 2001 From: Nick12 Date: Thu, 15 Aug 2019 21:28:36 +0000 Subject: [PATCH 2/4] Increase max bytes per chat message --- common/src/msg/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/msg/mod.rs b/common/src/msg/mod.rs index f3230d50a9..09bdae25bb 100644 --- a/common/src/msg/mod.rs +++ b/common/src/msg/mod.rs @@ -17,7 +17,7 @@ pub enum ClientState { Character, } -pub const MAX_BYTES_CHAT_MSG: usize = 80; +pub const MAX_BYTES_CHAT_MSG: usize = 256; pub enum ChatMsgValidationError { TooLong, From 6d6c020eab86adb2ec6d32121e24515a507a5fc6 Mon Sep 17 00:00:00 2001 From: Acrimon Date: Fri, 4 Oct 2019 16:25:47 +0200 Subject: [PATCH 3/4] Updated to work on latest master. --- server/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/lib.rs b/server/src/lib.rs index 8fb719590a..a67c37c2c4 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -26,6 +26,7 @@ use common::{ state::{BlockChange, State, TimeOfDay, Uid}, terrain::{block::Block, TerrainChunk, TerrainChunkSize, TerrainGrid}, vol::{ReadVol, RectVolSize, Vox}, + msg::{validate_chat_msg, MAX_BYTES_CHAT_MSG, ChatMsgValidationError}, }; use crossbeam::channel; use hashbrown::{hash_map::Entry, HashMap}; From b4bca0a150f4f13c821f45aa788713894ff4b192 Mon Sep 17 00:00:00 2001 From: Acrimon Date: Fri, 4 Oct 2019 16:26:22 +0200 Subject: [PATCH 4/4] Format code. --- server/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/lib.rs b/server/src/lib.rs index a67c37c2c4..fda74b059a 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -21,12 +21,12 @@ use common::{ comp, effect::Effect, event::{EventBus, ServerEvent}, + msg::{validate_chat_msg, ChatMsgValidationError, MAX_BYTES_CHAT_MSG}, msg::{ClientMsg, ClientState, RequestStateError, ServerError, ServerInfo, ServerMsg}, net::PostOffice, state::{BlockChange, State, TimeOfDay, Uid}, terrain::{block::Block, TerrainChunk, TerrainChunkSize, TerrainGrid}, vol::{ReadVol, RectVolSize, Vox}, - msg::{validate_chat_msg, MAX_BYTES_CHAT_MSG, ChatMsgValidationError}, }; use crossbeam::channel; use hashbrown::{hash_map::Entry, HashMap};