mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-03-27 16:38:14 -04:00
Correct 'save as' behavior to ensure file path remains valid
Copy necessary saving sequence from the save function into saveAs function to prevent inconsistencies when saving to a new file.
This commit is contained in:
parent
eb198271ac
commit
98566fec83
@ -1866,32 +1866,54 @@ bool DatabaseWidget::save()
|
|||||||
*/
|
*/
|
||||||
bool DatabaseWidget::saveAs()
|
bool DatabaseWidget::saveAs()
|
||||||
{
|
{
|
||||||
while (true) {
|
// Never allow saving a locked database; it causes corruption
|
||||||
QString oldFilePath = m_db->filePath();
|
Q_ASSERT(!isLocked());
|
||||||
if (!QFileInfo::exists(oldFilePath)) {
|
// Release build interlock
|
||||||
oldFilePath = QDir::toNativeSeparators(config()->get(Config::LastDir).toString() + "/"
|
if (isLocked()) {
|
||||||
+ tr("Passwords").append(".kdbx"));
|
// We return true since a save is not required
|
||||||
}
|
return true;
|
||||||
const QString newFilePath = fileDialog()->getSaveFileName(
|
|
||||||
this, tr("Save database as"), oldFilePath, tr("KeePass 2 Database").append(" (*.kdbx)"), nullptr, nullptr);
|
|
||||||
|
|
||||||
if (!newFilePath.isEmpty()) {
|
|
||||||
// Ensure we don't recurse back into this function
|
|
||||||
m_db->setReadOnly(false);
|
|
||||||
m_db->setFilePath(newFilePath);
|
|
||||||
m_saveAttempts = 0;
|
|
||||||
|
|
||||||
if (!save()) {
|
|
||||||
// Failed to save, try again
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Canceled file selection
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString oldFilePath = m_db->filePath();
|
||||||
|
if (!QFileInfo::exists(oldFilePath)) {
|
||||||
|
oldFilePath =
|
||||||
|
QDir::toNativeSeparators(config()->get(Config::LastDir).toString() + "/" + tr("Passwords").append(".kdbx"));
|
||||||
|
}
|
||||||
|
const QString newFilePath = fileDialog()->getSaveFileName(
|
||||||
|
this, tr("Save database as"), oldFilePath, tr("KeePass 2 Database").append(" (*.kdbx)"), nullptr, nullptr);
|
||||||
|
|
||||||
|
bool ok = false;
|
||||||
|
if (!newFilePath.isEmpty()) {
|
||||||
|
auto focusWidget = qApp->focusWidget();
|
||||||
|
|
||||||
|
// Lock out interactions
|
||||||
|
m_entryView->setDisabled(true);
|
||||||
|
m_groupView->setDisabled(true);
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
|
QString errorMessage;
|
||||||
|
ok = m_db->saveAs(newFilePath,
|
||||||
|
&errorMessage,
|
||||||
|
config()->get(Config::UseAtomicSaves).toBool(),
|
||||||
|
config()->get(Config::BackupBeforeSave).toBool());
|
||||||
|
|
||||||
|
// Return control
|
||||||
|
m_entryView->setDisabled(false);
|
||||||
|
m_groupView->setDisabled(false);
|
||||||
|
|
||||||
|
if (focusWidget) {
|
||||||
|
focusWidget->setFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
showMessage(tr("Writing the database failed: %1").arg(errorMessage),
|
||||||
|
MessageWidget::Error,
|
||||||
|
true,
|
||||||
|
MessageWidget::LongAutoHideTimeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user