void CPrefs::ReadFile() { try { CSafeBufferedFile file; CFileException fexp; if (file.Open(m_sFilename, CFile::modeRead | CFile::osSequentialScan | CFile::typeBinary | CFile::shareDenyWrite, &fexp)) { setvbuf(file.m_pStream, NULL, _IOFBF, 16384); m_uIP = file.ReadUInt32(); file.ReadUInt16(); file.ReadUInt128(&m_uClientID); // get rid of invalid kad IDs which may have been stored by older versions if (m_uClientID == 0) m_uClientID.SetValueRandom(); file.Close(); } } catch (CException *ex) { ASSERT(0); ex->Delete(); } catch (...) { TRACE("Exception in CPrefs::readFile\n"); } }
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(); }