From adb29dd0e4440142c51d85e4387dd2799702fa41 Mon Sep 17 00:00:00 2001 From: Aetf Date: Fri, 13 Dec 2019 15:28:45 -0500 Subject: [PATCH] FdoSecrets: only emit completed signal when the action actually finishes --- src/fdosecrets/objects/Collection.cpp | 8 ++++++ src/fdosecrets/objects/Collection.h | 2 ++ src/fdosecrets/objects/Prompt.cpp | 37 ++++++++++++++++++++++----- src/fdosecrets/objects/Prompt.h | 5 ++++ src/fdosecrets/objects/Service.cpp | 11 ++++---- src/fdosecrets/objects/Service.h | 14 +++++++++- src/gui/DatabaseOpenDialog.cpp | 4 +-- src/gui/DatabaseOpenDialog.h | 2 +- src/gui/DatabaseTabWidget.cpp | 2 ++ src/gui/DatabaseTabWidget.h | 1 + 10 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/fdosecrets/objects/Collection.cpp b/src/fdosecrets/objects/Collection.cpp index dd4079863..c2fb29a08 100644 --- a/src/fdosecrets/objects/Collection.cpp +++ b/src/fdosecrets/objects/Collection.cpp @@ -49,6 +49,14 @@ namespace FdoSecrets connect(backend, &DatabaseWidget::databaseUnlocked, this, &Collection::onDatabaseLockChanged); connect(backend, &DatabaseWidget::databaseLocked, this, &Collection::onDatabaseLockChanged); + // get notified whenever unlock db dialog finishes + connect(parent, &Service::doneUnlockDatabaseInDialog, this, [this](bool accepted, DatabaseWidget* dbWidget) { + if (!dbWidget || dbWidget != m_backend) { + return; + } + emit doneUnlockCollection(accepted); + }); + reloadBackend(); } diff --git a/src/fdosecrets/objects/Collection.h b/src/fdosecrets/objects/Collection.h index 06d45a50e..0be8b4239 100644 --- a/src/fdosecrets/objects/Collection.h +++ b/src/fdosecrets/objects/Collection.h @@ -71,6 +71,8 @@ namespace FdoSecrets void aliasAdded(const QString& alias); void aliasRemoved(const QString& alias); + void doneUnlockCollection(bool accepted); + public: DBusReturn setProperties(const QVariantMap& properties); diff --git a/src/fdosecrets/objects/Prompt.cpp b/src/fdosecrets/objects/Prompt.cpp index 14bc66b68..6a2458a4f 100644 --- a/src/fdosecrets/objects/Prompt.cpp +++ b/src/fdosecrets/objects/Prompt.cpp @@ -93,9 +93,9 @@ namespace FdoSecrets MessageBox::OverrideParent override(findWindow(windowId)); // only need to delete in backend, collection will react itself. - service()->doCloseDatabase(m_collection->backend()); + auto accepted = service()->doCloseDatabase(m_collection->backend()); - emit completed(false, {}); + emit completed(!accepted, {}); return {}; } @@ -189,19 +189,44 @@ namespace FdoSecrets MessageBox::OverrideParent override(findWindow(windowId)); - QList unlocked; for (const auto& c : asConst(m_collections)) { if (c) { + connect(c, &Collection::doneUnlockCollection, this, &UnlockCollectionsPrompt::collectionUnlockFinished); c->doUnlock(); - unlocked << c->objectPath(); } } - emit completed(false, QVariant::fromValue(unlocked)); - return {}; } + void UnlockCollectionsPrompt::collectionUnlockFinished(bool accepted) + { + auto coll = qobject_cast(sender()); + if (!coll) { + return; + } + + if (!m_collections.contains(coll)) { + // should not happen + coll->disconnect(this); + return; + } + + // one shot + coll->disconnect(this); + + if (accepted) { + m_unlocked << coll->objectPath(); + } else { + m_numRejected += 1; + } + + // if we've get all + if (m_numRejected + m_unlocked.size() == m_collections.size()) { + emit completed(m_unlocked.isEmpty(), QVariant::fromValue(m_unlocked)); + } + } + DeleteItemPrompt::DeleteItemPrompt(Service* parent, Item* item) : PromptBase(parent) , m_item(item) diff --git a/src/fdosecrets/objects/Prompt.h b/src/fdosecrets/objects/Prompt.h index 2d13084f6..fee1cb9fb 100644 --- a/src/fdosecrets/objects/Prompt.h +++ b/src/fdosecrets/objects/Prompt.h @@ -98,8 +98,13 @@ namespace FdoSecrets DBusReturn prompt(const QString& windowId) override; + private slots: + void collectionUnlockFinished(bool accepted); + private: QList> m_collections; + QList m_unlocked; + int m_numRejected = 0; }; class Item; diff --git a/src/fdosecrets/objects/Service.cpp b/src/fdosecrets/objects/Service.cpp index a2d478cae..5408f4cb2 100644 --- a/src/fdosecrets/objects/Service.cpp +++ b/src/fdosecrets/objects/Service.cpp @@ -47,6 +47,8 @@ namespace FdoSecrets , m_insdieEnsureDefaultAlias(false) , m_serviceWatcher(nullptr) { + connect( + m_databases, &DatabaseTabWidget::databaseUnlockDialogFinished, this, &Service::doneUnlockDatabaseInDialog); } Service::~Service() @@ -447,9 +449,9 @@ namespace FdoSecrets return m_sessions; } - void Service::doCloseDatabase(DatabaseWidget* dbWidget) + bool Service::doCloseDatabase(DatabaseWidget* dbWidget) { - m_databases->closeDatabaseTab(dbWidget); + return m_databases->closeDatabaseTab(dbWidget); } Collection* Service::doNewDatabase() @@ -472,11 +474,10 @@ namespace FdoSecrets void Service::doSwitchToChangeDatabaseSettings(DatabaseWidget* dbWidget) { - // switch selected to current - // unlock if needed if (dbWidget->isLocked()) { - m_databases->unlockDatabaseInDialog(dbWidget, DatabaseOpenDialog::Intent::None); + return; } + // switch selected to current m_databases->setCurrentWidget(dbWidget); m_databases->changeDatabaseSettings(); diff --git a/src/fdosecrets/objects/Service.h b/src/fdosecrets/objects/Service.h index bfa8ea843..5de48da1c 100644 --- a/src/fdosecrets/objects/Service.h +++ b/src/fdosecrets/objects/Service.h @@ -88,6 +88,13 @@ namespace FdoSecrets */ void error(const QString& msg); + /** + * Finish signal for async action doUnlockDatabaseInDialog + * @param accepted If false, the action is canceled by the user + * @param dbWidget The unlocked the dbWidget if succeed + */ + void doneUnlockDatabaseInDialog(bool accepted, DatabaseWidget* dbWidget); + public: /** * List of sessions @@ -101,9 +108,14 @@ namespace FdoSecrets } public slots: - void doCloseDatabase(DatabaseWidget* dbWidget); + bool doCloseDatabase(DatabaseWidget* dbWidget); Collection* doNewDatabase(); void doSwitchToChangeDatabaseSettings(DatabaseWidget* dbWidget); + + /** + * Async, connect to signal doneUnlockDatabaseInDialog for finish notification + * @param dbWidget + */ void doUnlockDatabaseInDialog(DatabaseWidget* dbWidget); private slots: diff --git a/src/gui/DatabaseOpenDialog.cpp b/src/gui/DatabaseOpenDialog.cpp index e7f138f15..620d3652b 100644 --- a/src/gui/DatabaseOpenDialog.cpp +++ b/src/gui/DatabaseOpenDialog.cpp @@ -51,7 +51,7 @@ void DatabaseOpenDialog::setTargetDatabaseWidget(DatabaseWidget* dbWidget) disconnect(this, nullptr, m_dbWidget, nullptr); } m_dbWidget = dbWidget; - connect(this, SIGNAL(dialogFinished(bool)), dbWidget, SLOT(unlockDatabase(bool))); + connect(this, &DatabaseOpenDialog::dialogFinished, dbWidget, &DatabaseWidget::unlockDatabase); } void DatabaseOpenDialog::setIntent(DatabaseOpenDialog::Intent intent) @@ -90,6 +90,6 @@ void DatabaseOpenDialog::complete(bool accepted) } else { reject(); } - emit dialogFinished(accepted); + emit dialogFinished(accepted, m_dbWidget); clearForms(); } diff --git a/src/gui/DatabaseOpenDialog.h b/src/gui/DatabaseOpenDialog.h index f2860fccb..30ac4c762 100644 --- a/src/gui/DatabaseOpenDialog.h +++ b/src/gui/DatabaseOpenDialog.h @@ -50,7 +50,7 @@ public: void clearForms(); signals: - void dialogFinished(bool); + void dialogFinished(bool accepted, DatabaseWidget* dbWidget); public slots: void complete(bool accepted); diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index c80726417..c37e6c5ea 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -63,6 +63,8 @@ DatabaseTabWidget::DatabaseTabWidget(QWidget* parent) connect(autoType(), SIGNAL(globalAutoTypeTriggered()), SLOT(performGlobalAutoType())); connect(autoType(), SIGNAL(autotypePerformed()), SLOT(relockPendingDatabase())); connect(autoType(), SIGNAL(autotypeRejected()), SLOT(relockPendingDatabase())); + connect(m_databaseOpenDialog.data(), &DatabaseOpenDialog::dialogFinished, + this, &DatabaseTabWidget::databaseUnlockDialogFinished); // clang-format on #ifdef Q_OS_MACOS diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index 87e9bbf77..5c55bc63c 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -90,6 +90,7 @@ signals: void tabNameChanged(); void messageGlobal(const QString&, MessageWidget::MessageType type); void messageDismissGlobal(); + void databaseUnlockDialogFinished(bool accepted, DatabaseWidget* dbWidget); private slots: void toggleTabbar();