JS8Call-Improved master
Loading...
Searching...
No Matches
NetworkAccessManager.h
1#ifndef NETWORK_ACCESS_MANAGER_HPP__
2#define NETWORK_ACCESS_MANAGER_HPP__
3
4#include "JS8_Main/JS8MessageBox.h"
5
6#include <QList>
7#include <QNetworkAccessManager>
8#include <QNetworkReply>
9#include <QSslError>
10#include <QString>
11
12class QNetworkRequest;
13class QIODevice;
14class QWidget;
15
16// sub-class QNAM to keep a list of accepted SSL errors and allow
17// them in future replies
18class NetworkAccessManager : public QNetworkAccessManager {
19 public:
20 NetworkAccessManager(QWidget *parent) : QNetworkAccessManager(parent) {
21 // handle SSL errors that have not been cached as allowed
22 // exceptions and offer them to the user to add to the ignored
23 // exception cache
24 connect(
25 this, &QNetworkAccessManager::sslErrors,
26 [this, &parent](QNetworkReply *reply,
27 QList<QSslError> const &errors) {
28 QString message;
29 QList<QSslError> new_errors;
30 for (auto const &error : errors) {
31 if (!allowed_ssl_errors_.contains(error)) {
32 new_errors << error;
33 message += '\n' +
34 reply->request().url().toDisplayString() +
35 ": " + error.errorString();
36 }
37 }
38 if (new_errors.size()) {
39 QString certs;
40 for (auto const &cert :
41 reply->sslConfiguration().peerCertificateChain()) {
42 certs += cert.toText() + '\n';
43 }
44 if (JS8MessageBox::Ignore ==
45 JS8MessageBox::query_message(
46 parent, tr("Network SSL Errors"), message, certs,
47 JS8MessageBox::Abort | JS8MessageBox::Ignore)) {
48 // accumulate new SSL error exceptions that have been
49 // allowed
50 allowed_ssl_errors_.append(new_errors);
51 reply->ignoreSslErrors(allowed_ssl_errors_);
52 }
53 } else {
54 // no new exceptions so silently ignore the ones already
55 // allowed
56 reply->ignoreSslErrors(allowed_ssl_errors_);
57 }
58 });
59 }
60
61 protected:
62 QNetworkReply *createRequest(Operation operation,
63 QNetworkRequest const &request,
64 QIODevice *outgoing_data = nullptr) override {
65 auto reply = QNetworkAccessManager::createRequest(operation, request,
66 outgoing_data);
67 // errors are usually certificate specific so passing all cached
68 // exceptions here is ok
69 reply->ignoreSslErrors(allowed_ssl_errors_);
70 return reply;
71 }
72
73 private:
74 QList<QSslError> allowed_ssl_errors_;
75};
76
77#endif
Definition qpriorityqueue.h:39