/* * 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(); for(const auto &k : r.keys()) { if(rules.contains(k)) { // } else { rules.insert(k, r.value(k)); } } 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 // 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(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; };