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;