aboutsummaryrefslogtreecommitdiff
path: root/src/server/authserver/Server/BattlenetSocket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/authserver/Server/BattlenetSocket.cpp')
-rw-r--r--src/server/authserver/Server/BattlenetSocket.cpp30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/server/authserver/Server/BattlenetSocket.cpp b/src/server/authserver/Server/BattlenetSocket.cpp
index 56744784167..eb8dc1158f0 100644
--- a/src/server/authserver/Server/BattlenetSocket.cpp
+++ b/src/server/authserver/Server/BattlenetSocket.cpp
@@ -59,7 +59,7 @@ Battlenet::Socket::ModuleHandler const Battlenet::Socket::ModuleHandlers[MODULE_
};
Battlenet::Socket::Socket(RealmSocket& socket) : _socket(socket), _accountId(0), _accountName(), _locale(),
- _os(), _build(0), _gameAccountId(0), _accountSecurityLevel(SEC_PLAYER), I(), s(), v(), b(), B(), K(),
+ _os(), _build(0), _gameAccountId(0), _gameAccountIndex(0), _accountSecurityLevel(SEC_PLAYER), I(), s(), v(), b(), B(), K(),
_reconnectProof(), _crypt(), _authed(false)
{
static uint8 const N_Bytes[] =
@@ -323,10 +323,12 @@ bool Battlenet::Socket::HandleAuthReconnect(PacketHeader& header, BitStream& pac
if (baseComponent != reconnect.Components.end())
_build = baseComponent->Build;
+ uint8 accountIndex = atol(reconnect.GameAccountName.substr(reconnect.GameAccountName.find_last_of('#') + 1).c_str());
+
Utf8ToUpperOnlyLatin(_accountName);
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_RECONNECT_INFO);
stmt->setString(0, _accountName);
- stmt->setString(1, reconnect.GameAccountName.c_str());
+ stmt->setUInt8(1, accountIndex);
PreparedQueryResult result = LoginDatabase.Query(stmt);
if (!result)
{
@@ -341,6 +343,7 @@ bool Battlenet::Socket::HandleAuthReconnect(PacketHeader& header, BitStream& pac
_accountId = fields[0].GetUInt32();
K.SetHexStr(fields[1].GetString().c_str());
_gameAccountId = fields[2].GetUInt32();
+ _gameAccountIndex = accountIndex;
ModuleInfo* thumbprint = sBattlenetMgr->CreateModule(_os, "Thumbprint");
ModuleInfo* resume = sBattlenetMgr->CreateModule(_os, "Resume");
@@ -768,8 +771,10 @@ bool Battlenet::Socket::HandlePasswordModule(BitStream* dataStream, ServerPacket
do
{
fields = result->Fetch();
+ std::ostringstream name;
+ name << "WoW" << uint32(fields[0].GetUInt8());
accounts.Write(2, 8);
- accounts.WriteString(fields[0].GetString(), 8);
+ accounts.WriteString(name.str(), 8);
} while (result->NextRow());
ModuleInfo* selectGameAccount = sBattlenetMgr->CreateModule(_os, "SelectGameAccount");
@@ -801,7 +806,8 @@ bool Battlenet::Socket::HandlePasswordModule(BitStream* dataStream, ServerPacket
return false;
}
- _gameAccountId = (*result)[1].GetUInt32();
+ _gameAccountId = fields[1].GetUInt32();
+ _gameAccountIndex = fields[0].GetUInt8();
request->Modules.push_back(sBattlenetMgr->CreateModule(_os, "RiskFingerprint"));
_modulesWaitingForData.push(MODULE_RISK_FINGERPRINT);
@@ -823,9 +829,18 @@ bool Battlenet::Socket::HandleSelectGameAccountModule(BitStream* dataStream, Ser
dataStream->Read<uint8>(8);
std::string account = dataStream->ReadString(8);
+ if (account.length() < 4)
+ {
+ AuthComplete* complete = new AuthComplete();
+ complete->SetAuthResult(LOGIN_NO_GAME_ACCOUNT);
+ ReplaceResponse(response, complete);
+ return false;
+ }
+
+ uint8 accountIndex = atol(account.substr(3).c_str());
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_GAME_ACCOUNT);
- stmt->setString(0, account);
+ stmt->setUInt8(0, accountIndex);
stmt->setUInt32(1, _accountId);
PreparedQueryResult result = LoginDatabase.Query(stmt);
if (!result)
@@ -856,6 +871,7 @@ bool Battlenet::Socket::HandleSelectGameAccountModule(BitStream* dataStream, Ser
}
_gameAccountId = fields[0].GetUInt32();
+ _gameAccountIndex = accountIndex;
ProofRequest* request = new ProofRequest();
request->Modules.push_back(sBattlenetMgr->CreateModule(_os, "RiskFingerprint"));
@@ -871,9 +887,9 @@ bool Battlenet::Socket::HandleRiskFingerprintModule(BitStream* dataStream, Serve
if (dataStream->Read<uint8>(8) == 1)
{
std::ostringstream str;
- str << _gameAccountId << "#1";
+ str << _accountId << "#" << uint32(_gameAccountIndex);
- complete->GameAccountId = _gameAccountId;
+ complete->AccountId = _accountId;
complete->GameAccountName = str.str();
complete->GameAccountFlags = GAMEACCOUNT_FLAG_PROPASS_LOCK;