JS8Call-Improved master
Loading...
Searching...
No Matches
NetworkAccessManager.h
Go to the documentation of this file.
1
11
12#ifndef NETWORK_ACCESS_MANAGER_HPP__
13#define NETWORK_ACCESS_MANAGER_HPP__
14
15#include "JS8_Main/JS8MessageBox.h"
16
17#include <QList>
18#include <QNetworkAccessManager>
19#include <QNetworkReply>
20#include <QSslError>
21#include <QString>
22
23class QNetworkRequest;
24class QIODevice;
25class QWidget;
26
27// Subclass QNAM to keep a list of accepted SSL errors and allow
28// them in future replies.
38class NetworkAccessManager : public QNetworkAccessManager {
39 public:
44 NetworkAccessManager(QWidget *parent) : QNetworkAccessManager(parent) {
45 // handle SSL errors that have not been cached as allowed
46 // exceptions and offer them to the user to add to the ignored
47 // exception cache
48 connect(
49 this, &QNetworkAccessManager::sslErrors,
50 [this, &parent](QNetworkReply *reply,
51 QList<QSslError> const &errors) {
52 QString message;
53 QList<QSslError> new_errors;
54 for (auto const &error : errors) {
55 if (!allowed_ssl_errors_.contains(error)) {
56 new_errors << error;
57 message += '\n' +
58 reply->request().url().toDisplayString() +
59 ": " + error.errorString();
60 }
61 }
62 if (new_errors.size()) {
63 QString certs;
64 for (auto const &cert :
65 reply->sslConfiguration().peerCertificateChain()) {
66 certs += cert.toText() + '\n';
67 }
68 if (JS8MessageBox::Ignore ==
69 JS8MessageBox::query_message(
70 parent, tr("Network SSL Errors"), message, certs,
71 JS8MessageBox::Abort | JS8MessageBox::Ignore)) {
72 // accumulate new SSL error exceptions that have been
73 // allowed
74 allowed_ssl_errors_.append(new_errors);
75 reply->ignoreSslErrors(allowed_ssl_errors_);
76 }
77 } else {
78 // no new exceptions so silently ignore the ones already
79 // allowed
80 reply->ignoreSslErrors(allowed_ssl_errors_);
81 }
82 });
83 }
84
85 protected:
92 QNetworkReply *createRequest(Operation operation,
93 QNetworkRequest const &request,
94 QIODevice *outgoing_data = nullptr) override {
95 auto reply = QNetworkAccessManager::createRequest(operation, request,
96 outgoing_data);
97 // errors are usually certificate specific so passing all cached
98 // exceptions here is ok
99 reply->ignoreSslErrors(allowed_ssl_errors_);
100 return reply;
101 }
102
103 private:
104 QList<QSslError> allowed_ssl_errors_;
105};
106
107#endif
QNetworkReply * createRequest(Operation operation, QNetworkRequest const &request, QIODevice *outgoing_data=nullptr) override
Intercept request creation and apply cached allowed SSL errors.
Definition NetworkAccessManager.h:92
NetworkAccessManager(QWidget *parent)
Construct a NetworkAccessManager with a parent widget used for prompts.
Definition NetworkAccessManager.h:44
Definition qpriorityqueue.h:39