/* * 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/smolbote.hg * * SPDX-License-Identifier: GPL-3.0 */ #include "urlinterceptor.h" #include #include #include UrlRequestInterceptor::UrlRequestInterceptor(const QString &path, QObject *parent) : QWebEngineUrlRequestInterceptor(parent) { QDir hostsD(path); const QStringList hostFiles = hostsD.entryList(QDir::Files); for(const QString &file : hostFiles) { const QString absPath = hostsD.absoluteFilePath(file); QtConcurrent::run([this, absPath]() { auto r = parse(absPath); #ifdef QT_DEBUG qDebug("Parsed %i rules from %s", r.count(), qUtf8Printable(absPath)); #endif rulesLock.lock(); rules.unite(r); rulesLock.unlock(); }); } } UrlRequestInterceptor::~UrlRequestInterceptor() = default; void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) { rulesLock.lock(); if(rules.contains(info.requestUrl().host())) { info.block(rules.value(info.requestUrl().host()).isBlocking); } rulesLock.unlock(); } QHash parse(const QString &filename) { QHash rules; QFile hostfile(filename); if(hostfile.open(QIODevice::ReadOnly | QIODevice::Text)) { // with a QTextStream we can read lines without getting linebreaks at the end QTextStream hostfile_stream(&hostfile); while(!hostfile_stream.atEnd()) { // read line and remove any whitespace at the end const QString &line = hostfile_stream.readLine().trimmed(); // skip comments and empty lines if(line.isEmpty() || line.startsWith('#')) continue; // everything else should be a rule // format is // 0.0.0.0 hostname const QStringList &parts = line.split(' '); const QString &redirect = parts.at(0); for(auto i = parts.constBegin() + 1; i != parts.constEnd(); ++i) { if(!rules.contains(*i)) { UrlRequestInterceptor::HostRule rule{}; rule.isBlocking = (redirect == "0.0.0.0"); rules.insert(*i, rule); } } // for(const QString &host : parts.mid(1)) { // if(!rules.contains(host)) { // UrlRequestInterceptor::HostRule rule{}; // rule.isBlocking = redirect == "0.0.0.0"; // rules.insert(host, rule); // } // } } hostfile.close(); } return rules; };