Code:
/*
* OnCS_LOGIN_REQ
*/
DWORD CTLoginSvrModule::OnCS_LOGIN_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
WORD wVersion;
BYTE bChanneling = 0;
INT64 dlCheck;
INT64 llChecksum_recv;
// Check the Version
packet >> wVersion;
if( wVersion != 605 )
{
pUser->SendCS_LOGIN_ACK(LR_VERSION, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
CString konstisfag;
CString konstisfag2;
CString konstisfag3;
packet >> konstisfag
>> pUser->m_strPasswd
>> konstisfag3
>> konstisfag2
>> pUser->m_strUserID
>> dlCheck
>> llChecksum_recv;
if(m_hExecFile != INVALID_HANDLE_VALUE &&
dlCheck != m_dlCheckFile)
{
LogExecCheck(pUser->m_dwID, 3, pUser->m_strUserID);
return EC_SESSION_INVALIDCHAR;
}
if(m_bNation == NATION_JAPAN)
packet >> bChanneling;
// Check the ID/Password Max Size
if(pUser->m_strUserID.GetLength() > MAX_NAME ||
pUser->m_strPasswd.GetLength() > MAX_NAME)
{
pUser->SendCS_LOGIN_ACK(LR_INTERNAL, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
INT64 llChecksum;
INT64 key = 0x336c3aebf71a8b08;
llChecksum = wVersion * 2 - 500;
INT64 dwIndex = llChecksum % sizeof(INT64);
INT64 dwBody = llChecksum / sizeof(INT64);
for(DWORD i = 0; i < dwIndex; i++)
{
llChecksum ^= dwBody;
llChecksum += key;
}
if(llChecksum != llChecksum_recv)
{
return EC_SESSION_INVALIDCHAR;
}
BYTE bIPCheck = 0;
//
// Check the IP Block
//
// - Work : Parmater LR_IPBLOCK change
//
DEFINE_QUERY( pDB, CSPCheckIP)
lstrcpy( query->m_szIPAddr, inet_ntoa(pUser->m_addr.sin_addr));
if(query->Call())
{
bIPCheck = query->m_nRET;
if(bIPCheck == LR_BLOCK)
{
pUser->SendCS_LOGIN_ACK(bIPCheck, 0, 0, 0, 0, 0, 0, 0, 0, 0);
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, LR_IPBLOCK);
#endif
return EC_SESSION_INVALIDCHAR;
}
}
UNDEFINE_QUERY()
pUser->m_dlCheckKey = TRand(0xFFFFFFFF) | (INT64(TRand(0xFFFFFFFF)) << 32);
// Check the ID/Password
if(m_bNation == NATION_JAPAN)
{
DEFINE_QUERY( pDB, CSPLoginJP)
lstrcpy( query->m_szUserID, LPCSTR(pUser->m_strUserID));
lstrcpy( query->m_szPasswd, LPCSTR(pUser->m_strPasswd));
lstrcpy( query->m_szLoginIP, inet_ntoa(pUser->m_addr.sin_addr));
query->m_bChanneling = bChanneling;
query->m_bIPCheck = bIPCheck;
if(!query->Call())
query->m_nRET = LR_INTERNAL;
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, query->m_nRET);
#endif
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
query->m_bCreateCnt,
query->m_bInPcBang,
query->m_dwPremium,
CTime::GetCurrentTime().GetTime());
switch(query->m_nRET)
{
case LR_DUPLICATE :
{
SMART_LOCKCS(&m_csLI)
MAPTUSER::iterator finder = m_mapTUSER.find(query->m_dwID);
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
if( finder != m_mapTUSER.end() )
{
(*finder).second->m_bLogout = FALSE;
CloseSession((*finder).second);
}
else if(query->m_dwCharID)
{
pUser->m_bLogout = FALSE;
}
}
return EC_SESSION_INVALIDCHAR;
case LR_NEEDAGREEMENT:
pUser->m_bAgreement = FALSE;
case LR_SUCCESS :
{
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
pUser->m_bCreateCnt = query->m_bCreateCnt;
pUser->m_dwAcceptTick = 0;
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
}
else
{
DEFINE_QUERY( pDB, CSPLogin)
lstrcpy( query->m_szUserID, LPCSTR(pUser->m_strUserID));
lstrcpy( query->m_szPasswd, LPCSTR(pUser->m_strPasswd));
lstrcpy( query->m_szLoginIP, inet_ntoa(pUser->m_addr.sin_addr));
query->m_bIPCheck = bIPCheck;
if(!query->Call())
query->m_nRET = LR_INTERNAL;
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, query->m_nRET);
#endif
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
query->m_bCreateCnt,
query->m_bInPcBang,
query->m_dwPremium,
CTime::GetCurrentTime().GetTime());
switch(query->m_nRET)
{
case LR_DUPLICATE :
{
SMART_LOCKCS(&m_csLI)
MAPTUSER::iterator finder = m_mapTUSER.find(query->m_dwID);
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
if( finder != m_mapTUSER.end() )
{
(*finder).second->m_bLogout = FALSE;
CloseSession((*finder).second);
}
else if(query->m_dwCharID)
{
pUser->m_bLogout = FALSE;
}
}
return EC_SESSION_INVALIDCHAR;
case LR_NEEDAGREEMENT:
pUser->m_bAgreement = FALSE;
case LR_SUCCESS :
{
//m_pDebugSocket->LogLogin(pUser, query->m_dwID);
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
pUser->m_bCreateCnt = query->m_bCreateCnt;
pUser->m_dwAcceptTick = 0;
//pUser->m_bLock = FALSE;
if(m_hExecFile != INVALID_HANDLE_VALUE)
pUser->m_qCheckPoint.push(0);
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
}
return EC_NOERROR;
}
// 현승룡 CS_TESTLOGIN_REQ
DWORD CTLoginSvrModule::OnCS_TESTLOGIN_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
DEFINE_QUERY( pDB, CSPTestLogin)
EnterCriticalSection(&m_csLI);
if(!query->Call())
query->m_nRET = LR_INTERNAL;
LeaveCriticalSection(&m_csLI);
pUser->m_strUserID = query->m_szUserID;
pUser->m_strPasswd = query->m_szPasswd;
ATLTRACE(_T("nRet:%d dwUserID:%d, UserID:%s, Passwd=%s\n"), query->m_nRET, query->m_dwID, pUser->m_strUserID, pUser->m_strPasswd);
// Login 할 수 있는 ID가 없을 경우
if( query->m_nRET == 1 )
{
pUser->SendCS_LOGIN_ACK(10, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
0, 0, 0, 0);
switch(query->m_nRET)
{
case LR_SUCCESS :
{
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
return EC_NOERROR;
}