/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://library.iserlohn-fortress.net/aqua/smolbote.git * * SPDX-License-Identifier: GPL-3.0 */ #ifndef SMOLBOTE_HOSTLIST_FILTERLIST #define SMOLBOTE_HOSTLIST_FILTERLIST #include #include namespace Hostlist { void parseRule(const QString &line, QStringList &blocked, QHash &redirected); class Filterlist final : public FilterList { public: Filterlist() = default; Filterlist(const Filterlist &) = delete; Filterlist &operator=(const Filterlist &) = delete; ~Filterlist() = default; enum Match { NotFound, Block, Redirect }; [[nodiscard]] Match findMatch(QUrl &url) const { const auto domain = url.host(); if(blocked.contains(domain)) return Block; const auto iter = redirected.find(domain); if(iter != redirected.end()) { url.setHost(iter.value()); return Redirect; } return NotFound; } [[nodiscard]] auto count() const { return blocked.size() + redirected.size(); } [[nodiscard]] bool filter(QWebEngineUrlRequestInfo &info) const { auto url = info.requestUrl(); switch(findMatch(url)) { case NotFound: return false; case Block: info.block(true); return true; case Redirect: info.block(false); info.redirect(url); return true; } } [[nodiscard]] bool isUpToDate() const { return true; } bool load(QIODevice &device); private: QStringList blocked; QHash redirected; }; } // namespace Hostlist #endif // SMOLBOTE_HOSTLIST_FILTERLIST