quick/QuickNetworkDenial.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "QuickNetworkDenial.h" | ||
| 2 | #include "util/SecurityLog.h" | ||
| 3 | |||
| 4 | #include <QNetworkAccessManager> | ||
| 5 | #include <QNetworkReply> | ||
| 6 | #include <QTimer> | ||
| 7 | |||
| 8 | namespace { | ||
| 9 | class DeniedReply : public QNetworkReply { | ||
| 10 | public: | ||
| 11 | 6 | DeniedReply(const QNetworkRequest &request, QNetworkAccessManager::Operation operation, | |
| 12 | 6 | QObject *parent) : QNetworkReply(parent) { | |
| 13 |
1/1✓ Branch 3 → 4 taken 6 times.
|
6 | setRequest(request); |
| 14 |
2/2✓ Branch 4 → 5 taken 6 times.
✓ Branch 5 → 6 taken 6 times.
|
6 | setUrl(request.url()); |
| 15 |
1/1✓ Branch 7 → 8 taken 6 times.
|
6 | setOperation(operation); |
| 16 |
1/1✓ Branch 9 → 10 taken 6 times.
|
6 | open(QIODevice::ReadOnly | QIODevice::Unbuffered); |
| 17 |
1/1✓ Branch 13 → 14 taken 6 times.
|
12 | setError(ContentAccessDenied, QStringLiteral("QML network access denied")); |
| 18 |
1/1✓ Branch 16 → 17 taken 6 times.
|
6 | setFinished(true); |
| 19 |
1/1✓ Branch 17 → 18 taken 6 times.
|
12 | QTimer::singleShot(0, this, [this] { emit errorOccurred(error()); emit finished(); }); |
| 20 | 6 | } | |
| 21 | ✗ | void abort() override {} | |
| 22 | ✗ | qint64 bytesAvailable() const override { return 0; } | |
| 23 | protected: | ||
| 24 | ✗ | qint64 readData(char *, qint64) override { return -1; } | |
| 25 | }; | ||
| 26 | |||
| 27 | class DenialManager : public QNetworkAccessManager { | ||
| 28 | public: | ||
| 29 | 7 | explicit DenialManager(QObject *parent) : QNetworkAccessManager(parent) {} | |
| 30 | protected: | ||
| 31 | 8 | QNetworkReply *createRequest(Operation operation, const QNetworkRequest &request, | |
| 32 | QIODevice *outgoing) override { | ||
| 33 |
3/3✓ Branch 2 → 3 taken 8 times.
✓ Branch 3 → 4 taken 8 times.
✓ Branch 4 → 5 taken 8 times.
|
8 | const QString scheme = request.url().scheme().toLower(); |
| 34 |
5/6✓ Branch 9 → 10 taken 8 times.
✗ Branch 9 → 13 not taken.
✓ Branch 12 → 13 taken 2 times.
✓ Branch 12 → 14 taken 6 times.
✓ Branch 15 → 16 taken 2 times.
✓ Branch 15 → 18 taken 6 times.
|
8 | if (scheme == QLatin1String("qrc") || scheme == QLatin1String("data")) |
| 35 |
1/1✓ Branch 16 → 17 taken 2 times.
|
2 | return QNetworkAccessManager::createRequest(operation, request, outgoing); |
| 36 |
5/5✓ Branch 18 → 19 taken 6 times.
✓ Branch 22 → 23 taken 6 times.
✓ Branch 23 → 24 taken 6 times.
✓ Branch 27 → 20 taken 6 times.
✓ Branch 27 → 28 taken 6 times.
|
12 | qCWarning(lcSecurity) << "QML request denied"; |
| 37 |
10/10✓ Branch 28 → 29 taken 6 times.
✓ Branch 32 → 33 taken 6 times.
✓ Branch 33 → 34 taken 6 times.
✓ Branch 34 → 35 taken 6 times.
✓ Branch 35 → 36 taken 6 times.
✓ Branch 36 → 37 taken 6 times.
✓ Branch 38 → 39 taken 6 times.
✓ Branch 39 → 40 taken 6 times.
✓ Branch 45 → 30 taken 6 times.
✓ Branch 45 → 46 taken 6 times.
|
12 | qCDebug(lcSecurity) << "Denied scheme" << scheme << "host" << request.url().host(); |
| 38 |
3/6✓ Branch 46 → 47 taken 6 times.
✓ Branch 47 → 48 taken 6 times.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 51 taken 6 times.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 80 not taken.
|
6 | return new DeniedReply(request, operation, this); |
| 39 | 8 | } | |
| 40 | }; | ||
| 41 | } // namespace | ||
| 42 | |||
| 43 | 7 | QNetworkAccessManager *QuickNetworkDenial::create(QObject *parent) { | |
| 44 |
2/5✓ Branch 3 → 4 taken 7 times.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 7 times.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
|
14 | return new DenialManager(parent); |
| 45 | } | ||
| 46 | |||
| 47 | 870 | void QuickNetworkDenial::install(QQmlEngine *engine) { | |
| 48 |
4/8✓ Branch 3 → 4 taken 870 times.
✓ Branch 4 → 5 taken 870 times.
✗ Branch 4 → 6 not taken.
✓ Branch 7 → 8 taken 870 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 870 times.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
|
870 | engine->setNetworkAccessManagerFactory(new QuickNetworkDenial(engine)); |
| 49 | 870 | } | |
| 50 |