diff --git a/Server/BanLists.cs b/Server/BanLists.cs index 0c6235f..69c63d4 100644 --- a/Server/BanLists.cs +++ b/Server/BanLists.cs @@ -1,4 +1,5 @@ using System.Net; +using System.Net.Sockets; using System.Text; using Shared.Packet.Packets; @@ -27,6 +28,14 @@ public static class BanLists { } + private static bool IsIPv4(string str) { + return IPAddress.TryParse(str, out IPAddress? ip) + && ip != null + && ip.AddressFamily == AddressFamily.InterNetwork; + ; + } + + public static bool IsIPv4Banned(Client user) { IPEndPoint? ipv4 = (IPEndPoint?) user.Socket?.RemoteEndPoint; if (ipv4 == null) { return false; } @@ -102,10 +111,16 @@ public static class BanLists { }); } + private static void CrashMultiple(string[] args, MUCH much) { + foreach (Client user in much(args).toActUpon) { + Crash(user, true); + } + } + public static string HandleBanCommand(string[] args, MUCH much) { if (args.Length == 0) { - return "Usage: ban player <* | !* (usernames to not ban...) | (usernames to ban...)>"; + return "Usage: ban {player|ip} ..."; } string cmd = args[0]; @@ -113,7 +128,7 @@ public static class BanLists { switch (cmd) { default: - return "Usage: ban player <* | !* (usernames to not ban...) | (usernames to ban...)>"; + return "Usage: ban {player|ip} ..."; case "player": if (args.Length == 0) { @@ -138,6 +153,21 @@ public static class BanLists { Save(); return sb.ToString(); + + case "ip": + if (args.Length != 1) { + return "Usage: ban ip "; + } + if (!IsIPv4(args[0])) { + return "Invalid IPv4 address!"; + } + if (IsIPv4Banned(args[0])) { + return "IP " + args[0] + " is already banned."; + } + BanIPv4(args[0]); + CrashMultiple(args, much); + Save(); + return "Banned ip: " + args[0]; } } } diff --git a/Server/Program.cs b/Server/Program.cs index 61331a9..99f583d 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -228,6 +228,7 @@ server.PacketHandler = (c, p) => { IEnumerable search = server.Clients.Where(c => c.Connected && ( c.Name.ToLower().StartsWith(arg.ToLower()) || (Guid.TryParse(arg, out Guid res) && res == c.Id) + || (IPAddress.TryParse(arg, out IPAddress? ip) && ip.Equals(((IPEndPoint) c.Socket!.RemoteEndPoint!).Address)) )); if (!search.Any()) { failToFind.Add(arg); //none found