From 48370d74b7093c67cf8f45b4af4a7bee55e9f355 Mon Sep 17 00:00:00 2001 From: quake1337 <3310937+bartico6@users.noreply.github.com> Date: Tue, 13 Jul 2021 21:33:35 +0200 Subject: [PATCH] Missing group safeguards. - Server will no longer start up when the guest or default groups cannot be located. - Players joining with unknown groups assigned to them will be disconnected with an error --- TShockAPI/Commands.cs | 7 +++++-- TShockAPI/DB/GroupManager.cs | 15 +++++++++++++++ TShockAPI/GetDataHandlers.cs | 10 ++++++++-- TShockAPI/TShock.cs | 1 + TShockAPI/Utils.cs | 11 +++++++++++ TerrariaServerAPI | 2 +- 6 files changed, 41 insertions(+), 5 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index b6ba179f..80e710ad 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -823,10 +823,13 @@ namespace TShockAPI (usingUUID && account.UUID == args.Player.UUID && !TShock.Config.Settings.DisableUUIDLogin && !String.IsNullOrWhiteSpace(args.Player.UUID))) { - args.Player.PlayerData = TShock.CharacterDB.GetPlayerData(args.Player, account.ID); - var group = TShock.Groups.GetGroupByName(account.Group); + if (!TShock.Utils.AssertGroupValid(args.Player, group)) + return; + + args.Player.PlayerData = TShock.CharacterDB.GetPlayerData(args.Player, account.ID); + args.Player.Group = group; args.Player.tempGroup = null; args.Player.Account = account; diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 7b3b62dd..8133edaa 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -202,6 +202,21 @@ namespace TShockAPI.DB Group.DefaultGroup = GetGroupByName(TShock.Config.Settings.DefaultGuestGroupName); } + internal void EnsureCoreGroupsPresent() + { + if (!GroupExists(TShock.Config.Settings.DefaultGuestGroupName)) + { + TShock.Log.ConsoleError("The guest group could not be found. This may indicate a typo in the configuration file, or that the group was renamed or deleted."); + throw new Exception("The guest group could not be found."); + } + + if(!GroupExists(TShock.Config.Settings.DefaultRegistrationGroupName)) + { + TShock.Log.ConsoleError("The default usergroup could not be found. This may indicate a typo in the configuration file, or that the group was renamed or deleted."); + throw new Exception("The default usergroup could not be found."); + } + } + private void AddDefaultGroup(string name, string parent, string permissions) { if (!GroupExists(name)) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index e92d19a9..b90f6fe1 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -2450,10 +2450,13 @@ namespace TShockAPI args.Player.State = 2; NetMessage.SendData((int)PacketTypes.WorldInfo, args.Player.Index); - args.Player.PlayerData = TShock.CharacterDB.GetPlayerData(args.Player, account.ID); - var group = TShock.Groups.GetGroupByName(account.Group); + if (!TShock.Utils.AssertGroupValid(args.Player, group)) + return true; + + args.Player.PlayerData = TShock.CharacterDB.GetPlayerData(args.Player, account.ID); + args.Player.Group = group; args.Player.tempGroup = null; args.Player.Account = account; @@ -3004,6 +3007,9 @@ namespace TShockAPI var group = TShock.Groups.GetGroupByName(account.Group); + if (!TShock.Utils.AssertGroupValid(args.Player, group)) + return true; + args.Player.Group = group; args.Player.tempGroup = null; args.Player.Account = account; diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index ed74b882..bc1d26e7 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -322,6 +322,7 @@ namespace TShockAPI Regions = new RegionManager(DB); UserAccounts = new UserAccountManager(DB); Groups = new GroupManager(DB); + Groups.EnsureCoreGroupsPresent(); ProjectileBans = new ProjectileManagager(DB); TileBans = new TileManager(DB); RememberedPos = new RememberedPosManager(DB); diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index 23007b19..36a6d348 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -212,6 +212,17 @@ namespace TShockAPI } while (TilePlacementValid(tileX, tileY) && TileSolid(tileX, tileY)); } + public bool AssertGroupValid(TSPlayer player, Group group) + { + if (group == null) + { + player.Disconnect("Your account's group could not be found. Please contact server administrators about this."); + return false; + } + + return true; + } + /// /// Determines if a tile is valid. /// diff --git a/TerrariaServerAPI b/TerrariaServerAPI index 8c2c0873..4b555bc3 160000 --- a/TerrariaServerAPI +++ b/TerrariaServerAPI @@ -1 +1 @@ -Subproject commit 8c2c087327bbd1f20ff6c46f4d11e5714e57064b +Subproject commit 4b555bc373dbb470bc69ebed69c79de116f28df2