From 864c857141132cfbef3838d3a587a25cb69c4b45 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 10 Jun 2022 00:47:07 -0400 Subject: [PATCH] Scripts/Commands: Convert rbac commands to new system Port From (https://github.com/TrinityCore/TrinityCore/commit/b3b6e2715eb2a75805b7d879a1bef1074c085143) --- Source/Framework/Constants/AccountConst.cs | 6 +- Source/Game/Chat/CommandArgs.cs | 3 +- Source/Game/Chat/Commands/RbacCommands.cs | 284 +++++++++------------ 3 files changed, 119 insertions(+), 174 deletions(-) diff --git a/Source/Framework/Constants/AccountConst.cs b/Source/Framework/Constants/AccountConst.cs index 22e33e81f..3245c9498 100644 --- a/Source/Framework/Constants/AccountConst.cs +++ b/Source/Framework/Constants/AccountConst.cs @@ -117,8 +117,8 @@ namespace Framework.Constants RoleModerator = 198, RolePlayer = 199, - CommandRbac = 200, - CommandRbacAcc = 201, + // 200 previously used, do not reuse + // 201 previously used, do not reuse CommandRbacAccPermList = 202, CommandRbacAccPermGrant = 203, CommandRbacAccPermDeny = 204, @@ -283,7 +283,7 @@ namespace Framework.Constants CommandGuildUninvite = 405, CommandGuildRank = 406, CommandGuildRename = 407, - CommandHonor = 408, + // 408 previously used, do not reuse CommandHonorAdd = 409, CommandHonorAddKill = 410, CommandHonorUpdate = 411, diff --git a/Source/Game/Chat/CommandArgs.cs b/Source/Game/Chat/CommandArgs.cs index d6972907f..3e75e9759 100644 --- a/Source/Game/Chat/CommandArgs.cs +++ b/Source/Game/Chat/CommandArgs.cs @@ -233,7 +233,8 @@ namespace Game.Chat public uint GetID() { return _id; } public string GetName() { return _name; } - public WorldSession GetSession() { return _session; } + public bool IsConnected() { return _session != null; } + public WorldSession GetConnectedSession() { return _session; } public static AccountIdentifier ParseFromString(string arg) { diff --git a/Source/Game/Chat/Commands/RbacCommands.cs b/Source/Game/Chat/Commands/RbacCommands.cs index ab4ce0b14..921139c13 100644 --- a/Source/Game/Chat/Commands/RbacCommands.cs +++ b/Source/Game/Chat/Commands/RbacCommands.cs @@ -27,33 +27,30 @@ namespace Game.Chat.Commands class RbacComands { [Command("list", RBACPermissions.CommandRbacList, true)] - static bool HandleRBACListPermissionsCommand(CommandHandler handler, StringArguments args) + static bool HandleRBACListPermissionsCommand(CommandHandler handler, uint? permId) { - uint id = args.NextUInt32(); - - if (id == 0) + if (!permId.HasValue) { var permissions = Global.AccountMgr.GetRBACPermissionList(); handler.SendSysMessage(CypherStrings.RbacListPermissionsHeader); - foreach (var permission in permissions.Values) + foreach (var (_, permission) in permissions) handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName()); } else { - RBACPermission permission = Global.AccountMgr.GetRBACPermission(id); + RBACPermission permission = Global.AccountMgr.GetRBACPermission(permId.Value); if (permission == null) { - handler.SendSysMessage(CypherStrings.RbacWrongParameterId, id); + handler.SendSysMessage(CypherStrings.RbacWrongParameterId, permId.Value); return false; } handler.SendSysMessage(CypherStrings.RbacListPermissionsHeader); handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName()); handler.SendSysMessage(CypherStrings.RbacListPermsLinkedHeader); - var permissions = permission.GetLinkedPermissions(); - foreach (var permissionId in permissions) + foreach (var linkedPerm in permission.GetLinkedPermissions()) { - RBACPermission rbacPermission = Global.AccountMgr.GetRBACPermission(permissionId); + RBACPermission rbacPermission = Global.AccountMgr.GetRBACPermission(linkedPerm); if (rbacPermission != null) handler.SendSysMessage(CypherStrings.RbacListElement, rbacPermission.GetId(), rbacPermission.GetName()); } @@ -65,67 +62,42 @@ namespace Game.Chat.Commands [CommandGroup("account")] class RbacAccountCommands { - [Command("grant", RBACPermissions.CommandRbacAccPermGrant, true)] - static bool HandleRBACPermGrantCommand(CommandHandler handler, StringArguments args) - { - RBACCommandData command = ReadParams(args, handler); - if (command == null) - return false; - - RBACCommandResult result = command.rbac.GrantPermission(command.id, command.realmId); - RBACPermission permission = Global.AccountMgr.GetRBACPermission(command.id); - - switch (result) - { - case RBACCommandResult.CantAddAlreadyAdded: - handler.SendSysMessage(CypherStrings.RbacPermGrantedInList, command.id, permission.GetName(), - command.realmId, command.rbac.GetId(), command.rbac.GetName()); - break; - case RBACCommandResult.InDeniedList: - handler.SendSysMessage(CypherStrings.RbacPermGrantedInDeniedList, command.id, permission.GetName(), - command.realmId, command.rbac.GetId(), command.rbac.GetName()); - break; - case RBACCommandResult.OK: - handler.SendSysMessage(CypherStrings.RbacPermGranted, command.id, permission.GetName(), - command.realmId, command.rbac.GetId(), command.rbac.GetName()); - break; - case RBACCommandResult.IdDoesNotExists: - handler.SendSysMessage(CypherStrings.RbacWrongParameterId, command.id); - break; - default: - break; - } - - return true; - } - [Command("deny", RBACPermissions.CommandRbacAccPermDeny, true)] - static bool HandleRBACPermDenyCommand(CommandHandler handler, StringArguments args) + static bool HandleRBACPermDenyCommand(CommandHandler handler, string accountName, uint permId, int? realmId) { - RBACCommandData command = ReadParams(args, handler); - - if (command == null) + var account = AccountIdentifier.ParseFromString(accountName); + if (account == null) + account = AccountIdentifier.FromTarget(handler); + if (account == null) return false; - RBACCommandResult result = command.rbac.DenyPermission(command.id, command.realmId); - RBACPermission permission = Global.AccountMgr.GetRBACPermission(command.id); + if (handler.HasLowerSecurityAccount(null, account.GetID(), true)) + return false; + + if (!realmId.HasValue) + realmId = -1; + + RBACCommandData data = GetRBACData(account); + + RBACCommandResult result = data.rbac.DenyPermission(permId, realmId.Value); + RBACPermission permission = Global.AccountMgr.GetRBACPermission(permId); switch (result) { case RBACCommandResult.CantAddAlreadyAdded: - handler.SendSysMessage(CypherStrings.RbacPermDeniedInList, command.id, permission.GetName(), - command.realmId, command.rbac.GetId(), command.rbac.GetName()); + handler.SendSysMessage(CypherStrings.RbacPermDeniedInList, permId, permission.GetName(), + realmId.Value, data.rbac.GetId(), data.rbac.GetName()); break; case RBACCommandResult.InGrantedList: - handler.SendSysMessage(CypherStrings.RbacPermDeniedInGrantedList, command.id, permission.GetName(), - command.realmId, command.rbac.GetId(), command.rbac.GetName()); + handler.SendSysMessage(CypherStrings.RbacPermDeniedInGrantedList, permId, permission.GetName(), + realmId.Value, data.rbac.GetId(), data.rbac.GetName()); break; case RBACCommandResult.OK: - handler.SendSysMessage(CypherStrings.RbacPermDenied, command.id, permission.GetName(), - command.realmId, command.rbac.GetId(), command.rbac.GetName()); + handler.SendSysMessage(CypherStrings.RbacPermDenied, permId, permission.GetName(), + realmId.Value, data.rbac.GetId(), data.rbac.GetName()); break; case RBACCommandResult.IdDoesNotExists: - handler.SendSysMessage(CypherStrings.RbacWrongParameterId, command.id); + handler.SendSysMessage(CypherStrings.RbacWrongParameterId, permId); break; default: break; @@ -134,29 +106,42 @@ namespace Game.Chat.Commands return true; } - [Command("revoke", RBACPermissions.CommandRbacAccPermRevoke, true)] - static bool HandleRBACPermRevokeCommand(CommandHandler handler, StringArguments args) + [Command("grant", RBACPermissions.CommandRbacAccPermGrant, true)] + static bool HandleRBACPermGrantCommand(CommandHandler handler, string accountName, uint permId, int? realmId) { - RBACCommandData command = ReadParams(args, handler); - - if (command == null) + var account = AccountIdentifier.ParseFromString(accountName); + if (account == null) + account = AccountIdentifier.FromTarget(handler); + if (account == null) return false; - RBACCommandResult result = command.rbac.RevokePermission(command.id, command.realmId); - RBACPermission permission = Global.AccountMgr.GetRBACPermission(command.id); + if (handler.HasLowerSecurityAccount(null, account.GetID(), true)) + return false; + + if (!realmId.HasValue) + realmId = -1; + + RBACCommandData data = GetRBACData(account); + + RBACCommandResult result = data.rbac.GrantPermission(permId, realmId.Value); + RBACPermission permission = Global.AccountMgr.GetRBACPermission(permId); switch (result) { - case RBACCommandResult.CantRevokeNotInList: - handler.SendSysMessage(CypherStrings.RbacPermRevokedNotInList, command.id, permission.GetName(), - command.realmId, command.rbac.GetId(), command.rbac.GetName()); + case RBACCommandResult.CantAddAlreadyAdded: + handler.SendSysMessage(CypherStrings.RbacPermGrantedInList, permId, permission.GetName(), + realmId.Value, data.rbac.GetId(), data.rbac.GetName()); + break; + case RBACCommandResult.InDeniedList: + handler.SendSysMessage(CypherStrings.RbacPermGrantedInDeniedList, permId, permission.GetName(), + realmId.Value, data.rbac.GetId(), data.rbac.GetName()); break; case RBACCommandResult.OK: - handler.SendSysMessage(CypherStrings.RbacPermRevoked, command.id, permission.GetName(), - command.realmId, command.rbac.GetId(), command.rbac.GetName()); + handler.SendSysMessage(CypherStrings.RbacPermGranted, permId, permission.GetName(), + realmId.Value, data.rbac.GetId(), data.rbac.GetName()); break; case RBACCommandResult.IdDoesNotExists: - handler.SendSysMessage(CypherStrings.RbacWrongParameterId, command.id); + handler.SendSysMessage(CypherStrings.RbacWrongParameterId, permId); break; default: break; @@ -166,15 +151,18 @@ namespace Game.Chat.Commands } [Command("list", RBACPermissions.CommandRbacAccPermList, true)] - static bool HandleRBACPermListCommand(CommandHandler handler, StringArguments args) + static bool HandleRBACPermListCommand(CommandHandler handler, string accountName) { - RBACCommandData command = ReadParams(args, handler, false); - - if (command == null) + var account = AccountIdentifier.ParseFromString(accountName); + if (account == null) + account = AccountIdentifier.FromTarget(handler); + if (account == null) return false; - handler.SendSysMessage(CypherStrings.RbacListHeaderGranted, command.rbac.GetId(), command.rbac.GetName()); - var granted = command.rbac.GetGrantedPermissions(); + RBACCommandData data = GetRBACData(account); + + handler.SendSysMessage(CypherStrings.RbacListHeaderGranted, data.rbac.GetId(), data.rbac.GetName()); + var granted = data.rbac.GetGrantedPermissions(); if (granted.Empty()) handler.SendSysMessage(CypherStrings.RbacListEmpty); else @@ -186,8 +174,8 @@ namespace Game.Chat.Commands } } - handler.SendSysMessage(CypherStrings.RbacListHeaderDenied, command.rbac.GetId(), command.rbac.GetName()); - var denied = command.rbac.GetDeniedPermissions(); + handler.SendSysMessage(CypherStrings.RbacListHeaderDenied, data.rbac.GetId(), data.rbac.GetName()); + var denied = data.rbac.GetDeniedPermissions(); if (denied.Empty()) handler.SendSysMessage(CypherStrings.RbacListEmpty); else @@ -198,8 +186,8 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName()); } } - handler.SendSysMessage(CypherStrings.RbacListHeaderBySecLevel, command.rbac.GetId(), command.rbac.GetName(), command.rbac.GetSecurityLevel()); - var defaultPermissions = Global.AccountMgr.GetRBACDefaultPermissions(command.rbac.GetSecurityLevel()); + handler.SendSysMessage(CypherStrings.RbacListHeaderBySecLevel, data.rbac.GetId(), data.rbac.GetName(), data.rbac.GetSecurityLevel()); + var defaultPermissions = Global.AccountMgr.GetRBACDefaultPermissions(data.rbac.GetSecurityLevel()); if (defaultPermissions.Empty()) handler.SendSysMessage(CypherStrings.RbacListEmpty); else @@ -213,105 +201,61 @@ namespace Game.Chat.Commands return true; } + + [Command("revoke", RBACPermissions.CommandRbacAccPermRevoke, true)] + static bool HandleRBACPermRevokeCommand(CommandHandler handler, string accountName, uint permId, int? realmId) + { + var account = AccountIdentifier.ParseFromString(accountName); + if (account == null) + account = AccountIdentifier.FromTarget(handler); + if (account == null) + return false; + + if (handler.HasLowerSecurityAccount(null, account.GetID(), true)) + return false; + + if (!realmId.HasValue) + realmId = -1; + + RBACCommandData data = GetRBACData(account); + + RBACCommandResult result = data.rbac.RevokePermission(permId, realmId.Value); + RBACPermission permission = Global.AccountMgr.GetRBACPermission(permId); + + switch (result) + { + case RBACCommandResult.CantRevokeNotInList: + handler.SendSysMessage(CypherStrings.RbacPermRevokedNotInList, permId, permission.GetName(), + realmId.Value, data.rbac.GetId(), data.rbac.GetName()); + break; + case RBACCommandResult.OK: + handler.SendSysMessage(CypherStrings.RbacPermRevoked, permId, permission.GetName(), + realmId.Value, data.rbac.GetId(), data.rbac.GetName()); + break; + case RBACCommandResult.IdDoesNotExists: + handler.SendSysMessage(CypherStrings.RbacWrongParameterId, permId); + break; + default: + break; + } + + return true; + } } - static RBACCommandData ReadParams(StringArguments args, CommandHandler handler, bool checkParams = true) + static RBACCommandData GetRBACData(AccountIdentifier account) { - if (args.Empty()) - return null; + if (account.IsConnected()) + return new RBACCommandData() { rbac = account.GetConnectedSession().GetRBACData(), needDelete = false }; - string param1 = args.NextString(); - string param2 = args.NextString(); - string param3 = args.NextString(); + RBACData rbac = new(account.GetID(), account.GetName(), (int)Global.WorldMgr.GetRealmId().Index, (byte)Global.AccountMgr.GetSecurity(account.GetID(), (int)Global.WorldMgr.GetRealmId().Index)); + rbac.LoadFromDB(); - int realmId = -1; - uint accountId; - string accountName; - uint id = 0; - RBACData rdata = null; - bool useSelectedPlayer = false; - - if (checkParams) - { - if (string.IsNullOrEmpty(param3)) - { - if (!int.TryParse(param2, out realmId)) - return null; - - if (!uint.TryParse(param1, out id)) - return null; - - useSelectedPlayer = true; - } - else - { - if (!uint.TryParse(param2, out id)) - return null; - - if (!int.TryParse(param3, out realmId)) - return null; - } - - if (id == 0) - { - handler.SendSysMessage(CypherStrings.RbacWrongParameterId, id); - return null; - } - - if (realmId < -1 || realmId == 0) - { - handler.SendSysMessage(CypherStrings.RbacWrongParameterRealm, realmId); - return null; - } - } - else if (string.IsNullOrEmpty(param1)) - useSelectedPlayer = true; - - if (useSelectedPlayer) - { - Player player = handler.GetSelectedPlayer(); - if (!player) - return null; - - rdata = player.GetSession().GetRBACData(); - accountId = rdata.GetId(); - Global.AccountMgr.GetName(accountId, out accountName); - } - else - { - accountName = param1; - accountId = Global.AccountMgr.GetId(accountName); - - if (accountId == 0) - { - handler.SendSysMessage(CypherStrings.AccountNotExist, accountName); - return null; - } - } - - if (checkParams && handler.HasLowerSecurityAccount(null, accountId, true)) - return null; - - RBACCommandData data = new(); - - if (rdata == null) - { - data.rbac = new RBACData(accountId, accountName, (int)Global.WorldMgr.GetRealm().Id.Index, (byte)Global.AccountMgr.GetSecurity(accountId, (int)Global.WorldMgr.GetRealm().Id.Index)); - data.rbac.LoadFromDB(); - data.needDelete = true; - } - else - data.rbac = rdata; - - data.id = id; - data.realmId = realmId; - return data; + return new RBACCommandData() { rbac = rbac, needDelete = true }; } class RBACCommandData { - public uint id; - public int realmId; public RBACData rbac; public bool needDelete; }