Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
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#include "AccountMgr.h"
7#include "DatabaseEnv.h"
8#include "Log.h"
9#include "RBAC.h"
10#include "World.h"
11
12namespace rbac
13{
14
16 {
17 std::string str = "";
18 if (!perms.empty())
19 {
20 std::ostringstream o;
21 RBACPermissionContainer::const_iterator itr = perms.begin();
22 o << (*itr);
23 for (++itr; itr != perms.end(); ++itr)
24 o << ", " << uint32(*itr);
25 str = o.str();
26 }
27
28 return str;
29 }
30
31 bool RBACData::HasPermission(uint32 permission) const
32 {
34 return true;
35
36 return _globalPerms.find(permission) != _globalPerms.end();
37 }
38
40 {
41 // Check if permission Id exists
42 RBACPermission const* perm = sAccountMgr->GetRBACPermission(permissionId);
43 if (!perm)
44 {
45 SF_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission does not exists",
46 GetId(), GetName().c_str(), permissionId, realmId);
48 }
49
50 // Check if already added in denied list
51 if (HasDeniedPermission(permissionId))
52 {
53 SF_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission in deny list",
54 GetId(), GetName().c_str(), permissionId, realmId);
56 }
57
58 // Already added?
59 if (HasGrantedPermission(permissionId))
60 {
61 SF_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission already granted",
62 GetId(), GetName().c_str(), permissionId, realmId);
64 }
65
66 AddGrantedPermission(permissionId);
67
68 // Do not save to db when loading data from DB (realmId = 0)
69 if (realmId)
70 {
71 SF_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
72 GetId(), GetName().c_str(), permissionId, realmId);
73 SavePermission(permissionId, true, realmId);
75 }
76 else
77 SF_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
78 GetId(), GetName().c_str(), permissionId, realmId);
79
81 }
82
84 {
85 // Check if permission Id exists
86 RBACPermission const* perm = sAccountMgr->GetRBACPermission(permissionId);
87 if (!perm)
88 {
89 SF_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission does not exists",
90 GetId(), GetName().c_str(), permissionId, realmId);
92 }
93
94 // Check if already added in granted list
95 if (HasGrantedPermission(permissionId))
96 {
97 SF_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission in grant list",
98 GetId(), GetName().c_str(), permissionId, realmId);
100 }
101
102 // Already added?
103 if (HasDeniedPermission(permissionId))
104 {
105 SF_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission already denied",
106 GetId(), GetName().c_str(), permissionId, realmId);
108 }
109
110 AddDeniedPermission(permissionId);
111
112 // Do not save to db when loading data from DB (realmId = 0)
113 if (realmId)
114 {
115 SF_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
116 GetId(), GetName().c_str(), permissionId, realmId);
117 SavePermission(permissionId, false, realmId);
119 }
120 else
121 SF_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
122 GetId(), GetName().c_str(), permissionId, realmId);
123
125 }
126
127 void RBACData::SavePermission(uint32 permission, bool granted, int32 realmId) const
128 {
130 stmt->setUInt32(0, GetId());
131 stmt->setUInt32(1, permission);
132 stmt->setBool(2, granted);
133 stmt->setInt32(3, realmId);
134 LoginDatabase.Execute(stmt);
135 }
136
138 {
139 // Check if it's present in any list
140 if (!HasGrantedPermission(permissionId) && !HasDeniedPermission(permissionId))
141 {
142 SF_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Not granted or revoked",
143 GetId(), GetName().c_str(), permissionId, realmId);
145 }
146
147 RemoveGrantedPermission(permissionId);
148 RemoveDeniedPermission(permissionId);
149
150 // Do not save to db when loading data from DB (realmId = 0)
151 if (realmId)
152 {
153 SF_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
154 GetId(), GetName().c_str(), permissionId, realmId);
156 stmt->setUInt32(0, GetId());
157 stmt->setUInt32(1, permissionId);
158 stmt->setInt32(2, realmId);
159 LoginDatabase.Execute(stmt);
160
162 }
163 else
164 SF_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
165 GetId(), GetName().c_str(), permissionId, realmId);
166
168 }
169
171 {
172 ClearData();
173
174 SF_LOG_DEBUG("rbac", "RBACData::LoadFromDB [Id: %u Name: %s]: Loading permissions", GetId(), GetName().c_str());
175 // Load account permissions (granted and denied) that affect current realm
177 stmt->setUInt32(0, GetId());
178 stmt->setInt32(1, GetRealmId());
179
180 PreparedQueryResult result = LoginDatabase.Query(stmt);
181 if (result)
182 {
183 do
184 {
185 Field* fields = result->Fetch();
186 if (fields[1].GetBool())
187 GrantPermission(fields[0].GetUInt32());
188 else
189 DenyPermission(fields[0].GetUInt32());
190 } while (result->NextRow());
191 }
192
193 // Add default permissions
194 RBACPermissionContainer const& permissions = sAccountMgr->GetRBACDefaultPermissions(_secLevel);
195 for (RBACPermissionContainer::const_iterator itr = permissions.begin(); itr != permissions.end(); ++itr)
196 GrantPermission(*itr);
197
198 // Force calculation of permissions
200 }
201
203 {
204 SF_LOG_TRACE("rbac", "RBACData::CalculateNewPermissions [Id: %u Name: %s]", GetId(), GetName().c_str());
205
206 // Get the list of granted permissions
210 ExpandPermissions(revoked);
212 }
213
215 {
216 for (RBACPermissionContainer::const_iterator itr = permsFrom.begin(); itr != permsFrom.end(); ++itr)
217 permsTo.insert(*itr);
218 }
219
221 {
222 for (RBACPermissionContainer::const_iterator itr = permsFrom.begin(); itr != permsFrom.end(); ++itr)
223 permsTo.erase(*itr);
224 }
225
227 {
228 RBACPermissionContainer toCheck = permissions;
229 permissions.clear();
230
231 while (!toCheck.empty())
232 {
233 // remove the permission from original list
234 uint32 permissionId = *toCheck.begin();
235 toCheck.erase(toCheck.begin());
236
237 RBACPermission const* permission = sAccountMgr->GetRBACPermission(permissionId);
238 if (!permission)
239 continue;
240
241 // insert into the final list (expanded list)
242 permissions.insert(permissionId);
243
244 // add all linked permissions (that are not already expanded) to the list of permissions to be checked
245 RBACPermissionContainer const& linkedPerms = permission->GetLinkedPermissions();
246 for (RBACPermissionContainer::const_iterator itr = linkedPerms.begin(); itr != linkedPerms.end(); ++itr)
247 if (permissions.find(*itr) == permissions.end())
248 toCheck.insert(*itr);
249 }
250
251 SF_LOG_DEBUG("rbac", "RBACData::ExpandPermissions: Expanded: %s", GetDebugPermissionString(permissions).c_str());
252 }
253
255 {
256 _grantedPerms.clear();
257 _deniedPerms.clear();
258 _globalPerms.clear();
259 }
260
261}
#define sAccountMgr
Definition AccountMgr.h:85
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
#define SF_LOG_TRACE(filterType__,...)
Definition Log.h:131
@ LOGIN_DEL_RBAC_ACCOUNT_PERMISSION
@ LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS
@ LOGIN_INS_RBAC_ACCOUNT_PERMISSION
Skyfire::AutoPtr< PreparedResultSet, Skyfire::Mutex > PreparedQueryResult
Definition QueryResult.h:94
Role Based Access Control related classes definition.
Definition Field.h:16
void setBool(const uint8 index, const bool value)
void setUInt32(const uint8 index, const uint32 value)
void setInt32(const uint8 index, const int32 value)
RBACPermissionContainer const & GetDeniedPermissions() const
Returns all the denied permissions.
Definition RBAC.h:797
RBACCommandResult GrantPermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:39
void AddDeniedPermission(uint32 permissionId)
Adds a new denied permission.
Definition RBAC.h:928
int32 GetRealmId() const
Definition RBAC.h:898
RBACPermissionContainer _grantedPerms
Definition RBAC.h:961
void AddGrantedPermission(uint32 permissionId)
Adds a new granted permission.
Definition RBAC.h:916
void RemovePermissions(RBACPermissionContainer const &permsFrom, RBACPermissionContainer &permsTo)
Removes a list of permissions to another list.
Definition RBAC.cpp:220
void ExpandPermissions(RBACPermissionContainer &permissions)
Definition RBAC.cpp:226
bool HasDeniedPermission(uint32 permissionId) const
Checks if a permission is denied.
Definition RBAC.h:910
uint32 GetId() const
Gets the Id of the Object.
Definition RBAC.h:771
void AddPermissions(RBACPermissionContainer const &permsFrom, RBACPermissionContainer &permsTo)
Adds a list of permissions to another list.
Definition RBAC.cpp:214
void ClearData()
Clears roles, groups and permissions - Used for reload.
Definition RBAC.cpp:254
RBACPermissionContainer _globalPerms
Definition RBAC.h:963
RBACPermissionContainer const & GetGrantedPermissions() const
Returns all the granted permissions.
Definition RBAC.h:795
RBACPermissionContainer _deniedPerms
Definition RBAC.h:962
void CalculateNewPermissions()
Definition RBAC.cpp:202
RBACCommandResult DenyPermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:83
bool HasGrantedPermission(uint32 permissionId) const
Checks if a permission is granted.
Definition RBAC.h:904
uint8 _secLevel
Definition RBAC.h:960
std::string const & GetName() const
Gets the Name of the Object.
Definition RBAC.h:769
void RemoveDeniedPermission(uint32 permissionId)
Removes a denied permission.
Definition RBAC.h:934
void RemoveGrantedPermission(uint32 permissionId)
Removes a granted permission.
Definition RBAC.h:922
RBACCommandResult RevokePermission(uint32 permissionId, int32 realmId=0)
Definition RBAC.cpp:137
void LoadFromDB()
Loads all permissions assigned to current account.
Definition RBAC.cpp:170
void SavePermission(uint32 role, bool granted, int32 realm) const
Saves a permission to DB, Granted or Denied.
Definition RBAC.cpp:127
bool HasPermission(uint32 permission) const
Definition RBAC.cpp:31
RBACPermissionContainer const & GetLinkedPermissions() const
Gets the Permissions linked to this permission.
Definition RBAC.h:739
#define sWorld
Definition World.h:910
@ CONFIG_RBAC_FREE_PERMISSION_MODE
Definition World.h:354
std::string GetDebugPermissionString(RBACPermissionContainer const &perms)
Definition RBAC.cpp:15
RBACCommandResult
Definition RBAC.h:716
std::set< uint32 > RBACPermissionContainer
Definition RBAC.h:725
LoginDatabaseWorkerPool LoginDatabase
Definition Main.cpp:54