File indexing completed on 2024-04-28 16:45:13

0001 /*
0002 SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
0003 
0004 SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 #include "noaccessnetworkaccessmanagerfactory.h"
0007 
0008 #include <KProtocolInfo>
0009 #include <QNetworkAccessManager>
0010 #include <QNetworkReply>
0011 
0012 namespace ScreenLocker
0013 {
0014 class AccessDeniedNetworkReply : public QNetworkReply
0015 {
0016     Q_OBJECT
0017 public:
0018     explicit AccessDeniedNetworkReply(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QObject *parent)
0019         : QNetworkReply(parent)
0020     {
0021         setRequest(req);
0022         setOpenMode(QIODevice::ReadOnly);
0023         setUrl(req.url());
0024         setOperation(op);
0025         setError(QNetworkReply::ContentAccessDenied, QStringLiteral("Blocked request."));
0026         const auto networkError = error();
0027         QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNetworkReply::NetworkError, networkError));
0028 
0029         setFinished(true);
0030         Q_EMIT QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
0031     }
0032     qint64 readData(char * /*data*/, qint64 /*maxSize*/) override
0033     {
0034         return 0;
0035     }
0036     void abort() override{};
0037 };
0038 
0039 class NoAccessNetworkAccessManager : public QNetworkAccessManager
0040 {
0041     Q_OBJECT
0042     using QNetworkAccessManager::QNetworkAccessManager;
0043 
0044 public:
0045     QNetworkReply *createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData) override
0046     {
0047         if (!isLocalRequest(req.url())) {
0048             return new ScreenLocker::AccessDeniedNetworkReply(op, req, this);
0049         }
0050         return QNetworkAccessManager::createRequest(op, req, outgoingData);
0051     }
0052 
0053 private:
0054     bool isLocalRequest(const QUrl &url)
0055     {
0056         const QString scheme(url.scheme());
0057         return (KProtocolInfo::isKnownProtocol(scheme) && KProtocolInfo::protocolClass(scheme).compare(QStringLiteral(":local"), Qt::CaseInsensitive) == 0);
0058     }
0059 };
0060 
0061 QNetworkAccessManager *NoAccessNetworkAccessManagerFactory::create(QObject *parent)
0062 {
0063     return new NoAccessNetworkAccessManager(parent);
0064 }
0065 }
0066 
0067 #include "noaccessnetworkaccessmanagerfactory.moc"