aboutsummaryrefslogtreecommitdiff
path: root/src/webengine/urlinterceptor.cpp
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2018-07-24 12:09:07 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2018-07-24 21:10:35 +0200
commite53906ccae7610b00ee12c3c0c45710907d7ff81 (patch)
tree72edeacf356e0d4bd7966db7e0ca26b5df64a87a /src/webengine/urlinterceptor.cpp
parentAdBlockRule: move matching logic to FilterRule (diff)
downloadsmolbote-e53906ccae7610b00ee12c3c0c45710907d7ff81.tar.xz
UrlRequestInterceptor: add filter rules
Diffstat (limited to 'src/webengine/urlinterceptor.cpp')
-rw-r--r--src/webengine/urlinterceptor.cpp47
1 files changed, 36 insertions, 11 deletions
diff --git a/src/webengine/urlinterceptor.cpp b/src/webengine/urlinterceptor.cpp
index a66ab57..cf50e59 100644
--- a/src/webengine/urlinterceptor.cpp
+++ b/src/webengine/urlinterceptor.cpp
@@ -7,12 +7,34 @@
*/
#include "urlinterceptor.h"
+#include "web/urlfilter/adblockrule.h"
#include <QDir>
+#include <QJsonArray>
+#include <QJsonDocument>
#include <QTextStream>
-#include <configuration/configuration.h>
#include <boost/algorithm/string.hpp>
-#include <QJsonDocument>
-#include <QJsonArray>
+#include <configuration/configuration.h>
+
+inline std::vector<FilterRule> parseAdBlockList(const QString &filename)
+{
+ std::vector<FilterRule> rules;
+ QFile list(filename);
+
+ if(list.open(QIODevice::ReadOnly | QIODevice::Text), true) {
+ QTextStream l(&list);
+ QString line;
+ while(l.readLineInto(&line)) {
+ AdBlockRule rule(line);
+ if(rule.isEnabled()) {
+ rules.emplace_back(std::move(rule));
+ //qDebug("added rule: %s", qUtf8Printable(line));
+ }
+ }
+ list.close();
+ }
+
+ return rules;
+}
UrlRequestInterceptor::UrlRequestInterceptor(const std::unique_ptr<Configuration> &config, QObject *parent)
: QWebEngineUrlRequestInterceptor(parent)
@@ -39,8 +61,9 @@ UrlRequestInterceptor::UrlRequestInterceptor(const std::unique_ptr<Configuration
}
}
-
-
+ auto filtersPath = config->value<QString>("filter.adblock");
+ if(filtersPath)
+ filters = std::move(parseAdBlockList(filtersPath.value()));
}
// test DNT on https://browserleaks.com/donottrack
@@ -55,14 +78,16 @@ void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info)
return;
}
+ for(const FilterRule &rule : filters) {
+ if(rule.matchesDomain(info.firstPartyUrl().host()) && rule.matchesType(info.resourceType()) && rule.matchesUrl(info.requestUrl())) {
+ info.block(rule.isBlocking());
#ifdef QT_DEBUG
-// qDebug("request>>>");
-// qDebug("firstParty url=%s", qUtf8Printable(info.firstPartyUrl().toString()));
-// qDebug("firstParty host=%s", qUtf8Printable(info.firstPartyUrl().host()));
-// qDebug("request url=%s", qUtf8Printable(info.requestUrl().toString()));
-// qDebug("request host=%s", qUtf8Printable(info.requestUrl().host()));
-// qDebug("<<<");
+ qDebug("--> blocked %s", qUtf8Printable(info.requestUrl().toString()));
+ qDebug("- %s", qUtf8Printable(rule.toString()));
#endif
+ break;
+ }
+ }
}
QHash<QString, UrlRequestInterceptor::HostRule> parse(const QString &filename)