aboutsummaryrefslogtreecommitdiff
path: root/lib/urlfilter/hostlist
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2019-01-09 19:38:58 +0100
committerAqua-sama <aqua@iserlohn-fortress.net>2019-01-09 19:38:58 +0100
commit3d2ae07c455c0e423c64f19e445518427a5684fa (patch)
tree58f6b47c3db33658a6f2e605fd021f08d1fa9964 /lib/urlfilter/hostlist
parentAdd assorted unfished doc files to repo (diff)
downloadsmolbote-3d2ae07c455c0e423c64f19e445518427a5684fa.tar.xz
Rewrite lib/urlfilter
- Make HostList and AdBlockList implementations independent from each other - Move urlfilter tests to lib/urlfilter
Diffstat (limited to 'lib/urlfilter/hostlist')
-rw-r--r--lib/urlfilter/hostlist/hostlist.cpp79
-rw-r--r--lib/urlfilter/hostlist/hostlist.h44
2 files changed, 123 insertions, 0 deletions
diff --git a/lib/urlfilter/hostlist/hostlist.cpp b/lib/urlfilter/hostlist/hostlist.cpp
new file mode 100644
index 0000000..ec0b214
--- /dev/null
+++ b/lib/urlfilter/hostlist/hostlist.cpp
@@ -0,0 +1,79 @@
+/*
+ * 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://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#include "hostlist.h"
+#include <QIODevice>
+#include <QTextStream>
+#include <QDebug>
+
+HostList::HostList(QIODevice *device)
+{
+ Q_ASSERT(device->isOpen());
+
+ QTextStream list(device);
+ while (!list.atEnd()) {
+ parseLine(list.readLine());
+ }
+
+ qDebug() << m_metadata;
+}
+
+QString HostList::metadata(const QString& key) const
+{
+ return m_metadata.value(key);
+}
+
+int HostList::ruleCount() const
+{
+ return rules.size();
+}
+
+std::pair<UrlFilter::MatchResult, QString> HostList::match(const QUrl& firstParty, const QUrl& requestUrl, QWebEngineUrlRequestInfo::ResourceType type) const
+{
+ Q_UNUSED(firstParty);
+ Q_UNUSED(type);
+
+ const QString domain = requestUrl.host();
+ const uint domainHash = qHash(domain);
+
+ for(const Rule &r : rules) {
+ if(r.domainHash == domainHash)
+ return std::make_pair(r.action, r.redirect);
+ }
+
+ return std::make_pair(UrlFilter::NotMatched, QString());
+}
+
+void HostList::parseLine(const QString& line)
+{
+ // check comment
+ if(line.startsWith(QLatin1Literal("#")))
+ return;
+
+ QString parsedLine = line.trimmed();
+
+ // malformed rule
+ if(!parsedLine.contains(QLatin1Literal(" ")))
+ return;
+
+ const QStringList parts = parsedLine.split(QLatin1Literal(" "));
+ const QString redirect = parts.at(0);
+ const auto action = (redirect == QLatin1Literal("0.0.0.0")) ? UrlFilter::Block : UrlFilter::Redirect;
+
+ for(int i = 1; i < parts.size(); i++) {
+ const QString domain = parts.at(i);
+ Rule r;
+ r.action = action;
+ r.domainHash = qHash(domain);
+ if(action == UrlFilter::Redirect)
+ r.redirect = redirect;
+
+ rules.emplace_back(std::move(r));
+ }
+}
+
diff --git a/lib/urlfilter/hostlist/hostlist.h b/lib/urlfilter/hostlist/hostlist.h
new file mode 100644
index 0000000..d4a8d87
--- /dev/null
+++ b/lib/urlfilter/hostlist/hostlist.h
@@ -0,0 +1,44 @@
+/*
+ * 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://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#ifndef SMOLBOTE_URLFILTER_HOSTLIST
+#define SMOLBOTE_URLFILTER_HOSTLIST
+
+#include "urlfilter.h"
+#include <QHash>
+#include <vector>
+#include <QWebEngineUrlRequestInfo>
+
+class QIODevice;
+class HostList : public UrlFilter
+{
+public:
+
+ HostList(QIODevice *device);
+ ~HostList() = default;
+
+ QString metadata(const QString &key) const override;
+ int ruleCount() const;
+ std::pair<MatchResult, QString> match(const QUrl &firstParty, const QUrl &requestUrl, QWebEngineUrlRequestInfo::ResourceType type) const override;
+
+protected:
+ void parseLine(const QString &line);
+
+private:
+ QHash<QString, QString> m_metadata;
+
+ struct Rule {
+ UrlFilter::MatchResult action = UrlFilter::NotMatched;
+ uint domainHash;
+ QString redirect;
+ };
+
+ std::vector<Rule> rules;
+};
+
+#endif // SMOLBOTE_URLFILTER_HOSTLIST