TrinityCore
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 "Realm.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
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
87 rbac->LoadFromDB();
88
89 return { rbac, true };
90 }
91
93 {
94 if (!account)
95 account = AccountIdentifier::FromTarget(handler);
96 if (!account)
97 return false;
98
99 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
100 return false;
101
102 if (!realmId)
103 realmId = -1;
104
105 RBACCommandData data = GetRBACData(*account);
106
107 rbac::RBACCommandResult result = data.rbac->GrantPermission(permId, *realmId);
108 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
109
110 switch (result)
111 {
113 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_LIST, permId, permission->GetName(),
114 *realmId, account->GetID(), account->GetName());
115 break;
117 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST, permId, permission->GetName(),
118 *realmId, account->GetID(), account->GetName());
119 break;
120 case rbac::RBAC_OK:
121 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED, permId, permission->GetName(),
122 *realmId, account->GetID(), account->GetName());
123 break;
126 break;
127 default:
128 break;
129 }
130
131 return true;
132 }
133
135 {
136 if (!account)
137 account = AccountIdentifier::FromTarget(handler);
138 if (!account)
139 return false;
140
141 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
142 return false;
143
144 if (!realmId)
145 realmId = -1;
146
147 RBACCommandData data = GetRBACData(*account);
148
149 rbac::RBACCommandResult result = data.rbac->DenyPermission(permId, *realmId);
150 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
151
152 switch (result)
153 {
155 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_LIST, permId, permission->GetName(),
156 *realmId, account->GetID(), account->GetName());
157 break;
159 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST, permId, permission->GetName(),
160 *realmId, account->GetID(), account->GetName());
161 break;
162 case rbac::RBAC_OK:
163 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED, permId, permission->GetName(),
164 *realmId, account->GetID(), account->GetName());
165 break;
168 break;
169 default:
170 break;
171 }
172
173 return true;
174 }
175
177 {
178 if (!account)
179 account = AccountIdentifier::FromTarget(handler);
180 if (!account)
181 return false;
182
183 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
184 return false;
185
186 if (!realmId)
187 realmId = -1;
188
189 RBACCommandData data = GetRBACData(*account);
190
191 rbac::RBACCommandResult result = data.rbac->RevokePermission(permId, *realmId);
192 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
193
194 switch (result)
195 {
197 handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED_NOT_IN_LIST, permId, permission->GetName(),
198 *realmId, account->GetID(), account->GetName());
199 break;
200 case rbac::RBAC_OK:
201 handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED, permId, permission->GetName(),
202 *realmId, account->GetID(), account->GetName());
203 break;
206 break;
207 default:
208 break;
209 }
210
211 return true;
212 }
213
215 {
216 if (!account)
217 account = AccountIdentifier::FromTarget(handler);
218 if (!account)
219 return false;
220
221 RBACCommandData data = GetRBACData(*account);
222
225 if (granted.empty())
226 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
227 else
228 {
229 for (uint32 grantedId : granted)
230 {
231 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(grantedId);
232 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
233 }
234 }
235
238 if (denied.empty())
239 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
240 else
241 {
242 for (uint32 deniedId : denied)
243 {
244 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(deniedId);
245 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
246 }
247 }
249 rbac::RBACPermissionContainer const& defaultPermissions = sAccountMgr->GetRBACDefaultPermissions(data.rbac->GetSecurityLevel());
250 if (defaultPermissions.empty())
251 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
252 else
253 {
254 for (uint32 defaultPermission : defaultPermissions)
255 {
256 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(defaultPermission);
257 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
258 }
259 }
260
261 return true;
262 }
263
265 {
266 if (!permId)
267 {
268 rbac::RBACPermissionsContainer const& permissions = sAccountMgr->GetRBACPermissionList();
270 for (auto const& [_, permission] : permissions)
271 {
272 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
273 }
274 }
275 else
276 {
277 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*permId);
278 if (!permission)
279 {
281 handler->SetSentErrorMessage(true);
282 return false;
283 }
284
286 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
288 for (uint32 linkedPerm : permission->GetLinkedPermissions())
289 if (rbac::RBACPermission const* rbacPermission = sAccountMgr->GetRBACPermission(linkedPerm))
290 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, rbacPermission->GetId(), rbacPermission->GetName());
291 }
292
293 return true;
294 }
295};
296
298{
299 new rbac_commandscript();
300}
#define sAccountMgr
Definition: AccountMgr.h:98
uint32_t uint32
Definition: Define.h:142
@ 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
static uint32 GetSecurity(uint32 accountId, int32 realmId)
Definition: AccountMgr.cpp:298
void PSendSysMessage(const char *fmt, Args &&... args)
Definition: Chat.h:57
void SetSentErrorMessage(bool val)
Definition: Chat.h:114
bool HasLowerSecurityAccount(WorldSession *target, uint32 account, bool strong=false)
Definition: Chat.cpp:83
virtual char const * GetTrinityString(uint32 entry) const
Definition: Chat.cpp:48
rbac::RBACData * GetRBACData()
RBACPermissionContainer const & GetDeniedPermissions() const
Returns all the denied permissions.
Definition: RBAC.h:845
RBACCommandResult GrantPermission(uint32 permissionId, int32 realmId=0)
Definition: RBAC.cpp:43
uint32 GetId() const
Gets the Id of the Object.
Definition: RBAC.h:816
RBACPermissionContainer const & GetGrantedPermissions() const
Returns all the granted permissions.
Definition: RBAC.h:843
RBACCommandResult DenyPermission(uint32 permissionId, int32 realmId=0)
Definition: RBAC.cpp:87
uint8 GetSecurityLevel() const
Returns the security level assigned.
Definition: RBAC.h:933
std::string const & GetName() const
Gets the Name of the Object.
Definition: RBAC.h:814
RBACCommandResult RevokePermission(uint32 permissionId, int32 realmId=0)
Definition: RBAC.cpp:141
std::string const & GetName() const
Gets the Name of the Object.
Definition: RBAC.h:778
RBACPermissionContainer const & GetLinkedPermissions() const
Gets the Permissions linked to this permission.
Definition: RBAC.h:783
uint32 GetId() const
Gets the Id of the Object.
Definition: RBAC.h:780
static bool HandleRBACPermRevokeCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition: cs_rbac.cpp:176
static bool HandleRBACPermListCommand(ChatHandler *handler, Optional< AccountIdentifier > account)
Definition: cs_rbac.cpp:214
static bool HandleRBACPermGrantCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition: cs_rbac.cpp:92
ChatCommandTable GetCommands() const override
Definition: cs_rbac.cpp:57
static bool HandleRBACListPermissionsCommand(ChatHandler *handler, Optional< uint32 > permId)
Definition: cs_rbac.cpp:264
static bool HandleRBACPermDenyCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition: cs_rbac.cpp:134
static RBACCommandData GetRBACData(AccountIdentifier account)
Definition: cs_rbac.cpp:81
void AddSC_rbac_commandscript()
Definition: cs_rbac.cpp:297
Realm realm
Definition: World.cpp:3966
std::vector< ChatCommandBuilder > ChatCommandTable
Definition: ChatCommand.h:49
std::map< uint32, rbac::RBACPermission * > RBACPermissionsContainer
Definition: AccountMgr.h:48
@ 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
Battlenet::RealmHandle Id
Definition: Realm.h:82
std::string const & GetName() const