Replaced excessively paranoid filename validation regex in FileReceiver with Path.GetInvalidFileNameChars, server is notified if a client cancels a file transfer for whatever reason
This commit is contained in:
@@ -3,9 +3,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
|
|
||||||
namespace Barotrauma.Networking
|
namespace Barotrauma.Networking
|
||||||
@@ -183,6 +181,7 @@ namespace Barotrauma.Networking
|
|||||||
var existingTransfer = activeTransfers.Find(t => t.SequenceChannel == inc.SequenceChannel);
|
var existingTransfer = activeTransfers.Find(t => t.SequenceChannel == inc.SequenceChannel);
|
||||||
if (existingTransfer != null)
|
if (existingTransfer != null)
|
||||||
{
|
{
|
||||||
|
GameMain.Client.CancelFileTransfer(inc.SequenceChannel);
|
||||||
DebugConsole.ThrowError("File transfer error: file transfer initiated on a sequence channel that's already in use");
|
DebugConsole.ThrowError("File transfer error: file transfer initiated on a sequence channel that's already in use");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -195,7 +194,8 @@ namespace Barotrauma.Networking
|
|||||||
string errorMsg;
|
string errorMsg;
|
||||||
if (!ValidateInitialData(fileType, fileName, fileSize, out errorMsg))
|
if (!ValidateInitialData(fileType, fileName, fileSize, out errorMsg))
|
||||||
{
|
{
|
||||||
DebugConsole.ThrowError("File transfer failed ("+errorMsg+")");
|
GameMain.Client.CancelFileTransfer(inc.SequenceChannel);
|
||||||
|
DebugConsole.ThrowError("File transfer failed (" + errorMsg + ")");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,12 +219,14 @@ namespace Barotrauma.Networking
|
|||||||
var activeTransfer = activeTransfers.Find(t => t.Connection == inc.SenderConnection && t.SequenceChannel == inc.SequenceChannel);
|
var activeTransfer = activeTransfers.Find(t => t.Connection == inc.SenderConnection && t.SequenceChannel == inc.SequenceChannel);
|
||||||
if (activeTransfer == null)
|
if (activeTransfer == null)
|
||||||
{
|
{
|
||||||
|
GameMain.Client.CancelFileTransfer(inc.SequenceChannel);
|
||||||
DebugConsole.ThrowError("File transfer error: received data without a transfer initiation message");
|
DebugConsole.ThrowError("File transfer error: received data without a transfer initiation message");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activeTransfer.Received + (ulong)(inc.LengthBytes-inc.PositionInBytes) > activeTransfer.FileSize)
|
if (activeTransfer.Received + (ulong)(inc.LengthBytes-inc.PositionInBytes) > activeTransfer.FileSize)
|
||||||
{
|
{
|
||||||
|
GameMain.Client.CancelFileTransfer(inc.SequenceChannel);
|
||||||
DebugConsole.ThrowError("File transfer error: Received more data than expected");
|
DebugConsole.ThrowError("File transfer error: Received more data than expected");
|
||||||
activeTransfer.Status = FileTransferStatus.Error;
|
activeTransfer.Status = FileTransferStatus.Error;
|
||||||
StopTransfer(activeTransfer);
|
StopTransfer(activeTransfer);
|
||||||
@@ -237,6 +239,7 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
GameMain.Client.CancelFileTransfer(inc.SequenceChannel);
|
||||||
DebugConsole.ThrowError("File transfer error: "+e.Message);
|
DebugConsole.ThrowError("File transfer error: "+e.Message);
|
||||||
activeTransfer.Status = FileTransferStatus.Error;
|
activeTransfer.Status = FileTransferStatus.Error;
|
||||||
StopTransfer(activeTransfer, true);
|
StopTransfer(activeTransfer, true);
|
||||||
@@ -291,7 +294,8 @@ namespace Barotrauma.Networking
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Regex.Match(fileName, @"^[\w\- ]+[\w\-. ]*$").Success)
|
if (string.IsNullOrEmpty(fileName) ||
|
||||||
|
fileName.IndexOfAny(Path.GetInvalidFileNameChars()) > -1)
|
||||||
{
|
{
|
||||||
errorMessage = "Illegal characters in file name ''" + fileName + "''";
|
errorMessage = "Illegal characters in file name ''" + fileName + "''";
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -999,11 +999,16 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void CancelFileTransfer(FileReceiver.FileTransferIn transfer)
|
public void CancelFileTransfer(FileReceiver.FileTransferIn transfer)
|
||||||
|
{
|
||||||
|
CancelFileTransfer(transfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CancelFileTransfer(int sequenceChannel)
|
||||||
{
|
{
|
||||||
NetOutgoingMessage msg = client.CreateMessage();
|
NetOutgoingMessage msg = client.CreateMessage();
|
||||||
msg.Write((byte)ClientPacketHeader.FILE_REQUEST);
|
msg.Write((byte)ClientPacketHeader.FILE_REQUEST);
|
||||||
msg.Write((byte)FileTransferMessageType.Cancel);
|
msg.Write((byte)FileTransferMessageType.Cancel);
|
||||||
msg.Write((byte)transfer.SequenceChannel);
|
msg.Write((byte)sequenceChannel);
|
||||||
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user