mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 13:37:05 +00:00
Fix SMSG_AUTH_RESPONSE and addons
Signed-off-by: Yaki Khadafi <elsoldollo@gmail.com>
This commit is contained in:
parent
28d99c7f7c
commit
7899d26665
4 changed files with 68 additions and 36 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue