aboutsummaryrefslogtreecommitdiff
path: root/src/blocker/blockersubscription.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/blocker/blockersubscription.cpp')
-rw-r--r--src/blocker/blockersubscription.cpp163
1 files changed, 39 insertions, 124 deletions
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 <QNetworkRequest>
#include <QNetworkReply>
-BlockerSubscription::BlockerSubscription(const QUrl url, QWidget *parent) :
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
+
+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;
}