Files
CypherCore/Source/Game/Chat/Commands/RbacCommands.cs
T
Hondacrx d70529bc19 Core/Realms: Realmlist refactors
* Removed global realm variable from World and use RealmList everywhere
* Match auth build key with client version
* Restored allowedSecurityLevel checks for realmlist packet building
* Restored updating population field
Port From (https://github.com/TrinityCore/TrinityCore/commit/c4b710446d62c95eb8124175203fa5f394912594)
2024-09-26 12:53:15 -04:00

247 lines
11 KiB
C#

// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
using Framework.Constants;
using Framework.IO;
using Game.Accounts;
using Game.Entities;
using System.Collections.Generic;
namespace Game.Chat.Commands
{
[CommandGroup("rbac")]
class RbacComands
{
[Command("list", RBACPermissions.CommandRbacList, true)]
static bool HandleRBACListPermissionsCommand(CommandHandler handler, uint? permId)
{
if (!permId.HasValue)
{
var permissions = Global.AccountMgr.GetRBACPermissionList();
handler.SendSysMessage(CypherStrings.RbacListPermissionsHeader);
foreach (var (_, permission) in permissions)
handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName());
}
else
{
RBACPermission permission = Global.AccountMgr.GetRBACPermission(permId.Value);
if (permission == null)
{
handler.SendSysMessage(CypherStrings.RbacWrongParameterId, permId.Value);
return false;
}
handler.SendSysMessage(CypherStrings.RbacListPermissionsHeader);
handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName());
handler.SendSysMessage(CypherStrings.RbacListPermsLinkedHeader);
foreach (var linkedPerm in permission.GetLinkedPermissions())
{
RBACPermission rbacPermission = Global.AccountMgr.GetRBACPermission(linkedPerm);
if (rbacPermission != null)
handler.SendSysMessage(CypherStrings.RbacListElement, rbacPermission.GetId(), rbacPermission.GetName());
}
}
return true;
}
[CommandGroup("account")]
class RbacAccountCommands
{
[Command("deny", RBACPermissions.CommandRbacAccPermDeny, true)]
static bool HandleRBACPermDenyCommand(CommandHandler handler, AccountIdentifier account, uint permId, int? realmId)
{
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.DenyPermission(permId, realmId.Value);
RBACPermission permission = Global.AccountMgr.GetRBACPermission(permId);
switch (result)
{
case RBACCommandResult.CantAddAlreadyAdded:
handler.SendSysMessage(CypherStrings.RbacPermDeniedInList, permId, permission.GetName(),
realmId.Value, data.rbac.GetId(), data.rbac.GetName());
break;
case RBACCommandResult.InGrantedList:
handler.SendSysMessage(CypherStrings.RbacPermDeniedInGrantedList, permId, permission.GetName(),
realmId.Value, data.rbac.GetId(), data.rbac.GetName());
break;
case RBACCommandResult.OK:
handler.SendSysMessage(CypherStrings.RbacPermDenied, 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;
}
[Command("grant", RBACPermissions.CommandRbacAccPermGrant, true)]
static bool HandleRBACPermGrantCommand(CommandHandler handler, AccountIdentifier account, uint permId, int? realmId)
{
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.GrantPermission(permId, realmId.Value);
RBACPermission permission = Global.AccountMgr.GetRBACPermission(permId);
switch (result)
{
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.RbacPermGranted, 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;
}
[Command("list", RBACPermissions.CommandRbacAccPermList, true)]
static bool HandleRBACPermListCommand(CommandHandler handler, AccountIdentifier account)
{
if (account == null)
account = AccountIdentifier.FromTarget(handler);
if (account == null)
return false;
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
{
foreach (var id in granted)
{
RBACPermission permission = Global.AccountMgr.GetRBACPermission(id);
handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName());
}
}
handler.SendSysMessage(CypherStrings.RbacListHeaderDenied, data.rbac.GetId(), data.rbac.GetName());
var denied = data.rbac.GetDeniedPermissions();
if (denied.Empty())
handler.SendSysMessage(CypherStrings.RbacListEmpty);
else
{
foreach (var id in denied)
{
RBACPermission permission = Global.AccountMgr.GetRBACPermission(id);
handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName());
}
}
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
{
foreach (var id in defaultPermissions)
{
RBACPermission permission = Global.AccountMgr.GetRBACPermission(id);
handler.SendSysMessage(CypherStrings.RbacListElement, permission.GetId(), permission.GetName());
}
}
return true;
}
[Command("revoke", RBACPermissions.CommandRbacAccPermRevoke, true)]
static bool HandleRBACPermRevokeCommand(CommandHandler handler, AccountIdentifier account, uint permId, int? realmId)
{
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 GetRBACData(AccountIdentifier account)
{
if (account.IsConnected())
return new RBACCommandData() { rbac = account.GetConnectedSession().GetRBACData(), needDelete = false };
int realmId = (int)Global.RealmMgr.GetCurrentRealmId().Index;
RBACData rbac = new(account.GetID(), account.GetName(), realmId, (byte)Global.AccountMgr.GetSecurity(account.GetID(), realmId));
rbac.LoadFromDB();
return new RBACCommandData() { rbac = rbac, needDelete = true };
}
class RBACCommandData
{
public RBACData rbac;
public bool needDelete;
}
}
}