File: noaccessnetworkaccessmanagerfactory.cpp

package info (click to toggle)
kscreenlocker 6.5.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,172 kB
  • sloc: cpp: 5,698; xml: 88; sh: 32; makefile: 5
file content (67 lines) | stat: -rw-r--r-- 2,066 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>

SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "noaccessnetworkaccessmanagerfactory.h"

#include <KProtocolInfo>
#include <QNetworkAccessManager>
#include <QNetworkReply>

namespace ScreenLocker
{
class AccessDeniedNetworkReply : public QNetworkReply
{
    Q_OBJECT
public:
    explicit AccessDeniedNetworkReply(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QObject *parent)
        : QNetworkReply(parent)
    {
        setRequest(req);
        setOpenMode(QIODevice::ReadOnly);
        setUrl(req.url());
        setOperation(op);
        setError(QNetworkReply::ContentAccessDenied, QStringLiteral("Blocked request."));
        const auto networkError = error();
        QMetaObject::invokeMethod(this, &QNetworkReply::errorOccurred, Qt::QueuedConnection, networkError);

        setFinished(true);
        Q_EMIT QMetaObject::invokeMethod(this, &QNetworkReply::finished, Qt::QueuedConnection);
    }
    qint64 readData(char * /*data*/, qint64 /*maxSize*/) override
    {
        return 0;
    }
    void abort() override{};
};

class NoAccessNetworkAccessManager : public QNetworkAccessManager
{
    Q_OBJECT
    using QNetworkAccessManager::QNetworkAccessManager;

public:
    QNetworkReply *createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData) override
    {
        if (!isLocalRequest(req.url())) {
            return new ScreenLocker::AccessDeniedNetworkReply(op, req, this);
        }
        return QNetworkAccessManager::createRequest(op, req, outgoingData);
    }

private:
    bool isLocalRequest(const QUrl &url)
    {
        const QString scheme(url.scheme());
        return (KProtocolInfo::isKnownProtocol(scheme) && KProtocolInfo::protocolClass(scheme).compare(QStringLiteral(":local"), Qt::CaseInsensitive) == 0);
    }
};

QNetworkAccessManager *NoAccessNetworkAccessManagerFactory::create(QObject *parent)
{
    return new NoAccessNetworkAccessManager(parent);
}
}

#include "noaccessnetworkaccessmanagerfactory.moc"