diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 630927e3..f11e3326 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1367,7 +1367,7 @@ namespace TShockAPI } 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()); // 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); if (r.IsMatch(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()); if (success && offlineUser != null) { @@ -1445,8 +1445,8 @@ namespace TShockAPI string lastIP = JsonConvert.DeserializeObject>(offlineUser.KnownIps).Last(); success = - TShock.Bans.AddBan(lastIP, - offlineUser.Name, offlineUser.UUID, banReason, false, args.Player.User.Name, + TShock.Bans.AddBan2(lastIP, + "", offlineUser.UUID, offlineUser.Name, banReason, false, args.Player.User.Name, banLengthInSeconds == 0 ? "" : banLengthInSeconds.ToString()); } diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 8fa40375..7ee0fa29 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -43,11 +43,11 @@ namespace TShockAPI.DB new SqlColumn("IP", MySqlDbType.String, 16) { Primary = true }, new SqlColumn("Name", MySqlDbType.Text), new SqlColumn("UUID", MySqlDbType.Text), - new SqlColumn("AccountName", MySqlDbType.Text), new SqlColumn("Reason", MySqlDbType.Text), new SqlColumn("BanningUser", 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, db.GetSqlType() == SqlType.Sqlite @@ -146,6 +146,32 @@ namespace TShockAPI.DB return null; } + /// + /// Gets a ban by account name (not player/character name). + /// + /// The name. + /// Whether to check with case sensitivity. + /// The ban. + 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("IP"), reader.Get("Name"), reader.Get("UUID"), reader.Get("AccountName"), reader.Get("Reason"), reader.Get("BanningUser"), reader.Get("Date"), reader.Get("Expiration")); + } + } + catch (Exception ex) + { + TShock.Log.Error(ex.ToString()); + } + return null; + } + /// /// Gets a ban by UUID. /// @@ -179,6 +205,7 @@ namespace TShockAPI.DB /// If set to true enable throwing exceptions. /// Banner. /// Expiration date. + [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 = "") { return AddBan2(ip, name, uuid, "", reason, exceptions, banner, expiration); @@ -209,7 +236,7 @@ namespace TShockAPI.DB } 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) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index bd10de2d..9c2c818a 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -645,7 +645,7 @@ namespace TShockAPI 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) { @@ -1022,7 +1022,7 @@ namespace TShockAPI TSPlayer player = (TSPlayer)ret; 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); return RestResponse("Player " + player.Name + " was banned"); } diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 7c2d1ab8..d07a466c 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -472,6 +472,28 @@ namespace TShockAPI args.Player.User.KnownIps = JsonConvert.SerializeObject(KnownIps, Formatting.Indented); 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); + } + } } /// OnAccountDelete - Internal hook fired on account delete. @@ -488,7 +510,7 @@ namespace TShockAPI CharacterDB.SeedInitialData(Users.GetUser(args.User)); } - /// OnPlayerPreLogin - Internal hook fired when on player pre login. + /// OnPlayerPreLoginOnPlayerPreLogin - Internal hook fired when on player pre login. /// args - The PlayerPreLoginEventArgs object. private void OnPlayerPreLogin(Hooks.PlayerPreLoginEventArgs args) { diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index 5081f8e4..9efa8b99 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -675,7 +675,7 @@ namespace TShockAPI string ip = player.IP; string uuid = player.UUID; 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)); string verb = force ? "force " : ""; if (string.IsNullOrWhiteSpace(adminUserName))