Scripts/Commands: Convert rbac commands to new system

Port From (https://github.com/TrinityCore/TrinityCore/commit/b3b6e2715eb2a75805b7d879a1bef1074c085143)
This commit is contained in:
hondacrx
2022-06-10 00:47:07 -04:00
parent ceb7ddbe1f
commit 864c857141
3 changed files with 119 additions and 174 deletions
+3 -3
View File
@@ -117,8 +117,8 @@ namespace Framework.Constants
RoleModerator = 198, RoleModerator = 198,
RolePlayer = 199, RolePlayer = 199,
CommandRbac = 200, // 200 previously used, do not reuse
CommandRbacAcc = 201, // 201 previously used, do not reuse
CommandRbacAccPermList = 202, CommandRbacAccPermList = 202,
CommandRbacAccPermGrant = 203, CommandRbacAccPermGrant = 203,
CommandRbacAccPermDeny = 204, CommandRbacAccPermDeny = 204,
@@ -283,7 +283,7 @@ namespace Framework.Constants
CommandGuildUninvite = 405, CommandGuildUninvite = 405,
CommandGuildRank = 406, CommandGuildRank = 406,
CommandGuildRename = 407, CommandGuildRename = 407,
CommandHonor = 408, // 408 previously used, do not reuse
CommandHonorAdd = 409, CommandHonorAdd = 409,
CommandHonorAddKill = 410, CommandHonorAddKill = 410,
CommandHonorUpdate = 411, CommandHonorUpdate = 411,
+2 -1
View File
@@ -233,7 +233,8 @@ namespace Game.Chat
public uint GetID() { return _id; } public uint GetID() { return _id; }
public string GetName() { return _name; } 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) public static AccountIdentifier ParseFromString(string arg)
{ {
+114 -170
View File
@@ -27,33 +27,30 @@ namespace Game.Chat.Commands
class RbacComands class RbacComands
{ {
[Command("list", RBACPermissions.CommandRbacList, true)] [Command("list", RBACPermissions.CommandRbacList, true)]
static bool HandleRBACListPermissionsCommand(CommandHandler handler, StringArguments args) static bool HandleRBACListPermissionsCommand(CommandHandler handler, uint? permId)
{ {
uint id = args.NextUInt32(); if (!permId.HasValue)
if (id == 0)
{ {
var permissions = Global.AccountMgr.GetRBACPermissionList(); var permissions = Global.AccountMgr.GetRBACPermissionList();
handler.SendSysMessage(CypherStrings.RbacListPermissionsHeader); handler.SendSysMessage(CypherStrings.RbacListPermissionsHeader);
foreach (var permission in permissions.Values) foreach (var (_, permission) in permissions)
handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName()); handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName());
} }
else else
{ {
RBACPermission permission = Global.AccountMgr.GetRBACPermission(id); RBACPermission permission = Global.AccountMgr.GetRBACPermission(permId.Value);
if (permission == null) if (permission == null)
{ {
handler.SendSysMessage(CypherStrings.RbacWrongParameterId, id); handler.SendSysMessage(CypherStrings.RbacWrongParameterId, permId.Value);
return false; return false;
} }
handler.SendSysMessage(CypherStrings.RbacListPermissionsHeader); handler.SendSysMessage(CypherStrings.RbacListPermissionsHeader);
handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName()); handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName());
handler.SendSysMessage(CypherStrings.RbacListPermsLinkedHeader); handler.SendSysMessage(CypherStrings.RbacListPermsLinkedHeader);
var permissions = permission.GetLinkedPermissions(); foreach (var linkedPerm in permission.GetLinkedPermissions())
foreach (var permissionId in permissions)
{ {
RBACPermission rbacPermission = Global.AccountMgr.GetRBACPermission(permissionId); RBACPermission rbacPermission = Global.AccountMgr.GetRBACPermission(linkedPerm);
if (rbacPermission != null) if (rbacPermission != null)
handler.SendSysMessage(CypherStrings.RbacListElement, rbacPermission.GetId(), rbacPermission.GetName()); handler.SendSysMessage(CypherStrings.RbacListElement, rbacPermission.GetId(), rbacPermission.GetName());
} }
@@ -65,67 +62,42 @@ namespace Game.Chat.Commands
[CommandGroup("account")] [CommandGroup("account")]
class RbacAccountCommands 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)] [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); var account = AccountIdentifier.ParseFromString(accountName);
if (account == null)
if (command == null) account = AccountIdentifier.FromTarget(handler);
if (account == null)
return false; return false;
RBACCommandResult result = command.rbac.DenyPermission(command.id, command.realmId); if (handler.HasLowerSecurityAccount(null, account.GetID(), true))
RBACPermission permission = Global.AccountMgr.GetRBACPermission(command.id); 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) switch (result)
{ {
case RBACCommandResult.CantAddAlreadyAdded: case RBACCommandResult.CantAddAlreadyAdded:
handler.SendSysMessage(CypherStrings.RbacPermDeniedInList, command.id, permission.GetName(), handler.SendSysMessage(CypherStrings.RbacPermDeniedInList, permId, permission.GetName(),
command.realmId, command.rbac.GetId(), command.rbac.GetName()); realmId.Value, data.rbac.GetId(), data.rbac.GetName());
break; break;
case RBACCommandResult.InGrantedList: case RBACCommandResult.InGrantedList:
handler.SendSysMessage(CypherStrings.RbacPermDeniedInGrantedList, command.id, permission.GetName(), handler.SendSysMessage(CypherStrings.RbacPermDeniedInGrantedList, permId, permission.GetName(),
command.realmId, command.rbac.GetId(), command.rbac.GetName()); realmId.Value, data.rbac.GetId(), data.rbac.GetName());
break; break;
case RBACCommandResult.OK: case RBACCommandResult.OK:
handler.SendSysMessage(CypherStrings.RbacPermDenied, command.id, permission.GetName(), handler.SendSysMessage(CypherStrings.RbacPermDenied, permId, permission.GetName(),
command.realmId, command.rbac.GetId(), command.rbac.GetName()); realmId.Value, data.rbac.GetId(), data.rbac.GetName());
break; break;
case RBACCommandResult.IdDoesNotExists: case RBACCommandResult.IdDoesNotExists:
handler.SendSysMessage(CypherStrings.RbacWrongParameterId, command.id); handler.SendSysMessage(CypherStrings.RbacWrongParameterId, permId);
break; break;
default: default:
break; break;
@@ -134,29 +106,42 @@ namespace Game.Chat.Commands
return true; return true;
} }
[Command("revoke", RBACPermissions.CommandRbacAccPermRevoke, true)] [Command("grant", RBACPermissions.CommandRbacAccPermGrant, true)]
static bool HandleRBACPermRevokeCommand(CommandHandler handler, StringArguments args) static bool HandleRBACPermGrantCommand(CommandHandler handler, string accountName, uint permId, int? realmId)
{ {
RBACCommandData command = ReadParams(args, handler); var account = AccountIdentifier.ParseFromString(accountName);
if (account == null)
if (command == null) account = AccountIdentifier.FromTarget(handler);
if (account == null)
return false; return false;
RBACCommandResult result = command.rbac.RevokePermission(command.id, command.realmId); if (handler.HasLowerSecurityAccount(null, account.GetID(), true))
RBACPermission permission = Global.AccountMgr.GetRBACPermission(command.id); 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) switch (result)
{ {
case RBACCommandResult.CantRevokeNotInList: case RBACCommandResult.CantAddAlreadyAdded:
handler.SendSysMessage(CypherStrings.RbacPermRevokedNotInList, command.id, permission.GetName(), handler.SendSysMessage(CypherStrings.RbacPermGrantedInList, permId, permission.GetName(),
command.realmId, command.rbac.GetId(), command.rbac.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; break;
case RBACCommandResult.OK: case RBACCommandResult.OK:
handler.SendSysMessage(CypherStrings.RbacPermRevoked, command.id, permission.GetName(), handler.SendSysMessage(CypherStrings.RbacPermGranted, permId, permission.GetName(),
command.realmId, command.rbac.GetId(), command.rbac.GetName()); realmId.Value, data.rbac.GetId(), data.rbac.GetName());
break; break;
case RBACCommandResult.IdDoesNotExists: case RBACCommandResult.IdDoesNotExists:
handler.SendSysMessage(CypherStrings.RbacWrongParameterId, command.id); handler.SendSysMessage(CypherStrings.RbacWrongParameterId, permId);
break; break;
default: default:
break; break;
@@ -166,15 +151,18 @@ namespace Game.Chat.Commands
} }
[Command("list", RBACPermissions.CommandRbacAccPermList, true)] [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); var account = AccountIdentifier.ParseFromString(accountName);
if (account == null)
if (command == null) account = AccountIdentifier.FromTarget(handler);
if (account == null)
return false; return false;
handler.SendSysMessage(CypherStrings.RbacListHeaderGranted, command.rbac.GetId(), command.rbac.GetName()); RBACCommandData data = GetRBACData(account);
var granted = command.rbac.GetGrantedPermissions();
handler.SendSysMessage(CypherStrings.RbacListHeaderGranted, data.rbac.GetId(), data.rbac.GetName());
var granted = data.rbac.GetGrantedPermissions();
if (granted.Empty()) if (granted.Empty())
handler.SendSysMessage(CypherStrings.RbacListEmpty); handler.SendSysMessage(CypherStrings.RbacListEmpty);
else else
@@ -186,8 +174,8 @@ namespace Game.Chat.Commands
} }
} }
handler.SendSysMessage(CypherStrings.RbacListHeaderDenied, command.rbac.GetId(), command.rbac.GetName()); handler.SendSysMessage(CypherStrings.RbacListHeaderDenied, data.rbac.GetId(), data.rbac.GetName());
var denied = command.rbac.GetDeniedPermissions(); var denied = data.rbac.GetDeniedPermissions();
if (denied.Empty()) if (denied.Empty())
handler.SendSysMessage(CypherStrings.RbacListEmpty); handler.SendSysMessage(CypherStrings.RbacListEmpty);
else else
@@ -198,8 +186,8 @@ namespace Game.Chat.Commands
handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName()); handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName());
} }
} }
handler.SendSysMessage(CypherStrings.RbacListHeaderBySecLevel, command.rbac.GetId(), command.rbac.GetName(), command.rbac.GetSecurityLevel()); handler.SendSysMessage(CypherStrings.RbacListHeaderBySecLevel, data.rbac.GetId(), data.rbac.GetName(), data.rbac.GetSecurityLevel());
var defaultPermissions = Global.AccountMgr.GetRBACDefaultPermissions(command.rbac.GetSecurityLevel()); var defaultPermissions = Global.AccountMgr.GetRBACDefaultPermissions(data.rbac.GetSecurityLevel());
if (defaultPermissions.Empty()) if (defaultPermissions.Empty())
handler.SendSysMessage(CypherStrings.RbacListEmpty); handler.SendSysMessage(CypherStrings.RbacListEmpty);
else else
@@ -213,105 +201,61 @@ namespace Game.Chat.Commands
return true; 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()) if (account.IsConnected())
return null; return new RBACCommandData() { rbac = account.GetConnectedSession().GetRBACData(), needDelete = false };
string param1 = 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));
string param2 = args.NextString(); rbac.LoadFromDB();
string param3 = args.NextString();
int realmId = -1; return new RBACCommandData() { rbac = rbac, needDelete = true };
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;
} }
class RBACCommandData class RBACCommandData
{ {
public uint id;
public int realmId;
public RBACData rbac; public RBACData rbac;
public bool needDelete; public bool needDelete;
} }