aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-10-02 03:52:21 +0200
committerLinus Jahn <lnj@kaidan.im>2022-10-02 23:01:13 +0200
commit2f6a91642f2585c8b226011a0bb5a3725a012b15 (patch)
treeaaaa82631dd4d2cb2de0c5cb49ec108ff7c8a1b4 /src/client
parentd11198502e3bbc7838443147a6dc729f5d1b597d (diff)
downloadqxmpp-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.cpp39
-rw-r--r--src/client/QXmppEncryptedHttpFileSharingProvider.h4
-rw-r--r--src/client/QXmppFileSharingManager.cpp17
-rw-r--r--src/client/QXmppFileSharingManager.h3
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;
};