mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[9750] Add structure of SMSG_REDIRECT_CLIENT (0x50D).
Thanks to TOM_RUS for help with research.
This commit is contained in:
parent
5d84dbb492
commit
ef979daddc
11 changed files with 51 additions and 11 deletions
|
|
@ -1327,15 +1327,15 @@ enum Opcodes
|
|||
SMSG_CAMERA_SHAKE = 0x50A, // uint32 SpellEffectCameraShakes.dbc index, uint32
|
||||
SMSG_UNKNOWN_1291 = 0x50B, // some item update packet?
|
||||
UMSG_UNKNOWN_1292 = 0x50C, // not found
|
||||
SMSG_UNKNOWN_1293 = 0x50D, //
|
||||
SMSG_REDIRECT_CLIENT = 0x50D, // uint32 ip, uint16 port, uint32 unk, uint8[20] hash
|
||||
CMSG_UNKNOWN_1294 = 0x50E, // something with networking
|
||||
SMSG_UNKNOWN_1295 = 0x50F, //
|
||||
CMSG_UNKNOWN_1296 = 0x510, // something with networking
|
||||
SMSG_UNKNOWN_1297 = 0x511, //
|
||||
CMSG_UNKNOWN_1298 = 0x512, // something with networking
|
||||
UMSG_UNKNOWN_1299 = 0x513, // not found
|
||||
SMSG_UNKNOWN_1300 = 0x514, // SMSG, multi combatlog
|
||||
SMSG_UNKNOWN_1301 = 0x515, // event EVENT_LFG_OPEN_FROM_GOSSIP (opens dungeon finder, probably for outdoor bosses)
|
||||
SMSG_COMBAT_LOG_MULTIPLE = 0x514, // SMSG, multi combatlog
|
||||
SMSG_LFG_OPEN_FROM_GOSSIP = 0x515, // event EVENT_LFG_OPEN_FROM_GOSSIP (opens dungeon finder, probably for outdoor bosses)
|
||||
SMSG_UNKNOWN_1302 = 0x516, // something with player movement (move event 58?)
|
||||
CMSG_UNKNOWN_1303 = 0x517, // something with player movement (move event 58?)
|
||||
SMSG_UNKNOWN_1304 = 0x518, // something with player movement (move event 58?), speed packet
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@
|
|||
#include "BattleGroundMgr.h"
|
||||
#include "MapManager.h"
|
||||
#include "SocialMgr.h"
|
||||
#include "Auth/AuthCrypt.h"
|
||||
#include "Auth/HMACSHA1.h"
|
||||
#include "zlib/zlib.h"
|
||||
|
||||
/// WorldSession constructor
|
||||
|
|
@ -856,3 +858,22 @@ void WorldSession::SetPlayer( Player *plr )
|
|||
if(_player)
|
||||
m_GUIDLow = _player->GetGUIDLow();
|
||||
}
|
||||
|
||||
void WorldSession::SendRedirectClient(std::string& ip, uint16 port)
|
||||
{
|
||||
uint32 ip2 = ACE_OS::inet_addr(ip.c_str());
|
||||
WorldPacket pkt(SMSG_REDIRECT_CLIENT, 4 + 2 + 4 + 20);
|
||||
|
||||
pkt << uint32(ip2); // inet_addr(ipstr)
|
||||
pkt << uint16(port); // port
|
||||
|
||||
pkt << uint32(GetLatency()); // latency-related?
|
||||
|
||||
HMACSHA1 sha1(20, m_Socket->GetSessionKey().AsByteArray());
|
||||
sha1.UpdateData((uint8*)&ip2, 4);
|
||||
sha1.UpdateData((uint8*)&port, 2);
|
||||
sha1.Finalize();
|
||||
pkt.append(sha1.GetDigest(), 20); // hmacsha1(ip+port) w/ sessionkey as seed
|
||||
|
||||
SendPacket(&pkt);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ class MANGOS_DLL_SPEC WorldSession
|
|||
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3);
|
||||
void SendSetPhaseShift(uint32 phaseShift);
|
||||
void SendQueryTimeResponse();
|
||||
void SendRedirectClient(std::string& ip, uint16 port);
|
||||
|
||||
AccountTypes GetSecurity() const { return _security; }
|
||||
uint32 GetAccountId() const { return _accountId; }
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
#include "ByteBuffer.h"
|
||||
#include "Opcodes.h"
|
||||
#include "Database/DatabaseEnv.h"
|
||||
#include "Auth/BigNumber.h"
|
||||
#include "Auth/Sha1.h"
|
||||
#include "WorldSession.h"
|
||||
#include "WorldSocketMgr.h"
|
||||
|
|
@ -827,6 +826,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
|
|||
|
||||
v.SetHexStr(fields[5].GetString());
|
||||
s.SetHexStr (fields[6].GetString());
|
||||
m_s = s;
|
||||
|
||||
const char* sStr = s.AsHexStr (); //Must be freed by OPENSSL_free()
|
||||
const char* vStr = v.AsHexStr (); //Must be freed by OPENSSL_free()
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
|
||||
#include "Common.h"
|
||||
#include "Auth/AuthCrypt.h"
|
||||
#include "Auth/BigNumber.h"
|
||||
|
||||
class ACE_Message_Block;
|
||||
class WorldPacket;
|
||||
|
|
@ -121,6 +122,9 @@ class WorldSocket : protected WorldHandler
|
|||
/// Remove reference to this object.
|
||||
long RemoveReference (void);
|
||||
|
||||
/// Return the session key
|
||||
BigNumber& GetSessionKey() { return m_s; }
|
||||
|
||||
protected:
|
||||
/// things called by ACE framework.
|
||||
WorldSocket (void);
|
||||
|
|
@ -212,6 +216,8 @@ class WorldSocket : protected WorldHandler
|
|||
bool m_OutActive;
|
||||
|
||||
uint32 m_Seed;
|
||||
|
||||
BigNumber m_s;
|
||||
};
|
||||
|
||||
#endif /* _WORLDSOCKET_H */
|
||||
|
|
|
|||
|
|
@ -273,12 +273,15 @@ WorldSocketMgr::StartReactiveIO (ACE_UINT16 port, const char* address)
|
|||
}
|
||||
|
||||
int
|
||||
WorldSocketMgr::StartNetwork (ACE_UINT16 port, const char* address)
|
||||
WorldSocketMgr::StartNetwork (ACE_UINT16 port, std::string& address)
|
||||
{
|
||||
m_addr = address;
|
||||
m_port = port;
|
||||
|
||||
if (!sLog.IsOutDebug ())
|
||||
ACE_Log_Msg::instance ()->priority_mask (LM_ERROR, ACE_Log_Msg::PROCESS);
|
||||
|
||||
if (StartReactiveIO (port, address) == -1)
|
||||
if (StartReactiveIO (port, address.c_str()) == -1)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
#include <ace/Singleton.h>
|
||||
#include <ace/Thread_Mutex.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
class WorldSocket;
|
||||
class ReactorRunnable;
|
||||
class ACE_Event_Handler;
|
||||
|
|
@ -41,7 +43,7 @@ public:
|
|||
friend class ACE_Singleton<WorldSocketMgr,ACE_Thread_Mutex>;
|
||||
|
||||
/// Start network, listen at address:port .
|
||||
int StartNetwork (ACE_UINT16 port, const char* address);
|
||||
int StartNetwork (ACE_UINT16 port, std::string& address);
|
||||
|
||||
/// Stops all network threads, It will wait for all running threads .
|
||||
void StopNetwork ();
|
||||
|
|
@ -49,6 +51,9 @@ public:
|
|||
/// Wait untill all network threads have "joined" .
|
||||
void Wait ();
|
||||
|
||||
std::string& GetBindAddress() { return m_addr; }
|
||||
ACE_UINT16 GetBindPort() { return m_port; }
|
||||
|
||||
/// Make this class singleton .
|
||||
static WorldSocketMgr* Instance ();
|
||||
|
||||
|
|
@ -68,6 +73,9 @@ private:
|
|||
int m_SockOutUBuff;
|
||||
bool m_UseNoDelay;
|
||||
|
||||
std::string m_addr;
|
||||
ACE_UINT16 m_port;
|
||||
|
||||
ACE_Event_Handler* m_Acceptor;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -312,7 +312,7 @@ int Master::Run()
|
|||
uint16 wsport = sWorld.getConfig (CONFIG_UINT32_PORT_WORLD);
|
||||
std::string bind_ip = sConfig.GetStringDefault ("BindIP", "0.0.0.0");
|
||||
|
||||
if (sWorldSocketMgr->StartNetwork (wsport, bind_ip.c_str ()) == -1)
|
||||
if (sWorldSocketMgr->StartNetwork (wsport, bind_ip) == -1)
|
||||
{
|
||||
sLog.outError ("Failed to start network");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@
|
|||
#include <ace/Guard_T.h>
|
||||
#include <ace/RW_Thread_Mutex.h>
|
||||
#include <ace/Thread_Mutex.h>
|
||||
#include <ace/OS_NS_arpa_inet.h>
|
||||
|
||||
#if PLATFORM == PLATFORM_WINDOWS
|
||||
# define FD_SETSIZE 4096
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ bool IsIPAddress(char const* ipaddress)
|
|||
|
||||
// Let the big boys do it.
|
||||
// Drawback: all valid ip address formats are recognized e.g.: 12.23,121234,0xABCD)
|
||||
return inet_addr(ipaddress) != INADDR_NONE;
|
||||
return ACE_OS::inet_addr(ipaddress) != INADDR_NONE;
|
||||
}
|
||||
|
||||
/// create PID file
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "9749"
|
||||
#define REVISION_NR "9750"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue