From 20f0a7d9ed3283bb9bee4521681e6b5ec8a7ff21 Mon Sep 17 00:00:00 2001 From: Aleksey Ivanovsky Date: Sun, 10 Apr 2022 13:00:59 +0200 Subject: [PATCH] Detect existing Recycle Bin if it wasn't specified in Meta --- .../linguafranca/pwdb/base/AbstractDatabase.java | 7 +++++++ .../pwdb/kdbx/dom/DomDatabaseWrapper.java | 9 ++++++--- .../pwdb/kdbx/jaxb/JaxbDatabase.java | 7 +++++-- .../pwdb/kdbx/simple/SimpleDatabase.java | 7 +++++-- .../pwdb/checks/RecycleBinChecks.java | 16 ++++++++++++++++ 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/database/src/main/java/org/linguafranca/pwdb/base/AbstractDatabase.java b/database/src/main/java/org/linguafranca/pwdb/base/AbstractDatabase.java index 595220f0..cca25ad1 100644 --- a/database/src/main/java/org/linguafranca/pwdb/base/AbstractDatabase.java +++ b/database/src/main/java/org/linguafranca/pwdb/base/AbstractDatabase.java @@ -29,6 +29,8 @@ */ public abstract class AbstractDatabase, G extends Group, E extends Entry, I extends Icon> implements Database { + protected static final String RECYCLE_BIN_NAME = "Recycle Bin"; + private boolean isDirty; @Override @@ -225,6 +227,11 @@ public void emptyRecycleBin() { } } + protected G findRecycleBinCandidate() { + List candidates = getRootGroup().findGroups(RECYCLE_BIN_NAME); + return candidates.size() > 0 ? candidates.get(0) : null; + } + @Override public boolean supportsNonStandardPropertyNames() { return true; diff --git a/dom/src/main/java/org/linguafranca/pwdb/kdbx/dom/DomDatabaseWrapper.java b/dom/src/main/java/org/linguafranca/pwdb/kdbx/dom/DomDatabaseWrapper.java index 70e4b236..a96ad06b 100644 --- a/dom/src/main/java/org/linguafranca/pwdb/kdbx/dom/DomDatabaseWrapper.java +++ b/dom/src/main/java/org/linguafranca/pwdb/kdbx/dom/DomDatabaseWrapper.java @@ -141,9 +141,12 @@ public DomGroupWrapper getRecycleBin() { return null; } - DomGroupWrapper g = newGroup(); - g.setName("Recycle Bin"); - getRootGroup().addGroup(g); + DomGroupWrapper g = findRecycleBinCandidate(); + if (g == null) { + g = newGroup(RECYCLE_BIN_NAME); + getRootGroup().addGroup(g); + } + ensureElementContent(RECYCLE_BIN_UUID_ELEMENT_NAME, dbMeta, base64FromUuid(g.getUuid())); touchElement(RECYCLE_BIN_CHANGED_ELEMENT_NAME, dbMeta); return g; diff --git a/jaxb/src/main/java/org/linguafranca/pwdb/kdbx/jaxb/JaxbDatabase.java b/jaxb/src/main/java/org/linguafranca/pwdb/kdbx/jaxb/JaxbDatabase.java index 53d17e0a..7a2b7211 100644 --- a/jaxb/src/main/java/org/linguafranca/pwdb/kdbx/jaxb/JaxbDatabase.java +++ b/jaxb/src/main/java/org/linguafranca/pwdb/kdbx/jaxb/JaxbDatabase.java @@ -101,8 +101,11 @@ public JaxbGroup getRecycleBin() { return null; } if (g == null) { - g = newGroup("Recycle Bin"); - getRootGroup().addGroup(g); + g = findRecycleBinCandidate(); + if (g == null) { + g = newGroup("Recycle Bin"); + getRootGroup().addGroup(g); + } this.keePassFile.getMeta().setRecycleBinUUID(g.getUuid()); this.keePassFile.getMeta().setRecycleBinChanged(new Date()); } diff --git a/simple/src/main/java/org/linguafranca/pwdb/kdbx/simple/SimpleDatabase.java b/simple/src/main/java/org/linguafranca/pwdb/kdbx/simple/SimpleDatabase.java index 67d0713b..729719f8 100644 --- a/simple/src/main/java/org/linguafranca/pwdb/kdbx/simple/SimpleDatabase.java +++ b/simple/src/main/java/org/linguafranca/pwdb/kdbx/simple/SimpleDatabase.java @@ -115,8 +115,11 @@ public SimpleGroup getRecycleBin() { UUID recycleBinUuid = this.keePassFile.meta.recycleBinUUID; SimpleGroup g = findGroup(recycleBinUuid); if (g == null && isRecycleBinEnabled()) { - g = newGroup("Recycle Bin"); - getRootGroup().addGroup(g); + g = findRecycleBinCandidate(); + if (g == null) { + g = newGroup(RECYCLE_BIN_NAME); + getRootGroup().addGroup(g); + } this.keePassFile.meta.recycleBinUUID = g.getUuid(); this.keePassFile.meta.recycleBinChanged = new Date(); } diff --git a/test/src/main/java/org/linguafranca/pwdb/checks/RecycleBinChecks.java b/test/src/main/java/org/linguafranca/pwdb/checks/RecycleBinChecks.java index 3fb007ae..87ace44e 100644 --- a/test/src/main/java/org/linguafranca/pwdb/checks/RecycleBinChecks.java +++ b/test/src/main/java/org/linguafranca/pwdb/checks/RecycleBinChecks.java @@ -76,4 +76,20 @@ public void recycleBinGroups() { assertEquals(0, recycleBin.getGroupsCount()); } + @Test + public void recycleBinSelectedByName() { + database.enableRecycleBin(true); + assertTrue(database.isRecycleBinEnabled()); + + // Add group with "Recycle Bin" name + G recycleBinCandidate = database.newGroup("Recycle Bin"); + database.getRootGroup().addGroup(recycleBinCandidate); + assertEquals(1, database.getRootGroup().getGroups().size()); + + // Check that "Recycle Bin" was selected by its name + G recycleBin = database.getRecycleBin(); + assertNotNull(recycleBin); + assertEquals(recycleBinCandidate.getUuid(), recycleBin.getUuid()); + } + }