Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FdoSecrets: skip entries in recycle bin when searching #8021

Merged
merged 1 commit into from
May 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions src/fdosecrets/objects/Collection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,12 @@ namespace FdoSecrets
EntrySearcher(caseSensitive, skipProtected).search(terms, m_exposedGroup, forceSearch);
items.reserve(foundEntries.size());
for (const auto& entry : foundEntries) {
items << m_entryToItem.value(entry);
const auto item = m_entryToItem.value(entry);
// it's possible that we don't have a corresponding item for the entry
// this can happen when the recycle bin is below the exposed group.
if (item) {
items << item;
}
}
return {};
}
Expand Down Expand Up @@ -458,7 +463,7 @@ namespace FdoSecrets
});
// Another possibility is the group being moved to recycle bin.
connect(m_exposedGroup.data(), &Group::modified, this, [this]() {
if (inRecycleBin(m_exposedGroup->parentGroup())) {
if (inRecycleBin(m_exposedGroup)) {
// reset the exposed group to none
FdoSecrets::settings()->setExposedGroup(m_backend->database().data(), {});
}
Expand Down Expand Up @@ -677,11 +682,7 @@ namespace FdoSecrets
bool Collection::inRecycleBin(Group* group) const
{
Q_ASSERT(m_backend);

if (!group) {
// the root group's parent is nullptr, we treat it as not in recycle bin.
return false;
}
Q_ASSERT(group);

if (!m_backend->database()->metadata()) {
return false;
Expand Down
3 changes: 3 additions & 0 deletions src/fdosecrets/objects/Collection.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ namespace FdoSecrets
DatabaseWidget* backend() const;
QString backendFilePath() const;
Service* service() const;
/**
* similar to Group::isRecycled, but we also return true when the group itself is the recycle bin
*/
bool inRecycleBin(Group* group) const;
bool inRecycleBin(Entry* entry) const;

Expand Down
7 changes: 4 additions & 3 deletions src/fdosecrets/objects/Service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,12 +258,13 @@ namespace FdoSecrets
}
// item locked state already covers its collection's locked state
for (const auto& item : asConst(items)) {
bool l;
ret = item->locked(client, l);
Q_ASSERT(item);
bool itemLocked;
ret = item->locked(client, itemLocked);
if (ret.err()) {
return ret;
}
if (l) {
if (itemLocked) {
locked.append(item);
} else {
unlocked.append(item);
Expand Down
33 changes: 33 additions & 0 deletions tests/gui/TestGuiFdoSecrets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1564,6 +1564,39 @@ void TestGuiFdoSecrets::testModifyingExposedGroup()
}
}

void TestGuiFdoSecrets::testNoExposeRecycleBin()
{
// when the recycle bin is underneath the exposed group
// be careful not to expose entries in there

FdoSecrets::settings()->setExposedGroup(m_db, m_db->rootGroup()->uuid());
m_db->metadata()->setRecycleBinEnabled(true);

auto entry = m_db->rootGroup()->entries().first();
VERIFY(entry);
m_db->recycleEntry(entry);
processEvents();

auto service = enableService();
VERIFY(service);

auto coll = getDefaultCollection(service);
VERIFY(coll);

// exposing subgroup does not expose entries in other groups
DBUS_GET(itemPaths, coll->items());
QSet<Entry*> exposedEntries;
for (const auto& itemPath : itemPaths) {
exposedEntries << m_plugin->dbus()->pathToObject<Item>(itemPath)->backend();
}
VERIFY(!exposedEntries.contains(entry));

// searching should not return the entry
DBUS_GET2(unlocked, locked, service->SearchItems({{"Title", entry->title()}}));
COMPARE(locked, {});
COMPARE(unlocked, {});
}

void TestGuiFdoSecrets::lockDatabaseInBackend()
{
m_dbWidget->lock();
Expand Down
1 change: 1 addition & 0 deletions tests/gui/TestGuiFdoSecrets.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ private slots:

void testExposeSubgroup();
void testModifyingExposedGroup();
void testNoExposeRecycleBin();

void testHiddenFilename();
void testDuplicateName();
Expand Down