diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-10-02 03:52:21 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-10-02 23:01:13 +0200 |
| commit | 2f6a91642f2585c8b226011a0bb5a3725a012b15 (patch) | |
| tree | aaaa82631dd4d2cb2de0c5cb49ec108ff7c8a1b4 /src/client | |
| parent | d11198502e3bbc7838443147a6dc729f5d1b597d (diff) | |
| download | qxmpp-2f6a91642f2585c8b226011a0bb5a3725a012b15.tar.gz | |
Make EncryptedHttpFileSharingProvider able to handle not just http
However it is still limited by the sources supported by
EncryptedHttpFileSource.
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/QXmppEncryptedHttpFileSharingProvider.cpp | 39 | ||||
| -rw-r--r-- | src/client/QXmppEncryptedHttpFileSharingProvider.h | 4 | ||||
| -rw-r--r-- | src/client/QXmppFileSharingManager.cpp | 17 | ||||
| -rw-r--r-- | src/client/QXmppFileSharingManager.h | 3 |
4 files changed, 45 insertions, 18 deletions
diff --git a/src/client/QXmppEncryptedHttpFileSharingProvider.cpp b/src/client/QXmppEncryptedHttpFileSharingProvider.cpp index 82aa351e..2ba0a665 100644 --- a/src/client/QXmppEncryptedHttpFileSharingProvider.cpp +++ b/src/client/QXmppEncryptedHttpFileSharingProvider.cpp @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2022 Jonah BrĂ¼chert <jbb@kaidan.im> +// SPDX-FileCopyrightText: 2022 Linus Jahn <lnj@kaidan.im> // // SPDX-License-Identifier: LGPL-2.1-or-later #include "QXmppEncryptedHttpFileSharingProvider.h" -#include "QXmppClient.h" #include "QXmppFileEncryption.h" #include "QXmppFileMetadata.h" +#include "QXmppFileSharingManager.h" #include "QXmppFutureUtils_p.h" -#include "QXmppHttpUploadManager.h" #include "QXmppUtils.h" #include "QcaInitializer_p.h" @@ -20,7 +20,7 @@ using namespace QXmpp::Private; /// /// \class QXmppEncryptedHttpFileSharingProvider /// -/// Support for storing files encrypted on an HTTP server +/// Encrypts or decrypts files on the fly when uploading or downloading. /// /// \since QXmpp 1.5 /// @@ -28,19 +28,25 @@ using namespace QXmpp::Private; class QXmppEncryptedHttpFileSharingProviderPrivate { public: - QXmpp::Private::QcaInitializer init; - QXmppHttpFileSharingProvider *httpProvider; + QcaInitializer init; + QXmppFileSharingManager *manager; + std::shared_ptr<QXmppFileSharingProvider> uploadBaseProvider; }; /// /// \brief Create a new QXmppEncryptedHttpFileSharingProvider -/// \param client -/// \param netManager QNetworkAccessManager that can be reused all over your application. /// -QXmppEncryptedHttpFileSharingProvider::QXmppEncryptedHttpFileSharingProvider(QXmppClient *client, QNetworkAccessManager *netManager) +/// \param manager QXmppFileSharingManager to be used to find other providers for downloading +/// encrypted files. +/// \param uploadBaseProvider Provider to be used for uploading the encrypted files. +/// +QXmppEncryptedHttpFileSharingProvider::QXmppEncryptedHttpFileSharingProvider( + QXmppFileSharingManager *manager, + std::shared_ptr<QXmppFileSharingProvider> uploadBaseProvider) : d(std::make_unique<QXmppEncryptedHttpFileSharingProviderPrivate>()) { - d->httpProvider = new QXmppHttpFileSharingProvider(client, netManager); + d->manager = manager; + d->uploadBaseProvider = std::move(uploadBaseProvider); } QXmppEncryptedHttpFileSharingProvider::~QXmppEncryptedHttpFileSharingProvider() = default; @@ -58,9 +64,16 @@ auto QXmppEncryptedHttpFileSharingProvider::downloadFile(const std::any &source, qFatal("QXmppEncryptedHttpFileSharingProvider::downloadFile can only handle QXmppEncryptedFileSource sources"); } - auto httpSource = encryptedSource.httpSources().front(); auto output = std::make_unique<Encryption::DecryptionDevice>(std::move(target), encryptedSource.cipher(), encryptedSource.iv(), encryptedSource.key()); - return d->httpProvider->downloadFile(httpSource, std::move(output), std::move(reportProgress), std::move(reportFinished)); + + // find provider for source of encrypted file + std::any httpSource = encryptedSource.httpSources().front(); + if (auto provider = d->manager->providerForSource(httpSource)) { + return provider->downloadFile(httpSource, std::move(output), std::move(reportProgress), std::move(reportFinished)); + } + + reportFinished(QXmppError { QStringLiteral("No basic file sharing provider available for encrypted file."), {} }); + return {}; } auto QXmppEncryptedHttpFileSharingProvider::uploadFile(std::unique_ptr<QIODevice> data, @@ -81,7 +94,9 @@ auto QXmppEncryptedHttpFileSharingProvider::uploadFile(std::unique_ptr<QIODevice metadata.setMediaType(QMimeDatabase().mimeTypeForName("application/octet-stream")); metadata.setSize(encryptedSize); - return d->httpProvider->uploadFile( + // find provider for source of encrypted file + Q_ASSERT(d->uploadBaseProvider); + return d->uploadBaseProvider->uploadFile( std::move(encDevice), metadata, std::move(reportProgress), diff --git a/src/client/QXmppEncryptedHttpFileSharingProvider.h b/src/client/QXmppEncryptedHttpFileSharingProvider.h index 8f018c71..dee615b0 100644 --- a/src/client/QXmppEncryptedHttpFileSharingProvider.h +++ b/src/client/QXmppEncryptedHttpFileSharingProvider.h @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: 2022 Jonah BrĂ¼chert <jbb@kaidan.im> +// SPDX-FileCopyrightText: 2022 Linus Jahn <lnj@kaidan.im> // // SPDX-License-Identifier: LGPL-2.1-or-later @@ -8,6 +9,7 @@ #include "QXmppEncryptedFileSource.h" #include "QXmppHttpFileSharingProvider.h" +class QXmppFileSharingManager; class QXmppEncryptedHttpFileSharingProviderPrivate; class QXMPP_EXPORT QXmppEncryptedHttpFileSharingProvider : public QXmppFileSharingProvider @@ -17,7 +19,7 @@ public: using SourceType = QXmppEncryptedFileSource; /// \endcond - QXmppEncryptedHttpFileSharingProvider(QXmppClient *client, QNetworkAccessManager *netManager); + QXmppEncryptedHttpFileSharingProvider(QXmppFileSharingManager *manager, std::shared_ptr<QXmppFileSharingProvider> uploadBaseProvider); ~QXmppEncryptedHttpFileSharingProvider() override; auto downloadFile(const std::any &source, diff --git a/src/client/QXmppFileSharingManager.cpp b/src/client/QXmppFileSharingManager.cpp index 30c0ac1e..fc73099c 100644 --- a/src/client/QXmppFileSharingManager.cpp +++ b/src/client/QXmppFileSharingManager.cpp @@ -312,13 +312,11 @@ std::shared_ptr<QXmppDownload> QXmppFileSharingManager::downloadFile( }; fileShare.visitSources([&](const std::any &source) { - std::type_index index(source.type()); - try { - download->m_providerDownload = d->providers.at(index)->downloadFile(source, std::move(output), std::move(onProgress), std::move(onFinished)); + if (auto provider = providerForSource(source)) { + download->m_providerDownload = provider->downloadFile(source, std::move(output), std::move(onProgress), std::move(onFinished)); return true; - } catch (const std::out_of_range &) { - return false; } + return false; }); return download; @@ -329,4 +327,13 @@ void QXmppFileSharingManager::internalRegisterProvider(std::type_index index, st d->providers.insert_or_assign(index, provider); } +std::shared_ptr<QXmppFileSharingProvider> QXmppFileSharingManager::providerForSource(const std::any &source) const +{ + if (auto provider = d->providers.find(std::type_index(source.type())); + provider != d->providers.cend()) { + return provider->second; + } + return {}; +} + #include "QXmppFileSharingManager.moc" diff --git a/src/client/QXmppFileSharingManager.h b/src/client/QXmppFileSharingManager.h index 05039f79..18966379 100644 --- a/src/client/QXmppFileSharingManager.h +++ b/src/client/QXmppFileSharingManager.h @@ -69,7 +69,10 @@ public: std::unique_ptr<QIODevice> output); private: + friend class QXmppEncryptedHttpFileSharingProvider; + void internalRegisterProvider(std::type_index, std::shared_ptr<QXmppFileSharingProvider> provider); + std::shared_ptr<QXmppFileSharingProvider> providerForSource(const std::any &source) const; std::unique_ptr<QXmppFileSharingManagerPrivate> d; }; |
