aboutsummaryrefslogtreecommitdiff
path: root/lib/web/urlfilter/filterrule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/web/urlfilter/filterrule.cpp')
-rw-r--r--lib/web/urlfilter/filterrule.cpp88
1 files changed, 88 insertions, 0 deletions
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 <QWebEngineUrlRequestInfo>
+#include <QJsonArray>
+
+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;
+ }
+}