mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-03-13 01:26:37 -04:00
parent
f20b531430
commit
7d0dc67180
@ -56,19 +56,6 @@ namespace
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool canPerformQuickUnlock(const QString& filename)
|
||||
{
|
||||
if (isQuickUnlockAvailable()) {
|
||||
#if defined(Q_CC_MSVC)
|
||||
return getWindowsHello()->hasKey(filename);
|
||||
#elif defined(Q_OS_MACOS)
|
||||
return TouchID::getInstance().containsKey(filename);
|
||||
#endif
|
||||
}
|
||||
Q_UNUSED(filename);
|
||||
return false;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
|
||||
@ -191,17 +178,17 @@ void DatabaseOpenWidget::toggleHardwareKeyComponent(bool state)
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseOpenWidget::showEvent(QShowEvent* event)
|
||||
bool DatabaseOpenWidget::event(QEvent* event)
|
||||
{
|
||||
DialogyWidget::showEvent(event);
|
||||
if (isOnQuickUnlockScreen()) {
|
||||
m_ui->quickUnlockButton->setFocus();
|
||||
if (!canPerformQuickUnlock(m_filename)) {
|
||||
bool ret = DialogyWidget::event(event);
|
||||
|
||||
switch (event->type()) {
|
||||
case QEvent::Show:
|
||||
case QEvent::WindowActivate: {
|
||||
if (isOnQuickUnlockScreen() && (m_db.isNull() || !canPerformQuickUnlock())) {
|
||||
resetQuickUnlock();
|
||||
}
|
||||
} else {
|
||||
m_ui->editPassword->setFocus();
|
||||
}
|
||||
toggleQuickUnlockScreen();
|
||||
m_hideTimer.stop();
|
||||
|
||||
#ifdef WITH_XC_YUBIKEY
|
||||
@ -221,12 +208,11 @@ void DatabaseOpenWidget::showEvent(QShowEvent* event)
|
||||
m_deviceListener->registerHotplugCallback(true, true, YubiKeyInterfaceUSB::ONLYKEY_USB_VID);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DatabaseOpenWidget::hideEvent(QHideEvent* event)
|
||||
{
|
||||
DialogyWidget::hideEvent(event);
|
||||
|
||||
case QEvent::Hide: {
|
||||
// Schedule form clearing if we are hidden
|
||||
if (!isVisible()) {
|
||||
m_hideTimer.start();
|
||||
@ -235,6 +221,14 @@ void DatabaseOpenWidget::hideEvent(QHideEvent* event)
|
||||
#ifdef WITH_XC_YUBIKEY
|
||||
m_deviceListener->deregisterAllHotplugCallbacks();
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
default:;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool DatabaseOpenWidget::unlockingDatabase()
|
||||
@ -257,12 +251,7 @@ void DatabaseOpenWidget::load(const QString& filename)
|
||||
}
|
||||
}
|
||||
|
||||
if (canPerformQuickUnlock(m_filename)) {
|
||||
m_ui->centralStack->setCurrentIndex(1);
|
||||
m_ui->quickUnlockButton->setFocus();
|
||||
} else {
|
||||
m_ui->editPassword->setFocus();
|
||||
}
|
||||
toggleQuickUnlockScreen();
|
||||
|
||||
#ifdef WITH_XC_YUBIKEY
|
||||
// Do initial auto-poll
|
||||
@ -279,8 +268,11 @@ void DatabaseOpenWidget::clearForms()
|
||||
m_ui->keyFileLineEdit->setShowPassword(false);
|
||||
m_ui->keyFileLineEdit->setClearButtonEnabled(true);
|
||||
m_ui->hardwareKeyCombo->clear();
|
||||
m_ui->centralStack->setCurrentIndex(0);
|
||||
m_db.reset();
|
||||
toggleQuickUnlockScreen();
|
||||
|
||||
QString error;
|
||||
m_db.reset(new Database());
|
||||
m_db->open(m_filename, nullptr, &error);
|
||||
}
|
||||
|
||||
QSharedPointer<Database> DatabaseOpenWidget::database()
|
||||
@ -403,7 +395,7 @@ QSharedPointer<CompositeKey> DatabaseOpenWidget::buildDatabaseKey()
|
||||
{
|
||||
auto databaseKey = QSharedPointer<CompositeKey>::create();
|
||||
|
||||
if (canPerformQuickUnlock(m_filename)) {
|
||||
if (!m_db.isNull() && canPerformQuickUnlock()) {
|
||||
// try to retrieve the stored password using Windows Hello
|
||||
QByteArray keyData;
|
||||
#ifdef Q_CC_MSVC
|
||||
@ -602,11 +594,34 @@ void DatabaseOpenWidget::setUserInteractionLock(bool state)
|
||||
m_unlockingDatabase = state;
|
||||
}
|
||||
|
||||
bool DatabaseOpenWidget::isOnQuickUnlockScreen()
|
||||
bool DatabaseOpenWidget::canPerformQuickUnlock() const
|
||||
{
|
||||
if (!m_db.isNull() && isQuickUnlockAvailable()) {
|
||||
#if defined(Q_CC_MSVC)
|
||||
return getWindowsHello()->hasKey(m_filename);
|
||||
#elif defined(Q_OS_MACOS)
|
||||
return TouchID::getInstance().containsKey(m_filename);
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DatabaseOpenWidget::isOnQuickUnlockScreen() const
|
||||
{
|
||||
return m_ui->centralStack->currentIndex() == 1;
|
||||
}
|
||||
|
||||
void DatabaseOpenWidget::toggleQuickUnlockScreen()
|
||||
{
|
||||
if (canPerformQuickUnlock()) {
|
||||
m_ui->centralStack->setCurrentIndex(1);
|
||||
m_ui->quickUnlockButton->setFocus();
|
||||
} else {
|
||||
m_ui->centralStack->setCurrentIndex(0);
|
||||
m_ui->editPassword->setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseOpenWidget::triggerQuickUnlock()
|
||||
{
|
||||
if (isOnQuickUnlockScreen()) {
|
||||
|
@ -53,7 +53,9 @@ public:
|
||||
bool unlockingDatabase();
|
||||
|
||||
// Quick Unlock helper functions
|
||||
bool isOnQuickUnlockScreen();
|
||||
bool canPerformQuickUnlock() const;
|
||||
bool isOnQuickUnlockScreen() const;
|
||||
void toggleQuickUnlockScreen();
|
||||
void triggerQuickUnlock();
|
||||
void resetQuickUnlock();
|
||||
|
||||
@ -61,8 +63,7 @@ signals:
|
||||
void dialogFinished(bool accepted);
|
||||
|
||||
protected:
|
||||
void showEvent(QShowEvent* event) override;
|
||||
void hideEvent(QHideEvent* event) override;
|
||||
bool event(QEvent* event) override;
|
||||
QSharedPointer<CompositeKey> buildDatabaseKey();
|
||||
void setUserInteractionLock(bool state);
|
||||
|
||||
|
@ -341,9 +341,7 @@ bool TouchID::isAvailable()
|
||||
// note: we cannot cache the check results because the configuration
|
||||
// is dynamic in its nature. User can close the laptop lid or take off
|
||||
// the watch, thus making one (or both) of the authentication types unavailable.
|
||||
const bool watchAvailable = isWatchAvailable();
|
||||
const bool touchIdAvailable = isTouchIdAvailable();
|
||||
return watchAvailable || touchIdAvailable;
|
||||
return isWatchAvailable() || isTouchIdAvailable();
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user