summaryrefslogtreecommitdiffstats
path: root/src/network/ssl/qsslsocket_schannel.cpp
diff options
context:
space:
mode:
authorTimur Pocheptsov <timur.pocheptsov@qt.io>2021-01-14 13:54:18 +0100
committerTimur Pocheptsov <timur.pocheptsov@qt.io>2021-01-21 23:01:33 +0100
commitee89f3a6e39e53013f132f3721332d433817a546 (patch)
treeb34ce4cb9c03e5e42d559704f78abcb8fb463cb5 /src/network/ssl/qsslsocket_schannel.cpp
parent509196b1d9c1ec9c483d3b7c84168494ef804f95 (diff)
QSslSocket - introduce the API providing information about backends
This API gives the names of available backends and provides a basic information about features/protocols supported by those backends. Also, it has the 'loadBackend' functions which allow to select a particular backend (which are becoming plugins). At the moment, the implementation is still 'hardcoded', the follow-up patch will allow to select different backends in runtime. Task-number: QTBUG-65922 Change-Id: I05877de9c02857594e76b24d52e7578bdb01df69 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'src/network/ssl/qsslsocket_schannel.cpp')
-rw-r--r--src/network/ssl/qsslsocket_schannel.cpp91
1 files changed, 90 insertions, 1 deletions
diff --git a/src/network/ssl/qsslsocket_schannel.cpp b/src/network/ssl/qsslsocket_schannel.cpp
index 65642719c3..f0e9e9c9d2 100644
--- a/src/network/ssl/qsslsocket_schannel.cpp
+++ b/src/network/ssl/qsslsocket_schannel.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtNetwork module of the Qt Toolkit.
@@ -2144,4 +2144,93 @@ bool QSslSocketBackendPrivate::rootCertOnDemandLoadingAllowed()
return allowRootCertOnDemandLoading && s_loadRootCertsOnDemand;
}
+QList<QString> QSslSocketPrivate::availableBackends()
+{
+ return {QStringLiteral("schannel")};
+}
+
+QString QSslSocketPrivate::activeBackend()
+{
+ return availableBackends().first();
+}
+
+bool QSslSocketPrivate::loadBackend(const QString &backendName)
+{
+ if (backendName.size() && !availableBackends().contains(backendName)) {
+ qCWarning(lcSsl) << "A TLS backend with name" << backendName << "is not available";
+ return false;
+ }
+
+ static bool loaded = false;
+ static QBasicMutex mutex;
+ const QMutexLocker locker(&mutex);
+ if (loaded) {
+ qCWarning(lcSsl) << "You have already loaded the backend named:" << activeBackend();
+ qCWarning(lcSsl) << "Cannot load:" << backendName;
+ return true;
+ }
+ // This code to be placed in qsslsocket.cpp and there
+ // the actual plugin to be loaded (so the result can be
+ // false if we, for example, failed to resolve OpenSSL
+ // symbols).
+ return loaded = true;
+}
+
+QList<QSsl::SslProtocol> QSslSocketPrivate::supportedProtocols(const QString &backendName)
+{
+ QList<QSsl::SslProtocol> protocols;
+ if (backendName.size() && backendName != activeBackend()) {
+ qCWarning(lcSsl) << "Unexpected backend name" << backendName
+ << "no information about protocols supported can be found";
+ return protocols;
+ }
+
+ protocols << QSsl::AnyProtocol;
+ protocols << QSsl::SecureProtocols;
+ protocols << QSsl::TlsV1_0;
+ protocols << QSsl::TlsV1_0OrLater;
+ protocols << QSsl::TlsV1_1;
+ protocols << QSsl::TlsV1_1OrLater;
+ protocols << QSsl::TlsV1_2;
+ protocols << QSsl::TlsV1_2OrLater;
+
+ if (supportsTls13()) {
+ protocols << QSsl::TlsV1_3;
+ protocols << QSsl::TlsV1_3OrLater;
+ }
+
+ return protocols;
+}
+
+QList<QSsl::ImplementedClass> QSslSocketPrivate::implementedClasses(const QString &backendName)
+{
+ QList<QSsl::ImplementedClass> classes;
+ if (backendName.size() && backendName != activeBackend()) {
+ qCWarning(lcSsl) << "Unexpected backend name" << backendName
+ << "no information about classes implemented can be found";
+ return classes;
+ }
+
+ classes << QSsl::ImplementedClass::Key;
+ classes << QSsl::ImplementedClass::Certificate;
+ classes << QSsl::ImplementedClass::Socket;
+
+ return classes;
+}
+
+QList<QSsl::SupportedFeature> QSslSocketPrivate::supportedFeatures(const QString &backendName)
+{
+ QList<QSsl::SupportedFeature> features;
+ if (backendName.size() && backendName != activeBackend()) {
+ qCWarning(lcSsl) << "Unexpected backend name" << backendName
+ << "no information about classes implemented can be found";
+ return features;
+ }
+
+ features << QSsl::SupportedFeature::ClientSideAlpn;
+ features << QSsl::SupportedFeature::ServerSideAlpn;
+
+ return features;
+}
+
QT_END_NAMESPACE