diff options
Diffstat (limited to 'plugins/HostlistFilter/filterlist.h')
-rw-r--r-- | plugins/HostlistFilter/filterlist.h | 64 |
1 files changed, 45 insertions, 19 deletions
diff --git a/plugins/HostlistFilter/filterlist.h b/plugins/HostlistFilter/filterlist.h index 7301f20..a0fa6f7 100644 --- a/plugins/HostlistFilter/filterlist.h +++ b/plugins/HostlistFilter/filterlist.h @@ -6,53 +6,79 @@ * SPDX-License-Identifier: GPL-3.0 */ -#pragma once +#ifndef SMOLBOTE_HOSTLIST_FILTERLIST +#define SMOLBOTE_HOSTLIST_FILTERLIST -#include <map> +#include <QHash> #include <smolbote/filterinterface.hpp> namespace Hostlist { +void parseRule(const QString &line, QStringList &blocked, QHash<QString, QString> &redirected); + class Filterlist final : public FilterList { public: - typedef uint DomainHash; - struct Rule { - QString domain; - QString redirect; - }; - Filterlist() = default; + Filterlist(const Filterlist &) = delete; + Filterlist &operator=(const Filterlist &) = delete; ~Filterlist() = default; - [[nodiscard]] bool findMatch(const QString &domain) const + enum Match { + NotFound, + Block, + Redirect + }; + + [[nodiscard]] Match findMatch(QUrl &url) const { - const auto hash = qHash(domain, 0); - const auto found = rules.find(hash); - if(found != rules.end()) { - return true; + 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 false; + + return NotFound; } - int count() const + + [[nodiscard]] auto count() const { - return rules.size(); + return blocked.size() + redirected.size(); } [[nodiscard]] bool filter(QWebEngineUrlRequestInfo &info) const { - return false; + 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); - [[nodiscard]] static std::map<DomainHash, Rule> parseRule(const QString &line); private: - std::map<DomainHash, Rule> rules; + QStringList blocked; + QHash<QString, QString> redirected; }; } // namespace Hostlist + +#endif // SMOLBOTE_HOSTLIST_FILTERLIST |