Merge branch 'general-devel' into fix-time

This commit is contained in:
Chris 2018-05-29 02:31:11 +00:00 committed by GitHub
commit b70ecb5bc3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 19 deletions

View file

@ -85,6 +85,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
* Removed `TSPlayer.InitSpawn` field. (@DankRank) * Removed `TSPlayer.InitSpawn` field. (@DankRank)
* `OnPlayerSpawn`'s player ID field is now `PlayerId`. (@DankRank) * `OnPlayerSpawn`'s player ID field is now `PlayerId`. (@DankRank)
* `Utils.TryParseTime` can now take spaces (e.g., `3d 5h 2m 3s`) (@QuiCM) * `Utils.TryParseTime` can now take spaces (e.g., `3d 5h 2m 3s`) (@QuiCM)
* Enabled banning unregistered users (@QuiCM)
* Added filtering and validation on packet 96 (Teleport player through portal) (@QuiCM) * Added filtering and validation on packet 96 (Teleport player through portal) (@QuiCM)
## TShock 4.3.25 ## TShock 4.3.25

View file

@ -1309,16 +1309,20 @@ namespace TShockAPI
// Effective ban target assignment // Effective ban target assignment
List<TSPlayer> players = TSPlayer.FindByNameOrID(args.Parameters[1]); List<TSPlayer> players = TSPlayer.FindByNameOrID(args.Parameters[1]);
// Bad case: Players contains more than 1 person so we can't ban them
if (players.Count > 1)
{
//Fail fast
args.Player.SendMultipleMatchError(players.Select(p => p.Name));
return;
}
UserAccount offlineUserAccount = TShock.UserAccounts.GetUserAccountByName(args.Parameters[1]); UserAccount offlineUserAccount = TShock.UserAccounts.GetUserAccountByName(args.Parameters[1]);
// Storage variable to determine if the command executor is the server console // Storage variable to determine if the command executor is the server console
// If it is, we assume they have full control and let them override permission checks // If it is, we assume they have full control and let them override permission checks
bool callerIsServerConsole = false; bool callerIsServerConsole = args.Player is TSServerPlayer;
if (args.Player is TSServerPlayer)
{
callerIsServerConsole = true;
}
// The ban reason the ban is going to have // The ban reason the ban is going to have
string banReason = "Unknown."; string banReason = "Unknown.";
@ -1331,16 +1335,18 @@ namespace TShockAPI
if (args.Parameters.Count >= 3) if (args.Parameters.Count >= 3)
{ {
bool parsedOkay = false; bool parsedOkay = false;
if (!(args.Parameters[2] == "0")) if (args.Parameters[2] != "0")
{ {
parsedOkay = TShock.Utils.TryParseTime(args.Parameters[2], out banLengthInSeconds); parsedOkay = TShock.Utils.TryParseTime(args.Parameters[2], out banLengthInSeconds);
} else { }
else
{
parsedOkay = true; parsedOkay = true;
} }
if (!parsedOkay) if (!parsedOkay)
{ {
args.Player.SendErrorMessage("Invalid time format. Example: 10d+5h+3m-2s."); args.Player.SendErrorMessage("Invalid time format. Example: 10d 5h 3m 2s.");
args.Player.SendErrorMessage("Use 0 (zero) for a permanent ban."); args.Player.SendErrorMessage("Use 0 (zero) for a permanent ban.");
return; return;
} }
@ -1352,13 +1358,6 @@ namespace TShockAPI
banReason = String.Join(" ", args.Parameters.Skip(3)); banReason = String.Join(" ", args.Parameters.Skip(3));
} }
// Bad case: Players contains more than 1 person so we can't ban them
if (players.Count > 1)
{
args.Player.SendMultipleMatchError(players.Select(p => p.Name));
return;
}
// Good case: Online ban for matching character. // Good case: Online ban for matching character.
if (players.Count == 1) if (players.Count == 1)
{ {
@ -1371,7 +1370,7 @@ namespace TShockAPI
} }
targetGeneralizedName = target.Name; targetGeneralizedName = target.Name;
success = TShock.Bans.AddBan(target.IP, target.Name, target.UUID, target.Account.Name, banReason, false, args.Player.Account.Name, success = TShock.Bans.AddBan(target.IP, target.Name, target.UUID, target.Account?.Name ?? "", banReason, false, args.Player.Account.Name,
banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s")); banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s"));
// 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.
@ -1399,7 +1398,8 @@ namespace TShockAPI
// If the target is a valid IP... // If the target is a valid IP...
string pattern = @"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; string pattern = @"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
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.AddBan(args.Parameters[1], "", "", "", banReason,
false, args.Player.Account.Name, banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s")); false, args.Player.Account.Name, banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s"));
@ -1409,7 +1409,9 @@ namespace TShockAPI
args.Player.SendErrorMessage("Note: An account named with this IP address also exists."); args.Player.SendErrorMessage("Note: An account named with this IP address also exists.");
args.Player.SendErrorMessage("Note: It will also be banned."); args.Player.SendErrorMessage("Note: It will also be banned.");
} }
} else { }
else
{
// Apparently there is no way to not IP ban someone // Apparently there is no way to not IP ban someone
// This means that where we would normally just ban a "character name" here // This means that where we would normally just ban a "character name" here
// We can't because it requires some IP as a primary key. // We can't because it requires some IP as a primary key.