Skip to content

Commit

Permalink
FdoSecrets: skip entries in recycle bin when searching (#7933)
Browse files Browse the repository at this point in the history
  • Loading branch information
Aetf committed May 6, 2022
1 parent a4d4adb commit 8d0f95a
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 10 deletions.
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

0 comments on commit 8d0f95a

Please sign in to comment.