TrinityCore
Loading...
Searching...
No Matches
cs_rbac.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19Name: rbac_commandscript
20%Complete: 100
21Comment: All role based access control related commands (including account related)
22Category: commandscripts
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "AccountMgr.h"
27#include "Chat.h"
28#include "ChatCommand.h"
29#include "Config.h"
30#include "Language.h"
31#include "Player.h"
32#include "RealmList.h"
33#include "World.h"
34#include "WorldSession.h"
35
37{
38 RBACCommandData(rbac::RBACData* rbac_, bool needDelete_) : rbac(rbac_), needDelete(needDelete_) { }
41 {
42 if (needDelete)
43 delete rbac;
44 }
45
46 rbac::RBACData* rbac = nullptr;
47 bool needDelete = false;
48};
49
50using namespace Trinity::ChatCommands;
51
53{
54public:
55 rbac_commandscript() : CommandScript("rbac_commandscript") { }
56
57 std::span<ChatCommandBuilder const> GetCommands() const override
58 {
59 static ChatCommandTable rbacAccountCommandTable =
60 {
65 };
66
67 static ChatCommandTable rbacCommandTable =
68 {
69 { "account", rbacAccountCommandTable },
71 };
72
73 static ChatCommandTable commandTable =
74 {
75 { "rbac", rbacCommandTable },
76 };
77
78 return commandTable;
79 }
80
82 {
83 if (account.IsConnected())
84 return { account.GetConnectedSession()->GetRBACData(), false };
85
86 uint32 realmId = sRealmList->GetCurrentRealmId().Realm;
87 rbac::RBACData* rbac = new rbac::RBACData(account.GetID(), account.GetName(), realmId, AccountMgr::GetSecurity(account.GetID(), realmId));
88 rbac->LoadFromDB();
89
90 return { rbac, true };
91 }
92
94 {
95 if (!account)
96 account = AccountIdentifier::FromTarget(handler);
97 if (!account)
98 return false;
99
100 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
101 return false;
102
103 if (!realmId)
104 realmId = -1;
105
106 RBACCommandData data = GetRBACData(*account);
107
108 rbac::RBACCommandResult result = data.rbac->GrantPermission(permId, *realmId);
109 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
110
111 switch (result)
112 {
114 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_LIST, permId, permission->GetName(),
115 *realmId, account->GetID(), account->GetName());
116 break;
118 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST, permId, permission->GetName(),
119 *realmId, account->GetID(), account->GetName());
120 break;
121 case rbac::RBAC_OK:
122 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED, permId, permission->GetName(),
123 *realmId, account->GetID(), account->GetName());
124 break;
127 break;
128 default:
129 break;
130 }
131
132 return true;
133 }
134
136 {
137 if (!account)
138 account = AccountIdentifier::FromTarget(handler);
139 if (!account)
140 return false;
141
142 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
143 return false;
144
145 if (!realmId)
146 realmId = -1;
147
148 RBACCommandData data = GetRBACData(*account);
149
150 rbac::RBACCommandResult result = data.rbac->DenyPermission(permId, *realmId);
151 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
152
153 switch (result)
154 {
156 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_LIST, permId, permission->GetName(),
157 *realmId, account->GetID(), account->GetName());
158 break;
160 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST, permId, permission->GetName(),
161 *realmId, account->GetID(), account->GetName());
162 break;
163 case rbac::RBAC_OK:
164 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED, permId, permission->GetName(),
165 *realmId, account->GetID(), account->GetName());
166 break;
169 break;
170 default:
171 break;
172 }
173
174 return true;
175 }
176
178 {
179 if (!account)
180 account = AccountIdentifier::FromTarget(handler);
181 if (!account)
182 return false;
183
184 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
185 return false;
186
187 if (!realmId)
188 realmId = -1;
189
190 RBACCommandData data = GetRBACData(*account);
191
192 rbac::RBACCommandResult result = data.rbac->RevokePermission(permId, *realmId);
193 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
194
195 switch (result)
196 {
198 handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED_NOT_IN_LIST, permId, permission->GetName(),
199 *realmId, account->GetID(), account->GetName());
200 break;
201 case rbac::RBAC_OK:
202 handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED, permId, permission->GetName(),
203 *realmId, account->GetID(), account->GetName());
204 break;
207 break;
208 default:
209 break;
210 }
211
212 return true;
213 }
214
216 {
217 if (!account)
218 account = AccountIdentifier::FromTarget(handler);
219 if (!account)
220 return false;
221
222 RBACCommandData data = GetRBACData(*account);
223
226 if (granted.empty())
227 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
228 else
229 {
230 for (uint32 grantedId : granted)
231 {
232 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(grantedId);
233 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
234 }
235 }
236
239 if (denied.empty())
240 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
241 else
242 {
243 for (uint32 deniedId : denied)
244 {
245 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(deniedId);
246 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
247 }
248 }
250 rbac::RBACPermissionContainer const& defaultPermissions = sAccountMgr->GetRBACDefaultPermissions(data.rbac->GetSecurityLevel());
251 if (defaultPermissions.empty())
252 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
253 else
254 {
255 for (uint32 defaultPermission : defaultPermissions)
256 {
257 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(defaultPermission);
258 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
259 }
260 }
261
262 return true;
263 }
264
266 {
267 if (!permId)
268 {
269 rbac::RBACPermissionsContainer const& permissions = sAccountMgr->GetRBACPermissionList();
271 for (auto const& [_, permission] : permissions)
272 {
273 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
274 }
275 }
276 else
277 {
278 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*permId);
279 if (!permission)
280 {
282 handler->SetSentErrorMessage(true);
283 return false;
284 }
285
287 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
289 for (uint32 linkedPerm : permission->GetLinkedPermissions())
290 if (rbac::RBACPermission const* rbacPermission = sAccountMgr->GetRBACPermission(linkedPerm))
291 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, rbacPermission->GetId(), rbacPermission->GetName());
292 }
293
294 return true;
295 }
296};
297
#define sAccountMgr
Definition AccountMgr.h:104
uint32_t uint32
Definition Define.h:154
@ LANG_RBAC_PERM_GRANTED_IN_LIST
Definition Language.h:104
@ LANG_RBAC_PERM_GRANTED
Definition Language.h:106
@ LANG_RBAC_LIST_PERMISSIONS_HEADER
Definition Language.h:100
@ LANG_RBAC_PERM_DENIED
Definition Language.h:109
@ LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST
Definition Language.h:108
@ LANG_RBAC_LIST_HEADER_BY_SEC_LEVEL
Definition Language.h:99
@ LANG_RBAC_PERM_REVOKED_NOT_IN_LIST
Definition Language.h:111
@ LANG_RBAC_LIST_PERMS_LINKED_HEADER
Definition Language.h:101
@ LANG_RBAC_PERM_DENIED_IN_LIST
Definition Language.h:107
@ LANG_RBAC_PERM_REVOKED
Definition Language.h:110
@ LANG_RBAC_LIST_ELEMENT
Definition Language.h:103
@ LANG_RBAC_LIST_HEADER_DENIED
Definition Language.h:98
@ LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST
Definition Language.h:105
@ LANG_RBAC_LIST_EMPTY
Definition Language.h:102
@ LANG_RBAC_WRONG_PARAMETER_ID
Definition Language.h:95
@ LANG_RBAC_LIST_HEADER_GRANTED
Definition Language.h:97
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
#define sRealmList
Definition RealmList.h:93
static uint32 GetSecurity(uint32 accountId, int32 realmId)
void SetSentErrorMessage(bool val)
Definition Chat.h:127
void PSendSysMessage(char const *fmt, Args &&... args)
Definition Chat.h:62
bool HasLowerSecurityAccount(WorldSession *target, uint32 account, bool strong=false)
Definition Chat.cpp:81
virtual char const * GetTrinityString(uint32 entry) const
Definition Chat.cpp:46
rbac::RBACData * GetRBACData()
RBACPermissionContainer const & GetDeniedPermissions() const
Returns all the denied permissions.
Definition RBAC.h:852
RBACCommandResult GrantPermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:56
uint32 GetId() const
Gets the Id of the Object.
Definition RBAC.h:823
RBACPermissionContainer const & GetGrantedPermissions() const
Returns all the granted permissions.
Definition RBAC.h:850
RBACCommandResult DenyPermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:100
uint8 GetSecurityLevel() const
Returns the security level assigned.
Definition RBAC.h:940
std::string const & GetName() const
Gets the Name of the Object.
Definition RBAC.h:821
RBACCommandResult RevokePermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:154
std::string const & GetName() const
Gets the Name of the Object.
Definition RBAC.h:782
RBACPermissionContainer const & GetLinkedPermissions() const
Gets the Permissions linked to this permission.
Definition RBAC.h:787
uint32 GetId() const
Gets the Id of the Object.
Definition RBAC.h:784
static bool HandleRBACPermRevokeCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition cs_rbac.cpp:177
std::span< ChatCommandBuilder const > GetCommands() const override
Definition cs_rbac.cpp:57
static bool HandleRBACPermListCommand(ChatHandler *handler, Optional< AccountIdentifier > account)
Definition cs_rbac.cpp:215
static bool HandleRBACPermGrantCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition cs_rbac.cpp:93
static bool HandleRBACListPermissionsCommand(ChatHandler *handler, Optional< uint32 > permId)
Definition cs_rbac.cpp:265
static bool HandleRBACPermDenyCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition cs_rbac.cpp:135
static RBACCommandData GetRBACData(AccountIdentifier account)
Definition cs_rbac.cpp:81
void AddSC_rbac_commandscript()
Definition cs_rbac.cpp:298
ChatCommandBuilder const [] ChatCommandTable
Definition ChatCommand.h:49
std::map< uint32, rbac::RBACPermission * > RBACPermissionsContainer
Definition AccountMgr.h:49
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT
Definition RBAC.h:117
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY
Definition RBAC.h:118
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE
Definition RBAC.h:119
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_LIST
Definition RBAC.h:116
@ RBAC_PERM_COMMAND_RBAC_LIST
Definition RBAC.h:120
RBACCommandResult
Definition RBAC.h:760
@ RBAC_OK
Definition RBAC.h:761
@ RBAC_CANT_ADD_ALREADY_ADDED
Definition RBAC.h:762
@ RBAC_IN_GRANTED_LIST
Definition RBAC.h:764
@ RBAC_ID_DOES_NOT_EXISTS
Definition RBAC.h:766
@ RBAC_IN_DENIED_LIST
Definition RBAC.h:765
@ RBAC_CANT_REVOKE_NOT_IN_LIST
Definition RBAC.h:763
std::set< uint32 > RBACPermissionContainer
Definition RBAC.h:769
RBACCommandData(rbac::RBACData *rbac_, bool needDelete_)
Definition cs_rbac.cpp:38
rbac::RBACData * rbac
Definition cs_rbac.cpp:46
RBACCommandData(RBACCommandData const &)=delete
static Optional< AccountIdentifier > FromTarget(ChatHandler *handler)