Detect disconnect while password box is open

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