feat(Core/RBAC): Role Based Access Controls (#24641)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com> Co-authored-by: Spp <spp@jorge.gr> Co-authored-by: Spp <spp@tc.plus> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Andrew <47818697+Nyeriah@users.noreply.github.com>
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
@@ -18,315 +18,525 @@
|
||||
#include "AccountMgr.h"
|
||||
#include "Common.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "Log.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "Player.h"
|
||||
#include "Realm.h"
|
||||
#include "SRP6.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "Util.h"
|
||||
#include "WorldSession.h"
|
||||
|
||||
namespace AccountMgr
|
||||
AccountMgr::AccountMgr() { }
|
||||
|
||||
AccountMgr::~AccountMgr()
|
||||
{
|
||||
ClearRBAC();
|
||||
}
|
||||
|
||||
AccountOpResult CreateAccount(std::string username, std::string password, std::string email /*= ""*/)
|
||||
AccountMgr* AccountMgr::instance()
|
||||
{
|
||||
static AccountMgr instance;
|
||||
return &instance;
|
||||
}
|
||||
|
||||
AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password, std::string email /*= ""*/)
|
||||
{
|
||||
if (utf8length(username) > MAX_ACCOUNT_STR)
|
||||
return AOR_NAME_TOO_LONG; // username's too long
|
||||
|
||||
if (utf8length(password) > MAX_PASS_STR)
|
||||
return AOR_PASS_TOO_LONG; // password's too long
|
||||
|
||||
if (utf8length(email) > MAX_EMAIL_STR)
|
||||
return AOR_EMAIL_TOO_LONG; // email is too long
|
||||
|
||||
Utf8ToUpperOnlyLatin(username);
|
||||
Utf8ToUpperOnlyLatin(password);
|
||||
Utf8ToUpperOnlyLatin(email);
|
||||
|
||||
if (GetId(username))
|
||||
return AOR_NAME_ALREADY_EXIST; // username does already exist
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT);
|
||||
|
||||
stmt->SetData(0, username);
|
||||
auto [salt, verifier] = Acore::Crypto::SRP6::MakeRegistrationData(username, password);
|
||||
stmt->SetData(1, salt);
|
||||
stmt->SetData(2, verifier);
|
||||
stmt->SetData(3, uint8(sWorld->getIntConfig(CONFIG_EXPANSION)));
|
||||
stmt->SetData(4, email);
|
||||
stmt->SetData(5, email);
|
||||
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_REALM_CHARACTERS_INIT);
|
||||
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
return AOR_OK; // everything's fine
|
||||
}
|
||||
|
||||
AccountOpResult AccountMgr::ChangeEmail(uint32 accountId, std::string newEmail)
|
||||
{
|
||||
std::string username;
|
||||
|
||||
if (!GetName(accountId, username))
|
||||
{
|
||||
if (utf8length(username) > MAX_ACCOUNT_STR)
|
||||
return AOR_NAME_TOO_LONG; // username's too long
|
||||
|
||||
if (utf8length(password) > MAX_PASS_STR)
|
||||
return AOR_PASS_TOO_LONG; // password's too long
|
||||
|
||||
if (utf8length(email) > MAX_EMAIL_STR)
|
||||
return AOR_EMAIL_TOO_LONG; // email is too long
|
||||
|
||||
Utf8ToUpperOnlyLatin(username);
|
||||
Utf8ToUpperOnlyLatin(password);
|
||||
Utf8ToUpperOnlyLatin(email);
|
||||
|
||||
if (GetId(username))
|
||||
return AOR_NAME_ALREADY_EXIST; // username does already exist
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT);
|
||||
|
||||
stmt->SetData(0, username);
|
||||
auto [salt, verifier] = Acore::Crypto::SRP6::MakeRegistrationData(username, password);
|
||||
stmt->SetData(1, salt);
|
||||
stmt->SetData(2, verifier);
|
||||
stmt->SetData(3, uint8(sWorld->getIntConfig(CONFIG_EXPANSION)));
|
||||
stmt->SetData(4, email);
|
||||
stmt->SetData(5, email);
|
||||
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_REALM_CHARACTERS_INIT);
|
||||
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
return AOR_OK; // everything's fine
|
||||
sScriptMgr->OnFailedEmailChange(accountId);
|
||||
return AOR_NAME_NOT_EXIST; // account doesn't exist
|
||||
}
|
||||
|
||||
AccountOpResult ChangeEmail(uint32 accountId, std::string newEmail)
|
||||
if (utf8length(newEmail) > MAX_EMAIL_STR)
|
||||
{
|
||||
std::string username;
|
||||
|
||||
if (!GetName(accountId, username))
|
||||
{
|
||||
sScriptMgr->OnFailedEmailChange(accountId);
|
||||
return AOR_NAME_NOT_EXIST; // account doesn't exist
|
||||
}
|
||||
|
||||
if (utf8length(newEmail) > MAX_EMAIL_STR)
|
||||
{
|
||||
sScriptMgr->OnFailedEmailChange(accountId);
|
||||
return AOR_EMAIL_TOO_LONG; // email's too long
|
||||
}
|
||||
|
||||
Utf8ToUpperOnlyLatin(newEmail);
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_EMAIL);
|
||||
stmt->SetData(0, newEmail);
|
||||
stmt->SetData(1, accountId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
sScriptMgr->OnEmailChange(accountId);
|
||||
return AOR_OK;
|
||||
sScriptMgr->OnFailedEmailChange(accountId);
|
||||
return AOR_EMAIL_TOO_LONG; // email's too long
|
||||
}
|
||||
|
||||
AccountOpResult DeleteAccount(uint32 accountId)
|
||||
Utf8ToUpperOnlyLatin(newEmail);
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_EMAIL);
|
||||
stmt->SetData(0, newEmail);
|
||||
stmt->SetData(1, accountId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
sScriptMgr->OnEmailChange(accountId);
|
||||
return AOR_OK;
|
||||
}
|
||||
|
||||
AccountOpResult AccountMgr::DeleteAccount(uint32 accountId)
|
||||
{
|
||||
// Check if accounts exists
|
||||
LoginDatabasePreparedStatement* loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BY_ID);
|
||||
loginStmt->SetData(0, accountId);
|
||||
|
||||
PreparedQueryResult result = LoginDatabase.Query(loginStmt);
|
||||
if (!result)
|
||||
return AOR_NAME_NOT_EXIST;
|
||||
|
||||
sScriptMgr->OnBeforeAccountDelete(accountId);
|
||||
|
||||
// Obtain accounts characters
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID);
|
||||
stmt->SetData(0, accountId);
|
||||
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
|
||||
if (result)
|
||||
{
|
||||
// Check if accounts exists
|
||||
LoginDatabasePreparedStatement* loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BY_ID);
|
||||
loginStmt->SetData(0, accountId);
|
||||
|
||||
PreparedQueryResult result = LoginDatabase.Query(loginStmt);
|
||||
if (!result)
|
||||
return AOR_NAME_NOT_EXIST;
|
||||
|
||||
sScriptMgr->OnBeforeAccountDelete(accountId);
|
||||
|
||||
// Obtain accounts characters
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID);
|
||||
stmt->SetData(0, accountId);
|
||||
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
|
||||
if (result)
|
||||
do
|
||||
{
|
||||
do
|
||||
ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>((*result)[0].Get<uint32>());
|
||||
|
||||
// Kick if player is online
|
||||
if (Player* p = ObjectAccessor::FindPlayer(guid))
|
||||
{
|
||||
ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>((*result)[0].Get<uint32>());
|
||||
WorldSession* s = p->GetSession();
|
||||
s->KickPlayer("Delete account"); // mark session to remove at next session list update
|
||||
s->LogoutPlayer(false); // logout player without waiting next session list update
|
||||
}
|
||||
|
||||
// Kick if player is online
|
||||
if (Player* p = ObjectAccessor::FindPlayer(guid))
|
||||
{
|
||||
WorldSession* s = p->GetSession();
|
||||
s->KickPlayer("Delete account"); // mark session to remove at next session list update
|
||||
s->LogoutPlayer(false); // logout player without waiting next session list update
|
||||
}
|
||||
|
||||
Player::DeleteFromDB(guid.GetCounter(), accountId, false, true); // no need to update realm characters
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
// table realm specific but common for all characters of account for realm
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_TUTORIALS);
|
||||
stmt->SetData(0, accountId);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ACCOUNT_DATA);
|
||||
stmt->SetData(0, accountId);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_BAN);
|
||||
stmt->SetData(0, accountId);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction();
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_BANNED);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_MUTED);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
LoginDatabase.CommitTransaction(trans);
|
||||
|
||||
return AOR_OK;
|
||||
Player::DeleteFromDB(guid.GetCounter(), accountId, false, true); // no need to update realm characters
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword)
|
||||
// table realm specific but common for all characters of account for realm
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_TUTORIALS);
|
||||
stmt->SetData(0, accountId);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ACCOUNT_DATA);
|
||||
stmt->SetData(0, accountId);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_BAN);
|
||||
stmt->SetData(0, accountId);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction();
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_BANNED);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_MUTED);
|
||||
loginStmt->SetData(0, accountId);
|
||||
trans->Append(loginStmt);
|
||||
|
||||
LoginDatabase.CommitTransaction(trans);
|
||||
|
||||
return AOR_OK;
|
||||
}
|
||||
|
||||
AccountOpResult AccountMgr::ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword)
|
||||
{
|
||||
// Check if accounts exists
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BY_ID);
|
||||
stmt->SetData(0, accountId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
if (!result)
|
||||
return AOR_NAME_NOT_EXIST;
|
||||
|
||||
if (utf8length(newUsername) > MAX_ACCOUNT_STR)
|
||||
return AOR_NAME_TOO_LONG;
|
||||
|
||||
if (utf8length(newPassword) > MAX_PASS_STR)
|
||||
return AOR_PASS_TOO_LONG; // password's too long
|
||||
|
||||
Utf8ToUpperOnlyLatin(newUsername);
|
||||
Utf8ToUpperOnlyLatin(newPassword);
|
||||
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_USERNAME);
|
||||
stmt->SetData(0, newUsername);
|
||||
stmt->SetData(1, accountId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
auto [salt, verifier] = Acore::Crypto::SRP6::MakeRegistrationData(newUsername, newPassword);
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LOGON);
|
||||
stmt->SetData(0, salt);
|
||||
stmt->SetData(1, verifier);
|
||||
stmt->SetData(2, accountId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
return AOR_OK;
|
||||
}
|
||||
|
||||
AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPassword)
|
||||
{
|
||||
std::string username;
|
||||
|
||||
if (!GetName(accountId, username))
|
||||
{
|
||||
// Check if accounts exists
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BY_ID);
|
||||
sScriptMgr->OnFailedPasswordChange(accountId);
|
||||
return AOR_NAME_NOT_EXIST; // account doesn't exist
|
||||
}
|
||||
|
||||
if (utf8length(newPassword) > MAX_PASS_STR)
|
||||
{
|
||||
sScriptMgr->OnFailedEmailChange(accountId);
|
||||
return AOR_PASS_TOO_LONG; // password's too long
|
||||
}
|
||||
|
||||
Utf8ToUpperOnlyLatin(username);
|
||||
Utf8ToUpperOnlyLatin(newPassword);
|
||||
|
||||
auto [salt, verifier] = Acore::Crypto::SRP6::MakeRegistrationData(username, newPassword);
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LOGON);
|
||||
stmt->SetData(0, salt);
|
||||
stmt->SetData(1, verifier);
|
||||
stmt->SetData(2, accountId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
sScriptMgr->OnPasswordChange(accountId);
|
||||
return AOR_OK;
|
||||
}
|
||||
|
||||
uint32 AccountMgr::GetId(std::string const& username)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ID_BY_USERNAME);
|
||||
stmt->SetData(0, username);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
return (result) ? (*result)[0].Get<uint32>() : 0;
|
||||
}
|
||||
|
||||
uint32 AccountMgr::GetSecurity(uint32 accountId)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL);
|
||||
stmt->SetData(0, accountId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
return (result) ? (*result)[0].Get<uint8>() : uint32(SEC_PLAYER);
|
||||
}
|
||||
|
||||
uint32 AccountMgr::GetSecurity(uint32 accountId, int32 realmId)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_GMLEVEL_BY_REALMID);
|
||||
stmt->SetData(0, accountId);
|
||||
stmt->SetData(1, realmId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
return (result) ? (*result)[0].Get<uint8>() : uint32(SEC_PLAYER);
|
||||
}
|
||||
|
||||
bool AccountMgr::GetName(uint32 accountId, std::string& name)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_USERNAME_BY_ID);
|
||||
stmt->SetData(0, accountId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
if (result)
|
||||
{
|
||||
name = (*result)[0].Get<std::string>();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AccountMgr::CheckPassword(uint32 accountId, std::string password)
|
||||
{
|
||||
std::string username;
|
||||
|
||||
if (!GetName(accountId, username))
|
||||
return false;
|
||||
|
||||
Utf8ToUpperOnlyLatin(username);
|
||||
Utf8ToUpperOnlyLatin(password);
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_CHECK_PASSWORD);
|
||||
stmt->SetData(0, accountId);
|
||||
if (PreparedQueryResult result = LoginDatabase.Query(stmt))
|
||||
{
|
||||
Acore::Crypto::SRP6::Salt salt = (*result)[0].Get<Binary, Acore::Crypto::SRP6::SALT_LENGTH>();
|
||||
Acore::Crypto::SRP6::Verifier verifier = (*result)[1].Get<Binary, Acore::Crypto::SRP6::VERIFIER_LENGTH>();
|
||||
if (Acore::Crypto::SRP6::CheckLogin(username, password, salt, verifier))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 AccountMgr::GetCharactersCount(uint32 accountId)
|
||||
{
|
||||
// check character count
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_SUM_CHARS);
|
||||
stmt->SetData(0, accountId);
|
||||
PreparedQueryResult result = CharacterDatabase.Query(stmt);
|
||||
|
||||
return (result) ? (*result)[0].Get<uint64>() : 0;
|
||||
}
|
||||
|
||||
bool AccountMgr::IsPlayerAccount(uint32 gmlevel)
|
||||
{
|
||||
return gmlevel == SEC_PLAYER;
|
||||
}
|
||||
|
||||
bool AccountMgr::IsGMAccount(uint32 gmlevel)
|
||||
{
|
||||
return gmlevel >= SEC_GAMEMASTER;
|
||||
}
|
||||
|
||||
bool AccountMgr::IsAdminAccount(uint32 gmlevel)
|
||||
{
|
||||
return gmlevel >= SEC_ADMINISTRATOR && gmlevel <= SEC_CONSOLE;
|
||||
}
|
||||
|
||||
bool AccountMgr::IsConsoleAccount(uint32 gmlevel)
|
||||
{
|
||||
return gmlevel == SEC_CONSOLE;
|
||||
}
|
||||
|
||||
bool AccountMgr::HasPermission(uint32 accountId, uint32 permission, uint32 realmId)
|
||||
{
|
||||
if (!accountId)
|
||||
{
|
||||
LOG_ERROR("rbac", "AccountMgr::HasPermission: Wrong accountId 0");
|
||||
return false;
|
||||
}
|
||||
|
||||
rbac::RBACData rbac(accountId, "", realmId, GetSecurity(accountId, realmId));
|
||||
rbac.LoadFromDB();
|
||||
bool hasPermission = rbac.HasPermission(permission);
|
||||
|
||||
LOG_DEBUG("rbac", "AccountMgr::HasPermission [AccountId: {}, PermissionId: {}, realmId: {}]: {}",
|
||||
accountId, permission, realmId, hasPermission);
|
||||
|
||||
return hasPermission;
|
||||
}
|
||||
|
||||
void AccountMgr::UpdateAccountAccess(rbac::RBACData* rbac, uint32 accountId, uint8 securityLevel, int32 realmId)
|
||||
{
|
||||
if (rbac && securityLevel != rbac->GetSecurityLevel())
|
||||
rbac->SetSecurityLevel(securityLevel);
|
||||
|
||||
LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction();
|
||||
|
||||
// Delete old security level from DB
|
||||
if (realmId == -1)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS);
|
||||
stmt->SetData(0, accountId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
if (!result)
|
||||
return AOR_NAME_NOT_EXIST;
|
||||
|
||||
if (utf8length(newUsername) > MAX_ACCOUNT_STR)
|
||||
return AOR_NAME_TOO_LONG;
|
||||
|
||||
if (utf8length(newPassword) > MAX_PASS_STR)
|
||||
return AOR_PASS_TOO_LONG; // password's too long
|
||||
|
||||
Utf8ToUpperOnlyLatin(newUsername);
|
||||
Utf8ToUpperOnlyLatin(newPassword);
|
||||
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_USERNAME);
|
||||
stmt->SetData(0, newUsername);
|
||||
stmt->SetData(1, accountId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
auto [salt, verifier] = Acore::Crypto::SRP6::MakeRegistrationData(newUsername, newPassword);
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LOGON);
|
||||
stmt->SetData(0, salt);
|
||||
stmt->SetData(1, verifier);
|
||||
stmt->SetData(2, accountId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
return AOR_OK;
|
||||
trans->Append(stmt);
|
||||
}
|
||||
|
||||
AccountOpResult ChangePassword(uint32 accountId, std::string newPassword)
|
||||
else
|
||||
{
|
||||
std::string username;
|
||||
|
||||
if (!GetName(accountId, username))
|
||||
{
|
||||
sScriptMgr->OnFailedPasswordChange(accountId);
|
||||
return AOR_NAME_NOT_EXIST; // account doesn't exist
|
||||
}
|
||||
|
||||
if (utf8length(newPassword) > MAX_PASS_STR)
|
||||
{
|
||||
sScriptMgr->OnFailedEmailChange(accountId);
|
||||
return AOR_PASS_TOO_LONG; // password's too long
|
||||
}
|
||||
|
||||
Utf8ToUpperOnlyLatin(username);
|
||||
Utf8ToUpperOnlyLatin(newPassword);
|
||||
|
||||
auto [salt, verifier] = Acore::Crypto::SRP6::MakeRegistrationData(username, newPassword);
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LOGON);
|
||||
stmt->SetData(0, salt);
|
||||
stmt->SetData(1, verifier);
|
||||
stmt->SetData(2, accountId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
sScriptMgr->OnPasswordChange(accountId);
|
||||
return AOR_OK;
|
||||
}
|
||||
|
||||
uint32 GetId(std::string const& username)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ID_BY_USERNAME);
|
||||
stmt->SetData(0, username);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
return (result) ? (*result)[0].Get<uint32>() : 0;
|
||||
}
|
||||
|
||||
uint32 GetSecurity(uint32 accountId)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL);
|
||||
stmt->SetData(0, accountId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
return (result) ? (*result)[0].Get<uint8>() : uint32(SEC_PLAYER);
|
||||
}
|
||||
|
||||
uint32 GetSecurity(uint32 accountId, int32 realmId)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_GMLEVEL_BY_REALMID);
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM);
|
||||
stmt->SetData(0, accountId);
|
||||
stmt->SetData(1, realmId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
return (result) ? (*result)[0].Get<uint8>() : uint32(SEC_PLAYER);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
|
||||
bool GetName(uint32 accountId, std::string& name)
|
||||
// Add new security level
|
||||
if (securityLevel)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_USERNAME_BY_ID);
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_ACCESS);
|
||||
stmt->SetData(0, accountId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
stmt->SetData(1, securityLevel);
|
||||
stmt->SetData(2, realmId);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
|
||||
if (result)
|
||||
LoginDatabase.CommitTransaction(trans);
|
||||
}
|
||||
|
||||
void AccountMgr::LoadRBAC()
|
||||
{
|
||||
ClearRBAC();
|
||||
|
||||
LOG_DEBUG("rbac", "AccountMgr::LoadRBAC");
|
||||
uint32 oldMSTime = getMSTime();
|
||||
uint32 count1 = 0;
|
||||
uint32 count2 = 0;
|
||||
uint32 count3 = 0;
|
||||
|
||||
LOG_DEBUG("rbac", "AccountMgr::LoadRBAC: Loading permissions");
|
||||
QueryResult result = LoginDatabase.Query("SELECT id, name FROM rbac_permissions");
|
||||
if (!result)
|
||||
{
|
||||
LOG_INFO("server.loading", ">> Loaded 0 RBAC permissions. DB table `rbac_permissions` is empty.");
|
||||
LOG_INFO("server.loading", " ");
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
Field* field = result->Fetch();
|
||||
uint32 id = field[0].Get<uint32>();
|
||||
_permissions[id] = new rbac::RBACPermission(id, field[1].Get<std::string>());
|
||||
++count1;
|
||||
}
|
||||
while (result->NextRow());
|
||||
|
||||
LOG_DEBUG("rbac", "AccountMgr::LoadRBAC: Loading linked permissions");
|
||||
result = LoginDatabase.Query("SELECT id, linkedId FROM rbac_linked_permissions ORDER BY id ASC");
|
||||
if (!result)
|
||||
{
|
||||
LOG_INFO("server.loading", ">> Loaded {} RBAC permissions", count1);
|
||||
LOG_INFO("server.loading", " ");
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32 permissionId = 0;
|
||||
rbac::RBACPermission* permission = nullptr;
|
||||
|
||||
do
|
||||
{
|
||||
name = (*result)[0].Get<std::string>();
|
||||
return true;
|
||||
Field* field = result->Fetch();
|
||||
uint32 newId = field[0].Get<uint32>();
|
||||
if (permissionId != newId)
|
||||
{
|
||||
permissionId = newId;
|
||||
permission = _permissions[newId];
|
||||
}
|
||||
|
||||
uint32 linkedPermissionId = field[1].Get<uint32>();
|
||||
if (linkedPermissionId == permissionId)
|
||||
{
|
||||
LOG_ERROR("sql.sql", "RBAC Permission {} has itself as linked permission. Ignored", permissionId);
|
||||
continue;
|
||||
}
|
||||
permission->AddLinkedPermission(linkedPermissionId);
|
||||
++count2;
|
||||
}
|
||||
while (result->NextRow());
|
||||
|
||||
LOG_INFO("server.loading", ">> Loaded {} RBAC permissions and {} linked permissions in {} ms", count1, count2, GetMSTimeDiffToNow(oldMSTime));
|
||||
LOG_INFO("server.loading", " ");
|
||||
}
|
||||
|
||||
LOG_DEBUG("rbac", "AccountMgr::LoadRBAC: Loading default permissions");
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_RBAC_DEFAULT_PERMISSIONS);
|
||||
stmt->SetData(0, int32(realm.Id.Realm));
|
||||
PreparedQueryResult defaultPermResult = LoginDatabase.Query(stmt);
|
||||
if (!defaultPermResult)
|
||||
{
|
||||
LOG_INFO("server.loading", ">> Loaded 0 RBAC default permissions. DB table `rbac_default_permissions` is empty.");
|
||||
LOG_INFO("server.loading", " ");
|
||||
return;
|
||||
}
|
||||
|
||||
uint8 secId = 255;
|
||||
rbac::RBACPermissionContainer* permissions = nullptr;
|
||||
do
|
||||
{
|
||||
Field* field = defaultPermResult->Fetch();
|
||||
uint8 newId = field[0].Get<uint8>();
|
||||
if (secId != newId || permissions == nullptr)
|
||||
{
|
||||
secId = newId;
|
||||
permissions = &_defaultPermissions[secId];
|
||||
}
|
||||
|
||||
return false;
|
||||
permissions->insert(field[1].Get<uint32>());
|
||||
++count3;
|
||||
}
|
||||
while (defaultPermResult->NextRow());
|
||||
|
||||
bool CheckPassword(uint32 accountId, std::string password)
|
||||
{
|
||||
std::string username;
|
||||
LOG_INFO("server.loading", ">> Loaded {} RBAC default permissions in {} ms", count3, GetMSTimeDiffToNow(oldMSTime));
|
||||
LOG_INFO("server.loading", " ");
|
||||
}
|
||||
|
||||
if (!GetName(accountId, username))
|
||||
return false;
|
||||
rbac::RBACPermission const* AccountMgr::GetRBACPermission(uint32 permissionId) const
|
||||
{
|
||||
LOG_TRACE("rbac", "AccountMgr::GetRBACPermission: {}", permissionId);
|
||||
rbac::RBACPermissionsContainer::const_iterator it = _permissions.find(permissionId);
|
||||
if (it != _permissions.end())
|
||||
return it->second;
|
||||
|
||||
Utf8ToUpperOnlyLatin(username);
|
||||
Utf8ToUpperOnlyLatin(password);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_CHECK_PASSWORD);
|
||||
stmt->SetData(0, accountId);
|
||||
if (PreparedQueryResult result = LoginDatabase.Query(stmt))
|
||||
{
|
||||
Acore::Crypto::SRP6::Salt salt = (*result)[0].Get<Binary, Acore::Crypto::SRP6::SALT_LENGTH>();
|
||||
Acore::Crypto::SRP6::Verifier verifier = (*result)[1].Get<Binary, Acore::Crypto::SRP6::VERIFIER_LENGTH>();
|
||||
if (Acore::Crypto::SRP6::CheckLogin(username, password, salt, verifier))
|
||||
return true;
|
||||
}
|
||||
rbac::RBACPermissionContainer const& AccountMgr::GetRBACDefaultPermissions(uint8 secLevel)
|
||||
{
|
||||
LOG_TRACE("rbac", "AccountMgr::GetRBACDefaultPermissions: secLevel {} - size: {}", secLevel, uint32(_defaultPermissions[secLevel].size()));
|
||||
return _defaultPermissions[secLevel];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
void AccountMgr::ClearRBAC()
|
||||
{
|
||||
for (std::pair<uint32 const, rbac::RBACPermission*>& permission : _permissions)
|
||||
delete permission.second;
|
||||
|
||||
uint32 GetCharactersCount(uint32 accountId)
|
||||
{
|
||||
// check character count
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_SUM_CHARS);
|
||||
stmt->SetData(0, accountId);
|
||||
PreparedQueryResult result = CharacterDatabase.Query(stmt);
|
||||
_permissions.clear();
|
||||
_defaultPermissions.clear();
|
||||
}
|
||||
|
||||
return (result) ? (*result)[0].Get<uint64>() : 0;
|
||||
}
|
||||
void AccountMgr::AddPermissionForTest(uint32 permissionId, std::string const& name)
|
||||
{
|
||||
if (_permissions.find(permissionId) != _permissions.end())
|
||||
return;
|
||||
|
||||
bool IsPlayerAccount(uint32 gmlevel)
|
||||
{
|
||||
return gmlevel == SEC_PLAYER;
|
||||
}
|
||||
_permissions[permissionId] = new rbac::RBACPermission(permissionId, name);
|
||||
}
|
||||
|
||||
bool IsGMAccount(uint32 gmlevel)
|
||||
{
|
||||
return gmlevel >= SEC_GAMEMASTER;
|
||||
}
|
||||
void AccountMgr::AddLinkedPermissionForTest(uint32 permissionId, uint32 linkedPermissionId)
|
||||
{
|
||||
auto it = _permissions.find(permissionId);
|
||||
if (it != _permissions.end())
|
||||
it->second->AddLinkedPermission(linkedPermissionId);
|
||||
}
|
||||
|
||||
bool IsAdminAccount(uint32 gmlevel)
|
||||
{
|
||||
return gmlevel >= SEC_ADMINISTRATOR && gmlevel <= SEC_CONSOLE;
|
||||
}
|
||||
void AccountMgr::AddDefaultPermissionForTest(uint8 secLevel, uint32 permissionId)
|
||||
{
|
||||
_defaultPermissions[secLevel].insert(permissionId);
|
||||
}
|
||||
|
||||
bool IsConsoleAccount(uint32 gmlevel)
|
||||
{
|
||||
return gmlevel == SEC_CONSOLE;
|
||||
}
|
||||
|
||||
} // Namespace AccountMgr
|
||||
void AccountMgr::ClearPermissionsForTest()
|
||||
{
|
||||
ClearRBAC();
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
@@ -18,9 +18,7 @@
|
||||
#ifndef _ACCMGR_H
|
||||
#define _ACCMGR_H
|
||||
|
||||
#include "Define.h"
|
||||
#include "Common.h"
|
||||
#include <string>
|
||||
#include "RBAC.h"
|
||||
|
||||
enum AccountOpResult
|
||||
{
|
||||
@@ -37,25 +35,61 @@ enum AccountOpResult
|
||||
#define MAX_PASS_STR 16
|
||||
#define MAX_EMAIL_STR 255
|
||||
|
||||
namespace AccountMgr
|
||||
namespace rbac
|
||||
{
|
||||
typedef std::map<uint32, rbac::RBACPermission*> RBACPermissionsContainer;
|
||||
typedef std::map<uint8, rbac::RBACPermissionContainer> RBACDefaultPermissionsContainer;
|
||||
}
|
||||
|
||||
class AC_GAME_API AccountMgr
|
||||
{
|
||||
private:
|
||||
AccountMgr();
|
||||
~AccountMgr();
|
||||
|
||||
public:
|
||||
static AccountMgr* instance();
|
||||
|
||||
AccountOpResult CreateAccount(std::string username, std::string password, std::string email = "");
|
||||
AccountOpResult DeleteAccount(uint32 accountId);
|
||||
AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword);
|
||||
AccountOpResult ChangePassword(uint32 accountId, std::string newPassword);
|
||||
AccountOpResult ChangeEmail(uint32 accountId, std::string email);
|
||||
bool CheckPassword(uint32 accountId, std::string password);
|
||||
static AccountOpResult DeleteAccount(uint32 accountId);
|
||||
static AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword);
|
||||
static AccountOpResult ChangePassword(uint32 accountId, std::string newPassword);
|
||||
static AccountOpResult ChangeEmail(uint32 accountId, std::string email);
|
||||
static bool CheckPassword(uint32 accountId, std::string password);
|
||||
|
||||
uint32 GetId(std::string const& username);
|
||||
uint32 GetSecurity(uint32 accountId);
|
||||
uint32 GetSecurity(uint32 accountId, int32 realmId);
|
||||
bool GetName(uint32 accountId, std::string& name);
|
||||
uint32 GetCharactersCount(uint32 accountId);
|
||||
static uint32 GetId(std::string const& username);
|
||||
static uint32 GetSecurity(uint32 accountId);
|
||||
static uint32 GetSecurity(uint32 accountId, int32 realmId);
|
||||
static bool GetName(uint32 accountId, std::string& name);
|
||||
static uint32 GetCharactersCount(uint32 accountId);
|
||||
|
||||
bool IsPlayerAccount(uint32 gmlevel);
|
||||
bool IsGMAccount(uint32 gmlevel);
|
||||
bool IsAdminAccount(uint32 gmlevel);
|
||||
bool IsConsoleAccount(uint32 gmlevel);
|
||||
static bool IsPlayerAccount(uint32 gmlevel);
|
||||
static bool IsGMAccount(uint32 gmlevel);
|
||||
static bool IsAdminAccount(uint32 gmlevel);
|
||||
static bool IsConsoleAccount(uint32 gmlevel);
|
||||
|
||||
static bool HasPermission(uint32 accountId, uint32 permission, uint32 realmId);
|
||||
|
||||
void UpdateAccountAccess(rbac::RBACData* rbac, uint32 accountId, uint8 securityLevel, int32 realmId);
|
||||
|
||||
void LoadRBAC();
|
||||
rbac::RBACPermission const* GetRBACPermission(uint32 permission) const;
|
||||
|
||||
rbac::RBACPermissionsContainer const& GetRBACPermissionList() const { return _permissions; }
|
||||
rbac::RBACPermissionContainer const& GetRBACDefaultPermissions(uint8 secLevel);
|
||||
|
||||
// For unit testing - allows adding permissions without database
|
||||
void AddPermissionForTest(uint32 permissionId, std::string const& name);
|
||||
void AddLinkedPermissionForTest(uint32 permissionId, uint32 linkedPermissionId);
|
||||
void AddDefaultPermissionForTest(uint8 secLevel, uint32 permissionId);
|
||||
void ClearPermissionsForTest();
|
||||
|
||||
private:
|
||||
void ClearRBAC();
|
||||
rbac::RBACPermissionsContainer _permissions;
|
||||
rbac::RBACDefaultPermissionsContainer _defaultPermissions;
|
||||
};
|
||||
|
||||
#define sAccountMgr AccountMgr::instance()
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,283 @@
|
||||
/*
|
||||
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "RBAC.h"
|
||||
#include "AccountMgr.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "Log.h"
|
||||
#include "QueryResult.h"
|
||||
#include <sstream>
|
||||
|
||||
namespace rbac
|
||||
{
|
||||
|
||||
std::string GetDebugPermissionString(RBACPermissionContainer const& perms)
|
||||
{
|
||||
std::string str = "";
|
||||
if (!perms.empty())
|
||||
{
|
||||
std::ostringstream o;
|
||||
RBACPermissionContainer::const_iterator itr = perms.begin();
|
||||
o << (*itr);
|
||||
for (++itr; itr != perms.end(); ++itr)
|
||||
o << ", " << uint32(*itr);
|
||||
str = o.str();
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
RBACCommandResult RBACData::GrantPermission(uint32 permissionId, int32 realmId /* = 0*/)
|
||||
{
|
||||
// Check if permission Id exists
|
||||
RBACPermission const* perm = sAccountMgr->GetRBACPermission(permissionId);
|
||||
if (!perm)
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::GrantPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Permission does not exists",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
return RBAC_ID_DOES_NOT_EXISTS;
|
||||
}
|
||||
|
||||
// Check if already added in denied list
|
||||
if (HasDeniedPermission(permissionId))
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::GrantPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Permission in deny list",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
return RBAC_IN_DENIED_LIST;
|
||||
}
|
||||
|
||||
// Already added?
|
||||
if (HasGrantedPermission(permissionId))
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::GrantPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Permission already granted",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
return RBAC_CANT_ADD_ALREADY_ADDED;
|
||||
}
|
||||
|
||||
AddGrantedPermission(permissionId);
|
||||
|
||||
// Do not save to db when loading data from DB (realmId = 0)
|
||||
if (realmId)
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::GrantPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Ok and DB updated",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
SavePermission(permissionId, true, realmId);
|
||||
CalculateNewPermissions();
|
||||
}
|
||||
else
|
||||
LOG_TRACE("rbac", "RBACData::GrantPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Ok",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
|
||||
return RBAC_OK;
|
||||
}
|
||||
|
||||
RBACCommandResult RBACData::DenyPermission(uint32 permissionId, int32 realmId /* = 0*/)
|
||||
{
|
||||
// Check if permission Id exists
|
||||
RBACPermission const* perm = sAccountMgr->GetRBACPermission(permissionId);
|
||||
if (!perm)
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::DenyPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Permission does not exists",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
return RBAC_ID_DOES_NOT_EXISTS;
|
||||
}
|
||||
|
||||
// Check if already added in granted list
|
||||
if (HasGrantedPermission(permissionId))
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::DenyPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Permission in grant list",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
return RBAC_IN_GRANTED_LIST;
|
||||
}
|
||||
|
||||
// Already added?
|
||||
if (HasDeniedPermission(permissionId))
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::DenyPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Permission already denied",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
return RBAC_CANT_ADD_ALREADY_ADDED;
|
||||
}
|
||||
|
||||
AddDeniedPermission(permissionId);
|
||||
|
||||
// Do not save to db when loading data from DB (realmId = 0)
|
||||
if (realmId)
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::DenyPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Ok and DB updated",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
SavePermission(permissionId, false, realmId);
|
||||
CalculateNewPermissions();
|
||||
}
|
||||
else
|
||||
LOG_TRACE("rbac", "RBACData::DenyPermission [Id: {} Name: {}] (Permission {}, RealmId {}). Ok",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
|
||||
return RBAC_OK;
|
||||
}
|
||||
|
||||
void RBACData::SavePermission(uint32 permission, bool granted, int32 realmId)
|
||||
{
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_RBAC_ACCOUNT_PERMISSION);
|
||||
stmt->SetData(0, GetId());
|
||||
stmt->SetData(1, permission);
|
||||
stmt->SetData(2, granted);
|
||||
stmt->SetData(3, realmId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
RBACCommandResult RBACData::RevokePermission(uint32 permissionId, int32 realmId /* = 0*/)
|
||||
{
|
||||
// Check if it's present in any list
|
||||
if (!HasGrantedPermission(permissionId) && !HasDeniedPermission(permissionId))
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::RevokePermission [Id: {} Name: {}] (Permission {}, RealmId {}). Not granted or revoked",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
return RBAC_CANT_REVOKE_NOT_IN_LIST;
|
||||
}
|
||||
|
||||
RemoveGrantedPermission(permissionId);
|
||||
RemoveDeniedPermission(permissionId);
|
||||
|
||||
// Do not save to db when loading data from DB (realmId = 0)
|
||||
if (realmId)
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::RevokePermission [Id: {} Name: {}] (Permission {}, RealmId {}). Ok and DB updated",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_RBAC_ACCOUNT_PERMISSION);
|
||||
stmt->SetData(0, GetId());
|
||||
stmt->SetData(1, permissionId);
|
||||
stmt->SetData(2, realmId);
|
||||
LoginDatabase.Execute(stmt);
|
||||
|
||||
CalculateNewPermissions();
|
||||
}
|
||||
else
|
||||
LOG_TRACE("rbac", "RBACData::RevokePermission [Id: {} Name: {}] (Permission {}, RealmId {}). Ok",
|
||||
GetId(), GetName(), permissionId, realmId);
|
||||
|
||||
return RBAC_OK;
|
||||
}
|
||||
|
||||
void RBACData::LoadFromDB()
|
||||
{
|
||||
ClearData();
|
||||
|
||||
LOG_DEBUG("rbac", "RBACData::LoadFromDB [Id: {} Name: {}]: Loading permissions", GetId(), GetName());
|
||||
// Load account permissions (granted and denied) that affect current realm
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS);
|
||||
stmt->SetData(0, GetId());
|
||||
stmt->SetData(1, GetRealmId());
|
||||
|
||||
LoadFromDBCallback(LoginDatabase.Query(stmt));
|
||||
}
|
||||
|
||||
QueryCallback RBACData::LoadFromDBAsync()
|
||||
{
|
||||
ClearData();
|
||||
|
||||
LOG_DEBUG("rbac", "RBACData::LoadFromDB [Id: {} Name: {}]: Loading permissions", GetId(), GetName());
|
||||
// Load account permissions (granted and denied) that affect current realm
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS);
|
||||
stmt->SetData(0, GetId());
|
||||
stmt->SetData(1, GetRealmId());
|
||||
|
||||
return LoginDatabase.AsyncQuery(stmt);
|
||||
}
|
||||
|
||||
void RBACData::LoadFromDBCallback(PreparedQueryResult result)
|
||||
{
|
||||
if (result)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
if (fields[1].Get<bool>())
|
||||
GrantPermission(fields[0].Get<uint32>());
|
||||
else
|
||||
DenyPermission(fields[0].Get<uint32>());
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
// Add default permissions
|
||||
RBACPermissionContainer const& permissions = sAccountMgr->GetRBACDefaultPermissions(_secLevel);
|
||||
for (uint32 permission : permissions)
|
||||
GrantPermission(permission);
|
||||
|
||||
// Force calculation of permissions
|
||||
CalculateNewPermissions();
|
||||
}
|
||||
|
||||
void RBACData::CalculateNewPermissions()
|
||||
{
|
||||
LOG_TRACE("rbac", "RBACData::CalculateNewPermissions [Id: {} Name: {}]", GetId(), GetName());
|
||||
|
||||
// Get the list of granted permissions
|
||||
_globalPerms = GetGrantedPermissions();
|
||||
ExpandPermissions(_globalPerms);
|
||||
RBACPermissionContainer revoked = GetDeniedPermissions();
|
||||
ExpandPermissions(revoked);
|
||||
RemovePermissions(_globalPerms, revoked);
|
||||
}
|
||||
|
||||
void RBACData::AddPermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo)
|
||||
{
|
||||
for (uint32 permission : permsFrom)
|
||||
permsTo.insert(permission);
|
||||
}
|
||||
|
||||
void RBACData::RemovePermissions(RBACPermissionContainer& permsFrom, RBACPermissionContainer const& permsToRemove)
|
||||
{
|
||||
for (uint32 permission: permsToRemove)
|
||||
permsFrom.erase(permission);
|
||||
}
|
||||
|
||||
void RBACData::ExpandPermissions(RBACPermissionContainer& permissions)
|
||||
{
|
||||
RBACPermissionContainer toCheck = permissions;
|
||||
permissions.clear();
|
||||
|
||||
while (!toCheck.empty())
|
||||
{
|
||||
// remove the permission from original list
|
||||
uint32 permissionId = *toCheck.begin();
|
||||
toCheck.erase(toCheck.begin());
|
||||
|
||||
RBACPermission const* permission = sAccountMgr->GetRBACPermission(permissionId);
|
||||
if (!permission)
|
||||
continue;
|
||||
|
||||
// insert into the final list (expanded list)
|
||||
permissions.insert(permissionId);
|
||||
|
||||
// add all linked permissions (that are not already expanded) to the list of permissions to be checked
|
||||
RBACPermissionContainer const& linkedPerms = permission->GetLinkedPermissions();
|
||||
for (uint32 linkedPerm : linkedPerms)
|
||||
if (permissions.find(linkedPerm) == permissions.end())
|
||||
toCheck.insert(linkedPerm);
|
||||
}
|
||||
|
||||
LOG_DEBUG("rbac", "RBACData::ExpandPermissions: Expanded: {}", GetDebugPermissionString(permissions));
|
||||
}
|
||||
|
||||
void RBACData::ClearData()
|
||||
{
|
||||
_grantedPerms.clear();
|
||||
_deniedPerms.clear();
|
||||
_globalPerms.clear();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,895 @@
|
||||
/*
|
||||
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file RBAC.h
|
||||
* @brief Role Based Access Control related classes definition
|
||||
*
|
||||
* This file contains all the classes and enums used to implement
|
||||
* Role Based Access Control
|
||||
*
|
||||
* RBAC Rules:
|
||||
* - Permission: Defines an authorization to perform certain operation.
|
||||
* - Role: Set of permissions.
|
||||
* - An Account can have multiple roles and permissions.
|
||||
* - Account Roles and Permissions can be granted, denied or revoked
|
||||
* - Grant: Assignment of the object (role/permission) and allow it
|
||||
* - Deny: Assignment of the object (role/permission) and deny it
|
||||
* - Revoke: Removal of the object (role/permission) no matter if it was granted or denied
|
||||
* - Global Permissions are computed as:
|
||||
* Role Grants + User Grants - Role Denies - User Denies
|
||||
* - Roles and Permissions can be assigned by realm
|
||||
*/
|
||||
|
||||
#ifndef _RBAC_H
|
||||
#define _RBAC_H
|
||||
|
||||
#include "Define.h"
|
||||
#include "DatabaseEnvFwd.h"
|
||||
#include <string>
|
||||
#include <set>
|
||||
#include <map>
|
||||
|
||||
namespace rbac
|
||||
{
|
||||
|
||||
enum RBACPermissions
|
||||
{
|
||||
RBAC_PERM_INSTANT_LOGOUT = 1,
|
||||
RBAC_PERM_SKIP_QUEUE = 2,
|
||||
RBAC_PERM_JOIN_NORMAL_BG = 3,
|
||||
RBAC_PERM_JOIN_RANDOM_BG = 4,
|
||||
RBAC_PERM_JOIN_ARENAS = 5,
|
||||
RBAC_PERM_JOIN_DUNGEON_FINDER = 6,
|
||||
RBAC_PERM_IGNORE_IDLE_CONNECTION = 7,
|
||||
RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS = 8,
|
||||
RBAC_PERM_CANNOT_EARN_REALM_FIRST_ACHIEVEMENTS = 9,
|
||||
// 10 not on 3.3.5a (character templates)
|
||||
RBAC_PERM_LOG_GM_TRADE = 11,
|
||||
// 12 not on 3.3.5a (demon hunter)
|
||||
RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES = 13,
|
||||
RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_TEAMMASK = 14,
|
||||
RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_CLASSMASK = 15,
|
||||
RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RACEMASK = 16,
|
||||
RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME = 17,
|
||||
RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEATH_KNIGHT = 18,
|
||||
RBAC_PERM_SKIP_CHECK_CHAT_CHANNEL_REQ = 19,
|
||||
RBAC_PERM_SKIP_CHECK_DISABLE_MAP = 20,
|
||||
RBAC_PERM_SKIP_CHECK_MORE_TALENTS_THAN_ALLOWED = 21,
|
||||
RBAC_PERM_SKIP_CHECK_CHAT_SPAM = 22,
|
||||
RBAC_PERM_SKIP_CHECK_OVERSPEED_PING = 23,
|
||||
RBAC_PERM_TWO_SIDE_CHARACTER_CREATION = 24,
|
||||
RBAC_PERM_TWO_SIDE_INTERACTION_CHAT = 25,
|
||||
RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL = 26,
|
||||
RBAC_PERM_TWO_SIDE_INTERACTION_MAIL = 27,
|
||||
RBAC_PERM_TWO_SIDE_WHO_LIST = 28,
|
||||
RBAC_PERM_TWO_SIDE_ADD_FRIEND = 29,
|
||||
RBAC_PERM_COMMANDS_SAVE_WITHOUT_DELAY = 30,
|
||||
RBAC_PERM_COMMANDS_USE_UNSTUCK_WITH_ARGS = 31,
|
||||
RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET = 32,
|
||||
RBAC_PERM_COMMANDS_NOTIFY_COMMAND_NOT_FOUND_ERROR = 33,
|
||||
RBAC_PERM_COMMANDS_APPEAR_IN_GM_LIST = 34,
|
||||
RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS = 35,
|
||||
RBAC_PERM_CAN_FILTER_WHISPERS = 36,
|
||||
RBAC_PERM_CHAT_USE_STAFF_BADGE = 37,
|
||||
RBAC_PERM_RESURRECT_WITH_FULL_HPS = 38,
|
||||
RBAC_PERM_RESTORE_SAVED_GM_STATE = 39,
|
||||
RBAC_PERM_ALLOW_GM_FRIEND = 40,
|
||||
RBAC_PERM_USE_START_GM_LEVEL = 41,
|
||||
RBAC_PERM_OPCODE_WORLD_TELEPORT = 42,
|
||||
RBAC_PERM_OPCODE_WHOIS = 43,
|
||||
RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE = 44,
|
||||
RBAC_PERM_SILENTLY_JOIN_CHANNEL = 45,
|
||||
RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR = 46,
|
||||
RBAC_PERM_CAN_IGNORE_LOWER_SECURITY_CHECK = 47,
|
||||
RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA = 48,
|
||||
RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE = 49,
|
||||
RBAC_PERM_MAY_CHECK_OWN_EMAIL = 50,
|
||||
RBAC_PERM_ALLOW_TWO_SIDE_TRADE = 51,
|
||||
RBAC_PERM_NO_BATTLEGROUND_DESERTER_DEBUFF = 52,
|
||||
RBAC_PERM_CAN_AFK_ON_BATTLEGROUND = 53,
|
||||
|
||||
// Roles (Permissions with delegated permissions) use 199 and descending
|
||||
RBAC_ROLE_ADMINISTRATOR = 196,
|
||||
RBAC_ROLE_GAMEMASTER = 197,
|
||||
RBAC_ROLE_MODERATOR = 198,
|
||||
RBAC_ROLE_PLAYER = 199,
|
||||
|
||||
// Command permissions start at 200
|
||||
RBAC_PERM_COMMAND_RBAC = 200,
|
||||
RBAC_PERM_COMMAND_RBAC_ACC = 201,
|
||||
RBAC_PERM_COMMAND_RBAC_ACC_PERM_LIST = 202,
|
||||
RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT = 203,
|
||||
RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY = 204,
|
||||
RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE = 205,
|
||||
RBAC_PERM_COMMAND_RBAC_LIST = 206,
|
||||
// 207-216 not on 3.3.5a (bnet)
|
||||
RBAC_PERM_COMMAND_ACCOUNT = 217,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_ADDON = 218,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_CREATE = 219,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_DELETE = 220,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_LOCK = 221,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_LOCK_COUNTRY = 222,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_LOCK_IP = 223,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_ONLINE_LIST = 224,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_PASSWORD = 225,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_SET = 226,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_SET_ADDON = 227,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_SET_SECLEVEL = 228,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_SET_PASSWORD = 229,
|
||||
RBAC_PERM_COMMAND_ACHIEVEMENT_ADD = 231,
|
||||
RBAC_PERM_COMMAND_ACHIEVEMENT_CHECKALL = 232,
|
||||
RBAC_PERM_COMMAND_ARENA_CAPTAIN = 233,
|
||||
RBAC_PERM_COMMAND_ARENA_CREATE = 234,
|
||||
RBAC_PERM_COMMAND_ARENA_DISBAND = 235,
|
||||
RBAC_PERM_COMMAND_ARENA_INFO = 236,
|
||||
RBAC_PERM_COMMAND_ARENA_LOOKUP = 237,
|
||||
RBAC_PERM_COMMAND_ARENA_RENAME = 238,
|
||||
RBAC_PERM_COMMAND_BAN_ACCOUNT = 240,
|
||||
RBAC_PERM_COMMAND_BAN_CHARACTER = 241,
|
||||
RBAC_PERM_COMMAND_BAN_IP = 242,
|
||||
RBAC_PERM_COMMAND_BAN_PLAYERACCOUNT = 243,
|
||||
RBAC_PERM_COMMAND_BANINFO_ACCOUNT = 245,
|
||||
RBAC_PERM_COMMAND_BANINFO_CHARACTER = 246,
|
||||
RBAC_PERM_COMMAND_BANINFO_IP = 247,
|
||||
RBAC_PERM_COMMAND_BANLIST_ACCOUNT = 249,
|
||||
RBAC_PERM_COMMAND_BANLIST_CHARACTER = 250,
|
||||
RBAC_PERM_COMMAND_BANLIST_IP = 251,
|
||||
RBAC_PERM_COMMAND_UNBAN_ACCOUNT = 253,
|
||||
RBAC_PERM_COMMAND_UNBAN_CHARACTER = 254,
|
||||
RBAC_PERM_COMMAND_UNBAN_IP = 255,
|
||||
RBAC_PERM_COMMAND_UNBAN_PLAYERACCOUNT = 256,
|
||||
RBAC_PERM_COMMAND_BF_START = 258,
|
||||
RBAC_PERM_COMMAND_BF_STOP = 259,
|
||||
RBAC_PERM_COMMAND_BF_SWITCH = 260,
|
||||
RBAC_PERM_COMMAND_BF_TIMER = 261,
|
||||
RBAC_PERM_COMMAND_BF_ENABLE = 262,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_EMAIL = 263,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_EMAIL = 265,
|
||||
RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_REGMAIL = 266,
|
||||
RBAC_PERM_COMMAND_CAST = 267,
|
||||
RBAC_PERM_COMMAND_CAST_BACK = 268,
|
||||
RBAC_PERM_COMMAND_CAST_DIST = 269,
|
||||
RBAC_PERM_COMMAND_CAST_SELF = 270,
|
||||
RBAC_PERM_COMMAND_CAST_TARGET = 271,
|
||||
RBAC_PERM_COMMAND_CAST_DEST = 272,
|
||||
RBAC_PERM_COMMAND_CHARACTER_CUSTOMIZE = 274,
|
||||
RBAC_PERM_COMMAND_CHARACTER_CHANGEFACTION = 275,
|
||||
RBAC_PERM_COMMAND_CHARACTER_CHANGERACE = 276,
|
||||
RBAC_PERM_COMMAND_CHARACTER_DELETED_DELETE = 278,
|
||||
RBAC_PERM_COMMAND_CHARACTER_DELETED_LIST = 279,
|
||||
RBAC_PERM_COMMAND_CHARACTER_DELETED_RESTORE = 280,
|
||||
RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD = 281,
|
||||
RBAC_PERM_COMMAND_CHARACTER_ERASE = 282,
|
||||
RBAC_PERM_COMMAND_CHARACTER_LEVEL = 283,
|
||||
RBAC_PERM_COMMAND_CHARACTER_RENAME = 284,
|
||||
RBAC_PERM_COMMAND_CHARACTER_REPUTATION = 285,
|
||||
RBAC_PERM_COMMAND_CHARACTER_TITLES = 286,
|
||||
RBAC_PERM_COMMAND_LEVELUP = 287,
|
||||
RBAC_PERM_COMMAND_PDUMP_LOAD = 289,
|
||||
RBAC_PERM_COMMAND_PDUMP_WRITE = 290,
|
||||
RBAC_PERM_COMMAND_CHEAT_CASTTIME = 292,
|
||||
RBAC_PERM_COMMAND_CHEAT_COOLDOWN = 293,
|
||||
RBAC_PERM_COMMAND_CHEAT_EXPLORE = 294,
|
||||
RBAC_PERM_COMMAND_CHEAT_GOD = 295,
|
||||
RBAC_PERM_COMMAND_CHEAT_POWER = 296,
|
||||
RBAC_PERM_COMMAND_CHEAT_STATUS = 297,
|
||||
RBAC_PERM_COMMAND_CHEAT_TAXI = 298,
|
||||
RBAC_PERM_COMMAND_CHEAT_WATERWALK = 299,
|
||||
RBAC_PERM_COMMAND_DEBUG = 300,
|
||||
// 301-342 previously used, do not reuse
|
||||
RBAC_PERM_COMMAND_DESERTER_BG_ADD = 343,
|
||||
RBAC_PERM_COMMAND_DESERTER_BG_REMOVE = 344,
|
||||
RBAC_PERM_COMMAND_DESERTER_INSTANCE_ADD = 346,
|
||||
RBAC_PERM_COMMAND_DESERTER_INSTANCE_REMOVE = 347,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_ACHIEVEMENT_CRITERIA = 350,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_BATTLEGROUND = 351,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_MAP = 352,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_MMAP = 353,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_OUTDOORPVP = 354,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_QUEST = 355,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_SPELL = 356,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_VMAP = 357,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_ACHIEVEMENT_CRITERIA = 359,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_BATTLEGROUND = 360,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_MAP = 361,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_MMAP = 362,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_OUTDOORPVP = 363,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_QUEST = 364,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_SPELL = 365,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_VMAP = 366,
|
||||
RBAC_PERM_COMMAND_EVENT_INFO = 367,
|
||||
RBAC_PERM_COMMAND_EVENT_ACTIVELIST = 368,
|
||||
RBAC_PERM_COMMAND_EVENT_START = 369,
|
||||
RBAC_PERM_COMMAND_EVENT_STOP = 370,
|
||||
RBAC_PERM_COMMAND_GM = 371,
|
||||
RBAC_PERM_COMMAND_GM_CHAT = 372,
|
||||
RBAC_PERM_COMMAND_GM_FLY = 373,
|
||||
RBAC_PERM_COMMAND_GM_INGAME = 374,
|
||||
RBAC_PERM_COMMAND_GM_LIST = 375,
|
||||
RBAC_PERM_COMMAND_GM_VISIBLE = 376,
|
||||
RBAC_PERM_COMMAND_GO = 377,
|
||||
RBAC_PERM_COMMAND_GOBJECT_ACTIVATE = 388,
|
||||
RBAC_PERM_COMMAND_GOBJECT_ADD = 389,
|
||||
RBAC_PERM_COMMAND_GOBJECT_ADD_TEMP = 390,
|
||||
RBAC_PERM_COMMAND_GOBJECT_DELETE = 391,
|
||||
RBAC_PERM_COMMAND_GOBJECT_INFO = 392,
|
||||
RBAC_PERM_COMMAND_GOBJECT_MOVE = 393,
|
||||
RBAC_PERM_COMMAND_GOBJECT_NEAR = 394,
|
||||
RBAC_PERM_COMMAND_GOBJECT_SET_PHASE = 396,
|
||||
RBAC_PERM_COMMAND_GOBJECT_SET_STATE = 397,
|
||||
RBAC_PERM_COMMAND_GOBJECT_TARGET = 398,
|
||||
RBAC_PERM_COMMAND_GOBJECT_TURN = 399,
|
||||
RBAC_PERM_COMMAND_GUILD = 401,
|
||||
RBAC_PERM_COMMAND_GUILD_CREATE = 402,
|
||||
RBAC_PERM_COMMAND_GUILD_DELETE = 403,
|
||||
RBAC_PERM_COMMAND_GUILD_INVITE = 404,
|
||||
RBAC_PERM_COMMAND_GUILD_UNINVITE = 405,
|
||||
RBAC_PERM_COMMAND_GUILD_RANK = 406,
|
||||
RBAC_PERM_COMMAND_GUILD_RENAME = 407,
|
||||
RBAC_PERM_COMMAND_HONOR_ADD = 409,
|
||||
RBAC_PERM_COMMAND_HONOR_ADD_KILL = 410,
|
||||
RBAC_PERM_COMMAND_HONOR_UPDATE = 411,
|
||||
RBAC_PERM_COMMAND_INSTANCE_LISTBINDS = 413,
|
||||
RBAC_PERM_COMMAND_INSTANCE_UNBIND = 414,
|
||||
RBAC_PERM_COMMAND_INSTANCE_STATS = 415,
|
||||
RBAC_PERM_COMMAND_INSTANCE_SAVEDATA = 416,
|
||||
RBAC_PERM_COMMAND_LEARN = 417,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_MY = 419,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_MY_CLASS = 420,
|
||||
RBAC_PERM_COMMAND_LEARN_MY_PETTALENTS = 421,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_MY_SPELLS = 422,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_TALENTS = 423,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_GM = 424,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_CRAFTS = 425,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_DEFAULT = 426,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_LANG = 427,
|
||||
RBAC_PERM_COMMAND_LEARN_ALL_RECIPES = 428,
|
||||
RBAC_PERM_COMMAND_UNLEARN = 429,
|
||||
RBAC_PERM_COMMAND_LFG_PLAYER = 431,
|
||||
RBAC_PERM_COMMAND_LFG_GROUP = 432,
|
||||
RBAC_PERM_COMMAND_LFG_QUEUE = 433,
|
||||
RBAC_PERM_COMMAND_LFG_CLEAN = 434,
|
||||
RBAC_PERM_COMMAND_LFG_OPTIONS = 435,
|
||||
RBAC_PERM_COMMAND_LFG_COOLDOWN = 436,
|
||||
RBAC_PERM_COMMAND_LIST_CREATURE = 437,
|
||||
RBAC_PERM_COMMAND_LIST_ITEM = 438,
|
||||
RBAC_PERM_COMMAND_LIST_OBJECT = 439,
|
||||
RBAC_PERM_COMMAND_LIST_AURAS = 440,
|
||||
RBAC_PERM_COMMAND_LIST_MAIL = 441,
|
||||
RBAC_PERM_COMMAND_LOOKUP = 442,
|
||||
RBAC_PERM_COMMAND_LOOKUP_AREA = 443,
|
||||
RBAC_PERM_COMMAND_LOOKUP_CREATURE = 444,
|
||||
RBAC_PERM_COMMAND_LOOKUP_EVENT = 445,
|
||||
RBAC_PERM_COMMAND_LOOKUP_FACTION = 446,
|
||||
RBAC_PERM_COMMAND_LOOKUP_ITEM = 447,
|
||||
RBAC_PERM_COMMAND_LOOKUP_ITEMSET = 448,
|
||||
RBAC_PERM_COMMAND_LOOKUP_OBJECT = 449,
|
||||
RBAC_PERM_COMMAND_LOOKUP_QUEST = 450,
|
||||
RBAC_PERM_COMMAND_LOOKUP_PLAYER = 451,
|
||||
RBAC_PERM_COMMAND_LOOKUP_PLAYER_IP = 452,
|
||||
RBAC_PERM_COMMAND_LOOKUP_PLAYER_ACCOUNT = 453,
|
||||
RBAC_PERM_COMMAND_LOOKUP_PLAYER_EMAIL = 454,
|
||||
RBAC_PERM_COMMAND_LOOKUP_SKILL = 455,
|
||||
RBAC_PERM_COMMAND_LOOKUP_SPELL = 456,
|
||||
RBAC_PERM_COMMAND_LOOKUP_SPELL_ID = 457,
|
||||
RBAC_PERM_COMMAND_LOOKUP_TAXINODE = 458,
|
||||
RBAC_PERM_COMMAND_LOOKUP_TELE = 459,
|
||||
RBAC_PERM_COMMAND_LOOKUP_TITLE = 460,
|
||||
RBAC_PERM_COMMAND_LOOKUP_MAP = 461,
|
||||
RBAC_PERM_COMMAND_ANNOUNCE = 462,
|
||||
RBAC_PERM_COMMAND_CHANNEL = 463,
|
||||
RBAC_PERM_COMMAND_CHANNEL_SET = 464,
|
||||
RBAC_PERM_COMMAND_CHANNEL_SET_OWNERSHIP = 465,
|
||||
RBAC_PERM_COMMAND_GMANNOUNCE = 466,
|
||||
RBAC_PERM_COMMAND_GMNAMEANNOUNCE = 467,
|
||||
RBAC_PERM_COMMAND_GMNOTIFY = 468,
|
||||
RBAC_PERM_COMMAND_NAMEANNOUNCE = 469,
|
||||
RBAC_PERM_COMMAND_NOTIFY = 470,
|
||||
RBAC_PERM_COMMAND_WHISPERS = 471,
|
||||
RBAC_PERM_COMMAND_GROUP = 472,
|
||||
RBAC_PERM_COMMAND_GROUP_LEADER = 473,
|
||||
RBAC_PERM_COMMAND_GROUP_DISBAND = 474,
|
||||
RBAC_PERM_COMMAND_GROUP_REMOVE = 475,
|
||||
RBAC_PERM_COMMAND_GROUP_JOIN = 476,
|
||||
RBAC_PERM_COMMAND_GROUP_LIST = 477,
|
||||
RBAC_PERM_COMMAND_GROUP_SUMMON = 478,
|
||||
RBAC_PERM_COMMAND_PET = 479,
|
||||
RBAC_PERM_COMMAND_PET_CREATE = 480,
|
||||
RBAC_PERM_COMMAND_PET_LEARN = 481,
|
||||
RBAC_PERM_COMMAND_PET_UNLEARN = 482,
|
||||
RBAC_PERM_COMMAND_SEND = 483,
|
||||
RBAC_PERM_COMMAND_SEND_ITEMS = 484,
|
||||
RBAC_PERM_COMMAND_SEND_MAIL = 485,
|
||||
RBAC_PERM_COMMAND_SEND_MESSAGE = 486,
|
||||
RBAC_PERM_COMMAND_SEND_MONEY = 487,
|
||||
RBAC_PERM_COMMAND_ADDITEM = 488,
|
||||
RBAC_PERM_COMMAND_ADDITEMSET = 489,
|
||||
RBAC_PERM_COMMAND_APPEAR = 490,
|
||||
RBAC_PERM_COMMAND_AURA = 491,
|
||||
RBAC_PERM_COMMAND_BANK = 492,
|
||||
RBAC_PERM_COMMAND_BINDSIGHT = 493,
|
||||
RBAC_PERM_COMMAND_COMBATSTOP = 494,
|
||||
RBAC_PERM_COMMAND_COMETOME = 495,
|
||||
RBAC_PERM_COMMAND_COMMANDS = 496,
|
||||
RBAC_PERM_COMMAND_COOLDOWN = 497,
|
||||
RBAC_PERM_COMMAND_DAMAGE = 498,
|
||||
RBAC_PERM_COMMAND_DEV = 499,
|
||||
RBAC_PERM_COMMAND_DIE = 500,
|
||||
RBAC_PERM_COMMAND_DISMOUNT = 501,
|
||||
RBAC_PERM_COMMAND_DISTANCE = 502,
|
||||
RBAC_PERM_COMMAND_FLUSHARENAPOINTS = 503,
|
||||
RBAC_PERM_COMMAND_FREEZE = 504,
|
||||
RBAC_PERM_COMMAND_GPS = 505,
|
||||
RBAC_PERM_COMMAND_GUID = 506,
|
||||
RBAC_PERM_COMMAND_HELP = 507,
|
||||
RBAC_PERM_COMMAND_HIDEAREA = 508,
|
||||
RBAC_PERM_COMMAND_ITEMMOVE = 509,
|
||||
RBAC_PERM_COMMAND_KICK = 510,
|
||||
RBAC_PERM_COMMAND_LINKGRAVE = 511,
|
||||
RBAC_PERM_COMMAND_LISTFREEZE = 512,
|
||||
RBAC_PERM_COMMAND_MAXSKILL = 513,
|
||||
RBAC_PERM_COMMAND_MOVEGENS = 514,
|
||||
RBAC_PERM_COMMAND_MUTE = 515,
|
||||
RBAC_PERM_COMMAND_NEARGRAVE = 516,
|
||||
RBAC_PERM_COMMAND_PINFO = 517,
|
||||
RBAC_PERM_COMMAND_PLAYALL = 518,
|
||||
RBAC_PERM_COMMAND_POSSESS = 519,
|
||||
RBAC_PERM_COMMAND_RECALL = 520,
|
||||
RBAC_PERM_COMMAND_REPAIRITEMS = 521,
|
||||
RBAC_PERM_COMMAND_RESPAWN = 522,
|
||||
RBAC_PERM_COMMAND_REVIVE = 523,
|
||||
RBAC_PERM_COMMAND_SAVEALL = 524,
|
||||
RBAC_PERM_COMMAND_SAVE = 525,
|
||||
RBAC_PERM_COMMAND_SETSKILL = 526,
|
||||
RBAC_PERM_COMMAND_SHOWAREA = 527,
|
||||
RBAC_PERM_COMMAND_SUMMON = 528,
|
||||
RBAC_PERM_COMMAND_UNAURA = 529,
|
||||
RBAC_PERM_COMMAND_UNBINDSIGHT = 530,
|
||||
RBAC_PERM_COMMAND_UNFREEZE = 531,
|
||||
RBAC_PERM_COMMAND_UNMUTE = 532,
|
||||
RBAC_PERM_COMMAND_UNPOSSESS = 533,
|
||||
RBAC_PERM_COMMAND_UNSTUCK = 534,
|
||||
RBAC_PERM_COMMAND_WCHANGE = 535,
|
||||
RBAC_PERM_COMMAND_MMAP = 536,
|
||||
RBAC_PERM_COMMAND_MMAP_LOADEDTILES = 537,
|
||||
RBAC_PERM_COMMAND_MMAP_LOC = 538,
|
||||
RBAC_PERM_COMMAND_MMAP_PATH = 539,
|
||||
RBAC_PERM_COMMAND_MMAP_STATS = 540,
|
||||
RBAC_PERM_COMMAND_MMAP_TESTAREA = 541,
|
||||
RBAC_PERM_COMMAND_MORPH = 542,
|
||||
RBAC_PERM_COMMAND_DEMORPH = 543,
|
||||
RBAC_PERM_COMMAND_MODIFY = 544,
|
||||
RBAC_PERM_COMMAND_MODIFY_ARENAPOINTS = 545,
|
||||
RBAC_PERM_COMMAND_MODIFY_BIT = 546,
|
||||
RBAC_PERM_COMMAND_MODIFY_DRUNK = 547,
|
||||
RBAC_PERM_COMMAND_MODIFY_ENERGY = 548,
|
||||
RBAC_PERM_COMMAND_MODIFY_FACTION = 549,
|
||||
RBAC_PERM_COMMAND_MODIFY_GENDER = 550,
|
||||
RBAC_PERM_COMMAND_MODIFY_HONOR = 551,
|
||||
RBAC_PERM_COMMAND_MODIFY_HP = 552,
|
||||
RBAC_PERM_COMMAND_MODIFY_MANA = 553,
|
||||
RBAC_PERM_COMMAND_MODIFY_MONEY = 554,
|
||||
RBAC_PERM_COMMAND_MODIFY_MOUNT = 555,
|
||||
RBAC_PERM_COMMAND_MODIFY_PHASE = 556,
|
||||
RBAC_PERM_COMMAND_MODIFY_RAGE = 557,
|
||||
RBAC_PERM_COMMAND_MODIFY_REPUTATION = 558,
|
||||
RBAC_PERM_COMMAND_MODIFY_RUNICPOWER = 559,
|
||||
RBAC_PERM_COMMAND_MODIFY_SCALE = 560,
|
||||
RBAC_PERM_COMMAND_MODIFY_SPEED = 561,
|
||||
RBAC_PERM_COMMAND_MODIFY_SPEED_ALL = 562,
|
||||
RBAC_PERM_COMMAND_MODIFY_SPEED_BACKWALK = 563,
|
||||
RBAC_PERM_COMMAND_MODIFY_SPEED_FLY = 564,
|
||||
RBAC_PERM_COMMAND_MODIFY_SPEED_WALK = 565,
|
||||
RBAC_PERM_COMMAND_MODIFY_SPEED_SWIM = 566,
|
||||
RBAC_PERM_COMMAND_MODIFY_SPELL = 567,
|
||||
RBAC_PERM_COMMAND_MODIFY_STANDSTATE = 568,
|
||||
RBAC_PERM_COMMAND_MODIFY_TALENTPOINTS = 569,
|
||||
RBAC_PERM_COMMAND_NPC_ADD = 571,
|
||||
RBAC_PERM_COMMAND_NPC_ADD_FORMATION = 572,
|
||||
RBAC_PERM_COMMAND_NPC_ADD_ITEM = 573,
|
||||
RBAC_PERM_COMMAND_NPC_ADD_MOVE = 574,
|
||||
RBAC_PERM_COMMAND_NPC_ADD_TEMP = 575,
|
||||
RBAC_PERM_COMMAND_NPC_DELETE = 576,
|
||||
RBAC_PERM_COMMAND_NPC_DELETE_ITEM = 577,
|
||||
RBAC_PERM_COMMAND_NPC_FOLLOW = 578,
|
||||
RBAC_PERM_COMMAND_NPC_FOLLOW_STOP = 579,
|
||||
RBAC_PERM_COMMAND_NPC_SET = 580,
|
||||
RBAC_PERM_COMMAND_NPC_SET_ALLOWMOVE = 581,
|
||||
RBAC_PERM_COMMAND_NPC_SET_ENTRY = 582,
|
||||
RBAC_PERM_COMMAND_NPC_SET_FACTIONID = 583,
|
||||
RBAC_PERM_COMMAND_NPC_SET_FLAG = 584,
|
||||
RBAC_PERM_COMMAND_NPC_SET_LEVEL = 585,
|
||||
RBAC_PERM_COMMAND_NPC_SET_LINK = 586,
|
||||
RBAC_PERM_COMMAND_NPC_SET_MODEL = 587,
|
||||
RBAC_PERM_COMMAND_NPC_SET_MOVETYPE = 588,
|
||||
RBAC_PERM_COMMAND_NPC_SET_PHASE = 589,
|
||||
RBAC_PERM_COMMAND_NPC_SET_SPAWNDIST = 590,
|
||||
RBAC_PERM_COMMAND_NPC_SET_SPAWNTIME = 591,
|
||||
RBAC_PERM_COMMAND_NPC_SET_DATA = 592,
|
||||
RBAC_PERM_COMMAND_NPC_INFO = 593,
|
||||
RBAC_PERM_COMMAND_NPC_NEAR = 594,
|
||||
RBAC_PERM_COMMAND_NPC_MOVE = 595,
|
||||
RBAC_PERM_COMMAND_NPC_PLAYEMOTE = 596,
|
||||
RBAC_PERM_COMMAND_NPC_SAY = 597,
|
||||
RBAC_PERM_COMMAND_NPC_TEXTEMOTE = 598,
|
||||
RBAC_PERM_COMMAND_NPC_WHISPER = 599,
|
||||
RBAC_PERM_COMMAND_NPC_YELL = 600,
|
||||
RBAC_PERM_COMMAND_NPC_TAME = 601,
|
||||
RBAC_PERM_COMMAND_QUEST = 602,
|
||||
RBAC_PERM_COMMAND_QUEST_ADD = 603,
|
||||
RBAC_PERM_COMMAND_QUEST_COMPLETE = 604,
|
||||
RBAC_PERM_COMMAND_QUEST_REMOVE = 605,
|
||||
RBAC_PERM_COMMAND_QUEST_REWARD = 606,
|
||||
RBAC_PERM_COMMAND_RELOAD = 607,
|
||||
RBAC_PERM_COMMAND_RELOAD_ACCESS_REQUIREMENT = 608,
|
||||
RBAC_PERM_COMMAND_RELOAD_ACHIEVEMENT_CRITERIA_DATA = 609,
|
||||
RBAC_PERM_COMMAND_RELOAD_ACHIEVEMENT_REWARD = 610,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL = 611,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_ACHIEVEMENT = 612,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_AREA = 613,
|
||||
RBAC_PERM_COMMAND_RELOAD_BROADCAST_TEXT = 614,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_GOSSIP = 615,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_ITEM = 616,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_LOCALES = 617,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_LOOT = 618,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_NPC = 619,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_QUEST = 620,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_SCRIPTS = 621,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_SPELL = 622,
|
||||
RBAC_PERM_COMMAND_RELOAD_AREATRIGGER_INVOLVEDRELATION = 623,
|
||||
RBAC_PERM_COMMAND_RELOAD_AREATRIGGER_TAVERN = 624,
|
||||
RBAC_PERM_COMMAND_RELOAD_AREATRIGGER_TELEPORT = 625,
|
||||
RBAC_PERM_COMMAND_RELOAD_AUCTIONS = 626,
|
||||
RBAC_PERM_COMMAND_RELOAD_AUTOBROADCAST = 627,
|
||||
RBAC_PERM_COMMAND_RELOAD_CONDITIONS = 629,
|
||||
RBAC_PERM_COMMAND_RELOAD_CONFIG = 630,
|
||||
RBAC_PERM_COMMAND_RELOAD_BATTLEGROUND_TEMPLATE = 631,
|
||||
RBAC_PERM_COMMAND_MUTEHISTORY = 632,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_LINKED_RESPAWN = 633,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_LOOT_TEMPLATE = 634,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_ONKILL_REPUTATION = 635,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_QUESTENDER = 636,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_QUESTSTARTER = 637,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_SUMMON_GROUPS = 638,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_TEMPLATE = 639,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_TEXT = 640,
|
||||
RBAC_PERM_COMMAND_RELOAD_DISABLES = 641,
|
||||
RBAC_PERM_COMMAND_RELOAD_DISENCHANT_LOOT_TEMPLATE = 642,
|
||||
RBAC_PERM_COMMAND_RELOAD_EVENT_SCRIPTS = 643,
|
||||
RBAC_PERM_COMMAND_RELOAD_FISHING_LOOT_TEMPLATE = 644,
|
||||
RBAC_PERM_COMMAND_RELOAD_GRAVEYARD_ZONE = 645,
|
||||
RBAC_PERM_COMMAND_RELOAD_GAME_TELE = 646,
|
||||
RBAC_PERM_COMMAND_RELOAD_GAMEOBJECT_QUESTENDER = 647,
|
||||
RBAC_PERM_COMMAND_RELOAD_GAMEOBJECT_QUEST_LOOT_TEMPLATE = 648,
|
||||
RBAC_PERM_COMMAND_RELOAD_GAMEOBJECT_QUESTSTARTER = 649,
|
||||
RBAC_PERM_COMMAND_RELOAD_GM_TICKETS = 650,
|
||||
RBAC_PERM_COMMAND_RELOAD_GOSSIP_MENU = 651,
|
||||
RBAC_PERM_COMMAND_RELOAD_GOSSIP_MENU_OPTION = 652,
|
||||
RBAC_PERM_COMMAND_RELOAD_ITEM_ENCHANTMENT_TEMPLATE = 653,
|
||||
RBAC_PERM_COMMAND_RELOAD_ITEM_LOOT_TEMPLATE = 654,
|
||||
RBAC_PERM_COMMAND_RELOAD_ITEM_SET_NAMES = 655,
|
||||
RBAC_PERM_COMMAND_RELOAD_LFG_DUNGEON_REWARDS = 656,
|
||||
RBAC_PERM_COMMAND_RELOAD_ACHIEVEMENT_REWARD_LOCALE = 657,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_TEMPLATE_LOCALE = 658,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_TEXT_LOCALE = 659,
|
||||
RBAC_PERM_COMMAND_RELOAD_GAMEOBJECT_TEMPLATE_LOCALE = 660,
|
||||
RBAC_PERM_COMMAND_RELOAD_GOSSIP_MENU_OPTION_LOCALE = 661,
|
||||
RBAC_PERM_COMMAND_RELOAD_ITEM_TEMPLATE_LOCALE = 662,
|
||||
RBAC_PERM_COMMAND_RELOAD_ITEM_SET_NAME_LOCALE = 663,
|
||||
RBAC_PERM_COMMAND_RELOAD_NPC_TEXT_LOCALE = 664,
|
||||
RBAC_PERM_COMMAND_RELOAD_PAGE_TEXT_LOCALE = 665,
|
||||
RBAC_PERM_COMMAND_RELOAD_POINTS_OF_INTEREST_LOCALE = 666,
|
||||
RBAC_PERM_COMMAND_RELOAD_QUEST_TEMPLATE_LOCALE = 667,
|
||||
RBAC_PERM_COMMAND_RELOAD_MAIL_LEVEL_REWARD = 668,
|
||||
RBAC_PERM_COMMAND_RELOAD_MAIL_LOOT_TEMPLATE = 669,
|
||||
RBAC_PERM_COMMAND_RELOAD_MILLING_LOOT_TEMPLATE = 670,
|
||||
RBAC_PERM_COMMAND_RELOAD_NPC_SPELLCLICK_SPELLS = 671,
|
||||
RBAC_PERM_COMMAND_RELOAD_TRAINER = 672,
|
||||
RBAC_PERM_COMMAND_RELOAD_NPC_VENDOR = 673,
|
||||
RBAC_PERM_COMMAND_RELOAD_PAGE_TEXT = 674,
|
||||
RBAC_PERM_COMMAND_RELOAD_PICKPOCKETING_LOOT_TEMPLATE = 675,
|
||||
RBAC_PERM_COMMAND_RELOAD_POINTS_OF_INTEREST = 676,
|
||||
RBAC_PERM_COMMAND_RELOAD_PROSPECTING_LOOT_TEMPLATE = 677,
|
||||
RBAC_PERM_COMMAND_RELOAD_QUEST_POI = 678,
|
||||
RBAC_PERM_COMMAND_RELOAD_QUEST_TEMPLATE = 679,
|
||||
RBAC_PERM_COMMAND_RELOAD_RBAC = 680,
|
||||
RBAC_PERM_COMMAND_RELOAD_REFERENCE_LOOT_TEMPLATE = 681,
|
||||
RBAC_PERM_COMMAND_RELOAD_RESERVED_NAME = 682,
|
||||
RBAC_PERM_COMMAND_RELOAD_REPUTATION_REWARD_RATE = 683,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPILLOVER_TEMPLATE = 684,
|
||||
RBAC_PERM_COMMAND_RELOAD_SKILL_DISCOVERY_TEMPLATE = 685,
|
||||
RBAC_PERM_COMMAND_RELOAD_SKILL_EXTRA_ITEM_TEMPLATE = 686,
|
||||
RBAC_PERM_COMMAND_RELOAD_SKILL_FISHING_BASE_LEVEL = 687,
|
||||
RBAC_PERM_COMMAND_RELOAD_SKINNING_LOOT_TEMPLATE = 688,
|
||||
RBAC_PERM_COMMAND_RELOAD_SMART_SCRIPTS = 689,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_REQUIRED = 690,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_AREA = 691,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_BONUS_DATA = 692,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_GROUP = 693,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_LEARN_SPELL = 694,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_LOOT_TEMPLATE = 695,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_LINKED_SPELL = 696,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_PET_AURAS = 697,
|
||||
RBAC_PERM_COMMAND_CHARACTER_CHANGEACCOUNT = 698,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_PROC = 699,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_TARGET_POSITION = 701,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_THREATS = 702,
|
||||
RBAC_PERM_COMMAND_RELOAD_SPELL_GROUP_STACK_RULES = 703,
|
||||
RBAC_PERM_COMMAND_RELOAD_ACORE_STRING = 704,
|
||||
RBAC_PERM_COMMAND_RELOAD_WAYPOINT_SCRIPTS = 706,
|
||||
RBAC_PERM_COMMAND_RELOAD_WAYPOINT_DATA = 707,
|
||||
RBAC_PERM_COMMAND_RELOAD_VEHICLE_ACCESSORY = 708,
|
||||
RBAC_PERM_COMMAND_RELOAD_VEHICLE_TEMPLATE_ACCESSORY = 709,
|
||||
RBAC_PERM_COMMAND_RESET = 710,
|
||||
RBAC_PERM_COMMAND_RESET_ACHIEVEMENTS = 711,
|
||||
RBAC_PERM_COMMAND_RESET_HONOR = 712,
|
||||
RBAC_PERM_COMMAND_RESET_LEVEL = 713,
|
||||
RBAC_PERM_COMMAND_RESET_SPELLS = 714,
|
||||
RBAC_PERM_COMMAND_RESET_STATS = 715,
|
||||
RBAC_PERM_COMMAND_RESET_TALENTS = 716,
|
||||
RBAC_PERM_COMMAND_RESET_ALL = 717,
|
||||
RBAC_PERM_COMMAND_SERVER = 718,
|
||||
RBAC_PERM_COMMAND_SERVER_CORPSES = 719,
|
||||
RBAC_PERM_COMMAND_SERVER_EXIT = 720,
|
||||
RBAC_PERM_COMMAND_SERVER_IDLERESTART = 721,
|
||||
RBAC_PERM_COMMAND_SERVER_IDLERESTART_CANCEL = 722,
|
||||
RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN = 723,
|
||||
RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN_CANCEL = 724,
|
||||
RBAC_PERM_COMMAND_SERVER_INFO = 725,
|
||||
RBAC_PERM_COMMAND_SERVER_PLIMIT = 726,
|
||||
RBAC_PERM_COMMAND_SERVER_RESTART = 727,
|
||||
RBAC_PERM_COMMAND_SERVER_RESTART_CANCEL = 728,
|
||||
RBAC_PERM_COMMAND_SERVER_SET = 729,
|
||||
RBAC_PERM_COMMAND_SERVER_SET_CLOSED = 730,
|
||||
RBAC_PERM_COMMAND_SERVER_SET_DIFFTIME = 731,
|
||||
RBAC_PERM_COMMAND_SERVER_SET_LOGLEVEL = 732,
|
||||
RBAC_PERM_COMMAND_SERVER_SET_MOTD = 733,
|
||||
RBAC_PERM_COMMAND_SERVER_SHUTDOWN = 734,
|
||||
RBAC_PERM_COMMAND_SERVER_SHUTDOWN_CANCEL = 735,
|
||||
RBAC_PERM_COMMAND_SERVER_MOTD = 736,
|
||||
RBAC_PERM_COMMAND_TELE = 737,
|
||||
RBAC_PERM_COMMAND_TELE_ADD = 738,
|
||||
RBAC_PERM_COMMAND_TELE_DEL = 739,
|
||||
RBAC_PERM_COMMAND_TELE_NAME = 740,
|
||||
RBAC_PERM_COMMAND_TELE_GROUP = 741,
|
||||
RBAC_PERM_COMMAND_TICKET = 742,
|
||||
RBAC_PERM_COMMAND_TICKET_ASSIGN = 743,
|
||||
RBAC_PERM_COMMAND_TICKET_CLOSE = 744,
|
||||
RBAC_PERM_COMMAND_TICKET_CLOSEDLIST = 745,
|
||||
RBAC_PERM_COMMAND_TICKET_COMMENT = 746,
|
||||
RBAC_PERM_COMMAND_TICKET_COMPLETE = 747,
|
||||
RBAC_PERM_COMMAND_TICKET_DELETE = 748,
|
||||
RBAC_PERM_COMMAND_TICKET_ESCALATE = 749,
|
||||
RBAC_PERM_COMMAND_TICKET_ESCALATEDLIST = 750,
|
||||
RBAC_PERM_COMMAND_TICKET_LIST = 751,
|
||||
RBAC_PERM_COMMAND_TICKET_ONLINELIST = 752,
|
||||
RBAC_PERM_COMMAND_TICKET_RESET = 753,
|
||||
RBAC_PERM_COMMAND_TICKET_RESPONSE = 754,
|
||||
RBAC_PERM_COMMAND_TICKET_RESPONSE_APPEND = 755,
|
||||
RBAC_PERM_COMMAND_TICKET_RESPONSE_APPENDLN = 756,
|
||||
RBAC_PERM_COMMAND_TICKET_TOGGLESYSTEM = 757,
|
||||
RBAC_PERM_COMMAND_TICKET_UNASSIGN = 758,
|
||||
RBAC_PERM_COMMAND_TICKET_VIEWID = 759,
|
||||
RBAC_PERM_COMMAND_TICKET_VIEWNAME = 760,
|
||||
RBAC_PERM_COMMAND_TITLES_ADD = 762,
|
||||
RBAC_PERM_COMMAND_TITLES_CURRENT = 763,
|
||||
RBAC_PERM_COMMAND_TITLES_REMOVE = 764,
|
||||
RBAC_PERM_COMMAND_TITLES_SET_MASK = 766,
|
||||
RBAC_PERM_COMMAND_WP = 767,
|
||||
RBAC_PERM_COMMAND_WP_ADD = 768,
|
||||
RBAC_PERM_COMMAND_WP_EVENT = 769,
|
||||
RBAC_PERM_COMMAND_WP_LOAD = 770,
|
||||
RBAC_PERM_COMMAND_WP_MODIFY = 771,
|
||||
RBAC_PERM_COMMAND_WP_UNLOAD = 772,
|
||||
RBAC_PERM_COMMAND_WP_RELOAD = 773,
|
||||
RBAC_PERM_COMMAND_WP_SHOW = 774,
|
||||
RBAC_PERM_COMMAND_MAILBOX = 777,
|
||||
RBAC_PERM_COMMAND_AHBOT_ITEMS = 779,
|
||||
RBAC_PERM_COMMAND_AHBOT_ITEMS_GRAY = 780,
|
||||
RBAC_PERM_COMMAND_AHBOT_ITEMS_WHITE = 781,
|
||||
RBAC_PERM_COMMAND_AHBOT_ITEMS_GREEN = 782,
|
||||
RBAC_PERM_COMMAND_AHBOT_ITEMS_BLUE = 783,
|
||||
RBAC_PERM_COMMAND_AHBOT_ITEMS_PURPLE = 784,
|
||||
RBAC_PERM_COMMAND_AHBOT_ITEMS_ORANGE = 785,
|
||||
RBAC_PERM_COMMAND_AHBOT_ITEMS_YELLOW = 786,
|
||||
RBAC_PERM_COMMAND_AHBOT_RATIO = 787,
|
||||
RBAC_PERM_COMMAND_AHBOT_RATIO_ALLIANCE = 788,
|
||||
RBAC_PERM_COMMAND_AHBOT_RATIO_HORDE = 789,
|
||||
RBAC_PERM_COMMAND_AHBOT_RATIO_NEUTRAL = 790,
|
||||
RBAC_PERM_COMMAND_AHBOT_REBUILD = 791,
|
||||
RBAC_PERM_COMMAND_AHBOT_RELOAD = 792,
|
||||
RBAC_PERM_COMMAND_AHBOT_STATUS = 793,
|
||||
RBAC_PERM_COMMAND_GUILD_INFO = 794,
|
||||
RBAC_PERM_COMMAND_INSTANCE_SET_BOSS_STATE = 795,
|
||||
RBAC_PERM_COMMAND_INSTANCE_GET_BOSS_STATE = 796,
|
||||
RBAC_PERM_COMMAND_PVPSTATS = 797,
|
||||
RBAC_PERM_COMMAND_MODIFY_XP = 798,
|
||||
RBAC_PERM_COMMAND_NPC_EVADE = 837,
|
||||
RBAC_PERM_COMMAND_PET_LEVEL = 838,
|
||||
RBAC_PERM_COMMAND_SERVER_SHUTDOWN_FORCE = 839,
|
||||
RBAC_PERM_COMMAND_SERVER_RESTART_FORCE = 840,
|
||||
RBAC_PERM_COMMAND_NEARGRAVEYARD = 841,
|
||||
RBAC_PERM_COMMAND_RELOAD_QUEST_GREETING = 843,
|
||||
RBAC_PERM_COMMAND_NPC_SPAWNGROUP = 856,
|
||||
RBAC_PERM_COMMAND_NPC_DESPAWNGROUP = 857,
|
||||
RBAC_PERM_COMMAND_GOBJECT_SPAWNGROUP = 858,
|
||||
RBAC_PERM_COMMAND_GOBJECT_DESPAWNGROUP = 859,
|
||||
RBAC_PERM_COMMAND_LIST_RESPAWNS = 860,
|
||||
RBAC_PERM_COMMAND_GROUP_SET = 861,
|
||||
RBAC_PERM_COMMAND_GROUP_ASSISTANT = 862,
|
||||
RBAC_PERM_COMMAND_GROUP_MAINTANK = 863,
|
||||
RBAC_PERM_COMMAND_GROUP_MAINASSIST = 864,
|
||||
RBAC_PERM_COMMAND_GROUP_REVIVE = 868,
|
||||
RBAC_PERM_COMMAND_NPC_SHOWLOOT = 865,
|
||||
RBAC_PERM_COMMAND_LIST_SPAWNPOINTS = 866,
|
||||
RBAC_PERM_COMMAND_RELOAD_QUEST_GREETING_LOCALE = 867,
|
||||
RBAC_PERM_COMMAND_SERVER_DEBUG = 872,
|
||||
RBAC_PERM_COMMAND_RELOAD_CREATURE_MOVEMENT_OVERRIDE = 873,
|
||||
RBAC_PERM_COMMAND_SETTINGS_ANNOUNCER = 874,
|
||||
RBAC_PERM_COMMAND_LOOKUP_MAP_ID = 875,
|
||||
RBAC_PERM_COMMAND_LOOKUP_ITEM_ID = 876,
|
||||
RBAC_PERM_COMMAND_LOOKUP_QUEST_ID = 877,
|
||||
RBAC_PERM_COMMAND_PDUMP_COPY = 880,
|
||||
RBAC_PERM_COMMAND_RELOAD_VEHICLE_TEMPLATE = 881,
|
||||
RBAC_PERM_COMMAND_BG_START = 884,
|
||||
RBAC_PERM_COMMAND_BG_STOP = 885,
|
||||
RBAC_PERM_COMMAND_ITEM_RESTORE = 886,
|
||||
RBAC_PERM_COMMAND_ITEM_RESTORE_LIST = 887,
|
||||
RBAC_PERM_COMMAND_ITEM_REFUND = 888,
|
||||
RBAC_PERM_COMMAND_COMMENTATOR = 889,
|
||||
RBAC_PERM_COMMAND_SKIRMISH = 890,
|
||||
RBAC_PERM_COMMAND_STRING = 891,
|
||||
RBAC_PERM_COMMAND_OPENDOOR = 892,
|
||||
RBAC_PERM_COMMAND_BEASTMASTER = 893,
|
||||
RBAC_PERM_COMMAND_PACKETLOG = 894,
|
||||
RBAC_PERM_COMMAND_AURA_STACK = 895,
|
||||
RBAC_PERM_COMMAND_RESPAWN_ALL = 896,
|
||||
RBAC_PERM_COMMAND_GEAR_REPAIR = 897,
|
||||
RBAC_PERM_COMMAND_GEAR_STATS = 898,
|
||||
RBAC_PERM_COMMAND_SPECT = 899,
|
||||
RBAC_PERM_COMMAND_SPECT_VERSION = 900,
|
||||
RBAC_PERM_COMMAND_SPECT_RESET = 901,
|
||||
RBAC_PERM_COMMAND_SPECT_SPECTATE = 902,
|
||||
RBAC_PERM_COMMAND_SPECT_WATCH = 903,
|
||||
RBAC_PERM_COMMAND_SPECT_LEAVE = 904,
|
||||
RBAC_PERM_COMMAND_ARENA_SEASON = 905,
|
||||
RBAC_PERM_COMMAND_ARENA_SEASON_REWARD = 906,
|
||||
RBAC_PERM_COMMAND_ARENA_SEASON_DELETETEAMS = 907,
|
||||
RBAC_PERM_COMMAND_ARENA_SEASON_START = 908,
|
||||
RBAC_PERM_COMMAND_CHARACTER_CHECK_BANK = 909,
|
||||
RBAC_PERM_COMMAND_CHARACTER_CHECK_BAG = 910,
|
||||
RBAC_PERM_COMMAND_CHARACTER_CHECK_PROFESSION = 911,
|
||||
RBAC_PERM_COMMAND_GOBJECT_LOAD = 912,
|
||||
RBAC_PERM_COMMAND_BF_QUEUE = 913,
|
||||
// custom permissions 1000+
|
||||
RBAC_PERM_MAX
|
||||
};
|
||||
|
||||
enum RBACCommandResult
|
||||
{
|
||||
RBAC_OK,
|
||||
RBAC_CANT_ADD_ALREADY_ADDED,
|
||||
RBAC_CANT_REVOKE_NOT_IN_LIST,
|
||||
RBAC_IN_GRANTED_LIST,
|
||||
RBAC_IN_DENIED_LIST,
|
||||
RBAC_ID_DOES_NOT_EXISTS
|
||||
};
|
||||
|
||||
typedef std::set<uint32> RBACPermissionContainer;
|
||||
|
||||
class AC_GAME_API RBACPermission
|
||||
{
|
||||
public:
|
||||
RBACPermission(uint32 id = 0, std::string const& name = ""):
|
||||
_id(id), _name(name), _perms() { }
|
||||
|
||||
/// Gets the Name of the Object
|
||||
std::string const& GetName() const { return _name; }
|
||||
/// Gets the Id of the Object
|
||||
uint32 GetId() const { return _id; }
|
||||
|
||||
/// Gets the Permissions linked to this permission
|
||||
RBACPermissionContainer const& GetLinkedPermissions() const { return _perms; }
|
||||
/// Adds a new linked Permission
|
||||
void AddLinkedPermission(uint32 id) { _perms.insert(id); }
|
||||
/// Removes a linked Permission
|
||||
void RemoveLinkedPermission(uint32 id) { _perms.erase(id); }
|
||||
|
||||
private:
|
||||
uint32 _id; ///> id of the object
|
||||
std::string _name; ///> name of the object
|
||||
RBACPermissionContainer _perms; ///> Set of permissions
|
||||
};
|
||||
|
||||
/**
|
||||
* @name RBACData
|
||||
* @brief Contains all needed information about the account
|
||||
*
|
||||
* This class contains all the data needed to calculate the account permissions.
|
||||
* RBACData is formed by granted and denied permissions and all the inherited permissions
|
||||
*
|
||||
* Calculation of current Permissions: Granted permissions - Denied permissions
|
||||
* - Granted permissions: through linked permissions and directly assigned
|
||||
* - Denied permissions: through linked permissions and directly assigned
|
||||
*/
|
||||
class AC_GAME_API RBACData
|
||||
{
|
||||
public:
|
||||
RBACData(uint32 id, std::string const& name, int32 realmId, uint8 secLevel = 255):
|
||||
_id(id), _name(name), _realmId(realmId), _secLevel(secLevel),
|
||||
_grantedPerms(), _deniedPerms(), _globalPerms() { }
|
||||
|
||||
/// Gets the Name of the Object
|
||||
std::string const& GetName() const { return _name; }
|
||||
/// Gets the Id of the Object
|
||||
uint32 GetId() const { return _id; }
|
||||
|
||||
/**
|
||||
* @name HasPermission
|
||||
* @brief Checks if certain action is allowed
|
||||
*
|
||||
* @return grant or deny action
|
||||
*/
|
||||
bool HasPermission(uint32 permission) const
|
||||
{
|
||||
return _globalPerms.find(permission) != _globalPerms.end();
|
||||
}
|
||||
|
||||
// Functions enabled to be used by command system
|
||||
/// Returns all the granted permissions (after computation)
|
||||
RBACPermissionContainer const& GetPermissions() const { return _globalPerms; }
|
||||
/// Returns all the granted permissions
|
||||
RBACPermissionContainer const& GetGrantedPermissions() const { return _grantedPerms; }
|
||||
/// Returns all the denied permissions
|
||||
RBACPermissionContainer const& GetDeniedPermissions() const { return _deniedPerms; }
|
||||
|
||||
/**
|
||||
* @name GrantPermission
|
||||
* @brief Grants a permission
|
||||
*
|
||||
* @param permissionId permission to be granted
|
||||
* @param realmId realm affected
|
||||
*
|
||||
* @return Success or failure (with reason) to grant the permission
|
||||
*/
|
||||
RBACCommandResult GrantPermission(uint32 permissionId, int32 realmId = 0);
|
||||
|
||||
/**
|
||||
* @name DenyPermission
|
||||
* @brief Denies a permission
|
||||
*
|
||||
* @param permissionId permission to be denied
|
||||
* @param realmId realm affected
|
||||
*
|
||||
* @return Success or failure (with reason) to deny the permission
|
||||
*/
|
||||
RBACCommandResult DenyPermission(uint32 permissionId, int32 realmId = 0);
|
||||
|
||||
/**
|
||||
* @name RevokePermission
|
||||
* @brief Removes a permission
|
||||
*
|
||||
* @param permissionId permission to be removed
|
||||
* @param realmId realm affected
|
||||
*
|
||||
* @return Success or failure (with reason) to remove the permission
|
||||
*/
|
||||
RBACCommandResult RevokePermission(uint32 permissionId, int32 realmId = 0);
|
||||
|
||||
/// Loads all permissions assigned to current account
|
||||
void LoadFromDB();
|
||||
QueryCallback LoadFromDBAsync();
|
||||
void LoadFromDBCallback(PreparedQueryResult result);
|
||||
|
||||
/// Sets security level
|
||||
void SetSecurityLevel(uint8 id)
|
||||
{
|
||||
_secLevel = id;
|
||||
LoadFromDB();
|
||||
}
|
||||
|
||||
/// Returns the security level assigned
|
||||
uint8 GetSecurityLevel() const { return _secLevel; }
|
||||
|
||||
/// For unit testing - forces permission recalculation without database
|
||||
void RecalculatePermissions() { CalculateNewPermissions(); }
|
||||
|
||||
/// For unit testing - sets security level without database reload
|
||||
void SetSecurityLevelForTest(uint8 id) { _secLevel = id; }
|
||||
|
||||
private:
|
||||
/// Saves a permission to DB, Granted or Denied
|
||||
void SavePermission(uint32 role, bool granted, int32 realm);
|
||||
/// Clears roles, groups and permissions - Used for reload
|
||||
void ClearData();
|
||||
|
||||
/**
|
||||
* @name CalculateNewPermissions
|
||||
* @brief Calculates new permissions
|
||||
*
|
||||
* Calculates new permissions after some change
|
||||
* The calculation is done Granted - Denied:
|
||||
* - Granted permissions: through linked permissions and directly assigned
|
||||
* - Denied permissions: through linked permissions and directly assigned
|
||||
*/
|
||||
void CalculateNewPermissions();
|
||||
|
||||
int32 GetRealmId() const { return _realmId; }
|
||||
|
||||
/// Checks if a permission is granted
|
||||
bool HasGrantedPermission(uint32 permissionId) const
|
||||
{
|
||||
return _grantedPerms.find(permissionId) != _grantedPerms.end();
|
||||
}
|
||||
|
||||
/// Checks if a permission is denied
|
||||
bool HasDeniedPermission(uint32 permissionId) const
|
||||
{
|
||||
return _deniedPerms.find(permissionId) != _deniedPerms.end();
|
||||
}
|
||||
|
||||
/// Adds a new granted permission
|
||||
void AddGrantedPermission(uint32 permissionId)
|
||||
{
|
||||
_grantedPerms.insert(permissionId);
|
||||
}
|
||||
|
||||
/// Removes a granted permission
|
||||
void RemoveGrantedPermission(uint32 permissionId)
|
||||
{
|
||||
_grantedPerms.erase(permissionId);
|
||||
}
|
||||
|
||||
/// Adds a new denied permission
|
||||
void AddDeniedPermission(uint32 permissionId)
|
||||
{
|
||||
_deniedPerms.insert(permissionId);
|
||||
}
|
||||
|
||||
/// Removes a denied permission
|
||||
void RemoveDeniedPermission(uint32 permissionId)
|
||||
{
|
||||
_deniedPerms.erase(permissionId);
|
||||
}
|
||||
|
||||
/// Adds a list of permissions to another list
|
||||
void AddPermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo);
|
||||
|
||||
/// Removes a list of permissions from another list
|
||||
void RemovePermissions(RBACPermissionContainer& permsFrom, RBACPermissionContainer const& permsToRemove);
|
||||
|
||||
/**
|
||||
* @name ExpandPermissions
|
||||
* @brief Adds the list of linked permissions to the original list
|
||||
*
|
||||
* @param permissions The list of permissions to expand
|
||||
*/
|
||||
void ExpandPermissions(RBACPermissionContainer& permissions);
|
||||
|
||||
uint32 _id; ///> Account id
|
||||
std::string _name; ///> Account name
|
||||
int32 _realmId; ///> RealmId Affected
|
||||
uint8 _secLevel; ///> Account SecurityLevel
|
||||
RBACPermissionContainer _grantedPerms; ///> Granted permissions
|
||||
RBACPermissionContainer _deniedPerms; ///> Denied permissions
|
||||
RBACPermissionContainer _globalPerms; ///> Calculated permissions
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user