aboutsummaryrefslogtreecommitdiff
path: root/src/webengine
diff options
context:
space:
mode:
Diffstat (limited to 'src/webengine')
-rw-r--r--src/webengine/blockerrule.cpp210
-rw-r--r--src/webengine/blockerrule.h84
-rw-r--r--src/webengine/blockersubscription.cpp145
-rw-r--r--src/webengine/blockersubscription.h67
-rw-r--r--src/webengine/regexp.cpp68
-rw-r--r--src/webengine/regexp.h35
-rw-r--r--src/webengine/urlinterceptor.cpp23
-rw-r--r--src/webengine/urlinterceptor.h6
8 files changed, 6 insertions, 632 deletions
diff --git a/src/webengine/blockerrule.cpp b/src/webengine/blockerrule.cpp
deleted file mode 100644
index 79669b9..0000000
--- a/src/webengine/blockerrule.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-/** LICENSE ********************************************************************
- **
- ** smolbote: yet another qute browser
- ** Copyright (C) 2017 Xian Nox
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- **
- ******************************************************************************/
-
-#include "blockerrule.h"
-
-/* AdBlock filter reference
- * https://adblockplus.org/en/filters
- * https://adblockplus.org/en/filter-cheatsheet
- */
-
-BlockerRule::BlockerRule(QString rule, QObject *parent) :
- QObject(parent)
-{
- QString pattern = rule;
-
- // Empty rule or comment
- if(pattern.trimmed().isEmpty() || pattern.startsWith("!")) {
- m_type = RuleType::Invalid;
- return;
- }
-
- // Ignore element hiding rules for now
- if(pattern.contains("##") || pattern.contains("#@#")) {
- m_type = RuleType::Invalid;
- return;
- }
-
- // Exception
- if(pattern.startsWith("@@")) {
- m_exception = true;
- pattern.remove(0, 2);
- }
-
- // Options
- if(pattern.contains("$")) {
- QString opts = pattern.mid(pattern.indexOf("$")+1);
- for(QString opt : opts.split(',')) {
- if(opt.endsWith("script")) {
- if(opt.startsWith("~")) {
- m_whitelistOptions.setFlag(RuleOption::script, true);
- } else {
- m_blacklistOptions.setFlag(RuleOption::script, true);
- }
- } else if(opt.endsWith("image")) {
- if(opt.startsWith("~")) {
- m_whitelistOptions.setFlag(RuleOption::image, true);
- } else {
- m_blacklistOptions.setFlag(RuleOption::image, true);
- }
- } else if(opt.endsWith("stylesheet")) {
- if(opt.startsWith("~")) {
- m_whitelistOptions.setFlag(RuleOption::stylesheet, true);
- } else {
- m_blacklistOptions.setFlag(RuleOption::stylesheet, true);
- }
- } else if(opt.endsWith("object")) {
- if(opt.startsWith("~")) {
- m_whitelistOptions.setFlag(RuleOption::object, true);
- } else {
- m_blacklistOptions.setFlag(RuleOption::object, true);
- }
- } else if(opt.endsWith("object-subrequest")) {
- if(opt.startsWith("~")) {
- m_whitelistOptions.setFlag(RuleOption::objectsubrequest, true);
- } else {
- m_blacklistOptions.setFlag(RuleOption::objectsubrequest, true);
- }
- } else if(opt.endsWith("subdocument")) {
- if(opt.startsWith("~")) {
- m_whitelistOptions.setFlag(RuleOption::subdocument, true);
- } else {
- m_blacklistOptions.setFlag(RuleOption::subdocument, true);
- }
- }
- }
-
- pattern.remove(pattern.indexOf("$"), pattern.length());
- }
-
- // Regular expression
- if(rule.startsWith("/") && rule.endsWith("/")) {
- m_type = RuleType::RegularExpressionMatch;
- ruleExpression.setPattern(pattern);
- return;
- }
-
- // Domain rules
- if(pattern.startsWith("||")) {
- pattern.remove(0, 2);
- // find the end point for the domain
- int end = pattern.indexOf(QRegularExpression("(?:[^\\w\\d\\_\\-\\.\\%]|$)"), 0);
- domainExpression.setPattern(pattern.mid(0, end));
- pattern.remove(0, end+1);
- } else if(pattern.startsWith("|") && pattern.endsWith("|")) {
- pattern.remove(0, 1);
- pattern.chop(1);
- domainExpression.setPattern(pattern);
- } else {
- domainExpression.setPattern(".*");
- }
-
- // Regular rule
- ruleExpression.setWildcardPattern(pattern);
- m_type = RuleType::RegularExpressionMatch;
-}
-
-bool BlockerRule::match(const QWebEngineUrlRequestInfo &info)
-{
- switch (m_type) {
- case RuleType::Invalid:
- break;
-
- case RuleType::RegularExpressionMatch:
- if(domainExpression.match(info.requestUrl().host())) {
- if(ruleExpression.match(info.requestUrl().toString())) {
- if(matchOptions(info, m_whitelistOptions)) {
- return false;
- }
- if(matchOptions(info, m_blacklistOptions)) {
- return true;
- }
- return true;
- }
- }
- break;
- }
-
- return false;
-}
-
-bool BlockerRule::isValid()
-{
- if(m_type == RuleType::Invalid) {
- return false;
- } else {
- return true;
- }
-}
-bool BlockerRule::isException()
-{
- return m_exception;
-}
-
-QString BlockerRule::toString() const
-{
- return QString("On [%1]: %2 %3").arg(domainExpression.pattern()).arg(ruleExpression.pattern()).arg(QString::number(m_blacklistOptions, 2));
-}
-
-bool BlockerRule::matchOptions(const QWebEngineUrlRequestInfo &info, const RuleOptions &options)
-{
- // no options are defined
- if(options == 0) {
- return false;
- }
-
- bool ret = false;
- switch (info.resourceType()) {
- case QWebEngineUrlRequestInfo::ResourceTypeScript:
- if(options.testFlag(RuleOption::script)) {
- ret = true;
- }
- break;
- case QWebEngineUrlRequestInfo::ResourceTypeImage:
- if(options.testFlag(RuleOption::image)) {
- ret = true;
- }
- break;
- case QWebEngineUrlRequestInfo::ResourceTypeStylesheet:
- if(options.testFlag(RuleOption::stylesheet)) {
- ret = true;
- }
- break;
- case QWebEngineUrlRequestInfo::ResourceTypeObject:
- if(options.testFlag(RuleOption::object)) {
- ret = true;
- }
- break;
- case QWebEngineUrlRequestInfo::ResourceTypePluginResource:
- if(options.testFlag(RuleOption::objectsubrequest)) {
- ret = true;
- }
- break;
- case QWebEngineUrlRequestInfo::ResourceTypeSubFrame:
- if(options.testFlag(RuleOption::subdocument)) {
- ret = true;
- }
- break;
- default:
- break;
- }
-
- return ret;
-}
diff --git a/src/webengine/blockerrule.h b/src/webengine/blockerrule.h
deleted file mode 100644
index bdb2eb9..0000000
--- a/src/webengine/blockerrule.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/** LICENSE ********************************************************************
- **
- ** smolbote: yet another qute browser
- ** Copyright (C) 2017 Xian Nox
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- **
- ******************************************************************************/
-
-#ifndef ADBLOCKRULE_H
-#define ADBLOCKRULE_H
-
-#include <QObject>
-#include <QUrl>
-#include "regexp.h"
-#include <QWebEngineUrlRequestInfo>
-
-class BlockerRule : public QObject
-{
- Q_OBJECT
-public:
- enum RuleType {
- Invalid,
- RegularExpressionMatch
- };
-
- enum RuleOption {
- script = 1,
- image = 2,
- stylesheet = 4,
- object = 8,
- xmlhttprequest = 16,
- objectsubrequest = 32,
- subdocument = 64,
- ping = 128,
- websocket = 256,
- document = 512,
-
- elemhide = 1024,
- generichide = 2048,
- genericblock = 4096,
-
- other = 8192
- };
-
- Q_DECLARE_FLAGS(RuleOptions, RuleOption)
-
- explicit BlockerRule(QString rule, QObject *parent = 0);
-
- bool match(const QWebEngineUrlRequestInfo &info);
- bool isValid();
- bool isException();
- QString toString() const;
-
-signals:
-
-public slots:
-
-private:
- bool matchOptions(const QWebEngineUrlRequestInfo &info, const RuleOptions &options);
-
- RuleType m_type;
- bool m_exception = false;
- QStringList hostsBlacklist;
- QStringList hostsWhitelist;
- RegExp domainExpression;
- RegExp ruleExpression;
-
- RuleOptions m_blacklistOptions;
- RuleOptions m_whitelistOptions;
-};
-
-#endif // ADBLOCKRULE_H
diff --git a/src/webengine/blockersubscription.cpp b/src/webengine/blockersubscription.cpp
deleted file mode 100644
index 40d3e9f..0000000
--- a/src/webengine/blockersubscription.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/** LICENSE ********************************************************************
- **
- ** smolbote: yet another qute browser
- ** Copyright (C) 2017 Xian Nox
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- **
- ******************************************************************************/
-
-#include "blockersubscription.h"
-
-#include <QFile>
-#include <QTextStream>
-
-BlockerSubscription::BlockerSubscription(QObject *parent) :
- QObject(parent)
-{
-}
-
-int BlockerSubscription::loadFromFile(const QString &file)
-{
- QFile subfile(file);
- if(!subfile.open(QIODevice::ReadOnly | QIODevice::Text)) {
- qDebug("Cannot open subscription: %s", qUtf8Printable(file));
- return -1;
- }
-
- QTextStream subscription(&subfile);
-
- QString header = subscription.readLine();
- if(header != "[Adblock Plus 2.0]") {
- qDebug("Invalid format of subscription: %s", qUtf8Printable(file));
- return -1;
- }
-
- // clear all lists
- m_urlBlacklist.clear();
- m_urlWhitelist.clear();
- int rules = 0;
-
- while(!subscription.atEnd()) {
- QString line = subscription.readLine();
- if(!line.isEmpty()) {
- if(line.startsWith('!')) {
- parseComment(line);
- } else {
- // The line is not a comment
-
- rules++;
- BlockerRule *rule = new BlockerRule(line, this);
-
- if(rule->isValid()) {
- if(rule->isException()) {
- m_urlWhitelist.append(rule);
- } else {
- m_urlBlacklist.append(rule);
- }
- }
-
- }
- }
- }
-
- qDebug("Loaded %i/%i rules from subscription %s", m_urlBlacklist.count() + m_urlWhitelist.count(), rules, qUtf8Printable(file));
- return rules;
-}
-
-const QString BlockerSubscription::title()
-{
- return m_title;
-}
-
-const QString BlockerSubscription::homepage()
-{
- return m_homepage;
-}
-
-const QString BlockerSubscription::license()
-{
- return m_license;
-}
-
-const QString BlockerSubscription::version()
-{
- return m_version;
-}
-
-const QDateTime BlockerSubscription::lastModified()
-{
- return m_lastModified;
-}
-
-const QDateTime BlockerSubscription::expires()
-{
- return m_expires;
-}
-
-const QList<BlockerRule*> BlockerSubscription::urlBlacklist()
-{
- return m_urlBlacklist;
-}
-
-const QList<BlockerRule*> BlockerSubscription::urlWhitelist()
-{
- return m_urlWhitelist;
-}
-
-void BlockerSubscription::parseComment(const QString &line)
-{
- if(line.startsWith("! Title: ")) {
- m_title = line.right(line.length() - 9);
- return;
- }
- if(line.startsWith("! Homepage: ")) {
- m_homepage = line.right(line.length() - 12);
- return;
- }
- if(line.startsWith("! Licence: ")) {
- m_license = line.right(line.length() - 11);
- return;
- }
- if(line.startsWith("! Version: ")) {
- m_version = line.right(line.length() - 11);
- return;
- }
- if(line.startsWith("! Last modified: ")) {
- m_lastModified = QDateTime::fromString(line.right(line.length() - 17), Qt::RFC2822Date);
- return;
- }
- if(line.startsWith("! Expires: ")) {
- m_expires = m_lastModified.addDays(line.right(line.length() - 11).left(2).toInt());
- return;
- }
-}
diff --git a/src/webengine/blockersubscription.h b/src/webengine/blockersubscription.h
deleted file mode 100644
index b8e3b9a..0000000
--- a/src/webengine/blockersubscription.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/** LICENSE ********************************************************************
- **
- ** smolbote: yet another qute browser
- ** Copyright (C) 2017 Xian Nox
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- **
- ******************************************************************************/
-
-#ifndef URLINTERCEPTORSUBSCRIPTION_H
-#define URLINTERCEPTORSUBSCRIPTION_H
-
-#include <QObject>
-#include <QDateTime>
-#include "blockerrule.h"
-
-class BlockerSubscription : public QObject
-{
- Q_OBJECT
-public:
- explicit BlockerSubscription(QObject *parent = 0);
-
- int loadFromFile(const QString &file);
-
- const QString title();
- const QString homepage();
- const QString license();
- const QString version();
- const QDateTime lastModified();
- const QDateTime expires();
-
- const QList<BlockerRule*> urlBlacklist();
- const QList<BlockerRule*> urlWhitelist();
-
-signals:
-
-public slots:
-
-private:
- void parseComment(const QString &line);
-
- QString m_title;
- QString m_homepage;
- QString m_license;
-
- QString m_version;
- QDateTime m_lastModified;
- QDateTime m_expires;
-
- QList<BlockerRule*> m_urlWhitelist; // exception rules
- QList<BlockerRule*> m_urlBlacklist; // block rules
- // element exceptions
- // element blocking
-};
-
-#endif // URLINTERCEPTORSUBSCRIPTION_H
diff --git a/src/webengine/regexp.cpp b/src/webengine/regexp.cpp
deleted file mode 100644
index 4a5878a..0000000
--- a/src/webengine/regexp.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/** LICENSE ********************************************************************
- **
- ** smolbote: yet another qute browser
- ** Copyright (C) 2017 Xian Nox
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- **
- ******************************************************************************/
-
-#include "regexp.h"
-
-RegExp::RegExp() :
- QRegularExpression()
-{
-}
-
-bool RegExp::match(const QString &subject, int offset, MatchType matchType, MatchOptions matchOptions) const
-{
- if(pattern().isEmpty()) {
- return true;
- }
- return QRegularExpression::match(subject, offset, matchType, matchOptions).hasMatch();
-}
-
-void RegExp::setWildcardPattern(const QString &pattern)
-{
- QString parsed;
-
- for(int i=0; i<pattern.length(); i++) {
- const QChar c = pattern.at(i);
- switch (c.toLatin1()) {
- case '*':
- // remove * at the start and end
- if(i != 0 && i != pattern.length()-1) {
- parsed.append(".*");
- }
- break;
- case '^':
- parsed.append("(?:[^\\w\\d\\_\\-\\.\\%]|$)");
- break;
- case '|':
- if(i == 0) {
- // beginning of string
- parsed.append('^');
- } else {
- // end of string
- parsed.append('$');
- }
- break;
- default:
- parsed.append(c);
- break;
- }
- }
-
- setPattern(parsed);
-}
diff --git a/src/webengine/regexp.h b/src/webengine/regexp.h
deleted file mode 100644
index d66a98d..0000000
--- a/src/webengine/regexp.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/** LICENSE ********************************************************************
- **
- ** smolbote: yet another qute browser
- ** Copyright (C) 2017 Xian Nox
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- **
- ******************************************************************************/
-
-#ifndef REGEXP_H
-#define REGEXP_H
-
-#include <QRegularExpression>
-
-class RegExp : public QRegularExpression
-{
-public:
- explicit RegExp();
-
- bool match(const QString &subject, int offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const;
- void setWildcardPattern(const QString &pattern);
-};
-
-#endif // REGEXP_H
diff --git a/src/webengine/urlinterceptor.cpp b/src/webengine/urlinterceptor.cpp
index 9352af6..3c6a56e 100644
--- a/src/webengine/urlinterceptor.cpp
+++ b/src/webengine/urlinterceptor.cpp
@@ -27,27 +27,10 @@ UrlRequestInterceptor::UrlRequestInterceptor(QObject *parent) :
void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info)
{
- for(BlockerRule *rule : m_sub->urlWhitelist()) {
- if(rule->match(info)) {
- qDebug("OK %i %s", info.resourceType(), qUtf8Printable(info.requestUrl().toString()));
- return;
- }
- }
-
- for(BlockerRule *rule : m_sub->urlBlacklist()) {
- if(rule->match(info)) {
- info.block(true);
- qDebug(" %i %s", info.resourceType(), qUtf8Printable(info.requestUrl().toString()));
- return;
- }
- }
-
- // rule is neither in whitelist nor blacklist
- qDebug("OK %i %s", info.resourceType(), qUtf8Printable(info.requestUrl().toString()));
-
+ //
}
-void UrlRequestInterceptor::setSubscription(BlockerSubscription *subscription)
+void UrlRequestInterceptor::setSubscription(BlockerManager *subscription)
{
- m_sub = subscription;
+ m_blocker = subscription;
}
diff --git a/src/webengine/urlinterceptor.h b/src/webengine/urlinterceptor.h
index 0f9fe65..00fe666 100644
--- a/src/webengine/urlinterceptor.h
+++ b/src/webengine/urlinterceptor.h
@@ -22,7 +22,7 @@
#define ADBLOCKINTERCEPTOR_H
#include <QWebEngineUrlRequestInterceptor>
-#include "blockersubscription.h"
+#include "blocker/blockermanager.h"
class UrlRequestInterceptor : public QWebEngineUrlRequestInterceptor
{
@@ -31,14 +31,14 @@ public:
explicit UrlRequestInterceptor(QObject *parent = 0);
void interceptRequest(QWebEngineUrlRequestInfo &info);
- void setSubscription(BlockerSubscription *subscription);
+ void setSubscription(BlockerManager *subscription);
signals:
public slots:
private:
- BlockerSubscription *m_sub;
+ BlockerManager *m_blocker;
};
#endif // ADBLOCKINTERCEPTOR_H