diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2017-05-24 15:29:25 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2017-05-24 15:29:25 +0200 |
commit | 863da92c57a5d6245bac3885936f59da88041e75 (patch) | |
tree | 9125ee3ac879c8be44019e5ffc27a5c3b4d2a92e /src/blocker/filterrule.cpp | |
parent | Reworking URL filter (diff) | |
download | smolbote-863da92c57a5d6245bac3885936f59da88041e75.tar.xz |
Improved filter rules
Diffstat (limited to 'src/blocker/filterrule.cpp')
-rw-r--r-- | src/blocker/filterrule.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/blocker/filterrule.cpp b/src/blocker/filterrule.cpp new file mode 100644 index 0000000..f7ba00b --- /dev/null +++ b/src/blocker/filterrule.cpp @@ -0,0 +1,119 @@ +/******************************************************************************* + ** + ** 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 "filterrule.h" + +FilterRule::FilterRule(const QString firstPartyUrl, const QString requestUrl, ResourceRules rules, bool shouldBlock, QObject *parent) : + QObject(parent) +{ + m_firstPartyUrl.setPattern(firstPartyUrl); + m_requestUrl.setPattern(requestUrl); + m_rules = rules; + m_shouldBlock = shouldBlock; + + m_valid = true; + +#ifdef DEBUG_VERBOSE + qDebug("Created rule [%s] [%s]", qUtf8Printable(firstPartyUrl), qUtf8Printable(requestUrl)); +#endif + +} + +bool FilterRule::hasMatch(const QWebEngineUrlRequestInfo &info) +{ + if(m_firstPartyUrl.hasMatch(info.firstPartyUrl().toString()) && m_requestUrl.hasMatch(info.requestUrl().toString())) { + return true; + } else { + return false; + } +} + +bool FilterRule::shouldBlock(const QWebEngineUrlRequestInfo &info) +{ + if(!m_valid) { + 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(FontResource); + 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; + +} + +bool FilterRule::isValid() +{ + return m_valid; +} + +QString FilterRule::filter() const +{ + return "'" + m_firstPartyUrl.pattern() + "' | '" + m_requestUrl.pattern() + "'"; +} + +bool FilterRule::testFlag(ResourceType flag) +{ + if(m_rules.allowed.testFlag(flag)) { + return false; + } else if(m_rules.blocked.testFlag(flag)) { + return true; + } else { + return m_shouldBlock; + } +} |