From 5e0042a51d18eba0c1ce75889960e86f6e996b62 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sun, 22 Nov 2020 21:54:01 +0200 Subject: Hostlist filter plugin can rewrite hostnames skip clazy warnings in tests --- plugins/HostlistFilter/filterlist.h | 64 ++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 19 deletions(-) (limited to 'plugins/HostlistFilter/filterlist.h') 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 +#include #include namespace Hostlist { +void parseRule(const QString &line, QStringList &blocked, QHash &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 parseRule(const QString &line); private: - std::map rules; + QStringList blocked; + QHash redirected; }; } // namespace Hostlist + +#endif // SMOLBOTE_HOSTLIST_FILTERLIST -- cgit v1.2.1