aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Accounts/BattlenetAccountMgr.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-06-08 16:14:24 +0200
committerShauren <shauren.trinity@gmail.com>2014-06-08 16:14:24 +0200
commit7dd552c8261be9d1c9c8e45628e5aca5cdae405d (patch)
tree1b84d014b52f5fe638a9bde1494cbb2e88de0c91 /src/server/game/Accounts/BattlenetAccountMgr.cpp
parente1e5f2a196240707f1671a02df6bd4966fed67f3 (diff)
parent9f69eda67f7fad50553f8d569851a5005437e677 (diff)
Merge branch 'battle.net' into 4.3.4
Diffstat (limited to 'src/server/game/Accounts/BattlenetAccountMgr.cpp')
-rw-r--r--src/server/game/Accounts/BattlenetAccountMgr.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/server/game/Accounts/BattlenetAccountMgr.cpp b/src/server/game/Accounts/BattlenetAccountMgr.cpp
new file mode 100644
index 00000000000..8b73ba19a97
--- /dev/null
+++ b/src/server/game/Accounts/BattlenetAccountMgr.cpp
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "AccountMgr.h"
+#include "BattlenetAccountMgr.h"
+#include "DatabaseEnv.h"
+#include "Util.h"
+#include "SHA256.h"
+
+AccountOpResult Battlenet::AccountMgr::CreateBattlenetAccount(std::string email, std::string password)
+{
+ if (utf8length(email) > 64)
+ return AccountOpResult::AOR_NAME_TOO_LONG;
+
+ Utf8ToUpperOnlyLatin(email);
+ Utf8ToUpperOnlyLatin(password);
+
+ if (GetId(email))
+ return AccountOpResult::AOR_NAME_ALREADY_EXIST;
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BNET_ACCOUNT);
+ stmt->setString(0, email);
+ stmt->setString(1, CalculateShaPassHash(email, password));
+ LoginDatabase.Execute(stmt);
+
+ return AccountOpResult::AOR_OK;
+}
+
+AccountOpResult Battlenet::AccountMgr::ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword)
+{
+ // Check if accounts exists
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_ACCOUNT_EMAIL_BY_ID);
+ stmt->setUInt32(0, accountId);
+ PreparedQueryResult result = LoginDatabase.Query(stmt);
+
+ if (!result)
+ return AccountOpResult::AOR_NAME_NOT_EXIST;
+
+ Utf8ToUpperOnlyLatin(newUsername);
+ if (utf8length(newUsername) > MAX_ACCOUNT_STR)
+ return AccountOpResult::AOR_NAME_TOO_LONG;
+
+ Utf8ToUpperOnlyLatin(newPassword);
+ if (utf8length(newPassword) > MAX_PASS_STR)
+ return AccountOpResult::AOR_PASS_TOO_LONG;
+
+ stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_PASSWORD);
+ stmt->setString(0, newUsername);
+ stmt->setString(1, CalculateShaPassHash(newUsername, newPassword));
+ stmt->setUInt32(2, accountId);
+ LoginDatabase.Execute(stmt);
+
+ return AccountOpResult::AOR_OK;
+}
+
+AccountOpResult Battlenet::AccountMgr::ChangePassword(uint32 accountId, std::string newPassword)
+{
+ std::string username;
+ if (!GetName(accountId, username))
+ return AccountOpResult::AOR_NAME_NOT_EXIST; // account doesn't exist
+
+ Utf8ToUpperOnlyLatin(username);
+ Utf8ToUpperOnlyLatin(newPassword);
+ if (utf8length(newPassword) > MAX_PASS_STR)
+ return AccountOpResult::AOR_PASS_TOO_LONG;
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_PASSWORD);
+ stmt->setString(0, username);
+ stmt->setString(1, CalculateShaPassHash(username, newPassword));
+ stmt->setUInt32(2, accountId);
+ LoginDatabase.Execute(stmt);
+
+ return AccountOpResult::AOR_OK;
+}
+
+uint32 Battlenet::AccountMgr::GetId(std::string const& username)
+{
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_ACCOUNT_ID_BY_EMAIL);
+ stmt->setString(0, username);
+ if (PreparedQueryResult result = LoginDatabase.Query(stmt))
+ return (*result)[0].GetUInt32();
+
+ return 0;
+}
+
+bool Battlenet::AccountMgr::GetName(uint32 accountId, std::string& name)
+{
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_ACCOUNT_EMAIL_BY_ID);
+ stmt->setUInt32(0, accountId);
+ if (PreparedQueryResult result = LoginDatabase.Query(stmt))
+ {
+ name = (*result)[0].GetString();
+ return true;
+ }
+
+ return false;
+}
+
+bool Battlenet::AccountMgr::CheckPassword(uint32 accountId, std::string password)
+{
+ std::string username;
+
+ if (!GetName(accountId, username))
+ return false;
+
+ Utf8ToUpperOnlyLatin(username);
+ Utf8ToUpperOnlyLatin(password);
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_CHECK_PASSWORD);
+ stmt->setUInt32(0, accountId);
+ stmt->setString(1, CalculateShaPassHash(username, password));
+ PreparedQueryResult result = LoginDatabase.Query(stmt);
+
+ return !result.null();
+}
+
+std::string Battlenet::AccountMgr::CalculateShaPassHash(std::string const& name, std::string const& password)
+{
+ SHA256Hash email;
+ email.UpdateData(name);
+ email.Finalize();
+
+ SHA256Hash sha;
+ sha.UpdateData(ByteArrayToHexStr(email.GetDigest(), email.GetLength()));
+ sha.UpdateData(":");
+ sha.UpdateData(password);
+ sha.Finalize();
+
+ return ByteArrayToHexStr(sha.GetDigest(), sha.GetLength(), true);
+}