diff --git a/Projects/Server/Network/TcpServer.cs b/Projects/Server/Network/TcpServer.cs index 892c4f589..27c30191f 100644 --- a/Projects/Server/Network/TcpServer.cs +++ b/Projects/Server/Network/TcpServer.cs @@ -256,7 +256,15 @@ public static class TcpServer return; } - if (Firewall.IsBlocked(remoteIP)) + var firewalled = Firewall.IsBlocked(remoteIP); + if (!firewalled) + { + var socketConnectedArgs = new SocketConnectedEventArgs(socket); + EventSink.InvokeSocketConnected(socketConnectedArgs); + firewalled = !socketConnectedArgs.ConnectionAllowed; + } + + if (firewalled) { TraceDisconnect("Firewalled", remoteIP); logger.Debug("{Address} Firewalled", remoteIP); @@ -292,4 +300,22 @@ public static class TcpServer // ignored } } + + public static class EventSink + { + // IMPORTANT: This is executed asynchronously! Do not run any game thread code on these delegates! + public static event Action SocketConnected; + + internal static void InvokeSocketConnected(SocketConnectedEventArgs context) => + SocketConnected?.Invoke(context); + } + + public class SocketConnectedEventArgs + { + public Socket Socket { get; } + + public bool ConnectionAllowed { get; set; } = true; + + internal SocketConnectedEventArgs(Socket socket) => Socket = socket; + } }