diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 718a08a8..123bb9d4 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -994,6 +994,15 @@ bool EditEntryWidget::commitEntry() return true; } + // HACK: Check that entry pointer is still valid, see https://github.com/keepassxreboot/keepassxc/issues/5722 + if (!m_entry) { + QMessageBox::information(this, + tr("Invalid Entry"), + tr("An external merge operation has invalidated this entry.\n" + "Unfortunately, any changes made have been lost.")); + return true; + } + // Check Auto-Type validity early if (!AutoType::verifyAutoTypeSyntax(m_autoTypeUi->sequenceEdit->text())) { return false; diff --git a/src/keeshare/ShareObserver.cpp b/src/keeshare/ShareObserver.cpp index 6fd629b4..f74e800a 100644 --- a/src/keeshare/ShareObserver.cpp +++ b/src/keeshare/ShareObserver.cpp @@ -186,23 +186,29 @@ void ShareObserver::handleDatabaseChanged() void ShareObserver::handleFileUpdated(const QString& path) { - const Result result = importShare(path); - if (!result.isValid()) { - return; + if (!m_inFileUpdate) { + QTimer::singleShot(100, this, [this, path] { + const Result result = importShare(path); + m_inFileUpdate = false; + if (!result.isValid()) { + return; + } + QStringList success; + QStringList warning; + QStringList error; + if (result.isError()) { + error << tr("Import from %1 failed (%2)").arg(result.path, result.message); + } else if (result.isWarning()) { + warning << tr("Import from %1 failed (%2)").arg(result.path, result.message); + } else if (result.isInfo()) { + success << tr("Import from %1 successful (%2)").arg(result.path, result.message); + } else { + success << tr("Imported from %1").arg(result.path); + } + notifyAbout(success, warning, error); + }); + m_inFileUpdate = true; } - QStringList success; - QStringList warning; - QStringList error; - if (result.isError()) { - error << tr("Import from %1 failed (%2)").arg(result.path, result.message); - } else if (result.isWarning()) { - warning << tr("Import from %1 failed (%2)").arg(result.path, result.message); - } else if (result.isInfo()) { - success << tr("Import from %1 successful (%2)").arg(result.path, result.message); - } else { - success << tr("Imported from %1").arg(result.path); - } - notifyAbout(success, warning, error); } ShareObserver::Result ShareObserver::importShare(const QString& path) diff --git a/src/keeshare/ShareObserver.h b/src/keeshare/ShareObserver.h index b98d5898..8b881142 100644 --- a/src/keeshare/ShareObserver.h +++ b/src/keeshare/ShareObserver.h @@ -83,6 +83,7 @@ private: QMap, KeeShareSettings::Reference> m_groupToReference; QMap> m_shareToGroup; QMap> m_fileWatchers; + bool m_inFileUpdate = false; }; #endif // KEEPASSXC_SHAREOBSERVER_H