aboutsummaryrefslogtreecommitdiff
path: root/plugins/HostlistFilter/filterlist.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/HostlistFilter/filterlist.h')
-rw-r--r--plugins/HostlistFilter/filterlist.h64
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