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.cpp145
1 files changed, 98 insertions, 47 deletions
diff --git a/lib/web/urlfilter/filterrule.cpp b/lib/web/urlfilter/filterrule.cpp
index 5a9310e..73b357b 100644
--- a/lib/web/urlfilter/filterrule.cpp
+++ b/lib/web/urlfilter/filterrule.cpp
@@ -2,57 +2,99 @@
#include <QWebEngineUrlRequestInfo>
#include <QJsonArray>
+void parseJson(std::unique_ptr<FilterRule> &rule, const QJsonObject &filter)
+{
+ // set action
+ {
+ if(!filter.value("whitelist").isUndefined()) {
+ rule->setActionType(FilterRule::Whitelist);
+
+ } else if(!filter.value("blacklist").isUndefined()) {
+ rule->setActionType(FilterRule::Blacklist);
+
+ } else if(!filter.value("redirect").isUndefined()) {
+ rule->setActionType(FilterRule::Redirect);
+ rule->setRedirectUrl(QUrl::fromUserInput(filter.value("redirect").toString()));
+
+ } else if(!filter.value("setheader").isUndefined()) {
+ rule->setActionType(FilterRule::SetHeader);
+ for(const QJsonValue v : filter.value("setheader").toArray()) {
+ QStringList h = v.toString().split(':');
+ rule->addHeaderRule(h.at(0).toLatin1(), h.at(1).toLatin1());
+ }
+ }
+
+ }
+
+ // set match type
+ {
+ const QJsonValue regexpValue = filter.value("regexp");
+ const QJsonValue endswithValue = filter.value("endswith");
+ const QJsonValue containsValue = filter.value("contains");
+
+ if(!regexpValue.isUndefined()) {
+ rule->setMatchType(FilterRule::RegExpMatchRule, regexpValue.toString());
+
+ } else if(!endswithValue.isUndefined()) {
+ rule->setMatchType(FilterRule::StringEndsMatchRule, endswithValue.toString());
+
+ } else if(!containsValue.isUndefined()) {
+ rule->setMatchType(FilterRule::StringContainsMatchRule, containsValue.toString());
+
+ } else
+ rule->setMatchType(FilterRule::MatchAllUrlsRule);
+ }
+
+}
+
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);
+ m_matcher.setCaseSensitivity(Qt::CaseInsensitive);
+}
+
+void FilterRule::setActionType(ActionType type)
+{
+ m_actionType = type;
+}
+
+void FilterRule::setMatchType(MatchType type, const QString &pattern)
+{
+ m_matchType = type;
+ switch (type) {
+ case RegExpMatchRule:
+ m_regexp.setPattern(pattern);
+ break;
+ case StringEndsMatchRule:
+ m_pattern = pattern;
+ break;
+ case StringContainsMatchRule:
+ m_matcher.setPattern(pattern);
+ default:
+ break;
+ }
+}
+
+void FilterRule::setRedirectUrl(const QUrl &url)
+{
+ m_redirectUrl = url;
+}
+
+void FilterRule::addHeaderRule(const QByteArray &header, const QByteArray &value)
+{
+ m_headers.insert(header, value);
}
bool FilterRule::isValid() const
{
- return m_type != RuleType::Invalid;
+ return (m_matchType != MatchType::InvalidMatch) && (m_actionType != ActionType::InvalidAction);
}
bool FilterRule::process(QWebEngineUrlRequestInfo &info) const
{
- Q_ASSERT(m_type != RuleType::Invalid);
+ Q_ASSERT(m_actionType != ActionType::InvalidAction);
if(matchRequestUrl(info.requestUrl().toString(), info.resourceType())) {
- switch (m_action) {
+ switch (m_actionType) {
case ActionType::Whitelist:
info.block(false);
return true;
@@ -63,6 +105,11 @@ bool FilterRule::process(QWebEngineUrlRequestInfo &info) const
info.redirect(m_redirectUrl);
return true;
case ActionType::SetHeader:
+ for(auto it = m_headers.constBegin(); it != m_headers.constEnd(); ++it) {
+ info.setHttpHeader(it.key(), it.value());
+ }
+ return true;
+ case ActionType::InvalidAction:
break;
}
}
@@ -72,16 +119,20 @@ bool FilterRule::process(QWebEngineUrlRequestInfo &info) const
bool FilterRule::matchRequestUrl(const QString &requestUrl, const QWebEngineUrlRequestInfo::ResourceType type) const
{
- if(!m_options.contains(type))
+ Q_ASSERT(m_matchType != MatchType::InvalidMatch);
+
+ if(!m_resourceTypeOptions.isEmpty() && !m_resourceTypeOptions.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;
+ switch (m_matchType) {
+ case MatchType::RegExpMatchRule:
+ return m_regexp.match(requestUrl).hasMatch();
+ case MatchType::StringEndsMatchRule:
+ return requestUrl.endsWith(m_pattern);
+ case MatchType::StringContainsMatchRule:
+ return m_matcher.indexIn(requestUrl) != -1;
+ case MatchType::MatchAllUrlsRule:
+ return true;
default:
return false;
}