diff options
-rw-r--r-- | sql/updates/world/master/9999_99_99_00_world.sql | 2 | ||||
-rw-r--r-- | src/server/game/Accounts/AccountMgr.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Accounts/AccountMgr.h | 1 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Language.h | 3 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 3 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 11 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_ban.cpp | 3 |
7 files changed, 31 insertions, 4 deletions
diff --git a/sql/updates/world/master/9999_99_99_00_world.sql b/sql/updates/world/master/9999_99_99_00_world.sql new file mode 100644 index 00000000000..a2d5b686b65 --- /dev/null +++ b/sql/updates/world/master/9999_99_99_00_world.sql @@ -0,0 +1,2 @@ +DELETE FROM `trinity_string` WHERE `entry`=1191; +INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES (1191, 'Ban exists'); diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index 52a8597f1e1..b73117689c3 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -400,6 +400,18 @@ std::string AccountMgr::CalculateShaPassHash(std::string const& name, std::strin return ByteArrayToHexStr(sha.GetDigest(), sha.GetLength()); } +bool AccountMgr::IsBannedAccount(std::string const& name) +{ + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME); + stmt->setString(0, name); + PreparedQueryResult result = LoginDatabase.Query(stmt); + + if (!result) + return false; + + return true; +} + bool AccountMgr::IsPlayerAccount(uint32 gmlevel) { return gmlevel == SEC_PLAYER; diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h index 95a7f538560..ca5ed35943b 100644 --- a/src/server/game/Accounts/AccountMgr.h +++ b/src/server/game/Accounts/AccountMgr.h @@ -76,6 +76,7 @@ class TC_GAME_API AccountMgr static uint32 GetCharactersCount(uint32 accountId); static std::string CalculateShaPassHash(std::string const& name, std::string const& password); + static bool IsBannedAccount(std::string const& name); static bool IsPlayerAccount(uint32 gmlevel); static bool IsAdminAccount(uint32 gmlevel); static bool IsConsoleAccount(uint32 gmlevel); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 0f4135cad3a..039c3b81604 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -926,7 +926,8 @@ enum TrinityStrings LANG_ACCOUNT_BNET_UNLINKED = 1188, LANG_ACCOUNT_BNET_NOT_LINKED = 1189, LANG_DISALLOW_TICKETS_CONFIG = 1190, - // Room for more level 3 1191-1198 not used + LANG_BAN_EXISTS = 1191, + // Room for more level 3 1192-1198 not used // Debug commands LANG_DEBUG_AREATRIGGER_LEFT = 1999, diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index e784235a1b0..f7bea0e904e 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4826,7 +4826,8 @@ enum BanReturn { BAN_SUCCESS, BAN_SYNTAX_ERROR, - BAN_NOTFOUND + BAN_NOTFOUND, + BAN_EXISTS }; enum BattlegroundTeamId : uint8 diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 760ec282bd7..25ca56325cb 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2723,6 +2723,10 @@ BanReturn World::BanAccount(BanMode mode, std::string const& nameOrIP, uint32 du PreparedQueryResult resultAccounts = PreparedQueryResult(NULL); //used for kicking PreparedStatement* stmt = NULL; + // Prevent banning an already banned account + if (mode == BAN_ACCOUNT && AccountMgr::IsBannedAccount(nameOrIP)) + return BAN_EXISTS; + ///- Update the database with ban information switch (mode) { @@ -2841,17 +2845,20 @@ BanReturn World::BanCharacter(std::string const& name, std::string const& durati else guid = pBanned->GetGUID(); + //Use transaction in order to ensure the order of the queries + SQLTransaction trans = CharacterDatabase.BeginTransaction(); // make sure there is only one active ban PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_BAN); stmt->setUInt64(0, guid.GetCounter()); - CharacterDatabase.Execute(stmt); + trans->Append(stmt); stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_BAN); stmt->setUInt64(0, guid.GetCounter()); stmt->setUInt32(1, duration_secs); stmt->setString(2, author); stmt->setString(3, reason); - CharacterDatabase.Execute(stmt); + trans->Append(stmt); + CharacterDatabase.CommitTransaction(trans); if (pBanned) pBanned->GetSession()->KickPlayer(); diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index d59ed9c1407..5c9c89ab7eb 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -232,6 +232,9 @@ public: } handler->SetSentErrorMessage(true); return false; + case BAN_EXISTS: + handler->PSendSysMessage(LANG_BAN_EXISTS); + break; } return true; |