From d886b377ac168d32668b5f3d145279a4f64de730 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Mon, 23 Jan 2017 15:42:14 +0100 Subject: URL blocking --- src/mainwindow.cpp | 2 ++ src/mainwindow.h | 1 + src/smolbote.pro | 8 ++++-- src/webengine/adblockinterceptor.cpp | 56 ++++++++++++++++++++++++++++++++++++ src/webengine/adblockinterceptor.h | 25 ++++++++++++++++ src/webengine/adblockrule.cpp | 12 ++++++++ src/webengine/adblockrule.h | 24 ++++++++++++++++ test/blocklist.txt | 14 +++++++++ 8 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 src/webengine/adblockinterceptor.cpp create mode 100644 src/webengine/adblockinterceptor.h create mode 100644 src/webengine/adblockrule.cpp create mode 100644 src/webengine/adblockrule.h create mode 100644 test/blocklist.txt diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6985292..3f23448 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -137,6 +137,8 @@ void MainWindow::loadProfile(const QString &name) profile = new WebEngineProfile(profileName, this); } + AdBlockInterceptor *interceptor = new AdBlockInterceptor(this); + profile->setRequestInterceptor(interceptor); connect(profile, SIGNAL(downloadRequested(QWebEngineDownloadItem*)), downloadManager, SLOT(addDownload(QWebEngineDownloadItem*))); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 63ff93a..0b01783 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -29,6 +29,7 @@ #include #include "widgets/webviewtabbar.h" #include "forms/downloaddialog.h" +#include "webengine/adblockinterceptor.h" namespace Ui { class MainWindow; diff --git a/src/smolbote.pro b/src/smolbote.pro index bf7a05d..d7505c8 100644 --- a/src/smolbote.pro +++ b/src/smolbote.pro @@ -19,7 +19,9 @@ SOURCES += main.cpp \ forms/profiledialog.cpp \ webengine/webengineprofile.cpp \ forms/downloaddialog.cpp \ - webengine/downloaditemform.cpp + webengine/downloaditemform.cpp \ + webengine/adblockinterceptor.cpp \ + webengine/adblockrule.cpp HEADERS += mainwindow.h \ browser.h \ @@ -28,7 +30,9 @@ HEADERS += mainwindow.h \ forms/profiledialog.h \ webengine/webengineprofile.h \ forms/downloaddialog.h \ - webengine/downloaditemform.h + webengine/downloaditemform.h \ + webengine/adblockinterceptor.h \ + webengine/adblockrule.h FORMS += mainwindow.ui \ forms/profiledialog.ui \ diff --git a/src/webengine/adblockinterceptor.cpp b/src/webengine/adblockinterceptor.cpp new file mode 100644 index 0000000..02bf2f4 --- /dev/null +++ b/src/webengine/adblockinterceptor.cpp @@ -0,0 +1,56 @@ +#include "adblockinterceptor.h" + +#include +#include + +AdBlockInterceptor::AdBlockInterceptor(QObject *parent) : + QWebEngineUrlRequestInterceptor(parent) +{ + loadSubscription("blocklist.txt"); +} + +void AdBlockInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) +{ + bool blocked = false; + for(AdBlockRule *rule : m_urlBlacklist) { + if(rule->match(info.requestUrl())) { + info.block(true); + blocked = true; + } + } + + qDebug("%i %i %i %s %s", blocked, info.navigationType(), info.resourceType(), qUtf8Printable(info.requestMethod()), qUtf8Printable(info.requestUrl().toString())); +} + +int AdBlockInterceptor::loadSubscription(const QString &subpath) +{ + QFile subfile(subpath); + if(!subfile.open(QIODevice::ReadOnly | QIODevice::Text)) { + qDebug("AdBlockInterceptor: cannot load subscription: %s", qUtf8Printable(subpath)); + return -1; + } + + QTextStream subscription(&subfile); + + QString header = subscription.readLine(); + if(header != "[Adblock Plus 2.0]") { + qDebug("AdBlockInterceptor: invalid format of subscription: %s", qUtf8Printable(subpath)); + return -1; + } + + int rules = 0; + + while(!subscription.atEnd()) { + QString line = subscription.readLine(); + if(!line.isEmpty() && !line.startsWith('!')) { + // The line is not a comment + AdBlockRule *rule = new AdBlockRule(line, this); + m_urlBlacklist.append(rule); + rules++; + } + } + + qDebug("Loaded %i rules from subscription %s", rules, qUtf8Printable(subpath)); + + return rules; +} diff --git a/src/webengine/adblockinterceptor.h b/src/webengine/adblockinterceptor.h new file mode 100644 index 0000000..061b626 --- /dev/null +++ b/src/webengine/adblockinterceptor.h @@ -0,0 +1,25 @@ +#ifndef ADBLOCKINTERCEPTOR_H +#define ADBLOCKINTERCEPTOR_H + +#include +#include "adblockrule.h" + +class AdBlockInterceptor : public QWebEngineUrlRequestInterceptor +{ + Q_OBJECT +public: + explicit AdBlockInterceptor(QObject *parent = 0); + + void interceptRequest(QWebEngineUrlRequestInfo &info); + + int loadSubscription(const QString &subpath); + +signals: + +public slots: + +private: + QList m_urlBlacklist; +}; + +#endif // ADBLOCKINTERCEPTOR_H diff --git a/src/webengine/adblockrule.cpp b/src/webengine/adblockrule.cpp new file mode 100644 index 0000000..fe3e64e --- /dev/null +++ b/src/webengine/adblockrule.cpp @@ -0,0 +1,12 @@ +#include "adblockrule.h" + +AdBlockRule::AdBlockRule(QString rule, QObject *parent) : + QObject(parent) +{ + ruleExpression.setPattern(rule); +} + +bool AdBlockRule::match(const QUrl &url) +{ + return ruleExpression.match(url.toString()).hasMatch(); +} diff --git a/src/webengine/adblockrule.h b/src/webengine/adblockrule.h new file mode 100644 index 0000000..8c68de7 --- /dev/null +++ b/src/webengine/adblockrule.h @@ -0,0 +1,24 @@ +#ifndef ADBLOCKRULE_H +#define ADBLOCKRULE_H + +#include +#include +#include + +class AdBlockRule : public QObject +{ + Q_OBJECT +public: + explicit AdBlockRule(QString rule, QObject *parent = 0); + + bool match(const QUrl &url); + +signals: + +public slots: + +private: + QRegularExpression ruleExpression; +}; + +#endif // ADBLOCKRULE_H diff --git a/test/blocklist.txt b/test/blocklist.txt new file mode 100644 index 0000000..a66bee5 --- /dev/null +++ b/test/blocklist.txt @@ -0,0 +1,14 @@ +[Adblock Plus 2.0] +! Version: 201701171603 +! Title: EasyList +! Last modified: 17 Jan 2017 16:03 UTC +! Expires: 4 days (update frequency) +! Homepage: https://easylist.to/ +! Licence: https://easylist.to/pages/licence.html +! +! Please report any unblocked adverts or problems +! in the forums (https://forums.lanik.us/) +! or via e-mail (easylist.subscription@gmail.com). +! +! -----------------------General advert blocking filters-----------------------! +css -- cgit v1.2.1