diff options
Diffstat (limited to 'src/webengine')
-rw-r--r-- | src/webengine/blockerrule.cpp | 210 | ||||
-rw-r--r-- | src/webengine/blockerrule.h | 84 | ||||
-rw-r--r-- | src/webengine/blockersubscription.cpp | 145 | ||||
-rw-r--r-- | src/webengine/blockersubscription.h | 67 | ||||
-rw-r--r-- | src/webengine/regexp.cpp | 68 | ||||
-rw-r--r-- | src/webengine/regexp.h | 35 | ||||
-rw-r--r-- | src/webengine/urlinterceptor.cpp | 23 | ||||
-rw-r--r-- | src/webengine/urlinterceptor.h | 6 |
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 |