Detect disconnect while password box is open
This commit is contained in:
@@ -28,10 +28,10 @@ namespace Barotrauma.Networking
|
||||
|
||||
private List<Client> 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;
|
||||
|
||||
Reference in New Issue
Block a user