From 4900dbb3706309ac7558fbe661a64654d7d7d221 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 2 Oct 2022 03:58:06 +0200 Subject: Rename EncryptedHttpProvider to EncryptedProvider --- src/client/QXmppEncryptedFileSharingProvider.cpp | 114 +++++++++++++++++++++ src/client/QXmppEncryptedFileSharingProvider.h | 39 +++++++ .../QXmppEncryptedHttpFileSharingProvider.cpp | 114 --------------------- src/client/QXmppEncryptedHttpFileSharingProvider.h | 39 ------- src/client/QXmppFileSharingManager.h | 2 +- 5 files changed, 154 insertions(+), 154 deletions(-) create mode 100644 src/client/QXmppEncryptedFileSharingProvider.cpp create mode 100644 src/client/QXmppEncryptedFileSharingProvider.h delete mode 100644 src/client/QXmppEncryptedHttpFileSharingProvider.cpp delete mode 100644 src/client/QXmppEncryptedHttpFileSharingProvider.h (limited to 'src/client') diff --git a/src/client/QXmppEncryptedFileSharingProvider.cpp b/src/client/QXmppEncryptedFileSharingProvider.cpp new file mode 100644 index 00000000..b2638d05 --- /dev/null +++ b/src/client/QXmppEncryptedFileSharingProvider.cpp @@ -0,0 +1,114 @@ +// SPDX-FileCopyrightText: 2022 Jonah Brüchert +// SPDX-FileCopyrightText: 2022 Linus Jahn +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "QXmppEncryptedFileSharingProvider.h" + +#include "QXmppFileEncryption.h" +#include "QXmppFileMetadata.h" +#include "QXmppFileSharingManager.h" +#include "QXmppFutureUtils_p.h" +#include "QXmppUtils.h" + +#include "QcaInitializer_p.h" +#include + +using namespace QXmpp; +using namespace QXmpp::Private; + +/// +/// \class QXmppEncryptedFileSharingProvider +/// +/// Encrypts or decrypts files on the fly when uploading or downloading. +/// +/// \since QXmpp 1.5 +/// + +class QXmppEncryptedFileSharingProviderPrivate +{ +public: + QcaInitializer init; + QXmppFileSharingManager *manager; + std::shared_ptr uploadBaseProvider; +}; + +/// +/// \brief Create a new QXmppEncryptedFileSharingProvider +/// +/// \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. +/// +QXmppEncryptedFileSharingProvider::QXmppEncryptedFileSharingProvider( + QXmppFileSharingManager *manager, + std::shared_ptr uploadBaseProvider) + : d(std::make_unique()) +{ + d->manager = manager; + d->uploadBaseProvider = std::move(uploadBaseProvider); +} + +QXmppEncryptedFileSharingProvider::~QXmppEncryptedFileSharingProvider() = default; + +auto QXmppEncryptedFileSharingProvider::downloadFile(const std::any &source, + std::unique_ptr target, + std::function reportProgress, + std::function reportFinished) + -> std::shared_ptr +{ + QXmppEncryptedFileSource encryptedSource; + try { + encryptedSource = std::any_cast(source); + } catch (const std::bad_any_cast &) { + qFatal("QXmppEncryptedFileSharingProvider::downloadFile can only handle QXmppEncryptedFileSource sources"); + } + + auto output = std::make_unique(std::move(target), encryptedSource.cipher(), encryptedSource.iv(), encryptedSource.key()); + + // 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 QXmppEncryptedFileSharingProvider::uploadFile(std::unique_ptr data, + const QXmppFileMetadata &, + std::function reportProgress, + std::function reportFinished) + -> std::shared_ptr +{ + auto cipher = Aes256CbcPkcs7; + auto key = Encryption::generateKey(cipher); + auto iv = Encryption::generateInitializationVector(cipher); + + auto encDevice = std::make_unique(std::move(data), cipher, key, iv); + auto encryptedSize = encDevice->size(); + + QXmppFileMetadata metadata; + metadata.setFilename(QXmppUtils::generateStanzaHash(10)); + metadata.setMediaType(QMimeDatabase().mimeTypeForName("application/octet-stream")); + metadata.setSize(encryptedSize); + + // find provider for source of encrypted file + Q_ASSERT(d->uploadBaseProvider); + return d->uploadBaseProvider->uploadFile( + std::move(encDevice), + metadata, + std::move(reportProgress), + [=, reportFinished = std::move(reportFinished)](UploadResult result) { + auto encryptedResult = visitForward(std::move(result), [&](std::any httpSourceAny) { + QXmppEncryptedFileSource encryptedSource; + encryptedSource.setKey(key); + encryptedSource.setIv(iv); + encryptedSource.setHttpSources({ std::any_cast(std::move(httpSourceAny)) }); + + return encryptedSource; + }); + reportFinished(std::move(encryptedResult)); + }); +} diff --git a/src/client/QXmppEncryptedFileSharingProvider.h b/src/client/QXmppEncryptedFileSharingProvider.h new file mode 100644 index 00000000..d5112348 --- /dev/null +++ b/src/client/QXmppEncryptedFileSharingProvider.h @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2022 Jonah Brüchert +// SPDX-FileCopyrightText: 2022 Linus Jahn +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#ifndef QXMPPENCRYPTEDHTTPFILESHARINGPROVIDER_H +#define QXMPPENCRYPTEDHTTPFILESHARINGPROVIDER_H + +#include "QXmppEncryptedFileSource.h" +#include "QXmppHttpFileSharingProvider.h" + +class QXmppFileSharingManager; +class QXmppEncryptedFileSharingProviderPrivate; + +class QXMPP_EXPORT QXmppEncryptedFileSharingProvider : public QXmppFileSharingProvider +{ +public: + /// \cond + using SourceType = QXmppEncryptedFileSource; + /// \endcond + + QXmppEncryptedFileSharingProvider(QXmppFileSharingManager *manager, std::shared_ptr uploadBaseProvider); + ~QXmppEncryptedFileSharingProvider() override; + + auto downloadFile(const std::any &source, + std::unique_ptr target, + std::function reportProgress, + std::function reportFinished) -> std::shared_ptr override; + + auto uploadFile(std::unique_ptr source, + const QXmppFileMetadata &info, + std::function reportProgress, + std::function reportFinished) -> std::shared_ptr override; + +private: + std::unique_ptr d; +}; + +#endif // QXMPPENCRYPTEDHTTPFILESHARINGPROVIDER_H diff --git a/src/client/QXmppEncryptedHttpFileSharingProvider.cpp b/src/client/QXmppEncryptedHttpFileSharingProvider.cpp deleted file mode 100644 index 2ba0a665..00000000 --- a/src/client/QXmppEncryptedHttpFileSharingProvider.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Jonah Brüchert -// SPDX-FileCopyrightText: 2022 Linus Jahn -// -// SPDX-License-Identifier: LGPL-2.1-or-later - -#include "QXmppEncryptedHttpFileSharingProvider.h" - -#include "QXmppFileEncryption.h" -#include "QXmppFileMetadata.h" -#include "QXmppFileSharingManager.h" -#include "QXmppFutureUtils_p.h" -#include "QXmppUtils.h" - -#include "QcaInitializer_p.h" -#include - -using namespace QXmpp; -using namespace QXmpp::Private; - -/// -/// \class QXmppEncryptedHttpFileSharingProvider -/// -/// Encrypts or decrypts files on the fly when uploading or downloading. -/// -/// \since QXmpp 1.5 -/// - -class QXmppEncryptedHttpFileSharingProviderPrivate -{ -public: - QcaInitializer init; - QXmppFileSharingManager *manager; - std::shared_ptr uploadBaseProvider; -}; - -/// -/// \brief Create a new QXmppEncryptedHttpFileSharingProvider -/// -/// \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 uploadBaseProvider) - : d(std::make_unique()) -{ - d->manager = manager; - d->uploadBaseProvider = std::move(uploadBaseProvider); -} - -QXmppEncryptedHttpFileSharingProvider::~QXmppEncryptedHttpFileSharingProvider() = default; - -auto QXmppEncryptedHttpFileSharingProvider::downloadFile(const std::any &source, - std::unique_ptr target, - std::function reportProgress, - std::function reportFinished) - -> std::shared_ptr -{ - QXmppEncryptedFileSource encryptedSource; - try { - encryptedSource = std::any_cast(source); - } catch (const std::bad_any_cast &) { - qFatal("QXmppEncryptedHttpFileSharingProvider::downloadFile can only handle QXmppEncryptedFileSource sources"); - } - - auto output = std::make_unique(std::move(target), encryptedSource.cipher(), encryptedSource.iv(), encryptedSource.key()); - - // 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 data, - const QXmppFileMetadata &, - std::function reportProgress, - std::function reportFinished) - -> std::shared_ptr -{ - auto cipher = Aes256CbcPkcs7; - auto key = Encryption::generateKey(cipher); - auto iv = Encryption::generateInitializationVector(cipher); - - auto encDevice = std::make_unique(std::move(data), cipher, key, iv); - auto encryptedSize = encDevice->size(); - - QXmppFileMetadata metadata; - metadata.setFilename(QXmppUtils::generateStanzaHash(10)); - metadata.setMediaType(QMimeDatabase().mimeTypeForName("application/octet-stream")); - metadata.setSize(encryptedSize); - - // find provider for source of encrypted file - Q_ASSERT(d->uploadBaseProvider); - return d->uploadBaseProvider->uploadFile( - std::move(encDevice), - metadata, - std::move(reportProgress), - [=, reportFinished = std::move(reportFinished)](UploadResult result) { - auto encryptedResult = visitForward(std::move(result), [&](std::any httpSourceAny) { - QXmppEncryptedFileSource encryptedSource; - encryptedSource.setKey(key); - encryptedSource.setIv(iv); - encryptedSource.setHttpSources({ std::any_cast(std::move(httpSourceAny)) }); - - return encryptedSource; - }); - reportFinished(std::move(encryptedResult)); - }); -} diff --git a/src/client/QXmppEncryptedHttpFileSharingProvider.h b/src/client/QXmppEncryptedHttpFileSharingProvider.h deleted file mode 100644 index dee615b0..00000000 --- a/src/client/QXmppEncryptedHttpFileSharingProvider.h +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Jonah Brüchert -// SPDX-FileCopyrightText: 2022 Linus Jahn -// -// SPDX-License-Identifier: LGPL-2.1-or-later - -#ifndef QXMPPENCRYPTEDHTTPFILESHARINGPROVIDER_H -#define QXMPPENCRYPTEDHTTPFILESHARINGPROVIDER_H - -#include "QXmppEncryptedFileSource.h" -#include "QXmppHttpFileSharingProvider.h" - -class QXmppFileSharingManager; -class QXmppEncryptedHttpFileSharingProviderPrivate; - -class QXMPP_EXPORT QXmppEncryptedHttpFileSharingProvider : public QXmppFileSharingProvider -{ -public: - /// \cond - using SourceType = QXmppEncryptedFileSource; - /// \endcond - - QXmppEncryptedHttpFileSharingProvider(QXmppFileSharingManager *manager, std::shared_ptr uploadBaseProvider); - ~QXmppEncryptedHttpFileSharingProvider() override; - - auto downloadFile(const std::any &source, - std::unique_ptr target, - std::function reportProgress, - std::function reportFinished) -> std::shared_ptr override; - - auto uploadFile(std::unique_ptr source, - const QXmppFileMetadata &info, - std::function reportProgress, - std::function reportFinished) -> std::shared_ptr override; - -private: - std::unique_ptr d; -}; - -#endif // QXMPPENCRYPTEDHTTPFILESHARINGPROVIDER_H diff --git a/src/client/QXmppFileSharingManager.h b/src/client/QXmppFileSharingManager.h index 18966379..b59eb46b 100644 --- a/src/client/QXmppFileSharingManager.h +++ b/src/client/QXmppFileSharingManager.h @@ -69,7 +69,7 @@ public: std::unique_ptr output); private: - friend class QXmppEncryptedHttpFileSharingProvider; + friend class QXmppEncryptedFileSharingProvider; void internalRegisterProvider(std::type_index, std::shared_ptr provider); std::shared_ptr providerForSource(const std::any &source) const; -- cgit v1.2.3