Skip to content

Commit

Permalink
Fix AuthChallenge, AuthSession, AuthResponse.
Browse files Browse the repository at this point in the history
New opcode handler definition method.

Thanks: Lightguard, Netcho, Fabi

Signed-off-by: Salja <salja2012@hotmail.de>
  • Loading branch information
Salja committed Aug 2, 2012
1 parent 6737128 commit 9b8f9a0
Show file tree
Hide file tree
Showing 6 changed files with 2,749 additions and 2,674 deletions.
2,644 changes: 1,330 additions & 1,314 deletions src/game/Opcodes.cpp

Large diffs are not rendered by default.

2,690 changes: 1,348 additions & 1,342 deletions src/game/Opcodes.h

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/game/WorldSession.cpp
Expand Up @@ -133,6 +133,9 @@ void WorldSession::SendPacket(WorldPacket const* packet)
if (!m_Socket)
return;

if (packet->GetOpcode() >= NUM_MSG_TYPES && packet->GetOpcode() != MSG_WOW_CONNECTION)
return;

#ifdef MANGOS_DEBUG

// Code for network use statistic
Expand Down
81 changes: 63 additions & 18 deletions src/game/WorldSocket.cpp
Expand Up @@ -243,19 +243,22 @@ int WorldSocket::open (void *a)

m_Address = remote_addr.get_host_addr ();

WorldPacket wowConnection(MSG_WOW_CONNECTION,46);

wowConnection << std::string("RLD OF WARCRAFT CONNECTION - SERVER TO CLIENT");

This comment has been minimized.

Copy link
@Tasssadar

Tasssadar Aug 2, 2012

Well, this packet is definitely interesting :)


SendPacket(wowConnection);

// Send startup packet.
WorldPacket packet (SMSG_AUTH_CHALLENGE, 37);

BigNumber seed1;
seed1.SetRand(16 * 8);
packet.append(seed1.AsByteArray(16), 16); // new encryption seeds

BigNumber seed2;
seed2.SetRand(16 * 8);
packet.append(seed2.AsByteArray(16), 16); // new encryption seeds
for(uint8 i = 0; i < 8; ++i)
{
packet << uint32(0);
}

packet << uint8(1); // 1...31
packet << uint32(m_Seed);
packet << uint8(1); // 1...31

if (SendPacket (packet) == -1)
return -1;
Expand Down Expand Up @@ -681,6 +684,8 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct)
{
switch(opcode)
{
case MSG_WOW_CONNECTION:
return HandleWowConnection(*new_pct);
case CMSG_PING:
return HandlePing (*new_pct);
case CMSG_AUTH_SESSION:
Expand Down Expand Up @@ -744,24 +749,56 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
{
// NOTE: ATM the socket is singlethread, have this in mind ...
uint8 digest[20];
uint32 clientSeed, id, security;
uint16 ClientBuild;
uint8 expansion = 0;
uint16 ClientBuild, security;
uint32 clientSeed, id, expansion, addonsSize;
LocaleConstant locale;
std::string account;
Sha1Hash sha1;
BigNumber v, s, g, N, K;
WorldPacket packet;

// Read the content of the packet
recvPacket.read(digest, 20);
uint32 unkInt32[6];
int8 curr = 0;
recvPacket >> unkInt32[curr++];
recvPacket >> unkInt32[curr++];
recvPacket.read_skip<uint8>();
recvPacket >> digest[10];
recvPacket >> digest[18];
recvPacket >> digest[12];
recvPacket >> digest[5];
recvPacket.read_skip<uint64>();
recvPacket.read_skip<uint32>();
recvPacket >> clientSeed;
recvPacket >> digest[15];
recvPacket >> digest[9];
recvPacket >> digest[19];
recvPacket >> digest[4];
recvPacket >> digest[7];
recvPacket >> digest[16];
recvPacket >> digest[3];
recvPacket >> ClientBuild;
recvPacket >> digest[8];
recvPacket >> unkInt32[curr++];
recvPacket.read_skip<uint8>();
recvPacket >> account;
recvPacket.read_skip<uint32>(); // addon data size
recvPacket >> digest[17];
recvPacket >> digest[6];
recvPacket >> digest[0];
recvPacket >> digest[1];
recvPacket >> digest[11];
recvPacket >> clientSeed;
recvPacket >> digest[2];
recvPacket >> unkInt32[curr++];
recvPacket >> digest[14];
recvPacket >> digest[13];
size_t _beforeAddonSize = recvPacket.rpos();
recvPacket >> addonsSize;
recvPacket.read_skip(addonsSize);

uint8 _size[2];
recvPacket >> _size[0];
recvPacket >> _size[1];
uint8 size = (_size[0] << 4) | _size[1] >> 3;
account.resize(size);
recvPacket.read((uint8*)account.data(), size);

This comment has been minimized.

Copy link
@Fabi

Fabi Aug 2, 2012

Contributor

hmm..., maybe: uint32 nameLength = recvPacket:ReadBits(13); and then account = recvPacket.ReadString(nameLength); ???

DEBUG_LOG ("WorldSocket::HandleAuthSession: client build %u, account %s, clientseed %X",
ClientBuild,
Expand Down Expand Up @@ -849,8 +886,8 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
}
}

id = fields[0].GetUInt32 ();
security = fields[1].GetUInt16 ();
id = fields[0].GetUInt32();
security = fields[1].GetUInt16();
if(security > SEC_ADMINISTRATOR) // prevent invalid security settings in DB
security = SEC_ADMINISTRATOR;

Expand Down Expand Up @@ -1013,3 +1050,11 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket)
packet << ping;
return SendPacket (packet);
}

int WorldSocket::HandleWowConnection(WorldPacket& recv_packet)
{
std::string msgFromClient;
recv_packet >> msgFromClient;

return 0;
}
3 changes: 3 additions & 0 deletions src/game/WorldSocket.h
Expand Up @@ -173,6 +173,9 @@ class WorldSocket : protected WorldHandler
/// Called by ProcessIncoming() on CMSG_PING.
int HandlePing (WorldPacket& recvPacket);

/// Called by ProcessIncoming() on MSG_WOW_CONNECTION
int HandleWowConnection(WorldPacket& recvPacket);

private:
/// Time in which the last ping was received
ACE_Time_Value m_LastPingTime;
Expand Down
2 changes: 2 additions & 0 deletions src/game/WorldSocketMgr.cpp
Expand Up @@ -43,6 +43,7 @@
#include "Config/Config.h"
#include "Database/DatabaseEnv.h"
#include "WorldSocket.h"
#include "Opcodes.h"

/**
* This is a helper class to WorldSocketMgr ,that manages
Expand Down Expand Up @@ -212,6 +213,7 @@ WorldSocketMgr::WorldSocketMgr():
m_UseNoDelay(true),
m_Acceptor(0)
{
InitializeOpcodes();
}

WorldSocketMgr::~WorldSocketMgr()
Expand Down

0 comments on commit 9b8f9a0

Please sign in to comment.