#include "StdAfx.h" #include ".\tempuser.h" #include "UserFactory.h" #include "WaitingUserList.h" #include "Channel.h" #include "ChannelManager.h" #include #include // ¾Ïȣȭ ¶§¹®¿¡ include #include #include "WorldServerInfoParser.h" #include "UserManager.h" #include "PacketHandler.h" #include #include "ServerSessionManager.h" #include "ServerSession.h" #include #include "WorldGuildManager.h" TempUser::TempUser(void) { } TempUser::~TempUser(void) { } VOID TempUser::Init() { User::Init(); m_bFirstTime = TRUE; m_dwAuthID = 0; m_bUseCryptography = FALSE; SetVoiceChat( FALSE ); } VOID TempUser::OnAccept( DWORD dwNetworkIndex ) { User::OnAccept( dwNetworkIndex ); MSG_CW_ENTER_READY_BRD sendMsg; SendPacket( (BYTE*)&sendMsg, sizeof(sendMsg) ); } BOOL TempUser::SendPacket( BYTE* pMsg, WORD wSize ) { union { MSG_BASE* pBASE; MSG_BASE_INTERNAL* pINTERNAL; BYTE* pBYTE; }; pBASE = PACKET_CONTROL::GetPacketPtr_BASE_A2C(); if( pBYTE != pMsg ) CopyMemory( pBYTE, pMsg, (SIZE_T)wSize ); pBYTE = PACKET_CONTROL::GetPacketPtr_A2C(); wSize = ((WORD)wSize-(WORD)sizeof(DWORD)); ASSERT( wSize && wSize < 16000 ); if( wSize && wSize < 16000 ) { return Send( pBYTE, wSize ); } // --error return FALSE; } VOID TempUser::OnRecv( BYTE *pMsg, WORD wSize ) { union { MSG_BASE* pBASE; MSG_BASE_INTERNAL* pINTERNAL; BYTE* pBYTE; }; pBYTE = PACKET_CONTROL::GetPacketPtr_C2A(); if( pBYTE != pMsg ) CopyMemory( pBYTE, pMsg, (SIZE_T)wSize ); pBASE = PACKET_CONTROL::GetPacketPtr_BASE_C2A(); pMsg = pBYTE; wSize += sizeof(DWORD); if( WorldServerInfoParser::Instance()->IsCryptable() ) { const WORD wConnType = MAKEWORD(CW_CONNECTION, CW_ENTER_SERVER_SYN); const WORD wCryptType = MAKEWORD(CW_CRYPTOGRAPHY, CW_CRYPTOGRAPHY_ACK); MSG_BASE *pBaseMsg = (MSG_BASE*)pMsg; WORD wMsgType = MAKEWORD(pBaseMsg->m_byCategory, pBaseMsg->m_byProtocol); if( wMsgType == wConnType ) { #ifdef _DEBUG assert( m_bFirstTime ); #else if( !m_bFirstTime ) { MessageOut(eCRITICAL_LOG, "First Protocol Error(%d)(%d) - 1", pBaseMsg->m_byCategory, pBaseMsg->m_byProtocol ); Logout();; return; } #endif /* if( pBaseMsg->m_byProtocol != CW_ENTER_SERVER_SYN ) { MessageOut(eCRITICAL_LOG, "ÃÖÃÊ ÇÁ·ÎÅäÄÝ ¿À·ù(%d)(%d)", pBaseMsg->m_byCategory, pBaseMsg->m_byProtocol ); Logout();; return; } */ m_bFirstTime = FALSE; MSG_CW_ENTER_SERVER_SYN *pRecvMsg = (MSG_CW_ENTER_SERVER_SYN*)pMsg; m_dwAuthID = pRecvMsg->dwAuthUserID; // CRYPT_KEY ó¸® User *pActiveUser = WaitingUserList::Instance()->FindUserWithAuthID( pRecvMsg->dwAuthUserID ); // WaitingUserList¿¡ ¾ø´Â °æ¿ì Á¢¼ÓÀ» ²÷°í ¸®ÅÏ if( !pActiveUser ) { MessageOut(eCRITICAL_LOG, "Not in WaitingUserList User Disconnect(AuthID:%u)", pRecvMsg->dwAuthUserID ); Disconnect(); // ÀÌ °æ¿ì¿¡ LogoutÀ» Çϸé À¯Àú Áý°è¿¡ ¹®Á¦°¡ »ý±æ ¼ö ÀÖ´Ù return; } // IP È®ÀÎ ÈÄ Æ²¸®¸é Á¢¼ÓÀ» ²÷°í ¸®ÅÏ if( strncmp( GetIP(), pActiveUser->GetAuthIP(), IP_MAX_LEN ) != 0 ) { MessageOut(eCRITICAL_LOG, "Warning: Connected User's IP is different from IP Recved from AgentServer[Guid:%u][IP:%s][A:%u][AIP:%s]", pActiveUser->GetGUID(), GetIP(), pActiveUser->GetAuthID(), pActiveUser->GetAuthIP()); // // ´ë±â¿­¿¡¼­ »èÁ¦ // WaitingUserList::Instance()->RemoveUser( pActiveUser->GetAuthID() ); // Logout();; // return; } // // À̰÷¿¡ SN¼³Á¤°ú ¾Ïȣȭ ÇÁ·ÎÅäÄÝÀ» °áÁ¤Çϱâ·Î ÇÑ´Ù. if( WorldServerInfoParser::Instance()->IsCryptable() ) { BYTE keySTREAM[280]; MSG_CW_CRYPTOGRAPHY_KEY *pMsgKEY = new (keySTREAM) MSG_CW_CRYPTOGRAPHY_KEY(); MSG_CW_CRYPTOGRAPHY_KEY& cryptMsg = *pMsgKEY; //MSG_CW_CRYPTOGRAPHY_KEY cryptMsg; BYTE key = InitCrypt( C2S_HIGH_VERSION_NO, C2S_MIDDLE_VERSION_NO ); // BYTE key = GetSendSNKey(); cryptMsg.SetSNKey( key ); key = GetCryptAlgorithmInfo( cryptMsg.GetCryptStream() ); cryptMsg.SetCryptInfo( key ); SendPacket( (BYTE*)&cryptMsg, sizeof(keySTREAM) /*sizeof(MSG_CW_CRYPTOGRAPHY_KEY)*/ ); // ŸÀӾƿô üũ - ¾îÂ÷ÇÇ ACK ¿À±â Àü¿¡´Â TempUser»óÅ¿¡¼­ ´õ ÀÌ»ó ÁøÇàÀÌ µÇÁö ¾ÊÀ¸¹Ç·Î ÀÌ Ã¼Å©°¡ ÇÊ¿ä¾ø´Ù // UserManager::Instance()->AddCryptoUser( this ); // pActiveUser->SetCryptography( TRUE ); NextRoundSNKey4Send(); } // } else if( wMsgType == wCryptType ) { // #ifdef _DEBUG // assert( !m_bFirstTime ); // #else // if( m_bFirstTime ) // { // MessageOut(eCRITICAL_LOG, "¾Ïȣȭ ÇÁ·ÎÅäÄÝ ¼ø¼­ ¿À·ù(%d)(%d)", pBaseMsg->m_byCategory, pBaseMsg->m_byProtocol ); // Disconnect(); // return; // } // #endif /* if( pBaseMsg->m_byProtocol != CW_CRYPTOGRAPHY_ACK ) { MessageOut(eCRITICAL_LOG, "ÃÖÃÊ ¾Ïȣȭ ÇÁ·ÎÅäÄÝ ¿À·ù(%d)(%d)", pBaseMsg->m_byCategory, pBaseMsg->m_byProtocol ); Logout();; return; } */ User *pActiveUser = WaitingUserList::Instance()->FindUserWithAuthID( m_dwAuthID ); // WaitingUserList¿¡ ¾ø´Â °æ¿ì Á¢¼ÓÀ» ²÷°í ¸®ÅÏ if( !pActiveUser ) { MessageOut(eCRITICAL_LOG, "Not in WaitingUserList User Disconnect(AuthID:%d)", m_dwAuthID ); Disconnect(); return; } pActiveUser->CopyCrypt( m_sCryptBack ); // ¾×Ƽºê À¯Á®¸¦ WaitingUserList¿¡¼­ Á¦°Å WaitingUserList::Instance()->RemoveUser( m_dwAuthID ); // ¾×Ƽºê À¯Á®·Î ³×Æ®¿÷ ¿ÀºêÁ§Æ® ±³Ã¼ Redirect( pActiveUser ); pActiveUser->OnRedirect(); // TempUser ¹Ýȯ UserFactory::Instance()->Free( this ); eZONETYPE eZoneType = pActiveUser->GetStatus(); DWORD dwZoneKey = 1; // CharSelect Zonekey = 1 if( pActiveUser->GetZoneKey() ) { dwZoneKey = pActiveUser->GetZoneKey(); // À¯Àú Á¢¼Ó º¹±¸ÇÏ´Â °æ¿ì¿¡ ÇÑÇØ º¹±¸¿ë ZoneKey°¡ µé¾î°£´Ù // Ä£±¸ ¸ñ·Ï ¿äû - ij¸¯ÅÍ ¼±ÅÃÀÌ µÈ °ÍÀ» Á¢¼ÓÀ¸·Î º»´Ù pActiveUser->InitFriendListInit(); // ¿äûÇϱâ Àü¿¡ ÃʱâÈ­ÇØ ÁÖ´Â ½ë¾²!! pActiveUser->InitGroupInfo(); ServerSession *pGameDBProxy = ServerSessionManager::Instance()->GetGameDBProxy(); if( !pGameDBProxy ) { MessageOut( eCRITICAL_LOG, "Restore User : Friend_NewList Error - No GameDBProxy"); return; } MSG_DW_FRIEND_GETLIST_SYN sendMsg; sendMsg.m_CharGuid = pActiveUser->GetCharGuid(); pGameDBProxy->Send( (BYTE*)&sendMsg, sendMsg.GetSize() ); // º¹±¸ÀÎ °æ¿ì Chat Block È®ÀÎ ¿äûµµ Àü¼Û MSG_DW_GM_CHATBLOCKTIME_REQ reqMsg; reqMsg.m_dwKey = pActiveUser->GetCharGuid(); pGameDBProxy->Send( (BYTE*)&reqMsg, sizeof(reqMsg) ); MessageOut( eFULL_LOG, "[CharGuid:%u]ChatBlock Time Req", pActiveUser->GetCharGuid() ); MSG_DW_STATUS_INTERCEPTION_REQ msgREQ; msgREQ.m_dwKey = pActiveUser->GetGUID(); msgREQ.m_CharGuid = pActiveUser->GetCharGuid(); pGameDBProxy->Send((BYTE*)&msgREQ, sizeof(msgREQ)); //__KR_001355_20090608_GROUPINGSYSTEM_GW MSG_DW_GROUP_LIST_REQ msgList;//±×·ì ¸É¹ö ¸®½ºÆ® ¿äû ¸Þ¼¼Áö msgList.m_CharGUID = pActiveUser->GetCharGuid(); pGameDBProxy->Send( (BYTE*)&msgList, sizeof(msgList) ); } pActiveUser->SetStatus( eZONETYPE_MAX ); pActiveUser->SetZoneKey( 0 ); // ä³Î¿¡ À¯Á® Ãß°¡ Channel *pChannel = ChannelManager::Instance()->GetChannel( pActiveUser->GetChannelID() ); if( pChannel ) { //pChannel->AddUser( pActiveUser, US_IN_CHARSCENE, 0 ); pChannel->AddUser( pActiveUser, eZoneType, dwZoneKey ); // pChannel->AddUser( pActiveUser, eZONETYPE_CHARSELECT, 0 ); MSG_AW_ITEM_CHANGE_SPECIAL_ITEM_SYN AWItemMsg; AWItemMsg.m_dwKey = pActiveUser->GetGUID(); ServerSession *pAgentServer = ServerSessionManager::Instance()->FindAgentServer(pActiveUser->GetChannelID()); if(pAgentServer) { pAgentServer->Send((BYTE*)&AWItemMsg, sizeof(MSG_AW_ITEM_CHANGE_SPECIAL_ITEM_SYN)); } MessageOut(eFULL_LOG, "Óû§Á¬½Ó³É¹¦! ƵµÀ(%d) Guid(%d) IP(%s) ״̬(%u)", pActiveUser->GetChannelID(), pActiveUser->GetGUID(), pActiveUser->GetAuthIP(), pActiveUser->GetStatus() ); } else { pActiveUser->Disconnect(); MessageOut(eCRITICAL_LOG, "ÖÂÃü´íÎó: Óû§Á¬½ÓƵµÀ(%d) ʧ°Ü!", pActiveUser->GetChannelID() ); return; } if( WorldServerInfoParser::Instance()->IsCryptable() ) { // Ŭ¶óÀ̾ðÆ®ÇÑÅ× ÀÌÁ¦ºÎÅÍ ±× Ű »ç¿ëÇ϶ó°í ¾Ë·ÁÁÖ°í ¼­¹öµµ ¼¼ÆÃÇÑ´Ù. ÀÌ ¼¼ÆÃÀÌ ³¡³­ ´ÙÀ½ º¸³»°í ¹Þ´Â °ÍÀº ¹«Á¶°Ç ¾ÏȣȭµÈ ³»¿ëµéÀÌ´Ù MSG_CW_CRYPTOGRAPHY_CMD sendMsg; SendPacket( (BYTE*)&sendMsg, sizeof(MSG_CW_CRYPTOGRAPHY_CMD) ); pActiveUser->SetCrypt(); // ÀÌÁ¦ºÎÅÍ ¾Ïȣȭ ¾´´Ù! MessageOut( eFULL_LOG, "[GUID:%u] Crypt Set", pActiveUser->GetGUID() ); return; } } else { MessageOut( eMIDDLE_LOG, "First Protocol Error(%d)(%d) - 2", pBaseMsg->m_byCategory, pBaseMsg->m_byProtocol ); // Disconnect(); return; } } else // ¾Ïȣȭ ¼³Á¤ ¾È µÅÀÖÀ¸¸é { #ifdef _DEBUG assert( m_bFirstTime ); #else MSG_BASE *pBaseMsg = (MSG_BASE*)pMsg; if( !m_bFirstTime ) { MessageOut( eCRITICAL_LOG, "Not First Protocol!!(%u)(%u)", pBaseMsg->m_byCategory, pBaseMsg->m_byProtocol ); return; } #endif MSG_CW_ENTER_SERVER_SYN *pRecvMsg = (MSG_CW_ENTER_SERVER_SYN*)pMsg; // ÇÁ·ÎÅäÄÝÀÌ À߸øµÈ °æ¿ì ¸®ÅÏ if( pRecvMsg->m_byCategory != CW_CONNECTION || pRecvMsg->m_byProtocol != CW_ENTER_SERVER_SYN ) { MessageOut(eCRITICAL_LOG, "First Protocol Error(%d)(%d)", pRecvMsg->m_byCategory, pRecvMsg->m_byProtocol ); // Disconnect(); return; } m_bFirstTime = FALSE; User *pActiveUser = WaitingUserList::Instance()->FindUserWithAuthID( pRecvMsg->dwAuthUserID ); // WaitingUserList¿¡ ¾ø´Â °æ¿ì Á¢¼ÓÀ» ²÷°í ¸®ÅÏ if( !pActiveUser ) { MessageOut(eCRITICAL_LOG, "Not in WaitingUserList User Disconnect(AuthID:%d)", pRecvMsg->dwAuthUserID ); Disconnect(); return; } // IP È®ÀÎ ÈÄ Æ²¸®¸é Á¢¼ÓÀ» ²÷°í ¸®ÅÏ if( strncmp( GetIP(), pActiveUser->GetAuthIP(), IP_MAX_LEN ) != 0 ) { MessageOut(eCRITICAL_LOG, "Warning: Connected User's IP is different from IP Recved from AgentServer[Guid:%u][IP:%s][A:%u][AIP:%s]", pActiveUser->GetGUID(), GetIP(), pActiveUser->GetAuthID(), pActiveUser->GetAuthIP()); // Disconnect(); return; } // ¾×Ƽºê À¯Á®¸¦ WaitingUserList¿¡¼­ Á¦°Å WaitingUserList::Instance()->RemoveUser( pRecvMsg->dwAuthUserID ); // ¾×Ƽºê À¯Á®·Î ³×Æ®¿÷ ¿ÀºêÁ§Æ® ±³Ã¼ Redirect( pActiveUser ); pActiveUser->OnRedirect(); // TempUser ¹Ýȯ UserFactory::Instance()->Free( this ); eZONETYPE eZoneType = pActiveUser->GetStatus(); DWORD dwZoneKey = 1; // CharSelect Zonekey = 1 if( pActiveUser->GetZoneKey() ) { dwZoneKey = pActiveUser->GetZoneKey(); // À¯Àú Á¢¼Ó º¹±¸ÇÏ´Â °æ¿ì¿¡ ÇÑÇØ º¹±¸¿ë ZoneKey°¡ µé¾î°£´Ù } pActiveUser->SetStatus( eZONETYPE_MAX ); pActiveUser->SetZoneKey( 0 ); // ä³Î¿¡ À¯Á® Ãß°¡ Channel *pChannel = ChannelManager::Instance()->GetChannel( pActiveUser->GetChannelID() ); if( pChannel ) { //pChannel->AddUser( pActiveUser, US_IN_CHARSCENE, 0 ); pChannel->AddUser( pActiveUser, eZoneType, dwZoneKey ); // pChannel->AddUser( pActiveUser, eZONETYPE_CHARSELECT, 0 ); MessageOut(eFULL_LOG, "User Connect Success! ä³Î(%d) Guid(%d) IP(%s) Status(%u)", pActiveUser->GetChannelID(), pActiveUser->GetGUID(), pActiveUser->GetAuthIP(), pActiveUser->GetStatus() ); } else { pActiveUser->Disconnect(); MessageOut(eCRITICAL_LOG, "Fatal error: User Connect Channel(%d)Failed!", pActiveUser->GetChannelID() ); return; } } }