From d2da13da2004154b68c991f62476d9ac5e19953d Mon Sep 17 00:00:00 2001 From: sforst Date: Mon, 7 Oct 2024 04:39:50 +0200 Subject: [PATCH] Support opening remote databases (#10896) * Use the import wizard to support opening a remote database --------- Co-authored-by: Jonathan White --- docs/topics/ImportExport.adoc | 16 ++++ share/translations/keepassxc_en.ts | 38 +++++++++ src/gui/DatabaseTabWidget.cpp | 92 ++++++++++++---------- src/gui/DatabaseTabWidget.h | 4 +- src/gui/wizard/ImportWizard.cpp | 5 ++ src/gui/wizard/ImportWizard.h | 15 +++- src/gui/wizard/ImportWizardPageReview.cpp | 55 +++++++++++++ src/gui/wizard/ImportWizardPageReview.h | 11 +++ src/gui/wizard/ImportWizardPageSelect.cpp | 66 +++++++++++++++- src/gui/wizard/ImportWizardPageSelect.h | 2 + src/gui/wizard/ImportWizardPageSelect.ui | 73 ++++++++++++++--- tests/data/SyncDatabase.kdbx | Bin 32286 -> 33070 bytes tests/gui/TestGui.cpp | 63 +++++++++++++-- tests/gui/TestGui.h | 1 + 14 files changed, 379 insertions(+), 62 deletions(-) diff --git a/docs/topics/ImportExport.adoc b/docs/topics/ImportExport.adoc index bcae4ce57..5786c2ab1 100644 --- a/docs/topics/ImportExport.adoc +++ b/docs/topics/ImportExport.adoc @@ -11,6 +11,7 @@ KeePassXC allows you to import external databases from the following options: * 1Password Vault (.opvault) * Bitwarden (.json) * KeePass 1 Database (.kdb) +* Remote database (.kdbx) To import any of these files, start KeePassXC and either click the `Import File` button on the welcome screen or use the menu Database > Import... to launch the Import Wizard. @@ -67,6 +68,21 @@ To import a KeePass 1 database file in KeePassXC, perform the following steps: 3. Click `Continue` to unlock and preview the import. Click `Done` to complete the import. +=== Importing Remote Database +Database files that are stored in a remote location can be imported or opened with KeePassXC if you provide a command to download the file from the remote location. + +To import (or temporarily open) a remote database file in KeePassXC, perform the following steps: + +1. Open the Import Wizard as shown above. Select the Remote Database option. + +2. Enter a command to download the remote database. If necessary, enter input that needs to be passed to the command. The command and/or input need a `{TEMP_DATABASE}` placeholder specified where the remote database is temporarily stored. + +3. Enter the password for your database and optionally provide a key file. + +4. Click `Continue` to unlock and preview the import. Click `Done` to complete the import. + +Opening without importing a remote database is possible by selecting Temporary Database in the Import Into section of the wizard. + == Exporting Databases KeePassXC supports multiple ways to export your database for transfer to another program or to print out and archive. diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index 36de355aa..2ef44aa50 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -4490,6 +4490,14 @@ You can enable the DuckDuckGo website icon service in the security section of th Url + + Could not load key file. + + + + Could not open remote database. Password or key file may be incorrect. + + ImportWizardPageSelect @@ -4593,6 +4601,36 @@ You can enable the DuckDuckGo website icon service in the security section of th KeePass1 Database + + Temporary Database + + + + Command: + + + + e.g.: "sftp user@hostname" or "scp user@hostname:DatabaseOnRemote.kdbx {TEMP_DATABASE}" + + + + Input: + + + + Remote Database (.kdbx) + + + + e.g.: +get DatabaseOnRemote.kdbx {TEMP_DATABASE} +exit +--- +{TEMP_DATABASE} is used as placeholder to store the database in a temporary location +The command has to exit. In case of `sftp` as last commend `exit` has to be sent + + + KMessageWidget diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index b9b26d377..f5cfd70d8 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -35,13 +35,13 @@ #include "gui/osutils/macutils/MacUtils.h" #endif #include "gui/wizard/NewDatabaseWizard.h" -#include "wizard/ImportWizard.h" DatabaseTabWidget::DatabaseTabWidget(QWidget* parent) : QTabWidget(parent) , m_dbWidgetStateSync(new DatabaseWidgetStateSync(this)) , m_dbWidgetPendingLock(nullptr) , m_databaseOpenDialog(new DatabaseOpenDialog(this)) + , m_importWizard(nullptr) , m_databaseOpenInProgress(false) { auto* tabBar = new QTabBar(this); @@ -255,53 +255,65 @@ void DatabaseTabWidget::addDatabaseTab(DatabaseWidget* dbWidget, bool inBackgrou &DatabaseTabWidget::unlockDatabaseInDialogForSync); } -DatabaseWidget* DatabaseTabWidget::importFile() +void DatabaseTabWidget::importFile() { // Show the import wizard - QScopedPointer wizard(new ImportWizard(this)); - if (!wizard->exec()) { - return nullptr; - } + m_importWizard = new ImportWizard(this); - auto db = wizard->database(); - if (!db) { - // Import wizard was cancelled - return nullptr; - } - - auto importInto = wizard->importInto(); - if (importInto.first.isNull()) { - // Start the new database wizard with the imported database - auto newDb = execNewDatabaseWizard(); - if (newDb) { - // Merge the imported db into the new one - Merger merger(db.data(), newDb.data()); - merger.setSkipDatabaseCustomData(true); - merger.merge(); - // Show the new database - auto dbWidget = new DatabaseWidget(newDb, this); - addDatabaseTab(dbWidget); - newDb->markAsModified(); - return dbWidget; + connect(m_importWizard.data(), &QWizard::finished, [&](int result) { + if (result != QDialog::Accepted) { + return; } - } else { - for (int i = 0, c = count(); i < c; ++i) { - // Find the database and group to import into based on import wizard choice - auto dbWidget = databaseWidgetFromIndex(i); - if (!dbWidget->isLocked() && dbWidget->database()->uuid() == importInto.first) { - auto group = dbWidget->database()->rootGroup()->findGroupByUuid(importInto.second); - if (group) { - // Extract the root group from the import database - auto importGroup = db->setRootGroup(new Group()); - importGroup->setParent(group); - setCurrentIndex(i); - return dbWidget; + + auto db = m_importWizard->database(); + if (!db) { + // Import wizard was cancelled + return; + } + + switch (m_importWizard->importIntoType()) { + case ImportWizard::EXISTING_DATABASE: + for (int i = 0, c = count(); i < c; ++i) { + auto importInto = m_importWizard->importInto(); + // Find the database and group to import into based on import wizard choice + auto dbWidget = databaseWidgetFromIndex(i); + if (!dbWidget->isLocked() && dbWidget->database()->uuid() == importInto.first) { + auto group = dbWidget->database()->rootGroup()->findGroupByUuid(importInto.second); + if (group) { + // Extract the root group from the import database + auto importGroup = db->setRootGroup(new Group()); + importGroup->setParent(group); + setCurrentIndex(i); + return; + } } } + break; + case ImportWizard::TEMPORARY_DATABASE: { + // Use the already created database as temporary database + auto dbWidget = new DatabaseWidget(db, this); + addDatabaseTab(dbWidget); + return; } - } + default: + // Start the new database wizard with the imported database + auto newDb = execNewDatabaseWizard(); + if (newDb) { + // Merge the imported db into the new one + Merger merger(db.data(), newDb.data()); + merger.setSkipDatabaseCustomData(true); + merger.merge(); + // Show the new database + auto dbWidget = new DatabaseWidget(newDb, this); + addDatabaseTab(dbWidget); + newDb->markAsModified(); + return; + } + } + }); - return nullptr; + // use `open` instead of `exec`. `exec` should not be used, see https://doc.qt.io/qt-6/qdialog.html#exec + m_importWizard->show(); } void DatabaseTabWidget::mergeDatabase() diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index aa8542dd9..eb5e06b30 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -21,6 +21,7 @@ #include "DatabaseOpenDialog.h" #include "config-keepassx.h" #include "gui/MessageWidget.h" +#include "wizard/ImportWizard.h" #include #include @@ -64,7 +65,7 @@ public slots: DatabaseWidget* newDatabase(); void openDatabase(); void mergeDatabase(); - DatabaseWidget* importFile(); + void importFile(); bool saveDatabase(int index = -1); bool saveDatabaseAs(int index = -1); bool saveDatabaseBackup(int index = -1); @@ -123,6 +124,7 @@ private: QPointer m_dbWidgetStateSync; QPointer m_dbWidgetPendingLock; QPointer m_databaseOpenDialog; + QPointer m_importWizard; QTimer m_lockDelayTimer; bool m_databaseOpenInProgress; }; diff --git a/src/gui/wizard/ImportWizard.cpp b/src/gui/wizard/ImportWizard.cpp index 05fdbfe38..ff3769347 100644 --- a/src/gui/wizard/ImportWizard.cpp +++ b/src/gui/wizard/ImportWizard.cpp @@ -69,6 +69,11 @@ bool ImportWizard::validateCurrentPage() return ret; } +ImportWizard::ImportIntoType ImportWizard::importIntoType() +{ + return static_cast(field("ImportIntoType").toInt()); +} + QPair ImportWizard::importInto() { auto list = field("ImportInto").toList(); diff --git a/src/gui/wizard/ImportWizard.h b/src/gui/wizard/ImportWizard.h index b7e9de68d..95bf8b998 100644 --- a/src/gui/wizard/ImportWizard.h +++ b/src/gui/wizard/ImportWizard.h @@ -19,6 +19,7 @@ #define KEEPASSXC_IMPORTWIZARD_H #include +#include #include class Database; @@ -39,7 +40,6 @@ public: bool validateCurrentPage() override; QSharedPointer database(); - QPair importInto(); enum ImportType { @@ -48,9 +48,20 @@ public: IMPORT_OPVAULT, IMPORT_OPUX, IMPORT_BITWARDEN, - IMPORT_KEEPASS1 + IMPORT_KEEPASS1, + IMPORT_REMOTE, }; + enum ImportIntoType + { + NEW_DATABASE = 1, + EXISTING_DATABASE, + TEMPORARY_DATABASE, + }; + + ImportWizard::ImportIntoType importIntoType(); + QPair importInto(); + private: QSharedPointer m_db; QPointer m_pageSelect; diff --git a/src/gui/wizard/ImportWizardPageReview.cpp b/src/gui/wizard/ImportWizardPageReview.cpp index 2cb56791b..55492a67f 100644 --- a/src/gui/wizard/ImportWizardPageReview.cpp +++ b/src/gui/wizard/ImportWizardPageReview.cpp @@ -27,14 +27,23 @@ #include "gui/csvImport/CsvImportWidget.h" #include "gui/wizard/ImportWizard.h" +#include "cli/Utils.h" +#include "keys/FileKey.h" +#include "keys/PasswordKey.h" + #include #include #include #include +#include "gui/remote/RemoteSettings.h" + +struct RemoteParams; + ImportWizardPageReview::ImportWizardPageReview(QWidget* parent) : QWizardPage(parent) , m_ui(new Ui::ImportWizardPageReview) + , m_remoteHandler(new RemoteHandler(this)) { } @@ -80,6 +89,12 @@ void ImportWizardPageReview::initializePage() m_db = importBitwarden(filename, field("ImportPassword").toString()); setupDatabasePreview(); break; + case ImportWizard::IMPORT_REMOTE: + m_db = importRemote(field("DownloadCommand").toString(), + field("DownloadInput").toString(), + field("ImportPassword").toString(), + field("ImportKeyFile").toString()); + setupDatabasePreview(); default: break; } @@ -200,3 +215,43 @@ ImportWizardPageReview::importKeePass1(const QString& filename, const QString& p return db; } + +QSharedPointer ImportWizardPageReview::importRemote(const QString& downloadCommand, + const QString& downloadInput, + const QString& password, + const QString& keyfile) +{ + auto* params = new RemoteParams(); + params->downloadCommand = downloadCommand; + params->downloadInput = downloadInput; + + auto result = m_remoteHandler->download(params); + + if (!result.success) { + m_ui->messageWidget->showMessage(result.errorMessage, KMessageWidget::Error, -1); + } + + auto key = QSharedPointer::create(); + + if (!password.isEmpty()) { + key->addKey(QSharedPointer::create(password)); + } + if (!keyfile.isEmpty()) { + QSharedPointer fileKey = QSharedPointer::create(); + if (Utils::loadFileKey(keyfile, fileKey)) { + key->addKey(fileKey); + } else { + m_ui->messageWidget->showMessage(tr("Could not load key file."), KMessageWidget::Error, -1); + } + } + + QString error; + QSharedPointer remoteDb = QSharedPointer::create(); + remoteDb->markAsTemporaryDatabase(); + if (!remoteDb->open(result.filePath, key, &error)) { + m_ui->messageWidget->showMessage( + tr("Could not open remote database. Password or key file may be incorrect."), KMessageWidget::Error, -1); + } + + return remoteDb; +} diff --git a/src/gui/wizard/ImportWizardPageReview.h b/src/gui/wizard/ImportWizardPageReview.h index 87f501c85..c1df3efff 100644 --- a/src/gui/wizard/ImportWizardPageReview.h +++ b/src/gui/wizard/ImportWizardPageReview.h @@ -21,6 +21,12 @@ #include #include +#include +#include +#include + +#include "../remote/RemoteHandler.h" + class CsvImportWidget; class Database; namespace Ui @@ -48,6 +54,10 @@ private: QSharedPointer importBitwarden(const QString& filename, const QString& password); QSharedPointer importOPVault(const QString& filename, const QString& password); QSharedPointer importKeePass1(const QString& filename, const QString& password, const QString& keyfile); + QSharedPointer importRemote(const QString& downloadCommand, + const QString& downloadInput, + const QString& password, + const QString& keyfile); void setupDatabasePreview(); @@ -55,6 +65,7 @@ private: QSharedPointer m_db; QPointer m_csvWidget; + QPointer m_remoteHandler; }; #endif diff --git a/src/gui/wizard/ImportWizardPageSelect.cpp b/src/gui/wizard/ImportWizardPageSelect.cpp index 43b0e8f2a..e7bdacc9f 100644 --- a/src/gui/wizard/ImportWizardPageSelect.cpp +++ b/src/gui/wizard/ImportWizardPageSelect.cpp @@ -25,6 +25,8 @@ #include "gui/Icons.h" #include "gui/MainWindow.h" +#include + ImportWizardPageSelect::ImportWizardPageSelect(QWidget* parent) : QWizardPage(parent) , m_ui(new Ui::ImportWizardPageSelect()) @@ -36,12 +38,14 @@ ImportWizardPageSelect::ImportWizardPageSelect(QWidget* parent) new QListWidgetItem(icons()->icon("onepassword"), tr("1Password Vault (.opvault)"), m_ui->importTypeList); new QListWidgetItem(icons()->icon("bitwarden"), tr("Bitwarden (.json)"), m_ui->importTypeList); new QListWidgetItem(icons()->icon("object-locked"), tr("KeePass 1 Database (.kdb)"), m_ui->importTypeList); + new QListWidgetItem(icons()->icon("web"), tr("Remote Database (.kdbx)"), m_ui->importTypeList); m_ui->importTypeList->item(0)->setData(Qt::UserRole, ImportWizard::IMPORT_CSV); m_ui->importTypeList->item(1)->setData(Qt::UserRole, ImportWizard::IMPORT_OPUX); m_ui->importTypeList->item(2)->setData(Qt::UserRole, ImportWizard::IMPORT_OPVAULT); m_ui->importTypeList->item(3)->setData(Qt::UserRole, ImportWizard::IMPORT_BITWARDEN); m_ui->importTypeList->item(4)->setData(Qt::UserRole, ImportWizard::IMPORT_KEEPASS1); + m_ui->importTypeList->item(5)->setData(Qt::UserRole, ImportWizard::IMPORT_REMOTE); connect(m_ui->importTypeList, &QListWidget::currentItemChanged, this, &ImportWizardPageSelect::itemSelected); m_ui->importTypeList->setCurrentRow(0); @@ -54,11 +58,22 @@ ImportWizardPageSelect::ImportWizardPageSelect(QWidget* parent) updateDatabaseChoices(); + m_ui->downloadCommandHelpButton->setIcon(icons()->icon("system-help")); + connect(m_ui->downloadCommandHelpButton, &QToolButton::clicked, this, [] { + QDesktopServices::openUrl(QUrl("https://keepassxc.org/docs/KeePassXC_UserGuide#_remote_database_support")); + }); + + connect(m_ui->importFileEdit, &QLineEdit::textChanged, this, &QWizardPage::completeChanged); + connect(m_ui->downloadCommand, &QLineEdit::textChanged, this, &QWizardPage::completeChanged); + registerField("ImportType", this); - registerField("ImportFile*", m_ui->importFileEdit); - registerField("ImportInto", m_ui->importIntoLabel); + registerField("ImportFile", m_ui->importFileEdit); + registerField("ImportIntoType", m_ui->importIntoGroupBox); // This is intentional + registerField("ImportInto", m_ui->importIntoLabel); // This is intentional registerField("ImportPassword", m_ui->passwordEdit, "text", "textChanged"); registerField("ImportKeyFile", m_ui->keyFileEdit); + registerField("DownloadCommand", m_ui->downloadCommand); + registerField("DownloadInput", m_ui->downloadCommandInput, "plainText", "textChanged"); } ImportWizardPageSelect::~ImportWizardPageSelect() @@ -77,14 +92,27 @@ bool ImportWizardPageSelect::validatePage() if (m_ui->existingDatabaseChoice->currentIndex() == -1) { return false; } + setField("ImportIntoType", ImportWizard::EXISTING_DATABASE); setField("ImportInto", m_ui->existingDatabaseChoice->currentData()); + } else if (m_ui->temporaryDatabaseRadio->isChecked()) { + setField("ImportIntoType", ImportWizard::TEMPORARY_DATABASE); + setField("ImportInto", {}); } else { + setField("ImportIntoType", ImportWizard::NEW_DATABASE); setField("ImportInto", {}); } return true; } +bool ImportWizardPageSelect::isComplete() const +{ + if (field("ImportType").toInt() == ImportWizard::IMPORT_REMOTE) { + return !field("DownloadCommand").toString().isEmpty(); + } + return !field("ImportFile").toString().isEmpty(); +} + void ImportWizardPageSelect::itemSelected(QListWidgetItem* current, QListWidgetItem* previous) { Q_UNUSED(previous) @@ -105,15 +133,22 @@ void ImportWizardPageSelect::itemSelected(QListWidgetItem* current, QListWidgetI case ImportWizard::IMPORT_CSV: case ImportWizard::IMPORT_OPUX: setCredentialState(false); + setDownloadCommand(false); break; // Password may be required case ImportWizard::IMPORT_BITWARDEN: case ImportWizard::IMPORT_OPVAULT: setCredentialState(true); + setDownloadCommand(false); break; // Password and/or Key File may be required case ImportWizard::IMPORT_KEEPASS1: setCredentialState(true, true); + setDownloadCommand(false); + break; + case ImportWizard::IMPORT_REMOTE: + setCredentialState(true, true); + setDownloadCommand(true); break; default: Q_ASSERT(false); @@ -228,6 +263,33 @@ void ImportWizardPageSelect::setCredentialState(bool passwordEnabled, bool keyFi } } +void ImportWizardPageSelect::setDownloadCommand(bool downloadCommandEnabled) +{ + bool downloadCommandStateChanged = m_ui->downloadCommandLabel->isVisible() != downloadCommandEnabled; + m_ui->downloadCommandLabel->setVisible(downloadCommandEnabled); + m_ui->downloadCommand->setVisible(downloadCommandEnabled); + m_ui->downloadCommandInputLabel->setVisible(downloadCommandEnabled); + m_ui->downloadCommandInput->setVisible(downloadCommandEnabled); + m_ui->downloadCommandHelpButton->setVisible(downloadCommandEnabled); + + m_ui->temporaryDatabaseRadio->setVisible(downloadCommandEnabled); + + m_ui->importFileLabel->setVisible(!downloadCommandEnabled); + m_ui->importFileEdit->setVisible(!downloadCommandEnabled); + m_ui->importFileButton->setVisible(!downloadCommandEnabled); + + // Workaround Qt bug where the wizard window is not updated when the internal layout changes + if (window()) { + int height = window()->height(); + if (downloadCommandStateChanged) { + auto diff = m_ui->downloadCommand->height() + m_ui->downloadCommandInput->height() + + m_ui->temporaryDatabaseRadio->height() + m_ui->inputFields->layout()->spacing(); + height += downloadCommandEnabled ? diff : -diff; + } + window()->resize(window()->width(), height); + } +} + QString ImportWizardPageSelect::importFileFilter() { switch (field("ImportType").toInt()) { diff --git a/src/gui/wizard/ImportWizardPageSelect.h b/src/gui/wizard/ImportWizardPageSelect.h index 029865a56..5c4024ea5 100644 --- a/src/gui/wizard/ImportWizardPageSelect.h +++ b/src/gui/wizard/ImportWizardPageSelect.h @@ -39,6 +39,7 @@ public: void initializePage() override; bool validatePage() override; + bool isComplete() const override; private slots: void itemSelected(QListWidgetItem* current, QListWidgetItem* previous); @@ -49,6 +50,7 @@ private slots: private: QString importFileFilter(); void setCredentialState(bool passwordEnabled, bool keyFileEnable = false); + void setDownloadCommand(bool downloadCommandEnabled); QScopedPointer m_ui; }; diff --git a/src/gui/wizard/ImportWizardPageSelect.ui b/src/gui/wizard/ImportWizardPageSelect.ui index 6a7c8adad..ca37fec71 100644 --- a/src/gui/wizard/ImportWizardPageSelect.ui +++ b/src/gui/wizard/ImportWizardPageSelect.ui @@ -94,14 +94,14 @@ QLayout::SetMinimumSize - + Import File: - + @@ -115,24 +115,24 @@ - + Password: - + - + Key File: - + @@ -146,7 +146,7 @@ - + Qt::Vertical @@ -162,7 +162,7 @@ - + Import Into: @@ -172,7 +172,7 @@ - + @@ -239,9 +239,64 @@ + + + + Temporary Database + + + + + + + Command: + + + + + + + + + e.g.: "sftp user@hostname" or "scp user@hostname:DatabaseOnRemote.kdbx {TEMP_DATABASE}" + + + + + + + + + + + + + + + + Input: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + e.g.: +get DatabaseOnRemote.kdbx {TEMP_DATABASE} +exit +--- +{TEMP_DATABASE} is used as placeholder to store the database in a temporary location +The command has to exit. In case of `sftp` as last commend `exit` has to be sent + + + + diff --git a/tests/data/SyncDatabase.kdbx b/tests/data/SyncDatabase.kdbx index f72e6fb9ef638a3820874627a11af6a97d296895..1a8ad9375af3d1b94a528f9f8011210d89b5ba7f 100644 GIT binary patch literal 33070 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 literal 32286 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 diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 6799cc64d..6ae559c36 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -397,14 +398,10 @@ void TestGui::prepareAndTriggerRemoteSync(const QString& sourceToSync) QVERIFY(saveSettingsButton != nullptr); QTest::mouseClick(saveSettingsButton, Qt::LeftButton); - // find and click dialog OK button - auto buttons = dbSettingsDialog->findChild()->findChildren(); - for (QPushButton* b : buttons) { - if (b->text() == "OK") { - QTest::mouseClick(b, Qt::LeftButton); - break; - } - } + auto okButton = dbSettingsDialog->findChild("buttonBox")->button(QDialogButtonBox::Ok); + QVERIFY(okButton); + QTest::mouseClick(okButton, Qt::LeftButton); + QTRY_COMPARE(m_dbWidget->getRemoteParams().size(), 1); // trigger aboutToShow to create remote actions @@ -477,6 +474,56 @@ void TestGui::testRemoteSyncDatabaseRequiresPassword() QCOMPARE(m_db->rootGroup()->findChildByName("General")->entries().size(), 1); } +void TestGui::testOpenRemoteDatabase() +{ + // close current database + cleanup(); + + QString sourceToSync = "sftp user@server:Database.kdbx"; + RemoteHandler::setRemoteProcessFunc([sourceToSync](QObject* parent) { + return QScopedPointer( + new MockRemoteProcess(parent, QString(KEEPASSX_TEST_DATA_DIR).append("/SyncDatabase.kdbx"))); + }); + auto* openRemoteButton = QApplication::activeWindow()->findChild("buttonImport"); + QVERIFY(openRemoteButton); + QVERIFY(openRemoteButton->isVisible()); + QTest::mouseClick(openRemoteButton, Qt::LeftButton); + QApplication::processEvents(); + + TEST_MODAL_NO_WAIT( + ImportWizard * wizard; QTRY_VERIFY(wizard = m_tabWidget->findChild()); + + auto* importTypeList = wizard->currentPage()->findChild("importTypeList"); + QVERIFY(importTypeList); + importTypeList->scrollToBottom(); + + QListWidgetItem* remoteOption = importTypeList->item(importTypeList->count() - 1); + QRect remoteOptionRect = importTypeList->visualItemRect(remoteOption); + QTest::mouseClick(importTypeList->viewport(), Qt::LeftButton, nullptr, remoteOptionRect.center()); + + auto* downloadCommandEdit = wizard->currentPage()->findChild("downloadCommand"); + QVERIFY(downloadCommandEdit); + QTest::keyClicks(downloadCommandEdit, sourceToSync); + + auto* temporaryDatabaseRadio = wizard->currentPage()->findChild("temporaryDatabaseRadio"); + QVERIFY(temporaryDatabaseRadio); + QTest::mouseClick(temporaryDatabaseRadio, Qt::LeftButton); + + auto* passwordEdit = wizard->currentPage()->findChild("passwordEdit"); + QVERIFY(passwordEdit); + QTest::keyClicks(passwordEdit, "a"); + QTest::keyClick(passwordEdit, Qt::Key_Enter); + + QApplication::processEvents(); + + QVERIFY(wizard->currentPage()->findChildren().count() > 0); + + QTest::keyClick(passwordEdit, Qt::Key_Enter);); + + // remote database has been opened + QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("SyncDatabase [Temporary]")); +} + void TestGui::testAutoreloadDatabase() { config()->set(Config::AutoReloadOnChange, false); diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h index 70ff5dfc5..720e3e2a6 100644 --- a/tests/gui/TestGui.h +++ b/tests/gui/TestGui.h @@ -42,6 +42,7 @@ private slots: void testMergeDatabase(); void testRemoteSyncDatabaseSameKey(); void testRemoteSyncDatabaseRequiresPassword(); + void testOpenRemoteDatabase(); void testAutoreloadDatabase(); void testTabs(); void testEditEntry();