From 52270e3a3522c75d08927a12ecdd372463b6e2a4 Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Tue, 30 Aug 2016 17:35:58 -0300 Subject: [PATCH] Hacked clients can't send chat messages from other characters anymore Also added sendername as userdata in chat messages, for now it's not used for anything but we'll probably find something where this is useful --- Subsurface/Source/Characters/Character.cs | 36 ++++++++--------- Subsurface/Source/Networking/ChatMessage.cs | 39 +++++++++++++++---- Subsurface/Source/Networking/Client.cs | 24 ++++++------ Subsurface/Source/Networking/GameServer.cs | 11 +++--- .../Source/Networking/GameServerLogin.cs | 6 +-- Subsurface/Source/Networking/NetworkMember.cs | 1 + Subsurface/Source/Screens/NetLobbyScreen.cs | 1 + 7 files changed, 73 insertions(+), 45 deletions(-) diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 0b7cfa7ea..337049b56 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -864,12 +864,12 @@ namespace Barotrauma return owner.isDead || owner.IsUnconscious || owner.Stun > 0.0f || owner.LockHands; } - if (inventory.Owner is Item) + if (inventory.Owner is Item) { var owner = (Item)inventory.Owner; - if (!CanAccessItem(owner)) - { - return false; + if (!CanAccessItem(owner)) + { + return false; } } return true; @@ -878,22 +878,22 @@ namespace Barotrauma public bool CanAccessItem(Item item) { if (item.ParentInventory != null) - { + { return CanAccessInventory(item.ParentInventory); - } - + } + float maxDist = item.PickDistance * 1.2f; - if (maxDist <= 0.01f) - { - maxDist = 150.0f; - } - - if (Vector2.Distance(WorldPosition, item.WorldPosition) < maxDist || - item.IsInsideTrigger(WorldPosition)) - { - return true; - } - + if (maxDist <= 0.01f) + { + maxDist = 150.0f; + } + + if (Vector2.Distance(WorldPosition, item.WorldPosition) < maxDist || + item.IsInsideTrigger(WorldPosition)) + { + return true; + } + return item.GetComponent() != null; } diff --git a/Subsurface/Source/Networking/ChatMessage.cs b/Subsurface/Source/Networking/ChatMessage.cs index 28c8b33f9..ed71aa84c 100644 --- a/Subsurface/Source/Networking/ChatMessage.cs +++ b/Subsurface/Source/Networking/ChatMessage.cs @@ -116,21 +116,46 @@ namespace Barotrauma.Networking public void WriteNetworkMessage(NetOutgoingMessage msg) { - msg.WriteRangedInteger(0, Enum.GetValues(typeof(ChatMessageType)).Length, (byte)Type); - msg.Write(Sender == null ? (ushort)0 : Sender.ID); - msg.Write(SenderName); + msg.WriteRangedInteger(0, Enum.GetValues(typeof(ChatMessageType)).Length, (byte)Type); + if (GameMain.Server != null) + { + msg.Write(Sender == null ? (ushort)0 : Sender.ID); + msg.Write(SenderName); + } msg.Write(Text); } public static ChatMessage ReadNetworkMessage(NetBuffer msg) { - ChatMessageType type = (ChatMessageType)msg.ReadRangedInteger(0, Enum.GetValues(typeof(ChatMessageType)).Length); - ushort senderId = msg.ReadUInt16(); - string senderName = msg.ReadString(); + ChatMessageType type = (ChatMessageType)msg.ReadRangedInteger(0, Enum.GetValues(typeof(ChatMessageType)).Length); + string senderName=""; + Character character = null; + if (GameMain.Server == null) + { + ushort senderId = msg.ReadUInt16(); + character = Entity.FindEntityByID(senderId) as Character; + senderName = msg.ReadString(); + } + else + { + NetIncomingMessage inc = msg as NetIncomingMessage; + if (inc == null) return null; + Client sender = GameMain.Server.ConnectedClients.Find(x => x.Connection == inc.SenderConnection); + if (sender == null) return null; + character = sender.Character; + if (character != null) + { + senderName = character.Name; + } + else + { + senderName = sender.name; + } + } string text = msg.ReadString(); - return new ChatMessage(senderName, text, type, Entity.FindEntityByID(senderId) as Character); + return new ChatMessage(senderName, text, type, character); } } } diff --git a/Subsurface/Source/Networking/Client.cs b/Subsurface/Source/Networking/Client.cs index d6fc927d5..0c5cdebae 100644 --- a/Subsurface/Source/Networking/Client.cs +++ b/Subsurface/Source/Networking/Client.cs @@ -93,17 +93,17 @@ namespace Barotrauma.Networking name = name.Substring(0, 20); } string rName = ""; - for (int i=0;i 126) - { - //TODO: allow safe unicode characters, this is just to prevent players from taking names that look similar but aren't the same - rName += '?'; - } - else - { - rName += name[i]; - } + for (int i=0;i 126) + { + //TODO: allow safe unicode characters, this is just to prevent players from taking names that look similar but aren't the same + rName += '?'; + } + else + { + rName += name[i]; + } } return rName; @@ -125,7 +125,7 @@ namespace Barotrauma.Networking } public bool HasPermission(ClientPermissions permission) - { + { return false; //Permissions.HasFlag(permission); } diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index d56fd4a5d..368a0f90c 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -1443,6 +1443,7 @@ namespace Barotrauma.Networking { Client sender = connectedClients.Find(x => x.Connection == inc.SenderConnection); ChatMessage message = ChatMessage.ReadNetworkMessage(inc); + if (message == null) return; List recipients = new List(); @@ -1494,7 +1495,7 @@ namespace Barotrauma.Networking if (similarity > 5.0f) { sender.ChatSpamCount++; - + if (sender.ChatSpamCount > 3) { //kick for spamming too much @@ -1633,10 +1634,10 @@ namespace Barotrauma.Networking headSpriteId = 0; } - if (sender.characterInfo != null) - { - //clients can't change their character's name once it's been set - name = sender.characterInfo.Name; + if (sender.characterInfo != null) + { + //clients can't change their character's name once it's been set + name = sender.characterInfo.Name; } List jobPreferences = new List(); diff --git a/Subsurface/Source/Networking/GameServerLogin.cs b/Subsurface/Source/Networking/GameServerLogin.cs index cce6d0c5f..ff617de88 100644 --- a/Subsurface/Source/Networking/GameServerLogin.cs +++ b/Subsurface/Source/Networking/GameServerLogin.cs @@ -81,10 +81,10 @@ namespace Barotrauma.Networking return; } - if (ConnectedClients.Count>=config.MaximumConnections) - { + if (ConnectedClients.Count>=config.MaximumConnections) + { inc.SenderConnection.Disconnect("Server full"); - return; + return; } DebugConsole.NewMessage("New player has joined the server", Color.White); diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index 55cb4ff48..027b1afb2 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -309,6 +309,7 @@ namespace Barotrauma.Networking ((chatBox.CountChildren % 2) == 0) ? Color.Transparent : Color.Black * 0.1f, message.Color, Alignment.Left, null, null, true); msg.Font = GUI.SmallFont; + msg.UserData = message.SenderName; msg.Padding = new Vector4(20.0f, 0, 0, 0); diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index aa205bf1c..309306e04 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -989,6 +989,7 @@ namespace Barotrauma ((chatBox.CountChildren % 2) == 0) ? Color.Transparent : Color.Black*0.1f, message.Color, Alignment.Left, GUI.Style, null, true); msg.Font = GUI.SmallFont; + msg.UserData = message.SenderName; msg.CanBeFocused = false; msg.Padding = new Vector4(20, 0, 0, 0);