diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index 0cf445a864..fd45487f50 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -2409,10 +2409,6 @@ removed from the database. Download failed with error: %1 - - Download finished, but file %1 could not be found. - - Download successful. @@ -2445,6 +2441,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. + + + + Downloaded file is not a KeePass file or it's an unsupported version: %1 + + Timeout: diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp index f66edba7e7..583b3cbca2 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" @@ -186,12 +187,12 @@ void DatabaseSettingsWidgetRemote::testDownload() params->downloadInput = m_ui->inputForDownload->toPlainText(); params->downloadTimeoutMsec = m_ui->downloadTimeoutSec->value() * 1000; - 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), @@ -200,10 +201,25 @@ 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; } + 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::hasValidPublicHeader(QString& filePath, QString* error) +{ + // Read public headers + QScopedPointer db(new Database()); + return db->open(filePath, nullptr, error); +} diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.h b/src/gui/remote/DatabaseSettingsWidgetRemote.h index 6184e4bd91..8c5893f4f9 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 hasValidPublicHeader(QString& filePath, QString* error); + QScopedPointer m_remoteSettings; const QScopedPointer m_ui; bool m_modified = false;