aboutsummaryrefslogtreecommitdiff
path: root/src/webclient.cpp
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-19 21:13:32 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-19 21:13:32 +0200
commitbfdc7d39485bbef90a65b79f6c3b0986133f530d (patch)
tree7a50b6c9dc372cb302f064940c25826d0e1e07a1 /src/webclient.cpp
parent63103aa8c7f5b56720da097c73aa99da25841d45 (diff)
downloadkristall-bfdc7d39485bbef90a65b79f6c3b0986133f530d.tar.gz
Reworks TLS trust to enable symmetry between HTTPS and Gemini
Diffstat (limited to 'src/webclient.cpp')
-rw-r--r--src/webclient.cpp62
1 files changed, 52 insertions, 10 deletions
diff --git a/src/webclient.cpp b/src/webclient.cpp
index 6d23ad3..b5d4d9d 100644
--- a/src/webclient.cpp
+++ b/src/webclient.cpp
@@ -32,14 +32,15 @@ bool WebClient::startRequest(const QUrl &url, RequestOptions options)
this->options = options;
this->body.clear();
- QSslConfiguration ssl_config;
+ QNetworkRequest request(url);
+
+ auto ssl_config = request.sslConfiguration();
// ssl_config.setProtocol(QSsl::TlsV1_2);
- // if(global_trust.enable_ca)
- // ssl_config.setCaCertificates(QSslConfiguration::systemCaCertificates());
- // else
- // ssl_config.setCaCertificates(QList<QSslCertificate> { });
+ if(global_https_trust.enable_ca)
+ ssl_config.setCaCertificates(QSslConfiguration::systemCaCertificates());
+ else
+ ssl_config.setCaCertificates(QList<QSslCertificate> { });
- QNetworkRequest request(url);
// request.setMaximumRedirectsAllowed(5);
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, false);
request.setSslConfiguration(ssl_config);
@@ -141,10 +142,51 @@ void WebClient::on_sslErrors(const QList<QSslError> &errors)
return;
}
- qDebug() << "HTTP SSL Errors:";
- for(auto const & err : errors)
- qDebug() << err;
- this->current_reply->ignoreSslErrors();
+ QList<QSslError> remaining_errors = errors;
+ QList<QSslError> ignored_errors;
+
+ int i = 0;
+ while(i < remaining_errors.size())
+ {
+ auto const & err = remaining_errors.at(i);
+
+ bool ignore = false;
+ if(SslTrust::isTrustRelated(err.error()))
+ {
+ if(global_https_trust.isTrusted(current_reply->url(), current_reply->sslConfiguration().peerCertificate()))
+ {
+ ignore = true;
+ }
+ else
+ {
+ emit this->networkError(UntrustedHost, "The requested host is not trusted.");
+ return;
+ }
+ }
+ else if(err.error() == QSslError::UnableToVerifyFirstCertificate)
+ {
+ ignore = true;
+ }
+
+ if(ignore) {
+ ignored_errors.append(err);
+ remaining_errors.removeAt(0);
+ } else {
+ i += 1;
+ }
+ }
+
+ current_reply->ignoreSslErrors(ignored_errors);
+
+ qDebug() << "ignoring" << ignored_errors.size() << "out of" << errors.size();
+
+ for(auto const & error : remaining_errors) {
+ qWarning() << int(error.error()) << error.errorString();
+ }
+
+ if(remaining_errors.size() > 0) {
+ emit this->networkError(TlsFailure, remaining_errors.first().errorString());
+ }
}
void WebClient::on_redirected(const QUrl &url)