From da606923e926e295c78f23b4fd8985938ad6c089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20V=C3=A4nttinen?= Date: Mon, 11 Nov 2024 00:30:38 +0200 Subject: [PATCH] Browser: Fix cancel with database unlock dialog (#11435) --- src/browser/BrowserService.cpp | 13 +++++++++++++ src/browser/BrowserService.h | 1 + src/gui/DatabaseTabWidget.cpp | 3 +++ src/gui/MainWindow.cpp | 4 ++++ src/gui/MainWindow.h | 3 ++- 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index 32d9f759a..7d5c7e942 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -84,6 +84,10 @@ BrowserService::BrowserService() connect(getMainWindow(), &MainWindow::databaseUnlocked, this, &BrowserService::databaseUnlocked); connect(getMainWindow(), &MainWindow::databaseLocked, this, &BrowserService::databaseLocked); connect(getMainWindow(), &MainWindow::activeDatabaseChanged, this, &BrowserService::activeDatabaseChanged); + connect(getMainWindow(), + &MainWindow::databaseUnlockDialogFinished, + this, + &BrowserService::handleDatabaseUnlockDialogFinished); setEnabled(browserSettings()->isEnabled()); } @@ -1815,6 +1819,15 @@ void BrowserService::activeDatabaseChanged(DatabaseWidget* dbWidget) m_currentDatabaseWidget = dbWidget; } +void BrowserService::handleDatabaseUnlockDialogFinished(bool accepted, DatabaseWidget* dbWidget) +{ + // User canceled the database open dialog + if (dbWidget && !accepted && m_bringToFrontRequested) { + m_bringToFrontRequested = false; + hideWindow(); + } +} + void BrowserService::processClientMessage(QLocalSocket* socket, const QJsonObject& message) { auto clientID = message["clientID"].toString(); diff --git a/src/browser/BrowserService.h b/src/browser/BrowserService.h index 52bdcfaf8..63ca7ae5d 100644 --- a/src/browser/BrowserService.h +++ b/src/browser/BrowserService.h @@ -143,6 +143,7 @@ public slots: private slots: void processClientMessage(QLocalSocket* socket, const QJsonObject& message); + void handleDatabaseUnlockDialogFinished(bool accepted, DatabaseWidget* dbWidget); private: enum Access diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 3a328cf39..43c086423 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -797,6 +797,9 @@ void DatabaseTabWidget::handleDatabaseUnlockDialogFinished(bool accepted, Databa m_dbWidgetPendingLock = dbWidget; } + // If browser extension requested the unlock make sure cancel is handled + m_databaseOpenInProgress = false; + // signal other objects that the dialog finished emit databaseUnlockDialogFinished(accepted, dbWidget); } diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index ad01060e5..0dc5ab3e7 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -189,6 +189,10 @@ MainWindow::MainWindow() connect(m_ui->tabWidget, &DatabaseTabWidget::databaseLocked, this, &MainWindow::databaseLocked); connect(m_ui->tabWidget, &DatabaseTabWidget::databaseUnlocked, this, &MainWindow::databaseUnlocked); connect(m_ui->tabWidget, &DatabaseTabWidget::activeDatabaseChanged, this, &MainWindow::activeDatabaseChanged); + connect(m_ui->tabWidget, + &DatabaseTabWidget::databaseUnlockDialogFinished, + this, + &MainWindow::databaseUnlockDialogFinished); #ifdef WITH_XC_BROWSER m_ui->settingsWidget->addSettingsPage(new BrowserSettingsPage()); diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index f01ffd3ea..27cc896c1 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -1,6 +1,6 @@ /* + * Copyright (C) 2024 KeePassXC Team * Copyright (C) 2010 Felix Geyer - * Copyright (C) 2020 KeePassXC Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -67,6 +67,7 @@ signals: void databaseUnlocked(DatabaseWidget* dbWidget); void databaseLocked(DatabaseWidget* dbWidget); void activeDatabaseChanged(DatabaseWidget* dbWidget); + void databaseUnlockDialogFinished(bool accepted, DatabaseWidget* dbWidget); public slots: void openDatabase(const QString& filePath, const QString& password = {}, const QString& keyfile = {});