From 5c865bed99c0ae93ae887ebfaf0318c25a5fbe96 Mon Sep 17 00:00:00 2001 From: Stefan Forstenlechner Date: Mon, 17 Jun 2024 20:18:51 +0200 Subject: [PATCH] Fix use secure temp directory for remote sync (#10911) --- src/gui/DatabaseWidget.cpp | 2 ++ .../remote/DatabaseSettingsWidgetRemote.cpp | 1 + src/gui/remote/RemoteHandler.cpp | 35 +++++++++++++------ src/gui/remote/RemoteHandler.h | 6 +++- src/gui/remote/RemoteProcess.cpp | 1 - 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 4087b74e4..ec2e7f495 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1145,6 +1145,8 @@ void DatabaseWidget::uploadAndFinishSync(const RemoteParams* params, RemoteHandl void DatabaseWidget::finishSync(const RemoteParams* params, RemoteHandler::RemoteResult result) { + QScopedPointer remoteHandler(new RemoteHandler(this)); + remoteHandler->cleanup(result.filePath); setDisabled(false); emit updateSyncProgress(-1, ""); if (result.success) { diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp index b38bd828c..87d6dbab3 100644 --- a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp +++ b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp @@ -196,5 +196,6 @@ void DatabaseSettingsWidgetRemote::testDownload() return; } + remoteHandler->cleanup(result.filePath); m_ui->messageWidget->showMessage(tr("Download successful."), MessageWidget::Positive); } \ No newline at end of file diff --git a/src/gui/remote/RemoteHandler.cpp b/src/gui/remote/RemoteHandler.cpp index 66f2d2d25..9fb23aa68 100644 --- a/src/gui/remote/RemoteHandler.cpp +++ b/src/gui/remote/RemoteHandler.cpp @@ -23,16 +23,6 @@ #include "core/AsyncTask.h" #include "core/Database.h" -namespace -{ - QString getTempFileLocation() - { - QString uuid = QUuid::createUuid().toString().remove(0, 1); - uuid.chop(1); - return QDir::toNativeSeparators(QDir::temp().absoluteFilePath("RemoteDatabase-" + uuid + ".kdbx")); - } -} // namespace - std::function(QObject*)> RemoteHandler::m_createRemoteProcess([](QObject* parent) { return QScopedPointer(new RemoteProcess(parent)); }); @@ -103,6 +93,7 @@ RemoteHandler::RemoteResult RemoteHandler::upload(const QString& filePath, const { return AsyncTask::runAndWaitForFuture([filePath, params] { RemoteResult result; + result.filePath = filePath; if (!params) { result.success = false; result.errorMessage = tr("Invalid database pointer or upload parameters provided."); @@ -143,3 +134,27 @@ RemoteHandler::RemoteResult RemoteHandler::upload(const QString& filePath, const return result; }); } + +QString RemoteHandler::getTempFileLocation() +{ + QString uuid = QUuid::createUuid().toString().remove(0, 1); + uuid.chop(1); + QString writableLocation = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation); + if (writableLocation.isEmpty()) { + writableLocation = QStandardPaths::writableLocation(QStandardPaths::TempLocation); + } + QString tempLocation = QDir(writableLocation).absoluteFilePath(PREFIX + uuid); + QDir().mkdir(tempLocation); + QDir uuidPath(tempLocation); + QFile(uuidPath.path()).setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner | QFileDevice::ExeOwner); + + return QDir::toNativeSeparators(uuidPath.absoluteFilePath("RemoteDatabase-" + uuid + ".kdbx")); +} + +void RemoteHandler::cleanup(QString& tempFileLocation) +{ + QFileInfo file(tempFileLocation); + if (file.absoluteDir().exists() && file.absoluteDir().dirName().startsWith(PREFIX)) { + file.absoluteDir().removeRecursively(); + } +} diff --git a/src/gui/remote/RemoteHandler.h b/src/gui/remote/RemoteHandler.h index a46ee8c19..497dc4a62 100644 --- a/src/gui/remote/RemoteHandler.h +++ b/src/gui/remote/RemoteHandler.h @@ -44,12 +44,16 @@ public: RemoteResult download(const RemoteParams* params); RemoteResult upload(const QString& filePath, const RemoteParams* params); + void cleanup(QString& tempFileLocation); + // Used for testing only static void setRemoteProcessFunc(std::function(QObject*)> func); private: + static QString getTempFileLocation(); + static std::function(QObject*)> m_createRemoteProcess; - static QString m_tempFileLocation; + inline static const QString PREFIX = "KPXC-Sync-"; Q_DISABLE_COPY(RemoteHandler) }; diff --git a/src/gui/remote/RemoteProcess.cpp b/src/gui/remote/RemoteProcess.cpp index 33c0614d5..b1410825b 100644 --- a/src/gui/remote/RemoteProcess.cpp +++ b/src/gui/remote/RemoteProcess.cpp @@ -17,7 +17,6 @@ #include "RemoteProcess.h" -#include #include RemoteProcess::RemoteProcess(QObject* parent)