Fix SMSG_AUTH_RESPONSE and addons

Signed-off-by: Yaki Khadafi <elsoldollo@gmail.com>
This commit is contained in:
Yaki Khadafi 2012-08-05 17:08:25 +03:00 committed by Antz
parent 28d99c7f7c
commit 7899d26665
4 changed files with 68 additions and 36 deletions

View file

@ -247,10 +247,10 @@ World::AddSession_(WorldSession* s)
return; return;
} }
WorldPacket packet(SMSG_AUTH_RESPONSE, 16); WorldPacket packet(SMSG_AUTH_RESPONSE, 17);
packet.WriteBit(false); packet.WriteBit(false); // has queue
packet.WriteBit(true); packet.WriteBit(true); // has account info
packet << uint32(0); // Unknown - 4.3.2 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 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. // The 1st SMSG_AUTH_RESPONSE needs to contain other info too.
WorldPacket packet (SMSG_AUTH_RESPONSE, 21); WorldPacket packet (SMSG_AUTH_RESPONSE, 21);
packet.WriteBit(true); packet.WriteBit(true); // has queue
packet.WriteBit(true); 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 << 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 << 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 << uint32(0); // BillingTimeRested
packet << uint8(0); // BillingPlanFlags packet << uint8(0); // BillingPlanFlags
packet << uint8(AUTH_WAIT_QUEUE); packet << uint8(AUTH_WAIT_QUEUE);

View file

@ -613,16 +613,20 @@ void WorldSession::SendAuthWaitQue(uint32 position)
{ {
if (position == 0) if (position == 0)
{ {
WorldPacket packet(SMSG_AUTH_RESPONSE, 1); WorldPacket packet( SMSG_AUTH_RESPONSE, 2 );
packet << uint8(AUTH_OK); packet.WriteBit(false);
packet.WriteBit(false);
packet << uint8( AUTH_OK );
SendPacket(&packet); SendPacket(&packet);
} }
else 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 << uint8(AUTH_WAIT_QUEUE);
packet << uint32(position); packet << uint32(position);
packet << uint8(0); // unk 3.3.0
SendPacket(&packet); SendPacket(&packet);
} }
} }
@ -798,7 +802,7 @@ void WorldSession::SaveTutorialsData()
m_tutorialState = TUTORIALDATA_UNCHANGED; m_tutorialState = TUTORIALDATA_UNCHANGED;
} }
void WorldSession::ReadAddonsInfo(WorldPacket& data) void WorldSession::ReadAddonsInfo(ByteBuffer &data)
{ {
if (data.rpos() + 4 > data.size()) if (data.rpos() + 4 > data.size())
return; return;

View file

@ -237,7 +237,7 @@ class MANGOS_DLL_SPEC WorldSession
void SizeError(WorldPacket const& packet, uint32 size) const; void SizeError(WorldPacket const& packet, uint32 size) const;
void ReadAddonsInfo(WorldPacket& data); void ReadAddonsInfo(ByteBuffer &data);
void SendAddonsInfo(); void SendAddonsInfo();
void SendPacket(WorldPacket const* packet); void SendPacket(WorldPacket const* packet);

View file

@ -760,30 +760,46 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
recvPacket.read_skip<uint32>(); recvPacket.read_skip<uint32>();
recvPacket.read_skip<uint32>(); recvPacket.read_skip<uint32>();
recvPacket.read_skip<uint8>(); recvPacket.read_skip<uint8>();
recvPacket.read(digest, 4); recvPacket >> digest[10];
recvPacket >> digest[18];
recvPacket >> digest[12];
recvPacket >> digest[5];
recvPacket.read_skip<uint64>(); recvPacket.read_skip<uint64>();
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 >> clientBuild;
recvPacket.read(digest, 1); recvPacket >> digest[8];
recvPacket.read_skip<uint32>(); recvPacket.read_skip<uint32>();
recvPacket.read_skip<uint8>(); recvPacket.read_skip<uint8>();
recvPacket.read(digest, 5); recvPacket >> digest[17];
recvPacket.read_skip<uint32>(); recvPacket >> digest[6];
recvPacket.read(digest, 1); recvPacket >> digest[0];
recvPacket >> digest[1];
recvPacket >> digest[11];
recvPacket >> clientSeed; recvPacket >> clientSeed;
recvPacket.read(digest, 2); recvPacket >> digest[2];
recvPacket.read_skip<uint32>();
recvPacket >> digest[14];
recvPacket >> digest[13];
recvPacket >> m_addonSize; // addon data size recvPacket >> m_addonSize; // addon data size
size_t addonInfoPos = recvPacket.rpos(); ByteBuffer addonsData;
recvPacket.rpos(recvPacket.rpos() + m_addonSize); // skip it addonsData.resize(m_addonSize);
recvPacket.read((uint8*)addonsData.contents(), m_addonSize);
recvPacket.read_skip<uint8>(); uint8 nameLenLow, nameLenHigh;
recvPacket.read_skip<uint8>(); 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", DEBUG_LOG("WorldSocket::HandleAuthSession: client build %u, account %s, clientseed %X",
clientBuild, clientBuild,
@ -793,7 +809,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
// Check the version of client trying to connect // Check the version of client trying to connect
if(!IsAcceptableClientBuild(clientBuild)) 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); packet << uint8 (AUTH_VERSION_MISMATCH);
SendPacket (packet); SendPacket (packet);
@ -826,7 +844,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
// Stop if the account is not found // Stop if the account is not found
if (!result) 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); packet << uint8 (AUTH_UNKNOWN_ACCOUNT);
SendPacket (packet); SendPacket (packet);
@ -861,7 +881,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
{ {
if (strcmp (fields[3].GetString (), GetRemoteAddress ().c_str ())) 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); packet << uint8 (AUTH_FAILED);
SendPacket (packet); SendPacket (packet);
@ -895,7 +917,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
if (banresult) // if account banned 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); packet << uint8 (AUTH_BANNED);
SendPacket (packet); SendPacket (packet);
@ -910,7 +934,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
if (allowedAccountType > SEC_PLAYER && AccountTypes(security) < allowedAccountType) 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); Packet << uint8 (AUTH_UNAVAILABLE);
SendPacket (packet); SendPacket (packet);
@ -932,16 +958,18 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
sha.UpdateBigNumbers (&K, NULL); sha.UpdateBigNumbers (&K, NULL);
sha.Finalize (); 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); packet << uint8 (AUTH_FAILED);
SendPacket (packet); SendPacket (packet);
sLog.outError ("WorldSocket::HandleAuthSession: Sent Auth Response (authentification failed)."); sLog.outError ("WorldSocket::HandleAuthSession: Sent Auth Response (authentification failed).");
return -1; return -1;
}*/ }
std::string address = GetRemoteAddress (); std::string address = GetRemoteAddress ();
@ -963,7 +991,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
m_Session->LoadGlobalAccountData(); m_Session->LoadGlobalAccountData();
m_Session->LoadTutorialsData(); 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 // In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec
ACE_OS::sleep (ACE_Time_Value (0, 10000)); ACE_OS::sleep (ACE_Time_Value (0, 10000));