void UpdateManager::completeIPCheck(bool manual, bool v6) { auto& conn = conns[v6 ? CONN_IP6 : CONN_IP4]; if(!conn) { return; } string ip; ScopedFunctor([&conn] { conn.reset(); }); const auto& setting = v6 ? SettingsManager::EXTERNAL_IP6 : SettingsManager::EXTERNAL_IP; if (!conn->buf.empty()) { try { const string pattern = !v6 ? "\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b" : "(\\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6}\\Z)|(\\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}\\Z)|(\\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}\\Z)|(\\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}\\Z)|(\\A([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}\\Z)|(\\A([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1}\\Z)|(\\A(([0-9a-f]{1,4}:){1,7}|:):\\Z)|(\\A:(:[0-9a-f]{1,4}){1,7}\\Z)|(\\A((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3})\\Z)|(\\A(([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3})\\Z)|(\\A([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\Z)|(\\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\Z)|(\\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\Z)|(\\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\Z)|(\\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\Z)|(\\A(([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\Z)|(\\A:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\Z)"; const boost::regex reg(pattern); boost::match_results<string::const_iterator> results; // RSX++ workaround for msvc std lib problems string::const_iterator start = conn->buf.begin(); string::const_iterator end = conn->buf.end(); if(boost::regex_search(start, end, results, reg, boost::match_default)) { if(!results.empty()) { ip = results.str(0); //const string& ip = results.str(0); if (!manual) SettingsManager::getInstance()->set(setting, ip); } } } catch(...) { } } fire(UpdateManagerListener::SettingUpdated(), setting, ip); }
bool SearchResult::getRelevance(SearchQuery& aQuery, RelevanceInfo& relevance_, const string& aLocalSearchToken) const noexcept { if (!aLocalSearchToken.empty() && !matches(aQuery, aLocalSearchToken)) { return false; } // Nothing to calculate with TTH searches if (aQuery.root) { relevance_.matchRelevance = 1; relevance_.sourceScoreFactor = 0.01; return true; } // Match path SearchQuery::Recursion recursion; ScopedFunctor([&] { aQuery.recursion = nullptr; }); if (!aQuery.matchesNmdcPath(path, recursion)) { return false; } // Don't count the levels because they can't be compared with each others auto matchRelevance = SearchQuery::getRelevanceScore(aQuery, 0, type == SearchResult::TYPE_DIRECTORY, getFileName()); double sourceScoreFactor = 0.01; if (aQuery.recursion && aQuery.recursion->isComplete()) { // There are subdirectories/files that have more matches than the main directory // Don't give too much weight for those even if there are lots of sources sourceScoreFactor = 0.001; // We don't get the level scores so balance those here matchRelevance = max(0.0, matchRelevance - (0.05 * aQuery.recursion->recursionLevel)); } relevance_.matchRelevance = matchRelevance; relevance_.sourceScoreFactor = sourceScoreFactor; return true; }
SearchResultList ShareManager::search(const string& nmdcString, int searchType, int64_t size, int fileType, size_t maxResults) noexcept { #if DCPP_TIME_SEARCHES auto start = GET_TICK(); ScopedFunctor(([start] { LogManager::getInstance()->message("The NMDC search took " + Util::toString(GET_TICK() - start) + " ms"); })); #endif return search(SearchQuery(nmdcString, searchType, size, fileType), maxResults); }
SearchResultList ShareManager::search(const StringList& adcParams, size_t maxResults) noexcept { #if DCPP_TIME_SEARCHES auto start = GET_TICK(); ScopedFunctor(([start] { LogManager::getInstance()->message("The ADC search took " + Util::toString(GET_TICK() - start) + " ms"); })); #endif return search(SearchQuery(adcParams), maxResults); }
void UpdateManager::completeSignatureDownload(bool manualCheck) { auto& conn = conns[CONN_SIGNATURE]; ScopedFunctor([&conn] { conn.reset(); }); if(conn->buf.empty()) { failVersionDownload(STRING_F(DOWNLOAD_SIGN_FAILED, conn->status), manualCheck); } else { versionSig.assign(conn->buf.begin(), conn->buf.end()); } conns[CONN_VERSION].reset(new HttpDownload(getVersionUrl(), [this, manualCheck] { completeVersionDownload(manualCheck); }, false)); }
void UpdateManager::completeGeoDownload(bool v6) { auto& conn = conns[v6 ? CONN_GEO_V6 : CONN_GEO_V4]; if(!conn) { return; } ScopedFunctor([&conn] { conn.reset(); }); if(!conn->buf.empty()) { try { File(GeoManager::getDbPath(v6) + ".gz", File::WRITE, File::CREATE | File::TRUNCATE).write(conn->buf); GeoManager::getInstance()->update(v6); LogManager::getInstance()->message(STRING_F(GEOIP_UPDATED, (v6 ? "IPv6" : "IPv4")), LogMessage::SEV_INFO); return; } catch(const FileException&) { } } LogManager::getInstance()->message(STRING_F(GEOIP_UPDATING_FAILED, (v6 ? "IPv6" : "IPv4")), LogMessage::SEV_WARNING); }
void UpdateManager::completeLanguageCheck() { auto& conn = conns[CONN_LANGUAGE_CHECK]; if(!conn) { return; } ScopedFunctor([&conn] { conn.reset(); }); if(!conn->buf.empty()) { if (Util::toDouble(conn->buf) > Localization::getCurLanguageVersion()) { fire(UpdateManagerListener::LanguageDownloading()); conns[CONN_LANGUAGE_FILE].reset(new HttpDownload(links.language + Localization::getCurLanguageFileName(), [this] { completeLanguageDownload(); }, false)); } else { fire(UpdateManagerListener::LanguageFinished()); } } else { fire(UpdateManagerListener::LanguageFailed(), conn->status); } }
void UpdateManager::completeLanguageDownload() { auto& conn = conns[CONN_LANGUAGE_FILE]; if(!conn) { return; } ScopedFunctor([&conn] { conn.reset(); }); if(!conn->buf.empty()) { try { auto path = Localization::getCurLanguageFilePath(); File::ensureDirectory(Util::getFilePath(path)); File(path, File::WRITE, File::CREATE | File::TRUNCATE).write(conn->buf); LogManager::getInstance()->message(STRING_F(LANGUAGE_UPDATED, Localization::getLanguageStr()), LogMessage::SEV_INFO); fire(UpdateManagerListener::LanguageFinished()); return; } catch(const FileException& e) { LogManager::getInstance()->message(STRING_F(LANGUAGE_UPDATE_FAILED, Localization::getLanguageStr() % e.getError()), LogMessage::SEV_WARNING); } } fire(UpdateManagerListener::LanguageFailed(), conn->status); LogManager::getInstance()->message(STRING_F(LANGUAGE_UPDATE_FAILED, Localization::getLanguageStr() % conn->status), LogMessage::SEV_WARNING); }
int MappingManager::run() { ScopedFunctor([this] { busy.clear(); }); // cache ports auto conn_port = ConnectionManager::getInstance()->getPort(), secure_port = ConnectionManager::getInstance()->getSecurePort(), search_port = SearchManager::getInstance()->getPort(); if(renewal) { Mapper& mapper = *working; ScopedFunctor([&mapper] { mapper.uninit(); }); if(!mapper.init()) { // can't renew; try again later. renewLater(mapper); return 0; } auto addRule = [this, &mapper](const string& port, Mapper::Protocol protocol, const string& description) { // just launch renewal requests - don't bother with possible failures. if(!port.empty()) { mapper.open(port, protocol, STRING_F(MAPPER_X_PORT_X, description % port % Mapper::protocols[protocol])); } }; addRule(conn_port, Mapper::PROTOCOL_TCP, "Transfer"); addRule(secure_port, Mapper::PROTOCOL_TCP, "Encrypted transfer"); addRule(search_port, Mapper::PROTOCOL_UDP, "Search"); renewLater(mapper); return 0; } // move the preferred mapper to the top of the stack. const auto& mapperName = SETTING(MAPPER); for(auto i = mappers.begin(); i != mappers.end(); ++i) { if(i->first == mapperName) { if(i != mappers.begin()) { auto mapper = *i; mappers.erase(i); mappers.insert(mappers.begin(), mapper); } break; } } for(auto& i: mappers) { auto setting = v6 ? SettingsManager::BIND_ADDRESS6 : SettingsManager::BIND_ADDRESS; unique_ptr<Mapper> pMapper(i.second((SettingsManager::getInstance()->isDefault(setting) ? Util::emptyString : SettingsManager::getInstance()->get(setting)), v6)); Mapper& mapper = *pMapper; ScopedFunctor([&mapper] { mapper.uninit(); }); if(!mapper.init()) { log(STRING_F(MAPPER_INIT_FAILED, mapper.getName()), LogMessage::SEV_WARNING); continue; } auto addRule = [this, &mapper](const string& port, Mapper::Protocol protocol, const string& description) -> bool { if (!port.empty() && !mapper.open(port, protocol, STRING_F(MAPPER_X_PORT_X, APPNAME % description % port % Mapper::protocols[protocol]))) { this->log(STRING_F(MAPPER_INTERFACE_FAILED, description % port % Mapper::protocols[protocol] % mapper.getName()), LogMessage::SEV_WARNING); mapper.close(); return false; } return true; }; if(!(addRule(conn_port, Mapper::PROTOCOL_TCP, STRING(TRANSFER)) && addRule(secure_port, Mapper::PROTOCOL_TCP, STRING(ENCRYPTED_TRANSFER)) && addRule(search_port, Mapper::PROTOCOL_UDP, STRING(SEARCH)))) continue; log(STRING_F(MAPPER_CREATING_SUCCESS_LONG, conn_port % secure_port % search_port % deviceString(mapper) % mapper.getName()), LogMessage::SEV_INFO); working = move(pMapper); if ((!v6 && !CONNSETTING(NO_IP_OVERRIDE)) || (v6 && !CONNSETTING(NO_IP_OVERRIDE6))) { setting = v6 ? SettingsManager::EXTERNAL_IP6 : SettingsManager::EXTERNAL_IP; string externalIP = mapper.getExternalIP(); if(!externalIP.empty()) { ConnectivityManager::getInstance()->set(setting, externalIP); } else { // no cleanup because the mappings work and hubs will likely provide the correct IP. log(STRING(MAPPER_IP_FAILED), LogMessage::SEV_WARNING); } } ConnectivityManager::getInstance()->mappingFinished(mapper.getName(), v6); renewLater(mapper); break; } if(!getOpened()) { log(STRING(MAPPER_CREATING_FAILED), LogMessage::SEV_ERROR); ConnectivityManager::getInstance()->mappingFinished(Util::emptyString, v6); } return 0; }
void Parser::startTag(const string& name_, StringPairList& attribs, bool simple) { auto name = boost::algorithm::trim_copy(name_); if(name == "br") { ret += _T("\\line\n"); } if(simple) { return; } contexts.push_back(contexts.back()); ScopedFunctor([this] { ret += contexts.back().getBegin(); }); if(name == "b") { contexts.back().setFlag(Context::Bold); } else if(name == "i") { contexts.back().setFlag(Context::Italic); } else if(name == "u") { contexts.back().setFlag(Context::Underlined); } if(attribs.empty()) { return; } if(name == "a") { const auto& link = getAttrib(attribs, "href", 0); if(!link.empty()) { auto& context = contexts.back(); context.link = link; if ((WinUtil::m_TextStyleURL.dwMask & CFE_UNDERLINE) == CFE_UNDERLINE) context.setFlag(Context::Underlined); context.textColor = addColor(WinUtil::m_TextStyleURL.crTextColor); /// @todo move to styles } } const auto& style = getAttrib(attribs, "style", 0); enum { Declaration, Font, Decoration, TextColor, BgColor, FontSize, Unknown } state = Declaration; string tmp; size_t i = 0, j; while((j = style.find_first_of(":;", i)) != string::npos) { tmp = style.substr(i, j - i); i = j + 1; boost::algorithm::trim(tmp); switch(state) { case Declaration: { if(tmp == "font") { state = Font; } else if(tmp == "color") { state = TextColor; } else if(tmp == "text-decoration") { state = Decoration; } else if(tmp == "background-color") { state = BgColor; } else if(tmp == "font-size") { state = FontSize; } else { state = Unknown; } break; } case Font: { parseFont(tmp); state = Declaration; break; } case FontSize: { parseFontSize(tmp); state = Declaration; break; } case Decoration: { parseDecoration(tmp); state = Declaration; break; } case TextColor: { parseColor(contexts.back().textColor, tmp); state = Declaration; break; } case BgColor: { parseColor(contexts.back().bgColor, tmp); state = Declaration; break; } case Unknown: { state = Declaration; break; } } } }
int MappingManager::run() { ScopedFunctor([this] { busy.clear(); }); // cache ports auto conn_port = ConnectionManager::getInstance()->getPort(), secure_port = ConnectionManager::getInstance()->getSecurePort(), search_port = SearchManager::getInstance()->getPort(); if(renewal) { Mapper& mapper = *working; ScopedFunctor([&mapper] { mapper.uninit(); }); if(!mapper.init()) { // can't renew; try again later. renewLater(mapper); return 0; } auto addRule = [this, &mapper](const string& port, Mapper::Protocol protocol, const string& description) { // just launch renewal requests - don't bother with possible failures. if(!port.empty()) { mapper.open(port, protocol, str(boost::format("%1% %2% port (%3% %4%)") % description % port % Mapper::protocols[protocol])); } }; addRule(conn_port, Mapper::PROTOCOL_TCP, "Transfer"); addRule(secure_port, Mapper::PROTOCOL_TCP, "Encrypted transfer"); addRule(search_port, Mapper::PROTOCOL_UDP, "Search"); renewLater(mapper); return 0; } // move the preferred mapper to the top of the stack. const auto& setting = SETTING(MAPPER); for(auto i = mappers.begin(); i != mappers.end(); ++i) { if(i->first == setting) { if(i != mappers.begin()) { auto mapper = *i; mappers.erase(i); mappers.insert(mappers.begin(), mapper); } break; } } for(auto i = mappers.begin(); i != mappers.end(); ++i) { unique_ptr<Mapper> pMapper(i->second(AirUtil::getLocalIp())); Mapper& mapper = *pMapper; ScopedFunctor([&mapper] { mapper.uninit(); }); if(!mapper.init()) { log(str(boost::format("Failed to initalize the %1% interface") % mapper.getName()), LogManager::LOG_WARNING); continue; } auto addRule = [this, &mapper](const string& port, Mapper::Protocol protocol, const string& description) -> bool { if(!port.empty() && !mapper.open(port, protocol, str(boost::format("%1% %2% port (%3% %4%)") % APPNAME % description % port % Mapper::protocols[protocol]))) { this->log(str(boost::format("Failed to map the %1% port (%2% %3%) with the %4% interface") % description % port % Mapper::protocols[protocol] % mapper.getName()), LogManager::LOG_WARNING); mapper.close(); return false; } return true; }; if(!(addRule(conn_port, Mapper::PROTOCOL_TCP, "Transfer") && addRule(secure_port, Mapper::PROTOCOL_TCP, "Encrypted transfer") && addRule(search_port, Mapper::PROTOCOL_UDP, "Search"))) continue; log(str(boost::format("Successfully created port mappings (Transfers: %1%, Encrypted transfers: %2%, Search: %3%) on the %4% device with the %5% interface") % conn_port % secure_port % search_port % deviceString(mapper) % mapper.getName()), LogManager::LOG_INFO); working = move(pMapper); if(!CONNSETTING(NO_IP_OVERRIDE)) { string externalIP = mapper.getExternalIP(); if(!externalIP.empty()) { ConnectivityManager::getInstance()->set(SettingsManager::EXTERNAL_IP, externalIP); } else { // no cleanup because the mappings work and hubs will likely provide the correct IP. log("Failed to get external IP", LogManager::LOG_WARNING); } } ConnectivityManager::getInstance()->mappingFinished(mapper.getName()); renewLater(mapper); break; } if(!getOpened()) { log(str(boost::format("Failed to create port mappings")), LogManager::LOG_ERROR); ConnectivityManager::getInstance()->mappingFinished(Util::emptyString); } return 0; }
void UpdateManager::completeVersionDownload(bool manualCheck) { auto& conn = conns[CONN_VERSION]; if(!conn) { return; } ScopedFunctor([&conn] { conn.reset(); }); if (conn->buf.empty()) { failVersionDownload(STRING_F(DOWNLOAD_VERSION_FAILED, conn->status), manualCheck); return; } bool verified = !versionSig.empty() && UpdateManager::verifyVersionData(conn->buf, versionSig); if(!verified) { failVersionDownload(STRING(VERSION_VERIFY_FAILED), manualCheck); } try { SimpleXML xml; xml.fromXML(conn->buf); xml.stepIn(); //Check for updated HTTP links if(xml.findChild("Links")) { xml.stepIn(); if(xml.findChild("Homepage")) { links.homepage = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("Downloads")) { links.downloads = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("GeoIPv6")) { links.geoip6 = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("GeoIPv4")) { links.geoip4 = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("Customize")) { links.customize = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("Forum")) { links.discuss = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("Languages")) { links.language = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("Guides")) { links.guides = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("IPCheck")) { links.ipcheck4 = xml.getChildData(); } xml.resetCurrentChild(); if(xml.findChild("IPCheck6")) { links.ipcheck6 = xml.getChildData(); } xml.stepOut(); } xml.resetCurrentChild(); updater->onVersionDownloaded(xml, verified, manualCheck); } catch (const Exception& e) { failVersionDownload(STRING_F(VERSION_PARSING_FAILED, e.getError()), manualCheck); } checkAdditionalUpdates(manualCheck); }