From 7e79e69eae63a97c9b8464202adc34aa1ceaeeaf Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 5 May 2021 22:47:36 +0100 Subject: [PATCH] Remove public mutable state from Connection. --- OpenRA.Game/Server/Connection.cs | 58 +++++++++++++++++++------------- OpenRA.Game/Server/Server.cs | 15 ++++----- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/OpenRA.Game/Server/Connection.cs b/OpenRA.Game/Server/Connection.cs index bf337587ded3..c3971cc850e7 100644 --- a/OpenRA.Game/Server/Connection.cs +++ b/OpenRA.Game/Server/Connection.cs @@ -19,21 +19,29 @@ namespace OpenRA.Server public class Connection { public const int MaxOrderLength = 131072; - public Socket Socket; - public List Data = new List(); - public ReceiveState State = ReceiveState.Header; - public int ExpectLength = 8; - public int Frame = 0; - public int MostRecentFrame = 0; - public bool Validated; + + public readonly Socket Socket; + public readonly List Data = new List(); + public readonly int PlayerIndex; + public readonly string AuthToken; public long TimeSinceLastResponse => Game.RunTime - lastReceivedTime; - public bool TimeoutMessageShown = false; + public int MostRecentFrame { get; private set; } + + public bool TimeoutMessageShown; + public bool Validated; + + ReceiveState state = ReceiveState.Header; + int expectLength = 8; + int frame = 0; long lastReceivedTime = 0; - /* client data */ - public int PlayerIndex; - public string AuthToken; + public Connection(Socket socket, int playerIndex, string authToken) + { + Socket = socket; + PlayerIndex = playerIndex; + AuthToken = authToken; + } public byte[] PopBytes(int n) { @@ -85,21 +93,22 @@ bool ReadDataInner(Server server) public void ReadData(Server server) { if (ReadDataInner(server)) - while (Data.Count >= ExpectLength) + { + while (Data.Count >= expectLength) { - var bytes = PopBytes(ExpectLength); - switch (State) + var bytes = PopBytes(expectLength); + switch (state) { case ReceiveState.Header: { - ExpectLength = BitConverter.ToInt32(bytes, 0) - 4; - Frame = BitConverter.ToInt32(bytes, 4); - State = ReceiveState.Data; + expectLength = BitConverter.ToInt32(bytes, 0) - 4; + frame = BitConverter.ToInt32(bytes, 4); + state = ReceiveState.Data; - if (ExpectLength < 0 || ExpectLength > MaxOrderLength) + if (expectLength < 0 || expectLength > MaxOrderLength) { server.DropClient(this); - Log.Write("server", "Dropping client {0} for excessive order length = {1}", PlayerIndex, ExpectLength); + Log.Write("server", "Dropping client {0} for excessive order length = {1}", PlayerIndex, expectLength); return; } @@ -108,17 +117,18 @@ public void ReadData(Server server) case ReceiveState.Data: { - if (MostRecentFrame < Frame) - MostRecentFrame = Frame; + if (MostRecentFrame < frame) + MostRecentFrame = frame; - server.DispatchOrders(this, Frame, bytes); - ExpectLength = 8; - State = ReceiveState.Header; + server.DispatchOrders(this, frame, bytes); + expectLength = 8; + state = ReceiveState.Header; break; } } } + } } } diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 79f6b2bc459e..80aa2a83bac5 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -374,20 +374,17 @@ void AcceptConnection(TcpListener listener) return; } - var newConn = new Connection { Socket = newSocket }; + + // Validate player identity by asking them to sign a random blob of data + // which we can then verify against the player public key database + var token = Convert.ToBase64String(OpenRA.Exts.MakeArray(256, _ => (byte)Random.Next())); + + var newConn = new Connection(newSocket, ChooseFreePlayerIndex(), token); try { newConn.Socket.Blocking = false; newConn.Socket.NoDelay = true; - // Validate player identity by asking them to sign a random blob of data - // which we can then verify against the player public key database - var token = Convert.ToBase64String(OpenRA.Exts.MakeArray(256, _ => (byte)Random.Next())); - - // Assign the player number. - newConn.PlayerIndex = ChooseFreePlayerIndex(); - newConn.AuthToken = token; - // Send handshake and client index. var ms = new MemoryStream(8); ms.WriteArray(BitConverter.GetBytes(ProtocolVersion.Handshake));