diff options
| author | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2021-01-25 11:28:48 +0100 |
|---|---|---|
| committer | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2021-01-28 16:21:07 +0100 |
| commit | 1a2dd9276759742a7eda704341ee618d296ad8bf (patch) | |
| tree | d6d0b7f8cf473c2d682aeae12bc2bad0680ace0b /src/network/ssl/qtlsbackend.cpp | |
| parent | 795ea19ca0a7e484793655b35f19de8dbc88e987 (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.cpp | 221 |
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 {}; |
