bool CKnownFileList::LoadCancelledFiles(){ // cancelled.met Format: <Header 1 = CANCELLED_HEADER><Version 1 = CANCELLED_VERSION><Seed 4><Count 4>[<HashHash 16><TagCount 1>[Tags TagCount] Count] if (!thePrefs.IsRememberingCancelledFiles()) return true; CString fullpath = thePrefs.GetMuleDirectory(EMULE_CONFIGDIR); fullpath.Append(CANCELLED_MET_FILENAME); CSafeBufferedFile file; CFileException fexp; if (!file.Open(fullpath,CFile::modeRead|CFile::osSequentialScan|CFile::typeBinary|CFile::shareDenyWrite, &fexp)){ if (fexp.m_cause != CFileException::fileNotFound){ CString strError(_T("Failed to load ") CANCELLED_MET_FILENAME _T(" file")); TCHAR szError[MAX_CFEXP_ERRORMSG]; if (fexp.GetErrorMessage(szError, ARRSIZE(szError))){ strError += _T(" - "); strError += szError; } LogError(LOG_STATUSBAR, _T("%s"), strError); } return false; } setvbuf(file.m_pStream, NULL, _IOFBF, 16384); uchar ucHash[16]; try { bool bOldVersion = false; uint8 header = file.ReadUInt8(); if (header != CANCELLED_HEADER){ if (header == CANCELLED_HEADER_OLD){ bOldVersion = true; DebugLog(_T("Deprecated version of cancelled.met found, converting to new version")); } else{ file.Close(); return false; } } uint8 byVersion = 0; if (!bOldVersion){ byVersion = file.ReadUInt8(); if (byVersion > CANCELLED_VERSION){ file.Close(); return false; } m_dwCancelledFilesSeed = file.ReadUInt32(); } if (m_dwCancelledFilesSeed == 0) { ASSERT( bOldVersion || file.GetLength() <= 10 ); m_dwCancelledFilesSeed = (GetRandomUInt32() % 0xFFFFFFFE) + 1; } UINT RecordsNumber = file.ReadUInt32(); for (UINT i = 0; i < RecordsNumber; i++) { file.ReadHash16(ucHash); uint8 nCount = file.ReadUInt8(); // for compatibility with future versions which may add more data than just the hash for (UINT j = 0; j < nCount; j++) { CTag tag(&file, false); } if (bOldVersion){ // convert old real hash to new hashash uchar pachSeedHash[20]; PokeUInt32(pachSeedHash, m_dwCancelledFilesSeed); md4cpy(pachSeedHash + 4, ucHash); MD5Sum md5(pachSeedHash, sizeof(pachSeedHash)); md4cpy(ucHash, md5.GetRawHash()); } m_mapCancelledFiles.SetAt(CSKey(ucHash), 1); } file.Close(); } catch(CFileException* error){ if (error->m_cause == CFileException::endOfFile) LogError(LOG_STATUSBAR, GetResString(IDS_ERR_CONFIGCORRUPT), CANCELLED_MET_FILENAME); else{ TCHAR buffer[MAX_CFEXP_ERRORMSG]; error->GetErrorMessage(buffer, ARRSIZE(buffer)); LogError(LOG_STATUSBAR, GetResString(IDS_ERR_FAILEDTOLOAD), CANCELLED_MET_FILENAME, buffer); } error->Delete(); return false; } return true; }
void CClientCreditsList::LoadList() { CString strFileName = thePrefs.GetConfigDir() + CLIENTS_MET_FILENAME; const int iOpenFlags = CFile::modeRead|CFile::osSequentialScan|CFile::typeBinary|CFile::shareDenyWrite; CSafeBufferedFile file; CFileException fexp; if (!file.Open(strFileName, iOpenFlags, &fexp)){ if (fexp.m_cause != CFileException::fileNotFound){ CString strError(GetResString(IDS_ERR_LOADCREDITFILE)); TCHAR szError[MAX_CFEXP_ERRORMSG]; if (fexp.GetErrorMessage(szError, ARRSIZE(szError))){ strError += _T(" - "); strError += szError; } LogError(LOG_STATUSBAR, _T("%s"), strError); } return; } setvbuf(file.m_pStream, NULL, _IOFBF, 16384); try{ uint8 version = file.ReadUInt8(); if (version != CREDITFILE_VERSION && version != CREDITFILE_VERSION_29){ LogWarning(GetResString(IDS_ERR_CREDITFILEOLD)); file.Close(); return; } // everything is ok, lets see if the backup exist... CString strBakFileName; strBakFileName.Format(_T("%s") CLIENTS_MET_FILENAME _T(".bak"), thePrefs.GetConfigDir()); DWORD dwBakFileSize = 0; BOOL bCreateBackup = TRUE; HANDLE hBakFile = ::CreateFile(strBakFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hBakFile != INVALID_HANDLE_VALUE) { // Ok, the backup exist, get the size dwBakFileSize = ::GetFileSize(hBakFile, NULL); //debug if (dwBakFileSize > (DWORD)file.GetLength()) { // the size of the backup was larger then the org. file, something is wrong here, don't overwrite old backup.. bCreateBackup = FALSE; } //else: backup is smaller or the same size as org. file, proceed with copying of file ::CloseHandle(hBakFile); } //else: the backup doesn't exist, create it if (bCreateBackup) { file.Close(); // close the file before copying if (!::CopyFile(strFileName, strBakFileName, FALSE)) LogError(GetResString(IDS_ERR_MAKEBAKCREDITFILE)); // reopen file CFileException fexp; if (!file.Open(strFileName, iOpenFlags, &fexp)){ CString strError(GetResString(IDS_ERR_LOADCREDITFILE)); TCHAR szError[MAX_CFEXP_ERRORMSG]; if (fexp.GetErrorMessage(szError, ARRSIZE(szError))){ strError += _T(" - "); strError += szError; } LogError(LOG_STATUSBAR, _T("%s"), strError); return; } setvbuf(file.m_pStream, NULL, _IOFBF, 16384); file.Seek(1, CFile::begin); //set filepointer behind file version byte } UINT count = file.ReadUInt32(); m_mapClients.InitHashTable(count+5000); // TODO: should be prime number... and 20% larger const uint32 dwExpired = time(NULL) - 12960000; // today - 150 day uint32 cDeleted = 0; for (UINT i = 0; i < count; i++){ CreditStruct* newcstruct = new CreditStruct; MEMSET(newcstruct, 0, sizeof(CreditStruct)); if (version == CREDITFILE_VERSION_29) file.Read(newcstruct, sizeof(CreditStruct_29a)); else file.Read(newcstruct, sizeof(CreditStruct)); if (newcstruct->nLastSeen < dwExpired){ cDeleted++; delete newcstruct; continue; } CClientCredits* newcredits = new CClientCredits(newcstruct); m_mapClients.SetAt(CCKey(newcredits->GetKey()), newcredits); } file.Close(); if (cDeleted>0) AddLogLine(false, GetResString(IDS_CREDITFILELOADED) + GetResString(IDS_CREDITSEXPIRED), count-cDeleted,cDeleted); else AddLogLine(false, GetResString(IDS_CREDITFILELOADED), count); } catch(CFileException* error){ if (error->m_cause == CFileException::endOfFile) LogError(LOG_STATUSBAR, GetResString(IDS_CREDITFILECORRUPT)); else{ TCHAR buffer[MAX_CFEXP_ERRORMSG]; error->GetErrorMessage(buffer, ARRSIZE(buffer)); LogError(LOG_STATUSBAR, GetResString(IDS_ERR_CREDITFILEREAD), buffer); } error->Delete(); } }
void CRoutingZone::ReadFile(CString strSpecialNodesdate) { if (m_pSuperZone != NULL || (m_sFilename.IsEmpty() && strSpecialNodesdate.IsEmpty())){ ASSERT( false ); return; } bool bDoHaveVerifiedContacts = false; // Read in the saved contact list. try { CSafeBufferedFile file; CFileException fexp; if (file.Open(strSpecialNodesdate.IsEmpty() ? m_sFilename : strSpecialNodesdate, CFile::modeRead | CFile::osSequentialScan|CFile::typeBinary|CFile::shareDenyWrite, &fexp)) { setvbuf(file.m_pStream, NULL, _IOFBF, 32768); // Get how many contacts in the saved list. // NOTE: Older clients put the number of contacts here.. // Newer clients always have 0 here to prevent older clients from reading it. uint32_t uNumContacts = file.ReadUInt32(); uint32_t uVersion = 0; if (uNumContacts == 0) { if (file.GetLength() >= 8){ uVersion = file.ReadUInt32(); if (uVersion == 3){ uint32_t nBoostrapEdition = file.ReadUInt32(); if (nBoostrapEdition == 1){ // this is a special bootstrap-only nodes.dat, handle it in a seperate reading function ReadBootstrapNodesDat(file); file.Close(); return; } } if(uVersion >= 1 && uVersion <= 3) // those version we know, others we ignore uNumContacts = file.ReadUInt32(); } else AddDebugLogLine( false, GetResString(IDS_ERR_KADCONTACTS)); } if (uNumContacts != 0 && uNumContacts * 25 <= (file.GetLength() - file.GetPosition())) { // Hide contact list in the GUI theApp.emuledlg->kademliawnd->HideContacts(); uint32_t uValidContacts = 0; CUInt128 uID; while ( uNumContacts ) { file.ReadUInt128(&uID); uint32_t uIP = file.ReadUInt32(); uint16_t uUDPPort = file.ReadUInt16(); uint16_t uTCPPort = file.ReadUInt16(); byte byType = 0; uint8_t uContactVersion = 0; if(uVersion >= 1) uContactVersion = file.ReadUInt8(); else byType = file.ReadUInt8(); CKadUDPKey kadUDPKey; bool bVerified = false; if(uVersion >= 2){ kadUDPKey.ReadFromFile(file); bVerified = file.ReadUInt8() != 0; if (bVerified) bDoHaveVerifiedContacts = true; } // IP Appears valid if( byType < 4) { uint32_t uhostIP = ntohl(uIP); if (::IsGoodIPPort(uhostIP, uUDPPort)) { if (::theApp.ipfilter->IsFiltered(uhostIP)) { if (::thePrefs.GetLogFilteredIPs()) AddDebugLogLine(false, _T("Ignored kad contact (IP=%s:%u)--read known.dat -- - IP filter (%s)") , ipstr(uhostIP), uUDPPort, ::theApp.ipfilter->GetLastHit()); } else if (uUDPPort == 53 && uContactVersion <= KADEMLIA_VERSION5_48a) /*No DNS Port without encryption*/ { if (::thePrefs.GetLogFilteredIPs()) AddDebugLogLine(false, _T("Ignored kad contact (IP=%s:%u)--read known.dat") , ipstr(uhostIP), uUDPPort); } else { // This was not a dead contact, Inc counter if add was successful if (AddUnfiltered(uID, uIP, uUDPPort, uTCPPort, uContactVersion, kadUDPKey, bVerified, false, true, false)) uValidContacts++; } } } uNumContacts--; } AddLogLine( false, GetResString(IDS_KADCONTACTSREAD), uValidContacts); if (!bDoHaveVerifiedContacts){ DebugLogWarning(_T("No verified contacts found in nodes.dat - might be an old file version. Setting all contacts verified for this time to speed up Kad bootstrapping")); SetAllContactsVerified(); } } file.Close(); } else DebugLogWarning(_T("Unable to read Kad file: %s"), m_sFilename); } catch (CFileException* e) { e->Delete(); DebugLogError(_T("CFileException in CRoutingZone::readFile")); } // Show contact list in GUI theApp.emuledlg->kademliawnd->ShowContacts(); }