diff --git a/Subsurface/Source/Networking/BanList.cs b/Subsurface/Source/Networking/BanList.cs index 0b80fb717..8a650ed73 100644 --- a/Subsurface/Source/Networking/BanList.cs +++ b/Subsurface/Source/Networking/BanList.cs @@ -12,18 +12,18 @@ namespace Barotrauma.Networking public string Name; public string IP; - public bool CompareTo(string ipCompare) - { - int rangeBanIndex = IP.IndexOf(".x"); - if (rangeBanIndex<=-1) - { - return ipCompare == IP; - } - else - { - if (ipCompare.Length < rangeBanIndex) return false; - return ipCompare.Substring(0, rangeBanIndex) == IP.Substring(0, rangeBanIndex); - } + public bool CompareTo(string ipCompare) + { + int rangeBanIndex = IP.IndexOf(".x"); + if (rangeBanIndex<=-1) + { + return ipCompare == IP; + } + else + { + if (ipCompare.Length < rangeBanIndex) return false; + return ipCompare.Substring(0, rangeBanIndex) == IP.Substring(0, rangeBanIndex); + } } public BannedPlayer(string name, string ip) @@ -108,7 +108,7 @@ namespace Barotrauma.Networking var removeButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Remove", Alignment.Right | Alignment.CenterY, GUI.Style, textBlock); removeButton.UserData = bannedPlayer; removeButton.OnClicked = RemoveBan; - if (bannedPlayer.IP.IndexOf(".x") <= -1) + if (bannedPlayer.IP.IndexOf(".x") <= -1) { var rangeBanButton = new GUIButton(new Rectangle(-100, 0, 100, 20), "Ban range", Alignment.Right | Alignment.CenterY, GUI.Style, textBlock); rangeBanButton.UserData = bannedPlayer; @@ -140,30 +140,30 @@ namespace Barotrauma.Networking return true; } - public string ToRange(string ip) - { - for (int i = ip.Length - 1; i > 0; i--) - { - if (ip[i] == '.') - { - ip = ip.Substring(0, i) + ".x"; - break; - } - } - return ip; + public string ToRange(string ip) + { + for (int i = ip.Length - 1; i > 0; i--) + { + if (ip[i] == '.') + { + ip = ip.Substring(0, i) + ".x"; + break; + } + } + return ip; } - private bool RangeBan(GUIButton button, object obj) - { + private bool RangeBan(GUIButton button, object obj) + { BannedPlayer banned = obj as BannedPlayer; - if (banned == null) return false; - + if (banned == null) return false; + banned.IP = ToRange(banned.IP); BannedPlayer bp; - while ((bp = bannedPlayers.Find(x => banned.CompareTo(x.IP)))!=null) - { - //remove all specific bans that are now covered by the rangeban + while ((bp = bannedPlayers.Find(x => banned.CompareTo(x.IP)))!=null) + { + //remove all specific bans that are now covered by the rangeban bannedPlayers.Remove(bp); } @@ -177,7 +177,7 @@ namespace Barotrauma.Networking CreateBanFrame(banFrame.Parent); } - return true; + return true; } private bool CloseFrame(GUIButton button, object obj) diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 6cfa964d1..7f0848986 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -484,10 +484,10 @@ namespace Barotrauma.Networking } break; case NetIncomingMessageType.Data: - if (banList.IsBanned(inc.SenderEndPoint.Address.ToString())) - { - inc.SenderConnection.Disconnect("You have been banned from the server"); - return; + if (banList.IsBanned(inc.SenderEndPoint.Address.ToString())) + { + inc.SenderConnection.Disconnect("You have been banned from the server"); + return; } byte packetType = inc.ReadByte(); @@ -1305,9 +1305,9 @@ namespace Barotrauma.Networking log.LogFrame.Update(0.016f); log.LogFrame.Draw(spriteBatch); } - else if (whitelist.WhiteListFrame != null) - { - whitelist.WhiteListFrame.Draw(spriteBatch); + else if (whitelist.WhiteListFrame != null) + { + whitelist.WhiteListFrame.Draw(spriteBatch); } if (!ShowNetStats) return; diff --git a/Subsurface/Source/Networking/GameServerLogin.cs b/Subsurface/Source/Networking/GameServerLogin.cs index 7506b5582..a5bb4af8c 100644 --- a/Subsurface/Source/Networking/GameServerLogin.cs +++ b/Subsurface/Source/Networking/GameServerLogin.cs @@ -149,7 +149,7 @@ namespace Barotrauma.Networking if (!whitelist.IsWhiteListed(name, inc.SenderConnection.RemoteEndPoint.Address.ToString())) { inc.SenderConnection.Disconnect("You're not in this server's whitelist."); - DebugConsole.NewMessage(name + " couldn't join the server (not in whitelist)", Color.Red); + DebugConsole.NewMessage(name + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (not in whitelist)", Color.Red); return; } diff --git a/Subsurface/Source/Networking/GameServerSettings.cs b/Subsurface/Source/Networking/GameServerSettings.cs index 0da9f9202..82d495148 100644 --- a/Subsurface/Source/Networking/GameServerSettings.cs +++ b/Subsurface/Source/Networking/GameServerSettings.cs @@ -685,15 +685,15 @@ namespace Barotrauma.Networking var banButton = new GUIButton(new Rectangle(-110, 0, 100, 20), "Ban", Alignment.Right | Alignment.CenterY, GUI.Style, frame); banButton.UserData = c.name; - banButton.OnClicked += GameMain.NetLobbyScreen.BanPlayer; + banButton.OnClicked = GameMain.NetLobbyScreen.BanPlayer; var rangebanButton = new GUIButton(new Rectangle(-220, 0, 100, 20), "Ban range", Alignment.Right | Alignment.CenterY, GUI.Style, frame); rangebanButton.UserData = c.name; - rangebanButton.OnClicked += GameMain.NetLobbyScreen.BanPlayerRange; + rangebanButton.OnClicked = GameMain.NetLobbyScreen.BanPlayerRange; var kickButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Kick", Alignment.Right | Alignment.CenterY, GUI.Style, frame); kickButton.UserData = c.name; - kickButton.OnClicked += GameMain.NetLobbyScreen.KickPlayer; + kickButton.OnClicked = GameMain.NetLobbyScreen.KickPlayer; textBlock.Padding = new Vector4(5.0f, 0.0f, 5.0f, 0.0f); } diff --git a/Subsurface/Source/Networking/WhiteList.cs b/Subsurface/Source/Networking/WhiteList.cs index 3ccaa5768..486bf32c3 100644 --- a/Subsurface/Source/Networking/WhiteList.cs +++ b/Subsurface/Source/Networking/WhiteList.cs @@ -21,6 +21,8 @@ namespace Barotrauma.Networking class WhiteList { + const string SavePath = "Data/whitelist.txt"; + private List whitelistedPlayers; public List WhiteListedPlayers { @@ -44,8 +46,77 @@ namespace Barotrauma.Networking { enabled = false; whitelistedPlayers = new List(); + + if (File.Exists(SavePath)) + { + string[] lines; + try + { + lines = File.ReadAllLines(SavePath); + } + catch (Exception e) + { + DebugConsole.ThrowError("Failed to open whitelist in " + SavePath, e); + return; + } + + foreach (string line in lines) + { + if (line[0] == '#') + { + string lineval = line.Substring(1, line.Length - 1); + if (lineval.ToLower()=="true" || Convert.ToInt32(lineval)!=0) + { + enabled = true; + } + else + { + enabled = false; + } + } + else + { + string[] separatedLine = line.Split(','); + if (separatedLine.Length < 2) continue; + + string name = String.Join(",", separatedLine.Take(separatedLine.Length - 1)); + string ip = separatedLine.Last(); + + whitelistedPlayers.Add(new WhiteListedPlayer(name, ip)); + } + } + } } - + + public void Save() + { + GameServer.Log("Saving whitelist", null); + + List lines = new List(); + + if (enabled) + { + lines.Add("#true"); + } + else + { + lines.Add("#false"); + } + foreach (WhiteListedPlayer wlp in whitelistedPlayers) + { + lines.Add(wlp.Name + "," + wlp.IP); + } + + try + { + File.WriteAllLines(SavePath, lines); + } + catch (Exception e) + { + DebugConsole.ThrowError("Saving the whitelist to " + SavePath + " failed", e); + } + } + public bool IsWhiteListed(string name, string ip) { if (!enabled) return true; @@ -71,6 +142,18 @@ namespace Barotrauma.Networking enabledTick.OnSelected = (GUITickBox box) => { enabled = !enabled; + if (enabled) + { + foreach (Client c in GameMain.Server.ConnectedClients) + { + if (!IsWhiteListed(c.name,c.Connection.RemoteEndPoint.Address.ToString())) + { + whitelistedPlayers.Add(new WhiteListedPlayer(c.name, c.Connection.RemoteEndPoint.Address.ToString())); + CloseFrame(); CreateWhiteListFrame(); + } + } + } + Save(); return true; }; @@ -116,6 +199,7 @@ namespace Barotrauma.Networking GameServer.Log("Removing " + wlp.Name + " from whitelist", null); whitelistedPlayers.Remove(wlp); + Save(); CloseFrame(); CreateWhiteListFrame(); return true; @@ -125,6 +209,7 @@ namespace Barotrauma.Networking { if (string.IsNullOrWhiteSpace(nameBox.Text) || whitelistedPlayers.Find(x => x.Name.ToLower() == nameBox.Text.ToLower()) != null) return false; whitelistedPlayers.Add(new WhiteListedPlayer(nameBox.Text,ipBox.Text)); + Save(); CloseFrame(); CreateWhiteListFrame(); return true; }