mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2024-10-01 01:26:01 -04:00
FdoSecrets: handle the exposed group being moved to recycle bin
This commit is contained in:
parent
9363123047
commit
6dd9702b79
@ -328,7 +328,11 @@ namespace FdoSecrets
|
|||||||
|
|
||||||
// when creation finishes in backend, we will already have item
|
// when creation finishes in backend, we will already have item
|
||||||
item = m_entryToItem.value(entry, nullptr);
|
item = m_entryToItem.value(entry, nullptr);
|
||||||
Q_ASSERT(item);
|
|
||||||
|
if (!item) {
|
||||||
|
// may happen if entry somehow ends up in recycle bin
|
||||||
|
return DBusReturn<>::Error(QStringLiteral(DBUS_ERROR_SECRET_NO_SUCH_OBJECT));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = item->setProperties(properties);
|
ret = item->setProperties(properties);
|
||||||
@ -439,7 +443,7 @@ namespace FdoSecrets
|
|||||||
|
|
||||||
auto newUuid = FdoSecrets::settings()->exposedGroup(m_backend->database());
|
auto newUuid = FdoSecrets::settings()->exposedGroup(m_backend->database());
|
||||||
auto newGroup = m_backend->database()->rootGroup()->findGroupByUuid(newUuid);
|
auto newGroup = m_backend->database()->rootGroup()->findGroupByUuid(newUuid);
|
||||||
if (!newGroup) {
|
if (!newGroup || inRecycleBin(newGroup)) {
|
||||||
// no exposed group, delete self
|
// no exposed group, delete self
|
||||||
doDelete();
|
doDelete();
|
||||||
return;
|
return;
|
||||||
@ -451,10 +455,11 @@ namespace FdoSecrets
|
|||||||
m_exposedGroup = newGroup;
|
m_exposedGroup = newGroup;
|
||||||
|
|
||||||
// Attach signal to update exposed group settings if the group was removed.
|
// Attach signal to update exposed group settings if the group was removed.
|
||||||
|
//
|
||||||
// The lifetime of the connection is bound to the database object, because
|
// The lifetime of the connection is bound to the database object, because
|
||||||
// in Database::~Database, groups are also deleted, but we don't want to
|
// in Database::~Database, groups are also deleted as children, but we don't
|
||||||
// trigger this.
|
// want to trigger this.
|
||||||
// This rely on the fact that QObject disconnects signals BEFORE deleting
|
// This works because the fact that QObject disconnects signals BEFORE deleting
|
||||||
// children.
|
// children.
|
||||||
QPointer<Database> db = m_backend->database().data();
|
QPointer<Database> db = m_backend->database().data();
|
||||||
connect(m_exposedGroup.data(), &Group::groupAboutToRemove, db, [db](Group* toBeRemoved) {
|
connect(m_exposedGroup.data(), &Group::groupAboutToRemove, db, [db](Group* toBeRemoved) {
|
||||||
@ -468,6 +473,13 @@ namespace FdoSecrets
|
|||||||
FdoSecrets::settings()->setExposedGroup(db, {});
|
FdoSecrets::settings()->setExposedGroup(db, {});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// Another possibility is the group being moved to recycle bin.
|
||||||
|
connect(m_exposedGroup.data(), &Group::groupModified, this, [this]() {
|
||||||
|
if (inRecycleBin(m_exposedGroup->parentGroup())) {
|
||||||
|
// reset the exposed group to none
|
||||||
|
FdoSecrets::settings()->setExposedGroup(m_backend->database().data(), {});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Monitor exposed group settings
|
// Monitor exposed group settings
|
||||||
connect(m_backend->database()->metadata()->customData(), &CustomData::customDataModified, this, [this]() {
|
connect(m_backend->database()->metadata()->customData(), &CustomData::customDataModified, this, [this]() {
|
||||||
@ -646,19 +658,23 @@ namespace FdoSecrets
|
|||||||
{
|
{
|
||||||
Q_ASSERT(m_backend);
|
Q_ASSERT(m_backend);
|
||||||
|
|
||||||
if (!m_backend->database()->metadata()->recycleBin()) {
|
if (!group) {
|
||||||
|
// just to be safe
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_backend->database()->metadata()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (group) {
|
auto recycleBin = m_backend->database()->metadata()->recycleBin();
|
||||||
if (group->uuid() == m_backend->database()->metadata()->recycleBin()->uuid()) {
|
if (!recycleBin) {
|
||||||
return true;
|
|
||||||
}
|
|
||||||
group = group->parentGroup();
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return group->uuid() == recycleBin->uuid() || group->isRecycled();
|
||||||
|
}
|
||||||
|
|
||||||
bool Collection::inRecycleBin(Entry* entry) const
|
bool Collection::inRecycleBin(Entry* entry) const
|
||||||
{
|
{
|
||||||
Q_ASSERT(entry);
|
Q_ASSERT(entry);
|
||||||
|
@ -85,7 +85,7 @@ protected:
|
|||||||
// can not call mapFromSource, which internally calls filterAcceptsRow
|
// can not call mapFromSource, which internally calls filterAcceptsRow
|
||||||
auto group = groupFromSourceIndex(source_idx);
|
auto group = groupFromSourceIndex(source_idx);
|
||||||
|
|
||||||
return group->uuid() != recycleBin->uuid();
|
return group && !group->isRecycled() && group->uuid() != recycleBin->uuid();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -118,8 +118,13 @@ void DatabaseSettingsWidgetFdoSecrets::loadSettings(QSharedPointer<Database> db)
|
|||||||
m_model.reset(new GroupModelNoRecycle(m_db.data()));
|
m_model.reset(new GroupModelNoRecycle(m_db.data()));
|
||||||
m_ui->selectGroup->setModel(m_model.data());
|
m_ui->selectGroup->setModel(m_model.data());
|
||||||
|
|
||||||
|
Group* recycleBin = nullptr;
|
||||||
|
if (m_db->metadata() && m_db->metadata()->recycleBin()) {
|
||||||
|
recycleBin = m_db->metadata()->recycleBin();
|
||||||
|
}
|
||||||
|
|
||||||
auto group = m_db->rootGroup()->findGroupByUuid(FdoSecrets::settings()->exposedGroup(m_db));
|
auto group = m_db->rootGroup()->findGroupByUuid(FdoSecrets::settings()->exposedGroup(m_db));
|
||||||
if (!group) {
|
if (!group || group->isRecycled() || (recycleBin && group->uuid() == recycleBin->uuid())) {
|
||||||
m_ui->radioDonotExpose->setChecked(true);
|
m_ui->radioDonotExpose->setChecked(true);
|
||||||
} else {
|
} else {
|
||||||
auto idx = m_model->indexFromGroup(group);
|
auto idx = m_model->indexFromGroup(group);
|
||||||
|
Loading…
Reference in New Issue
Block a user