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 "Config.h"
29#include "Language.h"
30#include "Player.h"
31#include "Realm.h"
32#include "World.h"
33#include "WorldSession.h"
34
36{
37 RBACCommandData(rbac::RBACData* rbac_, bool needDelete_) : rbac(rbac_), needDelete(needDelete_) { }
40 {
41 if (needDelete)
42 delete rbac;
43 }
44
45 rbac::RBACData* rbac = nullptr;
46 bool needDelete = false;
47};
48
49using namespace Trinity::ChatCommands;
50
52{
53public:
54 rbac_commandscript() : CommandScript("rbac_commandscript") { }
55
57 {
58 static ChatCommandTable rbacAccountCommandTable =
59 {
64 };
65
66 static ChatCommandTable rbacCommandTable =
67 {
68 { "account", rbacAccountCommandTable },
70 };
71
72 static ChatCommandTable commandTable =
73 {
74 { "rbac", rbacCommandTable },
75 };
76
77 return commandTable;
78 }
79
81 {
82 if (account.IsConnected())
83 return { account.GetConnectedSession()->GetRBACData(), false };
84
86 rbac->LoadFromDB();
87
88 return { rbac, true };
89 }
90
92 {
93 if (!account)
94 account = AccountIdentifier::FromTarget(handler);
95 if (!account)
96 return false;
97
98 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
99 return false;
100
101 if (!realmId)
102 realmId = -1;
103
104 RBACCommandData data = GetRBACData(*account);
105
106 rbac::RBACCommandResult result = data.rbac->GrantPermission(permId, *realmId);
107 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
108
109 switch (result)
110 {
112 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_LIST, permId, permission->GetName(),
113 *realmId, account->GetID(), account->GetName());
114 break;
116 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST, permId, permission->GetName(),
117 *realmId, account->GetID(), account->GetName());
118 break;
119 case rbac::RBAC_OK:
120 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED, permId, permission->GetName(),
121 *realmId, account->GetID(), account->GetName());
122 break;
125 break;
126 default:
127 break;
128 }
129
130 return true;
131 }
132
134 {
135 if (!account)
136 account = AccountIdentifier::FromTarget(handler);
137 if (!account)
138 return false;
139
140 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
141 return false;
142
143 if (!realmId)
144 realmId = -1;
145
146 RBACCommandData data = GetRBACData(*account);
147
148 rbac::RBACCommandResult result = data.rbac->DenyPermission(permId, *realmId);
149 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
150
151 switch (result)
152 {
154 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_LIST, permId, permission->GetName(),
155 *realmId, account->GetID(), account->GetName());
156 break;
158 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST, permId, permission->GetName(),
159 *realmId, account->GetID(), account->GetName());
160 break;
161 case rbac::RBAC_OK:
162 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED, permId, permission->GetName(),
163 *realmId, account->GetID(), account->GetName());
164 break;
167 break;
168 default:
169 break;
170 }
171
172 return true;
173 }
174
176 {
177 if (!account)
178 account = AccountIdentifier::FromTarget(handler);
179 if (!account)
180 return false;
181
182 if (handler->HasLowerSecurityAccount(nullptr, account->GetID(), true))
183 return false;
184
185 if (!realmId)
186 realmId = -1;
187
188 RBACCommandData data = GetRBACData(*account);
189
190 rbac::RBACCommandResult result = data.rbac->RevokePermission(permId, *realmId);
191 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(permId);
192
193 switch (result)
194 {
196 handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED_NOT_IN_LIST, permId, permission->GetName(),
197 *realmId, account->GetID(), account->GetName());
198 break;
199 case rbac::RBAC_OK:
200 handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED, permId, permission->GetName(),
201 *realmId, account->GetID(), account->GetName());
202 break;
205 break;
206 default:
207 break;
208 }
209
210 return true;
211 }
212
214 {
215 if (!account)
216 account = AccountIdentifier::FromTarget(handler);
217 if (!account)
218 return false;
219
220 RBACCommandData data = GetRBACData(*account);
221
224 if (granted.empty())
225 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
226 else
227 {
228 for (uint32 grantedId : granted)
229 {
230 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(grantedId);
231 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
232 }
233 }
234
237 if (denied.empty())
238 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
239 else
240 {
241 for (uint32 deniedId : denied)
242 {
243 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(deniedId);
244 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
245 }
246 }
248 rbac::RBACPermissionContainer const& defaultPermissions = sAccountMgr->GetRBACDefaultPermissions(data.rbac->GetSecurityLevel());
249 if (defaultPermissions.empty())
250 handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
251 else
252 {
253 for (uint32 defaultPermission : defaultPermissions)
254 {
255 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(defaultPermission);
256 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
257 }
258 }
259
260 return true;
261 }
262
264 {
265 if (!permId)
266 {
267 rbac::RBACPermissionsContainer const& permissions = sAccountMgr->GetRBACPermissionList();
269 for (auto const& [_, permission] : permissions)
270 {
271 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
272 }
273 }
274 else
275 {
276 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*permId);
277 if (!permission)
278 {
280 handler->SetSentErrorMessage(true);
281 return false;
282 }
283
285 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName());
287 for (uint32 linkedPerm : permission->GetLinkedPermissions())
288 if (rbac::RBACPermission const* rbacPermission = sAccountMgr->GetRBACPermission(linkedPerm))
289 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, rbacPermission->GetId(), rbacPermission->GetName());
290 }
291
292 return true;
293 }
294};
295
#define sAccountMgr
Definition AccountMgr.h:96
uint32_t uint32
Definition Define.h:133
@ 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)
void SetSentErrorMessage(bool val)
Definition Chat.h:134
void PSendSysMessage(char const *fmt, Args &&... args)
Definition Chat.h:69
bool HasLowerSecurityAccount(WorldSession *target, uint32 account, bool strong=false)
Definition Chat.cpp:71
virtual char const * GetTrinityString(uint32 entry) const
Definition Chat.cpp:36
rbac::RBACData * GetRBACData() const
RBACPermissionContainer const & GetDeniedPermissions() const
Returns all the denied permissions.
Definition RBAC.h:844
RBACCommandResult GrantPermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:43
uint32 GetId() const
Gets the Id of the Object.
Definition RBAC.h:815
RBACPermissionContainer const & GetGrantedPermissions() const
Returns all the granted permissions.
Definition RBAC.h:842
RBACCommandResult DenyPermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:87
uint8 GetSecurityLevel() const
Returns the security level assigned.
Definition RBAC.h:932
std::string const & GetName() const
Gets the Name of the Object.
Definition RBAC.h:813
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:777
RBACPermissionContainer const & GetLinkedPermissions() const
Gets the Permissions linked to this permission.
Definition RBAC.h:782
uint32 GetId() const
Gets the Id of the Object.
Definition RBAC.h:779
static bool HandleRBACPermRevokeCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition cs_rbac.cpp:175
static bool HandleRBACPermListCommand(ChatHandler *handler, Optional< AccountIdentifier > account)
Definition cs_rbac.cpp:213
static bool HandleRBACPermGrantCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition cs_rbac.cpp:91
ChatCommandTable GetCommands() const override
Definition cs_rbac.cpp:56
static bool HandleRBACListPermissionsCommand(ChatHandler *handler, Optional< uint32 > permId)
Definition cs_rbac.cpp:263
static bool HandleRBACPermDenyCommand(ChatHandler *handler, Optional< AccountIdentifier > account, uint32 permId, Optional< int32 > realmId)
Definition cs_rbac.cpp:133
static RBACCommandData GetRBACData(AccountIdentifier account)
Definition cs_rbac.cpp:80
void AddSC_rbac_commandscript()
Definition cs_rbac.cpp:296
Realm realm
Definition World.cpp:3605
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:50
std::map< uint32, rbac::RBACPermission * > RBACPermissionsContainer
Definition AccountMgr.h:47
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT
Definition RBAC.h:119
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY
Definition RBAC.h:120
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE
Definition RBAC.h:121
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_LIST
Definition RBAC.h:118
@ RBAC_PERM_COMMAND_RBAC_LIST
Definition RBAC.h:122
RBACCommandResult
Definition RBAC.h:759
@ RBAC_OK
Definition RBAC.h:760
@ RBAC_CANT_ADD_ALREADY_ADDED
Definition RBAC.h:761
@ RBAC_IN_GRANTED_LIST
Definition RBAC.h:763
@ RBAC_ID_DOES_NOT_EXISTS
Definition RBAC.h:765
@ RBAC_IN_DENIED_LIST
Definition RBAC.h:764
@ RBAC_CANT_REVOKE_NOT_IN_LIST
Definition RBAC.h:762
std::set< uint32 > RBACPermissionContainer
Definition RBAC.h:768
RBACCommandData(rbac::RBACData *rbac_, bool needDelete_)
Definition cs_rbac.cpp:37
rbac::RBACData * rbac
Definition cs_rbac.cpp:45
RBACCommandData(RBACCommandData const &)=delete
uint32 Realm
Definition Realm.h:44
RealmHandle Id
Definition Realm.h:67
static Optional< AccountIdentifier > FromTarget(ChatHandler *handler)