aboutsummaryrefslogtreecommitdiff
path: root/src/client/QXmppEncryptedHttpFileSharingProvider.cpp
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/QXmppEncryptedHttpFileSharingProvider.cpp
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/QXmppEncryptedHttpFileSharingProvider.cpp')
-rw-r--r--src/client/QXmppEncryptedHttpFileSharingProvider.cpp39
1 files changed, 27 insertions, 12 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),