Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
cs_rbac.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/* ScriptData
7Name: rbac_commandscript
8%Complete: 100
9Comment: All role based access control related commands (including account related)
10Category: commandscripts
11EndScriptData */
12
13#include "AccountMgr.h"
14#include "Chat.h"
15#include "Config.h"
16#include "Language.h"
17#include "Player.h"
18#include "ScriptMgr.h"
19
21{
22 RBACCommandData() : id(0), realmId(0), rbac(NULL), needDelete(false) { }
24 {
25 if (needDelete)
26 delete rbac;
27 }
28
33};
34
36{
37public:
38 rbac_commandscript() : CommandScript("rbac_commandscript") { }
39
40 std::vector<ChatCommand> GetCommands() const
41 {
42 static std::vector<ChatCommand> rbacAccountCommandTable =
43 {
48 };
49
50 static std::vector<ChatCommand> rbacCommandTable =
51 {
52 { "account", rbac::RBAC_PERM_COMMAND_RBAC_ACC, true, NULL, "", rbacAccountCommandTable },
54 };
55
56 static std::vector<ChatCommand> commandTable =
57 {
58 { "rbac", rbac::RBAC_PERM_COMMAND_RBAC, true, NULL, "", rbacCommandTable },
59 };
60
61 return commandTable;
62 }
63
64 static RBACCommandData* ReadParams(ChatHandler* handler, char const* args, bool checkParams = true)
65 {
66 if (!args)
67 return NULL;
68
69 char* param1 = strtok((char*)args, " ");
70 char* param2 = strtok(NULL, " ");
71 char* param3 = strtok(NULL, " ");
72
73 int32 realmId = -1;
74 uint32 accountId = 0;
75 std::string accountName;
76 uint32 id = 0;
77 RBACCommandData* data = NULL;
78 rbac::RBACData* rdata = NULL;
79 bool useSelectedPlayer = false;
80
81 if (checkParams)
82 {
83 if (!param3)
84 {
85 if (param2)
86 realmId = atoi(param2);
87
88 if (param1)
89 id = atoi(param1);
90
91 useSelectedPlayer = true;
92 }
93 else
94 {
95 id = atoi(param2);
96 realmId = atoi(param3);
97 }
98
99 if (!id)
100 {
102 handler->SetSentErrorMessage(true);
103 return NULL;
104 }
105
106 if (realmId < -1 || !realmId)
107 {
109 handler->SetSentErrorMessage(true);
110 return NULL;
111 }
112 }
113 else if (!param1)
114 useSelectedPlayer = true;
115
116 if (useSelectedPlayer)
117 {
118 Player* player = handler->getSelectedPlayer();
119 if (!player)
120 return NULL;
121
122 rdata = player->GetSession()->GetRBACData();
123 accountId = rdata->GetId();
124 AccountMgr::GetName(accountId, accountName);
125 }
126 else
127 {
128 accountName = param1;
129
130 if (AccountMgr::normalizeString(accountName))
131 accountId = AccountMgr::GetId(accountName);
132
133 if (!accountId)
134 {
135 handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
136 handler->SetSentErrorMessage(true);
137 return NULL;
138 }
139 }
140
141 if (checkParams && handler->HasLowerSecurityAccount(NULL, accountId, true))
142 return NULL;
143
144 data = new RBACCommandData();
145
146 if (!rdata)
147 {
148 data->rbac = new rbac::RBACData(accountId, accountName, realmID, uint8(AccountMgr::GetSecurity(accountId, realmID)));
149 data->rbac->LoadFromDB();
150 data->needDelete = true;
151 }
152 else
153 data->rbac = rdata;
154
155 data->id = id;
156 data->realmId = realmId;
157 return data;
158 }
159
160 static bool HandleRBACPermGrantCommand(ChatHandler* handler, char const* args)
161 {
162 RBACCommandData* command = ReadParams(handler, args);
163
164 if (!command)
165 {
166 handler->SetSentErrorMessage(true);
167 return false;
168 }
169
170 rbac::RBACCommandResult result = command->rbac->GrantPermission(command->id, command->realmId);
171 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
172
173 switch (result)
174 {
176 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_LIST, command->id, permission->GetName().c_str(),
177 command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
178 break;
180 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST, command->id, permission->GetName().c_str(),
181 command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
182 break;
184 handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED, command->id, permission->GetName().c_str(),
185 command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
186 break;
189 break;
190 default:
191 break;
192 }
193
194 delete command;
195
196 return true;
197 }
198
199 static bool HandleRBACPermDenyCommand(ChatHandler* handler, char const* args)
200 {
201 RBACCommandData* command = ReadParams(handler, args);
202
203 if (!command)
204 {
205 handler->SetSentErrorMessage(true);
206 return false;
207 }
208
209 rbac::RBACCommandResult result = command->rbac->DenyPermission(command->id, command->realmId);
210 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
211
212 switch (result)
213 {
215 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_LIST, command->id, permission->GetName().c_str(),
216 command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
217 break;
219 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST, command->id, permission->GetName().c_str(),
220 command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
221 break;
223 handler->PSendSysMessage(LANG_RBAC_PERM_DENIED, command->id, permission->GetName().c_str(),
224 command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
225 break;
228 break;
229 default:
230 break;
231 }
232
233 delete command;
234
235 return true;
236 }
237
238 static bool HandleRBACPermRevokeCommand(ChatHandler* handler, char const* args)
239 {
240 RBACCommandData* command = ReadParams(handler, args);
241
242 if (!command)
243 {
244 handler->SetSentErrorMessage(true);
245 return false;
246 }
247
248 rbac::RBACCommandResult result = command->rbac->RevokePermission(command->id, command->realmId);
249 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
250
251 switch (result)
252 {
254 handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED_NOT_IN_LIST, command->id, permission->GetName().c_str(),
255 command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
256 break;
258 handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED, command->id, permission->GetName().c_str(),
259 command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
260 break;
263 break;
264 default:
265 break;
266 }
267
268 delete command;
269
270 return true;
271 }
272
273 static bool HandleRBACPermListCommand(ChatHandler* handler, char const* args)
274 {
275 RBACCommandData* command = ReadParams(handler, args, false);
276
277 if (!command)
278 {
279 handler->SetSentErrorMessage(true);
280 return false;
281 }
282
283 handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_GRANTED, command->rbac->GetId(), command->rbac->GetName().c_str());
284 rbac::RBACPermissionContainer const& granted = command->rbac->GetGrantedPermissions();
285 if (granted.empty())
286 handler->PSendSysMessage("%s", handler->GetSkyFireString(LANG_RBAC_LIST_EMPTY));
287 else
288 {
289 for (rbac::RBACPermissionContainer::const_iterator itr = granted.begin(); itr != granted.end(); ++itr)
290 {
291 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
292 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
293 }
294 }
295
296 handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_DENIED, command->rbac->GetId(), command->rbac->GetName().c_str());
297 rbac::RBACPermissionContainer const& denied = command->rbac->GetDeniedPermissions();
298 if (denied.empty())
299 handler->PSendSysMessage("%s", handler->GetSkyFireString(LANG_RBAC_LIST_EMPTY));
300 else
301 {
302 for (rbac::RBACPermissionContainer::const_iterator itr = denied.begin(); itr != denied.end(); ++itr)
303 {
304 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
305 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
306 }
307 }
308 handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_DENIED, command->rbac->GetId(), command->rbac->GetName().c_str());
309 rbac::RBACPermissionContainer const& defaultPermissions = sAccountMgr->GetRBACDefaultPermissions(command->rbac->GetSecurityLevel());
310 if (defaultPermissions.empty())
311 handler->PSendSysMessage("%s", handler->GetSkyFireString(LANG_RBAC_LIST_EMPTY));
312 else
313 {
314 for (rbac::RBACPermissionContainer::const_iterator itr = defaultPermissions.begin(); itr != defaultPermissions.end(); ++itr)
315 {
316 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
317 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
318 }
319 }
320
321 delete command;
322
323 return true;
324 }
325
326 static bool HandleRBACListPermissionsCommand(ChatHandler* handler, char const* args)
327 {
328 uint32 id = 0;
329 if (char* param1 = strtok((char*)args, " "))
330 id = atoi(param1);
331
332 if (!id)
333 {
334 rbac::RBACPermissionsContainer const& permissions = sAccountMgr->GetRBACPermissionList();
336 for (rbac::RBACPermissionsContainer::const_iterator it = permissions.begin(); it != permissions.end(); ++it)
337 {
338 rbac::RBACPermission const* permission = it->second;
339 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
340 }
341 }
342 else
343 {
344 rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(id);
345 if (!permission)
346 {
348 handler->SetSentErrorMessage(true);
349 return false;
350 }
351
353 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
355 rbac::RBACPermissionContainer const& permissions = permission->GetLinkedPermissions();
356 for (rbac::RBACPermissionContainer::const_iterator it = permissions.begin(); it != permissions.end(); ++it)
357 if (rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*it))
358 handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
359 }
360
361 return true;
362 }
363};
364
#define sAccountMgr
Definition AccountMgr.h:85
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
@ LANG_RBAC_PERM_GRANTED_IN_LIST
Definition Language.h:85
@ LANG_RBAC_PERM_GRANTED
Definition Language.h:87
@ LANG_RBAC_LIST_PERMISSIONS_HEADER
Definition Language.h:81
@ LANG_RBAC_PERM_DENIED
Definition Language.h:90
@ LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST
Definition Language.h:89
@ LANG_RBAC_PERM_REVOKED_NOT_IN_LIST
Definition Language.h:92
@ LANG_RBAC_LIST_PERMS_LINKED_HEADER
Definition Language.h:82
@ LANG_RBAC_PERM_DENIED_IN_LIST
Definition Language.h:88
@ LANG_RBAC_PERM_REVOKED
Definition Language.h:91
@ LANG_ACCOUNT_NOT_EXIST
Definition Language.h:390
@ LANG_RBAC_LIST_ELEMENT
Definition Language.h:84
@ LANG_RBAC_LIST_HEADER_DENIED
Definition Language.h:79
@ LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST
Definition Language.h:86
@ LANG_RBAC_WRONG_PARAMETER_REALM
Definition Language.h:77
@ LANG_RBAC_LIST_EMPTY
Definition Language.h:83
@ LANG_RBAC_WRONG_PARAMETER_ID
Definition Language.h:76
@ LANG_RBAC_LIST_HEADER_GRANTED
Definition Language.h:78
static AccountTypes GetSecurity(uint32 accountId)
static bool normalizeString(std::string &utf8String)
static uint32 GetId(std::string const &username)
static bool GetName(uint32 accountId, std::string &name)
Player * getSelectedPlayer()
Definition Chat.cpp:829
void PSendSysMessage(const char *format,...) ATTR_PRINTF(2
Definition Chat.cpp:221
void SetSentErrorMessage(bool val)
Definition Chat.h:114
virtual const char * GetSkyFireString(int32 entry) const
Definition Chat.cpp:68
bool HasLowerSecurityAccount(WorldSession *target, uint32 account, bool strong=false)
Definition Chat.cpp:98
CommandScript(const char *name)
WorldSession * GetSession() const
Definition Player.h:2417
rbac::RBACData * GetRBACData()
RBACPermissionContainer const & GetDeniedPermissions() const
Returns all the denied permissions.
Definition RBAC.h:797
RBACCommandResult GrantPermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:39
uint32 GetId() const
Gets the Id of the Object.
Definition RBAC.h:771
RBACPermissionContainer const & GetGrantedPermissions() const
Returns all the granted permissions.
Definition RBAC.h:795
RBACCommandResult DenyPermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:83
uint8 GetSecurityLevel() const
Returns the security level assigned.
Definition RBAC.h:880
std::string const & GetName() const
Gets the Name of the Object.
Definition RBAC.h:769
RBACCommandResult RevokePermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:137
void LoadFromDB()
Loads all permissions assigned to current account.
Definition RBAC.cpp:170
std::string const & GetName() const
Gets the Name of the Object.
Definition RBAC.h:734
RBACPermissionContainer const & GetLinkedPermissions() const
Gets the Permissions linked to this permission.
Definition RBAC.h:739
uint32 GetId() const
Gets the Id of the Object.
Definition RBAC.h:736
static RBACCommandData * ReadParams(ChatHandler *handler, char const *args, bool checkParams=true)
Definition cs_rbac.cpp:64
static bool HandleRBACListPermissionsCommand(ChatHandler *handler, char const *args)
Definition cs_rbac.cpp:326
static bool HandleRBACPermListCommand(ChatHandler *handler, char const *args)
Definition cs_rbac.cpp:273
static bool HandleRBACPermDenyCommand(ChatHandler *handler, char const *args)
Definition cs_rbac.cpp:199
static bool HandleRBACPermGrantCommand(ChatHandler *handler, char const *args)
Definition cs_rbac.cpp:160
std::vector< ChatCommand > GetCommands() const
Definition cs_rbac.cpp:40
static bool HandleRBACPermRevokeCommand(ChatHandler *handler, char const *args)
Definition cs_rbac.cpp:238
void AddSC_rbac_commandscript()
Definition cs_rbac.cpp:365
uint32 realmID
Id of the realm.
Definition Main.cpp:73
std::map< uint32, rbac::RBACPermission * > RBACPermissionsContainer
Definition AccountMgr.h:36
@ RBAC_PERM_COMMAND_RBAC_ACC
Definition RBAC.h:95
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT
Definition RBAC.h:97
@ RBAC_PERM_COMMAND_RBAC
Definition RBAC.h:94
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY
Definition RBAC.h:98
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE
Definition RBAC.h:99
@ RBAC_PERM_COMMAND_RBAC_ACC_PERM_LIST
Definition RBAC.h:96
@ RBAC_PERM_COMMAND_RBAC_LIST
Definition RBAC.h:100
RBACCommandResult
Definition RBAC.h:716
std::set< uint32 > RBACPermissionContainer
Definition RBAC.h:725
rbac::RBACData * rbac
Definition cs_rbac.cpp:31