From 722a6c143ae9adbab020df4bae4495e612a677ee Mon Sep 17 00:00:00 2001 From: Ascathor Date: Thu, 25 Jul 2013 01:49:04 +0200 Subject: [PATCH 01/29] Core/Account: Make account password change security variable and various changes Settings within worldserver.conf: Three settings for secruity level: 0 - None - No change to current system 1 - Email - Always requires the email entered on registration for confirming. 2 - RBAC - Groups applied with the RBAC role always require the email entered on registration for confirming. RBAC default to every group. Changed some logs to make it more clear what is going on at all. Emails may now no longer exceed 64 chars. Current email is used as regmail. On account creation, two emails are saved. Registration email and normal email. Normal email is relevant afterwards. Registration email can be changed by console ONLY. Includes new commands and changes to existing ones: .account fulfills several new functions: * Still prints GM Level. * If account has permission, it displays the current email. This is not defaulted to any group. * Security level is displayed. Also displays if user has RBAC perm if RBAC security mode is selected .account email allows user to change email with sufficient confirmation .account set sec email allows higher sec with higher sec than account to change the normal email. Registrationemail remains untouched here. .account set sec regmail allows console to change registration email. .pinfo now displays the registration and normal mail. Also fixes .learn all crafts. Closes #10558 --- sql/base/auth_database.sql | 11 +- sql/updates/auth/2013_08_17_00_auth_rbac.sql | 35 ++ sql/updates/auth/2013_09_01_00_auth_misc.sql | 34 ++ .../2013_08_19_00_world_trinity_strings.sql | 26 ++ src/server/game/Accounts/AccountMgr.cpp | 85 ++++- src/server/game/Accounts/AccountMgr.h | 17 +- src/server/game/Accounts/RBAC.h | 8 +- src/server/game/Miscellaneous/Language.h | 13 +- src/server/game/World/World.cpp | 3 + src/server/game/World/World.h | 1 + src/server/scripts/Commands/cs_account.cpp | 358 ++++++++++++++++-- src/server/scripts/Commands/cs_learn.cpp | 8 +- src/server/scripts/Commands/cs_misc.cpp | 60 +-- .../Database/Implementation/LoginDatabase.cpp | 7 +- .../Database/Implementation/LoginDatabase.h | 3 + src/server/worldserver/worldserver.conf.dist | 11 +- 16 files changed, 612 insertions(+), 68 deletions(-) create mode 100644 sql/updates/auth/2013_08_17_00_auth_rbac.sql create mode 100644 sql/updates/auth/2013_09_01_00_auth_misc.sql create mode 100644 sql/updates/world/2013_08_19_00_world_trinity_strings.sql diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 77f997a1718..2f52b5f33f2 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -30,7 +30,8 @@ CREATE TABLE `account` ( `v` varchar(64) NOT NULL DEFAULT '', `s` varchar(64) NOT NULL DEFAULT '', `token_key` varchar(100) NOT NULL DEFAULT '', - `email` varchar(254) NOT NULL DEFAULT '', + `email` varchar(255) NOT NULL DEFAULT '', + `reg_mail` varchar(255) NOT NULL DEFAULT '', `joindate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `last_ip` varchar(15) NOT NULL DEFAULT '127.0.0.1', `failed_logins` int(10) unsigned NOT NULL DEFAULT '0', @@ -307,7 +308,7 @@ CREATE TABLE `rbac_group_roles` ( LOCK TABLES `rbac_group_roles` WRITE; /*!40000 ALTER TABLE `rbac_group_roles` DISABLE KEYS */; -INSERT INTO `rbac_group_roles` VALUES (1,1),(2,2),(3,3),(4,4),(2,5),(1,6),(1,7),(2,8),(3,8),(4,8),(2,9),(3,9),(4,9),(2,10),(3,10),(4,10),(2,11),(3,11),(4,11),(2,12),(3,12),(4,12),(2,13),(3,13),(4,13),(2,14),(3,14),(4,14),(2,15),(3,15),(4,15),(2,16),(3,16),(4,16),(2,17),(3,17),(4,17),(4,18),(2,19),(3,19),(4,19),(2,20),(3,20),(4,20),(2,21),(3,21),(4,21),(2,22),(3,22),(4,22),(4,23),(2,24),(3,24),(4,24),(2,25),(3,25),(4,25),(2,26),(3,26),(4,26),(2,27),(3,27),(4,27),(2,28),(3,28),(4,28),(2,29),(3,29),(4,29),(2,30),(3,30),(4,30),(2,32),(3,32),(4,32),(2,33),(3,33),(4,33),(1,34),(2,35),(3,35),(4,35),(2,36),(3,36),(4,36),(2,37),(3,37),(4,37),(2,38),(3,38),(4,38),(3,39),(4,39); +INSERT INTO `rbac_group_roles` VALUES (1,1),(2,2),(3,3),(4,4),(2,5),(1,6),(1,7),(2,8),(3,8),(4,8),(2,9),(3,9),(4,9),(2,10),(3,10),(4,10),(2,11),(3,11),(4,11),(2,12),(3,12),(4,12),(2,13),(3,13),(4,13),(2,14),(3,14),(4,14),(2,15),(3,15),(4,15),(2,16),(3,16),(4,16),(2,17),(3,17),(4,17),(4,18),(2,19),(3,19),(4,19),(2,20),(3,20),(4,20),(2,21),(3,21),(4,21),(2,22),(3,22),(4,22),(4,23),(2,24),(3,24),(4,24),(2,25),(3,25),(4,25),(2,26),(3,26),(4,26),(2,27),(3,27),(4,27),(2,28),(3,28),(4,28),(2,29),(3,29),(4,29),(2,30),(3,30),(4,30),(2,32),(3,32),(4,32),(2,33),(3,33),(4,33),(1,34),(2,35),(3,35),(4,35),(2,36),(3,36),(4,36),(2,37),(3,37),(4,37),(2,38),(3,38),(4,38),(3,39),(4,39),(1,40),(2,40),(3,40),(4,40); /*!40000 ALTER TABLE `rbac_group_roles` ENABLE KEYS */; UNLOCK TABLES; @@ -355,7 +356,7 @@ CREATE TABLE `rbac_permissions` ( LOCK TABLES `rbac_permissions` WRITE; /*!40000 ALTER TABLE `rbac_permissions` DISABLE KEYS */; -INSERT INTO `rbac_permissions` VALUES (1,'Instant logout'),(2,'Skip Queue'),(3,'Join Normal Battleground'),(4,'Join Random Battleground'),(5,'Join Arenas'),(6,'Join Dungeon Finder'),(7,'Player Commands (Temporal till commands moved to rbac)'),(8,'Moderator Commands (Temporal till commands moved to rbac)'),(9,'GameMaster Commands (Temporal till commands moved to rbac)'),(10,'Administrator Commands (Temporal till commands moved to rbac)'),(11,'Log GM trades'),(13,'Skip Instance required bosses check'),(14,'Skip character creation team mask check'),(15,'Skip character creation class mask check'),(16,'Skip character creation race mask check'),(17,'Skip character creation reserved name check'),(18,'Skip character creation heroic min level check'),(19,'Skip needed requirements to use channel check'),(20,'Skip disable map check'),(21,'Skip reset talents when used more than allowed check'),(22,'Skip spam chat check'),(23,'Skip over-speed ping check'),(24,'Two side faction characters on the same account'),(25,'Allow say chat between factions'),(26,'Allow channel chat between factions'),(27,'Two side mail interaction'),(28,'See two side who list'),(29,'Add friends of other faction'),(30,'Save character without delay with .save command'),(31,'Use params with .unstuck command'),(32,'Can be assigned tickets with .assign ticket command'),(33,'Notify if a command was not found'),(34,'Check if should appear in list using .gm ingame command'),(35,'See all security levels with who command'),(36,'Filter whispers'),(37,'Use staff badge in chat'),(38,'Resurrect with full Health Points'),(39,'Restore saved gm setting states'),(40,'Allows to add a gm to friend list'),(41,'Use Config option START_GM_LEVEL to assign new character level'),(42,'Allows to use CMSG_WORLD_TELEPORT opcode'),(43,'Allows to use CMSG_WHOIS opcode'),(44,'Receive global GM messages/texts'),(45,'Join channels without announce'),(46,'Change channel settings without being channel moderator'),(47,'Enables lower security than target check'),(48,'Enable IP, Last Login and EMail output in pinfo'); +INSERT INTO `rbac_permissions` VALUES (1,'Instant logout'),(2,'Skip Queue'),(3,'Join Normal Battleground'),(4,'Join Random Battleground'),(5,'Join Arenas'),(6,'Join Dungeon Finder'),(7,'Player Commands (Temporal till commands moved to rbac)'),(8,'Moderator Commands (Temporal till commands moved to rbac)'),(9,'GameMaster Commands (Temporal till commands moved to rbac)'),(10,'Administrator Commands (Temporal till commands moved to rbac)'),(11,'Log GM trades'),(13,'Skip Instance required bosses check'),(14,'Skip character creation team mask check'),(15,'Skip character creation class mask check'),(16,'Skip character creation race mask check'),(17,'Skip character creation reserved name check'),(18,'Skip character creation heroic min level check'),(19,'Skip needed requirements to use channel check'),(20,'Skip disable map check'),(21,'Skip reset talents when used more than allowed check'),(22,'Skip spam chat check'),(23,'Skip over-speed ping check'),(24,'Two side faction characters on the same account'),(25,'Allow say chat between factions'),(26,'Allow channel chat between factions'),(27,'Two side mail interaction'),(28,'See two side who list'),(29,'Add friends of other faction'),(30,'Save character without delay with .save command'),(31,'Use params with .unstuck command'),(32,'Can be assigned tickets with .assign ticket command'),(33,'Notify if a command was not found'),(34,'Check if should appear in list using .gm ingame command'),(35,'See all security levels with who command'),(36,'Filter whispers'),(37,'Use staff badge in chat'),(38,'Resurrect with full Health Points'),(39,'Restore saved gm setting states'),(40,'Allows to add a gm to friend list'),(41,'Use Config option START_GM_LEVEL to assign new character level'),(42,'Allows to use CMSG_WORLD_TELEPORT opcode'),(43,'Allows to use CMSG_WHOIS opcode'),(44,'Receive global GM messages/texts'),(45,'Join channels without announce'),(46,'Change channel settings without being channel moderator'),(47,'Enables lower security than target check'),(48,'Enable IP, Last Login and EMail output in pinfo'),(49,'Forces to enter the email for confirmation on password change'),(50,'Allow user to check his own email with .account'); /*!40000 ALTER TABLE `rbac_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -382,7 +383,7 @@ CREATE TABLE `rbac_role_permissions` ( LOCK TABLES `rbac_role_permissions` WRITE; /*!40000 ALTER TABLE `rbac_role_permissions` DISABLE KEYS */; -INSERT INTO `rbac_role_permissions` VALUES (5,1),(5,2),(6,3),(6,4),(6,5),(7,6),(1,7),(2,8),(3,9),(4,10),(8,11),(9,13),(33,14),(33,15),(33,16),(33,17),(33,18),(27,19),(22,20),(23,21),(24,22),(17,23),(34,24),(28,25),(30,26),(19,27),(35,28),(36,29),(11,30),(12,31),(10,32),(20,33),(14,34),(37,35),(29,36),(15,37),(13,38),(25,39),(38,40),(26,41),(18,42),(18,43),(16,44),(31,45),(32,46),(21,47),(39,48); +INSERT INTO `rbac_role_permissions` VALUES (5,1),(5,2),(6,3),(6,4),(6,5),(7,6),(1,7),(2,8),(3,9),(4,10),(8,11),(9,13),(33,14),(33,15),(33,16),(33,17),(33,18),(27,19),(22,20),(23,21),(24,22),(17,23),(34,24),(28,25),(30,26),(19,27),(35,28),(36,29),(11,30),(12,31),(10,32),(20,33),(14,34),(37,35),(29,36),(15,37),(13,38),(25,39),(38,40),(26,41),(18,42),(18,43),(16,44),(31,45),(32,46),(21,47),(39,48),(40,49), (41,50); /*!40000 ALTER TABLE `rbac_role_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -406,7 +407,7 @@ CREATE TABLE `rbac_roles` ( LOCK TABLES `rbac_roles` WRITE; /*!40000 ALTER TABLE `rbac_roles` DISABLE KEYS */; -INSERT INTO `rbac_roles` VALUES (1,'Player Commands'),(2,'Moderator Commands'),(3,'GameMaster Commands'),(4,'Administrator Commands'),(5,'Quick Login/Logout'),(6,'Use Battleground/Arenas'),(7,'Use Dungeon Finder'),(8,'Log GM trades'),(9,'Skip Instance required bosses check'),(10,'Ticket management'),(11,'Instant .save'),(12,'Allow params with .unstuck'),(13,'Full HP after resurrect'),(14,'Appear in GM ingame list'),(15,'Use staff badge in chat'),(16,'Receive global GM messages/texts'),(17,'Skip over-speed ping check'),(18,'Allows Admin Opcodes'),(19,'Two side mail interaction'),(20,'Notify if a command was not found'),(21,'Enables lower security than target check'),(22,'Skip disable map check'),(23,'Skip reset talents when used more than allowed check'),(24,'Skip spam chat check'),(25,'Restore saved gm setting states'),(26,'Use Config option START_GM_LEVEL to assign new character level'),(27,'Skip needed requirements to use channel check'),(28,'Allow say chat between factions'),(29,'Filter whispers'),(30,'Allow channel chat between factions'),(31,'Join channels without announce'),(32,'Change channel settings without being channel moderator'),(33,'Skip character creation checks'),(34,'Two side faction characters on the same account'),(35,'See two side who list'),(36,'Add friends of other faction'),(37,'See all security levels with who command'),(38,'Allows to add a gm to friend list'),(39,'Enable IP, Last Login and EMail output in pinfo'); +INSERT INTO `rbac_roles` VALUES (1,'Player Commands'),(2,'Moderator Commands'),(3,'GameMaster Commands'),(4,'Administrator Commands'),(5,'Quick Login/Logout'),(6,'Use Battleground/Arenas'),(7,'Use Dungeon Finder'),(8,'Log GM trades'),(9,'Skip Instance required bosses check'),(10,'Ticket management'),(11,'Instant .save'),(12,'Allow params with .unstuck'),(13,'Full HP after resurrect'),(14,'Appear in GM ingame list'),(15,'Use staff badge in chat'),(16,'Receive global GM messages/texts'),(17,'Skip over-speed ping check'),(18,'Allows Admin Opcodes'),(19,'Two side mail interaction'),(20,'Notify if a command was not found'),(21,'Enables lower security than target check'),(22,'Skip disable map check'),(23,'Skip reset talents when used more than allowed check'),(24,'Skip spam chat check'),(25,'Restore saved gm setting states'),(26,'Use Config option START_GM_LEVEL to assign new character level'),(27,'Skip needed requirements to use channel check'),(28,'Allow say chat between factions'),(29,'Filter whispers'),(30,'Allow channel chat between factions'),(31,'Join channels without announce'),(32,'Change channel settings without being channel moderator'),(33,'Skip character creation checks'),(34,'Two side faction characters on the same account'),(35,'See two side who list'),(36,'Add friends of other faction'),(37,'See all security levels with who command'),(38,'Allows to add a gm to friend list'),(39,'Enable IP, Last Login and EMail output in pinfo'),(40,'Forces to enter the email for confirmation on password change'),(41,'Allow user to check his own email with .account'); /*!40000 ALTER TABLE `rbac_roles` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/2013_08_17_00_auth_rbac.sql b/sql/updates/auth/2013_08_17_00_auth_rbac.sql new file mode 100644 index 00000000000..14c219deaf4 --- /dev/null +++ b/sql/updates/auth/2013_08_17_00_auth_rbac.sql @@ -0,0 +1,35 @@ +ALTER TABLE `account` + ADD COLUMN `reg_mail` VARCHAR(255) NOT NULL DEFAULT '' AFTER `s`; + +UPDATE `account` SET reg_mail = email; + +DELETE FROM `rbac_permissions` WHERE `id` = 49; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (49, 'Forces to enter the email for confirmation on password change'); + +DELETE FROM `rbac_roles` WHERE `id` = 40; +INSERT INTO `rbac_roles` (`id`, `name`) VALUES (40, 'Forces to enter the email for confirmation on password change'); + +DELETE FROM `rbac_role_permissions` WHERE `roleId` = 40 AND `permissionId` = 49; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES (40, 49); + +DELETE FROM `rbac_group_roles` WHERE `groupId` = 1 AND `roleId` = 40; +INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES (1, 40); + +DELETE FROM `rbac_group_roles` WHERE `groupId` = 2 AND `roleId` = 40; +INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES (2, 40); + +DELETE FROM `rbac_group_roles` WHERE `groupId` = 3 AND `roleId` = 40; +INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES (3, 40); + +DELETE FROM `rbac_group_roles` WHERE `groupId` = 4 AND `roleId` = 40; +INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES (4, 40); + +DELETE FROM `rbac_permissions` WHERE `id` = 50; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (50, 'Allow user to check his own email with .account'); + +DELETE FROM `rbac_roles` WHERE `id` = 41; +INSERT INTO `rbac_roles` (`id`, `name`) VALUES (41, 'Allow user to check his own email with .account'); + +DELETE FROM `rbac_role_permissions` WHERE `roleId` = 41 AND `permissionId` = 50; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES (41, 50); + diff --git a/sql/updates/auth/2013_09_01_00_auth_misc.sql b/sql/updates/auth/2013_09_01_00_auth_misc.sql new file mode 100644 index 00000000000..5a48a4233ba --- /dev/null +++ b/sql/updates/auth/2013_09_01_00_auth_misc.sql @@ -0,0 +1,34 @@ +/* account email */ +SET @amail = 263; + +-- Add new permissions for account mail +DELETE FROM `rbac_permissions` WHERE `id` = @amail; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@amail, 'account email'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` = @amail; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(1, @amail), +(2, @amail), +(3, @amail), +(4, @amail); + + +/* account set sec email + account set sec regmail */ +SET @setsec = 264; + +-- Add new permissions for account set sec +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @setsec AND @setsec+2; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@setsec+0, 'account set sec'), +(@setsec+1, 'account set sec email'), +(@setsec+2, 'account set sec regmail'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @setsec AND @setsec+2; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @setsec+0), +(4, @setsec+1), +(4, @setsec+2); diff --git a/sql/updates/world/2013_08_19_00_world_trinity_strings.sql b/sql/updates/world/2013_08_19_00_world_trinity_strings.sql new file mode 100644 index 00000000000..7dd8bb89ee6 --- /dev/null +++ b/sql/updates/world/2013_08_19_00_world_trinity_strings.sql @@ -0,0 +1,26 @@ +DELETE FROM `trinity_string` WHERE entry IN (749, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881); +INSERT INTO `trinity_string` (entry, content_default, content_loc1, content_loc2, content_loc3, content_loc4, content_loc5, content_loc6, content_loc7, content_loc8) VALUES +(749,'│ OS: %s - Latency: %u ms', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(872, 'Entered email is not equal to registration email, check input', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(873, 'The new emails do not match', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(874, 'The email was changed', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(875, 'Your email can''t be longer than 64 characters, email not changed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(876, 'Email not changed (unknown error)!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(877, 'Email change unnecessary, new email is equal to old email', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(878, 'Your email is: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(879, '│ Registration Email: %s - Email: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(880, 'Security Level: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(881, 'You require an email to change your password.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +UPDATE `command` SET help = 'Syntax: .account password $old_password $new_password $new_password [$email]\r\n\r\nChange your account password. You may need to check the actual security mode to see if email input is necessary.' WHERE name = 'account password'; + +UPDATE `command` SET help = 'Syntax: .account\r\n\r\nDisplay the access level of your account and the email adress if you possess the necessary permissions.' WHERE name = 'account'; + +DELETE FROM `command` WHERE name = 'account email'; +INSERT INTO `command` (name, security, help) VALUES ('account email', 0, 'Syntax: .account email $oldemail $currentpassword $newemail $newemailconfirmation\r\n\r\n Change your account email. You may need to check the actual security mode to see if email input is necessary for password change'); + +DELETE FROM `command` WHERE name = 'account set sec email'; +INSERT INTO `command` (name, security, help) VALUES ('account set sec email', 3, 'Syntax: .account set sec email $accountname $email $emailconfirmation\r\n\r\nSet the email for entered player account.'); + +DELETE FROM `command` WHERE name = 'account set sec regmail'; +INSERT INTO `command` (name, security, help) VALUES ('account set sec regmail', 4, 'Syntax: .account set sec regmail $account $regmail $regmailconfirmation\r\n\r\nSets the regmail for entered player account.'); diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index a9f178685d9..819a3b85fe6 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -34,21 +34,24 @@ AccountMgr::~AccountMgr() ClearRBAC(); } -AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password) +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 normalizeString(username); normalizeString(password); + normalizeString(email); if (GetId(username)) - return AOR_NAME_ALREDY_EXIST; // username does already exist + return AOR_NAME_ALREADY_EXIST; // username does already exist PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT); stmt->setString(0, username); stmt->setString(1, CalculateShaPassHash(username, password)); + stmt->setString(2, email); + stmt->setString(3, email); LoginDatabase.DirectExecute(stmt); // Enforce saving, otherwise AddGroup can fail @@ -202,6 +205,52 @@ AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPass return AOR_OK; } +AccountOpResult AccountMgr::ChangeEmail(uint32 accountId, std::string newEmail) +{ + std::string username; + + if (!GetName(accountId, username)) + return AOR_NAME_NOT_EXIST; // account doesn't exist + + if (utf8length(newEmail) > MAX_EMAIL_STR) + return AOR_EMAIL_TOO_LONG; + + normalizeString(username); + normalizeString(newEmail); + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_EMAIL); + + stmt->setString(0, newEmail); + stmt->setUInt32(1, accountId); + + LoginDatabase.Execute(stmt); + + return AOR_OK; +} + +AccountOpResult AccountMgr::ChangeRegEmail(uint32 accountId, std::string newEmail) +{ + std::string username; + + if (!GetName(accountId, username)) + return AOR_NAME_NOT_EXIST; // account doesn't exist + + if (utf8length(newEmail) > MAX_EMAIL_STR) + return AOR_EMAIL_TOO_LONG; + + normalizeString(username); + normalizeString(newEmail); + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_REG_EMAIL); + + stmt->setString(0, newEmail); + stmt->setUInt32(1, accountId); + + LoginDatabase.Execute(stmt); + + return AOR_OK; +} + uint32 AccountMgr::GetId(std::string const& username) { PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ID_BY_USERNAME); @@ -245,6 +294,21 @@ bool AccountMgr::GetName(uint32 accountId, std::string& name) return false; } +bool AccountMgr::GetEmail(uint32 accountId, std::string& email) +{ + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_EMAIL_BY_ID); + stmt->setUInt32(0, accountId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + + if (result) + { + email = (*result)[0].GetString(); + return true; + } + + return false; +} + bool AccountMgr::CheckPassword(uint32 accountId, std::string password) { std::string username; @@ -263,6 +327,23 @@ bool AccountMgr::CheckPassword(uint32 accountId, std::string password) return (result) ? true : false; } +bool AccountMgr::CheckEmail(uint32 accountId, std::string newEmail) +{ + std::string oldEmail; + + // We simply return false for a non-existing email + if (!GetEmail(accountId, oldEmail)) + return false; + + normalizeString(oldEmail); + normalizeString(newEmail); + + if (strcmp(oldEmail.c_str(), newEmail.c_str()) == 0) + return true; + + return false; +} + uint32 AccountMgr::GetCharactersCount(uint32 accountId) { // check character count diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h index 878ecde24f9..92c1e2292d0 100644 --- a/src/server/game/Accounts/AccountMgr.h +++ b/src/server/game/Accounts/AccountMgr.h @@ -27,12 +27,21 @@ enum AccountOpResult AOR_OK, AOR_NAME_TOO_LONG, AOR_PASS_TOO_LONG, - AOR_NAME_ALREDY_EXIST, + AOR_EMAIL_TOO_LONG, + AOR_NAME_ALREADY_EXIST, AOR_NAME_NOT_EXIST, AOR_DB_INTERNAL_ERROR }; +enum PasswordChangeSecurity +{ + PW_NONE, + PW_EMAIL, + PW_RBAC +}; + #define MAX_ACCOUNT_STR 16 +#define MAX_EMAIL_STR 64 typedef std::map RBACPermissionsContainer; typedef std::map RBACRolesContainer; @@ -48,16 +57,20 @@ class AccountMgr ~AccountMgr(); public: - AccountOpResult CreateAccount(std::string username, std::string password); + AccountOpResult CreateAccount(std::string username, std::string password, std::string email); 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 newEmail); + static AccountOpResult ChangeRegEmail(uint32 accountId, std::string newEmail); static bool CheckPassword(uint32 accountId, std::string password); + static bool CheckEmail(uint32 accountId, std::string newEmail); 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 bool GetEmail(uint32 accountId, std::string& email); static uint32 GetCharactersCount(uint32 accountId); static std::string CalculateShaPassHash(std::string const& name, std::string const& password); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index be4356f6b54..ab8354554ec 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -96,6 +96,8 @@ enum RBACPermissions RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR = 46, RBAC_PERM_CHECK_FOR_LOWER_SECURITY = 47, RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA = 48, + RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE = 49, + RBAC_PERM_MAY_CHECK_OWN_EMAIL = 50, // Leave some space for core permissions RBAC_PERM_COMMAND_RBAC = 200, RBAC_PERM_COMMAND_RBAC_ACC = 201, @@ -160,8 +162,12 @@ enum RBACPermissions 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 = 264, + RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_EMAIL = 265, + RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_REGMAIL = 266, - // custom permissions 1000+ + // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 772d5bcfb75..ce280a11fc3 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -811,6 +811,7 @@ enum TrinityStrings LANG_PINFO_ACC_ACCOUNT = 714, LANG_PINFO_ACC_LASTLOGIN = 716, LANG_PINFO_ACC_OS = 749, + LANG_PINFO_ACC_REGMAILS = 879, LANG_PINFO_ACC_IP = 752, LANG_PINFO_CHR_LEVEL_LOW = 843, LANG_PINFO_CHR_RACE = 844, @@ -844,7 +845,17 @@ enum TrinityStrings LANG_ARENA_INFO_MEMBERS = 869, LANG_ARENA_LOOKUP = 870, // = 871, see LANG_PINFO_CHR_LEVEL_HIGH - // Room for in-game strings 872-999 not used + LANG_COMMAND_WRONGEMAIL = 872, + LANG_NEW_EMAILS_NOT_MATCH = 873, + LANG_COMMAND_EMAIL = 874, + LANG_EMAIL_TOO_LONG = 875, + LANG_COMMAND_NOTCHANGEEMAIL = 876, + LANG_OLD_EMAIL_IS_NEW_EMAIL = 877, + LANG_COMMAND_EMAIL_OUTPUT = 878, + // = 879, see LANG_PINFO_CHR_REGMAILS + LANG_ACCOUNT_SEC_TYPE = 880, + LANG_RBAC_EMAIL_REQUIRED = 881, + // Room for in-game strings 882-999 not used // Level 4 (CLI only commands) LANG_COMMAND_EXIT = 1000, diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 12ec033dfa7..cf6ad3f9886 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1192,6 +1192,9 @@ void World::LoadConfigSettings(bool reload) // DBC_ItemAttributes m_bool_configs[CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES] = sConfigMgr->GetBoolDefault("DBC.EnforceItemAttributes", true); + // Accountpassword Secruity + m_int_configs[CONFIG_ACC_PASSCHANGESEC] = sConfigMgr->GetIntDefault("Account.PasswordChangeSecurity", 0); + // Max instances per hour m_int_configs[CONFIG_MAX_INSTANCES_PER_HOUR] = sConfigMgr->GetIntDefault("AccountInstancesPerHour", 5); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index d4d9c4e2431..907491437c4 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -329,6 +329,7 @@ enum WorldIntConfigs CONFIG_PACKET_SPOOF_POLICY, CONFIG_PACKET_SPOOF_BANMODE, CONFIG_PACKET_SPOOF_BANDURATION, + CONFIG_ACC_PASSCHANGESEC, INT_CONFIG_VALUE_COUNT }; diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index 42e33faee1c..467b74f4954 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -35,35 +35,43 @@ public: ChatCommand* GetCommands() const OVERRIDE { + static ChatCommand accountSetSecTable[] = + { + { "regmail", RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_REGMAIL, true, &HandleAccountSetRegEmailCommand, "", NULL }, + { "email", RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_EMAIL, true, &HandleAccountSetEmailCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; static ChatCommand accountSetCommandTable[] = { - { "addon", RBAC_PERM_COMMAND_ACCOUNT_SET_ADDON, true, &HandleAccountSetAddonCommand, "", NULL }, - { "gmlevel", RBAC_PERM_COMMAND_ACCOUNT_SET_GMLEVEL, true, &HandleAccountSetGmLevelCommand, "", NULL }, - { "password", RBAC_PERM_COMMAND_ACCOUNT_SET_PASSWORD, true, &HandleAccountSetPasswordCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "addon", RBAC_PERM_COMMAND_ACCOUNT_SET_ADDON, true, &HandleAccountSetAddonCommand, "", NULL }, + { "sec", RBAC_PERM_COMMAND_ACCOUNT_SET_SEC, true, NULL, "", accountSetSecTable }, + { "gmlevel", RBAC_PERM_COMMAND_ACCOUNT_SET_GMLEVEL, true, &HandleAccountSetGmLevelCommand, "", NULL }, + { "password", RBAC_PERM_COMMAND_ACCOUNT_SET_PASSWORD, true, &HandleAccountSetPasswordCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand accountLockCommandTable[] = { - { "country", RBAC_PERM_COMMAND_ACCOUNT_LOCK_COUNTRY, true, &HandleAccountLockCountryCommand, "", NULL }, - { "ip", RBAC_PERM_COMMAND_ACCOUNT_LOCK_IP, true, &HandleAccountLockIpCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "country", RBAC_PERM_COMMAND_ACCOUNT_LOCK_COUNTRY, true, &HandleAccountLockCountryCommand, "", NULL }, + { "ip", RBAC_PERM_COMMAND_ACCOUNT_LOCK_IP, true, &HandleAccountLockIpCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand accountCommandTable[] = { - { "addon", RBAC_PERM_COMMAND_ACCOUNT_ADDON, false, &HandleAccountAddonCommand, "", NULL }, - { "create", RBAC_PERM_COMMAND_ACCOUNT_CREATE, true, &HandleAccountCreateCommand, "", NULL }, - { "delete", RBAC_PERM_COMMAND_ACCOUNT_DELETE, true, &HandleAccountDeleteCommand, "", NULL }, - { "onlinelist", RBAC_PERM_COMMAND_ACCOUNT_ONLINE_LIST, true, &HandleAccountOnlineListCommand, "", NULL }, - { "lock", RBAC_PERM_COMMAND_ACCOUNT_LOCK, false, NULL, "", accountLockCommandTable }, - { "set", RBAC_PERM_COMMAND_ACCOUNT_SET, true, NULL, "", accountSetCommandTable }, - { "password", RBAC_PERM_COMMAND_ACCOUNT_PASSWORD, false, &HandleAccountPasswordCommand, "", NULL }, - { "", RBAC_PERM_COMMAND_ACCOUNT, false, &HandleAccountCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "addon", RBAC_PERM_COMMAND_ACCOUNT_ADDON, false, &HandleAccountAddonCommand, "", NULL }, + { "create", RBAC_PERM_COMMAND_ACCOUNT_CREATE, true, &HandleAccountCreateCommand, "", NULL }, + { "delete", RBAC_PERM_COMMAND_ACCOUNT_DELETE, true, &HandleAccountDeleteCommand, "", NULL }, + { "email", RBAC_PERM_COMMAND_ACCOUNT_EMAIL, false, &HandleAccountEmailCommand, "", NULL }, + { "onlinelist", RBAC_PERM_COMMAND_ACCOUNT_ONLINE_LIST, true, &HandleAccountOnlineListCommand, "", NULL }, + { "lock", RBAC_PERM_COMMAND_ACCOUNT_LOCK, false, NULL, "", accountLockCommandTable }, + { "set", RBAC_PERM_COMMAND_ACCOUNT_SET, true, NULL, "", accountSetCommandTable }, + { "password", RBAC_PERM_COMMAND_ACCOUNT_PASSWORD, false, &HandleAccountPasswordCommand, "", NULL }, + { "", RBAC_PERM_COMMAND_ACCOUNT, false, &HandleAccountCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "account", RBAC_PERM_COMMAND_ACCOUNT, true, NULL, "", accountCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "account", RBAC_PERM_COMMAND_ACCOUNT, true, NULL, "", accountCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } @@ -106,29 +114,35 @@ public: if (!*args) return false; + char* email; + ///- %Parse the command line arguments char* accountName = strtok((char*)args, " "); char* password = strtok(NULL, " "); + if (!(email = strtok(NULL, " '"))) + email = ""; + if (!accountName || !password) return false; - AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password)); + AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password), std::string(email)); switch (result) { case AOR_OK: handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName); if (handler->GetSession()) { - TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %d (IP: %s) Character:[%s] (GUID: %u) Change Password.", + TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %d (IP: %s) Character:[%s] (GUID: %u) created Account %s (Email: '%s')", handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), - handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow()); + handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), + accountName, email); } break; case AOR_NAME_TOO_LONG: handler->SendSysMessage(LANG_ACCOUNT_TOO_LONG); handler->SetSentErrorMessage(true); return false; - case AOR_NAME_ALREDY_EXIST: + case AOR_NAME_ALREADY_EXIST: handler->SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST); handler->SetSentErrorMessage(true); return false; @@ -338,6 +352,89 @@ public: return false; } + static bool HandleAccountEmailCommand(ChatHandler* handler, char const* args) + { + if (!*args) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); + return false; + } + + char* oldEmail = strtok(NULL, " "); + char* password = strtok(NULL, " "); + char* email = strtok((char*)args, " "); + char* emailConfirmation = strtok(NULL, " "); + + if (!oldEmail || !password || !email || !emailConfirmation) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); + return false; + } + + if (!AccountMgr::CheckEmail(handler->GetSession()->GetAccountId(), std::string(oldEmail))) + { + handler->SendSysMessage(LANG_COMMAND_WRONGEMAIL); + handler->SetSentErrorMessage(true); + TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change email, but the provided email [%s] is not equal to registration email [%s].", + handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), + handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), + email, oldEmail); + return false; + } + + if (!AccountMgr::CheckPassword(handler->GetSession()->GetAccountId(), std::string(password))) + { + handler->SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD); + handler->SetSentErrorMessage(true); + TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change email, but the provided password is wrong.", + handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), + handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow()); + return false; + } + + if (strcmp(email, oldEmail) == 0) + { + handler->SendSysMessage(LANG_OLD_EMAIL_IS_NEW_EMAIL); + handler->SetSentErrorMessage(true); + return false; + } + + if (strcmp(email, emailConfirmation) != 0) + { + handler->SendSysMessage(LANG_NEW_EMAILS_NOT_MATCH); + handler->SetSentErrorMessage(true); + TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change email, but the provided password is wrong.", + handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), + handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow()); + return false; + } + + + AccountOpResult result = AccountMgr::ChangeEmail(handler->GetSession()->GetAccountId(), std::string(email)); + switch (result) + { + case AOR_OK: + handler->SendSysMessage(LANG_COMMAND_EMAIL); + TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Changed Email from [%s] to [%s].", + handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), + handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), + oldEmail, email); + break; + case AOR_EMAIL_TOO_LONG: + handler->SendSysMessage(LANG_EMAIL_TOO_LONG); + handler->SetSentErrorMessage(true); + return false; + default: + handler->SendSysMessage(LANG_COMMAND_NOTCHANGEEMAIL); + handler->SetSentErrorMessage(true); + return false; + } + + return true; + } + static bool HandleAccountPasswordCommand(ChatHandler* handler, char const* args) { if (!*args) @@ -347,9 +444,12 @@ public: return false; } + uint32 pwConfig = sWorld->getIntConfig(CONFIG_ACC_PASSCHANGESEC); // 0 - PW_NONE, 1 - PW_EMAIL, 2 - PW_RBAC + char* oldPassword = strtok((char*)args, " "); char* newPassword = strtok(NULL, " "); char* passwordConfirmation = strtok(NULL, " "); + char* emailConfirmation = strtok(NULL, " "); if (!oldPassword || !newPassword || !passwordConfirmation) { @@ -358,16 +458,37 @@ public: return false; } + if ((pwConfig == PW_EMAIL || pwConfig == PW_RBAC && handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE)) && !emailConfirmation) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); + TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password, but entered no email at all. Has Perm: [%s]", + handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), + handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), + handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE) ? "Yes" : "No"); + } + if (!AccountMgr::CheckPassword(handler->GetSession()->GetAccountId(), std::string(oldPassword))) { handler->SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD); handler->SetSentErrorMessage(true); - TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password.", + TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password, but the provided old password is wrong.", handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow()); return false; } + if ((pwConfig == PW_EMAIL || pwConfig == PW_RBAC && handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE)) // Either PW_EMAIL or PW_RBAC with the Permission + && !AccountMgr::CheckEmail(handler->GetSession()->GetAccountId(), std::string(emailConfirmation))) + { + handler->SendSysMessage(LANG_COMMAND_WRONGEMAIL); + handler->SetSentErrorMessage(true); + TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password, but the entered email [%s] is wrong.", + handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), + handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), + emailConfirmation); + } + if (strcmp(newPassword, passwordConfirmation) != 0) { handler->SendSysMessage(LANG_NEW_PASSWORDS_NOT_MATCH); @@ -399,8 +520,40 @@ public: static bool HandleAccountCommand(ChatHandler* handler, char const* /*args*/) { + // GM Level AccountTypes gmLevel = handler->GetSession()->GetSecurity(); handler->PSendSysMessage(LANG_ACCOUNT_LEVEL, uint32(gmLevel)); + + // Security level required + bool hasRBAC = (handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE) ? true : false); + uint32 pwConfig = sWorld->getIntConfig(CONFIG_ACC_PASSCHANGESEC); // 0 - PW_NONE, 1 - PW_EMAIL, 2 - PW_RBAC + + handler->PSendSysMessage(LANG_ACCOUNT_SEC_TYPE, (pwConfig == PW_NONE ? "Lowest level: No Email input required." : + pwConfig == PW_EMAIL ? "Highest level: Email input required." : + pwConfig == PW_RBAC ? "Special level: Your account may require email input depending on settings. That is the case if another lien is printed." : + "Unknown security level: Notify technician for details.")); + + // RBAC required display - is not displayed for console + if (pwConfig == PW_RBAC && handler->GetSession() && hasRBAC) + handler->PSendSysMessage(LANG_RBAC_EMAIL_REQUIRED); + + // Email display if sufficient rights + if (handler->HasPermission(RBAC_PERM_MAY_CHECK_OWN_EMAIL)) + { + std::string emailoutput; + uint32 accountId = handler->GetSession()->GetAccountId(); + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_EMAIL_BY_ID); + stmt->setUInt32(0, accountId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + + if (result) + { + emailoutput = (*result)[0].GetString(); + handler->PSendSysMessage(LANG_COMMAND_EMAIL_OUTPUT, emailoutput.c_str()); + } + } + return true; } @@ -471,7 +624,11 @@ public: static bool HandleAccountSetGmLevelCommand(ChatHandler* handler, char const* args) { if (!*args) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); return false; + } std::string targetAccountName; uint32 targetAccountId = 0; @@ -524,7 +681,7 @@ public: playerSecurity = SEC_CONSOLE; // can set security level only for target with less security and to less security that we have - // This is also reject self apply in fact + // This also restricts setting handler's own security. targetSecurity = AccountMgr::GetSecurity(targetAccountId, gmRealmID); if (targetSecurity >= playerSecurity || gm >= playerSecurity) { @@ -570,7 +727,11 @@ public: static bool HandleAccountSetPasswordCommand(ChatHandler* handler, char const* args) { if (!*args) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); return false; + } ///- Get the command line arguments char* account = strtok((char*)args, " "); @@ -597,7 +758,7 @@ public: } /// can set password only for target with less security - /// This is also reject self apply in fact + /// This also restricts setting handler's own password if (handler->HasLowerSecurityAccount(NULL, targetAccountId, true)) return false; @@ -630,6 +791,153 @@ public: } return true; } + + /// Set normal email for account + static bool HandleAccountSetEmailCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + ///- Get the command line arguments + char* account = strtok((char*)args, " "); + char* email = strtok(NULL, " "); + char* emailConfirmation = strtok(NULL, " "); + + if (!account || !email || !emailConfirmation) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); + return false; + } + + std::string accountName = account; + if (!AccountMgr::normalizeString(accountName)) + { + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 targetAccountId = AccountMgr::GetId(accountName); + if (!targetAccountId) + { + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + /// can set email only for target with less security + /// This also restricts setting handler's own email. + if (handler->HasLowerSecurityAccount(NULL, targetAccountId, true)) + return false; + + if (strcmp(email, emailConfirmation) != 0) + { + handler->SendSysMessage(LANG_NEW_EMAILS_NOT_MATCH); + handler->SetSentErrorMessage(true); + return false; + } + + AccountOpResult result = AccountMgr::ChangeEmail(targetAccountId, email); + switch (result) + { + case AOR_OK: + handler->SendSysMessage(LANG_COMMAND_EMAIL); + TC_LOG_INFO(LOG_FILTER_CHARACTER, "ChangeEmail: Account %s [Id: %u] had it's email changed to %s.", + accountName.c_str(), targetAccountId, email); + break; + case AOR_NAME_NOT_EXIST: + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + case AOR_EMAIL_TOO_LONG: + handler->SendSysMessage(LANG_EMAIL_TOO_LONG); + handler->SetSentErrorMessage(true); + return false; + default: + handler->SendSysMessage(LANG_COMMAND_NOTCHANGEEMAIL); + handler->SetSentErrorMessage(true); + return false; + } + + return true; + } + + /// Change registration email for account + static bool HandleAccountSetRegEmailCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + //- We do not want anything short of console to use this by default. + //- So we force that. + if (handler->GetSession()) + return false; + + ///- Get the command line arguments + char* account = strtok((char*)args, " "); + char* email = strtok(NULL, " "); + char* emailConfirmation = strtok(NULL, " "); + + if (!account || !email || !emailConfirmation) + { + handler->SendSysMessage(LANG_CMD_SYNTAX); + handler->SetSentErrorMessage(true); + return false; + } + + std::string accountName = account; + if (!AccountMgr::normalizeString(accountName)) + { + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 targetAccountId = AccountMgr::GetId(accountName); + if (!targetAccountId) + { + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + /// can set email only for target with less security + /// This also restricts setting handler's own email. + if (handler->HasLowerSecurityAccount(NULL, targetAccountId, true)) + return false; + + if (strcmp(email, emailConfirmation) != 0) + { + handler->SendSysMessage(LANG_NEW_EMAILS_NOT_MATCH); + handler->SetSentErrorMessage(true); + return false; + } + + AccountOpResult result = AccountMgr::ChangeRegEmail(targetAccountId, email); + switch (result) + { + case AOR_OK: + handler->SendSysMessage(LANG_COMMAND_EMAIL); + TC_LOG_INFO(LOG_FILTER_CHARACTER, "ChangeRegEmail: Account %s [Id: %u] had it's Registration Email changed to %s.", + accountName.c_str(), targetAccountId, email); + break; + case AOR_NAME_NOT_EXIST: + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + case AOR_EMAIL_TOO_LONG: + handler->SendSysMessage(LANG_EMAIL_TOO_LONG); + handler->SetSentErrorMessage(true); + return false; + default: + handler->SendSysMessage(LANG_COMMAND_NOTCHANGEEMAIL); + handler->SetSentErrorMessage(true); + return false; + } + + return true; + } }; void AddSC_account_commandscript() diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index f2ff911fdf9..c165eebe3b5 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -339,8 +339,12 @@ public: return true; } - static bool HandleLearnAllCraftsCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllCraftsCommand(ChatHandler* handler, char const* args) { + Player* target; + if (!handler->extractPlayerTarget((char*)args, &target)) + return false; + for (uint32 i = 0; i < sSkillLineStore.GetNumRows(); ++i) { SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(i); @@ -350,7 +354,7 @@ public: if ((skillInfo->categoryId == SKILL_CATEGORY_PROFESSION || skillInfo->categoryId == SKILL_CATEGORY_SECONDARY) && skillInfo->canLink) // only prof. with recipes have { - HandleLearnSkillRecipesHelper(handler->GetSession()->GetPlayer(), skillInfo->id); + HandleLearnSkillRecipesHelper(target, skillInfo->id); } } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index ee31542c53a..9c29e31af96 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1520,20 +1520,21 @@ public: * ** Muted: (Time, Reason, By) - IV. LANG_PINFO_MUTED (if muted) * * Account: %s (id: %u), GM Level: %u - V. LANG_PINFO_ACC_ACCOUNT * * Last Login: %u (Failed Logins: %u) - VI. LANG_PINFO_ACC_LASTLOGIN - * * Uses OS: %s - Latency: %u ms - Email %s - VII. LANG_PINFO_ACC_OS - * * Last IP: %u (Locked: %s) - VIII. LANG_PINFO_ACC_IP - * * Level: %u (%u/%u XP (%u XP left) - IX. LANG_PINFO_CHR_LEVEL - * * Race: %s %s, Class %s - X. LANG_PINFO_CHR_RACE - * * Alive ?: %s - XI. LANG_PINFO_CHR_ALIVE - * * Phase: %s - XII. LANG_PINFO_CHR_PHASE (if not GM) - * * Money: %ug%us%uc - XIII. LANG_PINFO_CHR_MONEY - * * Map: %s, Area: %s - XIV. LANG_PINFO_CHR_MAP - * * Guild: %s (Id: %u) - XV. LANG_PINFO_CHR_GUILD (if in guild) - * ** Rank: %s - XVI. LANG_PINFO_CHR_GUILD_RANK (if in guild) - * ** Note: %s - XVII. LANG_PINFO_CHR_GUILD_NOTE (if in guild and has note) - * ** O. Note: %s - XVIII.LANG_PINFO_CHR_GUILD_ONOTE (if in guild and has officer note) - * * Played time: %s - XIX. LANG_PINFO_CHR_PLAYEDTIME - * * Mails: %u Read/%u Total - XX. LANG_PINFO_CHR_MAILS (if has mails) + * * Uses OS: %s - Latency: %u ms - VII. LANG_PINFO_ACC_OS + * * Registration Email: %s - Email: %s - VIII. LANG_PINFO_ACC_REGMAILS + * * Last IP: %u (Locked: %s) - IX. LANG_PINFO_ACC_IP + * * Level: %u (%u/%u XP (%u XP left) - X. LANG_PINFO_CHR_LEVEL + * * Race: %s %s, Class %s - XI. LANG_PINFO_CHR_RACE + * * Alive ?: %s - XII. LANG_PINFO_CHR_ALIVE + * * Phase: %s - XIII. LANG_PINFO_CHR_PHASE (if not GM) + * * Money: %ug%us%uc - XIV. LANG_PINFO_CHR_MONEY + * * Map: %s, Area: %s - XV. LANG_PINFO_CHR_MAP + * * Guild: %s (Id: %u) - XVI. LANG_PINFO_CHR_GUILD (if in guild) + * ** Rank: %s - XVII. LANG_PINFO_CHR_GUILD_RANK (if in guild) + * ** Note: %s - XVIII.LANG_PINFO_CHR_GUILD_NOTE (if in guild and has note) + * ** O. Note: %s - XVIX. LANG_PINFO_CHR_GUILD_ONOTE (if in guild and has officer note) + * * Played time: %s - XX. LANG_PINFO_CHR_PLAYEDTIME + * * Mails: %u Read/%u Total - XXI. LANG_PINFO_CHR_MAILS (if has mails) * * Not all of them can be moved to the top. These should * place the most important ones to the head, though. @@ -1546,6 +1547,7 @@ public: uint32 accId = 0; uint32 lowguid = GUID_LOPART(targetGuid); std::string eMail = handler->GetTrinityString(LANG_ERROR); + std::string regMail = handler->GetTrinityString(LANG_ERROR); uint32 security = 0; std::string lastIp = handler->GetTrinityString(LANG_ERROR); uint8 locked = 0; @@ -1666,8 +1668,9 @@ public: (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security))) { eMail = fields[2].GetString(); - lastIp = fields[3].GetString(); - lastLogin = fields[4].GetString(); + regMail = fields[3].GetString(); + lastIp = fields[4].GetString(); + lastLogin = fields[5].GetString(); uint32 ip = inet_addr(lastIp.c_str()); EndianConvertReverse(ip); @@ -1689,12 +1692,12 @@ public: lastIp = "Unauthorized"; lastLogin = "Unauthorized"; } - muteTime = fields[5].GetUInt64(); - muteReason = fields[6].GetString(); - muteBy = fields[7].GetString(); - failedLogins = fields[8].GetUInt32(); - locked = fields[9].GetUInt8(); - OS = fields[10].GetString(); + muteTime = fields[6].GetUInt64(); + muteReason = fields[7].GetString(); + muteBy = fields[8].GetString(); + failedLogins = fields[9].GetUInt32(); + locked = fields[10].GetUInt8(); + OS = fields[11].GetString(); } // Creates a chat link to the character. Returns nameLink @@ -1783,8 +1786,11 @@ public: // Output VI. LANG_PINFO_ACC_LASTLOGIN handler->PSendSysMessage(LANG_PINFO_ACC_LASTLOGIN, lastLogin.c_str(), failedLogins); - // Output VIII. LANG_PINFO_ACC_OS - handler->PSendSysMessage(LANG_PINFO_ACC_OS, OS.c_str(), latency, eMail.c_str()); + // Output VII. LANG_PINFO_ACC_OS + handler->PSendSysMessage(LANG_PINFO_ACC_OS, OS.c_str(), latency); + + // Output VIII. LANG_PINFO_ACC_REGMAILS + handler->PSendSysMessage(LANG_PINFO_ACC_REGMAILS, regMail.c_str(), eMail.c_str()); // Output IX. LANG_PINFO_ACC_IP handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? "Yes" : "No"); @@ -1828,7 +1834,7 @@ public: if (target) handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : ""), (!areaName.empty() ? areaName.c_str() : "")); - // Output XVII. - XX. if they are not empty + // Output XVII. - XVIX. if they are not empty if (!guildName.empty()) { handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId); @@ -1839,7 +1845,7 @@ public: handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_ONOTE, officeNote.c_str()); } - // Output XXI. LANG_PINFO_CHR_PLAYEDTIME + // Output XX. LANG_PINFO_CHR_PLAYEDTIME handler->PSendSysMessage(LANG_PINFO_CHR_PLAYEDTIME, (secsToTimeString(totalPlayerTime, true, true)).c_str()); // Mail Data - an own query, because it may or may not be useful. @@ -1861,7 +1867,7 @@ public: // ... we have to convert it from Char to int. We can use totalmail as it is rmailint = atol(readmail.c_str()); - // Output XXII. LANG_INFO_CHR_MAILS if at least one mail is given + // Output XXI. LANG_INFO_CHR_MAILS if at least one mail is given if (totalmail >= 1) handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, rmailint, totalmail); } diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp index 26940c8a599..6e01e8f515a 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.cpp +++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp @@ -56,7 +56,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_DEL_REALM_CHARACTERS, "DELETE FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_INS_REALM_CHARACTERS, "INSERT INTO realmcharacters (numchars, acctid, realmid) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_SUM_REALM_CHARACTERS, "SELECT SUM(numchars) FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC); - PrepareStatement(LOGIN_INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, joindate) VALUES(?, ?, NOW())", CONNECTION_SYNCH); + PrepareStatement(LOGIN_INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, reg_mail, email, joindate) VALUES(?, ?, ?, ?, NOW())", CONNECTION_SYNCH); PrepareStatement(LOGIN_INS_REALM_CHARACTERS_INIT, "INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist, account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_EXPANSION, "UPDATE account SET expansion = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_ACCOUNT_LOCK, "UPDATE account SET locked = ? WHERE id = ?", CONNECTION_ASYNC); @@ -64,6 +64,8 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_INS_LOG, "INSERT INTO logs (time, realm, type, level, string) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_USERNAME, "UPDATE account SET v = 0, s = 0, username = ?, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_PASSWORD, "UPDATE account SET v = 0, s = 0, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_UPD_EMAIL, "UPDATE account SET email = ? WHERE id = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_UPD_REG_EMAIL, "UPDATE account SET reg_mail = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_MUTE_TIME, "UPDATE account SET mutetime = ? , mutereason = ? , muteby = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_MUTE_TIME_LOGIN, "UPDATE account SET mutetime = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_LAST_IP, "UPDATE account SET last_ip = ? WHERE username = ?", CONNECTION_ASYNC); @@ -79,7 +81,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_GET_USERNAME_BY_ID, "SELECT username FROM account WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_CHECK_PASSWORD, "SELECT 1 FROM account WHERE id = ? AND sha_pass_hash = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_CHECK_PASSWORD_BY_NAME, "SELECT 1 FROM account WHERE username = ? AND sha_pass_hash = ?", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime, a.mutereason, a.muteby, a.failed_logins, a.locked, a.OS FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH); + PrepareStatement(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.reg_mail, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime, a.mutereason, a.muteby, a.failed_logins, a.locked, a.OS FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned WHERE id = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_GM_ACCOUNTS, "SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= ? AND (aa.realmid = -1 OR aa.realmid = ?)", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?", CONNECTION_SYNCH); @@ -92,6 +94,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH); + PrepareStatement(LOGIN_GET_EMAIL_BY_ID, "SELECT email FROM account WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_BY_ID, "SELECT gmlevel, RealmID FROM account_access WHERE id = ? and (RealmID = ? OR RealmID = -1) ORDER BY gmlevel desc", CONNECTION_SYNCH); diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h index 97cf91fc178..47fa48c6ada 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.h +++ b/src/server/shared/Database/Implementation/LoginDatabase.h @@ -84,6 +84,8 @@ enum LoginDatabaseStatements LOGIN_INS_LOG, LOGIN_UPD_USERNAME, LOGIN_UPD_PASSWORD, + LOGIN_UPD_EMAIL, + LOGIN_UPD_REG_EMAIL, LOGIN_UPD_MUTE_TIME, LOGIN_UPD_MUTE_TIME_LOGIN, LOGIN_UPD_LAST_IP, @@ -112,6 +114,7 @@ enum LoginDatabaseStatements LOGIN_DEL_ACCOUNT, LOGIN_SEL_IP2NATION_COUNTRY, LOGIN_SEL_AUTOBROADCAST, + LOGIN_GET_EMAIL_BY_ID, LOGIN_SEL_ACCOUNT_ACCESS_BY_ID, LOGIN_SEL_RBAC_ACCOUNT_GROUPS, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index a98a4e61448..018cd309805 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1131,6 +1131,15 @@ AccountInstancesPerHour = 5 RBAC.DefaultGroups = "" +# +# Account.PasswordChangeSecurity +# Description: Controls how secure you want the password changes to be. +# Default: 2 - RBAC (RBAC en- or disables Email confirmation per group) +# 1 - Email (Email confirmation necessary) +# 0 - None (Just Old and new password comparision. Default.) + +Account.PasswordChangeSecurity = 0 + # ################################################################################################### @@ -2829,4 +2838,4 @@ PacketSpoof.BanMode = 0 PacketSpoof.BanDuration = 86400 # -################################################################################################### \ No newline at end of file +################################################################################################### From f23b5fb96d46cc2eac3aa069a4d1a2aa0df16117 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 1 Sep 2013 21:29:59 +0200 Subject: [PATCH 02/29] Core/Socket: Fix race condition in WorldSocket ReactorRunnable::svc() checks the status of WorldSockets while WorldRunnable::run() updates them, causing a race condition. Helgrind log: Possible data race during write of size 8 at 0x49961810 by thread #9 Locks held: 1, at address 0x4367A620 at 0x51781F7: ACE_Message_Block::copy(char const*, unsigned long) (Message_Block.inl:372) by 0x15D048F: WorldSocket::SendPacket(WorldPacket const&) (WorldSocket.cpp:180) by 0x141C45E: WorldSession::SendPacket(WorldPacket const*) (WorldSession.cpp:223) by 0x15C49C4: WorldSession::SendAuthResponse(unsigned char, bool, unsigned int) (AuthHandler.cpp:37) by 0x14DA71C: World::AddSession_(WorldSession*) (World.cpp:278) by 0x14E601E: World::UpdateSessions(unsigned int) (World.cpp:2617) by 0x14E3E67: World::Update(unsigned int) (World.cpp:1986) by 0x100EAFA: WorldRunnable::run() (WorldRunnable.cpp:60) by 0x163A626: ACE_Based::Thread::ThreadTask(void*) (Threading.cpp:186) by 0x518F555: ACE_OS_Thread_Adapter::invoke() (OS_Thread_Adapter.cpp:103) by 0x4C2B5AD: mythread_wrapper (hg_intercepts.c:219) by 0x61DAB4F: start_thread (pthread_create.c:304) This conflicts with a previous read of size 8 by thread #14 Locks held: none at 0x1008414: ACE_Message_Block::length() const (Message_Block.inl:131) by 0x15D1207: WorldSocket::Update() (WorldSocket.cpp:448) by 0x1427CA3: ReactorRunnable::svc() (WorldSocketMgr.cpp:177) by 0x51CBB16: ACE_Task_Base::svc_run(void*) (Task.cpp:271) by 0x51CD3BC: ACE_Thread_Adapter::invoke_i() (Thread_Adapter.cpp:161) by 0x51CD4D4: ACE_Thread_Adapter::invoke() (Thread_Adapter.cpp:96) by 0x4C2B5AD: mythread_wrapper (hg_intercepts.c:219) by 0x61DAB4F: start_thread (pthread_create.c:304) Address 0x49961810 is 16 bytes inside a block of size 80 alloc'd at 0x4C286BB: operator new(unsigned long, std::nothrow_t const&) (vg_replace_malloc.c:316) by 0x15D0818: WorldSocket::open(void*) (WorldSocket.cpp:237) by 0x1429560: ACE_Acceptor::activate_svc_handler(WorldSocket*) (Acceptor.cpp:347) by 0x142916D: ACE_Acceptor::handle_input(int) (Acceptor.cpp:429) by 0x515F48D: ACE_Dev_Poll_Reactor::dispatch_io_event(ACE_Dev_Poll_Reactor::Token_Guard&) (Dev_Poll_Reactor.inl:86) by 0x5161653: ACE_Dev_Poll_Reactor::handle_events(ACE_Time_Value*) (Dev_Poll_Reactor.cpp:1015) by 0x51ACCFC: ACE_Reactor::run_reactor_event_loop(ACE_Time_Value&, int (*)(ACE_Reactor*)) (Reactor.cpp:267) by 0x1427C57: ReactorRunnable::svc() (WorldSocketMgr.cpp:170) by 0x51CBB16: ACE_Task_Base::svc_run(void*) (Task.cpp:271) by 0x51CD3BC: ACE_Thread_Adapter::invoke_i() (Thread_Adapter.cpp:161) by 0x51CD4D4: ACE_Thread_Adapter::invoke() (Thread_Adapter.cpp:96) by 0x4C2B5AD: mythread_wrapper (hg_intercepts.c:219) --- src/server/game/Server/WorldSocket.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 625ebff8471..508fc0351a9 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -445,9 +445,15 @@ int WorldSocket::Update (void) if (closing_) return -1; - if (m_OutActive || (m_OutBuffer->length() == 0 && msg_queue()->is_empty())) + if (m_OutActive) return 0; + { + ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, 0); + if (m_OutBuffer->length() == 0 && msg_queue()->is_empty()) + return 0; + } + int ret; do ret = handle_output(get_handle()); From 59667ee6069915613ca31947d539724dc4edf0a8 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Mon, 2 Sep 2013 09:41:46 +0200 Subject: [PATCH 03/29] Core/Spells: move debug log into debug mode --- src/server/scripts/Spells/spell_quest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 7021f6251a2..8804410d814 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -2072,7 +2072,7 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader { uint32 spellId = 0; - TC_LOG_ERROR(LOG_FILTER_SPELLS_AURAS, "spell_q12641_death_comes_from_on_high:: Caster: %s (GUID: %u) On Hit Target: Creature: %s (Entry: %u GUID: %u)", + TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "spell_q12641_death_comes_from_on_high:: Caster: %s (GUID: %u) On Hit Target: Creature: %s (Entry: %u GUID: %u)", GetOriginalCaster()->GetName().c_str(), GetOriginalCaster()->GetGUIDLow(), GetHitCreature()->GetName().c_str(), GetHitCreature()->GetEntry(), GetHitCreature()->GetGUIDLow()); switch (GetHitCreature()->GetEntry()) { From 33d9da5060e4402f646a6592e089133e2414e38f Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 09:39:35 +0200 Subject: [PATCH 04/29] Core/RBAC: Move cheat commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_00_auth_misc.sql | 29 +++++++++++++++++++ .../world/2013_09_02_01_world_command.sql | 14 +++++++++ src/server/game/Accounts/RBAC.h | 15 ++++++++-- src/server/scripts/Commands/cs_cheat.cpp | 22 +++++++------- 4 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_00_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_01_world_command.sql diff --git a/sql/updates/auth/2013_09_02_00_auth_misc.sql b/sql/updates/auth/2013_09_02_00_auth_misc.sql new file mode 100644 index 00000000000..46a8054e086 --- /dev/null +++ b/sql/updates/auth/2013_09_02_00_auth_misc.sql @@ -0,0 +1,29 @@ +/* cs_cheat.cpp */ + +SET @id = 291; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+8; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'cheat'), +(@id+1, 'cheat casttime'), +(@id+2, 'cheat cooldown'), +(@id+3, 'cheat explore'), +(@id+4, 'cheat god'), +(@id+5, 'cheat power'), +(@id+6, 'cheat status'), +(@id+7, 'cheat taxi'), +(@id+8, 'cheat waterwalk'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+8; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5), +(4, @id+6), +(4, @id+7), +(4, @id+8); diff --git a/sql/updates/world/2013_09_02_01_world_command.sql b/sql/updates/world/2013_09_02_01_world_command.sql new file mode 100644 index 00000000000..aab76efa562 --- /dev/null +++ b/sql/updates/world/2013_09_02_01_world_command.sql @@ -0,0 +1,14 @@ +/* cs_cheat.cpp */ + +SET @id = 291; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'cheat'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'cheat casttime'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'cheat cooldown'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'cheat explore'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'cheat god'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'cheat power'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'cheat status'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'cheat taxi'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'cheat waterwalk'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index ab8354554ec..139aa8c93aa 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -97,7 +97,7 @@ enum RBACPermissions RBAC_PERM_CHECK_FOR_LOWER_SECURITY = 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_MAY_CHECK_OWN_EMAIL = 50, // Leave some space for core permissions RBAC_PERM_COMMAND_RBAC = 200, RBAC_PERM_COMMAND_RBAC_ACC = 201, @@ -166,8 +166,19 @@ enum RBACPermissions RBAC_PERM_COMMAND_ACCOUNT_SET_SEC = 264, RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_EMAIL = 265, RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_REGMAIL = 266, + // 6 reserved for cast (267-272) + // 18 reserved for character (273-290) + RBAC_PERM_COMMAND_CHEAT = 291, + 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, - // custom permissions 1000+ + // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/scripts/Commands/cs_cheat.cpp b/src/server/scripts/Commands/cs_cheat.cpp index 874e79f64e4..4610b12808e 100644 --- a/src/server/scripts/Commands/cs_cheat.cpp +++ b/src/server/scripts/Commands/cs_cheat.cpp @@ -38,22 +38,22 @@ public: static ChatCommand cheatCommandTable[] = { - { "god", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGodModeCheatCommand, "", NULL }, - { "casttime", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleCasttimeCheatCommand, "", NULL }, - { "cooldown", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleCoolDownCheatCommand, "", NULL }, - { "power", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandlePowerCheatCommand, "", NULL }, - { "waterwalk", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleWaterWalkCheatCommand, "", NULL }, - { "status", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleCheatStatusCommand, "", NULL }, - { "taxi", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleTaxiCheatCommand, "", NULL }, - { "explore", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleExploreCheatCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "god", RBAC_PERM_COMMAND_CHEAT_GOD, false, &HandleGodModeCheatCommand, "", NULL }, + { "casttime", RBAC_PERM_COMMAND_CHEAT_CASTTIME, false, &HandleCasttimeCheatCommand, "", NULL }, + { "cooldown", RBAC_PERM_COMMAND_CHEAT_COOLDOWN, false, &HandleCoolDownCheatCommand, "", NULL }, + { "power", RBAC_PERM_COMMAND_CHEAT_POWER, false, &HandlePowerCheatCommand, "", NULL }, + { "waterwalk", RBAC_PERM_COMMAND_CHEAT_WATERWALK, false, &HandleWaterWalkCheatCommand, "", NULL }, + { "status", RBAC_PERM_COMMAND_CHEAT_STATUS, false, &HandleCheatStatusCommand, "", NULL }, + { "taxi", RBAC_PERM_COMMAND_CHEAT_TAXI, false, &HandleTaxiCheatCommand, "", NULL }, + { "explore", RBAC_PERM_COMMAND_CHEAT_EXPLORE, false, &HandleExploreCheatCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "cheat", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", cheatCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "cheat", RBAC_PERM_COMMAND_CHEAT, false, NULL, "", cheatCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From f53c61c93e384924e545498c605b06b1949292fc Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 09:54:49 +0200 Subject: [PATCH 05/29] Core/RBAC: Move debug commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_01_auth_misc.sql | 93 +++++++++++++++++++ .../world/2013_09_02_02_world_command.sql | 46 +++++++++ src/server/game/Accounts/RBAC.h | 42 ++++++++- src/server/scripts/Commands/cs_debug.cpp | 90 +++++++++--------- 4 files changed, 225 insertions(+), 46 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_01_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_02_world_command.sql diff --git a/sql/updates/auth/2013_09_02_01_auth_misc.sql b/sql/updates/auth/2013_09_02_01_auth_misc.sql new file mode 100644 index 00000000000..7d13404d087 --- /dev/null +++ b/sql/updates/auth/2013_09_02_01_auth_misc.sql @@ -0,0 +1,93 @@ +/* cs_debug.cpp */ + +SET @id = 300; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+40; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'debug'), +(@id+1, 'debug anim'), +(@id+2, 'debug areatriggers'), +(@id+3, 'debug arena'), +(@id+4, 'debug bg'), +(@id+5, 'debug entervehicle'), +(@id+6, 'debug getitemstate'), +(@id+7, 'debug getitemvalue'), +(@id+8, 'debug getvalue'), +(@id+9, 'debug hostil'), +(@id+10, 'debug itemexpire'), +(@id+11, 'debug lootrecipient'), +(@id+12, 'debug los'), +(@id+13, 'debug mod32value'), +(@id+14, 'debug moveflags'), +(@id+15, 'debug play'), +(@id+16, 'debug play cinematics'), +(@id+17, 'debug play movie'), +(@id+18, 'debug play sound'), +(@id+19, 'debug send'), +(@id+20, 'debug send buyerror'), +(@id+21, 'debug send channelnotify'), +(@id+22, 'debug send chatmessage'), +(@id+23, 'debug send equiperror'), +(@id+24, 'debug send largepacket'), +(@id+25, 'debug send opcode'), +(@id+26, 'debug send qinvalidmsg'), +(@id+27, 'debug send qpartymsg'), +(@id+28, 'debug send sellerror'), +(@id+29, 'debug send setphaseshift'), +(@id+30, 'debug send spellfail'), +(@id+31, 'debug setaurastate'), +(@id+32, 'debug setbit'), +(@id+33, 'debug setitemvalue'), +(@id+34, 'debug setvalue'), +(@id+35, 'debug setvid'), +(@id+36, 'debug spawnvehicle'), +(@id+37, 'debug threat'), +(@id+38, 'debug update'), +(@id+39, 'debug uws'), +(@id+40, 'wpgps'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+40; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(2, @id+0), +(3, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5), +(4, @id+6), +(4, @id+7), +(4, @id+8), +(4, @id+9), +(4, @id+10), +(3, @id+11), +(2, @id+12), +(4, @id+13), +(4, @id+14), +(2, @id+15), +(2, @id+16), +(2, @id+17), +(2, @id+18), +(4, @id+19), +(4, @id+20), +(4, @id+21), +(4, @id+22), +(4, @id+23), +(4, @id+24), +(4, @id+25), +(4, @id+26), +(4, @id+27), +(4, @id+28), +(4, @id+29), +(4, @id+30), +(4, @id+31), +(4, @id+32), +(4, @id+33), +(4, @id+34), +(4, @id+35), +(4, @id+36), +(4, @id+37), +(4, @id+38), +(4, @id+39), +(4, @id+40); diff --git a/sql/updates/world/2013_09_02_02_world_command.sql b/sql/updates/world/2013_09_02_02_world_command.sql new file mode 100644 index 00000000000..af7b68a87da --- /dev/null +++ b/sql/updates/world/2013_09_02_02_world_command.sql @@ -0,0 +1,46 @@ +/* cs_debug.cpp */ + +SET @id = 300; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'debug'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'debug anim'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'debug areatriggers'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'debug arena'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'debug bg'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'debug entervehicle'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'debug getitemstate'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'debug getitemvalue'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'debug getvalue'; +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'debug hostil'; +UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'debug itemexpire'; +UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'debug lootrecipient'; +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'debug los'; +UPDATE `command` SET `permission` = @id+13 WHERE `name` = 'debug mod32value'; +UPDATE `command` SET `permission` = @id+14 WHERE `name` = 'debug moveflags'; +UPDATE `command` SET `permission` = @id+15 WHERE `name` = 'debug play'; +UPDATE `command` SET `permission` = @id+16 WHERE `name` = 'debug play cinematics'; +UPDATE `command` SET `permission` = @id+17 WHERE `name` = 'debug play movie'; +UPDATE `command` SET `permission` = @id+18 WHERE `name` = 'debug play sound'; +UPDATE `command` SET `permission` = @id+19 WHERE `name` = 'debug send'; +UPDATE `command` SET `permission` = @id+20 WHERE `name` = 'debug send buyerror'; +UPDATE `command` SET `permission` = @id+21 WHERE `name` = 'debug send channelnotify'; +UPDATE `command` SET `permission` = @id+22 WHERE `name` = 'debug send chatmessage'; +UPDATE `command` SET `permission` = @id+23 WHERE `name` = 'debug send equiperror'; +UPDATE `command` SET `permission` = @id+24 WHERE `name` = 'debug send largepacket'; +UPDATE `command` SET `permission` = @id+25 WHERE `name` = 'debug send opcode'; +UPDATE `command` SET `permission` = @id+26 WHERE `name` = 'debug send qinvalidmsg'; +UPDATE `command` SET `permission` = @id+27 WHERE `name` = 'debug send qpartymsg'; +UPDATE `command` SET `permission` = @id+28 WHERE `name` = 'debug send sellerror'; +UPDATE `command` SET `permission` = @id+29 WHERE `name` = 'debug send setphaseshift'; +UPDATE `command` SET `permission` = @id+30 WHERE `name` = 'debug send spellfail'; +UPDATE `command` SET `permission` = @id+31 WHERE `name` = 'debug setaurastate'; +UPDATE `command` SET `permission` = @id+32 WHERE `name` = 'debug setbit'; +UPDATE `command` SET `permission` = @id+33 WHERE `name` = 'debug setitemvalue'; +UPDATE `command` SET `permission` = @id+34 WHERE `name` = 'debug setvalue'; +UPDATE `command` SET `permission` = @id+35 WHERE `name` = 'debug setvid'; +UPDATE `command` SET `permission` = @id+36 WHERE `name` = 'debug spawnvehicle'; +UPDATE `command` SET `permission` = @id+37 WHERE `name` = 'debug threat'; +UPDATE `command` SET `permission` = @id+38 WHERE `name` = 'debug update'; +UPDATE `command` SET `permission` = @id+39 WHERE `name` = 'debug uws'; +UPDATE `command` SET `permission` = @id+40 WHERE `name` = 'wpgps'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 139aa8c93aa..675a1d2de5d 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -177,7 +177,47 @@ enum RBACPermissions RBAC_PERM_COMMAND_CHEAT_STATUS = 297, RBAC_PERM_COMMAND_CHEAT_TAXI = 298, RBAC_PERM_COMMAND_CHEAT_WATERWALK = 299, - + RBAC_PERM_COMMAND_DEBUG = 300, + RBAC_PERM_COMMAND_DEBUG_ANIM = 301, + RBAC_PERM_COMMAND_DEBUG_AREATRIGGERS = 302, + RBAC_PERM_COMMAND_DEBUG_ARENA = 303, + RBAC_PERM_COMMAND_DEBUG_BG = 304, + RBAC_PERM_COMMAND_DEBUG_ENTERVEHICLE = 305, + RBAC_PERM_COMMAND_DEBUG_GETITEMSTATE = 306, + RBAC_PERM_COMMAND_DEBUG_GETITEMVALUE = 307, + RBAC_PERM_COMMAND_DEBUG_GETVALUE = 308, + RBAC_PERM_COMMAND_DEBUG_HOSTIL = 309, + RBAC_PERM_COMMAND_DEBUG_ITEMEXPIRE = 310, + RBAC_PERM_COMMAND_DEBUG_LOOTRECIPIENT = 311, + RBAC_PERM_COMMAND_DEBUG_LOS = 312, + RBAC_PERM_COMMAND_DEBUG_MOD32VALUE = 313, + RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS = 314, + RBAC_PERM_COMMAND_DEBUG_PLAY = 315, + RBAC_PERM_COMMAND_DEBUG_PLAY_CINEMATIC = 316, + RBAC_PERM_COMMAND_DEBUG_PLAY_MOVIE = 317, + RBAC_PERM_COMMAND_DEBUG_PLAY_SOUND = 318, + RBAC_PERM_COMMAND_DEBUG_SEND = 319, + RBAC_PERM_COMMAND_DEBUG_SEND_BUYERROR = 320, + RBAC_PERM_COMMAND_DEBUG_SEND_CHANNELNOTIFY = 321, + RBAC_PERM_COMMAND_DEBUG_SEND_CHATMESSAGE = 322, + RBAC_PERM_COMMAND_DEBUG_SEND_EQUIPERROR = 323, + RBAC_PERM_COMMAND_DEBUG_SEND_LARGEPACKET = 324, + RBAC_PERM_COMMAND_DEBUG_SEND_OPCODE = 325, + RBAC_PERM_COMMAND_DEBUG_SEND_QINVALIDMSG = 326, + RBAC_PERM_COMMAND_DEBUG_SEND_QPARTYMSG = 327, + RBAC_PERM_COMMAND_DEBUG_SEND_SELLERROR = 328, + RBAC_PERM_COMMAND_DEBUG_SEND_SETPHASESHIFT = 329, + RBAC_PERM_COMMAND_DEBUG_SEND_SPELLFAIL = 330, + RBAC_PERM_COMMAND_DEBUG_SETAURASTATE = 331, + RBAC_PERM_COMMAND_DEBUG_SETBIT = 332, + RBAC_PERM_COMMAND_DEBUG_SETITEMVALUE = 333, + RBAC_PERM_COMMAND_DEBUG_SETVALUE = 334, + RBAC_PERM_COMMAND_DEBUG_SETVID = 335, + RBAC_PERM_COMMAND_DEBUG_SPAWNVEHICLE = 336, + RBAC_PERM_COMMAND_DEBUG_THREAT = 337, + RBAC_PERM_COMMAND_DEBUG_UPDATE = 338, + RBAC_PERM_COMMAND_DEBUG_UWS = 339, + RBAC_PERM_COMMAND_WPGPS = 340, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 4c099d49773..df80ba3c797 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -44,60 +44,60 @@ public: { static ChatCommand debugPlayCommandTable[] = { - { "cinematic", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleDebugPlayCinematicCommand, "", NULL }, - { "movie", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleDebugPlayMovieCommand, "", NULL }, - { "sound", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleDebugPlaySoundCommand, "", NULL }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "cinematic", RBAC_PERM_COMMAND_DEBUG_PLAY_CINEMATIC, false, &HandleDebugPlayCinematicCommand, "", NULL }, + { "movie", RBAC_PERM_COMMAND_DEBUG_PLAY_MOVIE, false, &HandleDebugPlayMovieCommand, "", NULL }, + { "sound", RBAC_PERM_COMMAND_DEBUG_PLAY_SOUND, false, &HandleDebugPlaySoundCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand debugSendCommandTable[] = { - { "buyerror", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendBuyErrorCommand, "", NULL }, - { "channelnotify", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendChannelNotifyCommand, "", NULL }, - { "chatmmessage", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendChatMsgCommand, "", NULL }, - { "equiperror", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendEquipErrorCommand, "", NULL }, - { "largepacket", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendLargePacketCommand, "", NULL }, - { "opcode", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendOpcodeCommand, "", NULL }, - { "qpartymsg", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendQuestPartyMsgCommand, "", NULL }, - { "qinvalidmsg", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendQuestInvalidMsgCommand, "", NULL }, - { "sellerror", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendSellErrorCommand, "", NULL }, - { "setphaseshift", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendSetPhaseShiftCommand, "", NULL }, - { "spellfail", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendSpellFailCommand, "", NULL }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "buyerror", RBAC_PERM_COMMAND_DEBUG_SEND_BUYERROR, false, &HandleDebugSendBuyErrorCommand, "", NULL }, + { "channelnotify", RBAC_PERM_COMMAND_DEBUG_SEND_CHANNELNOTIFY, false, &HandleDebugSendChannelNotifyCommand, "", NULL }, + { "chatmessage", RBAC_PERM_COMMAND_DEBUG_SEND_CHATMESSAGE, false, &HandleDebugSendChatMsgCommand, "", NULL }, + { "equiperror", RBAC_PERM_COMMAND_DEBUG_SEND_EQUIPERROR, false, &HandleDebugSendEquipErrorCommand, "", NULL }, + { "largepacket", RBAC_PERM_COMMAND_DEBUG_SEND_LARGEPACKET, false, &HandleDebugSendLargePacketCommand, "", NULL }, + { "opcode", RBAC_PERM_COMMAND_DEBUG_SEND_OPCODE, false, &HandleDebugSendOpcodeCommand, "", NULL }, + { "qpartymsg", RBAC_PERM_COMMAND_DEBUG_SEND_QPARTYMSG, false, &HandleDebugSendQuestPartyMsgCommand, "", NULL }, + { "qinvalidmsg", RBAC_PERM_COMMAND_DEBUG_SEND_QINVALIDMSG, false, &HandleDebugSendQuestInvalidMsgCommand, "", NULL }, + { "sellerror", RBAC_PERM_COMMAND_DEBUG_SEND_SELLERROR, false, &HandleDebugSendSellErrorCommand, "", NULL }, + { "setphaseshift", RBAC_PERM_COMMAND_DEBUG_SEND_SETPHASESHIFT, false, &HandleDebugSendSetPhaseShiftCommand, "", NULL }, + { "spellfail", RBAC_PERM_COMMAND_DEBUG_SEND_SPELLFAIL, false, &HandleDebugSendSpellFailCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand debugCommandTable[] = { - { "setbit", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSet32BitCommand, "", NULL }, - { "threat", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugThreatListCommand, "", NULL }, - { "hostil", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugHostileRefListCommand, "", NULL }, - { "anim", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleDebugAnimCommand, "", NULL }, - { "arena", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugArenaCommand, "", NULL }, - { "bg", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugBattlegroundCommand, "", NULL }, - { "getitemstate", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugGetItemStateCommand, "", NULL }, - { "lootrecipient", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleDebugGetLootRecipientCommand, "", NULL }, - { "getvalue", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugGetValueCommand, "", NULL }, - { "getitemvalue", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugGetItemValueCommand, "", NULL }, - { "Mod32Value", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugMod32ValueCommand, "", NULL }, - { "play", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", debugPlayCommandTable }, - { "send", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", debugSendCommandTable }, - { "setaurastate", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSetAuraStateCommand, "", NULL }, - { "setitemvalue", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSetItemValueCommand, "", NULL }, - { "setvalue", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSetValueCommand, "", NULL }, - { "spawnvehicle", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSpawnVehicleCommand, "", NULL }, - { "setvid", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSetVehicleIdCommand, "", NULL }, - { "entervehicle", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugEnterVehicleCommand, "", NULL }, - { "uws", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugUpdateWorldStateCommand, "", NULL }, - { "update", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugUpdateCommand, "", NULL }, - { "itemexpire", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugItemExpireCommand, "", NULL }, - { "areatriggers", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugAreaTriggersCommand, "", NULL }, - { "los", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleDebugLoSCommand, "", NULL }, - { "moveflags", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugMoveflagsCommand, "", NULL }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "setbit", RBAC_PERM_COMMAND_DEBUG_SETBIT, false, &HandleDebugSet32BitCommand, "", NULL }, + { "threat", RBAC_PERM_COMMAND_DEBUG_THREAT, false, &HandleDebugThreatListCommand, "", NULL }, + { "hostil", RBAC_PERM_COMMAND_DEBUG_HOSTIL, false, &HandleDebugHostileRefListCommand, "", NULL }, + { "anim", RBAC_PERM_COMMAND_DEBUG_ANIM, false, &HandleDebugAnimCommand, "", NULL }, + { "arena", RBAC_PERM_COMMAND_DEBUG_ARENA, false, &HandleDebugArenaCommand, "", NULL }, + { "bg", RBAC_PERM_COMMAND_DEBUG_BG, false, &HandleDebugBattlegroundCommand, "", NULL }, + { "getitemstate", RBAC_PERM_COMMAND_DEBUG_GETITEMSTATE, false, &HandleDebugGetItemStateCommand, "", NULL }, + { "lootrecipient", RBAC_PERM_COMMAND_DEBUG_LOOTRECIPIENT, false, &HandleDebugGetLootRecipientCommand, "", NULL }, + { "getvalue", RBAC_PERM_COMMAND_DEBUG_GETVALUE, false, &HandleDebugGetValueCommand, "", NULL }, + { "getitemvalue", RBAC_PERM_COMMAND_DEBUG_GETITEMVALUE, false, &HandleDebugGetItemValueCommand, "", NULL }, + { "Mod32Value", RBAC_PERM_COMMAND_DEBUG_MOD32VALUE, false, &HandleDebugMod32ValueCommand, "", NULL }, + { "play", RBAC_PERM_COMMAND_DEBUG_PLAY, false, NULL, "", debugPlayCommandTable }, + { "send", RBAC_PERM_COMMAND_DEBUG_SEND, false, NULL, "", debugSendCommandTable }, + { "setaurastate", RBAC_PERM_COMMAND_DEBUG_SETAURASTATE, false, &HandleDebugSetAuraStateCommand, "", NULL }, + { "setitemvalue", RBAC_PERM_COMMAND_DEBUG_SETITEMVALUE, false, &HandleDebugSetItemValueCommand, "", NULL }, + { "setvalue", RBAC_PERM_COMMAND_DEBUG_SETVALUE, false, &HandleDebugSetValueCommand, "", NULL }, + { "spawnvehicle", RBAC_PERM_COMMAND_DEBUG_SPAWNVEHICLE, false, &HandleDebugSpawnVehicleCommand, "", NULL }, + { "setvid", RBAC_PERM_COMMAND_DEBUG_SETVID, false, &HandleDebugSetVehicleIdCommand, "", NULL }, + { "entervehicle", RBAC_PERM_COMMAND_DEBUG_ENTERVEHICLE, false, &HandleDebugEnterVehicleCommand, "", NULL }, + { "uws", RBAC_PERM_COMMAND_DEBUG_UWS, false, &HandleDebugUpdateWorldStateCommand, "", NULL }, + { "update", RBAC_PERM_COMMAND_DEBUG_UPDATE, false, &HandleDebugUpdateCommand, "", NULL }, + { "itemexpire", RBAC_PERM_COMMAND_DEBUG_ITEMEXPIRE, false, &HandleDebugItemExpireCommand, "", NULL }, + { "areatriggers", RBAC_PERM_COMMAND_DEBUG_AREATRIGGERS, false, &HandleDebugAreaTriggersCommand, "", NULL }, + { "los", RBAC_PERM_COMMAND_DEBUG_LOS, false, &HandleDebugLoSCommand, "", NULL }, + { "moveflags", RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS, false, &HandleDebugMoveflagsCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "debug", RBAC_PERM_MODERATOR_COMMANDS, true, NULL, "", debugCommandTable }, - { "wpgps", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleWPGPSCommand, "", NULL }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "debug", RBAC_PERM_COMMAND_DEBUG, true, NULL, "", debugCommandTable }, + { "wpgps", RBAC_PERM_COMMAND_WPGPS, false, &HandleWPGPSCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 3e45640135bd24886e76eea393a706bc5b6a86a4 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 10:00:43 +0200 Subject: [PATCH 06/29] Core/RBAC: Move deserter commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_02_auth_misc.sql | 25 +++++++++++++++++++ .../world/2013_09_02_03_world_command.sql | 12 +++++++++ src/server/game/Accounts/RBAC.h | 7 ++++++ src/server/scripts/Commands/cs_deserter.cpp | 22 ++++++++-------- 4 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_02_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_03_world_command.sql diff --git a/sql/updates/auth/2013_09_02_02_auth_misc.sql b/sql/updates/auth/2013_09_02_02_auth_misc.sql new file mode 100644 index 00000000000..29ab2abf80d --- /dev/null +++ b/sql/updates/auth/2013_09_02_02_auth_misc.sql @@ -0,0 +1,25 @@ +/* cs_deserter.cpp */ + +SET @id = 341; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+6; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'deserter'), +(@id+1, 'deserter bg'), +(@id+2, 'deserter bg add'), +(@id+3, 'deserter bg remove'), +(@id+4, 'deserter instance'), +(@id+5, 'deserter instance add'), +(@id+6, 'deserter instance remove'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+6; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5), +(4, @id+6); diff --git a/sql/updates/world/2013_09_02_03_world_command.sql b/sql/updates/world/2013_09_02_03_world_command.sql new file mode 100644 index 00000000000..3ba92cc30e7 --- /dev/null +++ b/sql/updates/world/2013_09_02_03_world_command.sql @@ -0,0 +1,12 @@ +/* cs_deserter.cpp */ + +SET @id = 341; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'deserter'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'deserter bg'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'deserter bg add'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'deserter bg remove'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'deserter instance'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'deserter instance add'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'deserter instance remove'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 675a1d2de5d..5a8c51d205a 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -218,6 +218,13 @@ enum RBACPermissions RBAC_PERM_COMMAND_DEBUG_UPDATE = 338, RBAC_PERM_COMMAND_DEBUG_UWS = 339, RBAC_PERM_COMMAND_WPGPS = 340, + RBAC_PERM_COMMAND_DESERTER = 341, + RBAC_PERM_COMMAND_DESERTER_BG = 342, + RBAC_PERM_COMMAND_DESERTER_BG_ADD = 343, + RBAC_PERM_COMMAND_DESERTER_BG_REMOVE = 344, + RBAC_PERM_COMMAND_DESERTER_INSTANCE = 345, + RBAC_PERM_COMMAND_DESERTER_INSTANCE_ADD = 346, + RBAC_PERM_COMMAND_DESERTER_INSTANCE_REMOVE = 347, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/scripts/Commands/cs_deserter.cpp b/src/server/scripts/Commands/cs_deserter.cpp index 583b6b741bd..aa0d34e3638 100644 --- a/src/server/scripts/Commands/cs_deserter.cpp +++ b/src/server/scripts/Commands/cs_deserter.cpp @@ -47,27 +47,27 @@ public: { static ChatCommand deserterInstanceCommandTable[] = { - { "add", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDeserterInstanceAdd, "", NULL }, - { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDeserterInstanceRemove, "", NULL }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "add", RBAC_PERM_COMMAND_DESERTER_INSTANCE_ADD, false, &HandleDeserterInstanceAdd, "", NULL }, + { "remove", RBAC_PERM_COMMAND_DESERTER_INSTANCE_REMOVE, false, &HandleDeserterInstanceRemove, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand deserterBGCommandTable[] = { - { "add", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDeserterBGAdd, "", NULL }, - { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDeserterBGRemove, "", NULL }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "add", RBAC_PERM_COMMAND_DESERTER_BG_ADD, false, &HandleDeserterBGAdd, "", NULL }, + { "remove", RBAC_PERM_COMMAND_DESERTER_BG_REMOVE, false, &HandleDeserterBGRemove, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand deserterCommandTable[] = { - { "instance", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", deserterInstanceCommandTable }, - { "bg", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", deserterBGCommandTable }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "instance", RBAC_PERM_COMMAND_DESERTER_INSTANCE, false, NULL, "", deserterInstanceCommandTable }, + { "bg", RBAC_PERM_COMMAND_DESERTER_BG, false, NULL, "", deserterBGCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "deserter", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", deserterCommandTable }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "deserter", RBAC_PERM_COMMAND_DESERTER, false, NULL, "", deserterCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From cf9d01a0f3a9ae136854529eb1e52a0a8ffb08bb Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 10:03:19 +0200 Subject: [PATCH 07/29] Normalize sql file names from 722a6c1 --- .../{2013_08_17_00_auth_rbac.sql => 2013_09_01_01_auth_misc.sql} | 0 ...rinity_strings.sql => 2013_09_01_07_world_trinity_strings.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename sql/updates/auth/{2013_08_17_00_auth_rbac.sql => 2013_09_01_01_auth_misc.sql} (100%) rename sql/updates/world/{2013_08_19_00_world_trinity_strings.sql => 2013_09_01_07_world_trinity_strings.sql} (100%) diff --git a/sql/updates/auth/2013_08_17_00_auth_rbac.sql b/sql/updates/auth/2013_09_01_01_auth_misc.sql similarity index 100% rename from sql/updates/auth/2013_08_17_00_auth_rbac.sql rename to sql/updates/auth/2013_09_01_01_auth_misc.sql diff --git a/sql/updates/world/2013_08_19_00_world_trinity_strings.sql b/sql/updates/world/2013_09_01_07_world_trinity_strings.sql similarity index 100% rename from sql/updates/world/2013_08_19_00_world_trinity_strings.sql rename to sql/updates/world/2013_09_01_07_world_trinity_strings.sql From 225691e0ae3b3efe271bd13bcb613405835a5041 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 11:17:15 +0200 Subject: [PATCH 08/29] Core/RBAC: Move disable commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_03_auth_misc.sql | 49 +++++++++++++++++++ .../world/2013_09_02_04_world_command.sql | 24 +++++++++ src/server/game/Accounts/RBAC.h | 19 +++++++ src/server/scripts/Commands/cs_disable.cpp | 46 ++++++++--------- 4 files changed, 115 insertions(+), 23 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_03_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_04_world_command.sql diff --git a/sql/updates/auth/2013_09_02_03_auth_misc.sql b/sql/updates/auth/2013_09_02_03_auth_misc.sql new file mode 100644 index 00000000000..cf1f1837af4 --- /dev/null +++ b/sql/updates/auth/2013_09_02_03_auth_misc.sql @@ -0,0 +1,49 @@ +/* cs_disable.cpp */ + +SET @id = 348; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+18; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'disable'), +(@id+1, 'disable add'), +(@id+2, 'disable add achievement_criteria'), +(@id+3, 'disable add battleground'), +(@id+4, 'disable add map'), +(@id+5, 'disable add mmap'), +(@id+6, 'disable add outdoorpvp'), +(@id+7, 'disable add quest'), +(@id+8, 'disable add spell'), +(@id+9, 'disable add vmap'), +(@id+10, 'disable remove'), +(@id+11, 'disable remove achievement_criteria'), +(@id+12, 'disable remove battleground'), +(@id+13, 'disable remove map'), +(@id+14, 'disable remove mmap'), +(@id+15, 'disable remove outdoorpvp'), +(@id+16, 'disable remove quest'), +(@id+17, 'disable remove spell'), +(@id+18, 'disable remove vmap'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+18; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5), +(4, @id+6), +(4, @id+7), +(4, @id+8), +(4, @id+9), +(4, @id+10), +(4, @id+11), +(4, @id+12), +(4, @id+13), +(4, @id+14), +(4, @id+15), +(4, @id+16), +(4, @id+17), +(4, @id+18); diff --git a/sql/updates/world/2013_09_02_04_world_command.sql b/sql/updates/world/2013_09_02_04_world_command.sql new file mode 100644 index 00000000000..a4bc79b8a39 --- /dev/null +++ b/sql/updates/world/2013_09_02_04_world_command.sql @@ -0,0 +1,24 @@ +/* cs_disable.cpp */ + +SET @id = 348; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'disable'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'disable add'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'disable add achievement_criteria'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'disable add battleground'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'disable add map'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'disable add mmap'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'disable add outdoorpvp'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'disable add quest'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'disable add spell'; +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'disable add vmap'; +UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'disable remove'; +UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'disable remove achievement_criteria'; +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'disable remove battleground'; +UPDATE `command` SET `permission` = @id+13 WHERE `name` = 'disable remove map'; +UPDATE `command` SET `permission` = @id+14 WHERE `name` = 'disable remove mmap'; +UPDATE `command` SET `permission` = @id+15 WHERE `name` = 'disable remove outdoorpvp'; +UPDATE `command` SET `permission` = @id+16 WHERE `name` = 'disable remove quest'; +UPDATE `command` SET `permission` = @id+17 WHERE `name` = 'disable remove spell'; +UPDATE `command` SET `permission` = @id+18 WHERE `name` = 'disable remove vmap'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 5a8c51d205a..a4cbef2dfa7 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -225,6 +225,25 @@ enum RBACPermissions RBAC_PERM_COMMAND_DESERTER_INSTANCE = 345, RBAC_PERM_COMMAND_DESERTER_INSTANCE_ADD = 346, RBAC_PERM_COMMAND_DESERTER_INSTANCE_REMOVE = 347, + RBAC_PERM_COMMAND_DISABLE = 348, + RBAC_PERM_COMMAND_DISABLE_ADD = 349, + 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 = 358, + 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, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp index 038727a6207..23e7fa8eb98 100644 --- a/src/server/scripts/Commands/cs_disable.cpp +++ b/src/server/scripts/Commands/cs_disable.cpp @@ -41,38 +41,38 @@ public: { static ChatCommand removeDisableCommandTable[] = { - { "spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableSpellCommand, "", NULL }, - { "quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableQuestCommand, "", NULL }, - { "map", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableMapCommand, "", NULL }, - { "battleground", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableBattlegroundCommand, "", NULL }, - { "achievement_criteria", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableAchievementCriteriaCommand, "", NULL }, - { "outdoorpvp", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableOutdoorPvPCommand, "", NULL }, - { "vmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableVmapCommand, "", NULL }, - { "mmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableMMapCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "spell", RBAC_PERM_COMMAND_DISABLE_REMOVE_SPELL, true, &HandleRemoveDisableSpellCommand, "", NULL }, + { "quest", RBAC_PERM_COMMAND_DISABLE_REMOVE_QUEST, true, &HandleRemoveDisableQuestCommand, "", NULL }, + { "map", RBAC_PERM_COMMAND_DISABLE_REMOVE_MAP, true, &HandleRemoveDisableMapCommand, "", NULL }, + { "battleground", RBAC_PERM_COMMAND_DISABLE_REMOVE_BATTLEGROUND, true, &HandleRemoveDisableBattlegroundCommand, "", NULL }, + { "achievement_criteria", RBAC_PERM_COMMAND_DISABLE_REMOVE_ACHIEVEMENT_CRITERIA, true, &HandleRemoveDisableAchievementCriteriaCommand, "", NULL }, + { "outdoorpvp", RBAC_PERM_COMMAND_DISABLE_REMOVE_OUTDOORPVP, true, &HandleRemoveDisableOutdoorPvPCommand, "", NULL }, + { "vmap", RBAC_PERM_COMMAND_DISABLE_REMOVE_VMAP, true, &HandleRemoveDisableVmapCommand, "", NULL }, + { "mmap", RBAC_PERM_COMMAND_DISABLE_REMOVE_MMAP, true, &HandleRemoveDisableMMapCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand addDisableCommandTable[] = { - { "spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableSpellCommand, "", NULL }, - { "quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableQuestCommand, "", NULL }, - { "map", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableMapCommand, "", NULL }, - { "battleground", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableBattlegroundCommand, "", NULL }, - { "achievement_criteria", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableAchievementCriteriaCommand, "", NULL }, - { "outdoorpvp", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableOutdoorPvPCommand, "", NULL }, - { "vmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableVmapCommand, "", NULL }, - { "mmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableMMapCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "spell", RBAC_PERM_COMMAND_DISABLE_ADD_SPELL, true, &HandleAddDisableSpellCommand, "", NULL }, + { "quest", RBAC_PERM_COMMAND_DISABLE_ADD_QUEST, true, &HandleAddDisableQuestCommand, "", NULL }, + { "map", RBAC_PERM_COMMAND_DISABLE_ADD_MAP, true, &HandleAddDisableMapCommand, "", NULL }, + { "battleground", RBAC_PERM_COMMAND_DISABLE_ADD_BATTLEGROUND, true, &HandleAddDisableBattlegroundCommand, "", NULL }, + { "achievement_criteria", RBAC_PERM_COMMAND_DISABLE_ADD_ACHIEVEMENT_CRITERIA, true, &HandleAddDisableAchievementCriteriaCommand, "", NULL }, + { "outdoorpvp", RBAC_PERM_COMMAND_DISABLE_ADD_OUTDOORPVP, true, &HandleAddDisableOutdoorPvPCommand, "", NULL }, + { "vmap", RBAC_PERM_COMMAND_DISABLE_ADD_VMAP, true, &HandleAddDisableVmapCommand, "", NULL }, + { "mmap", RBAC_PERM_COMMAND_DISABLE_ADD_MMAP, true, &HandleAddDisableMMapCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand disableCommandTable[] = { - { "add", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", addDisableCommandTable }, - { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", removeDisableCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "add", RBAC_PERM_COMMAND_DISABLE_ADD, true, NULL, "", addDisableCommandTable }, + { "remove", RBAC_PERM_COMMAND_DISABLE_REMOVE, true, NULL, "", removeDisableCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "disable", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", disableCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "disable", RBAC_PERM_COMMAND_DISABLE, false, NULL, "", disableCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From fced8a896e2c22e95bdbf853898671f10f746277 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 11:20:05 +0200 Subject: [PATCH 09/29] Core/RBAC: Move event commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_04_auth_misc.sql | 19 +++++++++++++++++++ .../world/2013_09_02_05_world_command.sql | 9 +++++++++ src/server/game/Accounts/RBAC.h | 4 ++++ src/server/scripts/Commands/cs_event.cpp | 14 +++++++------- 4 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_04_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_05_world_command.sql diff --git a/sql/updates/auth/2013_09_02_04_auth_misc.sql b/sql/updates/auth/2013_09_02_04_auth_misc.sql new file mode 100644 index 00000000000..6c14080dad2 --- /dev/null +++ b/sql/updates/auth/2013_09_02_04_auth_misc.sql @@ -0,0 +1,19 @@ +/* cs_disable.cpp */ + +SET @id = 367; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+3; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'event'), +(@id+1, 'event activelist'), +(@id+2, 'event start'), +(@id+3, 'event stop'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+3; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(2, @id+0), +(2, @id+1), +(2, @id+2), +(2, @id+3); diff --git a/sql/updates/world/2013_09_02_05_world_command.sql b/sql/updates/world/2013_09_02_05_world_command.sql new file mode 100644 index 00000000000..db279dd6f60 --- /dev/null +++ b/sql/updates/world/2013_09_02_05_world_command.sql @@ -0,0 +1,9 @@ +/* cs_event.cpp */ + +SET @id = 367; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'event'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'event activelist'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'event start'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'event stop'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index a4cbef2dfa7..2f82edecf4d 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -244,6 +244,10 @@ enum RBACPermissions 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 = 367, + RBAC_PERM_COMMAND_EVENT_ACTIVELIST = 368, + RBAC_PERM_COMMAND_EVENT_START = 369, + RBAC_PERM_COMMAND_EVENT_STOP = 370, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/scripts/Commands/cs_event.cpp b/src/server/scripts/Commands/cs_event.cpp index 0deb0c95fcc..491ae65e0ca 100644 --- a/src/server/scripts/Commands/cs_event.cpp +++ b/src/server/scripts/Commands/cs_event.cpp @@ -37,16 +37,16 @@ public: { static ChatCommand eventCommandTable[] = { - { "activelist", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleEventActiveListCommand, "", NULL }, - { "start", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleEventStartCommand, "", NULL }, - { "stop", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleEventStopCommand, "", NULL }, - { "", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleEventInfoCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "activelist", RBAC_PERM_COMMAND_EVENT_ACTIVELIST, true, &HandleEventActiveListCommand, "", NULL }, + { "start", RBAC_PERM_COMMAND_EVENT_START, true, &HandleEventStartCommand, "", NULL }, + { "stop", RBAC_PERM_COMMAND_EVENT_STOP, true, &HandleEventStopCommand, "", NULL }, + { "", RBAC_PERM_COMMAND_EVENT, true, &HandleEventInfoCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "event", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", eventCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "event", RBAC_PERM_COMMAND_EVENT, false, NULL, "", eventCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 1bccf67c097850dd7dccc92497e79ab0d88fd1e0 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 11:24:09 +0200 Subject: [PATCH 10/29] Core/RBAC: Move gm commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_05_auth_misc.sql | 23 +++++++++++++++++++ .../world/2013_09_02_06_world_command.sql | 11 +++++++++ src/server/game/Accounts/RBAC.h | 7 ++++++ src/server/scripts/Commands/cs_gm.cpp | 18 +++++++-------- 4 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_05_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_06_world_command.sql diff --git a/sql/updates/auth/2013_09_02_05_auth_misc.sql b/sql/updates/auth/2013_09_02_05_auth_misc.sql new file mode 100644 index 00000000000..8d71ab530dd --- /dev/null +++ b/sql/updates/auth/2013_09_02_05_auth_misc.sql @@ -0,0 +1,23 @@ +/* cs_gm.cpp */ + +SET @id = 371; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+5; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'gm'), +(@id+1, 'gm chat'), +(@id+2, 'gm fly'), +(@id+3, 'gm ingame'), +(@id+4, 'gm list'), +(@id+5, 'gm visible'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+5; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(2, @id+0), +(2, @id+1), +(4, @id+2), +(2, @id+3), +(4, @id+4), +(2, @id+5); diff --git a/sql/updates/world/2013_09_02_06_world_command.sql b/sql/updates/world/2013_09_02_06_world_command.sql new file mode 100644 index 00000000000..fe033e544ea --- /dev/null +++ b/sql/updates/world/2013_09_02_06_world_command.sql @@ -0,0 +1,11 @@ +/* cs_gm.cpp */ + +SET @id = 371; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'gm'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'gm chat'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'gm fly'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'gm ingame'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'gm list'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'gm visible'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 2f82edecf4d..5bcd522b3b6 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -248,6 +248,13 @@ enum RBACPermissions 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, + // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index 0eb5bc1ef69..24eff29e271 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -40,18 +40,18 @@ public: { static ChatCommand gmCommandTable[] = { - { "chat", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGMChatCommand, "", NULL }, - { "fly", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGMFlyCommand, "", NULL }, - { "ingame", RBAC_PERM_PLAYER_COMMANDS, true, &HandleGMListIngameCommand, "", NULL }, - { "list", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleGMListFullCommand, "", NULL }, - { "visible", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGMVisibleCommand, "", NULL }, - { "", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGMCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "chat", RBAC_PERM_COMMAND_GM_CHAT, false, &HandleGMChatCommand, "", NULL }, + { "fly", RBAC_PERM_COMMAND_GM_FLY, false, &HandleGMFlyCommand, "", NULL }, + { "ingame", RBAC_PERM_COMMAND_GM_INGAME, true, &HandleGMListIngameCommand, "", NULL }, + { "list", RBAC_PERM_COMMAND_GM_LIST, true, &HandleGMListFullCommand, "", NULL }, + { "visible", RBAC_PERM_COMMAND_GM_VISIBLE, false, &HandleGMVisibleCommand, "", NULL }, + { "", RBAC_PERM_COMMAND_GM, false, &HandleGMCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "gm", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", gmCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "gm", RBAC_PERM_COMMAND_GM, false, NULL, "", gmCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 29c57c3447393e14079c07ee6b5fb5f07876a5c0 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 11:33:45 +0200 Subject: [PATCH 11/29] Core/RBAC: Move go commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_06_auth_misc.sql | 31 +++++++++++++++++++ .../world/2013_09_02_07_world_command.sql | 15 +++++++++ src/server/game/Accounts/RBAC.h | 11 ++++++- src/server/scripts/Commands/cs_go.cpp | 26 ++++++++-------- 4 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_06_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_07_world_command.sql diff --git a/sql/updates/auth/2013_09_02_06_auth_misc.sql b/sql/updates/auth/2013_09_02_06_auth_misc.sql new file mode 100644 index 00000000000..e66e4d30db1 --- /dev/null +++ b/sql/updates/auth/2013_09_02_06_auth_misc.sql @@ -0,0 +1,31 @@ +/* cs_go.cpp */ + +SET @id = 377; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+9; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'go'), +(@id+1, 'go creature'), +(@id+2, 'go graveyard'), +(@id+3, 'go grid'), +(@id+4, 'go object'), +(@id+5, 'go taxinode'), +(@id+6, 'go ticket'), +(@id+7, 'go trigger'), +(@id+8, 'go xyz'), +(@id+9, 'go zonexy'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+9; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(2, @id+0), +(2, @id+1), +(2, @id+2), +(2, @id+3), +(2, @id+4), +(2, @id+5), +(2, @id+6), +(2, @id+7), +(2, @id+8), +(2, @id+9); diff --git a/sql/updates/world/2013_09_02_07_world_command.sql b/sql/updates/world/2013_09_02_07_world_command.sql new file mode 100644 index 00000000000..58350a6c729 --- /dev/null +++ b/sql/updates/world/2013_09_02_07_world_command.sql @@ -0,0 +1,15 @@ +/* cs_go.cpp */ + +SET @id = 371; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'go'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'go creature'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'go graveyard'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'go grid'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'go object'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'go taxinode'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'go ticket'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'go trigger'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'go xyz'; +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'go zonexy'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 5bcd522b3b6..c2b3ff42369 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -254,7 +254,16 @@ enum RBACPermissions 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_GO_CREATURE = 378, + RBAC_PERM_COMMAND_GO_GRAVEYARD = 379, + RBAC_PERM_COMMAND_GO_GRID = 380, + RBAC_PERM_COMMAND_GO_OBJECT = 381, + RBAC_PERM_COMMAND_GO_TAXINODE = 382, + RBAC_PERM_COMMAND_GO_TICKET = 383, + RBAC_PERM_COMMAND_GO_TRIGGER = 384, + RBAC_PERM_COMMAND_GO_XYZ = 385, + RBAC_PERM_COMMAND_GO_ZONEXY = 386, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index 21a545ae3f9..caa7979f866 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -39,23 +39,23 @@ public: { static ChatCommand goCommandTable[] = { - { "creature", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoCreatureCommand, "", NULL }, - { "graveyard", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoGraveyardCommand, "", NULL }, - { "grid", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoGridCommand, "", NULL }, - { "object", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoObjectCommand, "", NULL }, - { "taxinode", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoTaxinodeCommand, "", NULL }, - { "trigger", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoTriggerCommand, "", NULL }, - { "zonexy", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoZoneXYCommand, "", NULL }, - { "xyz", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoXYZCommand, "", NULL }, - { "ticket", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoTicketCommand, "", NULL }, - { "", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoXYZCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "creature", RBAC_PERM_COMMAND_GO_CREATURE, false, &HandleGoCreatureCommand, "", NULL }, + { "graveyard", RBAC_PERM_COMMAND_GO_GRAVEYARD, false, &HandleGoGraveyardCommand, "", NULL }, + { "grid", RBAC_PERM_COMMAND_GO_GRID, false, &HandleGoGridCommand, "", NULL }, + { "object", RBAC_PERM_COMMAND_GO_OBJECT, false, &HandleGoObjectCommand, "", NULL }, + { "taxinode", RBAC_PERM_COMMAND_GO_TAXINODE, false, &HandleGoTaxinodeCommand, "", NULL }, + { "trigger", RBAC_PERM_COMMAND_GO_TRIGGER, false, &HandleGoTriggerCommand, "", NULL }, + { "zonexy", RBAC_PERM_COMMAND_GO_ZONEXY, false, &HandleGoZoneXYCommand, "", NULL }, + { "xyz", RBAC_PERM_COMMAND_GO_XYZ, false, &HandleGoXYZCommand, "", NULL }, + { "ticket", RBAC_PERM_COMMAND_GO_TICKET, false, &HandleGoTicketCommand, "", NULL }, + { "", RBAC_PERM_COMMAND_GO, false, &HandleGoXYZCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "go", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", goCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "go", RBAC_PERM_COMMAND_GO, false, NULL, "", goCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 015eee068b4bfe9af5af461ed03abab4674c358c Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 11:38:41 +0200 Subject: [PATCH 12/29] Core/RBAC: Move gobject commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_07_auth_misc.sql | 37 +++++++++++++++++++ .../world/2013_09_02_08_world_command.sql | 18 +++++++++ src/server/game/Accounts/RBAC.h | 14 +++++++ src/server/scripts/Commands/cs_gobject.cpp | 36 +++++++++--------- 4 files changed, 87 insertions(+), 18 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_07_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_08_world_command.sql diff --git a/sql/updates/auth/2013_09_02_07_auth_misc.sql b/sql/updates/auth/2013_09_02_07_auth_misc.sql new file mode 100644 index 00000000000..3fb2b343b9b --- /dev/null +++ b/sql/updates/auth/2013_09_02_07_auth_misc.sql @@ -0,0 +1,37 @@ +/* cs_gobject.cpp */ + +SET @id = 387; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+12; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'gobject'), +(@id+1, 'gobject activate'), +(@id+2, 'gobject add'), +(@id+3, 'gobject add temp'), +(@id+4, 'gobject delete'), +(@id+5, 'gobject info'), +(@id+6, 'gobject move'), +(@id+7, 'gobject near'), +(@id+8, 'gobject set'), +(@id+9, 'gobject set phase'), +(@id+10, 'gobject set state'), +(@id+11, 'gobject target'), +(@id+12, 'gobject turn'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+12; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(3, @id+0), +(3, @id+1), +(3, @id+2), +(3, @id+3), +(3, @id+4), +(3, @id+5), +(3, @id+6), +(3, @id+7), +(3, @id+8), +(3, @id+9), +(3, @id+10), +(3, @id+11), +(3, @id+12); diff --git a/sql/updates/world/2013_09_02_08_world_command.sql b/sql/updates/world/2013_09_02_08_world_command.sql new file mode 100644 index 00000000000..d09a7030a5b --- /dev/null +++ b/sql/updates/world/2013_09_02_08_world_command.sql @@ -0,0 +1,18 @@ +/* cs_gobject.cpp */ + +SET @id = 371; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'gobject'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'gobject activate'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'gobject add'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'gobject add temp'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'gobject delete'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'gobject info'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'gobject move'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'gobject near'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'gobject set'; +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'gobject set phase'; +UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'gobject set state'; +UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'gobject target'; +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'gobject turn'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index c2b3ff42369..32509817a1b 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -264,6 +264,20 @@ enum RBACPermissions RBAC_PERM_COMMAND_GO_TRIGGER = 384, RBAC_PERM_COMMAND_GO_XYZ = 385, RBAC_PERM_COMMAND_GO_ZONEXY = 386, + RBAC_PERM_COMMAND_GOBJECT = 387, + 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 = 395, + 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, + // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 140219cdf3c..2c5e9923f6e 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -41,33 +41,33 @@ public: { static ChatCommand gobjectAddCommandTable[] = { - { "temp", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectAddTempCommand, "", NULL }, - { "", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectAddCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "temp", RBAC_PERM_COMMAND_GOBJECT_ADD_TEMP, false, &HandleGameObjectAddTempCommand, "", NULL }, + { "", RBAC_PERM_COMMAND_GOBJECT_ADD, false, &HandleGameObjectAddCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand gobjectSetCommandTable[] = { - { "phase", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectSetPhaseCommand, "", NULL }, - { "state", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectSetStateCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "phase", RBAC_PERM_COMMAND_GOBJECT_SET_PHASE, false, &HandleGameObjectSetPhaseCommand, "", NULL }, + { "state", RBAC_PERM_COMMAND_GOBJECT_SET_STATE, false, &HandleGameObjectSetStateCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand gobjectCommandTable[] = { - { "activate", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectActivateCommand, "", NULL }, - { "delete", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectDeleteCommand, "", NULL }, - { "info", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectInfoCommand, "", NULL }, - { "move", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectMoveCommand, "", NULL }, - { "near", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectNearCommand, "", NULL }, - { "target", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectTargetCommand, "", NULL }, - { "turn", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectTurnCommand, "", NULL }, - { "add", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", gobjectAddCommandTable }, - { "set", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", gobjectSetCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "activate", RBAC_PERM_COMMAND_GOBJECT_ACTIVATE, false, &HandleGameObjectActivateCommand, "", NULL }, + { "delete", RBAC_PERM_COMMAND_GOBJECT_DELETE, false, &HandleGameObjectDeleteCommand, "", NULL }, + { "info", RBAC_PERM_COMMAND_GOBJECT_INFO, false, &HandleGameObjectInfoCommand, "", NULL }, + { "move", RBAC_PERM_COMMAND_GOBJECT_MOVE, false, &HandleGameObjectMoveCommand, "", NULL }, + { "near", RBAC_PERM_COMMAND_GOBJECT_NEAR, false, &HandleGameObjectNearCommand, "", NULL }, + { "target", RBAC_PERM_COMMAND_GOBJECT_TARGET, false, &HandleGameObjectTargetCommand, "", NULL }, + { "turn", RBAC_PERM_COMMAND_GOBJECT_TURN, false, &HandleGameObjectTurnCommand, "", NULL }, + { "add", RBAC_PERM_COMMAND_GOBJECT_ADD, false, NULL, "", gobjectAddCommandTable }, + { "set", RBAC_PERM_COMMAND_GOBJECT_SET, false, NULL, "", gobjectSetCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "gobject", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", gobjectCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "gobject", RBAC_PERM_COMMAND_GOBJECT, false, NULL, "", gobjectCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 11233dbd736f8166d8e8565915ab4712d11d7eb3 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 11:45:36 +0200 Subject: [PATCH 13/29] Core/RBAC: Move guild commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_08_auth_misc.sql | 25 +++++++++++++++++++ .../world/2013_09_02_09_world_command.sql | 12 +++++++++ src/server/game/Accounts/RBAC.h | 7 ++++++ src/server/scripts/Commands/cs_guild.cpp | 18 ++++++------- 4 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_08_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_09_world_command.sql diff --git a/sql/updates/auth/2013_09_02_08_auth_misc.sql b/sql/updates/auth/2013_09_02_08_auth_misc.sql new file mode 100644 index 00000000000..b6bf442aeb5 --- /dev/null +++ b/sql/updates/auth/2013_09_02_08_auth_misc.sql @@ -0,0 +1,25 @@ +/* cs_guild.cpp */ + +SET @id = 401; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+6; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'guild'), +(@id+1, 'guild create'), +(@id+2, 'guild delete'), +(@id+3, 'guild invite'), +(@id+4, 'guild uninvite'), +(@id+5, 'guild rank'), +(@id+6, 'guild rename'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+6; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5), +(4, @id+6); diff --git a/sql/updates/world/2013_09_02_09_world_command.sql b/sql/updates/world/2013_09_02_09_world_command.sql new file mode 100644 index 00000000000..5d32d09a45a --- /dev/null +++ b/sql/updates/world/2013_09_02_09_world_command.sql @@ -0,0 +1,12 @@ +/* cs_gobject.cpp */ + +SET @id = 401; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'guild'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'guild create'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'guild delete'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'guild invite'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'guild uninvite'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'guild rank'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'guild rename'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 32509817a1b..77e2a647e73 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -277,6 +277,13 @@ enum RBACPermissions 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, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index f1251cb2932..0af0da10846 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -38,18 +38,18 @@ public: { static ChatCommand guildCommandTable[] = { - { "create", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildCreateCommand, "", NULL }, - { "delete", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildDeleteCommand, "", NULL }, - { "invite", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildInviteCommand, "", NULL }, - { "uninvite", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildUninviteCommand, "", NULL }, - { "rank", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildRankCommand, "", NULL }, - { "rename", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildRenameCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "create", RBAC_PERM_COMMAND_GUILD_CREATE, true, &HandleGuildCreateCommand, "", NULL }, + { "delete", RBAC_PERM_COMMAND_GUILD_DELETE, true, &HandleGuildDeleteCommand, "", NULL }, + { "invite", RBAC_PERM_COMMAND_GUILD_INVITE, true, &HandleGuildInviteCommand, "", NULL }, + { "uninvite", RBAC_PERM_COMMAND_GUILD_UNINVITE, true, &HandleGuildUninviteCommand, "", NULL }, + { "rank", RBAC_PERM_COMMAND_GUILD_RANK, true, &HandleGuildRankCommand, "", NULL }, + { "rename", RBAC_PERM_COMMAND_GUILD_RENAME, true, &HandleGuildRenameCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "guild", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", guildCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "guild", RBAC_PERM_COMMAND_GUILD, true, NULL, "", guildCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 08ef6bd9f8c76c0606818cb66c4754a28f185e25 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 11:53:22 +0200 Subject: [PATCH 14/29] Core/RBAC: Move honor commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_08_auth_misc.sql | 22 +++++++------------ sql/updates/auth/2013_09_02_09_auth_misc.sql | 19 ++++++++++++++++ .../world/2013_09_02_10_world_command.sql | 9 ++++++++ src/server/game/Accounts/RBAC.h | 4 ++++ src/server/scripts/Commands/cs_honor.cpp | 16 +++++++------- 5 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_09_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_10_world_command.sql diff --git a/sql/updates/auth/2013_09_02_08_auth_misc.sql b/sql/updates/auth/2013_09_02_08_auth_misc.sql index b6bf442aeb5..6efc9765ab6 100644 --- a/sql/updates/auth/2013_09_02_08_auth_misc.sql +++ b/sql/updates/auth/2013_09_02_08_auth_misc.sql @@ -1,25 +1,19 @@ -/* cs_guild.cpp */ +/* cs_honor.cpp */ SET @id = 401; -- Add new permissions -DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+6; +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+3; INSERT INTO `rbac_permissions` (`id`, `name`) VALUES -(@id+0, 'guild'), -(@id+1, 'guild create'), -(@id+2, 'guild delete'), -(@id+3, 'guild invite'), -(@id+4, 'guild uninvite'), -(@id+5, 'guild rank'), -(@id+6, 'guild rename'); +(@id+0, 'honor'), +(@id+1, 'honor add'), +(@id+2, 'honor add kill'), +(@id+3, 'honor update'); -- Add permissions to "corresponding Commands Role" -DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+6; +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+3; INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES (4, @id+0), (4, @id+1), (4, @id+2), -(4, @id+3), -(4, @id+4), -(4, @id+5), -(4, @id+6); +(4, @id+3); diff --git a/sql/updates/auth/2013_09_02_09_auth_misc.sql b/sql/updates/auth/2013_09_02_09_auth_misc.sql new file mode 100644 index 00000000000..3b16d9181d5 --- /dev/null +++ b/sql/updates/auth/2013_09_02_09_auth_misc.sql @@ -0,0 +1,19 @@ +/* cs_honor.cpp */ + +SET @id = 408; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+3; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'honor'), +(@id+1, 'honor add'), +(@id+2, 'honor add kill'), +(@id+3, 'honor update'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+3; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(2, @id+0), +(2, @id+1), +(2, @id+2), +(2, @id+3); diff --git a/sql/updates/world/2013_09_02_10_world_command.sql b/sql/updates/world/2013_09_02_10_world_command.sql new file mode 100644 index 00000000000..f038adf1b30 --- /dev/null +++ b/sql/updates/world/2013_09_02_10_world_command.sql @@ -0,0 +1,9 @@ +/* cs_honor.cpp */ + +SET @id = 408; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'honor'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'honor add'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'honor add kill'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'honor update'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 77e2a647e73..e34aad3d857 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -284,6 +284,10 @@ enum RBACPermissions RBAC_PERM_COMMAND_GUILD_UNINVITE = 405, RBAC_PERM_COMMAND_GUILD_RANK = 406, RBAC_PERM_COMMAND_GUILD_RENAME = 407, + RBAC_PERM_COMMAND_HONOR = 408, + RBAC_PERM_COMMAND_HONOR_ADD = 409, + RBAC_PERM_COMMAND_HONOR_ADD_KILL = 410, + RBAC_PERM_COMMAND_HONOR_UPDATE = 411, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_honor.cpp b/src/server/scripts/Commands/cs_honor.cpp index 4707e3d65c3..cd8e2630a67 100644 --- a/src/server/scripts/Commands/cs_honor.cpp +++ b/src/server/scripts/Commands/cs_honor.cpp @@ -37,22 +37,22 @@ public: { static ChatCommand honorAddCommandTable[] = { - { "kill", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleHonorAddKillCommand, "", NULL }, - { "", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleHonorAddCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "kill", RBAC_PERM_COMMAND_HONOR_ADD_KILL, false, &HandleHonorAddKillCommand, "", NULL }, + { "", RBAC_PERM_COMMAND_HONOR_ADD, false, &HandleHonorAddCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand honorCommandTable[] = { - { "add", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", honorAddCommandTable }, - { "update", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleHonorUpdateCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "add", RBAC_PERM_COMMAND_HONOR_ADD, false, NULL, "", honorAddCommandTable }, + { "update", RBAC_PERM_COMMAND_HONOR_UPDATE, false, &HandleHonorUpdateCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "honor", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", honorCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "honor", RBAC_PERM_COMMAND_HONOR, false, NULL, "", honorCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 2625e78f8089e0bea57bbeffaf77e1b9a2c96a6b Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 11:58:14 +0200 Subject: [PATCH 15/29] Core/RBAC: Move instance commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_10_auth_misc.sql | 21 +++++++++++++++++++ .../world/2013_09_02_11_world_command.sql | 10 +++++++++ src/server/game/Accounts/RBAC.h | 5 +++++ src/server/scripts/Commands/cs_instance.cpp | 14 ++++++------- 4 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_10_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_11_world_command.sql diff --git a/sql/updates/auth/2013_09_02_10_auth_misc.sql b/sql/updates/auth/2013_09_02_10_auth_misc.sql new file mode 100644 index 00000000000..a69174d6ca3 --- /dev/null +++ b/sql/updates/auth/2013_09_02_10_auth_misc.sql @@ -0,0 +1,21 @@ +/* cs_instance.cpp */ + +SET @id = 412; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+4; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'instance'), +(@id+1, 'instance listbinds'), +(@id+2, 'instance unbind'), +(@id+3, 'instance stats'), +(@id+4, 'instance savedata'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+4; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(2, @id+0), +(2, @id+1), +(2, @id+2), +(2, @id+3), +(2, @id+4); diff --git a/sql/updates/world/2013_09_02_11_world_command.sql b/sql/updates/world/2013_09_02_11_world_command.sql new file mode 100644 index 00000000000..c134fb703e6 --- /dev/null +++ b/sql/updates/world/2013_09_02_11_world_command.sql @@ -0,0 +1,10 @@ +/* cs_instance.cpp */ + +SET @id = 408; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'instance'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'instance listbinds'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'instance unbind'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'instance stats'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'instance savedata'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index e34aad3d857..4d5b2150be8 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -288,6 +288,11 @@ enum RBACPermissions RBAC_PERM_COMMAND_HONOR_ADD = 409, RBAC_PERM_COMMAND_HONOR_ADD_KILL = 410, RBAC_PERM_COMMAND_HONOR_UPDATE = 411, + RBAC_PERM_COMMAND_INSTANCE = 412, + RBAC_PERM_COMMAND_INSTANCE_LISTBINDS = 413, + RBAC_PERM_COMMAND_INSTANCE_UNBIND = 414, + RBAC_PERM_COMMAND_INSTANCE_STATS = 415, + RBAC_PERM_COMMAND_INSTANCE_SAVEDATA = 416, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp index 65dfa46ebd7..b597caf0ae0 100644 --- a/src/server/scripts/Commands/cs_instance.cpp +++ b/src/server/scripts/Commands/cs_instance.cpp @@ -39,17 +39,17 @@ public: { static ChatCommand instanceCommandTable[] = { - { "listbinds", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleInstanceListBindsCommand, "", NULL }, - { "unbind", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleInstanceUnbindCommand, "", NULL }, - { "stats", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleInstanceStatsCommand, "", NULL }, - { "savedata", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleInstanceSaveDataCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "listbinds", RBAC_PERM_COMMAND_INSTANCE_LISTBINDS, false, &HandleInstanceListBindsCommand, "", NULL }, + { "unbind", RBAC_PERM_COMMAND_INSTANCE_UNBIND, false, &HandleInstanceUnbindCommand, "", NULL }, + { "stats", RBAC_PERM_COMMAND_INSTANCE_STATS, true, &HandleInstanceStatsCommand, "", NULL }, + { "savedata", RBAC_PERM_COMMAND_INSTANCE_SAVEDATA, false, &HandleInstanceSaveDataCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "instance", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", instanceCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "instance", RBAC_PERM_COMMAND_INSTANCE, true, NULL, "", instanceCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; From c0dfdeab1c24e9435f7aad37a7c2b50e08b0d37f Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 12:12:20 +0200 Subject: [PATCH 16/29] Core/RBAC: Move learn commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_11_auth_misc.sql | 37 +++++++++++++++++++ .../world/2013_09_02_12_world_command.sql | 18 +++++++++ src/server/game/Accounts/RBAC.h | 13 +++++++ src/server/scripts/Commands/cs_learn.cpp | 36 +++++++++--------- 4 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_11_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_12_world_command.sql diff --git a/sql/updates/auth/2013_09_02_11_auth_misc.sql b/sql/updates/auth/2013_09_02_11_auth_misc.sql new file mode 100644 index 00000000000..04c9b4fb6b4 --- /dev/null +++ b/sql/updates/auth/2013_09_02_11_auth_misc.sql @@ -0,0 +1,37 @@ +/* cs_learn.cpp */ + +SET @id = 417; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+12; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'learn'), +(@id+1, 'learn all'), +(@id+2, 'learn all my'), +(@id+3, 'learn all my class'), +(@id+4, 'learn all my pettalents'), +(@id+5, 'learn all my spells'), +(@id+6, 'learn all my talents'), +(@id+7, 'learn all gm'), +(@id+8, 'learn all crafts'), +(@id+9, 'learn all default'), +(@id+10, 'learn all lang'), +(@id+11, 'learn all recipes'), +(@id+12, 'unlearn'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+12; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5), +(4, @id+6), +(4, @id+7), +(4, @id+8), +(4, @id+9), +(4, @id+10), +(4, @id+11), +(4, @id+12); diff --git a/sql/updates/world/2013_09_02_12_world_command.sql b/sql/updates/world/2013_09_02_12_world_command.sql new file mode 100644 index 00000000000..67f544755e2 --- /dev/null +++ b/sql/updates/world/2013_09_02_12_world_command.sql @@ -0,0 +1,18 @@ +/* cs_learn.cpp */ + +SET @id = 417; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'learn'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'learn all'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'learn all my'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'learn all my class'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'learn all my pettalents'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'learn all my spells'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'learn all my talents'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'learn all gm'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'learn all crafts'; +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'learn all default'; +UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'learn all lang'; +UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'learn all recipes'; +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'unlearn'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 4d5b2150be8..646b23f647e 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -293,6 +293,19 @@ enum RBACPermissions 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 = 418, + RBAC_PERM_COMMAND_LEARN_ALL_MY = 419, + RBAC_PERM_COMMAND_LEARN_ALL_MY_CLASS = 420, + RBAC_PERM_COMMAND_LEARN_ALL_MY_PETTALENTS = 421, + RBAC_PERM_COMMAND_LEARN_ALL_MY_SPELLS = 422, + RBAC_PERM_COMMAND_LEARN_ALL_MY_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, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index c165eebe3b5..5c97e80aede 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -40,36 +40,36 @@ public: { static ChatCommand learnAllMyCommandTable[] = { - { "class", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnAllMyClassCommand, "", NULL }, - { "pettalents", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnAllMyPetTalentsCommand, "", NULL }, - { "spells", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnAllMySpellsCommand, "", NULL }, - { "talents", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnAllMyTalentsCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "class", RBAC_PERM_COMMAND_LEARN_ALL_MY_CLASS, false, &HandleLearnAllMyClassCommand, "", NULL }, + { "pettalents", RBAC_PERM_COMMAND_LEARN_ALL_MY_PETTALENTS, false, &HandleLearnAllMyPetTalentsCommand, "", NULL }, + { "spells", RBAC_PERM_COMMAND_LEARN_ALL_MY_SPELLS, false, &HandleLearnAllMySpellsCommand, "", NULL }, + { "talents", RBAC_PERM_COMMAND_LEARN_ALL_MY_TALENTS, false, &HandleLearnAllMyTalentsCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand learnAllCommandTable[] = { - { "my", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", learnAllMyCommandTable }, - { "gm", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLearnAllGMCommand, "", NULL }, - { "crafts", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLearnAllCraftsCommand, "", NULL }, - { "default", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleLearnAllDefaultCommand, "", NULL }, - { "lang", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleLearnAllLangCommand, "", NULL }, - { "recipes", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLearnAllRecipesCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "my", RBAC_PERM_COMMAND_LEARN_ALL_MY, false, NULL, "", learnAllMyCommandTable }, + { "gm", RBAC_PERM_COMMAND_LEARN_ALL_GM, false, &HandleLearnAllGMCommand, "", NULL }, + { "crafts", RBAC_PERM_COMMAND_LEARN_ALL_CRAFTS, false, &HandleLearnAllCraftsCommand, "", NULL }, + { "default", RBAC_PERM_COMMAND_LEARN_ALL_DEFAULT, false, &HandleLearnAllDefaultCommand, "", NULL }, + { "lang", RBAC_PERM_COMMAND_LEARN_ALL_LANG, false, &HandleLearnAllLangCommand, "", NULL }, + { "recipes", RBAC_PERM_COMMAND_LEARN_ALL_RECIPES, false, &HandleLearnAllRecipesCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand learnCommandTable[] = { - { "all", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", learnAllCommandTable }, - { "", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "all", RBAC_PERM_COMMAND_LEARN_ALL, false, NULL, "", learnAllCommandTable }, + { "", RBAC_PERM_COMMAND_LEARN, false, &HandleLearnCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "learn", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", learnCommandTable }, - { "unlearn", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleUnLearnCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "learn", RBAC_PERM_COMMAND_LEARN, false, NULL, "", learnCommandTable }, + { "unlearn", RBAC_PERM_COMMAND_UNLEARN, false, &HandleUnLearnCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 4219f45c8596b9c2b6ad094681f003ae09dca1bd Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 12:17:46 +0200 Subject: [PATCH 17/29] Core/RBAC: Move lfg commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_12_auth_misc.sql | 23 +++++++++++++++++++ .../world/2013_09_02_13_world_command.sql | 11 +++++++++ src/server/game/Accounts/RBAC.h | 6 +++++ src/server/scripts/Commands/cs_lfg.cpp | 16 ++++++------- 4 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_12_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_13_world_command.sql diff --git a/sql/updates/auth/2013_09_02_12_auth_misc.sql b/sql/updates/auth/2013_09_02_12_auth_misc.sql new file mode 100644 index 00000000000..640f54b03f8 --- /dev/null +++ b/sql/updates/auth/2013_09_02_12_auth_misc.sql @@ -0,0 +1,23 @@ +/* cs_lfg.cpp */ + +SET @id = 430; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+5; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'lfg'), +(@id+1, 'lfg player'), +(@id+2, 'lfg group'), +(@id+3, 'lfg queue'), +(@id+4, 'lfg clean'), +(@id+5, 'lfg options'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+5; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(2, @id+0), +(2, @id+1), +(2, @id+2), +(2, @id+3), +(4, @id+4), +(4, @id+5); diff --git a/sql/updates/world/2013_09_02_13_world_command.sql b/sql/updates/world/2013_09_02_13_world_command.sql new file mode 100644 index 00000000000..55fff43aafb --- /dev/null +++ b/sql/updates/world/2013_09_02_13_world_command.sql @@ -0,0 +1,11 @@ +/* cs_learn.cpp */ + +SET @id = 430; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'lfg'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'lfg player'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'lfg group'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'lfg queue'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'lfg clean'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'lfg options'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 646b23f647e..2ac74586514 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -306,6 +306,12 @@ enum RBACPermissions RBAC_PERM_COMMAND_LEARN_ALL_LANG = 427, RBAC_PERM_COMMAND_LEARN_ALL_RECIPES = 428, RBAC_PERM_COMMAND_UNLEARN = 429, + RBAC_PERM_COMMAND_LFG = 430, + 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, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp index c11a00c7bba..76d9fe50de1 100644 --- a/src/server/scripts/Commands/cs_lfg.cpp +++ b/src/server/scripts/Commands/cs_lfg.cpp @@ -45,18 +45,18 @@ public: { static ChatCommand lfgCommandTable[] = { - { "player", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLfgPlayerInfoCommand, "", NULL }, - { "group", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLfgGroupInfoCommand, "", NULL }, - { "queue", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLfgQueueInfoCommand, "", NULL }, - { "clean", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLfgCleanCommand, "", NULL }, - { "options", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLfgOptionsCommand, "", NULL }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "player", RBAC_PERM_COMMAND_LFG_PLAYER, false, &HandleLfgPlayerInfoCommand, "", NULL }, + { "group", RBAC_PERM_COMMAND_LFG_GROUP, false, &HandleLfgGroupInfoCommand, "", NULL }, + { "queue", RBAC_PERM_COMMAND_LFG_QUEUE, false, &HandleLfgQueueInfoCommand, "", NULL }, + { "clean", RBAC_PERM_COMMAND_LFG_CLEAN, false, &HandleLfgCleanCommand, "", NULL }, + { "options", RBAC_PERM_COMMAND_LFG_OPTIONS, false, &HandleLfgOptionsCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "lfg", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", lfgCommandTable }, - { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL } + { "lfg", RBAC_PERM_COMMAND_LFG, false, NULL, "", lfgCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From eb73684952250de21db53588add498a4f0c25604 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 12:25:32 +0200 Subject: [PATCH 18/29] Core/RBAC: Move list commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_13_auth_misc.sql | 23 +++++++++++++++++++ .../world/2013_09_02_13_world_command.sql | 2 +- .../world/2013_09_02_14_world_command.sql | 11 +++++++++ src/server/game/Accounts/RBAC.h | 6 +++++ src/server/scripts/Commands/cs_list.cpp | 16 ++++++------- 5 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_13_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_14_world_command.sql diff --git a/sql/updates/auth/2013_09_02_13_auth_misc.sql b/sql/updates/auth/2013_09_02_13_auth_misc.sql new file mode 100644 index 00000000000..d370b3f959d --- /dev/null +++ b/sql/updates/auth/2013_09_02_13_auth_misc.sql @@ -0,0 +1,23 @@ +/* cs_list.cpp */ + +SET @id = 436; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+5; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'list'), +(@id+1, 'list creature'), +(@id+2, 'list item'), +(@id+3, 'list object'), +(@id+4, 'list auras'), +(@id+5, 'list mail'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+5; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5); diff --git a/sql/updates/world/2013_09_02_13_world_command.sql b/sql/updates/world/2013_09_02_13_world_command.sql index 55fff43aafb..0d5c6fdc545 100644 --- a/sql/updates/world/2013_09_02_13_world_command.sql +++ b/sql/updates/world/2013_09_02_13_world_command.sql @@ -1,4 +1,4 @@ -/* cs_learn.cpp */ +/* cs_lfg.cpp */ SET @id = 430; diff --git a/sql/updates/world/2013_09_02_14_world_command.sql b/sql/updates/world/2013_09_02_14_world_command.sql new file mode 100644 index 00000000000..08b092c7f0a --- /dev/null +++ b/sql/updates/world/2013_09_02_14_world_command.sql @@ -0,0 +1,11 @@ +/* cs_list.cpp */ + +SET @id = 436; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'list'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'list creature'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'list item'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'list object'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'list auras'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'list mail'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 2ac74586514..da2da919659 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -312,6 +312,12 @@ enum RBACPermissions RBAC_PERM_COMMAND_LFG_QUEUE = 433, RBAC_PERM_COMMAND_LFG_CLEAN = 434, RBAC_PERM_COMMAND_LFG_OPTIONS = 435, + RBAC_PERM_COMMAND_LIST = 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, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 228eb1afb80..83e4fc01769 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -40,17 +40,17 @@ public: { static ChatCommand listCommandTable[] = { - { "creature", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleListCreatureCommand, "", NULL }, - { "item", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleListItemCommand, "", NULL }, - { "object", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleListObjectCommand, "", NULL }, - { "auras", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleListAurasCommand, "", NULL }, - { "mail", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleListMailCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "creature", RBAC_PERM_COMMAND_LIST_CREATURE, true, &HandleListCreatureCommand, "", NULL }, + { "item", RBAC_PERM_COMMAND_LIST_ITEM, true, &HandleListItemCommand, "", NULL }, + { "object", RBAC_PERM_COMMAND_LIST_OBJECT, true, &HandleListObjectCommand, "", NULL }, + { "auras", RBAC_PERM_COMMAND_LIST_AURAS, false, &HandleListAurasCommand, "", NULL }, + { "mail", RBAC_PERM_COMMAND_LIST_MAIL, true, &HandleListMailCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "list", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", listCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "list", RBAC_PERM_COMMAND_LIST,true, NULL, "", listCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 2d508387e5cf0910186cdb160cd58181d5715a49 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 12:54:51 +0200 Subject: [PATCH 19/29] Core/Commands: Move lookup commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_14_auth_misc.sql | 43 ++++++++++++++++ .../world/2013_09_02_15_world_command.sql | 21 ++++++++ src/server/game/Accounts/RBAC.h | 16 ++++++ src/server/scripts/Commands/cs_lookup.cpp | 50 +++++++++---------- 4 files changed, 105 insertions(+), 25 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_14_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_15_world_command.sql diff --git a/sql/updates/auth/2013_09_02_14_auth_misc.sql b/sql/updates/auth/2013_09_02_14_auth_misc.sql new file mode 100644 index 00000000000..c324f1342c1 --- /dev/null +++ b/sql/updates/auth/2013_09_02_14_auth_misc.sql @@ -0,0 +1,43 @@ +/* cs_lookup.cpp */ + +SET @id = 442; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+15; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'lookup'), +(@id+1, 'lookup area'), +(@id+2, 'lookup creature'), +(@id+3, 'lookup event'), +(@id+4, 'lookup faction'), +(@id+5, 'lookup item'), +(@id+6, 'lookup itemset'), +(@id+7, 'lookup object'), +(@id+8, 'lookup quest'), +(@id+9, 'lookup player'), +(@id+10, 'lookup skill'), +(@id+11, 'lookup spell'), +(@id+12, 'lookup taxinode'), +(@id+13, 'lookup tele'), +(@id+14, 'lookup title'), +(@id+15, 'lookup map'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+15; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5), +(4, @id+6), +(4, @id+7), +(4, @id+8), +(4, @id+9), +(4, @id+10), +(4, @id+11), +(4, @id+12), +(4, @id+13), +(4, @id+14), +(4, @id+15); diff --git a/sql/updates/world/2013_09_02_15_world_command.sql b/sql/updates/world/2013_09_02_15_world_command.sql new file mode 100644 index 00000000000..9591f741dab --- /dev/null +++ b/sql/updates/world/2013_09_02_15_world_command.sql @@ -0,0 +1,21 @@ +/* cs_lookup.cpp */ + +SET @id = 436; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'lookup'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'lookup area'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'lookup creature'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'lookup event'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'lookup faction'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'lookup item'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'lookup itemset'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'lookup object'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'lookup quest'; +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'lookup player'; +UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'lookup skill'; +UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'lookup spell'; +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'lookup taxinode'; +UPDATE `command` SET `permission` = @id+13 WHERE `name` = 'lookup tele'; +UPDATE `command` SET `permission` = @id+14 WHERE `name` = 'lookup title'; +UPDATE `command` SET `permission` = @id+15 WHERE `name` = 'lookup map'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index da2da919659..474f0c79213 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -318,6 +318,22 @@ enum RBACPermissions 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_SKILL = 452, + RBAC_PERM_COMMAND_LOOKUP_SPELL = 453, + RBAC_PERM_COMMAND_LOOKUP_TAXINODE = 454, + RBAC_PERM_COMMAND_LOOKUP_TELE = 455, + RBAC_PERM_COMMAND_LOOKUP_TITLE = 456, + RBAC_PERM_COMMAND_LOOKUP_MAP = 457, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 990c82df568..56b492a8081 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -41,43 +41,43 @@ public: { static ChatCommand lookupPlayerCommandTable[] = { - { "ip", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupPlayerIpCommand, "", NULL }, - { "account", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupPlayerAccountCommand, "", NULL }, - { "email", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupPlayerEmailCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "ip", RBAC_PERM_COMMAND_LOOKUP_PLAYER_IP, true, &HandleLookupPlayerIpCommand, "", NULL }, + { "account", RBAC_PERM_COMMAND_LOOKUP_PLAYER_ACCOUNT, true, &HandleLookupPlayerAccountCommand, "", NULL }, + { "email", RBAC_PERM_COMMAND_LOOKUP_PLAYER_EMAIL, true, &HandleLookupPlayerEmailCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand lookupSpellCommandTable[] = { - { "id", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupSpellIdCommand, "", NULL }, - { "", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupSpellCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "id", RBAC_PERM_COMMAND_LOOKUP_SPELL_ID, true, &HandleLookupSpellIdCommand, "", NULL }, + { "", RBAC_PERM_COMMAND_LOOKUP_SPELL, true, &HandleLookupSpellCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand lookupCommandTable[] = { - { "area", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleLookupAreaCommand, "", NULL }, - { "creature", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupCreatureCommand, "", NULL }, - { "event", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupEventCommand, "", NULL }, - { "faction", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupFactionCommand, "", NULL }, - { "item", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupItemCommand, "", NULL }, - { "itemset", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupItemSetCommand, "", NULL }, - { "object", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupObjectCommand, "", NULL }, - { "quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupQuestCommand, "", NULL }, - { "player", RBAC_PERM_GAMEMASTER_COMMANDS, true, NULL, "", lookupPlayerCommandTable }, - { "skill", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupSkillCommand, "", NULL }, - { "spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", lookupSpellCommandTable }, - { "taxinode", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupTaxiNodeCommand, "", NULL }, - { "tele", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleLookupTeleCommand, "", NULL }, - { "title", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupTitleCommand, "", NULL }, - { "map", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupMapCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "area", RBAC_PERM_COMMAND_LOOKUP_AREA, true, &HandleLookupAreaCommand, "", NULL }, + { "creature", RBAC_PERM_COMMAND_LOOKUP_CREATURE, true, &HandleLookupCreatureCommand, "", NULL }, + { "event", RBAC_PERM_COMMAND_LOOKUP_EVENT, true, &HandleLookupEventCommand, "", NULL }, + { "faction", RBAC_PERM_COMMAND_LOOKUP_FACTION, true, &HandleLookupFactionCommand, "", NULL }, + { "item", RBAC_PERM_COMMAND_LOOKUP_ITEM, true, &HandleLookupItemCommand, "", NULL }, + { "itemset", RBAC_PERM_COMMAND_LOOKUP_ITEMSET, true, &HandleLookupItemSetCommand, "", NULL }, + { "object", RBAC_PERM_COMMAND_LOOKUP_OBJECT, true, &HandleLookupObjectCommand, "", NULL }, + { "quest", RBAC_PERM_COMMAND_LOOKUP_QUEST, true, &HandleLookupQuestCommand, "", NULL }, + { "player", RBAC_PERM_COMMAND_LOOKUP_PLAYER, true, NULL, "", lookupPlayerCommandTable }, + { "skill", RBAC_PERM_COMMAND_LOOKUP_SKILL, true, &HandleLookupSkillCommand, "", NULL }, + { "spell", RBAC_PERM_COMMAND_LOOKUP_SPELL, true, NULL, "", lookupSpellCommandTable }, + { "taxinode", RBAC_PERM_COMMAND_LOOKUP_TAXINODE, true, &HandleLookupTaxiNodeCommand, "", NULL }, + { "tele", RBAC_PERM_COMMAND_LOOKUP_TELE, true, &HandleLookupTeleCommand, "", NULL }, + { "title", RBAC_PERM_COMMAND_LOOKUP_TITLE, true, &HandleLookupTitleCommand, "", NULL }, + { "map", RBAC_PERM_COMMAND_LOOKUP_MAP, true, &HandleLookupMapCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "lookup", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", lookupCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "lookup", RBAC_PERM_COMMAND_LOOKUP, true, NULL, "", lookupCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From f68471f1420bbf15b705f4ad0d93c77fc892d047 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 13:01:50 +0200 Subject: [PATCH 20/29] Core/RBAC: Move message commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_15_auth_misc.sql | 31 +++++++++++++++++++ .../world/2013_09_02_16_world_command.sql | 15 +++++++++ src/server/game/Accounts/RBAC.h | 10 ++++++ src/server/scripts/Commands/cs_message.cpp | 26 ++++++++-------- 4 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_15_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_16_world_command.sql diff --git a/sql/updates/auth/2013_09_02_15_auth_misc.sql b/sql/updates/auth/2013_09_02_15_auth_misc.sql new file mode 100644 index 00000000000..91ee22923db --- /dev/null +++ b/sql/updates/auth/2013_09_02_15_auth_misc.sql @@ -0,0 +1,31 @@ +/* cs_message.cpp */ + +SET @id = 458; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+9; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'announce'), +(@id+1, 'channel'), +(@id+2, 'channel set'), +(@id+3, 'channel set ownership'), +(@id+4, 'gmannounce'), +(@id+5, 'gmnameannounce'), +(@id+6, 'gmnotify'), +(@id+7, 'nameannounce'), +(@id+8, 'notify'), +(@id+9, 'whispers'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+9; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(2, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(2, @id+4), +(2, @id+5), +(2, @id+6), +(2, @id+7), +(2, @id+8), +(2, @id+9); diff --git a/sql/updates/world/2013_09_02_16_world_command.sql b/sql/updates/world/2013_09_02_16_world_command.sql new file mode 100644 index 00000000000..d283363203e --- /dev/null +++ b/sql/updates/world/2013_09_02_16_world_command.sql @@ -0,0 +1,15 @@ +/* cs_message.cpp */ + +SET @id = 458; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'announce'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'channel'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'channel set'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'channel set ownership'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'gmannounce'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'gmnameannounce'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'gmnotify'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'nameannounce'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'notify'; +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'whispers'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 474f0c79213..498f41b22e4 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -334,6 +334,16 @@ enum RBACPermissions RBAC_PERM_COMMAND_LOOKUP_TELE = 455, RBAC_PERM_COMMAND_LOOKUP_TITLE = 456, RBAC_PERM_COMMAND_LOOKUP_MAP = 457, + RBAC_PERM_COMMAND_ANNOUNCE = 458, + RBAC_PERM_COMMAND_CHANNEL = 459, + RBAC_PERM_COMMAND_CHANNEL_SET = 460, + RBAC_PERM_COMMAND_CHANNEL_SET_OWNERSHIP = 461, + RBAC_PERM_COMMAND_GMANNOUNCE = 462, + RBAC_PERM_COMMAND_GMNAMEANNOUNCE = 463, + RBAC_PERM_COMMAND_GMNOTIFY = 464, + RBAC_PERM_COMMAND_NAMEANNOUNCE = 465, + RBAC_PERM_COMMAND_NOTIFY = 466, + RBAC_PERM_COMMAND_WHISPERS = 467, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index 334968037c3..8c06d87bd7c 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -38,25 +38,25 @@ public: { static ChatCommand channelSetCommandTable[] = { - { "ownership", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleChannelSetOwnership, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "ownership", RBAC_PERM_COMMAND_CHANNEL_SET_OWNERSHIP, false, &HandleChannelSetOwnership, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand channelCommandTable[] = { - { "set", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", channelSetCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "set", RBAC_PERM_COMMAND_CHANNEL_SET, true, NULL, "", channelSetCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "channel", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", channelCommandTable }, - { "nameannounce", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleNameAnnounceCommand, "", NULL }, - { "gmnameannounce", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMNameAnnounceCommand, "", NULL }, - { "announce", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleAnnounceCommand, "", NULL }, - { "gmannounce", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMAnnounceCommand, "", NULL }, - { "notify", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleNotifyCommand, "", NULL }, - { "gmnotify", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMNotifyCommand, "", NULL }, - { "whispers", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleWhispersCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "channel", RBAC_PERM_COMMAND_CHANNEL, true, NULL, "", channelCommandTable }, + { "nameannounce", RBAC_PERM_COMMAND_NAMEANNOUNCE, true, &HandleNameAnnounceCommand, "", NULL }, + { "gmnameannounce", RBAC_PERM_COMMAND_GMNAMEANNOUNCE, true, &HandleGMNameAnnounceCommand, "", NULL }, + { "announce", RBAC_PERM_COMMAND_ANNOUNCE, true, &HandleAnnounceCommand, "", NULL }, + { "gmannounce", RBAC_PERM_COMMAND_GMANNOUNCE, true, &HandleGMAnnounceCommand, "", NULL }, + { "notify", RBAC_PERM_COMMAND_NOTIFY, true, &HandleNotifyCommand, "", NULL }, + { "gmnotify", RBAC_PERM_COMMAND_GMNOTIFY, true, &HandleGMNotifyCommand, "", NULL }, + { "whispers", RBAC_PERM_COMMAND_WHISPERS, false, &HandleWhispersCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From f3487aa0e1731728383b3ef33941dd774297c600 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 13:19:59 +0200 Subject: [PATCH 21/29] Compile Fix (and edit of last 2 sqls to add the missing permissions) --- sql/updates/auth/2013_09_02_14_auth_misc.sql | 25 ++++++++----- sql/updates/auth/2013_09_02_15_auth_misc.sql | 2 +- .../world/2013_09_02_15_world_command.sql | 18 ++++++---- .../world/2013_09_02_16_world_command.sql | 2 +- src/server/game/Accounts/RBAC.h | 36 ++++++++++--------- 5 files changed, 49 insertions(+), 34 deletions(-) diff --git a/sql/updates/auth/2013_09_02_14_auth_misc.sql b/sql/updates/auth/2013_09_02_14_auth_misc.sql index c324f1342c1..c580639da80 100644 --- a/sql/updates/auth/2013_09_02_14_auth_misc.sql +++ b/sql/updates/auth/2013_09_02_14_auth_misc.sql @@ -3,7 +3,7 @@ SET @id = 442; -- Add new permissions -DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+15; +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+19; INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (@id+0, 'lookup'), (@id+1, 'lookup area'), @@ -15,15 +15,19 @@ INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (@id+7, 'lookup object'), (@id+8, 'lookup quest'), (@id+9, 'lookup player'), -(@id+10, 'lookup skill'), -(@id+11, 'lookup spell'), -(@id+12, 'lookup taxinode'), -(@id+13, 'lookup tele'), -(@id+14, 'lookup title'), -(@id+15, 'lookup map'); +(@id+10, 'lookup player ip'), +(@id+11, 'lookup player account'), +(@id+12, 'lookup player email'), +(@id+13, 'lookup skill'), +(@id+14, 'lookup spell'), +(@id+15, 'lookup spell id'), +(@id+16, 'lookup taxinode'), +(@id+17, 'lookup tele'), +(@id+18, 'lookup title'), +(@id+19, 'lookup map'); -- Add permissions to "corresponding Commands Role" -DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+15; +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+19; INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES (4, @id+0), (4, @id+1), @@ -40,4 +44,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES (4, @id+12), (4, @id+13), (4, @id+14), -(4, @id+15); +(4, @id+15), +(4, @id+16), +(4, @id+17), +(4, @id+19); diff --git a/sql/updates/auth/2013_09_02_15_auth_misc.sql b/sql/updates/auth/2013_09_02_15_auth_misc.sql index 91ee22923db..6e5db6e1384 100644 --- a/sql/updates/auth/2013_09_02_15_auth_misc.sql +++ b/sql/updates/auth/2013_09_02_15_auth_misc.sql @@ -1,6 +1,6 @@ /* cs_message.cpp */ -SET @id = 458; +SET @id = 462; -- Add new permissions DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+9; diff --git a/sql/updates/world/2013_09_02_15_world_command.sql b/sql/updates/world/2013_09_02_15_world_command.sql index 9591f741dab..650413fb79d 100644 --- a/sql/updates/world/2013_09_02_15_world_command.sql +++ b/sql/updates/world/2013_09_02_15_world_command.sql @@ -1,6 +1,6 @@ /* cs_lookup.cpp */ -SET @id = 436; +SET @id = 442; -- Update command table with new RBAC permissions UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'lookup'; @@ -13,9 +13,13 @@ UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'lookup itemset'; UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'lookup object'; UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'lookup quest'; UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'lookup player'; -UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'lookup skill'; -UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'lookup spell'; -UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'lookup taxinode'; -UPDATE `command` SET `permission` = @id+13 WHERE `name` = 'lookup tele'; -UPDATE `command` SET `permission` = @id+14 WHERE `name` = 'lookup title'; -UPDATE `command` SET `permission` = @id+15 WHERE `name` = 'lookup map'); +UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'lookup player ip'; +UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'lookup player account'; +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'lookup player email'; +UPDATE `command` SET `permission` = @id+13 WHERE `name` = 'lookup skill'; +UPDATE `command` SET `permission` = @id+14 WHERE `name` = 'lookup spell'; +UPDATE `command` SET `permission` = @id+15 WHERE `name` = 'lookup spell id'; +UPDATE `command` SET `permission` = @id+16 WHERE `name` = 'lookup taxinode'; +UPDATE `command` SET `permission` = @id+17 WHERE `name` = 'lookup tele'; +UPDATE `command` SET `permission` = @id+18 WHERE `name` = 'lookup title'; +UPDATE `command` SET `permission` = @id+19 WHERE `name` = 'lookup map'); diff --git a/sql/updates/world/2013_09_02_16_world_command.sql b/sql/updates/world/2013_09_02_16_world_command.sql index d283363203e..c1c36417859 100644 --- a/sql/updates/world/2013_09_02_16_world_command.sql +++ b/sql/updates/world/2013_09_02_16_world_command.sql @@ -1,6 +1,6 @@ /* cs_message.cpp */ -SET @id = 458; +SET @id = 462; -- Update command table with new RBAC permissions UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'announce'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 498f41b22e4..901465fd16d 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -328,22 +328,26 @@ enum RBACPermissions RBAC_PERM_COMMAND_LOOKUP_OBJECT = 449, RBAC_PERM_COMMAND_LOOKUP_QUEST = 450, RBAC_PERM_COMMAND_LOOKUP_PLAYER = 451, - RBAC_PERM_COMMAND_LOOKUP_SKILL = 452, - RBAC_PERM_COMMAND_LOOKUP_SPELL = 453, - RBAC_PERM_COMMAND_LOOKUP_TAXINODE = 454, - RBAC_PERM_COMMAND_LOOKUP_TELE = 455, - RBAC_PERM_COMMAND_LOOKUP_TITLE = 456, - RBAC_PERM_COMMAND_LOOKUP_MAP = 457, - RBAC_PERM_COMMAND_ANNOUNCE = 458, - RBAC_PERM_COMMAND_CHANNEL = 459, - RBAC_PERM_COMMAND_CHANNEL_SET = 460, - RBAC_PERM_COMMAND_CHANNEL_SET_OWNERSHIP = 461, - RBAC_PERM_COMMAND_GMANNOUNCE = 462, - RBAC_PERM_COMMAND_GMNAMEANNOUNCE = 463, - RBAC_PERM_COMMAND_GMNOTIFY = 464, - RBAC_PERM_COMMAND_NAMEANNOUNCE = 465, - RBAC_PERM_COMMAND_NOTIFY = 466, - RBAC_PERM_COMMAND_WHISPERS = 467, + 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, // custom permissions 1000+ RBAC_PERM_MAX From 28f9317698aec3eb8480e6682af3c4c65a98707c Mon Sep 17 00:00:00 2001 From: Nay Date: Mon, 2 Sep 2013 13:25:07 +0100 Subject: [PATCH 22/29] Core/RBAC: Move cast and characters commands to RBAC (using individual permissions) --- sql/updates/auth/2013_09_02_16_auth_misc.sql | 23 +++++++++ sql/updates/auth/2013_09_02_17_auth_misc.sql | 47 +++++++++++++++++++ .../world/2013_09_02_17_world_command.sql | 11 +++++ .../world/2013_09_02_18_world_command.sql | 23 +++++++++ src/server/game/Accounts/RBAC.h | 26 +++++++++- src/server/scripts/Commands/cs_cast.cpp | 18 +++---- src/server/scripts/Commands/cs_character.cpp | 44 ++++++++--------- 7 files changed, 159 insertions(+), 33 deletions(-) create mode 100644 sql/updates/auth/2013_09_02_16_auth_misc.sql create mode 100644 sql/updates/auth/2013_09_02_17_auth_misc.sql create mode 100644 sql/updates/world/2013_09_02_17_world_command.sql create mode 100644 sql/updates/world/2013_09_02_18_world_command.sql diff --git a/sql/updates/auth/2013_09_02_16_auth_misc.sql b/sql/updates/auth/2013_09_02_16_auth_misc.sql new file mode 100644 index 00000000000..5d3a7754e86 --- /dev/null +++ b/sql/updates/auth/2013_09_02_16_auth_misc.sql @@ -0,0 +1,23 @@ +/* cs_cast.cpp */ + +SET @id = 263; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+5; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0, 'cast'), +(@id+1, 'cast back'), +(@id+2, 'cast dist'), +(@id+3, 'cast self'), +(@id+4, 'cast target'), +(@id+5, 'cast dest'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+5; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(4, @id+0), +(4, @id+1), +(4, @id+2), +(4, @id+3), +(4, @id+4), +(4, @id+5); diff --git a/sql/updates/auth/2013_09_02_17_auth_misc.sql b/sql/updates/auth/2013_09_02_17_auth_misc.sql new file mode 100644 index 00000000000..54087e64c22 --- /dev/null +++ b/sql/updates/auth/2013_09_02_17_auth_misc.sql @@ -0,0 +1,47 @@ +/* cs_character.cpp */ + +SET @id = 273; + +-- Add new permissions +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+17; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@id+0 , 'character'), +(@id+1 , 'character customize'), +(@id+2 , 'character changefaction'), +(@id+3 , 'character changerace'), +(@id+4 , 'character deleted'), +-- (@id+5 , 'character deleted delete'), +(@id+6 , 'character deleted list'), +(@id+7 , 'character deleted restore'), +-- (@id+8 , 'character deleted old'), +-- (@id+9 , 'character erase'), +(@id+10, 'character level'), +(@id+11, 'character rename'), +(@id+12, 'character reputation'), +(@id+13, 'character titles'), +(@id+14, 'levelup'), +(@id+15, 'pdump'), +(@id+16, 'pdump load'), +(@id+17, 'pdump write'); + +-- Add permissions to "corresponding Commands Role" +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+17; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES +(3, @id+0 ), +(3, @id+1 ), +(3, @id+2 ), +(3, @id+3 ), +(3, @id+4 ), +-- (c, @id+5 ), +(4, @id+6 ), +(4, @id+7 ), +-- (c, @id+8 ), +-- (c, @id+9 ), +(4, @id+10), +(3, @id+11), +(3, @id+12), +(3, @id+13), +(4, @id+14), +(4, @id+15), +(4, @id+16), +(4, @id+17); diff --git a/sql/updates/world/2013_09_02_17_world_command.sql b/sql/updates/world/2013_09_02_17_world_command.sql new file mode 100644 index 00000000000..1bbb062626d --- /dev/null +++ b/sql/updates/world/2013_09_02_17_world_command.sql @@ -0,0 +1,11 @@ +/* cs_cast.cpp */ + +SET @id = 263; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'cast'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'cast back'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'cast dist'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'cast self'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'cast target'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'cast dest'; diff --git a/sql/updates/world/2013_09_02_18_world_command.sql b/sql/updates/world/2013_09_02_18_world_command.sql new file mode 100644 index 00000000000..f9923e7d755 --- /dev/null +++ b/sql/updates/world/2013_09_02_18_world_command.sql @@ -0,0 +1,23 @@ +/* cs_character.cpp */ + +SET @id = 273; + +-- Update command table with new RBAC permissions +UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'character'; +UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'character customize'; +UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'character changefaction'; +UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'character changerace'; +UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'character deleted'; +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'character deleted delete'; +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'character deleted list'; +UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'character deleted restore'; +UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'character deleted old'; +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'character erase'; +UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'character level'; +UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'character rename'; +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'character reputation'; +UPDATE `command` SET `permission` = @id+13 WHERE `name` = 'character titles'; +UPDATE `command` SET `permission` = @id+14 WHERE `name` = 'levelup'; +UPDATE `command` SET `permission` = @id+15 WHERE `name` = 'pdump'; +UPDATE `command` SET `permission` = @id+16 WHERE `name` = 'pdump load'; +UPDATE `command` SET `permission` = @id+17 WHERE `name` = 'pdump write'; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 901465fd16d..492a7197cfe 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -166,8 +166,30 @@ enum RBACPermissions RBAC_PERM_COMMAND_ACCOUNT_SET_SEC = 264, RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_EMAIL = 265, RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_REGMAIL = 266, - // 6 reserved for cast (267-272) - // 18 reserved for character (273-290) + 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 = 273, + RBAC_PERM_COMMAND_CHARACTER_CUSTOMIZE = 274, + RBAC_PERM_COMMAND_CHARACTER_CHANGEFACTION = 275, + RBAC_PERM_COMMAND_CHARACTER_CHANGERACE = 276, + RBAC_PERM_COMMAND_CHARACTER_DELETED = 277, + RBAC_PERM_COMMAND_CHARACTER_DELETED_DELETE = 278, // Not in DB - console + RBAC_PERM_COMMAND_CHARACTER_DELETED_LIST = 279, + RBAC_PERM_COMMAND_CHARACTER_DELETED_RESTORE = 280, + RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD = 281, // Not in DB - console + RBAC_PERM_COMMAND_CHARACTER_ERASE = 282, // Not in DB - console + 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 = 288, + RBAC_PERM_COMMAND_PDUMP_LOAD = 289, + RBAC_PERM_COMMAND_PDUMP_WRITE = 290, RBAC_PERM_COMMAND_CHEAT = 291, RBAC_PERM_COMMAND_CHEAT_CASTTIME = 292, RBAC_PERM_COMMAND_CHEAT_COOLDOWN = 293, diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp index 02a3aec9e82..cbcbbd214b3 100644 --- a/src/server/scripts/Commands/cs_cast.cpp +++ b/src/server/scripts/Commands/cs_cast.cpp @@ -37,18 +37,18 @@ public: { static ChatCommand castCommandTable[] = { - { "back", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastBackCommand, "", NULL }, - { "dist", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastDistCommand, "", NULL }, - { "self", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastSelfCommand, "", NULL }, - { "target", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastTargetCommad, "", NULL }, - { "dest", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastDestCommand, "", NULL }, - { "", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "back", RBAC_PERM_COMMAND_CAST_BACK, false, &HandleCastBackCommand, "", NULL }, + { "dist", RBAC_PERM_COMMAND_CAST_DIST, false, &HandleCastDistCommand, "", NULL }, + { "self", RBAC_PERM_COMMAND_CAST_SELF, false, &HandleCastSelfCommand, "", NULL }, + { "target", RBAC_PERM_COMMAND_CAST_TARGET, false, &HandleCastTargetCommad, "", NULL }, + { "dest", RBAC_PERM_COMMAND_CAST_DEST, false, &HandleCastDestCommand, "", NULL }, + { "", RBAC_PERM_COMMAND_CAST, false, &HandleCastCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "cast", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", castCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "cast", RBAC_PERM_COMMAND_CAST, false, NULL, "", castCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index d9baa5d56c3..185ce458b61 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -39,39 +39,39 @@ public: { static ChatCommand pdumpCommandTable[] = { - { "load", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandlePDumpLoadCommand, "", NULL }, - { "write", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandlePDumpWriteCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "load", RBAC_PERM_COMMAND_PDUMP_LOAD, true, &HandlePDumpLoadCommand, "", NULL }, + { "write", RBAC_PERM_COMMAND_PDUMP_WRITE, true, &HandlePDumpWriteCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand characterDeletedCommandTable[] = { - { "delete", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleCharacterDeletedDeleteCommand, "", NULL }, - { "list", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleCharacterDeletedListCommand, "", NULL }, - { "restore", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleCharacterDeletedRestoreCommand, "", NULL }, - { "old", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleCharacterDeletedOldCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "delete", RBAC_PERM_COMMAND_CHARACTER_DELETED_DELETE, true, &HandleCharacterDeletedDeleteCommand, "", NULL }, + { "list", RBAC_PERM_COMMAND_CHARACTER_DELETED_LIST, true, &HandleCharacterDeletedListCommand, "", NULL }, + { "restore", RBAC_PERM_COMMAND_CHARACTER_DELETED_RESTORE, true, &HandleCharacterDeletedRestoreCommand, "", NULL }, + { "old", RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD, true, &HandleCharacterDeletedOldCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand characterCommandTable[] = { - { "customize", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterCustomizeCommand, "", NULL }, - { "changefaction", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterChangeFactionCommand, "", NULL }, - { "changerace", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterChangeRaceCommand, "", NULL }, - { "deleted", RBAC_PERM_GAMEMASTER_COMMANDS, true, NULL, "", characterDeletedCommandTable }, - { "erase", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleCharacterEraseCommand, "", NULL }, - { "level", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleCharacterLevelCommand, "", NULL }, - { "rename", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterRenameCommand, "", NULL }, - { "reputation", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterReputationCommand, "", NULL }, - { "titles", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterTitlesCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "customize", RBAC_PERM_COMMAND_CHARACTER_CUSTOMIZE, true, &HandleCharacterCustomizeCommand, "", NULL }, + { "changefaction", RBAC_PERM_COMMAND_CHARACTER_CHANGEFACTION, true, &HandleCharacterChangeFactionCommand, "", NULL }, + { "changerace", RBAC_PERM_COMMAND_CHARACTER_CHANGERACE, true, &HandleCharacterChangeRaceCommand, "", NULL }, + { "deleted", RBAC_PERM_COMMAND_CHARACTER_DELETED, true, NULL, "", characterDeletedCommandTable }, + { "erase", RBAC_PERM_COMMAND_CHARACTER_ERASE, true, &HandleCharacterEraseCommand, "", NULL }, + { "level", RBAC_PERM_COMMAND_CHARACTER_LEVEL, true, &HandleCharacterLevelCommand, "", NULL }, + { "rename", RBAC_PERM_COMMAND_CHARACTER_RENAME, true, &HandleCharacterRenameCommand, "", NULL }, + { "reputation", RBAC_PERM_COMMAND_CHARACTER_REPUTATION, true, &HandleCharacterReputationCommand, "", NULL }, + { "titles", RBAC_PERM_COMMAND_CHARACTER_TITLES, true, &HandleCharacterTitlesCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "character", RBAC_PERM_GAMEMASTER_COMMANDS, true, NULL, "", characterCommandTable }, - { "levelup", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLevelUpCommand, "", NULL }, - { "pdump", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", pdumpCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "character", RBAC_PERM_COMMAND_CHARACTER, true, NULL, "", characterCommandTable }, + { "levelup", RBAC_PERM_COMMAND_LEVELUP, false, &HandleLevelUpCommand, "", NULL }, + { "pdump", RBAC_PERM_COMMAND_PDUMP, true, NULL, "", pdumpCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } From 0004d2e9cfb2dae4a7176762a3dad9e5a48633c9 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 2 Sep 2013 15:11:28 +0200 Subject: [PATCH 23/29] Fix SQL typos after RBAC commits --- sql/updates/auth/2013_09_02_04_auth_misc.sql | 2 +- sql/updates/auth/2013_09_02_08_auth_misc.sql | 22 ++++++++++++------- .../world/2013_09_02_04_world_command.sql | 2 +- .../world/2013_09_02_07_world_command.sql | 2 +- .../world/2013_09_02_08_world_command.sql | 2 +- .../world/2013_09_02_09_world_command.sql | 2 +- .../world/2013_09_02_12_world_command.sql | 2 +- .../world/2013_09_02_13_world_command.sql | 2 +- .../world/2013_09_02_14_world_command.sql | 2 +- .../world/2013_09_02_15_world_command.sql | 2 +- .../world/2013_09_02_16_world_command.sql | 2 +- 11 files changed, 24 insertions(+), 18 deletions(-) diff --git a/sql/updates/auth/2013_09_02_04_auth_misc.sql b/sql/updates/auth/2013_09_02_04_auth_misc.sql index 6c14080dad2..4734aa6bbd4 100644 --- a/sql/updates/auth/2013_09_02_04_auth_misc.sql +++ b/sql/updates/auth/2013_09_02_04_auth_misc.sql @@ -1,4 +1,4 @@ -/* cs_disable.cpp */ +/* cs_event.cpp */ SET @id = 367; diff --git a/sql/updates/auth/2013_09_02_08_auth_misc.sql b/sql/updates/auth/2013_09_02_08_auth_misc.sql index 6efc9765ab6..b6bf442aeb5 100644 --- a/sql/updates/auth/2013_09_02_08_auth_misc.sql +++ b/sql/updates/auth/2013_09_02_08_auth_misc.sql @@ -1,19 +1,25 @@ -/* cs_honor.cpp */ +/* cs_guild.cpp */ SET @id = 401; -- Add new permissions -DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+3; +DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+6; INSERT INTO `rbac_permissions` (`id`, `name`) VALUES -(@id+0, 'honor'), -(@id+1, 'honor add'), -(@id+2, 'honor add kill'), -(@id+3, 'honor update'); +(@id+0, 'guild'), +(@id+1, 'guild create'), +(@id+2, 'guild delete'), +(@id+3, 'guild invite'), +(@id+4, 'guild uninvite'), +(@id+5, 'guild rank'), +(@id+6, 'guild rename'); -- Add permissions to "corresponding Commands Role" -DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+3; +DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+6; INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES (4, @id+0), (4, @id+1), (4, @id+2), -(4, @id+3); +(4, @id+3), +(4, @id+4), +(4, @id+5), +(4, @id+6); diff --git a/sql/updates/world/2013_09_02_04_world_command.sql b/sql/updates/world/2013_09_02_04_world_command.sql index a4bc79b8a39..4fd1e0db8e2 100644 --- a/sql/updates/world/2013_09_02_04_world_command.sql +++ b/sql/updates/world/2013_09_02_04_world_command.sql @@ -21,4 +21,4 @@ UPDATE `command` SET `permission` = @id+14 WHERE `name` = 'disable remove mmap'; UPDATE `command` SET `permission` = @id+15 WHERE `name` = 'disable remove outdoorpvp'; UPDATE `command` SET `permission` = @id+16 WHERE `name` = 'disable remove quest'; UPDATE `command` SET `permission` = @id+17 WHERE `name` = 'disable remove spell'; -UPDATE `command` SET `permission` = @id+18 WHERE `name` = 'disable remove vmap'); +UPDATE `command` SET `permission` = @id+18 WHERE `name` = 'disable remove vmap'; diff --git a/sql/updates/world/2013_09_02_07_world_command.sql b/sql/updates/world/2013_09_02_07_world_command.sql index 58350a6c729..4f73ee4e439 100644 --- a/sql/updates/world/2013_09_02_07_world_command.sql +++ b/sql/updates/world/2013_09_02_07_world_command.sql @@ -12,4 +12,4 @@ UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'go taxinode'; UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'go ticket'; UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'go trigger'; UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'go xyz'; -UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'go zonexy'); +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'go zonexy'; diff --git a/sql/updates/world/2013_09_02_08_world_command.sql b/sql/updates/world/2013_09_02_08_world_command.sql index d09a7030a5b..5190a8f8a61 100644 --- a/sql/updates/world/2013_09_02_08_world_command.sql +++ b/sql/updates/world/2013_09_02_08_world_command.sql @@ -15,4 +15,4 @@ UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'gobject set'; UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'gobject set phase'; UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'gobject set state'; UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'gobject target'; -UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'gobject turn'); +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'gobject turn'; diff --git a/sql/updates/world/2013_09_02_09_world_command.sql b/sql/updates/world/2013_09_02_09_world_command.sql index 5d32d09a45a..1fca31eaf57 100644 --- a/sql/updates/world/2013_09_02_09_world_command.sql +++ b/sql/updates/world/2013_09_02_09_world_command.sql @@ -1,4 +1,4 @@ -/* cs_gobject.cpp */ +/* cs_guild.cpp */ SET @id = 401; diff --git a/sql/updates/world/2013_09_02_12_world_command.sql b/sql/updates/world/2013_09_02_12_world_command.sql index 67f544755e2..7320b87f823 100644 --- a/sql/updates/world/2013_09_02_12_world_command.sql +++ b/sql/updates/world/2013_09_02_12_world_command.sql @@ -15,4 +15,4 @@ UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'learn all crafts'; UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'learn all default'; UPDATE `command` SET `permission` = @id+10 WHERE `name` = 'learn all lang'; UPDATE `command` SET `permission` = @id+11 WHERE `name` = 'learn all recipes'; -UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'unlearn'); +UPDATE `command` SET `permission` = @id+12 WHERE `name` = 'unlearn'; diff --git a/sql/updates/world/2013_09_02_13_world_command.sql b/sql/updates/world/2013_09_02_13_world_command.sql index 0d5c6fdc545..6ecc3b8374f 100644 --- a/sql/updates/world/2013_09_02_13_world_command.sql +++ b/sql/updates/world/2013_09_02_13_world_command.sql @@ -8,4 +8,4 @@ UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'lfg player'; UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'lfg group'; UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'lfg queue'; UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'lfg clean'; -UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'lfg options'); +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'lfg options'; diff --git a/sql/updates/world/2013_09_02_14_world_command.sql b/sql/updates/world/2013_09_02_14_world_command.sql index 08b092c7f0a..4d0b5d35d6f 100644 --- a/sql/updates/world/2013_09_02_14_world_command.sql +++ b/sql/updates/world/2013_09_02_14_world_command.sql @@ -8,4 +8,4 @@ UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'list creature'; UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'list item'; UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'list object'; UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'list auras'; -UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'list mail'); +UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'list mail'; diff --git a/sql/updates/world/2013_09_02_15_world_command.sql b/sql/updates/world/2013_09_02_15_world_command.sql index 650413fb79d..0ec5002b61c 100644 --- a/sql/updates/world/2013_09_02_15_world_command.sql +++ b/sql/updates/world/2013_09_02_15_world_command.sql @@ -22,4 +22,4 @@ UPDATE `command` SET `permission` = @id+15 WHERE `name` = 'lookup spell id'; UPDATE `command` SET `permission` = @id+16 WHERE `name` = 'lookup taxinode'; UPDATE `command` SET `permission` = @id+17 WHERE `name` = 'lookup tele'; UPDATE `command` SET `permission` = @id+18 WHERE `name` = 'lookup title'; -UPDATE `command` SET `permission` = @id+19 WHERE `name` = 'lookup map'); +UPDATE `command` SET `permission` = @id+19 WHERE `name` = 'lookup map'; diff --git a/sql/updates/world/2013_09_02_16_world_command.sql b/sql/updates/world/2013_09_02_16_world_command.sql index c1c36417859..f9930afd213 100644 --- a/sql/updates/world/2013_09_02_16_world_command.sql +++ b/sql/updates/world/2013_09_02_16_world_command.sql @@ -12,4 +12,4 @@ UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'gmnameannounce'; UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'gmnotify'; UPDATE `command` SET `permission` = @id+7 WHERE `name` = 'nameannounce'; UPDATE `command` SET `permission` = @id+8 WHERE `name` = 'notify'; -UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'whispers'); +UPDATE `command` SET `permission` = @id+9 WHERE `name` = 'whispers'; From 79f446364c7d7a73138547fa215b25df574f7a10 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Mon, 2 Sep 2013 16:29:25 +0200 Subject: [PATCH 24/29] Fix SQL typo after RBAC commits --- sql/updates/world/2013_09_02_09_world_command.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/updates/world/2013_09_02_09_world_command.sql b/sql/updates/world/2013_09_02_09_world_command.sql index 1fca31eaf57..e40ec5a355a 100644 --- a/sql/updates/world/2013_09_02_09_world_command.sql +++ b/sql/updates/world/2013_09_02_09_world_command.sql @@ -9,4 +9,4 @@ UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'guild delete'; UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'guild invite'; UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'guild uninvite'; UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'guild rank'; -UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'guild rename'); +UPDATE `command` SET `permission` = @id+6 WHERE `name` = 'guild rename'; From 579f969d6a54b4fa2ea61eb718ad156d0e6dfce1 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Mon, 2 Sep 2013 16:31:35 +0200 Subject: [PATCH 25/29] Scripts/HallsOfStone: reworked InstanceScript --- .../Ulduar/HallsOfStone/boss_krystallus.cpp | 15 +- .../HallsOfStone/boss_maiden_of_grief.cpp | 18 +- .../Ulduar/HallsOfStone/boss_sjonnir.cpp | 61 ++- .../Ulduar/HallsOfStone/halls_of_stone.cpp | 26 +- .../Ulduar/HallsOfStone/halls_of_stone.h | 90 ++-- .../HallsOfStone/instance_halls_of_stone.cpp | 468 +++++++++--------- 6 files changed, 344 insertions(+), 334 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index e1c9dec8540..b6a4375d0eb 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -56,11 +56,6 @@ class boss_krystallus : public CreatureScript public: boss_krystallus() : CreatureScript("boss_krystallus") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_krystallusAI(creature); - } - struct boss_krystallusAI : public ScriptedAI { boss_krystallusAI(Creature* creature) : ScriptedAI(creature) @@ -89,14 +84,14 @@ public: uiShatterTimer = 0; if (instance) - instance->SetData(DATA_KRYSTALLUS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_KRYSTALLUS, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); if (instance) - instance->SetData(DATA_KRYSTALLUS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_KRYSTALLUS, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -149,7 +144,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_KRYSTALLUS_EVENT, DONE); + instance->SetBossState(DATA_KRYSTALLUS, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -182,6 +177,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI(creature); + } }; class spell_krystallus_shatter : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index 5b34db663d5..0d14f337ab3 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -56,11 +56,6 @@ class boss_maiden_of_grief : public CreatureScript public: boss_maiden_of_grief() : CreatureScript("boss_maiden_of_grief") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_maiden_of_griefAI(creature); - } - struct boss_maiden_of_griefAI : public ScriptedAI { boss_maiden_of_griefAI(Creature* creature) : ScriptedAI(creature) @@ -84,7 +79,7 @@ public: if (instance) { - instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, NOT_STARTED); + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } } @@ -95,14 +90,15 @@ public: if (instance) { + /* if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_MAIDEN_DOOR))) if (pDoor->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } - - instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, IN_PROGRESS); + */ + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, IN_PROGRESS); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } } @@ -158,7 +154,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, DONE); + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -170,6 +166,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI(creature); + } }; void AddSC_boss_maiden_of_grief() diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index 185d8e5fd0c..ed7ce0cb70b 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -84,11 +84,6 @@ class boss_sjonnir : public CreatureScript public: boss_sjonnir() : CreatureScript("boss_sjonnir") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_sjonnirAI(creature); - } - struct boss_sjonnirAI : public ScriptedAI { boss_sjonnirAI(Creature* creature) : ScriptedAI(creature), lSummons(me) @@ -127,7 +122,7 @@ public: lSummons.DespawnAll(); if (instance) - instance->SetData(DATA_SJONNIR_EVENT, NOT_STARTED); + instance->SetBossState(DATA_SJONNIR, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -138,14 +133,15 @@ public: if (instance) { + /* if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_SJONNIR_DOOR))) if (pDoor->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } - - instance->SetData(DATA_SJONNIR_EVENT, IN_PROGRESS); + */ + instance->SetBossState(DATA_SJONNIR, IN_PROGRESS); } } @@ -221,7 +217,7 @@ public: lSummons.DespawnAll(); if (instance) - instance->SetData(DATA_SJONNIR_EVENT, DONE); + instance->SetBossState(DATA_SJONNIR, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -247,6 +243,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI(creature); + } }; class npc_malformed_ooze : public CreatureScript @@ -254,11 +254,6 @@ class npc_malformed_ooze : public CreatureScript public: npc_malformed_ooze() : CreatureScript("npc_malformed_ooze") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_malformed_oozeAI(creature); - } - struct npc_malformed_oozeAI : public ScriptedAI { npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) {} @@ -290,35 +285,37 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI(creature); + } }; class npc_iron_sludge : public CreatureScript { -public: - npc_iron_sludge() : CreatureScript("npc_iron_sludge") { } + public: + npc_iron_sludge() : CreatureScript("npc_iron_sludge") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_iron_sludgeAI(creature); - } - - struct npc_iron_sludgeAI : public ScriptedAI - { - npc_iron_sludgeAI(Creature* creature) : ScriptedAI(creature) + struct npc_iron_sludgeAI : public ScriptedAI { - instance = creature->GetInstanceScript(); - } + npc_iron_sludgeAI(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + } - InstanceScript* instance; + InstanceScript* instance; - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (instance) + void JustDied(Unit* /*killer*/) OVERRIDE + { if (Creature* Sjonnir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SJONNIR))) Sjonnir->AI()->DoAction(ACTION_OOZE_DEAD); - } - }; + } + }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI(creature); + } }; class achievement_abuse_the_ooze : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index 7b5c7f2e061..ff4a5d1b43a 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -137,11 +137,6 @@ class npc_tribuna_controller : public CreatureScript public: npc_tribuna_controller() : CreatureScript("npc_tribuna_controller") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_tribuna_controllerAI(creature); - } - struct npc_tribuna_controllerAI : public ScriptedAI { npc_tribuna_controllerAI(Creature* creature) : ScriptedAI(creature) @@ -263,6 +258,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI(creature); + } }; class npc_brann_hos : public CreatureScript @@ -293,11 +292,6 @@ public: return true; } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_brann_hosAI(creature); - } - struct npc_brann_hosAI : public npc_escortAI { npc_brann_hosAI(Creature* creature) : npc_escortAI(creature) @@ -331,7 +325,7 @@ public: DespawnDwarf(); if (instance) - instance->SetData(DATA_BRANN_EVENT, NOT_STARTED); + instance->SetBossState(DATA_BRANN_EVENT, NOT_STARTED); } } @@ -446,9 +440,9 @@ public: case 1: if (instance) { - if (instance->GetData(DATA_BRANN_EVENT) != NOT_STARTED) + if (instance->GetBossState(DATA_BRANN_EVENT) != NOT_STARTED) return; - instance->SetData(DATA_BRANN_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_BRANN_EVENT, IN_PROGRESS); } bIsBattle = false; Talk(SAY_ESCORT_START); @@ -598,7 +592,7 @@ public: case 29: Talk(SAY_EVENT_END_02); if (instance) - instance->SetData(DATA_BRANN_EVENT, DONE); + instance->SetBossState(DATA_BRANN_EVENT, DONE); me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true); JumpToNextStep(5500); break; @@ -735,6 +729,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI(creature); + } }; class achievement_brann_spankin_new : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h index d00649e409b..b8af76bba20 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h @@ -15,55 +15,61 @@ * with this program. If not, see . */ -#ifndef DEF_HALLS_OF_STONE_H -#define DEF_HALLS_OF_STONE_H -enum Data +#ifndef HALLS_OF_STONE_H_ +#define HALLS_OF_STONE_H_ + +#define HoSScriptName "instance_halls_of_stone" + +uint32 const EncounterCount = 4; + +enum DataTypes { - DATA_KRYSTALLUS_EVENT, - DATA_MAIDEN_OF_GRIEF_EVENT, - DATA_SJONNIR_EVENT, - DATA_BRANN_EVENT + // Encounter States/Boss GUIDs + DATA_KRYSTALLUS = 0, + DATA_MAIDEN_OF_GRIEF = 1, + DATA_BRANN_EVENT = 2, + DATA_SJONNIR = 3, + + // Additional data + DATA_KADDRAK = 4, + DATA_MARNAK = 5, + DATA_ABEDNEUM = 6, + DATA_GO_TRIBUNAL_CONSOLE = 7, + DATA_GO_KADDRAK = 8, + DATA_GO_MARNAK = 9, + DATA_GO_ABEDNEUM = 10, + DATA_GO_SKY_FLOOR = 11 }; -enum Data64 +enum CreatureIds { - DATA_KRYSTALLUS, - DATA_MAIDEN_OF_GRIEF, - DATA_SJONNIR, - DATA_KADDRAK, - DATA_MARNAK, - DATA_ABEDNEUM, - DATA_GO_TRIBUNAL_CONSOLE, - DATA_GO_KADDRAK, - DATA_GO_MARNAK, - DATA_GO_ABEDNEUM, - DATA_GO_SKY_FLOOR, - DATA_SJONNIR_DOOR, - DATA_MAIDEN_DOOR -}; - -enum CreaturesIds -{ - CREATURE_MAIDEN = 27975, - CREATURE_KRYSTALLUS = 27977, - CREATURE_SJONNIR = 27978, - CREATURE_MARNAK = 30897, - CREATURE_KADDRAK = 30898, - CREATURE_ABEDNEUM = 30899, - CREATURE_BRANN = 28070 + NPC_MAIDEN = 27975, + NPC_KRYSTALLUS = 27977, + NPC_SJONNIR = 27978, + NPC_MARNAK = 30897, + NPC_KADDRAK = 30898, + NPC_ABEDNEUM = 30899, + NPC_BRANN = 28070 }; enum GameObjectIds { - GO_ABEDNEUM = 191669, - GO_MARNAK = 192170, - GO_KADDRAK = 192171, - GO_MAIDEN_DOOR = 191292, - GO_BRANN_DOOR = 191295, - GO_SJONNIR_DOOR = 191296, - GO_TRIBUNAL_CONSOLE = 193907, - GO_TRIBUNAL_CHEST = 190586, - GO_TRIBUNAL_CHEST_HERO = 193996 + GO_ABEDNEUM = 191669, + GO_MARNAK = 191670, + GO_KADDRAK = 191671, + GO_MAIDEN_DOOR = 191292, + GO_BRANN_DOOR = 191295, + GO_SJONNIR_DOOR = 191296, + GO_TRIBUNAL_CONSOLE = 193907, + GO_TRIBUNAL_CHEST = 190586, + GO_TRIBUNAL_CHEST_HERO = 193996, + GO_TRIBUNAL_SKY_FLOOR = 191527 }; -#endif +template +AI* GetHallsOfStoneAI(Creature* creature) +{ + return GetInstanceAI(creature, HoSScriptName); +} + +#endif // HALLS_OF_STONE_H_ diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index d4b8750dbba..f207df9aff3 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -17,256 +17,266 @@ #include "ScriptMgr.h" #include "InstanceScript.h" +#include "WorldSession.h" #include "halls_of_stone.h" -#define MAX_ENCOUNTER 4 - -/* Halls of Stone encounters: -0- Krystallus -1- Maiden of Grief -2- Escort Event -3- Sjonnir The Ironshaper -*/ +DoorData const doorData[] = +{ + { GO_MAIDEN_DOOR, DATA_KRYSTALLUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_BRANN_DOOR, DATA_MAIDEN_OF_GRIEF, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_SJONNIR_DOOR, DATA_BRANN_EVENT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; class instance_halls_of_stone : public InstanceMapScript { -public: - instance_halls_of_stone() : InstanceMapScript("instance_halls_of_stone", 599) { } + public: + instance_halls_of_stone() : InstanceMapScript(HoSScriptName, 599) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_halls_of_stone_InstanceMapScript(map); - } - - struct instance_halls_of_stone_InstanceMapScript : public InstanceScript - { - instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map) {} - - uint64 uiMaidenOfGrief; - uint64 uiKrystallus; - uint64 uiSjonnir; - - uint64 uiKaddrak; - uint64 uiAbedneum; - uint64 uiMarnak; - uint64 uiBrann; - - uint64 uiMaidenOfGriefDoor; - uint64 uiSjonnirDoor; - uint64 uiBrannDoor; - uint64 uiTribunalConsole; - uint64 uiTribunalChest; - uint64 uiTribunalSkyFloor; - uint64 uiKaddrakGo; - uint64 uiAbedneumGo; - uint64 uiMarnakGo; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - std::string str_data; - - void Initialize() OVERRIDE + struct instance_halls_of_stone_InstanceMapScript : public InstanceScript { - uiMaidenOfGrief = 0; - uiKrystallus = 0; - uiSjonnir = 0; - - uiKaddrak = 0; - uiMarnak = 0; - uiAbedneum = 0; - uiBrann = 0; - - uiMaidenOfGriefDoor = 0; - uiSjonnirDoor = 0; - uiBrannDoor = 0; - uiKaddrakGo = 0; - uiMarnakGo = 0; - uiAbedneumGo = 0; - uiTribunalConsole = 0; - uiTribunalChest = 0; - uiTribunalSkyFloor = 0; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - m_auiEncounter[i] = NOT_STARTED; - } - - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map) { - case CREATURE_MAIDEN: uiMaidenOfGrief = creature->GetGUID(); break; - case CREATURE_KRYSTALLUS: uiKrystallus = creature->GetGUID(); break; - case CREATURE_SJONNIR: uiSjonnir = creature->GetGUID(); break; - case CREATURE_MARNAK: uiMarnak = creature->GetGUID(); break; - case CREATURE_KADDRAK: uiKaddrak = creature->GetGUID(); break; - case CREATURE_ABEDNEUM: uiAbedneum = creature->GetGUID(); break; - case CREATURE_BRANN: uiBrann = creature->GetGUID(); break; + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + + KrystallusGUID = 0; + MaidenOfGriefGUID = 0; + SjonnirGUID = 0; + + KaddrakGUID = 0; + AbedneumGUID = 0; + MarnakGUID = 0; + BrannGUID = 0; + + TribunalConsoleGUID = 0; + TribunalChestGUID = 0; + TribunalSkyFloorGUID = 0; + KaddrakGoGUID = 0; + AbedneumGoGUID = 0; + MarnakGoGUID = 0; } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - case GO_ABEDNEUM: - uiAbedneumGo = go->GetGUID(); - break; - case GO_MARNAK: - uiMarnakGo = go->GetGUID(); - break; - case GO_KADDRAK: - uiKaddrakGo = go->GetGUID(); - break; - case GO_MAIDEN_DOOR: - uiMaidenOfGriefDoor = go->GetGUID(); - if (m_auiEncounter[0] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_BRANN_DOOR: - uiBrannDoor = go->GetGUID(); - if (m_auiEncounter[1] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_SJONNIR_DOOR: - uiSjonnirDoor = go->GetGUID(); - if (m_auiEncounter[2] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_TRIBUNAL_CONSOLE: - uiTribunalConsole = go->GetGUID(); - break; - case GO_TRIBUNAL_CHEST: - case GO_TRIBUNAL_CHEST_HERO: - uiTribunalChest = go->GetGUID(); - if (m_auiEncounter[2] == DONE) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - break; - case 191527: - uiTribunalSkyFloor = go->GetGUID(); - break; + switch (creature->GetEntry()) + { + case NPC_KRYSTALLUS: + KrystallusGUID = creature->GetGUID(); + break; + case NPC_MAIDEN: + MaidenOfGriefGUID = creature->GetGUID(); + break; + case NPC_SJONNIR: + SjonnirGUID = creature->GetGUID(); + break; + case NPC_MARNAK: + MarnakGUID = creature->GetGUID(); + break; + case NPC_KADDRAK: + KaddrakGUID = creature->GetGUID(); + break; + case NPC_ABEDNEUM: + AbedneumGUID = creature->GetGUID(); + break; + case NPC_BRANN: + BrannGUID = creature->GetGUID(); + break; + default: + break; + } } - } - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case DATA_MAIDEN_OF_GRIEF_EVENT: - m_auiEncounter[1] = data; - if (m_auiEncounter[1] == DONE) - HandleGameObject(uiBrannDoor, true); - break; - case DATA_KRYSTALLUS_EVENT: - m_auiEncounter[0] = data; - if (m_auiEncounter[0] == DONE) - HandleGameObject(uiMaidenOfGriefDoor, true); - break; - case DATA_SJONNIR_EVENT: - m_auiEncounter[3] = data; - break; - case DATA_BRANN_EVENT: - m_auiEncounter[2] = data; - if (m_auiEncounter[2] == DONE) - { - HandleGameObject(uiSjonnirDoor, true); - GameObject* go = instance->GetGameObject(uiTribunalChest); - if (go) + switch (go->GetEntry()) + { + case GO_ABEDNEUM: + AbedneumGoGUID = go->GetGUID(); + break; + case GO_MARNAK: + MarnakGoGUID = go->GetGUID(); + break; + case GO_KADDRAK: + KaddrakGoGUID = go->GetGUID(); + break; + case GO_TRIBUNAL_CONSOLE: + TribunalConsoleGUID = go->GetGUID(); + break; + case GO_TRIBUNAL_CHEST: + case GO_TRIBUNAL_CHEST_HERO: + TribunalChestGUID = go->GetGUID(); + if (GetBossState(DATA_BRANN_EVENT) == DONE) go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); + break; + case GO_TRIBUNAL_SKY_FLOOR: + TribunalSkyFloorGUID = go->GetGUID(); + break; + case GO_MAIDEN_DOOR: + case GO_BRANN_DOOR: + case GO_SJONNIR_DOOR: + AddDoor(go, true); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) OVERRIDE + { + switch (go->GetEntry()) + { + case GO_MAIDEN_DOOR: + case GO_BRANN_DOOR: + case GO_SJONNIR_DOOR: + AddDoor(go, false); + break; + default: + break; + } + } + + uint64 GetData64(uint32 type) const OVERRIDE + { + switch (type) + { + case DATA_MAIDEN_OF_GRIEF: + return MaidenOfGriefGUID; + case DATA_KRYSTALLUS: + return KrystallusGUID; + case DATA_SJONNIR: + return SjonnirGUID; + case DATA_KADDRAK: + return KaddrakGUID; + case DATA_MARNAK: + return MarnakGUID; + case DATA_ABEDNEUM: + return AbedneumGUID; + case DATA_GO_TRIBUNAL_CONSOLE: + return TribunalConsoleGUID; + case DATA_GO_KADDRAK: + return KaddrakGoGUID; + case DATA_GO_ABEDNEUM: + return AbedneumGoGUID; + case DATA_GO_MARNAK: + return MarnakGoGUID; + case DATA_GO_SKY_FLOOR: + return TribunalSkyFloorGUID; + default: + break; + } + + return 0; + } + + bool SetBossState(uint32 type, EncounterState state) OVERRIDE + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_BRANN_EVENT: + if (state == DONE) + { + if (GameObject* go = instance->GetGameObject(TribunalChestGUID)) + go->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_INTERACT_COND); + } + break; + default: + break; + } + + return true; + } + + bool CheckRequiredBosses(uint32 bossId, Player const* player /*= NULL*/) const OVERRIDE + { + if (player && player->GetSession()->HasPermission(RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES)) + return true; + + switch (bossId) + { + case DATA_MAIDEN_OF_GRIEF: + if (GetBossState(DATA_KRYSTALLUS) != DONE) + return false; + break; + case DATA_SJONNIR: + if (GetBossState(DATA_BRANN_EVENT) != DONE) + return false; + break; + default: + break; + } + + return true; + } + + std::string GetSaveData() OVERRIDE + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "H S " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) OVERRIDE + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(str); + + char dataHead1, dataHead2; + + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'H' && dataHead2 == 'S') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); } - break; + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; } - if (data == DONE) - SaveToDB(); - } + protected: + uint64 KrystallusGUID; + uint64 MaidenOfGriefGUID; + uint64 SjonnirGUID; - uint32 GetData(uint32 type) const OVERRIDE + uint64 KaddrakGUID; + uint64 AbedneumGUID; + uint64 MarnakGUID; + uint64 BrannGUID; + + uint64 TribunalConsoleGUID; + uint64 TribunalChestGUID; + uint64 TribunalSkyFloorGUID; + uint64 KaddrakGoGUID; + uint64 AbedneumGoGUID; + uint64 MarnakGoGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE { - switch (type) - { - case DATA_KRYSTALLUS_EVENT: return m_auiEncounter[0]; - case DATA_MAIDEN_OF_GRIEF_EVENT: return m_auiEncounter[1]; - case DATA_SJONNIR_EVENT: return m_auiEncounter[2]; - case DATA_BRANN_EVENT: return m_auiEncounter[3]; - } - - return 0; + return new instance_halls_of_stone_InstanceMapScript(map); } - - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) - { - case DATA_MAIDEN_OF_GRIEF: return uiMaidenOfGrief; - case DATA_KRYSTALLUS: return uiKrystallus; - case DATA_SJONNIR: return uiSjonnir; - case DATA_KADDRAK: return uiKaddrak; - case DATA_MARNAK: return uiMarnak; - case DATA_ABEDNEUM: return uiAbedneum; - case DATA_GO_TRIBUNAL_CONSOLE: return uiTribunalConsole; - case DATA_GO_KADDRAK: return uiKaddrakGo; - case DATA_GO_ABEDNEUM: return uiAbedneumGo; - case DATA_GO_MARNAK: return uiMarnakGo; - case DATA_GO_SKY_FLOOR: return uiTribunalSkyFloor; - case DATA_SJONNIR_DOOR: return uiSjonnirDoor; - case DATA_MAIDEN_DOOR: return uiMaidenOfGriefDoor; - } - - return 0; - } - - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "H S " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << m_auiEncounter[3]; - - str_data = saveStream.str(); - - OUT_SAVE_INST_DATA_COMPLETE; - return str_data; - } - - void Load(const char* in) OVERRIDE - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(in); - - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3; - - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3; - - if (dataHead1 == 'H' && dataHead2 == 'S') - { - m_auiEncounter[0] = data0; - m_auiEncounter[1] = data1; - m_auiEncounter[2] = data2; - m_auiEncounter[3] = data3; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - - } else OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; - } - }; - }; void AddSC_instance_halls_of_stone() From 9b92bc9409326fe8567fd1d1970c7742bc8350b4 Mon Sep 17 00:00:00 2001 From: Nay Date: Mon, 2 Sep 2013 16:18:55 +0100 Subject: [PATCH 26/29] Core: Fix compile with PCH enabled and warnings Few corrections to worldserver.conf --- .../2013_09_01_07_world_trinity_strings.sql | 45 +++++++++---------- src/server/scripts/Commands/cs_account.cpp | 25 ++++++----- .../HallsOfStone/instance_halls_of_stone.cpp | 1 + src/server/worldserver/worldserver.conf.dist | 18 ++++---- 4 files changed, 45 insertions(+), 44 deletions(-) diff --git a/sql/updates/world/2013_09_01_07_world_trinity_strings.sql b/sql/updates/world/2013_09_01_07_world_trinity_strings.sql index 7dd8bb89ee6..6c69a0a44ff 100644 --- a/sql/updates/world/2013_09_01_07_world_trinity_strings.sql +++ b/sql/updates/world/2013_09_01_07_world_trinity_strings.sql @@ -1,26 +1,25 @@ -DELETE FROM `trinity_string` WHERE entry IN (749, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881); -INSERT INTO `trinity_string` (entry, content_default, content_loc1, content_loc2, content_loc3, content_loc4, content_loc5, content_loc6, content_loc7, content_loc8) VALUES -(749,'│ OS: %s - Latency: %u ms', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(872, 'Entered email is not equal to registration email, check input', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(873, 'The new emails do not match', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(874, 'The email was changed', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(875, 'Your email can''t be longer than 64 characters, email not changed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(876, 'Email not changed (unknown error)!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(877, 'Email change unnecessary, new email is equal to old email', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(878, 'Your email is: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(879, '│ Registration Email: %s - Email: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(880, 'Security Level: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), -(881, 'You require an email to change your password.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +DELETE FROM `trinity_string` WHERE `entry` IN (749, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881); +INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES +(749,'│ OS: %s - Latency: %u ms'), +(872, 'Entered email is not equal to registration email, check input'), +(873, 'The new emails do not match'), +(874, 'The email was changed'), +(875, 'Your email can''t be longer than 64 characters, email not changed!'), +(876, 'Email not changed (unknown error)!'), +(877, 'Email change unnecessary, new email is equal to old email'), +(878, 'Your email is: %s'), +(879, '│ Registration Email: %s - Email: %s'), +(880, 'Security Level: %s'), +(881, 'You require an email to change your password.'); -UPDATE `command` SET help = 'Syntax: .account password $old_password $new_password $new_password [$email]\r\n\r\nChange your account password. You may need to check the actual security mode to see if email input is necessary.' WHERE name = 'account password'; +UPDATE `command` SET `help` = 'Syntax: .account password $old_password $new_password $new_password [$email]\r\n\r\nChange your account password. You may need to check the actual security mode to see if email input is necessary.' WHERE name = 'account password'; +UPDATE `command` SET `help` = 'Syntax: .account\r\n\r\nDisplay the access level of your account and the email adress if you possess the necessary permissions.' WHERE name = 'account'; -UPDATE `command` SET help = 'Syntax: .account\r\n\r\nDisplay the access level of your account and the email adress if you possess the necessary permissions.' WHERE name = 'account'; +DELETE FROM `command` WHERE `name` = 'account email'; +DELETE FROM `command` WHERE `name` = 'account set sec email'; +DELETE FROM `command` WHERE `name` = 'account set sec regmail'; -DELETE FROM `command` WHERE name = 'account email'; -INSERT INTO `command` (name, security, help) VALUES ('account email', 0, 'Syntax: .account email $oldemail $currentpassword $newemail $newemailconfirmation\r\n\r\n Change your account email. You may need to check the actual security mode to see if email input is necessary for password change'); - -DELETE FROM `command` WHERE name = 'account set sec email'; -INSERT INTO `command` (name, security, help) VALUES ('account set sec email', 3, 'Syntax: .account set sec email $accountname $email $emailconfirmation\r\n\r\nSet the email for entered player account.'); - -DELETE FROM `command` WHERE name = 'account set sec regmail'; -INSERT INTO `command` (name, security, help) VALUES ('account set sec regmail', 4, 'Syntax: .account set sec regmail $account $regmail $regmailconfirmation\r\n\r\nSets the regmail for entered player account.'); +INSERT INTO `command` (`name`, `permission`, `help`) VALUES +('account email', 263, 'Syntax: .account email $oldemail $currentpassword $newemail $newemailconfirmation\r\n\r\n Change your account email. You may need to check the actual security mode to see if email input is necessary for password change'), +('account set sec email', 265, 'Syntax: .account set sec email $accountname $email $emailconfirmation\r\n\r\nSet the email for entered player account.'), +('account set sec regmail', 266, 'Syntax: .account set sec regmail $account $regmail $regmailconfirmation\r\n\r\nSets the regmail for entered player account.'); diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index 467b74f4954..40bfd46e19f 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -114,18 +114,19 @@ public: if (!*args) return false; - char* email; + std::string email; ///- %Parse the command line arguments char* accountName = strtok((char*)args, " "); char* password = strtok(NULL, " "); - if (!(email = strtok(NULL, " '"))) - email = ""; + char* possibleEmail = strtok(NULL, " ' "); + if (possibleEmail) + email = possibleEmail; if (!accountName || !password) return false; - AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password), std::string(email)); + AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password), email); switch (result) { case AOR_OK: @@ -135,7 +136,7 @@ public: TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %d (IP: %s) Character:[%s] (GUID: %u) created Account %s (Email: '%s')", handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), - accountName, email); + accountName, email.c_str()); } break; case AOR_NAME_TOO_LONG: @@ -546,7 +547,7 @@ public: PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_EMAIL_BY_ID); stmt->setUInt32(0, accountId); PreparedQueryResult result = LoginDatabase.Query(stmt); - + if (result) { emailoutput = (*result)[0].GetString(); @@ -797,19 +798,19 @@ public: { if (!*args) return false; - + ///- Get the command line arguments char* account = strtok((char*)args, " "); char* email = strtok(NULL, " "); char* emailConfirmation = strtok(NULL, " "); - + if (!account || !email || !emailConfirmation) { handler->SendSysMessage(LANG_CMD_SYNTAX); handler->SetSentErrorMessage(true); return false; } - + std::string accountName = account; if (!AccountMgr::normalizeString(accountName)) { @@ -817,7 +818,7 @@ public: handler->SetSentErrorMessage(true); return false; } - + uint32 targetAccountId = AccountMgr::GetId(accountName); if (!targetAccountId) { @@ -825,12 +826,12 @@ public: handler->SetSentErrorMessage(true); return false; } - + /// can set email only for target with less security /// This also restricts setting handler's own email. if (handler->HasLowerSecurityAccount(NULL, targetAccountId, true)) return false; - + if (strcmp(email, emailConfirmation) != 0) { handler->SendSysMessage(LANG_NEW_EMAILS_NOT_MATCH); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index f207df9aff3..6b0f5dfd9e9 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -19,6 +19,7 @@ #include "InstanceScript.h" #include "WorldSession.h" #include "halls_of_stone.h" +#include DoorData const doorData[] = { diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 018cd309805..dbf2a808230 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -28,6 +28,7 @@ # CHARACTER DELETE OPTIONS # CUSTOM SERVER OPTIONS # LOGGING SYSTEM SETTINGS +# PACKET SPOOF PROTECTION SETTINGS # ################################################################################################### @@ -1106,7 +1107,6 @@ AllowTickets = 1 DungeonFinder.OptionsMask = 1 - # # DBC.EnforceItemAttributes # Description: Disallow overriding item attributes stored in DBC files with values from the @@ -1133,10 +1133,10 @@ RBAC.DefaultGroups = "" # # Account.PasswordChangeSecurity -# Description: Controls how secure you want the password changes to be. -# Default: 2 - RBAC (RBAC en- or disables Email confirmation per group) +# Description: Controls how secure the password changes are. +# Default: 0 - None (Old and new password) # 1 - Email (Email confirmation necessary) -# 0 - None (Just Old and new password comparision. Default.) +# 2 - RBAC (RBAC enable or disables email confirmation per group) Account.PasswordChangeSecurity = 0 @@ -2806,14 +2806,14 @@ Log.Async.Enable = 0 ################################################################################################### # -# Packet Spoof Protection Settings +# PACKET SPOOF PROTECTION SETTINGS # # These settings determine which action to take when harmful packet spoofing is detected. # # PacketSpoof.Policy # Description: Determines the course of action when packet spoofing is detected. -# Values: 0 - Log only (LOG_FILTER_NETWORKIO) -# 1 - Log + kick +# Default: 1 - Log + kick +# 0 - Log only (LOG_FILTER_NETWORKIO) # 2 - Log + kick + ban PacketSpoof.Policy = 1 @@ -2821,9 +2821,9 @@ PacketSpoof.Policy = 1 # # PacketSpoof.BanMode # Description: If PacketSpoof.Policy equals 2, this will determine the ban mode. -# Values: 0 - Ban Account -# 2 - Ban IP # Note: Banning by character not supported for logical reasons. +# Default: 0 - Ban Account +# 2 - Ban IP # PacketSpoof.BanMode = 0 From ab85a9507ea605889d7d0fc817739a30a092b8ef Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Mon, 2 Sep 2013 17:48:17 +0200 Subject: [PATCH 27/29] Core/SAI: Added SMART_ACTION_CALL_KILLEDMONSTER log for has already spell kill credit --- .../game/AI/SmartScripts/SmartScriptMgr.cpp | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index ae87d7122d4..01f9080fba1 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -28,6 +28,8 @@ #include "ScriptedCreature.h" #include "GameEventMgr.h" #include "CreatureTextMgr.h" +#include "SpellMgr.h" +#include "SpellInfo.h" #include "SmartScriptMgr.h" @@ -778,6 +780,25 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_CALL_KILLEDMONSTER: if (!IsCreatureValid(e, e.action.killedMonster.creature)) return false; + + for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i); + if (!spellInfo) + continue; + + for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + { + if (spellInfo->Effects[j].Effect == SPELL_EFFECT_KILL_CREDIT || spellInfo->Effects[j].Effect == SPELL_EFFECT_KILL_CREDIT2) + { + uint32 killCredit = spellInfo->Effects[j].MiscValue; + + if (e.action.killedMonster.creature == killCredit) + TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u Kill Credit: %u has already spell kill credit (SpellId: %u effect: %u)", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.killedMonster.creature, spellInfo->Id, j); + } + } + } + if (e.GetTargetType() == SMART_TARGET_POSITION) { TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TargetType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.GetTargetType()); From 3722fcb85014b9fa7c6b20cee80821aec0e42975 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Mon, 2 Sep 2013 18:12:33 +0200 Subject: [PATCH 28/29] Scripts/HoL/HoS: changed some bosses to optional, doors are always open --- .../HallsOfLightning/instance_halls_of_lightning.cpp | 3 --- .../Ulduar/HallsOfStone/boss_maiden_of_grief.cpp | 8 -------- .../Ulduar/HallsOfStone/instance_halls_of_stone.cpp | 10 ---------- 3 files changed, 21 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index 6baf5dc6d93..c45d3704d5d 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -21,7 +21,6 @@ DoorData const doorData[] = { - { GO_BJARNGRIM_DOOR, DATA_BJARNGRIM, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, { GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, { GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, { GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, @@ -73,7 +72,6 @@ class instance_halls_of_lightning : public InstanceMapScript { switch (go->GetEntry()) { - case GO_BJARNGRIM_DOOR: case GO_VOLKHAN_DOOR: case GO_IONAR_DOOR: case GO_LOKEN_DOOR: @@ -91,7 +89,6 @@ class instance_halls_of_lightning : public InstanceMapScript { switch (go->GetEntry()) { - case GO_BJARNGRIM_DOOR: case GO_VOLKHAN_DOOR: case GO_IONAR_DOOR: case GO_LOKEN_DOOR: diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index 0d14f337ab3..f4ea3ff556c 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -90,14 +90,6 @@ public: if (instance) { - /* - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_MAIDEN_DOOR))) - if (pDoor->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); - return; - } - */ instance->SetBossState(DATA_MAIDEN_OF_GRIEF, IN_PROGRESS); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index 6b0f5dfd9e9..2a899d26d5a 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -23,8 +23,6 @@ DoorData const doorData[] = { - { GO_MAIDEN_DOOR, DATA_KRYSTALLUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, - { GO_BRANN_DOOR, DATA_MAIDEN_OF_GRIEF, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, { GO_SJONNIR_DOOR, DATA_BRANN_EVENT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END }; @@ -113,8 +111,6 @@ class instance_halls_of_stone : public InstanceMapScript case GO_TRIBUNAL_SKY_FLOOR: TribunalSkyFloorGUID = go->GetGUID(); break; - case GO_MAIDEN_DOOR: - case GO_BRANN_DOOR: case GO_SJONNIR_DOOR: AddDoor(go, true); break; @@ -127,8 +123,6 @@ class instance_halls_of_stone : public InstanceMapScript { switch (go->GetEntry()) { - case GO_MAIDEN_DOOR: - case GO_BRANN_DOOR: case GO_SJONNIR_DOOR: AddDoor(go, false); break; @@ -198,10 +192,6 @@ class instance_halls_of_stone : public InstanceMapScript switch (bossId) { - case DATA_MAIDEN_OF_GRIEF: - if (GetBossState(DATA_KRYSTALLUS) != DONE) - return false; - break; case DATA_SJONNIR: if (GetBossState(DATA_BRANN_EVENT) != DONE) return false; From 5e03230f3d665b5ef7fa0804137ac711804b1cb1 Mon Sep 17 00:00:00 2001 From: MitchesD Date: Mon, 2 Sep 2013 18:55:52 +0200 Subject: [PATCH 29/29] Scripts/HallsOfStone: Sjonnir, some improvements - rewritten to BossAI - added spawn ordered by percent, according to official data Closes #10702 Signed-off-by: joschiwald --- ...013_09_02_19_world_spelldifficulty_dbc.sql | 7 + .../Ulduar/HallsOfStone/boss_sjonnir.cpp | 402 ++++++++---------- 2 files changed, 187 insertions(+), 222 deletions(-) create mode 100644 sql/updates/world/2013_09_02_19_world_spelldifficulty_dbc.sql diff --git a/sql/updates/world/2013_09_02_19_world_spelldifficulty_dbc.sql b/sql/updates/world/2013_09_02_19_world_spelldifficulty_dbc.sql new file mode 100644 index 00000000000..5c8f810da55 --- /dev/null +++ b/sql/updates/world/2013_09_02_19_world_spelldifficulty_dbc.sql @@ -0,0 +1,7 @@ +DELETE FROM `spelldifficulty_dbc` WHERE `id` IN (51849, 50840, 50834, 50830, 50831); +INSERT INTO `spelldifficulty_dbc`(`id`,`spellid0`,`spellid1`) VALUES +(51849, 51849, 59861), +(50840, 50840, 59848), +(50834, 50834, 59846), +(50830, 50830, 59844), +(50831, 50831, 59845); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index ed7ce0cb70b..618628adf88 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -15,280 +15,238 @@ * with this program. If not, see . */ -/* Script Data Start -SDName: Boss sjonnir -SDAuthor: LordVanMartin -SD%Complete: -SDComment: -SDCategory: -Script Data End */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "halls_of_stone.h" enum Spells { - SPELL_LIGHTING_RING = 51849, //Periodic Trigger (interval 2s) spell = 50841 - H_SPELL_LIGHTING_RING = 59861, //Periodic Trigger (interval 2s) spell = 59849 - SPELL_LIGHTING_RING_1 = 50840, //Periodic Trigger (interval 2s) spell = 50841 - H_SPELL_LIGHTING_RING_1 = 59848, //Periodic Trigger (interval 2s) spell = 59849 - SPELL_STATIC_CHARGE = 50834, //Periodic Trigger 2s interval, spell =50835 - H_SPELL_STATIC_CHARGE = 59846, //Periodic Trigger 2s interval, spell =50847 - SPELL_CHAIN_LIGHTING = 50830, - H_SPELL_CHAIN_LIGHTING = 59844, - SPELL_LIGHTING_SHIELD = 50831, - H_SPELL_LIGHTING_SHIELD = 59845, - SPELL_FRENZY = 28747 + SPELL_LIGHTING_RING = 51849, // Periodic Trigger (interval 2s) spell = 50841 + SPELL_LIGHTING_RING_1 = 50840, // Periodic Trigger (interval 2s) spell = 50841 + SPELL_STATIC_CHARGE = 50834, // Periodic Trigger 2s interval, spell =50835 + SPELL_CHAIN_LIGHTING = 50830, + SPELL_LIGHTING_SHIELD = 50831, + SPELL_FRENZY = 28747 }; enum Yells { - SAY_AGGRO = 0, - SAY_SLAY = 1, - SAY_DEATH = 2 + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_DEATH = 2 }; -#define EMOTE_GENERIC_FRENZY -1000002 - enum SjonnirCreatures { - CREATURE_FORGED_IRON_TROGG = 27979, - CREATURE_MALFORMED_OOZE = 27981, - CREATURE_FORGED_IRON_DWARF = 27982, - CREATURE_IRON_SLUDGE = 28165 + NPC_FORGED_IRON_TROGG = 27979, + NPC_MALFORMED_OOZE = 27981, + NPC_FORGED_IRON_DWARF = 27982, + NPC_IRON_SLUDGE = 28165, + NPC_EARTHEN_DWARF = 27980 }; enum Misc { - DATA_TIME_BEFORE_OOZE = 150000, // 2min 30 secs - ACTION_OOZE_DEAD = 1, - DATA_ABUSE_THE_OOZE = 2 + ACTION_OOZE_DEAD = 1, + DATA_ABUSE_THE_OOZE = 2 }; -struct Locations +enum Events { - float x, y, z; + EVENT_CHAIN_LIGHTNING = 1, + EVENT_LIGHTNING_SHIELD, + EVENT_STATIC_CHARGE, + EVENT_LIGHTNING_RING, + EVENT_SUMMON, + EVENT_FRENZY, }; -static Locations PipeLocations[] = +Position const PipeLocations[] = { - {1295.44f, 734.07f, 200.3f}, //left - {1297.7f, 595.6f, 199.9f} //right + { 1295.44f, 734.07f, 200.3f, 0.0f }, // left + { 1297.7f, 595.6f, 199.9f, 0.0f } // right }; -static Locations CenterPoint = {1295.21f, 667.157f, 189.691f}; +Position const CenterPoint = { 1295.21f, 667.157f, 189.691f, 0.0f }; class boss_sjonnir : public CreatureScript { -public: - boss_sjonnir() : CreatureScript("boss_sjonnir") { } + public: + boss_sjonnir() : CreatureScript("boss_sjonnir") { } - struct boss_sjonnirAI : public ScriptedAI - { - boss_sjonnirAI(Creature* creature) : ScriptedAI(creature), lSummons(me) + struct boss_sjonnirAI : public BossAI { - instance = creature->GetInstanceScript(); - } + boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR) { } - bool bIsFrenzy; - - uint32 uiChainLightningTimer; - uint32 uiLightningShieldTimer; - uint32 uiStaticChargeTimer; - uint32 uiLightningRingTimer; - uint32 uiSummonTimer; - uint32 uiFrenzyTimer; - uint32 uiEncounterTimer; - uint8 abuseTheOoze; - - SummonList lSummons; - - InstanceScript* instance; - - void Reset() OVERRIDE - { - bIsFrenzy = false; - - uiEncounterTimer = 0; - uiChainLightningTimer = urand(3000, 8000); - uiLightningShieldTimer = urand(20000, 25000); - uiStaticChargeTimer = urand(20000, 25000); - uiLightningRingTimer = urand(30000, 35000); - uiSummonTimer = 5000; - uiFrenzyTimer = 300000; //5 minutes - abuseTheOoze = 0; - - lSummons.DespawnAll(); - - if (instance) - instance->SetBossState(DATA_SJONNIR, NOT_STARTED); - } - - void EnterCombat(Unit* /*who*/) OVERRIDE - { - Talk(SAY_AGGRO); - - uiEncounterTimer = 0; - - if (instance) + void Reset() OVERRIDE { - /* - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_SJONNIR_DOOR))) - if (pDoor->GetGoState() == GO_STATE_READY) + _Reset(); + abuseTheOoze = 0; + } + + void EnterCombat(Unit* who) OVERRIDE + { + if (!instance->CheckRequiredBosses(DATA_SJONNIR, who->ToPlayer())) + { + EnterEvadeMode(); + return; + } + + _EnterCombat(); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(3000, 8000)); + events.ScheduleEvent(EVENT_LIGHTNING_SHIELD, urand(20000, 25000)); + events.ScheduleEvent(EVENT_STATIC_CHARGE, urand(20000, 25000)); + events.ScheduleEvent(EVENT_LIGHTNING_RING, urand(30000, 35000)); + events.ScheduleEvent(EVENT_SUMMON, 5000); + events.ScheduleEvent(EVENT_FRENZY, 300000); + } + + void JustSummoned(Creature* summon) OVERRIDE + { + summon->GetMotionMaster()->MovePoint(0, CenterPoint); + /*if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + summon->AI()->AttackStart(target);*/ + summons.Summon(summon); + } + + void JustDied(Unit* /*killer*/) OVERRIDE + { + _JustDied(); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* who) OVERRIDE + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void DoAction(int32 action) OVERRIDE + { + if (action == ACTION_OOZE_DEAD) + ++abuseTheOoze; + } + + uint32 GetData(uint32 type) const OVERRIDE + { + if (type == DATA_ABUSE_THE_OOZE) + return abuseTheOoze; + + return 0; + } + + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - EnterEvadeMode(); - return; + case EVENT_CHAIN_LIGHTNING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(target, SPELL_CHAIN_LIGHTING); + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(10000, 15000)); + break; + case EVENT_LIGHTNING_SHIELD: + DoCast(me, SPELL_LIGHTING_SHIELD); + break; + case EVENT_STATIC_CHARGE: + DoCastVictim(SPELL_STATIC_CHARGE); + events.ScheduleEvent(EVENT_STATIC_CHARGE, urand(20000, 25000)); + break; + case EVENT_LIGHTNING_RING: + DoCast(me, SPELL_LIGHTING_RING); + events.ScheduleEvent(EVENT_LIGHTNING_RING, urand(30000, 35000)); + break; + case EVENT_SUMMON: + { + uint8 summonPipe = urand(0, 1); + if (HealthAbovePct(75)) + me->SummonCreature(NPC_FORGED_IRON_DWARF, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + else if (HealthAbovePct(50)) + me->SummonCreature(NPC_FORGED_IRON_TROGG, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + else if (HealthAbovePct(25)) + me->SummonCreature(NPC_MALFORMED_OOZE, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + else + me->SummonCreature(NPC_EARTHEN_DWARF, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + + events.ScheduleEvent(EVENT_SUMMON, 20000); + break; + } + case EVENT_FRENZY: + /// @todo: add emote + DoCast(me, SPELL_FRENZY, true); + break; + default: + break; } - */ - instance->SetBossState(DATA_SJONNIR, IN_PROGRESS); - } - } + } - void UpdateAI(uint32 diff) OVERRIDE - { - //Return since we have no target - if (!UpdateVictim()) - return; - - if (uiChainLightningTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_CHAIN_LIGHTING); - uiChainLightningTimer = urand(10000, 15000); - } else uiChainLightningTimer -= diff; - - if (uiLightningShieldTimer <= diff) - { - DoCast(me, SPELL_LIGHTING_SHIELD); - uiLightningShieldTimer -= diff; + DoMeleeAttackIfReady(); } - if (uiStaticChargeTimer <= diff) - { - DoCastVictim(SPELL_STATIC_CHARGE); - uiStaticChargeTimer = urand(20000, 25000); - } uiStaticChargeTimer -= diff; + private: + uint8 abuseTheOoze; + }; - if (uiLightningRingTimer <= diff) - { - if (me->IsNonMeleeSpellCasted(false)) - me->InterruptNonMeleeSpells(false); - DoCast(me, SPELL_LIGHTING_RING); - uiLightningRingTimer = urand(30000, 35000); - } else uiLightningRingTimer -= diff; - - if (uiSummonTimer <= diff) - { - uint32 uiSummonPipe = rand()%2; - me->SummonCreature(uiEncounterTimer > DATA_TIME_BEFORE_OOZE ? CREATURE_MALFORMED_OOZE : - RAND(CREATURE_FORGED_IRON_DWARF, CREATURE_FORGED_IRON_TROGG), - PipeLocations[uiSummonPipe].x, PipeLocations[uiSummonPipe].y, PipeLocations[uiSummonPipe].z, 0.0f, - TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - uiSummonTimer = 20000; - } else uiSummonTimer -= diff; - - if (!bIsFrenzy) - { - if (uiFrenzyTimer <= diff) - { - DoCast(me, SPELL_FRENZY); - bIsFrenzy = true; - } - else uiFrenzyTimer -= diff; - } - - uiEncounterTimer +=diff; - - DoMeleeAttackIfReady(); - } - - void JustSummoned(Creature* summon) OVERRIDE + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - summon->GetMotionMaster()->MovePoint(0, CenterPoint.x, CenterPoint.y, CenterPoint.z); - /*if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - summon->AI()->AttackStart(target);*/ - lSummons.Summon(summon); + return GetHallsOfStoneAI(creature); } - - void JustDied(Unit* /*killer*/) OVERRIDE - { - Talk(SAY_DEATH); - lSummons.DespawnAll(); - - if (instance) - instance->SetBossState(DATA_SJONNIR, DONE); - } - - void KilledUnit(Unit* victim) OVERRIDE - { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); - } - - void DoAction(int32 action) OVERRIDE - { - if (action == ACTION_OOZE_DEAD) - ++abuseTheOoze; - } - - uint32 GetData(uint32 type) const OVERRIDE - { - if (type == DATA_ABUSE_THE_OOZE) - return abuseTheOoze; - - return 0; - } - }; - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return GetHallsOfStoneAI(creature); - } }; class npc_malformed_ooze : public CreatureScript { -public: - npc_malformed_ooze() : CreatureScript("npc_malformed_ooze") { } + public: + npc_malformed_ooze() : CreatureScript("npc_malformed_ooze") { } - struct npc_malformed_oozeAI : public ScriptedAI - { - npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) {} - - uint32 uiMergeTimer; - - void Reset() OVERRIDE + struct npc_malformed_oozeAI : public ScriptedAI { - uiMergeTimer = 10000; - } + npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) { } - void UpdateAI(uint32 diff) OVERRIDE - { - if (uiMergeTimer <= diff) + void Reset() OVERRIDE { - if (Creature* temp = me->FindNearestCreature(CREATURE_MALFORMED_OOZE, 3.0f, true)) + _mergeTimer = 10000; + } + + void UpdateAI(uint32 diff) OVERRIDE + { + if (_mergeTimer <= diff) { - DoSpawnCreature(CREATURE_IRON_SLUDGE, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000); - temp->DisappearAndDie(); - me->DisappearAndDie(); + if (Creature* temp = me->FindNearestCreature(NPC_MALFORMED_OOZE, 3.0f, true)) + { + DoSpawnCreature(NPC_IRON_SLUDGE, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000); + temp->DisappearAndDie(); + me->DisappearAndDie(); + } + _mergeTimer = 3000; } - uiMergeTimer = 3000; - } else uiMergeTimer -= diff; + else + _mergeTimer -= diff; - if (!UpdateVictim()) - return; + if (!UpdateVictim()) + return; - DoMeleeAttackIfReady(); + DoMeleeAttackIfReady(); + } + + private: + uint32 _mergeTimer; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return GetHallsOfStoneAI(creature); - } }; class npc_iron_sludge : public CreatureScript @@ -307,8 +265,8 @@ class npc_iron_sludge : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Sjonnir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SJONNIR))) - Sjonnir->AI()->DoAction(ACTION_OOZE_DEAD); + if (Creature* sjonnir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SJONNIR))) + sjonnir->AI()->DoAction(ACTION_OOZE_DEAD); } };