diff --git a/CHANGELOG.md b/CHANGELOG.md index 895e9085..57a0b299 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ This is the rolling changelog for TShock for Terraria. Use past tense when adding new entries; sign your name off when you add or change something. This should primarily be things like user changes, not necessarily codebase changes unless it's really relevant or large. +## TShock 4.3.10 + +* API: Added crash protection around malicious and/or invalid packets (@Wolfje) +* Fixed an issue adding a ban on a player who has previously been banned (@Wolfje) + ## TShock 4.3.8 * API: Update to Terraria 1.3.0.8 (@Patrikkk) * **API: Added a crash reporter which collects memory dumps on Windows** (@Wolfje) diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 0f1e2507..fbc890a7 100755 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -23,10 +23,17 @@ using MySql.Data.MySqlClient; namespace TShockAPI.DB { + /// + /// Class that manages bans. + /// public class BanManager { private IDbConnection database; + /// + /// Initializes a new instance of the class. + /// + /// A valid connection to the TShock database public BanManager(IDbConnection db) { database = db; @@ -150,11 +157,33 @@ namespace TShockAPI.DB return null; } + /// + /// Adds a ban. + /// + /// true, if ban was added, false otherwise. + /// Ip. + /// Name. + /// UUID. + /// Reason. + /// If set to true enable throwing exceptions. + /// Banner. + /// Expiration date. public bool AddBan(string ip, string name = "", string uuid = "", string reason = "", bool exceptions = false, string banner = "", string expiration = "") { try { - return database.Query("INSERT INTO Bans (IP, Name, UUID, Reason, BanningUser, Date, Expiration) VALUES (@0, @1, @2, @3, @4, @5, @6);", ip, name, uuid, reason, banner, DateTime.UtcNow.ToString("s"), expiration) != 0; + /* + * If the ban already exists, update its entry with the new date + * and expiration details. + */ + if (GetBanByIp(ip) != null) + { + return database.Query("UPDATE Bans SET Date = @0, Expiration = @1 WHERE IP = @2", DateTime.UtcNow.ToString("s"), expiration) == 1; + } + else + { + return database.Query("INSERT INTO Bans (IP, Name, UUID, Reason, BanningUser, Date, Expiration) VALUES (@0, @1, @2, @3, @4, @5, @6);", ip, name, uuid, reason, banner, DateTime.UtcNow.ToString("s"), expiration) != 0; + } } catch (Exception ex) { @@ -165,6 +194,14 @@ namespace TShockAPI.DB return false; } + /// + /// Removes a ban. + /// + /// true, if ban was removed, false otherwise. + /// Match. + /// If set to true by name. + /// If set to true casesensitive. + /// If set to true exceptions. public bool RemoveBan(string match, bool byName = false, bool casesensitive = true, bool exceptions = false) { try @@ -184,6 +221,10 @@ namespace TShockAPI.DB return false; } + /// + /// Clears bans. + /// + /// true, if bans were cleared, false otherwise. public bool ClearBans() { try @@ -198,22 +239,63 @@ namespace TShockAPI.DB } } + /// + /// Model class that represents a ban entry in the TShock database. + /// public class Ban { + /// + /// Gets or sets the IP address of the ban entry. + /// + /// The IP Address public string IP { get; set; } + /// + /// Gets or sets the name. + /// + /// The name. public string Name { get; set; } + /// + /// Gets or sets the Client UUID of the ban + /// + /// The UUID public string UUID { get; set; } + /// + /// Gets or sets the ban reason. + /// + /// The ban reason. public string Reason { get; set; } + /// + /// Gets or sets the name of the user who added this ban entry. + /// + /// The banning user. public string BanningUser { get; set; } + /// + /// Gets or sets the UTC date of when the ban is to take effect + /// + /// The date, which must be in UTC public string Date { get; set; } + /// + /// Gets or sets the expiration date, in which the ban shall be lifted + /// + /// The expiration. public string Expiration { get; set; } + /// + /// Initializes a new instance of the class. + /// + /// Ip. + /// Name. + /// UUID. + /// Reason. + /// Banner. + /// UTC ban date. + /// Expiration time public Ban(string ip, string name, string uuid, string reason, string banner, string date, string exp) { IP = ip; @@ -225,6 +307,9 @@ namespace TShockAPI.DB Expiration = exp; } + /// + /// Initializes a new instance of the class. + /// public Ban() { IP = string.Empty;