diff --git a/RageCoop.Client/Networking/Networking.cs b/RageCoop.Client/Networking/Networking.cs index e786aee..4f9466a 100644 --- a/RageCoop.Client/Networking/Networking.cs +++ b/RageCoop.Client/Networking/Networking.cs @@ -91,7 +91,7 @@ namespace RageCoop.Client PedID = Main.LocalPlayerID, Username =username, ModVersion = Main.CurrentVersion, - PassHashEncrypted=Security.Encrypt(password.GetHash()) + PassHashEncrypted=Security.Encrypt(password.GetSHA256Hash()) }; Security.GetSymmetricKeysCrypted(out handshake.AesKeyCrypted, out handshake.AesIVCrypted); diff --git a/RageCoop.Client/Util/Util.cs b/RageCoop.Client/Util/Util.cs index 2952024..a4eb6f1 100644 --- a/RageCoop.Client/Util/Util.cs +++ b/RageCoop.Client/Util/Util.cs @@ -230,11 +230,6 @@ namespace RageCoop.Client { Function.Call(Hash.SET_RADIO_TO_STATION_INDEX, index); } - public static byte[] GetHash(this string inputString) - { - using (HashAlgorithm algorithm = SHA256.Create()) - return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString)); - } #region WIN32 diff --git a/RageCoop.Core/CoreUtils.cs b/RageCoop.Core/CoreUtils.cs index 29df5b0..31a7ecf 100644 --- a/RageCoop.Core/CoreUtils.cs +++ b/RageCoop.Core/CoreUtils.cs @@ -111,13 +111,6 @@ namespace RageCoop.Core bytes.AddInt(toadd.Length); bytes.AddRange(toadd); } - - public static int GetHash(string s) - { - MD5 md5Hasher = MD5.Create(); - var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(s)); - return BitConverter.ToInt32(hashed, 0); - } public static byte[] GetBytes(this string s) { return Encoding.UTF8.GetBytes(s); @@ -284,4 +277,21 @@ namespace RageCoop.Core return false; } } + + /// + /// Some extension methods provided by RageCoop + /// + public static class PublicExtensions + { + /// + /// Get a hex-encoded string of the input string hashed by SHA256 algorithmn, internally used to hash password at client side. + /// + /// + /// + public static byte[] GetSHA256Hash(this string inputString) + { + using (HashAlgorithm algorithm = SHA256.Create()) + return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString)); + } + } } diff --git a/RageCoop.Server/Client.cs b/RageCoop.Server/Client.cs index afbc50b..7cdd6a8 100644 --- a/RageCoop.Server/Client.cs +++ b/RageCoop.Server/Client.cs @@ -134,13 +134,7 @@ namespace RageCoop.Server { try { - NetConnection userConnection = Server.MainNetServer.Connections.Find(x => x.RemoteUniqueIdentifier == NetID); - if (userConnection == null) - { - return; - } - - Server.SendChatMessage(from, message, userConnection); + Server.SendChatMessage(from, message, this); } catch (Exception e) { diff --git a/RageCoop.Server/Program.cs b/RageCoop.Server/Program.cs index 3a07dd1..70aa4d7 100644 --- a/RageCoop.Server/Program.cs +++ b/RageCoop.Server/Program.cs @@ -39,6 +39,7 @@ namespace RageCoop.Server mainLogger.Info("Server stopped."); mainLogger.Dispose(); Thread.Sleep(3000); + Environment.Exit(0); } else { @@ -49,6 +50,15 @@ namespace RageCoop.Server }; server.Start(); mainLogger?.Info("Please use CTRL + C if you want to stop the server!"); + while (true) + { + mainLogger?.Info("Type here to send chat message: "); + var s=Console.ReadLine(); + if (!Stopping && s!=null) + { + server.ChatMessageReceived("Server", s, null); + } + } } catch (Exception e) { diff --git a/RageCoop.Server/Scripting/API.cs b/RageCoop.Server/Scripting/API.cs index 575b68e..c5faa82 100644 --- a/RageCoop.Server/Scripting/API.cs +++ b/RageCoop.Server/Scripting/API.cs @@ -95,7 +95,7 @@ namespace RageCoop.Server.Scripting else { - Server.SendChatMessage("Server", "Command not found!", sender.Connection); + Server.SendChatMessage("Server", "Command not found!", sender); } } @@ -211,7 +211,7 @@ namespace RageCoop.Server.Scripting targets ??= new(Server.Clients.Values); foreach(Client client in targets) { - Server.SendChatMessage(username, message, client.Connection); + Server.SendChatMessage(username, message, client); } } catch (Exception e) diff --git a/RageCoop.Server/Server.cs b/RageCoop.Server/Server.cs index 01003d6..8ca8572 100644 --- a/RageCoop.Server/Server.cs +++ b/RageCoop.Server/Server.cs @@ -221,6 +221,7 @@ namespace RageCoop.Server Resources.LoadAll(); _listenerThread=new Thread(() => Listen()); _listenerThread.Start(); + Logger?.Info("Listening for clients"); } /// /// Terminate threads and stop the server @@ -239,7 +240,6 @@ namespace RageCoop.Server private void Listen() { NetIncomingMessage msg=null; - Logger?.Info("Listening for clients"); while (!_stopping) { try @@ -481,7 +481,7 @@ namespace RageCoop.Server packet.Unpack(data); _worker.QueueJob(() => API.Events.InvokeOnChatMessage(packet, sender)); - SendChatMessage(packet, sender); + ChatMessageReceived(packet.Username,packet.Message, sender); } break; case PacketType.CustomEvent: @@ -666,7 +666,7 @@ namespace RageCoop.Server if (!string.IsNullOrEmpty(Settings.WelcomeMessage)) { - SendChatMessage(new Packets.ChatMessage() { Username = "Server", Message = Settings.WelcomeMessage }, null,new List() { newClient.Connection }); + ChatMessageReceived("Server",Settings.WelcomeMessage , null); } } @@ -773,35 +773,44 @@ namespace RageCoop.Server #endregion // Send a message to targets or all players - private void SendChatMessage(Packets.ChatMessage packet,Client sender=null, List targets = null) + internal void ChatMessageReceived(string name, string message,Client sender=null) { - if (packet.Message.StartsWith('/')) + if (message.StartsWith('/')) { - string[] cmdArgs = packet.Message.Split(" "); + string[] cmdArgs = message.Split(" "); string cmdName = cmdArgs[0].Remove(0, 1); _worker.QueueJob(()=>API.Events.InvokeOnCommandReceived(cmdName, cmdArgs, sender)); - - return; } - packet.Message = packet.Message.Replace("~", ""); - SendChatMessage(packet.Username, packet.Message, targets); + message = message.Replace("~", ""); - Logger?.Info(packet.Username + ": " + packet.Message); + var msg=MainNetServer.CreateMessage(); + new Packets.ChatMessage() + { + Username=name, + Message=message + }.Pack(msg); + + if (sender==null) + { + // Sent by server + MainNetServer.SendToAll(msg,NetDeliveryMethod.ReliableOrdered,(int)ConnectionChannel.Chat); + } + else + { + MainNetServer.SendToAll(msg,sender.Connection, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.Chat); + } + Logger?.Info(name + ": " + message); } - - internal void SendChatMessage(string username, string message, List targets = null) + internal void SendChatMessage(string name, string message, Client target) { - if (MainNetServer.Connections.Count==0) { return; } - NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage(); - - new Packets.ChatMessage() { Username = username, Message = message }.Pack(outgoingMessage); - - MainNetServer.SendMessage(outgoingMessage, targets ?? MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, (byte)ConnectionChannel.Chat); - } - internal void SendChatMessage(string username, string message, NetConnection target) - { - SendChatMessage(username, message, new List() { target }); + var msg = MainNetServer.CreateMessage(); + new Packets.ChatMessage() + { + Username= name, + Message=message, + }.Pack(msg); + MainNetServer.SendMessage(msg, target.Connection, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.Chat); } #endregion