diff options
author | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2021-01-14 13:54:18 +0100 |
---|---|---|
committer | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2021-01-21 23:01:33 +0100 |
commit | ee89f3a6e39e53013f132f3721332d433817a546 (patch) | |
tree | b34ce4cb9c03e5e42d559704f78abcb8fb463cb5 /src/network/ssl/qsslsocket_schannel.cpp | |
parent | 509196b1d9c1ec9c483d3b7c84168494ef804f95 (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.cpp | 91 |
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 |