From aaed4ebc642d95dfb3cddab4fad196e870077bcf Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Thu, 5 Jul 2018 19:37:05 +0200 Subject: Add web/urlfilter --- lib/web/urlfilter/filterrule.cpp | 88 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 lib/web/urlfilter/filterrule.cpp (limited to 'lib/web/urlfilter/filterrule.cpp') diff --git a/lib/web/urlfilter/filterrule.cpp b/lib/web/urlfilter/filterrule.cpp new file mode 100644 index 0000000..5a9310e --- /dev/null +++ b/lib/web/urlfilter/filterrule.cpp @@ -0,0 +1,88 @@ +#include "filterrule.h" +#include +#include + +FilterRule::FilterRule(const QJsonObject &filter) +{ + const QString action = filter.value("action").toString(); + + // there is no action specified => this rule is invalid + if(action.isEmpty()) + return; + + if(action == "Whitelist") + m_action = ActionType::Whitelist; + else if (action == "Blacklist") + m_action = ActionType::Blacklist; + else if (action == "Redirect") { + m_action = ActionType::Redirect; + m_redirectUrl = QUrl::fromUserInput(filter.value("url").toString()); + } else if (action == "SetHeader") + m_action = ActionType::SetHeader; + else // invalid action + return; + + QJsonValue regexp = filter.value("regexp"); + QJsonValue endswith = filter.value("endswith"); + QJsonValue contains = filter.value("contains"); + + if(!regexp.isUndefined()) { + m_type = RuleType::RegExpMatchRule; + this->regexp.setPattern(regexp.toString()); + } else if(!endswith.isUndefined()) { + m_type = RuleType::StringEndsMatchRule; + pattern = endswith.toString(); + } else if(!contains.isUndefined()) { + m_type = RuleType::StringContainsMatchRule; + this->matcher.setPattern(contains.toString()); + this->matcher.setCaseSensitivity(Qt::CaseInsensitive); + } else // invalid rule + return; + + m_options.insert(QWebEngineUrlRequestInfo::ResourceTypeImage, true); +} + +bool FilterRule::isValid() const +{ + return m_type != RuleType::Invalid; +} + +bool FilterRule::process(QWebEngineUrlRequestInfo &info) const +{ + Q_ASSERT(m_type != RuleType::Invalid); + + if(matchRequestUrl(info.requestUrl().toString(), info.resourceType())) { + switch (m_action) { + case ActionType::Whitelist: + info.block(false); + return true; + case ActionType::Blacklist: + info.block(true); + return true; + case ActionType::Redirect: + info.redirect(m_redirectUrl); + return true; + case ActionType::SetHeader: + break; + } + } + + return false; +} + +bool FilterRule::matchRequestUrl(const QString &requestUrl, const QWebEngineUrlRequestInfo::ResourceType type) const +{ + if(!m_options.contains(type)) + return false; + + switch (m_type) { + case RuleType::RegExpMatchRule: + return regexp.match(requestUrl).hasMatch(); + case RuleType::StringEndsMatchRule: + return requestUrl.endsWith(pattern); + case RuleType::StringContainsMatchRule: + return matcher.indexIn(requestUrl) != -1; + default: + return false; + } +} -- cgit v1.2.1