/******************************************************************************* ** ** 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 . ** ******************************************************************************/ #include "filtercollection.h" #include "ui_subscriptionform.h" #include "browser.h" #include #include #include #include #include #include #include FilterCollection::FilterCollection(const QString path, QWidget *parent) : QWidget(parent), ui(new Ui::SubscriptionForm) { ui->setupUi(this); m_name = "TODO"; m_url = path; qDebug("Adding subscription [%s]", qUtf8Printable(m_url)); QFile filterFile(m_url); if(!filterFile.open(QIODevice::ReadOnly)) { qWarning("Could not open filter!"); return; } QJsonDocument filters(QJsonDocument::fromJson(filterFile.readAll())); load(filters.object()); qDebug("Added %i rules", m_rules.size()); } FilterCollection::~FilterCollection() { delete ui; } QString FilterCollection::name() const { return m_name; } /** * Check if a URL request should be blocked or not * @param info * @return true if it should be blocked; false otherwise */ FilterCollection::MatchResult FilterCollection::match(QWebEngineUrlRequestInfo &info) { MatchResult result; for(FilterRule *rule : qAsConst(m_rules)) { result.match = rule->hasMatch(info); if(result.match) { result.block = rule->shouldBlock(info); } else { result.block = false; } result.pattern = rule->filter(); return result; } // request matches neither whitelist nor blacklist result.match = false; result.block = false; return result; } void FilterCollection::load(const QJsonObject &json) { m_name = json["name"].toString(); ui->title->setText(m_name); m_url = json["url"].toString(); ui->homepage->setText(m_url); FilterRule *r; for(QJsonValue v : json["rules"].toArray()) { r = createRule(v.toObject()); m_rules.append(r); ui->blacklist_listWidget->addItem(r->filter()); } } /** * Create rule from JSON object * @param obj * @return */ FilterRule* FilterCollection::createRule(const QJsonObject &obj) { FilterRule *rule; FilterRule::ResourceRules r; r.allowed = parseJsonRules(obj["allowTypes"]); r.blocked = parseJsonRules(obj["blockTypes"]); rule = new FilterRule(obj["firstPartyUrl"].toString(), obj["requestUrl"].toString(), r, obj["shouldBlock"].toBool(), this); return rule; } FilterRule::Resources FilterCollection::parseJsonRules(const QJsonValue &obj) { FilterRule::Resources res; for(QJsonValue v : obj.toArray()) { QString t = v.toString(); if(t == "MainFrame") { res.setFlag(FilterRule::ResourceType::MainFrame); } else if(t == "SubFrame") { res.setFlag(FilterRule::ResourceType::SubFrame); } else if(t == "Stylesheet") { res.setFlag(FilterRule::ResourceType::Stylesheet); } else if(t == "Script") { res.setFlag(FilterRule::ResourceType::Script); } else if(t == "Image") { res.setFlag(FilterRule::ResourceType::Image); } else if(t == "FontResource") { res.setFlag(FilterRule::ResourceType::FontResource); } else if(t == "SubResource") { res.setFlag(FilterRule::ResourceType::SubResource); } else if(t == "Object") { res.setFlag(FilterRule::ResourceType::Object); } else if(t == "Media") { res.setFlag(FilterRule::ResourceType::Media); } else if(t == "Worker") { res.setFlag(FilterRule::ResourceType::Worker); } else if(t == "SharedWorker") { res.setFlag(FilterRule::ResourceType::SharedWorker); } else if(t == "Prefetch") { res.setFlag(FilterRule::ResourceType::Prefetch); } else if(t == "Favicon") { res.setFlag(FilterRule::ResourceType::Favicon); } else if(t == "Xhr") { res.setFlag(FilterRule::ResourceType::Xhr); } else if(t == "Ping") { res.setFlag(FilterRule::ResourceType::Ping); } else if(t == "ServiceWorker") { res.setFlag(FilterRule::ResourceType::ServiceWorker); } else if(t == "CspWorker") { res.setFlag(FilterRule::ResourceType::CspReport); } else if(t == "PluginResource") { res.setFlag(FilterRule::ResourceType::PluginResource); } } return res; }