From 7899d266658bb347e25e5e59fe87021c332d43a0 Mon Sep 17 00:00:00 2001 From: Yaki Khadafi Date: Sun, 5 Aug 2012 17:08:25 +0300 Subject: [PATCH] Fix SMSG_AUTH_RESPONSE and addons Signed-off-by: Yaki Khadafi --- src/game/World.cpp | 16 ++++----- src/game/WorldSession.cpp | 14 +++++--- src/game/WorldSession.h | 2 +- src/game/WorldSocket.cpp | 72 +++++++++++++++++++++++++++------------ 4 files changed, 68 insertions(+), 36 deletions(-) diff --git a/src/game/World.cpp b/src/game/World.cpp index 814ea86f5..c4485eeef 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -247,10 +247,10 @@ World::AddSession_(WorldSession* s) return; } - WorldPacket packet(SMSG_AUTH_RESPONSE, 16); + WorldPacket packet(SMSG_AUTH_RESPONSE, 17); - packet.WriteBit(false); - packet.WriteBit(true); + packet.WriteBit(false); // has queue + packet.WriteBit(true); // has account info packet << uint32(0); // Unknown - 4.3.2 packet << uint8(s->Expansion()); // 0 - normal, 1 - TBC, 2 - WotLK, 3 - CT. must be set in database manually for each account @@ -307,14 +307,14 @@ void World::AddQueuedSession(WorldSession* sess) // The 1st SMSG_AUTH_RESPONSE needs to contain other info too. WorldPacket packet (SMSG_AUTH_RESPONSE, 21); - packet.WriteBit(true); - packet.WriteBit(true); + packet.WriteBit(true); // has queue + packet.WriteBit(false); // unk queue-related + packet.WriteBit(true); // has account data - packet << uint8(0); // unk 3.3.0 packet << uint32(0); // Unknown - 4.3.2 - packet << uint8(sess->Expansion()); // 0 - normal, 1 - TBC, 2 - WotLK, 3 - CT. must be set in database manually for each account + packet << uint8(sess->Expansion()); // 0 - normal, 1 - TBC, 2 - WotLK, 3 - CT. must be set in database manually for each account packet << uint32(0); // BillingTimeRemaining - packet << uint8(sess->Expansion()); // 0 - normal, 1 - TBC, 2 - WotLK, 3 - CT. Must be set in database manually for each account. + packet << uint8(sess->Expansion()); // 0 - normal, 1 - TBC, 2 - WotLK, 3 - CT. Must be set in database manually for each account. packet << uint32(0); // BillingTimeRested packet << uint8(0); // BillingPlanFlags packet << uint8(AUTH_WAIT_QUEUE); diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 9cb7aae51..c207c7b64 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -613,16 +613,20 @@ void WorldSession::SendAuthWaitQue(uint32 position) { if (position == 0) { - WorldPacket packet(SMSG_AUTH_RESPONSE, 1); - packet << uint8(AUTH_OK); + WorldPacket packet( SMSG_AUTH_RESPONSE, 2 ); + packet.WriteBit(false); + packet.WriteBit(false); + packet << uint8( AUTH_OK ); SendPacket(&packet); } else { - WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1); + WorldPacket packet( SMSG_AUTH_RESPONSE, 1+4+1 ); + packet.WriteBit(true); // has queue + packet.WriteBit(false); // unk queue-related + packet.WriteBit(false); // has account info packet << uint8(AUTH_WAIT_QUEUE); packet << uint32(position); - packet << uint8(0); // unk 3.3.0 SendPacket(&packet); } } @@ -798,7 +802,7 @@ void WorldSession::SaveTutorialsData() m_tutorialState = TUTORIALDATA_UNCHANGED; } -void WorldSession::ReadAddonsInfo(WorldPacket& data) +void WorldSession::ReadAddonsInfo(ByteBuffer &data) { if (data.rpos() + 4 > data.size()) return; diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index ce0c09f43..91f7c1a2b 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -237,7 +237,7 @@ class MANGOS_DLL_SPEC WorldSession void SizeError(WorldPacket const& packet, uint32 size) const; - void ReadAddonsInfo(WorldPacket& data); + void ReadAddonsInfo(ByteBuffer &data); void SendAddonsInfo(); void SendPacket(WorldPacket const* packet); diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index d46dca8cc..4889339e1 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -760,30 +760,46 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) recvPacket.read_skip(); recvPacket.read_skip(); recvPacket.read_skip(); - recvPacket.read(digest, 4); + recvPacket >> digest[10]; + recvPacket >> digest[18]; + recvPacket >> digest[12]; + recvPacket >> digest[5]; recvPacket.read_skip(); - recvPacket.read(digest, 7); + recvPacket >> digest[15]; + recvPacket >> digest[9]; + recvPacket >> digest[19]; + recvPacket >> digest[4]; + recvPacket >> digest[7]; + recvPacket >> digest[16]; + recvPacket >> digest[3]; recvPacket >> clientBuild; - recvPacket.read(digest, 1); + recvPacket >> digest[8]; recvPacket.read_skip(); recvPacket.read_skip(); - recvPacket.read(digest, 5); - recvPacket.read_skip(); - recvPacket.read(digest, 1); + recvPacket >> digest[17]; + recvPacket >> digest[6]; + recvPacket >> digest[0]; + recvPacket >> digest[1]; + recvPacket >> digest[11]; recvPacket >> clientSeed; - recvPacket.read(digest, 2); + recvPacket >> digest[2]; + recvPacket.read_skip(); + recvPacket >> digest[14]; + recvPacket >> digest[13]; recvPacket >> m_addonSize; // addon data size - size_t addonInfoPos = recvPacket.rpos(); - recvPacket.rpos(recvPacket.rpos() + m_addonSize); // skip it + ByteBuffer addonsData; + addonsData.resize(m_addonSize); + recvPacket.read((uint8*)addonsData.contents(), m_addonSize); - recvPacket.read_skip(); - recvPacket.read_skip(); + uint8 nameLenLow, nameLenHigh; + recvPacket >> nameLenHigh; + recvPacket >> nameLenLow; - recvPacket.FlushBits(); + uint8 accNameLen = (nameLenHigh << 5) | (nameLenLow >> 3); - recvPacket >> accountName; + accountName = recvPacket.ReadString(accNameLen); DEBUG_LOG("WorldSocket::HandleAuthSession: client build %u, account %s, clientseed %X", clientBuild, @@ -793,7 +809,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) // Check the version of client trying to connect if(!IsAcceptableClientBuild(clientBuild)) { - packet.Initialize (SMSG_AUTH_RESPONSE, 1); + packet.Initialize (SMSG_AUTH_RESPONSE, 2); + packet.WriteBit(false); + packet.WriteBit(false); packet << uint8 (AUTH_VERSION_MISMATCH); SendPacket (packet); @@ -826,7 +844,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) // Stop if the account is not found if (!result) { - packet.Initialize (SMSG_AUTH_RESPONSE, 1); + packet.Initialize (SMSG_AUTH_RESPONSE, 2); + packet.WriteBit(false); + packet.WriteBit(false); packet << uint8 (AUTH_UNKNOWN_ACCOUNT); SendPacket (packet); @@ -861,7 +881,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) { if (strcmp (fields[3].GetString (), GetRemoteAddress ().c_str ())) { - packet.Initialize (SMSG_AUTH_RESPONSE, 1); + packet.Initialize (SMSG_AUTH_RESPONSE, 2); + packet.WriteBit(false); + packet.WriteBit(false); packet << uint8 (AUTH_FAILED); SendPacket (packet); @@ -895,7 +917,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) if (banresult) // if account banned { - packet.Initialize (SMSG_AUTH_RESPONSE, 1); + packet.Initialize (SMSG_AUTH_RESPONSE, 2); + packet.WriteBit(false); + packet.WriteBit(false); packet << uint8 (AUTH_BANNED); SendPacket (packet); @@ -910,7 +934,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) if (allowedAccountType > SEC_PLAYER && AccountTypes(security) < allowedAccountType) { - WorldPacket Packet (SMSG_AUTH_RESPONSE, 1); + WorldPacket Packet (SMSG_AUTH_RESPONSE, 2); + packet.WriteBit(false); + packet.WriteBit(false); Packet << uint8 (AUTH_UNAVAILABLE); SendPacket (packet); @@ -932,16 +958,18 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) sha.UpdateBigNumbers (&K, NULL); sha.Finalize (); - /*if (memcmp (sha.GetDigest (), digest, 20)) + if (memcmp (sha.GetDigest (), digest, 20)) { - packet.Initialize (SMSG_AUTH_RESPONSE, 1); + packet.Initialize (SMSG_AUTH_RESPONSE, 2); + packet.WriteBit(false); + packet.WriteBit(false); packet << uint8 (AUTH_FAILED); SendPacket (packet); sLog.outError ("WorldSocket::HandleAuthSession: Sent Auth Response (authentification failed)."); return -1; - }*/ + } std::string address = GetRemoteAddress (); @@ -963,7 +991,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) m_Session->LoadGlobalAccountData(); m_Session->LoadTutorialsData(); - m_Session->ReadAddonsInfo(recvPacket); + m_Session->ReadAddonsInfo(addonsData); // In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec ACE_OS::sleep (ACE_Time_Value (0, 10000));