CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
174 lines
3.9 KiB
C++
174 lines
3.9 KiB
C++
#include "stdafx.h"
|
|
|
|
#include "MasterServerSession.h"
|
|
#include "ServerSessionManager.h"
|
|
|
|
MasterServerSession::MasterServerSession()
|
|
{
|
|
}
|
|
|
|
MasterServerSession::~MasterServerSession()
|
|
{
|
|
}
|
|
|
|
VOID MasterServerSession::Init()
|
|
{
|
|
ServerSessionEx::Init();
|
|
Services().SetSyncKey( MASTER_SERVER );
|
|
}
|
|
|
|
VOID MasterServerSession::Release()
|
|
{
|
|
Services().CRYPTINFO.Release();
|
|
ServerSessionEx::Release();
|
|
}
|
|
|
|
VOID MasterServerSession::Update()
|
|
{
|
|
ServerSessionEx::Update();
|
|
}
|
|
|
|
// CHANGES: f110617.1L
|
|
void MasterServerSession::OnRedirect(
|
|
DWORD network_index, MSG_SERVER_TYPE* const first_contact_msg)
|
|
{
|
|
ServerSession::OnRedirect(network_index, first_contact_msg);
|
|
}
|
|
|
|
VOID MasterServerSession::OnAccept( DWORD dwNetworkIndex )
|
|
{
|
|
ASSERT( !"Should not enter here!" );
|
|
__asm int 3;
|
|
}
|
|
|
|
VOID MasterServerSession::OnConnect( BOOL bSuccess, DWORD dwNetworkIndex )
|
|
{
|
|
ServerSessionEx::OnConnect( bSuccess, dwNetworkIndex );
|
|
|
|
if( bSuccess )
|
|
{
|
|
SUNLOG(eCRITICAL_LOG, "Connected to master server." );
|
|
}
|
|
}
|
|
|
|
VOID MasterServerSession::OnDisconnect()
|
|
{
|
|
ServerSessionManager* pManager = ServerSessionManager::Instance();
|
|
SERVER_SESSION_DELEGATOR& rSession = pManager->FindServer( this );
|
|
|
|
if( rSession == NULL )
|
|
{
|
|
MessageOutEx( g_pSunLog, CSunLog::cCRITICAL_LOG, CSunLog::cOUTPUT_BOTH, CSunLog::cCATE_CONNECTION,
|
|
"[MasterServerSession] tried to remove an already released connection. Idx[%d]",
|
|
this->GetSessionIndex()
|
|
);
|
|
return;
|
|
}
|
|
|
|
pManager->RemoveServer( rSession );
|
|
|
|
ServerSessionEx::OnDisconnect();
|
|
|
|
//SUNLOG(eCRITICAL_LOG, "Disconnected from master server." );
|
|
}
|
|
|
|
BOOL MasterServerSession::SendPacket( MSG_BASE* pMsg, WORD wSize )
|
|
{
|
|
Services4Session& rService = Services();
|
|
Services4Session::sCRYPTINFO& rCRYPT = rService.CRYPTINFO;
|
|
|
|
BOOL bRet = FALSE;
|
|
BYTE* pBYTE;
|
|
|
|
pBYTE = PACKET_CONTROL_SM::GetBasePacketPtr4Send();
|
|
if( (BYTE*)pMsg != pBYTE )
|
|
CopyMemory( pBYTE, pMsg, (SIZE_T)wSize );
|
|
|
|
if( rCRYPT.IsCrypted() )
|
|
{
|
|
MSG_SM_CRYPTOGRAPHY_PACKET_ENCODING* pENCODING = PACKET_CONTROL_SM::GetPacketPtr_ENCODING();
|
|
|
|
ASSERT( wSize && wSize<16000 );
|
|
|
|
pENCODING->SetSNKey( rCRYPT.GetSendSNK() );
|
|
rCRYPT.CryptManager().Encrypt( pENCODING->GetPacketStream(), wSize, pENCODING->GetCRC() );
|
|
|
|
CryptFlowPolicy::MakePacket::PreSend_DefConverter(
|
|
(BYTE*)pENCODING,
|
|
rService.GetServerIPAddress(),
|
|
rService.GetSeqCryptKey() );
|
|
|
|
wSize += (WORD)pENCODING->GetHeaderSize();
|
|
|
|
bRet = Send( (BYTE*)pENCODING, wSize );
|
|
|
|
if( bRet )
|
|
rCRYPT.NextRoundSNKey4Send();
|
|
else
|
|
printf( "Send failed\n" );
|
|
|
|
return bRet;
|
|
}
|
|
else
|
|
{
|
|
ASSERT( !"Unexpected enter while in MasterServer state" );
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
VOID MasterServerSession::OnRecv( BYTE *pMsg, WORD wSize )
|
|
{
|
|
Services4Session& rService = Services();
|
|
Services4Session::sCRYPTINFO& rCRYPT = rService.CRYPTINFO;
|
|
|
|
CryptFlowPolicy::MakePacket::PostRecv_DefConverter(
|
|
pMsg,
|
|
rService.GetServerIPAddress(),
|
|
rService.GetSeqCryptKey() );
|
|
|
|
union
|
|
{
|
|
MSG_BASE* pBASE;
|
|
MSG_SM_CRYPTOGRAPHY_PACKET_ENCODED* pENCODED;
|
|
};
|
|
|
|
BOOL bIsCrypted = rCRYPT.IsCrypted();
|
|
|
|
if( bIsCrypted )
|
|
pENCODED = PACKET_CONTROL_SM::GetPacketPtr_ENCODED();
|
|
else
|
|
pBASE = (MSG_BASE*)PACKET_CONTROL_SM::GetBasePacketPtr4Recv();
|
|
|
|
if( (BYTE*)pBASE != pMsg )
|
|
CopyMemory( pBASE, pMsg, (SIZE_T)wSize );
|
|
|
|
if( bIsCrypted )
|
|
{
|
|
if( rCRYPT.GetRecvSNK() == pENCODED->GetSNKey() )
|
|
{
|
|
DWORD dwSize = (DWORD)wSize - pENCODED->GetHeaderSize();
|
|
if( dwSize && (dwSize<16000) )
|
|
{
|
|
if( rCRYPT.CryptManager().Decrypt( pENCODED->GetPacketStream(), dwSize, pENCODED->GetCRC() ) )
|
|
{
|
|
rCRYPT.NextRoundSNKey4Recv();
|
|
|
|
pBASE = (MSG_BASE*)PACKET_CONTROL_SM::GetBasePacketPtr4Recv();
|
|
wSize = (WORD)dwSize;
|
|
|
|
Services().GetPacketHandler()->ParsePacket( MASTER_SERVER, this, pBASE, wSize );
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ASSERT( !"Unexpected enter while in MasterServer state" );
|
|
return;
|
|
}
|
|
|
|
ASSERT( !"Unexpected path..." );
|
|
}
|