#include "stdafx.h" #include "GameServerEx.h" #include #include "Player.h" #include "WareInvenProtector.h" #include #include "WarehouseSlotContainer.h" #ifdef _KR_0_20120207_CRYPT_SHA256 #include "../ProgramCommon/SHA256.h" #endif ////////////////////////////////////////////////////////////////////////// // #ifdef __CN_000005_20090522_WAREHOUSE_ISACCEPTABLE_X #define ISALPHA_X(c) ( ((c) == 'x') || ((c) == 'X') ) #define ISDIGIT(c) ( ((c) >= '0') && ((c) <= '9') ) #endif BOOL sPASSWORD_BLOCK::IsAcceptableFormat( CHAR* pwd ) { if( !pwd ) return FALSE; BOOL bAccept = FALSE; CHAR* pOffset = pwd; INT iStrLen = 0; CHAR chr; while( (chr = *pOffset) && ( ++iStrLen < (8+1) ) ) { #ifdef __CN_000005_20090522_WAREHOUSE_ISACCEPTABLE_X if( ISDIGIT(chr) || ISALPHA_X(chr) ) #else if( ! ((chr<'0') || (chr>'9')) ) #endif { bAccept = TRUE; ++pOffset; continue; } bAccept = FALSE; break; } if( bAccept ) { if( (iStrLen < 4) || (iStrLen > 8) ) return FALSE; } return bAccept; } // // BOOL ProtectorWarehouse::TEST_Transaction_PWD_CONFIG( BOOL bIsChangeEnable ) { BOOL bRet = CONTROL_FIELD()[eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_PWD_TRANSACTION]; bRet = bIsChangeEnable ? !bRet : bRet; //( !CONTROL_FIELD().IsSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_PWD_TRANSACTION ) ? TRUE : FALSE ) //: ( CONTROL_FIELD().IsSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_PWD_TRANSACTION ) ? TRUE : FALSE ); return bRet; } // ºñ¹ø È®ÀÎÁßÀÏ °æ¿ì, ºñ¹ø ¼³Á¤ÁßÀÏ °æ¿ì BOOL ProtectorWarehouse::TESTnSET_Transaction_PWD_CONFIG( BOOL bIsEnable ) { BOOL bRet = TEST_Transaction_PWD_CONFIG( bIsEnable ); if( bRet ) { if( bIsEnable ) CONTROL_FIELD().Set( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_PWD_TRANSACTION ); else CONTROL_FIELD().UnSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_PWD_TRANSACTION ); return TRUE; } return FALSE; } VOID ProtectorWarehouse::Block( BOOL bIsBlock, BOOL bDBUpdate ) { if( bIsBlock ) CONTROL_FIELD().UnSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_USABLE ); else CONTROL_FIELD().Set( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_USABLE ); if( bDBUpdate ) { MSG_DG_WAREHOUSE_FLAG_STREAM_NTF msgNTF; msgNTF.m_dwKey = PLAYER().GetUserGuid(); //printf( "DEBUG - CURR WARE %u %08X\n", bIsBlock, GetControlFieldStream() ); msgNTF.m_dwFlagStream = GetControlFieldStream(); g_pGameServer->SendToServer( GAME_DBPROXY, &msgNTF, sizeof(msgNTF) ); } } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // // BOOL ProtectorInventory::TEST_Transaction_PWD_CONFIG( BOOL bIsChangeEnable ) { BOOL bRet = CONTROL_FIELD()[eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_PWD_TRANSACTION]; bRet = bIsChangeEnable ? !bRet : bRet; //BOOL bRet = bIsEnable ? // ( !CONTROL_FIELD().IsSet( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_PWD_TRANSACTION ) ? TRUE : FALSE ) // : ( CONTROL_FIELD().IsSet( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_PWD_TRANSACTION ) ? TRUE : FALSE ); return bRet; } // ºñ¹ø È®ÀÎÁßÀÏ °æ¿ì, ºñ¹ø ¼³Á¤ ÁßÀÏ °æ¿ì BOOL ProtectorInventory::TESTnSET_Transaction_PWD_CONFIG( BOOL bIsEnable ) { BOOL bRet = TEST_Transaction_PWD_CONFIG( bIsEnable ); if( bRet ) { if( bIsEnable ) CONTROL_FIELD().Set( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_PWD_TRANSACTION ); else CONTROL_FIELD().UnSet( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_PWD_TRANSACTION ); return TRUE; } return FALSE; } // À¯Àú Á¤º¸¸¦ °¡Á®¿À´Â ½ÃÁ¡¿¡ ºñ¹ø À¯¹« È®ÀÎ ÈÄ ÀÌ ·çƾÀ» ¼öÇàÇÑ´Ù. VOID ProtectorInventory::Block( BOOL bIsBlock, BOOL bDBUpdate ) { if( bIsBlock ) CONTROL_FIELD().UnSet( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_USABLE ); else CONTROL_FIELD().Set( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_USABLE ); if( bDBUpdate ) { MSG_DG_ITEM_INVENTORY_FLAG_STREAM_NTF msgNTF; msgNTF.m_dwKey = PLAYER().GetUserGuid(); //printf( "DEBUG - CURR INVEN %u %08X\n", bIsBlock, GetControlFieldStream() ); msgNTF.m_dwFlagStream = GetControlFieldStream(); g_pGameServer->SendToServer( GAME_DBPROXY, &msgNTF, sizeof(msgNTF) ); } } BOOL WarehouseInventoryProtector::IsEqualSSN( BYTE psSSN[MAX_SSN_STREAM_LENGTH] ) { #ifdef _KR_0_20120207_CRYPT_SHA256 int mode = g_pGameServer->GetMode(); switch (mode) { case eSERVER_DEV: { BYTE digest[MAX_SSN_ENCODED_STREAM_LENGTH+1] = { 0, }; wchar_t wszUserLastSSN[MAX_SSN_STREAM_LENGTH+1]; wchar_t wszUserGUID[64]; ZeroMemory( wszUserLastSSN, sizeof(wszUserLastSSN) ); ZeroMemory( wszUserGUID, sizeof(wszUserGUID) ); //Áֹεî·Ï ¹øÈ£ µÞÀÚ¸®´Â ÃÖ´ë 14ÀÚ¸®·Î ÇÑ´Ù. for( INT i=0 ; iReturnCode(); BOOL bProcessed = FALSE; ProtectorWarehouse& rWAREHOUSE = WAREHOUSE(); ProtectorInventory& rINVENTORY = INVENTORY(); if( MSG_DG_WAREHOUSE_PWD_SETTING_ACK::RET_START_FAIL == eRET ) { MSG_CG_WAREHOUSE_PWD_SETTING_NAK msgNAK; rWAREHOUSE.Block( TRUE ); // ÀÏ´ÜÀº ¹®Á¦Á¡ÀÌ ÀÖ´Â »óȲÀ̹ǷΠÀá±Å¹ö¸®ÀÚ. USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } // ÇöÀç â°í ºñ¹ø ¼³Á¤°ü·Ã Æ®·£Á§¼Ç ÁßÀ̸é... if( MSG_DG_WAREHOUSE_PWD_SETTING_ACK::PWD_WAREHOUSE == pMsg->TypeCode() && rWAREHOUSE.TEST_Transaction_PWD_CONFIG( FALSE ) ) { if( rWAREHOUSE.PasswordTransactionMode() == sPACKET_PROTECT_BASE_INFO::APPLY_TRANSACTION ) { if( MSG_DG_WAREHOUSE_PWD_SETTING_ACK::RET_SUCCESS == eRET ) { MSG_CG_WAREHOUSE_PWD_SETTING_ACK msgACK; msgACK.ReturnCode() = ('\0' == pMsg->m_Password[0]) ? MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_SUCCESS_CLEAR : MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_SUCCESS; rWAREHOUSE.SetPasswordFromDB( pMsg->m_Password ); rWAREHOUSE.Block( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); } else //if( MSG_DG_WAREHOUSE_PWD_SETTING_ACK::RET_FAIL == bSuccess ) { MSG_CG_WAREHOUSE_PWD_SETTING_NAK msgNAK; //msgNAK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_FAIL; rWAREHOUSE.Block( TRUE ); USER().SendPacket( &msgNAK, sizeof(msgNAK) ); } bProcessed = TRUE; rWAREHOUSE.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rWAREHOUSE.TESTnSET_Transaction_PWD_CONFIG( FALSE ); } } // ÇöÀç Àκ¥Å丮 ºñ¹ø ¼³Á¤°ü·Ã Æ®·£Á§¼Ç ÁßÀ̸é... if( MSG_DG_WAREHOUSE_PWD_SETTING_ACK::PWD_INVENTORY == pMsg->TypeCode() && rINVENTORY.TEST_Transaction_PWD_CONFIG( FALSE ) ) { if( rINVENTORY.PasswordTransactionMode() == sPACKET_PROTECT_BASE_INFO::APPLY_TRANSACTION ) { if( MSG_DG_WAREHOUSE_PWD_SETTING_ACK::RET_SUCCESS == eRET ) { MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK msgACK; msgACK.ReturnCode() = ('\0' == pMsg->m_Password[0]) ? MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK::RET_SUCCESS_CLEAR : MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK::RET_SUCCESS; rINVENTORY.SetPasswordFromDB( pMsg->m_Password ); BASE_PLAYERINFO* pINFO = USER().GetCharInfo(); strncpy( pINFO->m_InventoryPwd, rINVENTORY.GetPassword(), MAX_WAREHOUSE_INVENTORY_PWD_LENGTH ); rINVENTORY.Block( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); } else //if( MSG_DG_WAREHOUSE_PWD_SETTING_ACK::RET_FAIL == bSuccess ) { MSG_CG_ITEM_INVENTORY_PWD_SETTING_NAK msgNAK; //msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_FAIL; rINVENTORY.SetPasswordFromDB( pMsg->m_Password ); BASE_PLAYERINFO* pINFO = USER().GetCharInfo(); strncpy( pINFO->m_InventoryPwd, rINVENTORY.GetPassword(), MAX_WAREHOUSE_INVENTORY_PWD_LENGTH ); rINVENTORY.Block( TRUE ); USER().SendPacket( &msgNAK, sizeof(msgNAK) ); } bProcessed = TRUE; rINVENTORY.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rINVENTORY.TESTnSET_Transaction_PWD_CONFIG( FALSE ); } } if( !bProcessed ) // ¾çÂÊ ¾îµðµµ ¾Æ´Ï´Ù... °¡´É¼º ¿©ºÎ ŸÀü { SUNLOG( eCRITICAL_LOG, _T("¾ÏÈ£ ¼³Á¤ DB ÁúÀÇ ¹× ÀÀ´ä ¹ÞÀº »óÅÂÁö¸¸, Ŭ¶óÀ̾ðÆ®ÀÇ ¾ÏÈ£ ¼³Á¤ Æ®·£Àè¼Ç »óŰ¡ ÀÌ»óÇÏ´Ù. ·ÎÁ÷ ¹ö±× ãÀ» °Í! (¼º°ø¿©ºÎ: %d)" ), bProcessed ); return FALSE; } return TRUE; } BOOL WarehouseInventoryProtector::OnRecvCG_WAREHOUSE_PWD_LOCKING_SYN( MSG_CG_WAREHOUSE_PWD_LOCKING_SYN* pMsg, WORD wSize ) { // »çÀÌÁî °Ë»ç ÇÊ¿äÇÏ´Ù. ProtectorWarehouse& rPROTECT = WAREHOUSE(); // â°í ½ÃÀÛµµ ¾ÈÇߴµ¥, ÆÐŶÀ» º¸³»´Â °æ¿ì ¹æÁö ¸ñÀû CWarehouseSlotContainer* pContainer = USER().GetWarehouseContainer(); BOOL bValidStatus = ( pContainer->IsStarted() ); if( !bValidStatus ) { MSG_CG_WAREHOUSE_PWD_LOCKING_NAK msgNAK; msgNAK.ErrorCode() = MSG_CG_WAREHOUSE_PWD_LOCKING_NAK::IRREGULAR_LOCKING_POLICYMENT; //¼öÁ¤ÇÒ °Í USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return TRUE; } BOOL bExistPwd = (BOOL) !rPROTECT.IsEmptyPassword(); BOOL bUsable = rPROTECT.IsUsable(); MSG_CG_WAREHOUSE_PWD_LOCKING_ACK msgACK; if( bUsable ) { if( bExistPwd ) { msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_LOCKING_ACK::RET_SUCCESS_LOCKED; rPROTECT.Block(TRUE); } else { // (WAVERIX) WAREINVEN - CHANGE LOGIC // RETCODE: NEED_PWD_FOR_LOCKING msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_LOCKING_ACK::RET_NEED_PWD_FOR_LOCKING; } } else { if( bExistPwd ) { // (WAVERIX) WAREINVEN - CHANGE LOGIC // Un-Locking Process // RETCODE : NEED_PWD_CHANGE_LOCK_TO_UNLOCK msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_LOCKING_ACK::RET_NEED_PWD_FOR_UNLOCKING; } else { MSG_CG_WAREHOUSE_PWD_LOCKING_NAK msgNAK; msgNAK.ErrorCode() = MSG_CG_WAREHOUSE_PWD_LOCKING_NAK::IRREGULAR_LOCKING_POLICYMENT; USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return TRUE; } } rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rPROTECT.TESTnSET_Transaction_PWD_CONFIG( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } BOOL WarehouseInventoryProtector::OnRecvCG_WAREHOUSE_PWD_SETTING_SYN( MSG_CG_WAREHOUSE_PWD_SETTING_SYN* pMsg, WORD wSize ) { // [ÀüÁ¦] ~PWD_SETTING_SYN ÆÐŶÀº // ¿­¸²»óÅ¿¡¼­ óÀ½Àá±è »óÅ ¿äû½Ã¸¸ ÇØ´ç»çÇ×À¸·Î Ãë±ÞÇÑ´Ù. // (Ãʱ⠻óÅÂ) ¿­¸²»óÅÂ, ºñ¹ø¾øÀ½ // Å©±â °Ë»ç BOOL bSizeMIN = (BOOL)(MSG_CG_WAREHOUSE_PWD_SETTING_SYN::MINSIZE() == wSize); BOOL bSizeMAX = (BOOL)((WORD)sizeof(MSG_CG_WAREHOUSE_PWD_SETTING_SYN) == wSize); if( !(bSizeMAX || bSizeMIN) ) return FALSE; ProtectorWarehouse& rPROTECT = WAREHOUSE(); MSG_CG_WAREHOUSE_PWD_SETTING_SYN::eREQ_CODE eREQ = (MSG_CG_WAREHOUSE_PWD_SETTING_SYN::eREQ_CODE)pMsg->ReqCode(); MSG_CG_WAREHOUSE_PWD_SETTING_NAK msgNAK; // [ÀüÁ¦] ¾Õ¿¡¼­ ¾ð±ÞÇßÀ½, ¿­¸²»óÅ¿©¾ß ÇÑ´Ù. // [ÀüÁ¦] ¿©±â·Î µé¾î¿Â´Ù´Â °ÍÀº ºñ¹øÀÌ ¾ø¾î¾ß ÇÑ´Ù. // â°í ½ÃÀÛµµ ¾ÈÇߴµ¥, ÆÐŶÀ» º¸³»´Â °æ¿ì ¹æÁö ¸ñÀû BOOL bUsable = rPROTECT.IsUsable(); CWarehouseSlotContainer* pContainer = USER().GetWarehouseContainer(); BOOL bValidStatus = ( bUsable && pContainer->IsStarted() ); if( bValidStatus ) { switch( eREQ ) { case MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_CANCEL: case MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_WITH_SSN: break; default: bValidStatus = rPROTECT.IsEmptyPassword(); break; } } if( !bValidStatus ) { //msgNAK.ErrorCode() = MSG_CG_WAREHOUSE_PWD_SETTING_NAK; USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } if( MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_FIRST != eREQ ) { // óÀ½ ÆÐŶÀÌ ¾Æ´Ñ ÀÌ»ó ¸ðµÎ Æ®·£Á§¼ÇÀÌ °É·ÁÀÖ¾î¾ß ÇÑ´Ù. if( rPROTECT.TEST_Transaction_PWD_CONFIG( TRUE ) ) { USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } } MSG_CG_WAREHOUSE_PWD_SETTING_ACK msgACK; util::cSTRING_REF strRD( pMsg->m_PWDnSSN.GetBUFFER(), pMsg->m_PWDnSSN.GetBUFFER_LENGTH() ); util::cSTRING_REF_RW_WITH_BUFFER tmpBuffer; switch( eREQ ) { case MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_FIRST: { if( !bSizeMIN ) return FALSE; // ´ÙÀ½ Á¶°ÇÀ» ¸¸Á·ÇÑ´Ù´Â °ÍÀº ÀÌ¹Ì ºñ¹ø °ü·Ã Æ®·£Á§¼ÇÀÌ ÁøÇàÁßÀÎ »óÅ´Ù. if( !rPROTECT.TESTnSET_Transaction_PWD_CONFIG( TRUE ) ) { msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_FAIL; goto PROCESS_CHECK_END; } msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_NEED_PWD; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } break; case MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_CLEAR: // ¿©±â¼­´Â Ȱ¼ºÈ­ µÇÁö ¾Ê´Â ±â´ÉÀ» ¿äûÇß´Ù. USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; case MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_CANCEL: { if( !bSizeMIN ) return FALSE; // CHECK_CMP_SSN trans»óÅ¿¡¼­ Ãë¼Ò°¡ ¿À´Â °æ¿ì, ºñ¹øÀº ºñ¾îÀÖ´Â »óÅ¿¡¼­ Àӽà ·ÎÄ÷ΠÀúÀåµÈ »óÅÂÀ̸ç, // µû¶ó¼­ ·ÎÄà ºñ¹øÀ» ÃʱâÈ­ Çϸé ÀÌÀü »óÅ·Πº¹±¸µÉ °ÍÀÌ´Ù. if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN == rPROTECT.PasswordTransactionMode() ) { CHAR emptyChar[1] = { 0 }; rPROTECT.SetPasswordFromDB( emptyChar ); } msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_CANCELED; goto PROCESS_CHECK_END; } break; case MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_WITH_PWD: { if( !bSizeMAX ) return FALSE; // ºñ¹ø¾øÀ½ »óÅ¿¡¼­ ¼³Á¤ÇÒ ºñ¹øÀÌ ÀÔ·ÂµÈ »óȲ if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD != rPROTECT.PasswordTransactionMode() ) { msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_FAIL; goto PROCESS_CHECK_END; } tmpBuffer.CopyFrom( strRD ); tmpBuffer.MakeSafeString(); if( !sPASSWORD_BLOCK::IsAcceptableFormat( tmpBuffer.GetBUFFER() ) ) { msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_INVALID_PWD; goto PROCESS_CHECK_END; } // ·ÎÄÃÀº °»½ÅÇØ µÐ´Ù. rPROTECT.SetPasswordFromDB( tmpBuffer.GetBUFFER() ); // ÇöÀç ÀÎÁ¤µÈ ºñ¹ø¿¡ ´ëÇÑ Àû¿ëÀ» À§ÇÑ SSN È®ÀÎ ¿äû msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_NEED_SSN; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } break; case MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_WITH_SSN: { if( !bSizeMAX ) return FALSE; // Àá±è»óÅÂ->Àá±èÇØÁ¦ (ºñ¹ø ÃʱâÈ­) ÀüȯÀ» À§ÇÑ °ÍÀÓ if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN != rPROTECT.PasswordTransactionMode() ) { msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_SETTING_ACK::RET_FAIL; goto PROCESS_CHECK_END; } tmpBuffer.CopyFrom( strRD ); tmpBuffer.MakeSafeString(); if( IsEqualSSN( (BYTE*)tmpBuffer.GetBUFFER() ) ) { rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::APPLY_TRANSACTION; // DB¿¡ ºñ¹ø Àû¿ë½ÃŲ´Ù. MSG_DG_WAREHOUSE_PWD_SETTING_SYN msgSYN; msgSYN.m_dwKey = pMsg->m_dwKey; msgSYN.GetTypeCode() = MSG_DG_WAREHOUSE_PWD_SETTING_SYN::PWD_WAREHOUSE; msgSYN.Set( rPROTECT.GetPassword() ); g_pGameServer->SendToServer( GAME_DBPROXY, &msgSYN, sizeof(msgSYN) ); return TRUE; // ¼º°ø½Ã ´ÙÀ½°ú °°Àº Äڵ带 Àû¿ëÇØ¾ß ÇÑ´Ù. //msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_SUCCESS; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; //USER().SendPacket( &msgACK, sizeof(msgACK) ); //return TRUE; } else { // SSN Ʋ·ÈÀ» °æ¿ì ÀçÂ÷ ¿äûÇÑ´Ù msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_INVALID_SSN; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } } break; } PROCESS_CHECK_END: { rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rPROTECT.TESTnSET_Transaction_PWD_CONFIG( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); } return TRUE; } BOOL WarehouseInventoryProtector::OnRecvCG_WAREHOUSE_PWD_CHECK_SYN( MSG_CG_WAREHOUSE_PWD_CHECK_SYN* pMsg, WORD wSize ) { // [ÀüÁ¦] ~PWD_CHECK_SYN ÆÐŶÀº // Àá±è»óÅÂ(ºñ¹øÁ¸Àç, ÀÓ½ÃÀá±è)¿¡¼­ Àá±èÇØÁ¦ ¿äû½Ã¸¸ ÇØ´ç»çÇ×À¸·Î Ãë±ÞÇÑ´Ù. // Å©±â °Ë»ç BOOL bSizeMIN = (BOOL)(MSG_CG_WAREHOUSE_PWD_CHECK_SYN::MINSIZE() == wSize); BOOL bSizeMAX = (BOOL)((WORD)sizeof(MSG_CG_WAREHOUSE_PWD_CHECK_SYN) == wSize); if( !(bSizeMAX || bSizeMIN) ) return FALSE; ProtectorWarehouse& rPROTECT = WAREHOUSE(); MSG_CG_WAREHOUSE_PWD_CHECK_SYN::eREQ_CODE eREQ = (MSG_CG_WAREHOUSE_PWD_CHECK_SYN::eREQ_CODE)pMsg->ReqCode(); MSG_CG_WAREHOUSE_PWD_CHECK_NAK msgNAK; // [ÀüÁ¦] ¾Õ¿¡¼­ ¾ð±ÞÇßÀ½, Àá±è»óÅ¿©¾ß ÇÑ´Ù. // [ÀüÁ¦] ¿©±â·Î µé¾î¿Â´Ù´Â °ÍÀº ºñ¹øÀÌ ¾ø´Â »óŰ¡ µÇ¾î¼­´Â ¾ÈµÈ´Ù. // â°í ½ÃÀÛµµ ¾ÈÇߴµ¥, ÆÐŶÀ» º¸³»´Â °æ¿ì ¹æÁö ¸ñÀû BOOL bUsable = rPROTECT.IsUsable(); CWarehouseSlotContainer* pContainer = USER().GetWarehouseContainer(); BOOL bValidStatus = ( !bUsable && pContainer->IsStarted() && !rPROTECT.IsEmptyPassword() ); if( !bValidStatus ) { //msgNAK.ErrorCode() = MSG_CG_WAREHOUSE_PWD_CHECK_NAK; USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } if( MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_FIRST != eREQ ) { // óÀ½ ÆÐŶÀÌ ¾Æ´Ñ ÀÌ»ó ¸ðµÎ Æ®·£Á§¼ÇÀÌ °É·ÁÀÖ¾î¾ß ÇÑ´Ù. // ¾Æ·¡ÀÇ ÁúÀÇ´Â ´ÙÀ½°ú °°´Ù. TransactionÀ» °É¼ö Àִ°¡? TRUE¶ó¸é, °É ¼ö ÀÖ´Ù´Â ÀǹÌÀ̸ç, // µû¶ó¼­ ÇöÀç TransactionÀÌ °É·ÁÀÖÁö ¾Ê´Â »óȲÀÌ µÈ´Ù. if( rPROTECT.TEST_Transaction_PWD_CONFIG( TRUE ) ) { USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } } MSG_CG_WAREHOUSE_PWD_CHECK_ACK msgACK; util::cSTRING_REF strRD( pMsg->m_PWDnSSN.GetBUFFER(), pMsg->m_PWDnSSN.GetBUFFER_LENGTH() ); util::cSTRING_REF_RW_WITH_BUFFER tmpBuffer; switch( eREQ ) { case MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_FIRST: { if( !bSizeMIN ) return FALSE; // ´ÙÀ½ Á¶°ÇÀ» ¸¸Á·ÇÑ´Ù´Â °ÍÀº ÀÌ¹Ì ºñ¹ø °ü·Ã Æ®·£Á§¼ÇÀÌ ÁøÇàÁßÀÎ »óÅ´Ù. if( !rPROTECT.TESTnSET_Transaction_PWD_CONFIG( TRUE ) ) { msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_FAIL; goto PROCESS_CHECK_END; } msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_NEED_PWD; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } break; case MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_CLEAR: { if( !bSizeMIN ) return FALSE; // ºñ¹ø °ü·Ã Æ®·£Á§¼Ç ÁßÀ̾î¾ß ÇÑ´Ù. //if( !rPROTECT.TEST_Transaction_PWD_CONFIG( TRUE ) ) //{ // msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_FAIL; // goto PROCESS_CHECK_END; //} // ºñ¹ø ÃʱâÈ­ °ü·ÃÇÑ Ã³¸®¸¦ ¼öÇàÇØ¾ß ÇÑ´Ù. msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_NEED_SSN; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } break; case MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_CANCEL: { if( !bSizeMIN ) return FALSE; msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_CANCELED; goto PROCESS_CHECK_END; } break; case MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_WITH_PWD: { if( !bSizeMAX ) return FALSE; // Àá±è»óÅÂ->¿­¸²»óÅ ÀüȯÀ» À§ÇÑ °ÍÀÓ if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD != rPROTECT.PasswordTransactionMode() ) { msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_FAIL; goto PROCESS_CHECK_END; } tmpBuffer.CopyFrom( strRD ); tmpBuffer.MakeSafeString(); if( rPROTECT.IsEqualPassword( tmpBuffer.GetBUFFER() ) ) { // ¿­¸²»óÅ·ΠÀüȯ msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_SUCCESS; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rPROTECT.Block( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } else { // ºñ¹ø Ʋ·ÈÀ» °æ¿ì ÀçÂ÷ ¿äûÇÑ´Ù msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_INVALID_PWD; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } } break; case MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_WITH_SSN: { if( !bSizeMAX ) return FALSE; // Àá±è»óÅÂ->Àá±èÇØÁ¦ (ºñ¹ø ÃʱâÈ­) ÀüȯÀ» À§ÇÑ °ÍÀÓ if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN != rPROTECT.PasswordTransactionMode() ) { msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_FAIL; goto PROCESS_CHECK_END; } tmpBuffer.CopyFrom( strRD ); tmpBuffer.MakeSafeString(); if( IsEqualSSN( (BYTE*)tmpBuffer.GetBUFFER() ) ) { // ¿­¸²»óÅ·ΠÀüȯ rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::APPLY_TRANSACTION; // DB·Î »óÅ Àüȯ½Ã۰í, ºñ¹ø ÃʱâÈ­ ½ÃÄÑ¾ß ÇÑ´Ù.DB&LOCAL MSG_DG_WAREHOUSE_PWD_SETTING_SYN msgSYN; msgSYN.m_dwKey = pMsg->m_dwKey; msgSYN.GetTypeCode() = MSG_DG_WAREHOUSE_PWD_SETTING_SYN::PWD_WAREHOUSE; CHAR emptyChar[1] = { 0 }; msgSYN.Set( emptyChar ); g_pGameServer->SendToServer( GAME_DBPROXY, &msgSYN, sizeof(msgSYN) ); return TRUE; // ¼º°ø½Ã ´ÙÀ½°ú °°Àº ÆÐŶÀ» Àü¼ÛÇØ¾ß ÇÑ´Ù. //msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_SUCCESS; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; //USER().SendPacket( &msgACK, sizeof(msgACK) ); //return TRUE; } else { // SSN Ʋ·ÈÀ» °æ¿ì ÀçÂ÷ ¿äûÇÑ´Ù msgACK.ReturnCode() = MSG_CG_WAREHOUSE_PWD_CHECK_ACK::RET_INVALID_SSN; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } } break; } PROCESS_CHECK_END: { rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rPROTECT.TESTnSET_Transaction_PWD_CONFIG( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); } return TRUE; } BOOL WarehouseInventoryProtector::OnRecvCG_ITEM_INVENTORY_PWD_LOCKING_SYN( MSG_CG_ITEM_INVENTORY_PWD_LOCKING_SYN* pMsg, WORD wSize ) { // »çÀÌÁî °Ë»ç ÇÊ¿äÇÏ´Ù. ProtectorInventory& rPROTECT = INVENTORY(); BOOL bExistPwd = (BOOL) !rPROTECT.IsEmptyPassword(); BOOL bUsable = rPROTECT.IsUsable(); MSG_CG_ITEM_INVENTORY_PWD_LOCKING_ACK msgACK; if( bUsable ) { if( bExistPwd ) { msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_LOCKING_ACK::RET_SUCCESS_LOCKED; rPROTECT.Block(TRUE); } else { // (WAVERIX) WAREINVEN - CHANGE LOGIC // RETCODE: NEED_PWD_FOR_LOCKING msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_LOCKING_ACK::RET_NEED_PWD_FOR_LOCKING; } } else { if( bExistPwd ) { // (WAVERIX) WAREINVEN - CHANGE LOGIC // Un-Locking Process // RETCODE : NEED_PWD_CHANGE_LOCK_TO_UNLOCK msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_LOCKING_ACK::RET_NEED_PWD_FOR_UNLOCKING; } else { MSG_CG_ITEM_INVENTORY_PWD_LOCKING_NAK msgNAK; msgNAK.ErrorCode() = MSG_CG_ITEM_INVENTORY_PWD_LOCKING_NAK::IRREGULAR_LOCKING_POLICYMENT; USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return TRUE; } } rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rPROTECT.TESTnSET_Transaction_PWD_CONFIG( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } BOOL WarehouseInventoryProtector::OnRecvCG_ITEM_INVENTORY_PWD_SETTING_SYN( MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN* pMsg, WORD wSize ) { // [ÀüÁ¦] ~PWD_SETTING_SYN ÆÐŶÀº // ¿­¸²»óÅ¿¡¼­ óÀ½Àá±è »óÅ ¿äû½Ã¸¸ ÇØ´ç»çÇ×À¸·Î Ãë±ÞÇÑ´Ù. // (Ãʱ⠻óÅÂ) ¿­¸²»óÅÂ, ºñ¹ø¾øÀ½ // Å©±â °Ë»ç BOOL bSizeMIN = (BOOL)(MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::MINSIZE() == wSize); BOOL bSizeMAX = (BOOL)((WORD)sizeof(MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN) == wSize); if( !(bSizeMAX || bSizeMIN) ) return FALSE; ProtectorInventory& rPROTECT = INVENTORY(); MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::eREQ_CODE eREQ = (MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::eREQ_CODE)pMsg->ReqCode(); MSG_CG_ITEM_INVENTORY_PWD_SETTING_NAK msgNAK; // [ÀüÁ¦] ¾Õ¿¡¼­ ¾ð±ÞÇßÀ½, ¿­¸²»óÅ¿©¾ß ÇÑ´Ù. // [ÀüÁ¦] ¿©±â·Î µé¾î¿Â´Ù´Â °ÍÀº ºñ¹øÀÌ ¾ø¾î¾ß ÇÑ´Ù. BOOL bValidStatus = rPROTECT.IsUsable(); if( bValidStatus ) { switch( eREQ ) { case MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_CANCEL: case MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_WITH_SSN: break; default: bValidStatus = rPROTECT.IsEmptyPassword(); break; } } if( !bValidStatus ) { USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } if( MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_FIRST != eREQ ) { // óÀ½ ÆÐŶÀÌ ¾Æ´Ñ ÀÌ»ó ¸ðµÎ Æ®·£Á§¼ÇÀÌ °É·ÁÀÖ¾î¾ß ÇÑ´Ù. if( rPROTECT.TEST_Transaction_PWD_CONFIG( TRUE ) ) { USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } } MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK msgACK; util::cSTRING_REF strRD( pMsg->m_PWDnSSN.GetBUFFER(), pMsg->m_PWDnSSN.GetBUFFER_LENGTH() ); util::cSTRING_REF_RW_WITH_BUFFER tmpBuffer; switch( eREQ ) { case MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_FIRST: { if( !bSizeMIN ) return FALSE; // ´ÙÀ½ Á¶°ÇÀ» ¸¸Á·ÇÑ´Ù´Â °ÍÀº ÀÌ¹Ì ºñ¹ø °ü·Ã Æ®·£Á§¼ÇÀÌ ÁøÇàÁßÀÎ »óÅ´Ù. if( !rPROTECT.TESTnSET_Transaction_PWD_CONFIG( TRUE ) ) { msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK::RET_FAIL; goto PROCESS_CHECK_END; } msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK::RET_NEED_PWD; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } break; case MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_CLEAR: // ¿©±â¼­´Â Ȱ¼ºÈ­ µÇÁö ¾Ê´Â ±â´ÉÀ» ¿äûÇß´Ù. USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; case MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_CANCEL: { if( !bSizeMIN ) return FALSE; // CHECK_CMP_SSN trans»óÅ¿¡¼­ Ãë¼Ò°¡ ¿À´Â °æ¿ì, ºñ¹øÀº ºñ¾îÀÖ´Â »óÅ¿¡¼­ Àӽà ·ÎÄ÷ΠÀúÀåµÈ »óÅÂÀ̸ç, // µû¶ó¼­ ·ÎÄà ºñ¹øÀ» ÃʱâÈ­ Çϸé ÀÌÀü »óÅ·Πº¹±¸µÉ °ÍÀÌ´Ù. if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN == rPROTECT.PasswordTransactionMode() ) { CHAR emptyChar[1] = { 0 }; rPROTECT.SetPasswordFromDB( emptyChar ); } msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK::RET_CANCELED; goto PROCESS_CHECK_END; } break; case MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_WITH_PWD: { if( !bSizeMAX ) return FALSE; // ºñ¹ø¾øÀ½ »óÅ¿¡¼­ ¼³Á¤ÇÒ ºñ¹øÀÌ ÀÔ·ÂµÈ »óȲ if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD != rPROTECT.PasswordTransactionMode() ) { msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK::RET_FAIL; goto PROCESS_CHECK_END; } tmpBuffer.CopyFrom( strRD ); tmpBuffer.MakeSafeString(); if( !sPASSWORD_BLOCK::IsAcceptableFormat( tmpBuffer.GetBUFFER() ) ) { msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK::RET_INVALID_PWD; goto PROCESS_CHECK_END; } // ·ÎÄÃÀº °»½ÅÇØ µÐ´Ù. rPROTECT.SetPasswordFromDB( tmpBuffer.GetBUFFER() ); // ÇöÀç ÀÎÁ¤µÈ ºñ¹ø¿¡ ´ëÇÑ Àû¿ëÀ» À§ÇÑ SSN È®ÀÎ ¿äû msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_NEED_SSN; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } break; case MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_WITH_SSN: { if( !bSizeMAX ) return FALSE; // Àá±è»óÅÂ->Àá±èÇØÁ¦ (ºñ¹ø ÃʱâÈ­) ÀüȯÀ» À§ÇÑ °ÍÀÓ if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN != rPROTECT.PasswordTransactionMode() ) { msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK::RET_FAIL; goto PROCESS_CHECK_END; } tmpBuffer.CopyFrom( strRD ); tmpBuffer.MakeSafeString(); if( IsEqualSSN( (BYTE*)tmpBuffer.GetBUFFER() ) ) { rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::APPLY_TRANSACTION; // DB¿¡ ºñ¹ø Àû¿ë½ÃŲ´Ù. MSG_DG_WAREHOUSE_PWD_SETTING_SYN msgSYN; msgSYN.m_dwKey = pMsg->m_dwKey; msgSYN.GetTypeCode() = MSG_DG_WAREHOUSE_PWD_SETTING_SYN::PWD_INVENTORY; msgSYN.Set( rPROTECT.GetPassword() ); g_pGameServer->SendToServer( GAME_DBPROXY, &msgSYN, sizeof(msgSYN) ); return TRUE; // ¼º°ø½Ã ´ÙÀ½°ú °°Àº Äڵ带 Àû¿ëÇØ¾ß ÇÑ´Ù. //msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_SUCCESS; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; //USER().SendPacket( &msgACK, sizeof(msgACK) ); //return TRUE; } else { // SSN Ʋ·ÈÀ» °æ¿ì ÀçÂ÷ ¿äûÇÑ´Ù msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_INVALID_SSN; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } } break; } PROCESS_CHECK_END: { rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rPROTECT.TESTnSET_Transaction_PWD_CONFIG( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); } return TRUE; } BOOL WarehouseInventoryProtector::OnRecvCG_ITEM_INVENTORY_PWD_CHECK_SYN( MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN* pMsg, WORD wSize ) { // [ÀüÁ¦] ~PWD_CHECK_SYN ÆÐŶÀº // Àá±è»óÅÂ(ºñ¹øÁ¸Àç, ÀÓ½ÃÀá±è)¿¡¼­ Àá±èÇØÁ¦ ¿äû½Ã¸¸ ÇØ´ç»çÇ×À¸·Î Ãë±ÞÇÑ´Ù. // Å©±â °Ë»ç BOOL bSizeMIN = (BOOL)(MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::MINSIZE() == wSize); BOOL bSizeMAX = (BOOL)((WORD)sizeof(MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN) == wSize); if( !(bSizeMAX || bSizeMIN) ) return FALSE; ProtectorInventory& rPROTECT = INVENTORY(); MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::eREQ_CODE eREQ = (MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::eREQ_CODE)pMsg->ReqCode(); MSG_CG_ITEM_INVENTORY_PWD_CHECK_NAK msgNAK; // [ÀüÁ¦] ¾Õ¿¡¼­ ¾ð±ÞÇßÀ½, Àá±è»óÅ¿©¾ß ÇÑ´Ù. // [ÀüÁ¦] ¿©±â·Î µé¾î¿Â´Ù´Â °ÍÀº ºñ¹øÀÌ ¾ø¾î¾ß ÇÑ´Ù. BOOL bUsable = rPROTECT.IsUsable(); BOOL bValidStatus = ( !bUsable && !rPROTECT.IsEmptyPassword() ); if( !bValidStatus ) { USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } if( MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_FIRST != eREQ ) { // óÀ½ ÆÐŶÀÌ ¾Æ´Ñ ÀÌ»ó ¸ðµÎ Æ®·£Á§¼ÇÀÌ °É·ÁÀÖ¾î¾ß ÇÑ´Ù. // ¾Æ·¡ÀÇ ÁúÀÇ´Â ´ÙÀ½°ú °°´Ù. TransactionÀ» °É¼ö Àִ°¡? TRUE¶ó¸é, °É ¼ö ÀÖ´Ù´Â ÀǹÌÀ̸ç, // µû¶ó¼­ ÇöÀç TransactionÀÌ °É·ÁÀÖÁö ¾Ê´Â »óȲÀÌ µÈ´Ù. if( rPROTECT.TEST_Transaction_PWD_CONFIG( TRUE ) ) { USER().SendPacket( &msgNAK, sizeof(msgNAK) ); return FALSE; } } MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK msgACK; util::cSTRING_REF strRD( pMsg->m_PWDnSSN.GetBUFFER(), pMsg->m_PWDnSSN.GetBUFFER_LENGTH() ); util::cSTRING_REF_RW_WITH_BUFFER tmpBuffer; switch( eREQ ) { case MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_FIRST: { if( !bSizeMIN ) return FALSE; // ´ÙÀ½ Á¶°ÇÀ» ¸¸Á·ÇÑ´Ù´Â °ÍÀº ÀÌ¹Ì ºñ¹ø °ü·Ã Æ®·£Á§¼ÇÀÌ ÁøÇàÁßÀÎ »óÅ´Ù. if( !rPROTECT.TESTnSET_Transaction_PWD_CONFIG( TRUE ) ) { msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_FAIL; goto PROCESS_CHECK_END; } msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_NEED_PWD; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } break; case MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_CLEAR: { if( !bSizeMIN ) return FALSE; // ºñ¹ø °ü·Ã Æ®·£Á§¼Ç ÁßÀ̾î¾ß ÇÑ´Ù. //if( !rPROTECT.TEST_Transaction_PWD_CONFIG( TRUE ) ) //{ // msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_FAIL; // goto PROCESS_CHECK_END; //} // ºñ¹ø ÃʱâÈ­ °ü·ÃÇÑ Ã³¸®¸¦ ¼öÇàÇØ¾ß ÇÑ´Ù. msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_NEED_SSN; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } break; case MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_CANCEL: { if( !bSizeMIN ) return FALSE; msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_CANCELED; goto PROCESS_CHECK_END; } break; case MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_WITH_PWD: { if( !bSizeMAX ) return FALSE; // Àá±è»óÅÂ->¿­¸²»óÅ ÀüȯÀ» À§ÇÑ °ÍÀÓ if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD != rPROTECT.PasswordTransactionMode() ) { msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_FAIL; goto PROCESS_CHECK_END; } tmpBuffer.CopyFrom( strRD ); tmpBuffer.MakeSafeString(); if( rPROTECT.IsEqualPassword( tmpBuffer.GetBUFFER() ) ) { // ¿­¸²»óÅ·ΠÀüȯ msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_SUCCESS; rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rPROTECT.Block( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } else { // ºñ¹ø Ʋ·ÈÀ» °æ¿ì ÀçÂ÷ ¿äûÇÑ´Ù msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_INVALID_PWD; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_PWD; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } } break; case MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_WITH_SSN: { if( !bSizeMAX ) return FALSE; // Àá±è»óÅÂ->Àá±èÇØÁ¦ (ºñ¹ø ÃʱâÈ­) ÀüȯÀ» À§ÇÑ °ÍÀÓ if( sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN != rPROTECT.PasswordTransactionMode() ) { msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_FAIL; goto PROCESS_CHECK_END; } tmpBuffer.CopyFrom( strRD ); tmpBuffer.MakeSafeString(); if( IsEqualSSN( (BYTE*)tmpBuffer.GetBUFFER() ) ) { // ¿­¸²»óÅ·ΠÀüȯ rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::APPLY_TRANSACTION; // DB·Î »óÅ Àüȯ½Ã۰í, ºñ¹ø ÃʱâÈ­ ½ÃÄÑ¾ß ÇÑ´Ù.DB&LOCAL MSG_DG_WAREHOUSE_PWD_SETTING_SYN msgSYN; msgSYN.m_dwKey = pMsg->m_dwKey; msgSYN.GetTypeCode() = MSG_DG_WAREHOUSE_PWD_SETTING_SYN::PWD_INVENTORY; CHAR emptyChar[1] = { 0 }; msgSYN.Set( emptyChar ); g_pGameServer->SendToServer( GAME_DBPROXY, &msgSYN, sizeof(msgSYN) ); return TRUE; // ¼º°ø½Ã ´ÙÀ½°ú °°Àº ÆÐŶÀ» Àü¼ÛÇØ¾ß ÇÑ´Ù. //msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_SUCCESS; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; //USER().SendPacket( &msgACK, sizeof(msgACK) ); //return TRUE; } else { // SSN Ʋ·ÈÀ» °æ¿ì ÀçÂ÷ ¿äûÇÑ´Ù msgACK.ReturnCode() = MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK::RET_INVALID_SSN; //rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_CMP_SSN; USER().SendPacket( &msgACK, sizeof(msgACK) ); return TRUE; } } break; } PROCESS_CHECK_END: { rPROTECT.PasswordTransactionMode() = sPACKET_PROTECT_BASE_INFO::CHECK_END; rPROTECT.TESTnSET_Transaction_PWD_CONFIG( FALSE ); USER().SendPacket( &msgACK, sizeof(msgACK) ); } return TRUE; }