/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote * * SPDX-License-Identifier: GPL-3.0 */ #include "filter.h" #include "configuration.h" #include "urlinterceptor.h" #include "util.h" #include #include #include #include /* inline std::vector parseAdBlockList(const QString &filename) { std::vector rules; QFile list(filename); if(list.open(QIODevice::ReadOnly | QIODevice::Text), true) { QTextStream l(&list); QString line; while(l.readLineInto(&line)) { AdBlockRule rule(line); if(rule.isEnabled()) { rules.emplace_back(std::move(rule)); } } list.close(); } return rules; }*/ Filter::Filter::Filter(const std::unique_ptr &config, QObject *parent) : QObject(parent) { // parse headers if(const auto headers = config->value("filter.header"); headers) { for(const QString &header : headers.value()) { const auto list = header.split(QLatin1Literal(":")); if(list.length() == 2) m_headers.insert(list.at(0).toLatin1(), list.at(1).toLatin1()); } } const QStringList hostfiles = Util::files(config->value("filter.hosts").value()); //qDebug("filter.path=[%s]", qUtf8Printable(config->value("filter.hosts").value())); for(const QString &hostfile : hostfiles) { QFile f(hostfile); if(f.open(QIODevice::ReadOnly | QIODevice::Text)) { #ifdef QT_DEBUG qDebug("Loading hostlist filters [%s]", qUtf8Printable(hostfile)); #endif loadHostlist(f, &filters); f.close(); } } /* auto filtersPath = config->value("filter.adblock"); if(filtersPath) filters = parseAdBlockList(filtersPath.value()); */ } void Filter::filterRequest(QWebEngineUrlRequestInfo &info) const { auto matches = filters.match(info.firstPartyUrl().toString(), info.requestUrl().toString()); for(const auto &rule : matches) { switch(rule->action().first) { case FilterLeaf::NotMatched: #ifdef QT_DEBUG qDebug("Paradoxical match: request matched, but not matched."); qDebug(" - %s", qUtf8Printable(info.requestUrl().toString())); #endif break; case FilterLeaf::Block: //qDebug("block %s", qUtf8Printable(info.requestUrl().toString())); info.block(true); break; case FilterLeaf::Allow: info.block(false); break; //case FilterLeaf::Redirect: // break; } } }