diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 26f3e75cd..f8106c2d2 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -28,10 +28,10 @@ namespace Barotrauma.Networking private List otherClients; - private string serverIP; - - private bool needAuth; - private bool requiresPw; + private string serverIP; + + private bool needAuth; + private bool requiresPw; private int nonce; private string saltedPw; @@ -131,7 +131,7 @@ namespace Barotrauma.Networking return; } - NetOutgoingMessage outmsg = client.CreateMessage(); + NetOutgoingMessage outmsg = client.CreateMessage(); outmsg.Write((byte)ClientPacketHeader.REQUEST_AUTH); // Connect client, to ip previously requested from user @@ -200,12 +200,12 @@ namespace Barotrauma.Networking // Loop until we are approved while (!CanStart && !connectCancelled) { - if (reconnectBox == null) - { - reconnectBox = new GUIMessageBox("CONNECTING", "Connecting to " + serverIP, new string[] { "Cancel" }); - - reconnectBox.Buttons[0].OnClicked += CancelConnect; - reconnectBox.Buttons[0].OnClicked += reconnectBox.Close; + if (reconnectBox == null) + { + reconnectBox = new GUIMessageBox("CONNECTING", "Connecting to " + serverIP, new string[] { "Cancel" }); + + reconnectBox.Buttons[0].OnClicked += CancelConnect; + reconnectBox.Buttons[0].OnClicked += reconnectBox.Close; } int seconds = DateTime.Now.Second; @@ -217,41 +217,41 @@ namespace Barotrauma.Networking } reconnectBox.Text = connectingText; - if (DateTime.Now > reqAuthTime) - { - if (needAuth) - { - //request auth again - NetOutgoingMessage reqAuthMsg = client.CreateMessage(); - reqAuthMsg.Write((byte)ClientPacketHeader.REQUEST_AUTH); - client.SendMessage(reqAuthMsg, NetDeliveryMethod.Unreliable); - } - else - { - //request init again - if (!requiresPw) - { - NetOutgoingMessage outmsg = client.CreateMessage(); - outmsg.Write((byte)ClientPacketHeader.REQUEST_INIT); - outmsg.Write(GameMain.Version.ToString()); - outmsg.Write(GameMain.SelectedPackage.Name); - outmsg.Write(GameMain.SelectedPackage.MD5hash.Hash); - outmsg.Write(name); - client.SendMessage(outmsg, NetDeliveryMethod.Unreliable); - } - else - { - NetOutgoingMessage outmsg = client.CreateMessage(); - outmsg.Write((byte)ClientPacketHeader.REQUEST_INIT); - outmsg.Write(saltedPw); - outmsg.Write(GameMain.Version.ToString()); - outmsg.Write(GameMain.SelectedPackage.Name); - outmsg.Write(GameMain.SelectedPackage.MD5hash.Hash); - outmsg.Write(name); - client.SendMessage(outmsg, NetDeliveryMethod.Unreliable); - } - } - reqAuthTime = DateTime.Now + new TimeSpan(0, 0, 1); + if (DateTime.Now > reqAuthTime) + { + if (needAuth) + { + //request auth again + NetOutgoingMessage reqAuthMsg = client.CreateMessage(); + reqAuthMsg.Write((byte)ClientPacketHeader.REQUEST_AUTH); + client.SendMessage(reqAuthMsg, NetDeliveryMethod.Unreliable); + } + else + { + //request init again + if (!requiresPw) + { + NetOutgoingMessage outmsg = client.CreateMessage(); + outmsg.Write((byte)ClientPacketHeader.REQUEST_INIT); + outmsg.Write(GameMain.Version.ToString()); + outmsg.Write(GameMain.SelectedPackage.Name); + outmsg.Write(GameMain.SelectedPackage.MD5hash.Hash); + outmsg.Write(name); + client.SendMessage(outmsg, NetDeliveryMethod.Unreliable); + } + else + { + NetOutgoingMessage outmsg = client.CreateMessage(); + outmsg.Write((byte)ClientPacketHeader.REQUEST_INIT); + outmsg.Write(saltedPw); + outmsg.Write(GameMain.Version.ToString()); + outmsg.Write(GameMain.SelectedPackage.Name); + outmsg.Write(GameMain.SelectedPackage.MD5hash.Hash); + outmsg.Write(name); + client.SendMessage(outmsg, NetDeliveryMethod.Unreliable); + } + } + reqAuthTime = DateTime.Now + new TimeSpan(0, 0, 1); } yield return CoroutineStatus.Running; @@ -265,42 +265,42 @@ namespace Barotrauma.Networking string pwMsg = "Password required"; try - { - switch (inc.MessageType) - { - case NetIncomingMessageType.Data: - ServerPacketHeader header = (ServerPacketHeader)inc.ReadByte(); - switch (header) - { - case ServerPacketHeader.AUTH_RESPONSE: - if (needAuth) - { - if (inc.ReadBoolean()) - { - //requires password - nonce = inc.ReadInt32(); - requiresPw = true; - } - else - { - requiresPw = false; - } - needAuth = false; //got auth! - } - break; - case ServerPacketHeader.AUTH_FAILURE: - //failed to authenticate, can still use same nonce - pwMsg = inc.ReadString(); - requiresPw = true; - break; - case ServerPacketHeader.UPDATE_LOBBY: - //server accepted client - CanStart = true; - break; - } - break; - case NetIncomingMessageType.StatusChanged: - NetConnectionStatus connectionStatus = (NetConnectionStatus)inc.ReadByte(); + { + switch (inc.MessageType) + { + case NetIncomingMessageType.Data: + ServerPacketHeader header = (ServerPacketHeader)inc.ReadByte(); + switch (header) + { + case ServerPacketHeader.AUTH_RESPONSE: + if (needAuth) + { + if (inc.ReadBoolean()) + { + //requires password + nonce = inc.ReadInt32(); + requiresPw = true; + } + else + { + requiresPw = false; + } + needAuth = false; //got auth! + } + break; + case ServerPacketHeader.AUTH_FAILURE: + //failed to authenticate, can still use same nonce + pwMsg = inc.ReadString(); + requiresPw = true; + break; + case ServerPacketHeader.UPDATE_LOBBY: + //server accepted client + CanStart = true; + break; + } + break; + case NetIncomingMessageType.StatusChanged: + NetConnectionStatus connectionStatus = (NetConnectionStatus)inc.ReadByte(); if (connectionStatus == NetConnectionStatus.Disconnected) { string denyMessage = inc.ReadString(); @@ -308,8 +308,8 @@ namespace Barotrauma.Networking new GUIMessageBox("Couldn't connect to server", denyMessage); connectCancelled = true; - } - break; + } + break; } } @@ -319,67 +319,82 @@ namespace Barotrauma.Networking break; } - if (requiresPw && !CanStart && !connectCancelled) - { - if (reconnectBox != null) - { - reconnectBox.Close(null, null); - reconnectBox = null; - } - - var msgBox = new GUIMessageBox(pwMsg, "", new string[] { "OK", "Cancel" }); - var passwordBox = new GUITextBox(new Rectangle(0, 40, 150, 25), Alignment.TopLeft, GUI.Style, msgBox.children[0]); - passwordBox.UserData = "password"; - - var okButton = msgBox.Buttons[0]; - var cancelButton = msgBox.Buttons[1]; - - while (GUIMessageBox.MessageBoxes.Contains(msgBox)) - { - while (client.ReadMessage() != null) { - - } - - if (DateTime.Now > reqAuthTime) - { - //request auth again to prevent timeout - NetOutgoingMessage reqAuthMsg = client.CreateMessage(); - reqAuthMsg.Write((byte)ClientPacketHeader.REQUEST_AUTH); - client.SendMessage(reqAuthMsg, NetDeliveryMethod.Unreliable); - reqAuthTime = DateTime.Now + new TimeSpan(0, 0, 3); - } - - okButton.Enabled = !string.IsNullOrWhiteSpace(passwordBox.Text); - - if (okButton.Selected) - { - saltedPw = Encoding.UTF8.GetString(NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(passwordBox.Text))); - saltedPw = saltedPw + Convert.ToString(nonce); - saltedPw = Encoding.UTF8.GetString(NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(saltedPw))); - - timeOut = DateTime.Now + new TimeSpan(0, 0, 20); - reqAuthTime = DateTime.Now + new TimeSpan(0, 0, 1); - - msgBox.Close(null, null); - break; - } - else if (cancelButton.Selected) - { - msgBox.Close(null, null); - connectCancelled = true; - } - else - { - yield return CoroutineStatus.Running; - } - } + if (requiresPw && !CanStart && !connectCancelled) + { + if (reconnectBox != null) + { + reconnectBox.Close(null, null); + reconnectBox = null; + } + + var msgBox = new GUIMessageBox(pwMsg, "", new string[] { "OK", "Cancel" }); + var passwordBox = new GUITextBox(new Rectangle(0, 40, 150, 25), Alignment.TopLeft, GUI.Style, msgBox.children[0]); + passwordBox.UserData = "password"; + + var okButton = msgBox.Buttons[0]; + var cancelButton = msgBox.Buttons[1]; + + while (GUIMessageBox.MessageBoxes.Contains(msgBox)) + { + while (client.ReadMessage() != null) + { + switch (inc.MessageType) + { + case NetIncomingMessageType.StatusChanged: + NetConnectionStatus connectionStatus = (NetConnectionStatus)inc.ReadByte(); + if (connectionStatus == NetConnectionStatus.Disconnected) + { + string denyMessage = inc.ReadString(); + + new GUIMessageBox("Couldn't connect to server", denyMessage); + + msgBox.Close(null, null); + connectCancelled = true; + } + break; + } + } + + if (DateTime.Now > reqAuthTime) + { + //request auth again to prevent timeout + NetOutgoingMessage reqAuthMsg = client.CreateMessage(); + reqAuthMsg.Write((byte)ClientPacketHeader.REQUEST_AUTH); + client.SendMessage(reqAuthMsg, NetDeliveryMethod.Unreliable); + reqAuthTime = DateTime.Now + new TimeSpan(0, 0, 3); + } + + okButton.Enabled = !string.IsNullOrWhiteSpace(passwordBox.Text); + + if (okButton.Selected) + { + saltedPw = Encoding.UTF8.GetString(NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(passwordBox.Text))); + saltedPw = saltedPw + Convert.ToString(nonce); + saltedPw = Encoding.UTF8.GetString(NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(saltedPw))); + + timeOut = DateTime.Now + new TimeSpan(0, 0, 20); + reqAuthTime = DateTime.Now + new TimeSpan(0, 0, 1); + + msgBox.Close(null, null); + break; + } + else if (cancelButton.Selected) + { + msgBox.Close(null, null); + connectCancelled = true; + } + else + { + yield return CoroutineStatus.Running; + } + } } } - if (reconnectBox != null) - { - reconnectBox.Close(null, null); - reconnectBox = null; + if (reconnectBox != null) + { + reconnectBox.Close(null, null); + reconnectBox = null; } if (connectCancelled) yield return CoroutineStatus.Success;