From e25c011d5db32104ccdb3e8949082345efdba805 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Mon, 11 Dec 2017 18:16:50 +0100 Subject: Simple filterlist --- src/filter/filter.cpp | 212 +++----------------------------------------------- src/filter/filter.h | 91 +++++----------------- 2 files changed, 29 insertions(+), 274 deletions(-) (limited to 'src/filter') diff --git a/src/filter/filter.cpp b/src/filter/filter.cpp index fcba05c..1d14f9d 100644 --- a/src/filter/filter.cpp +++ b/src/filter/filter.cpp @@ -19,220 +19,28 @@ ******************************************************************************/ #include "filter.h" +#include -Filter::Filter(const QString &domain, const QString &request, ResourceRules rules, bool shouldBlock, Filter *parentItem) +FilterRule::FilterRule(const QString &line) { - m_parentItem = parentItem; - - m_domainUrl.setPattern(domain); - m_requestUrl.setPattern(request); - m_rules = rules; - m_shouldBlock = shouldBlock; - - m_valid = false; -} - -Filter::~Filter() -{ - qDeleteAll(m_children); + parse(line); } -void Filter::enable() +FilterRule::~FilterRule() { - m_valid = true; -} - -Filter *Filter::parentItem() -{ - return m_parentItem; -} - -void Filter::appendChild(Filter *child) -{ - m_children.append(child); -} - -Filter *Filter::child(int row) -{ - return m_children.value(row); -} - -int Filter::childCount() const -{ - return m_children.count(); -} - -QString Filter::domain() const -{ - return m_domainUrl.pattern(); -} - -QString Filter::request() const -{ - return m_requestUrl.pattern(); -} - -bool Filter::isBlocking() -{ - return m_shouldBlock; -} - -QString Filter::allowedTypes() const -{ - return flags(m_rules.allowed); -} - -QString Filter::blockedTypes() const -{ - return flags(m_rules.blocked); -} - -int Filter::row() const -{ - if(m_parentItem) { - return m_parentItem->m_children.indexOf(const_cast(this)); - } - - return 0; } -bool Filter::hasDomainMatch(const QString &string) +bool FilterRule::shouldBlock(const QUrl &requestUrl) const { - return m_domainUrl.hasMatch(string); -} - -bool Filter::hasRuleMatch(const QString &string) -{ - return m_requestUrl.hasMatch(string); -} - -bool Filter::shouldBlock(const QWebEngineUrlRequestInfo &info) -{ - if(!m_valid) { + if(matcher.indexIn(requestUrl.toString()) == -1) { + // pattern not found in url return false; } - // Check options - switch (info.resourceType()) { - case QWebEngineUrlRequestInfo::ResourceTypeMainFrame: - return testFlag(MainFrame); - case QWebEngineUrlRequestInfo::ResourceTypeSubFrame: - return testFlag(SubFrame); - case QWebEngineUrlRequestInfo::ResourceTypeStylesheet: - return testFlag(Stylesheet); - case QWebEngineUrlRequestInfo::ResourceTypeScript: - return testFlag(Script); - case QWebEngineUrlRequestInfo::ResourceTypeImage: - return testFlag(Image); - case QWebEngineUrlRequestInfo::ResourceTypeFontResource: - return testFlag(Font); - case QWebEngineUrlRequestInfo::ResourceTypeSubResource: - return testFlag(SubResource); - case QWebEngineUrlRequestInfo::ResourceTypeObject: - return testFlag(Object); - case QWebEngineUrlRequestInfo::ResourceTypeMedia: - return testFlag(Media); - case QWebEngineUrlRequestInfo::ResourceTypeWorker: - return testFlag(Worker); - case QWebEngineUrlRequestInfo::ResourceTypeSharedWorker: - return testFlag(SharedWorker); - case QWebEngineUrlRequestInfo::ResourceTypePrefetch: - return testFlag(Prefetch); - case QWebEngineUrlRequestInfo::ResourceTypeFavicon: - return testFlag(Favicon); - case QWebEngineUrlRequestInfo::ResourceTypeXhr: - return testFlag(Xhr); - case QWebEngineUrlRequestInfo::ResourceTypePing: - return testFlag(Ping); - case QWebEngineUrlRequestInfo::ResourceTypeServiceWorker: - return testFlag(ServiceWorker); - case QWebEngineUrlRequestInfo::ResourceTypeCspReport: - return testFlag(CspReport); - case QWebEngineUrlRequestInfo::ResourceTypePluginResource: - return testFlag(PluginResource); - case QWebEngineUrlRequestInfo::ResourceTypeUnknown: - break; - } - - return m_shouldBlock; - + return true; } -bool Filter::isValid() +void FilterRule::parse(const QString &line) { - return m_valid; -} - -bool Filter::testFlag(ResourceType flag) -{ - if(m_rules.allowed.testFlag(flag)) { - return false; - } else if(m_rules.blocked.testFlag(flag)) { - return true; - } else { - return m_shouldBlock; - } -} - -QString Filter::flags(Resources f) const -{ - QStringList r; - if(f.testFlag(MainFrame)) { - r << QObject::tr("Main Frame"); - } - if(f.testFlag(SubFrame)) { - r << QObject::tr("Sub Frame"); - } - if(f.testFlag(Stylesheet)) { - r << QObject::tr("Stylesheet"); - } - if(f.testFlag(Script)) { - r << QObject::tr("Script"); - } - if(f.testFlag(Image)) { - r << QObject::tr("Image"); - } - if(f.testFlag(Font)) { - r << QObject::tr("Font"); - } - if(f.testFlag(SubResource)) { - r << QObject::tr("Sub Resource"); - } - if(f.testFlag(Object)) { - r << QObject::tr("Object"); - } - if(f.testFlag(Media)) { - r << QObject::tr("Media"); - } - if(f.testFlag(Worker)) { - r << QObject::tr("Worker"); - } - if(f.testFlag(SharedWorker)) { - r << QObject::tr("Shared Worker"); - } - if(f.testFlag(Prefetch)) { - r << QObject::tr("Prefetch"); - } - if(f.testFlag(Favicon)) { - r << QObject::tr("Favicon"); - } - if(f.testFlag(Xhr)) { - r << QObject::tr("Xhr"); - } - if(f.testFlag(Ping)) { - r << QObject::tr("Ping"); - } - if(f.testFlag(ServiceWorker)) { - r << QObject::tr("Service Worker"); - } - if(f.testFlag(CspReport)) { - r << QObject::tr("Csp Report"); - } - if(f.testFlag(PluginResource)) { - r << QObject::tr("Plugin Resource"); - } - if(f.testFlag(Unknown)) { - r << QObject::tr("Unknown"); - } - return r.join(','); + matcher.setPattern(line); } diff --git a/src/filter/filter.h b/src/filter/filter.h index aeababd..bd3e2ca 100644 --- a/src/filter/filter.h +++ b/src/filter/filter.h @@ -18,90 +18,37 @@ ** ******************************************************************************/ -#ifndef FILTERNODE_H -#define FILTERNODE_H +#ifndef FILTERRULE_H +#define FILTERRULE_H -#include -#include -#include -#include "regexp.h" -#include +#include -class Filter +class QUrl; +class FilterRule { public: - enum ResourceType { - NoType = 0, - MainFrame = 1, - SubFrame = 2, - Stylesheet = 4, - Script = 8, - Image = 16, - Font = 32, - SubResource = 64, - Object = 128, - Media = 256, - Worker = 512, - SharedWorker = 1024, - Prefetch = 2048, - Favicon = 4096, - Xhr = 8192, - Ping = 16384, - ServiceWorker = 32768, - CspReport = 65536, - PluginResource = 131072, - Unknown = 262144 - }; - Q_DECLARE_FLAGS(Resources, ResourceType) + FilterRule(const QString &line); - struct ResourceRules { - Resources allowed; - Resources blocked; - }; + // delete the copy constructor and assignment operator + FilterRule(const FilterRule&) = delete; + FilterRule& operator=(const FilterRule&) = delete; - explicit Filter(const QString &domain, const QString &request, ResourceRules rules, bool shouldBlock, Filter *parentItem = 0); - ~Filter(); + // move constructor + FilterRule(FilterRule&& other) { + matcher = other.matcher; + } - void enable(); + ~FilterRule(); - Filter *parentItem(); - - // children - void appendChild(Filter *child); - Filter *child(int row); - int childCount() const; - - // data - QString domain() const; - QString request() const; - bool isBlocking(); - QString allowedTypes() const; - QString blockedTypes() const; - - int row() const; - - // filtering - bool hasDomainMatch(const QString &string); - bool hasRuleMatch(const QString &string); - bool shouldBlock(const QWebEngineUrlRequestInfo &info); - - bool isValid(); + bool shouldBlock(const QUrl &requestUrl) const; private: - bool testFlag(ResourceType flag); - QString flags(Resources f) const; - - Filter *m_parentItem; - QList m_children; - - RegExp m_domainUrl; - RegExp m_requestUrl; + void parse(const QString &line); - ResourceRules m_rules; + // QStringMatcher: holds a pattern you want to repeatedly match against some strings + QStringMatcher matcher; - bool m_valid = false; - bool m_shouldBlock; }; -#endif // FILTERNODE_H +#endif // FILTERRULE_H -- cgit v1.2.1