File indexing completed on 2024-03-24 05:30:31
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"