Add remaining backbone for banning accounts (sort of)

Frontend still doesn't work properly. In particular:

1. Need a way to list bans by account name.
2. Need a way to unban by account name.
3. Really need a way to change the IP on a ban lol.

Ban system still needs to be be rebuilt fully, but at least this
doesn't necessarily character ban someone if you were going for an IP
ban.

Fixes #1412
This commit is contained in:
Lucas Nicodemus 2017-12-02 20:41:14 -07:00
parent 0edfc6834f
commit 718525904a
5 changed files with 60 additions and 11 deletions

View file

@ -1367,7 +1367,7 @@ namespace TShockAPI
} }
targetGeneralizedName = target.Name; targetGeneralizedName = target.Name;
success = TShock.Bans.AddBan(target.IP, target.Name, target.UUID, banReason, false, args.Player.User.Name, success = TShock.Bans.AddBan2(target.IP, target.Name, target.UUID, target.User.Name, banReason, false, args.Player.User.Name,
banLengthInSeconds == 0 ? "" : banLengthInSeconds.ToString()); banLengthInSeconds == 0 ? "" : banLengthInSeconds.ToString());
// Since this is an online ban, we need to dc the player and tell them now. // Since this is an online ban, we need to dc the player and tell them now.
@ -1397,7 +1397,7 @@ namespace TShockAPI
Regex r = new Regex(pattern, RegexOptions.IgnoreCase); Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
if (r.IsMatch(args.Parameters[1])) { if (r.IsMatch(args.Parameters[1])) {
targetGeneralizedName = "IP: " + args.Parameters[1]; targetGeneralizedName = "IP: " + args.Parameters[1];
success = TShock.Bans.AddBan(args.Parameters[1], "", "", banReason, success = TShock.Bans.AddBan2(args.Parameters[1], "", "", "", banReason,
false, args.Player.User.Name, banLengthInSeconds == 0 ? "" : banLengthInSeconds.ToString()); false, args.Player.User.Name, banLengthInSeconds == 0 ? "" : banLengthInSeconds.ToString());
if (success && offlineUser != null) if (success && offlineUser != null)
{ {
@ -1445,8 +1445,8 @@ namespace TShockAPI
string lastIP = JsonConvert.DeserializeObject<List<string>>(offlineUser.KnownIps).Last(); string lastIP = JsonConvert.DeserializeObject<List<string>>(offlineUser.KnownIps).Last();
success = success =
TShock.Bans.AddBan(lastIP, TShock.Bans.AddBan2(lastIP,
offlineUser.Name, offlineUser.UUID, banReason, false, args.Player.User.Name, "", offlineUser.UUID, offlineUser.Name, banReason, false, args.Player.User.Name,
banLengthInSeconds == 0 ? "" : banLengthInSeconds.ToString()); banLengthInSeconds == 0 ? "" : banLengthInSeconds.ToString());
} }

View file

@ -43,11 +43,11 @@ namespace TShockAPI.DB
new SqlColumn("IP", MySqlDbType.String, 16) { Primary = true }, new SqlColumn("IP", MySqlDbType.String, 16) { Primary = true },
new SqlColumn("Name", MySqlDbType.Text), new SqlColumn("Name", MySqlDbType.Text),
new SqlColumn("UUID", MySqlDbType.Text), new SqlColumn("UUID", MySqlDbType.Text),
new SqlColumn("AccountName", MySqlDbType.Text),
new SqlColumn("Reason", MySqlDbType.Text), new SqlColumn("Reason", MySqlDbType.Text),
new SqlColumn("BanningUser", MySqlDbType.Text), new SqlColumn("BanningUser", MySqlDbType.Text),
new SqlColumn("Date", MySqlDbType.Text), new SqlColumn("Date", MySqlDbType.Text),
new SqlColumn("Expiration", MySqlDbType.Text) new SqlColumn("Expiration", MySqlDbType.Text),
new SqlColumn("AccountName", MySqlDbType.Text)
); );
var creator = new SqlTableCreator(db, var creator = new SqlTableCreator(db,
db.GetSqlType() == SqlType.Sqlite db.GetSqlType() == SqlType.Sqlite
@ -146,6 +146,32 @@ namespace TShockAPI.DB
return null; return null;
} }
/// <summary>
/// Gets a ban by account name (not player/character name).
/// </summary>
/// <param name="name">The name.</param>
/// <param name="casesensitive">Whether to check with case sensitivity.</param>
/// <returns>The ban.</returns>
public Ban GetBanByAccountName(string name, bool casesensitive = false)
{
try
{
var namecol = casesensitive ? "AccountName" : "UPPER(AccountName)";
if (!casesensitive)
name = name.ToUpper();
using (var reader = database.QueryReader("SELECT * FROM Bans WHERE " + namecol + "=@0", name))
{
if (reader.Read())
return new Ban(reader.Get<string>("IP"), reader.Get<string>("Name"), reader.Get<string>("UUID"), reader.Get<string>("AccountName"), reader.Get<string>("Reason"), reader.Get<string>("BanningUser"), reader.Get<string>("Date"), reader.Get<string>("Expiration"));
}
}
catch (Exception ex)
{
TShock.Log.Error(ex.ToString());
}
return null;
}
/// <summary> /// <summary>
/// Gets a ban by UUID. /// Gets a ban by UUID.
/// </summary> /// </summary>
@ -179,6 +205,7 @@ namespace TShockAPI.DB
/// <param name="exceptions">If set to <c>true</c> enable throwing exceptions.</param> /// <param name="exceptions">If set to <c>true</c> enable throwing exceptions.</param>
/// <param name="banner">Banner.</param> /// <param name="banner">Banner.</param>
/// <param name="expiration">Expiration date.</param> /// <param name="expiration">Expiration date.</param>
[Obsolete("Use AddBan2 instead of AddBan.", true)]
public bool AddBan(string ip, string name = "", string uuid = "", string reason = "", bool exceptions = false, string banner = "", string expiration = "") public bool AddBan(string ip, string name = "", string uuid = "", string reason = "", bool exceptions = false, string banner = "", string expiration = "")
{ {
return AddBan2(ip, name, uuid, "", reason, exceptions, banner, expiration); return AddBan2(ip, name, uuid, "", reason, exceptions, banner, expiration);
@ -209,7 +236,7 @@ namespace TShockAPI.DB
} }
else else
{ {
return database.Query("INSERT INTO Bans (IP, Name, UUID, AccountName, Reason, BanningUser, Date, Expiration) VALUES (@0, @1, @2, @3, @4, @5, @6, @7);", ip, name, uuid, accountName, reason, banner, DateTime.UtcNow.ToString("s"), expiration) != 0; return database.Query("INSERT INTO Bans (IP, Name, UUID, Reason, BanningUser, Date, Expiration, AccountName) VALUES (@0, @1, @2, @3, @4, @5, @6, @7);", ip, name, uuid, reason, banner, DateTime.UtcNow.ToString("s"), expiration, accountName) != 0;
} }
} }
catch (Exception ex) catch (Exception ex)

View file

@ -645,7 +645,7 @@ namespace TShockAPI
try try
{ {
TShock.Bans.AddBan(ip, name, "", args.Parameters["reason"], true, args.TokenData.Username); TShock.Bans.AddBan2(ip, name, "", "", args.Parameters["reason"], true, args.TokenData.Username);
} }
catch (Exception e) catch (Exception e)
{ {
@ -1022,7 +1022,7 @@ namespace TShockAPI
TSPlayer player = (TSPlayer)ret; TSPlayer player = (TSPlayer)ret;
var reason = null == args.Parameters["reason"] ? "Banned via web" : args.Parameters["reason"]; var reason = null == args.Parameters["reason"] ? "Banned via web" : args.Parameters["reason"];
TShock.Bans.AddBan(player.IP, player.Name, "", reason); TShock.Bans.AddBan2(player.IP, player.Name, "", "", reason);
TShock.Utils.ForceKick(player, reason, false, true); TShock.Utils.ForceKick(player, reason, false, true);
return RestResponse("Player " + player.Name + " was banned"); return RestResponse("Player " + player.Name + " was banned");
} }

View file

@ -472,6 +472,28 @@ namespace TShockAPI
args.Player.User.KnownIps = JsonConvert.SerializeObject(KnownIps, Formatting.Indented); args.Player.User.KnownIps = JsonConvert.SerializeObject(KnownIps, Formatting.Indented);
Users.UpdateLogin(args.Player.User); Users.UpdateLogin(args.Player.User);
Ban potentialBan = Bans.GetBanByAccountName(args.Player.User.Name);
if (potentialBan != null)
{
// A user just signed in successfully despite being banned by account name.
// We should fix the ban database so that all of their ban info is up to date.
Bans.AddBan2(args.Player.IP, args.Player.Name, args.Player.UUID, args.Player.User.Name,
potentialBan.Reason, false, potentialBan.BanningUser, potentialBan.Expiration);
// And then get rid of them.
if (potentialBan.Expiration == "")
{
Utils.ForceKick(args.Player, String.Format("Permanently banned by {0} for {1}", potentialBan.BanningUser
,potentialBan.Reason), false, false);
}
else
{
Utils.ForceKick(args.Player, String.Format("Still banned by {0} for {1}", potentialBan.BanningUser,
potentialBan.Reason), false, false);
}
}
} }
/// <summary>OnAccountDelete - Internal hook fired on account delete.</summary> /// <summary>OnAccountDelete - Internal hook fired on account delete.</summary>
@ -488,7 +510,7 @@ namespace TShockAPI
CharacterDB.SeedInitialData(Users.GetUser(args.User)); CharacterDB.SeedInitialData(Users.GetUser(args.User));
} }
/// <summary>OnPlayerPreLogin - Internal hook fired when on player pre login.</summary> /// <summary>OnPlayerPreLoginOnPlayerPreLogin - Internal hook fired when on player pre login.</summary>
/// <param name="args">args - The PlayerPreLoginEventArgs object.</param> /// <param name="args">args - The PlayerPreLoginEventArgs object.</param>
private void OnPlayerPreLogin(Hooks.PlayerPreLoginEventArgs args) private void OnPlayerPreLogin(Hooks.PlayerPreLoginEventArgs args)
{ {

View file

@ -675,7 +675,7 @@ namespace TShockAPI
string ip = player.IP; string ip = player.IP;
string uuid = player.UUID; string uuid = player.UUID;
string playerName = player.Name; string playerName = player.Name;
TShock.Bans.AddBan(ip, playerName, uuid, reason, false, adminUserName); TShock.Bans.AddBan2(ip, playerName, uuid, "", reason, false, adminUserName);
player.Disconnect(string.Format("Banned: {0}", reason)); player.Disconnect(string.Format("Banned: {0}", reason));
string verb = force ? "force " : ""; string verb = force ? "force " : "";
if (string.IsNullOrWhiteSpace(adminUserName)) if (string.IsNullOrWhiteSpace(adminUserName))