bool CServerList::AddServer(const CServer* pServer) { if (!IsGoodServerIP(pServer)){ // check for 0-IP, localhost and optionally for LAN addresses if (thePrefs.GetLogFilteredIPs()) AddDebugLogLine(false, _T("Ignored server (IP=%s)"), ipstr(pServer->GetIP())); return false; } if (thePrefs.FilterServerByIP()){ if (pServer->HasDynIP()) return false; if (theApp.ipfilter->IsFiltered(pServer->GetIP())){ if (thePrefs.GetLogFilteredIPs()) AddDebugLogLine(false, _T("Ignored server (IP=%s) - IP filter (%s)"), ipstr(pServer->GetIP()), theApp.ipfilter->GetLastHit()); return false; } } CServer* test_server = GetServerByAddress(pServer->GetAddress(), pServer->GetPort()); if (test_server){ test_server->ResetFailedCount(); theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(test_server); return false; } list.AddTail(const_cast<CServer*>(pServer)); return true; }
void ServerManager::Process() { ProcessDisconnect(); EmuTCPConnection *tcp_c = nullptr; while(tcp_c = tcps->NewQueuePop()) { in_addr tmp; tmp.s_addr = tcp_c->GetrIP(); server_log->Log(log_network, "New world server connection from %s:%d", inet_ntoa(tmp), tcp_c->GetrPort()); WorldServer *cur = GetServerByAddress(tcp_c->GetrIP()); if(cur) { server_log->Log(log_network, "World server already existed for %s, removing existing connection and updating current.", inet_ntoa(tmp)); cur->GetConnection()->Free(); cur->SetConnection(tcp_c); cur->Reset(); } else { WorldServer *w = new WorldServer(tcp_c); world_servers.push_back(w); } } list<WorldServer*>::iterator iter = world_servers.begin(); while(iter != world_servers.end()) { if((*iter)->Process() == false) { server_log->Log(log_world, "World server %s had a fatal error and had to be removed from the login.", (*iter)->GetLongName().c_str()); delete (*iter); iter = world_servers.erase(iter); } else { ++iter; } } }
bool CServerList::AddServer(const CServer* pServer, bool bAddTail) { if (!IsGoodServerIP(pServer)){ // check for 0-IP, localhost and optionally for LAN addresses if (thePrefs.GetLogFilteredIPs()) AddDebugLogLine(false, _T("IPFilter(AddServer): Filtered server \"%s\" (IP=%s) - Invalid IP or LAN address."), pServer->GetListName(), ipstr(pServer->GetIP())); return false; } if (thePrefs.GetFilterServerByIP()){ // IP-Filter: We don't need to reject dynIP-servers here. After the DN was // resolved, the IP will get filtered and the server will get removed. This applies // for TCP-connections as well as for outgoing UDP-packets because for both protocols // we resolve the DN and filter the received IP. //if (pServer->HasDynIP()) // return false; if (theApp.ipfilter->IsFiltered(pServer->GetIP())){ if (thePrefs.GetLogFilteredIPs()) AddDebugLogLine(false, _T("IPFilter(AddServer): Filtered server \"%s\" (IP=%s) - IP filter (%s)"), pServer->GetListName(), ipstr(pServer->GetIP()), theApp.ipfilter->GetLastHit()); return false; } } CServer* pFoundServer = GetServerByAddress(pServer->GetAddress(), pServer->GetPort()); // Avoid duplicate (dynIP) servers: If the server which is to be added, is a dynIP-server // but we don't know yet it's DN, we need to search for an already available server with // that IP. if (pFoundServer == NULL && pServer->GetIP() != 0) pFoundServer = GetServerByIPTCP(pServer->GetIP(), pServer->GetPort()); if (pFoundServer){ pFoundServer->ResetFailedCount(); theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(pFoundServer); return false; } if (bAddTail) list.AddTail(const_cast<CServer*>(pServer)); else list.AddHead(const_cast<CServer*>(pServer)); return true; }
bool CServerList::LoadServerMet(const CPath& path) { AddLogLineN(CFormat(_("Loading server.met file: %s")) % path); bool merge = !m_servers.empty(); if (!path.FileExists()) { AddLogLineN(_("Server.met file not found!")); return false; } // Try to unpack the file, might be an archive const wxChar* mets[] = { wxT("server.met"), NULL }; // Try to unpack the file, might be an archive if (UnpackArchive(path, mets).second != EFT_Met) { AddLogLineC(CFormat(_("Failed to load server.met file '%s', unknown format encountered.")) % path); return false; } CFile servermet(path, CFile::read); if ( !servermet.IsOpened() ){ AddLogLineN(_("Failed to open server.met!") ); return false; } try { Notify_ServerFreeze(); byte version = servermet.ReadUInt8(); if (version != 0xE0 && version != MET_HEADER) { AddLogLineC(CFormat(_("Server.met file corrupt, found invalid versiontag: 0x%x, size %i")) % version % sizeof(version)); Notify_ServerThaw(); return false; } uint32 fservercount = servermet.ReadUInt32(); ServerMet_Struct sbuffer; uint32 iAddCount = 0; for ( uint32 j = 0; j < fservercount; ++j ) { sbuffer.ip = servermet.ReadUInt32(); sbuffer.port = servermet.ReadUInt16(); sbuffer.tagcount = servermet.ReadUInt32(); CServer* newserver = new CServer(&sbuffer); // Load tags for ( uint32 i = 0; i < sbuffer.tagcount; ++i ) { newserver->AddTagFromFile(&servermet); } // Server priorities are not in sorted order // High = 1, Low = 2, Normal = 0, so we have to check // in a less logical fashion. int priority = newserver->GetPreferences(); if (priority < SRV_PR_MIN || priority > SRV_PR_MAX) { newserver->SetPreference(SRV_PR_NORMAL); } // set listname for server if ( newserver->GetListName().IsEmpty() ) { newserver->SetListName(wxT("Server ") +newserver->GetAddress()); } if ( !theApp->AddServer(newserver) ) { CServer* update = GetServerByAddress(newserver->GetAddress(), newserver->GetPort()); if(update) { update->SetListName( newserver->GetListName()); if(!newserver->GetDescription().IsEmpty()) { update->SetDescription( newserver->GetDescription()); } Notify_ServerRefresh(update); } delete newserver; } else { ++iAddCount; } } Notify_ServerThaw(); if (!merge) { AddLogLineC(CFormat(wxPLURAL("%i server in server.met found", "%i servers in server.met found", fservercount)) % fservercount); } else { AddLogLineC(CFormat(wxPLURAL("%d server added", "%d servers added", iAddCount)) % iAddCount); } } catch (const CInvalidPacket& err) { AddLogLineC(_("Error: the file 'server.met' is corrupted: ") + err.what()); Notify_ServerThaw(); return false; } catch (const CSafeIOException& err) { AddLogLineC(_("IO error while reading 'server.met': ") + err.what()); Notify_ServerThaw(); return false; } return true; }
void CServerList::LoadStaticServers() { if ( !CPath::FileExists(m_staticServersConfig) ) { return; } wxFileInputStream stream(m_staticServersConfig); wxTextInputStream f(stream); while ( !stream.Eof() ) { wxString line = f.ReadLine(); // Skip comments if ( line.GetChar(0) == '#' || line.GetChar(0) == '/') { continue; } wxStringTokenizer tokens( line, wxT(",") ); if ( tokens.CountTokens() != 3 ) { continue; } // format is host:port,priority,Name wxString addy = tokens.GetNextToken().Strip( wxString::both ); wxString prio = tokens.GetNextToken().Strip( wxString::both ); wxString name = tokens.GetNextToken().Strip( wxString::both ); wxString host = addy.BeforeFirst( wxT(':') ); wxString port = addy.AfterFirst( wxT(':') ); int priority = StrToLong( prio ); if (priority < SRV_PR_MIN || priority > SRV_PR_MAX) { priority = SRV_PR_NORMAL; } // We need a valid name for the list if ( name.IsEmpty() ) { name = addy; } // create server object and add it to the list CServer* server = new CServer( StrToLong( port ), host ); server->SetListName( name ); server->SetIsStaticMember( true ); server->SetPreference( priority ); // Try to add the server to the list if ( !theApp->AddServer( server ) ) { delete server; CServer* existing = GetServerByAddress( host, StrToULong( port ) ); if ( existing) { existing->SetListName( name ); existing->SetIsStaticMember( true ); existing->SetPreference( priority ); Notify_ServerRefresh( existing ); } } } }
bool CServerList::AddServer(CServer* in_server, bool fromUser) { if ( !in_server->GetPort() ) { if ( fromUser ) { AddLogLineC(CFormat( _("Server not added: [%s:%d] does not specify a valid port.") ) % in_server->GetAddress() % in_server->GetPort() ); } return false; } else if ( !in_server->HasDynIP() && ( !IsGoodIP( in_server->GetIP(), thePrefs::FilterLanIPs() ) || ( // don't test for filtered while ipfilter is still loading, // it will be filtered when filter loading is finished theApp->ipfilter->IsReady() && theApp->ipfilter->IsFiltered(in_server->GetIP(), true)) ) ) { if ( fromUser ) { AddLogLineC(CFormat( _("Server not added: The IP of [%s:%d] is filtered or invalid.") ) % in_server->GetAddress() % in_server->GetPort() ); } return false; } CServer* test_server = GetServerByAddress(in_server->GetAddress(), in_server->GetPort()); // Avoid duplicate (dynIP) servers: If the server which is to be added, is a dynIP-server // but we don't know yet it's DN, we need to search for an already available server with // that IP. if (test_server == NULL && in_server->GetIP() != 0) { test_server = GetServerByIPTCP(in_server->GetIP(), in_server->GetPort()); } if (test_server) { if ( fromUser ) { AddLogLineC(CFormat( _("Server not added: Server with matching IP:Port [%s:%d] found in list.") ) % in_server->GetAddress() % in_server->GetPort() ); } test_server->ResetFailedCount(); Notify_ServerRefresh( test_server ); return false; } theStats::AddServer(); m_servers.push_back(in_server); NotifyObservers( EventType( EventType::INSERTED, in_server ) ); if ( fromUser ) { AddLogLineC(CFormat( _("Server added: Server at [%s:%d] using the name '%s'.") ) % in_server->GetAddress() % in_server->GetPort() % in_server->GetListName() ); } return true; }
void CServerList::AddServersFromTextFile(const CString& strFilename) { CStdioFile f; // open the text file either in ANSI (text) or Unicode (binary), this way we can read old and new files // with nearly the same code.. bool bIsUnicodeFile = IsUnicodeFile(strFilename); // check for BOM if (!f.Open(strFilename, CFile::modeRead | CFile::shareDenyWrite | (bIsUnicodeFile ? CFile::typeBinary : 0))) return; try { if (bIsUnicodeFile) f.Seek(sizeof(WORD), CFile::current); // skip BOM CString strLine; while (f.ReadString(strLine)) { // format is host:port,priority,Name if (strLine.GetLength() < 5) continue; if (strLine.GetAt(0) == _T('#') || strLine.GetAt(0) == _T('/')) continue; // fetch host int pos = strLine.Find(_T(':')); if (pos == -1){ pos = strLine.Find(_T(',')); if (pos == -1) continue; } CString strHost = strLine.Left(pos); strLine = strLine.Mid(pos+1); // fetch port pos = strLine.Find(_T(',')); if (pos == -1) continue; CString strPort = strLine.Left(pos); strLine = strLine.Mid(pos+1); // Barry - fetch priority pos = strLine.Find(_T(',')); int priority = SRV_PR_HIGH; if (pos == 1) { CString strPriority = strLine.Left(pos); priority = _tstoi(strPriority); if (priority < 0 || priority > 2) priority = SRV_PR_HIGH; strLine = strLine.Mid(pos+1); } // fetch name CString strName = strLine; strName.Remove(_T('\r')); strName.Remove(_T('\n')); // create server object and add it to the list CServer* nsrv = new CServer((uint16)_tstoi(strPort), strHost); nsrv->SetListName(strName); nsrv->SetIsStaticMember(true); nsrv->SetPreference(priority); if (!theApp.emuledlg->serverwnd->serverlistctrl.AddServer(nsrv, true)) { delete nsrv; CServer* srvexisting = GetServerByAddress(strHost, (uint16)_tstoi(strPort)); if (srvexisting) { srvexisting->SetListName(strName); srvexisting->SetIsStaticMember(true); srvexisting->SetPreference(priority); if (theApp.emuledlg->serverwnd) theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(srvexisting); } } } f.Close(); } catch (CFileException* ex) { ASSERT(0); ex->Delete(); } }
void CServerList::AddServersFromTextFile(const CString& strFilename) { CStdioFile f; if (!f.Open(strFilename, CFile::modeRead | CFile::typeText | CFile::shareDenyWrite)) return; CString strLine; while (f.ReadString(strLine)) { // format is host:port,priority,Name if (strLine.GetLength() < 5) continue; if (strLine.GetAt(0) == _T('#') || strLine.GetAt(0) == _T('/')) continue; // fetch host int pos = strLine.Find(_T(':')); if (pos == -1){ pos = strLine.Find(_T(',')); if (pos == -1) continue; } CString strHost = strLine.Left(pos); strLine = strLine.Mid(pos+1); // fetch port pos = strLine.Find(_T(',')); if (pos == -1) continue; CString strPort = strLine.Left(pos); strLine = strLine.Mid(pos+1); // Barry - fetch priority pos = strLine.Find(_T(',')); int priority = SRV_PR_HIGH; if (pos == 1) { CString strPriority = strLine.Left(pos); try { priority = _tstoi(strPriority.GetBuffer(0)); if (priority < 0 || priority > 2) priority = SRV_PR_HIGH; } catch (...){ ASSERT(0); } strLine = strLine.Mid(pos+1); } // fetch name CString strName = strLine; strName.Replace(_T("\r"), _T("")); strName.Replace(_T("\n"), _T("")); // create server object and add it to the list CServer* nsrv = new CServer(_tstoi(strPort), strHost.GetBuffer()); nsrv->SetListName(strName.GetBuffer()); nsrv->SetIsStaticMember(true); nsrv->SetPreference(priority); if (!theApp.emuledlg->serverwnd->serverlistctrl.AddServer(nsrv, true)) { delete nsrv; CServer* srvexisting = GetServerByAddress(strHost.GetBuffer(), _tstoi(strPort)); if (srvexisting) { srvexisting->SetListName(strName.GetBuffer()); srvexisting->SetIsStaticMember(true); srvexisting->SetPreference(priority); if (theApp.emuledlg->serverwnd) theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(srvexisting); } } } f.Close(); }