CClient::CClient(NetState* state) { // This may be a web connection or Telnet ? m_net = state; SetConnectType( CONNECT_UNK ); // don't know what sort of connect this is yet. // update ip history #ifndef _MTNETWORK HistoryIP& history = g_NetworkIn.getIPHistoryManager().getHistoryForIP(GetPeer()); #else HistoryIP& history = g_NetworkManager.getIPHistoryManager().getHistoryForIP(GetPeer()); #endif history.m_connecting++; history.m_connected++; m_Crypt.SetClientVer( g_Serv.m_ClientVersion ); m_pAccount = NULL; m_pChar = NULL; m_pGMPage = NULL; m_timeLogin.Init(); m_timeLastSend = m_timeLastEvent = CServTime::GetCurrentTime(); m_timeLastEventWalk = CServTime::GetCurrentTime(); m_iWalkStepCount = 0; m_iWalkTimeAvg = 100; m_timeWalkStep = GetTickCount(); m_Targ_Timeout.Init(); m_Targ_Mode = CLIMODE_SETUP_CONNECTING; m_Prompt_Mode = CLIMODE_NORMAL; m_tmSetup.m_dwIP = 0; m_tmSetup.m_iConnect = 0; m_tmSetup.m_bNewSeed = false; m_Env.SetInvalid(); g_Log.Event(LOGM_CLIENTS_LOG, "%lx:Client connected [Total:%lu] ('%s' %ld/%ld)\n", GetSocketID(), g_Serv.StatGet(SERV_STAT_CLIENTS), GetPeerStr(), history.m_connecting, history.m_connected); m_zLastMessage[0] = 0; m_zLastObjMessage[0] = 0; m_tNextPickup.Init(); m_BfAntiCheat.lastvalue = m_BfAntiCheat.count = 0x0; m_ScreenSize.x = m_ScreenSize.y = 0x0; m_pPopupPacket = NULL; m_pHouseDesign = NULL; m_fUpdateStats = 0; }
bool CClient::OnRxConsoleLoginComplete() { ADDTOCALLSTACK("CClient::OnRxConsoleLoginComplete"); if ( GetConnectType() != CONNECT_TELNET ) return false; if ( !GetPeer().IsValidAddr() ) return false; if ( GetPrivLevel() < PLEVEL_Admin ) // this really should not happen. { SysMessagef("%s\n", g_Cfg.GetDefaultMsg(DEFMSG_CONSOLE_NO_ADMIN)); return false; } SysMessagef("%s '%s' ('%s')\n", g_Cfg.GetDefaultMsg(DEFMSG_CONSOLE_WELCOME_2), GetName(), GetPeerStr()); return true; }
bool CClient::OnRxPing( const byte * pData, size_t iLen ) { ADDTOCALLSTACK("CClient::OnRxPing"); // packet iLen < 5 // UOMon should work like this. // RETURN: true = keep the connection open. if ( GetConnectType() != CONNECT_UNK ) return false; if ( !iLen || iLen > 4 ) return false; switch ( pData[0] ) { // Remote Admin Console case '\x1': case ' ': { if ( (iLen > 1) && (iLen != 2 || pData[1] != '\n') && (iLen != 3 || pData[1] != '\r' || pData[2] != '\n') && (iLen != 3 || pData[1] != '\n' || pData[2] != '\0') ) break; // enter into remote admin mode. (look for password). SetConnectType( CONNECT_TELNET ); m_zLogin[0] = 0; SysMessagef("%s %s Admin Telnet\n", g_Cfg.GetDefaultMsg(DEFMSG_CONSOLE_WELCOME_1), g_Serv.GetName()); if ( g_Cfg.m_fLocalIPAdmin ) { // don't bother logging in if local. if ( GetPeer().IsLocalAddr() ) { CAccountRef pAccount = g_Accounts.Account_Find("Administrator"); if ( !pAccount ) pAccount = g_Accounts.Account_Find("RemoteAdmin"); if ( pAccount ) { CSString sMsg; byte lErr = LogIn( pAccount, sMsg ); if ( lErr != PacketLoginError::Success ) { if ( lErr != PacketLoginError::Invalid ) SysMessage( sMsg ); return false; } return OnRxConsoleLoginComplete(); } } } SysMessage("Login:\n"); return true; } //Axis Connection case '@': { if ( (iLen > 1) && (iLen != 2 || pData[1] != '\n') && (iLen != 3 || pData[1] != '\r' || pData[2] != '\n') && (iLen != 3 || pData[1] != '\n' || pData[2] != '\0') ) break; // enter into Axis mode. (look for password). SetConnectType( CONNECT_AXIS ); m_zLogin[0] = 0; time_t dateChange; dword dwSize = 0; CSFileList::ReadFileInfo( "Axis.db", dateChange, dwSize ); SysMessagef("%u",dwSize); return true; } // ConnectUO Status case 0xF1: { // ConnectUO sends a 4-byte packet when requesting status info // byte Cmd (0xF1) // word Unk (0x04) // byte SubCmd (0xFF) if ( iLen != MAKEWORD( pData[2], pData[1] ) ) break; if ( pData[3] != 0xFF ) break; if ( g_Cfg.m_fCUOStatus == false ) { g_Log.Event( LOGM_CLIENTS_LOG|LOGL_EVENT, "%x:CUO Status request from %s has been rejected.\n", GetSocketID(), GetPeerStr()); return false; } // enter 'remote admin mode' SetConnectType( CONNECT_TELNET ); g_Log.Event( LOGM_CLIENTS_LOG|LOGL_EVENT, "%x:CUO Status request from %s\n", GetSocketID(), GetPeerStr()); SysMessage( g_Serv.GetStatusString( 0x25 ) ); // exit 'remote admin mode' SetConnectType( CONNECT_UNK ); return false; } // UOGateway Status case 0xFF: case 0x7F: case 0x22: { if ( iLen > 1 ) break; if ( g_Cfg.m_fUOGStatus == false ) { g_Log.Event( LOGM_CLIENTS_LOG|LOGL_EVENT, "%x:UOG Status request from %s has been rejected.\n", GetSocketID(), GetPeerStr()); return false; } // enter 'remote admin mode' SetConnectType( CONNECT_TELNET ); g_Log.Event( LOGM_CLIENTS_LOG|LOGL_EVENT, "%x:UOG Status request from %s\n", GetSocketID(), GetPeerStr()); if (pData[0] == 0x7F) SetConnectType( CONNECT_UOG ); SysMessage( g_Serv.GetStatusString( 0x22 ) ); // exit 'remote admin mode' SetConnectType( CONNECT_UNK ); return false; } } g_Log.Event( LOGM_CLIENTS_LOG|LOGL_EVENT, "%x:Unknown/invalid ping data '0x%x' from %s (Len: %" PRIuSIZE_T ")\n", GetSocketID(), pData[0], GetPeerStr(), iLen); return false; }
CClient::CClient(NetState *state) { m_pChar = NULL; m_Env.SetInvalid(); m_fUpdateStats = 0; m_iWalkTimeAvg = 100; m_iWalkStepCount = 0; m_timeWalkStep = GetTickCount64(); m_ScreenSize.x = m_ScreenSize.y = 0; m_Prompt_Mode = CLIMODE_NORMAL; SetConnectType(CONNECT_UNK); // don't know what sort of connect this is yet m_NetState = state; m_pAccount = NULL; m_FeatureFlags = 0; m_CharacterListFlags = 0; m_TooltipEnabled = false; m_ContainerGridEnabled = false; m_UseNewChatSystem = false; m_timeLogin.Init(); m_timeLastEvent = CServTime::GetCurrentTime(); m_timeLastEventItemPickup = CServTime::GetCurrentTime(); m_timeLastEventWalk = CServTime::GetCurrentTime(); m_timeNextEventWalk = 0; m_pGMPage = NULL; m_timeLastSkillThrowing.Init(); m_pSkillThrowingTarg = NULL; m_SkillThrowingAnimID = ITEMID_NOTHING; m_SkillThrowingAnimHue = 0; m_SkillThrowingAnimRender = 0; m_Targ_Mode = CLIMODE_SETUP_CONNECTING; m_Targ_Timeout.Init(); m_Crypt.SetClientVer(g_Serv.m_ClientVersion); m_pPopupPacket = NULL; m_zLastMessage[0] = 0; m_zLastObjMessage[0] = 0; m_pHouseDesign = NULL; // Update IP history #ifdef _MTNETWORK HistoryIP &history = g_NetworkManager.getIPHistoryManager().getHistoryForIP(GetPeer()); #else HistoryIP &history = g_NetworkIn.getIPHistoryManager().getHistoryForIP(GetPeer()); #endif ++history.m_connecting; ++history.m_connected; g_Log.Event(LOGM_CLIENTS_LOG, "%lx:Client connected [Total:%lu] ('%s' %ld/%ld)\n", GetSocketID(), g_Serv.StatGet(SERV_STAT_CLIENTS), GetPeerStr(), history.m_connecting, history.m_connected); }