Whitelist saving
This commit is contained in:
@@ -12,18 +12,18 @@ namespace Barotrauma.Networking
|
|||||||
public string Name;
|
public string Name;
|
||||||
public string IP;
|
public string IP;
|
||||||
|
|
||||||
public bool CompareTo(string ipCompare)
|
public bool CompareTo(string ipCompare)
|
||||||
{
|
{
|
||||||
int rangeBanIndex = IP.IndexOf(".x");
|
int rangeBanIndex = IP.IndexOf(".x");
|
||||||
if (rangeBanIndex<=-1)
|
if (rangeBanIndex<=-1)
|
||||||
{
|
{
|
||||||
return ipCompare == IP;
|
return ipCompare == IP;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ipCompare.Length < rangeBanIndex) return false;
|
if (ipCompare.Length < rangeBanIndex) return false;
|
||||||
return ipCompare.Substring(0, rangeBanIndex) == IP.Substring(0, rangeBanIndex);
|
return ipCompare.Substring(0, rangeBanIndex) == IP.Substring(0, rangeBanIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public BannedPlayer(string name, string ip)
|
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);
|
var removeButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Remove", Alignment.Right | Alignment.CenterY, GUI.Style, textBlock);
|
||||||
removeButton.UserData = bannedPlayer;
|
removeButton.UserData = bannedPlayer;
|
||||||
removeButton.OnClicked = RemoveBan;
|
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);
|
var rangeBanButton = new GUIButton(new Rectangle(-100, 0, 100, 20), "Ban range", Alignment.Right | Alignment.CenterY, GUI.Style, textBlock);
|
||||||
rangeBanButton.UserData = bannedPlayer;
|
rangeBanButton.UserData = bannedPlayer;
|
||||||
@@ -140,30 +140,30 @@ namespace Barotrauma.Networking
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ToRange(string ip)
|
public string ToRange(string ip)
|
||||||
{
|
{
|
||||||
for (int i = ip.Length - 1; i > 0; i--)
|
for (int i = ip.Length - 1; i > 0; i--)
|
||||||
{
|
{
|
||||||
if (ip[i] == '.')
|
if (ip[i] == '.')
|
||||||
{
|
{
|
||||||
ip = ip.Substring(0, i) + ".x";
|
ip = ip.Substring(0, i) + ".x";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool RangeBan(GUIButton button, object obj)
|
private bool RangeBan(GUIButton button, object obj)
|
||||||
{
|
{
|
||||||
BannedPlayer banned = obj as BannedPlayer;
|
BannedPlayer banned = obj as BannedPlayer;
|
||||||
if (banned == null) return false;
|
if (banned == null) return false;
|
||||||
|
|
||||||
banned.IP = ToRange(banned.IP);
|
banned.IP = ToRange(banned.IP);
|
||||||
|
|
||||||
BannedPlayer bp;
|
BannedPlayer bp;
|
||||||
while ((bp = bannedPlayers.Find(x => banned.CompareTo(x.IP)))!=null)
|
while ((bp = bannedPlayers.Find(x => banned.CompareTo(x.IP)))!=null)
|
||||||
{
|
{
|
||||||
//remove all specific bans that are now covered by the rangeban
|
//remove all specific bans that are now covered by the rangeban
|
||||||
bannedPlayers.Remove(bp);
|
bannedPlayers.Remove(bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,7 +177,7 @@ namespace Barotrauma.Networking
|
|||||||
CreateBanFrame(banFrame.Parent);
|
CreateBanFrame(banFrame.Parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CloseFrame(GUIButton button, object obj)
|
private bool CloseFrame(GUIButton button, object obj)
|
||||||
|
|||||||
@@ -484,10 +484,10 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NetIncomingMessageType.Data:
|
case NetIncomingMessageType.Data:
|
||||||
if (banList.IsBanned(inc.SenderEndPoint.Address.ToString()))
|
if (banList.IsBanned(inc.SenderEndPoint.Address.ToString()))
|
||||||
{
|
{
|
||||||
inc.SenderConnection.Disconnect("You have been banned from the server");
|
inc.SenderConnection.Disconnect("You have been banned from the server");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte packetType = inc.ReadByte();
|
byte packetType = inc.ReadByte();
|
||||||
@@ -1305,9 +1305,9 @@ namespace Barotrauma.Networking
|
|||||||
log.LogFrame.Update(0.016f);
|
log.LogFrame.Update(0.016f);
|
||||||
log.LogFrame.Draw(spriteBatch);
|
log.LogFrame.Draw(spriteBatch);
|
||||||
}
|
}
|
||||||
else if (whitelist.WhiteListFrame != null)
|
else if (whitelist.WhiteListFrame != null)
|
||||||
{
|
{
|
||||||
whitelist.WhiteListFrame.Draw(spriteBatch);
|
whitelist.WhiteListFrame.Draw(spriteBatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ShowNetStats) return;
|
if (!ShowNetStats) return;
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ namespace Barotrauma.Networking
|
|||||||
if (!whitelist.IsWhiteListed(name, inc.SenderConnection.RemoteEndPoint.Address.ToString()))
|
if (!whitelist.IsWhiteListed(name, inc.SenderConnection.RemoteEndPoint.Address.ToString()))
|
||||||
{
|
{
|
||||||
inc.SenderConnection.Disconnect("You're not in this server's whitelist.");
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
var banButton = new GUIButton(new Rectangle(-110, 0, 100, 20), "Ban", Alignment.Right | Alignment.CenterY, GUI.Style, frame);
|
||||||
banButton.UserData = c.name;
|
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);
|
var rangebanButton = new GUIButton(new Rectangle(-220, 0, 100, 20), "Ban range", Alignment.Right | Alignment.CenterY, GUI.Style, frame);
|
||||||
rangebanButton.UserData = c.name;
|
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);
|
var kickButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Kick", Alignment.Right | Alignment.CenterY, GUI.Style, frame);
|
||||||
kickButton.UserData = c.name;
|
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);
|
textBlock.Padding = new Vector4(5.0f, 0.0f, 5.0f, 0.0f);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
class WhiteList
|
class WhiteList
|
||||||
{
|
{
|
||||||
|
const string SavePath = "Data/whitelist.txt";
|
||||||
|
|
||||||
private List<WhiteListedPlayer> whitelistedPlayers;
|
private List<WhiteListedPlayer> whitelistedPlayers;
|
||||||
public List<WhiteListedPlayer> WhiteListedPlayers
|
public List<WhiteListedPlayer> WhiteListedPlayers
|
||||||
{
|
{
|
||||||
@@ -44,8 +46,77 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
enabled = false;
|
enabled = false;
|
||||||
whitelistedPlayers = new List<WhiteListedPlayer>();
|
whitelistedPlayers = new List<WhiteListedPlayer>();
|
||||||
|
|
||||||
|
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<string> lines = new List<string>();
|
||||||
|
|
||||||
|
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)
|
public bool IsWhiteListed(string name, string ip)
|
||||||
{
|
{
|
||||||
if (!enabled) return true;
|
if (!enabled) return true;
|
||||||
@@ -71,6 +142,18 @@ namespace Barotrauma.Networking
|
|||||||
enabledTick.OnSelected = (GUITickBox box) =>
|
enabledTick.OnSelected = (GUITickBox box) =>
|
||||||
{
|
{
|
||||||
enabled = !enabled;
|
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;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -116,6 +199,7 @@ namespace Barotrauma.Networking
|
|||||||
GameServer.Log("Removing " + wlp.Name + " from whitelist", null);
|
GameServer.Log("Removing " + wlp.Name + " from whitelist", null);
|
||||||
|
|
||||||
whitelistedPlayers.Remove(wlp);
|
whitelistedPlayers.Remove(wlp);
|
||||||
|
Save();
|
||||||
CloseFrame(); CreateWhiteListFrame();
|
CloseFrame(); CreateWhiteListFrame();
|
||||||
|
|
||||||
return true;
|
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;
|
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));
|
whitelistedPlayers.Add(new WhiteListedPlayer(nameBox.Text,ipBox.Text));
|
||||||
|
Save();
|
||||||
CloseFrame(); CreateWhiteListFrame();
|
CloseFrame(); CreateWhiteListFrame();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user