From 695b550e6b4ad87a37f861333ac5e263255adcce Mon Sep 17 00:00:00 2001 From: Stefan Forstenlechner Date: Mon, 17 Jun 2024 23:41:56 +0200 Subject: [PATCH 1/2] Add KeePass header check for testing remote download (#10910) --- share/translations/keepassxc_en.ts | 12 ++++++++---- src/gui/remote/DatabaseSettingsWidgetRemote.cpp | 17 ++++++++++++++++- src/gui/remote/DatabaseSettingsWidgetRemote.h | 2 ++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index 91467de501..51282074f9 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -2332,10 +2332,6 @@ removed from the database. Download failed with error: %1 - - Download finished, but file %1 could not be found. - - Download successful. @@ -2368,6 +2364,14 @@ The command has to exit. In case of `sftp` as last command `exit` has to be sent + + Command finished, but downloaded file does not exist. + + + + Download finished, but file failed KeePass header check. File is not a KeePass file or it's an unsupported version + + DatabaseTabWidget diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp index b38bd828c7..dce1238776 100644 --- a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp +++ b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp @@ -18,6 +18,7 @@ #include "DatabaseSettingsWidgetRemote.h" #include "ui_DatabaseSettingsWidgetRemote.h" +#include "core/Database.h" #include "core/Global.h" #include "core/Metadata.h" @@ -191,10 +192,24 @@ void DatabaseSettingsWidgetRemote::testDownload() } if (!QFile::exists(result.filePath)) { - m_ui->messageWidget->showMessage(tr("Download finished, but file %1 could not be found.").arg(result.filePath), + m_ui->messageWidget->showMessage(tr("Command finished, but downloaded file does not exist."), + MessageWidget::Error); + return; + } + + if (!hasValidPublicHeaders(result.filePath)) { + m_ui->messageWidget->showMessage(tr("Download finished, but file failed KeePass header check. File is not a " + "KeePass file or it's an unsupported version"), MessageWidget::Error); return; } m_ui->messageWidget->showMessage(tr("Download successful."), MessageWidget::Positive); +} + +bool DatabaseSettingsWidgetRemote::hasValidPublicHeaders(QString& filePath) { + // Read public headers + QString error; + QScopedPointer db(new Database()); + return db->open(filePath, nullptr, &error); } \ No newline at end of file diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.h b/src/gui/remote/DatabaseSettingsWidgetRemote.h index fe91b94a79..8f77498d65 100644 --- a/src/gui/remote/DatabaseSettingsWidgetRemote.h +++ b/src/gui/remote/DatabaseSettingsWidgetRemote.h @@ -56,6 +56,8 @@ private slots: QListWidgetItem* findItemByName(const QString& name); void clearFields(); + bool hasValidPublicHeaders(QString& filePath); + QScopedPointer m_remoteSettings; const QScopedPointer m_ui; bool m_modified = false; From 775377406be2195d2f7da701749b6c0200dab778 Mon Sep 17 00:00:00 2001 From: Stefan Forstenlechner Date: Wed, 19 Jun 2024 13:59:55 +0200 Subject: [PATCH 2/2] Add error message from opening database --- share/translations/keepassxc_en.ts | 2 +- .../remote/DatabaseSettingsWidgetRemote.cpp | 19 ++++++++++--------- src/gui/remote/DatabaseSettingsWidgetRemote.h | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index 51282074f9..c88a420c6e 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -2369,7 +2369,7 @@ The command has to exit. In case of `sftp` as last command `exit` has to be sent - Download finished, but file failed KeePass header check. File is not a KeePass file or it's an unsupported version + Downloaded file is not a KeePass file or it's an unsupported version: %1 diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp index dce1238776..6d9135de02 100644 --- a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp +++ b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp @@ -178,12 +178,12 @@ void DatabaseSettingsWidgetRemote::testDownload() params->downloadCommand = m_ui->downloadCommand->text(); params->downloadInput = m_ui->inputForDownload->toPlainText(); - QScopedPointer remoteHandler(new RemoteHandler(this)); if (params->downloadCommand.isEmpty()) { m_ui->messageWidget->showMessage(tr("Download command cannot be empty."), MessageWidget::Warning); return; } + QScopedPointer remoteHandler(new RemoteHandler(this)); RemoteHandler::RemoteResult result = remoteHandler->download(params); if (!result.success) { m_ui->messageWidget->showMessage(tr("Download failed with error: %1").arg(result.errorMessage), @@ -197,19 +197,20 @@ void DatabaseSettingsWidgetRemote::testDownload() return; } - if (!hasValidPublicHeaders(result.filePath)) { - m_ui->messageWidget->showMessage(tr("Download finished, but file failed KeePass header check. File is not a " - "KeePass file or it's an unsupported version"), - MessageWidget::Error); + QString error; + if (!hasValidPublicHeader(result.filePath, &error)) { + m_ui->messageWidget->showMessage( + tr("Downloaded file is not a KeePass file or it's an unsupported version: %1").arg(error), + MessageWidget::Error); return; } m_ui->messageWidget->showMessage(tr("Download successful."), MessageWidget::Positive); } -bool DatabaseSettingsWidgetRemote::hasValidPublicHeaders(QString& filePath) { +bool DatabaseSettingsWidgetRemote::hasValidPublicHeader(QString& filePath, QString* error) +{ // Read public headers - QString error; QScopedPointer db(new Database()); - return db->open(filePath, nullptr, &error); -} \ No newline at end of file + return db->open(filePath, nullptr, error); +} diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.h b/src/gui/remote/DatabaseSettingsWidgetRemote.h index 8f77498d65..c5e384445c 100644 --- a/src/gui/remote/DatabaseSettingsWidgetRemote.h +++ b/src/gui/remote/DatabaseSettingsWidgetRemote.h @@ -56,7 +56,7 @@ private slots: QListWidgetItem* findItemByName(const QString& name); void clearFields(); - bool hasValidPublicHeaders(QString& filePath); + bool hasValidPublicHeader(QString& filePath, QString* error); QScopedPointer m_remoteSettings; const QScopedPointer m_ui;