summaryrefslogtreecommitdiffstats
path: root/src/network/ssl/qtlsbackend.cpp
diff options
context:
space:
mode:
authorTimur Pocheptsov <timur.pocheptsov@qt.io>2021-01-25 11:28:48 +0100
committerTimur Pocheptsov <timur.pocheptsov@qt.io>2021-01-28 16:21:07 +0100
commit1a2dd9276759742a7eda704341ee618d296ad8bf (patch)
treed6d0b7f8cf473c2d682aeae12bc2bad0680ace0b /src/network/ssl/qtlsbackend.cpp
parent795ea19ca0a7e484793655b35f19de8dbc88e987 (diff)
TLS backend: merge with its factory
QTlsBackend is a factory itself - it creates TLS/X509 objects. Having an intermediary between Factory->Backend->TLS primitive does not look very natural thus let's squash the first two parts. Backend is a factory creating TLS primitives, but its static functions also provide information about backends availablei and give access to those backends. Fixes: QTBUG-90606 Task-number: QTBUG-65922 Change-Id: I8409d81fd11fb46e6ab4465b4937a7680a8c2447 Reviewed-by: Alex Blasche <alexander.blasche@qt.io> Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/network/ssl/qtlsbackend.cpp')
-rw-r--r--src/network/ssl/qtlsbackend.cpp221
1 files changed, 105 insertions, 116 deletions
diff --git a/src/network/ssl/qtlsbackend.cpp b/src/network/ssl/qtlsbackend.cpp
index 4183c1e2f12..4c726a5b5d2 100644
--- a/src/network/ssl/qtlsbackend.cpp
+++ b/src/network/ssl/qtlsbackend.cpp
@@ -51,99 +51,28 @@
QT_BEGIN_NAMESPACE
Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
- (QTlsBackendFactory_iid, QStringLiteral("/tlsbackends")))
-
-const QString QTlsBackendFactory::builtinBackendNames[] = {
- QStringLiteral("schannel"),
- QStringLiteral("securetransport"),
- QStringLiteral("openssl")
-};
-
-
-QTlsBackend::QTlsBackend() = default;
-QTlsBackend::~QTlsBackend() = default;
-
-const QString dummyName = QStringLiteral("dummyTLS");
-
-QString QTlsBackend::backendName() const
-{
- return dummyName;
-}
-
-QSsl::TlsKey *QTlsBackend::createKey() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, cannot generate a key");
- return nullptr;
-}
-
-QSsl::X509Certificate *QTlsBackend::createCertificate() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, cannot create a certificate");
- return nullptr;
-}
-
-QSsl::TlsCryptograph *QTlsBackend::createTlsCryptograph() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, cannot create TLS session");
- return nullptr;
-}
-
-QSsl::DtlsCryptograph *QTlsBackend::createDtlsCryptograph() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, cannot create DTLS session");
- return nullptr;
-}
-
-QSsl::DtlsCookieVerifier *QTlsBackend::createDtlsCookieVerifier() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, cannot create DTLS cookie generator/verifier");
- return nullptr;
-}
-
-QSsl::X509ChainVerifyPtr QTlsBackend::X509Verifier() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, cannot verify X509 chain");
- return nullptr;
-}
-
-QSsl::X509PemReaderPtr QTlsBackend::X509PemReader() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, cannot read PEM format");
- return nullptr;
-}
-
-QSsl::X509DerReaderPtr QTlsBackend::X509DerReader() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, don't know how to read DER");
- return nullptr;
-}
-
-QSsl::X509Pkcs12ReaderPtr QTlsBackend::X509Pkcs12Reader() const
-{
- qCWarning(lcSsl, "Dummy TLS backend, cannot read PKCS12");
- return nullptr;
-}
+ (QTlsBackend_iid, QStringLiteral("/tlsbackends")))
namespace {
-class BackEndFactoryCollection
+class BackendCollection
{
public:
- void addFactory(QTlsBackendFactory *newFactory)
+ void addBackend(QTlsBackend *backend)
{
- Q_ASSERT(newFactory);
- Q_ASSERT(std::find(backendFactories.begin(), backendFactories.end(), newFactory) == backendFactories.end());
+ Q_ASSERT(backend);
+ Q_ASSERT(std::find(backends.begin(), backends.end(), backend) == backends.end());
const QMutexLocker locker(&collectionMutex);
- backendFactories.push_back(newFactory);
+ backends.push_back(backend);
}
- void removeFactory(QTlsBackendFactory *factory)
+ void removeBackend(QTlsBackend *backend)
{
- Q_ASSERT(factory);
+ Q_ASSERT(backend);
const QMutexLocker locker(&collectionMutex);
- const auto it = std::find(backendFactories.begin(), backendFactories.end(), factory);
- Q_ASSERT(it != backendFactories.end());
- backendFactories.erase(it);
+ const auto it = std::find(backends.begin(), backends.end(), backend);
+ Q_ASSERT(it != backends.end());
+ backends.erase(it);
}
bool tryPopulateCollection()
@@ -176,64 +105,124 @@ public:
return names;
const QMutexLocker locker(&collectionMutex);
- if (!backendFactories.size())
+ if (!backends.size())
return names;
- names.reserve(backendFactories.size());
- for (const auto *factory : backendFactories)
+ names.reserve(backends.size());
+ for (const auto *factory : backends)
names.append(factory->backendName());
return names;
}
- QTlsBackendFactory *factory(const QString &name)
+ QTlsBackend *backend(const QString &name)
{
if (!tryPopulateCollection())
return nullptr;
const QMutexLocker locker(&collectionMutex);
- const auto it = std::find_if(backendFactories.begin(), backendFactories.end(),
+ const auto it = std::find_if(backends.begin(), backends.end(),
[&name](const auto *fct) {return fct->backendName() == name;});
- return it == backendFactories.end() ? nullptr : *it;
+ return it == backends.end() ? nullptr : *it;
}
private:
- std::vector<QTlsBackendFactory *> backendFactories;
+ std::vector<QTlsBackend *> backends;
QMutex collectionMutex;
bool loaded = false;
};
-Q_GLOBAL_STATIC(BackEndFactoryCollection, factories);
+} // Unnamed namespace
+
+Q_GLOBAL_STATIC(BackendCollection, backends);
+
+const QString QTlsBackend::builtinBackendNames[] = {
+ QStringLiteral("schannel"),
+ QStringLiteral("securetransport"),
+ QStringLiteral("openssl")
+};
+
+QTlsBackend::QTlsBackend()
+{
+ if (backends())
+ backends->addBackend(this);
+}
+
+QTlsBackend::~QTlsBackend()
+{
+ if (backends())
+ backends->removeBackend(this);
+}
+
+QString QTlsBackend::backendName() const
+{
+ return QStringLiteral("dummyTLS");
+}
-} // unnamed namespace
+QSsl::TlsKey *QTlsBackend::createKey() const
+{
+ qCWarning(lcSsl, "Dummy TLS backend, cannot generate a key");
+ return nullptr;
+}
-QTlsBackendFactory::QTlsBackendFactory()
+QSsl::X509Certificate *QTlsBackend::createCertificate() const
{
- if (factories())
- factories->addFactory(this);
+ qCWarning(lcSsl, "Dummy TLS backend, cannot create a certificate");
+ return nullptr;
}
-QTlsBackendFactory::~QTlsBackendFactory()
+QSsl::TlsCryptograph *QTlsBackend::createTlsCryptograph() const
{
- if (factories())
- factories->removeFactory(this);
+ qCWarning(lcSsl, "Dummy TLS backend, cannot create TLS session");
+ return nullptr;
}
-QString QTlsBackendFactory::backendName() const
+QSsl::DtlsCryptograph *QTlsBackend::createDtlsCryptograph() const
{
- return dummyName;
+ qCWarning(lcSsl, "Dummy TLS backend, cannot create DTLS session");
+ return nullptr;
+}
+
+QSsl::DtlsCookieVerifier *QTlsBackend::createDtlsCookieVerifier() const
+{
+ qCWarning(lcSsl, "Dummy TLS backend, cannot create DTLS cookie generator/verifier");
+ return nullptr;
+}
+
+QSsl::X509ChainVerifyPtr QTlsBackend::X509Verifier() const
+{
+ qCWarning(lcSsl, "Dummy TLS backend, cannot verify X509 chain");
+ return nullptr;
+}
+
+QSsl::X509PemReaderPtr QTlsBackend::X509PemReader() const
+{
+ qCWarning(lcSsl, "Dummy TLS backend, cannot read PEM format");
+ return nullptr;
+}
+
+QSsl::X509DerReaderPtr QTlsBackend::X509DerReader() const
+{
+ qCWarning(lcSsl, "Dummy TLS backend, don't know how to read DER");
+ return nullptr;
+}
+
+QSsl::X509Pkcs12ReaderPtr QTlsBackend::X509Pkcs12Reader() const
+{
+ qCWarning(lcSsl, "Dummy TLS backend, cannot read PKCS12");
+ return nullptr;
}
-QList<QString> QTlsBackendFactory::availableBackendNames()
+QList<QString> QTlsBackend::availableBackendNames()
{
- if (!factories())
+ if (!backends())
return {};
- return factories->backendNames();
+ return backends->backendNames();
}
-QString QTlsBackendFactory::defaultBackendName()
+QString QTlsBackend::defaultBackendName()
{
// We prefer native as default:
const auto names = availableBackendNames();
@@ -250,46 +239,46 @@ QString QTlsBackendFactory::defaultBackendName()
return {};
}
-QTlsBackend *QTlsBackendFactory::create(const QString &backendName)
+QTlsBackend *QTlsBackend::findBackend(const QString &backendName)
{
- if (!factories())
+ if (!backends())
return {};
- if (const auto *fct = factories->factory(backendName))
- return fct->create();
+ if (auto *fct = backends->backend(backendName))
+ return fct;
qCWarning(lcSsl) << "Cannot create unknown backend named" << backendName;
return nullptr;
}
-QList<QSsl::SslProtocol> QTlsBackendFactory::supportedProtocols(const QString &backendName)
+QList<QSsl::SslProtocol> QTlsBackend::supportedProtocols(const QString &backendName)
{
- if (!factories())
+ if (!backends())
return {};
- if (const auto *fct = factories->factory(backendName))
+ if (const auto *fct = backends->backend(backendName))
return fct->supportedProtocols();
return {};
}
-QList<QSsl::SupportedFeature> QTlsBackendFactory::supportedFeatures(const QString &backendName)
+QList<QSsl::SupportedFeature> QTlsBackend::supportedFeatures(const QString &backendName)
{
- if (!factories())
+ if (!backends())
return {};
- if (const auto *fct = factories->factory(backendName))
+ if (const auto *fct = backends->backend(backendName))
return fct->supportedFeatures();
return {};
}
-QList<QSsl::ImplementedClass> QTlsBackendFactory::implementedClasses(const QString &backendName)
+QList<QSsl::ImplementedClass> QTlsBackend::implementedClasses(const QString &backendName)
{
- if (!factories())
+ if (!backends())
return {};
- if (const auto *fct = factories->factory(backendName))
+ if (const auto *fct = backends->backend(backendName))
return fct->implementedClasses();
return {};