From 1a9e09332261d18ee892fc3613f16a0e80d115e0 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sun, 21 May 2017 20:24:57 +0200 Subject: Reworking URL filter --- src/blocker/blockersubscription.cpp | 163 +++++++++--------------------------- 1 file changed, 39 insertions(+), 124 deletions(-) (limited to 'src/blocker/blockersubscription.cpp') diff --git a/src/blocker/blockersubscription.cpp b/src/blocker/blockersubscription.cpp index ea95d57..c452511 100644 --- a/src/blocker/blockersubscription.cpp +++ b/src/blocker/blockersubscription.cpp @@ -25,38 +25,40 @@ #include #include -BlockerSubscription::BlockerSubscription(const QUrl url, QWidget *parent) : +#include +#include +#include + +FilterCollection::FilterCollection(const QString path, QWidget *parent) : QWidget(parent), ui(new Ui::SubscriptionForm) { ui->setupUi(this); - m_name = url.fileName(); - m_url = url; - - QString subPath = sSettings->value("blocker.path").toString() + m_name; - qDebug("Adding subscription [%s]", qUtf8Printable(subPath)); - QFile *sub = new QFile(subPath); - if(sub->exists()) { - sub->open(QIODevice::ReadOnly); - load(sub); - } else { - if(!url.scheme().startsWith("http")) { - qWarning("Invalid url, subscription cannot be updated"); - sub->deleteLater(); - return; - } - qDebug("Subscription doesn't exist, updating..."); - sub->open(QIODevice::ReadWrite); - update(sub); + + m_name = "TODO"; + m_path = path; + + qDebug("Adding subscription [%s]", qUtf8Printable(m_path)); + + + QFile filterFile(m_path); + 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()); } -BlockerSubscription::~BlockerSubscription() +FilterCollection::~FilterCollection() { delete ui; } -QString BlockerSubscription::name() const +QString FilterCollection::name() const { return m_name; } @@ -66,29 +68,15 @@ QString BlockerSubscription::name() const * @param info * @return true if it should be blocked; false otherwise */ -BlockerSubscription::MatchResult BlockerSubscription::match(QWebEngineUrlRequestInfo &info) +FilterCollection::MatchResult FilterCollection::match(QWebEngineUrlRequestInfo &info) { MatchResult result; - for(auto rule : qAsConst(m_urlWhitelist)) { - if(rule->match(info)) { - // this request is whitelisted - result.match = true; - result.block = false; - result.pattern = rule->filter(); - return result; - } - } - - // request is not in the whitelist - for(auto rule : qAsConst(m_urlBlacklist)) { - if(rule->match(info)) { - // this request is blacklisted - result.match = true; - result.block = true; - result.pattern = rule->filter(); - return result; - } + for(auto rule : qAsConst(m_rules)) { + result.match = true; + result.block = rule->match(info); + result.pattern = rule->filter(); + return result; } // request matches neither whitelist nor blacklist @@ -97,93 +85,20 @@ BlockerSubscription::MatchResult BlockerSubscription::match(QWebEngineUrlRequest return result; } -void BlockerSubscription::update(QFile *cache) +void FilterCollection::load(const QJsonObject &json) { - // no cache path specified - pull the subscription - QNetworkRequest request; - request.setUrl(m_url); - - QNetworkReply *reply = sNetwork->get(request); - connect(reply, &QNetworkReply::readyRead, [this, reply, cache]() { - cache->write(reply->readAll()); - }); - connect(reply, &QNetworkReply::finished, [this, reply, cache]() { - cache->write(reply->readAll()); - cache->flush(); - cache->seek(0); - reply->deleteLater(); - qDebug("Subscription updated: [%s]", qUtf8Printable(this->m_name)); - this->load(cache); - }); + for(QJsonValue v : json["rules"].toArray()) { + m_rules.append(createRule(v.toObject())); + } } -void BlockerSubscription::load(QIODevice *dev) +BlockerRule* FilterCollection::createRule(const QJsonObject &obj) { - QTextStream subscription(dev); - - QString header = subscription.readLine(); - if(!header.startsWith("[Adblock Plus")) { - qWarning("Invalid format of subscription: %s", qUtf8Printable(m_name)); - } - - // clear all lists - m_urlBlacklist.clear(); - m_urlWhitelist.clear(); - int rules = 0; - - while(!subscription.atEnd()) { - QString line = subscription.readLine(); - if(!line.isEmpty()) { - if(line.startsWith('!')) { - parseComment(line); - } else { - // The line is not empty or a comment - rules++; - BlockerRule *rule = new BlockerRule(line, this); - - if(rule->isValid()) { - if(rule->isException()) { - m_urlWhitelist.append(rule); - ui->whitelist_listWidget->addItem(rule->filter()); - } else { - ui->blacklist_listWidget->addItem(rule->filter()); - m_urlBlacklist.append(rule); - } - } - - } - } // line.isEmpty - } // subscription.atEnd() - - qDebug("Loaded %i/%i rules from subscription %s", m_urlBlacklist.count() + m_urlWhitelist.count(), rules, qUtf8Printable(m_name)); - dev->deleteLater(); -} + BlockerRule *rule; + BlockerRule::NavigationType n; + BlockerRule::ResourceType r; + rule = new BlockerRule(RegExp(obj["firstPartyUrl"].toString()), RegExp(obj["requestUrl"].toString()), n, r, obj["shouldBlock"].toBool(), this); -void BlockerSubscription::parseComment(const QString &line) -{ - if(line.startsWith("! Title: ")) { - ui->title->setText(line.right(line.length() - 9)); - return; - } - if(line.startsWith("! Homepage: ")) { - ui->homepage->setText(line.right(line.length() - 12)); - return; - } - if(line.startsWith("! Licence: ")) { - ui->license->setText(line.right(line.length() - 11)); - return; - } - if(line.startsWith("! Version: ")) { - ui->version->setText(line.right(line.length() - 11)); - return; - } - if(line.startsWith("! Last modified: ")) { - ui->lastModified->setText(line.right(line.length() - 17)); - return; - } - if(line.startsWith("! Expires: ")) { - ui->expires->setText(line.right(line.length() - 11).left(2)); - return; - } + return rule; } -- cgit v1.2.1