Merge branch 'master' of https://github.com/Regalis11/Barotrauma into develop

This commit is contained in:
EvilFactory
2025-04-10 10:37:09 -03:00
296 changed files with 8420 additions and 2945 deletions
@@ -210,11 +210,11 @@ namespace Barotrauma.Networking
}
PendingClient? pendingClient = pendingClients.Find(c => c.Connection.NetConnection == inc.SenderConnection);
if (pendingClient is null)
{
pendingClient = new PendingClient(new LidgrenConnection(inc.SenderConnection));
pendingClients.Add(pendingClient);
GameServer.Log($"Incoming connection from {pendingClient.Connection.NetConnection?.RemoteEndPoint?.ToString() ?? "null"}.", ServerLog.MessageType.ServerMessage);
}
inc.SenderConnection.Approve();
@@ -228,7 +228,25 @@ namespace Barotrauma.Networking
IReadMessage inc = lidgrenMsg.ToReadMessage();
var (_, packetHeader, initialization) = INetSerializableStruct.Read<PeerPacketHeaders>(inc);
PeerPacketHeaders peerPacketHeaders = default;
try
{
peerPacketHeaders = INetSerializableStruct.Read<PeerPacketHeaders>(inc);
}
catch
{
if (pendingClient != null)
{
//pending (= not yet authenticated) client sent malformed data, immediately ban them so they can't use this for spamming
GameServer.Log($"Received an invalid connection attempt from {pendingClient.Connection.NetConnection?.RemoteEndPoint?.ToString() ?? "null"}. Banning the IP.", ServerLog.MessageType.DoSProtection);
serverSettings.BanList.BanPlayer(name: "Unknown", endpoint: pendingClient.Connection.Endpoint, reason: "Invalid connection attempt", duration: null);
}
else
{
throw;
}
}
var (_, packetHeader, initialization) = peerPacketHeaders;
if (packetHeader.IsConnectionInitializationStep() && pendingClient != null && initialization.HasValue)
{
@@ -41,7 +41,7 @@ namespace Barotrauma.Networking
public ConnectionInitialization InitializationStep;
public double UpdateTime;
public double TimeOut;
public int Retries;
public int PasswordRetries;
public Int32? PasswordSalt;
public bool AuthSessionStarted;
@@ -52,7 +52,7 @@ namespace Barotrauma.Networking
OwnerKey = Option.None;
Connection = conn;
InitializationStep = ConnectionInitialization.AuthInfoAndVersion;
Retries = 0;
PasswordRetries = 0;
PasswordSalt = null;
UpdateTime = Timing.TotalTime + Timing.Step * 3.0;
TimeOut = NetworkConnection.TimeoutThreshold;
@@ -156,8 +156,8 @@ namespace Barotrauma.Networking
}
else
{
pendingClient.Retries++;
if (serverSettings.BanAfterWrongPassword && pendingClient.Retries > serverSettings.MaxPasswordRetriesBeforeBan)
pendingClient.PasswordRetries++;
if (serverSettings.BanAfterWrongPassword && pendingClient.PasswordRetries > serverSettings.MaxPasswordRetriesBeforeBan)
{
const string banMsg = "Failed to enter correct password too many times";
BanPendingClient(pendingClient, banMsg, null);
@@ -286,7 +286,7 @@ namespace Barotrauma.Networking
structToSend = new ServerPeerPasswordPacket
{
Salt = GetSalt(pendingClient),
RetriesLeft = Option<int>.Some(pendingClient.Retries)
RetriesLeft = Option<int>.Some(pendingClient.PasswordRetries)
};
static Option<int> GetSalt(PendingClient client)