From a10ccc1eb096408e06fa3b94ac0d36685b8429aa Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 28 Aug 2020 13:12:54 +0200 Subject: [PATCH] Second pass to fix attachment deleted in history --- .../DeleteEntryHistoryDatabaseRunnable.kt | 2 +- .../action/node/UpdateEntryRunnable.kt | 4 +- .../keepass/database/element/Database.kt | 37 +++++++++---------- .../keepass/database/element/Entry.kt | 22 ++++++----- .../database/element/entry/EntryKDBX.kt | 20 ++++------ 5 files changed, 41 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt index 11a91d672..2e6c2eab0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt @@ -34,7 +34,7 @@ class DeleteEntryHistoryDatabaseRunnable ( override fun onStartRun() { try { - mainEntry.removeEntryFromHistory(entryHistoryPosition) + database.removeEntryHistory(mainEntry, entryHistoryPosition) } catch (e: Exception) { setError(e) } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt index eab1583c1..0f211332a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt @@ -42,8 +42,8 @@ class UpdateEntryRunnable constructor( mNewEntry.addParentFrom(mOldEntry) // Build oldest attachments - val oldEntryAttachments = mOldEntry.getAttachments(database.binaryPool) - val newEntryAttachments = mNewEntry.getAttachments(database.binaryPool) + val oldEntryAttachments = mOldEntry.getAttachments(database.binaryPool, true) + val newEntryAttachments = mNewEntry.getAttachments(database.binaryPool, true) val attachmentsToRemove = ArrayList(oldEntryAttachments) // Not use equals because only check name newEntryAttachments.forEach { newAttachment -> diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index acc6a29e8..784d9d2dd 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -30,7 +30,6 @@ import com.kunzisoft.keepass.database.element.icon.IconImageFactory import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.NodeIdInt import com.kunzisoft.keepass.database.element.node.NodeIdUUID -import com.kunzisoft.keepass.database.element.database.BinaryAttachment import com.kunzisoft.keepass.database.element.security.EncryptionAlgorithm import com.kunzisoft.keepass.database.exception.DatabaseOutputException import com.kunzisoft.keepass.database.exception.FileNotFoundDatabaseException @@ -854,21 +853,6 @@ class Database { ) } - fun removeEachEntryHistory() { - rootGroup?.doForEachChildAndForIt( - object : NodeHandler() { - override fun operate(node: Entry): Boolean { - node.removeAllHistory() - return true - } - }, - object : NodeHandler() { - override fun operate(node: Group): Boolean { - return true - } - }) - } - /** * Remove oldest history if more than max items or max memory */ @@ -877,7 +861,7 @@ class Database { val maxItems = historyMaxItems if (maxItems >= 0) { while (entry.getHistory().size > maxItems) { - entry.removeOldestEntryFromHistory() + removeOldestEntryHistory(entry) } } @@ -888,9 +872,8 @@ class Database { for (entryHistory in entry.getHistory()) { historySize += entryHistory.getSize(binaryPool) } - if (historySize > maxSize) { - entry.removeOldestEntryFromHistory() + removeOldestEntryHistory(entry) } else { break } @@ -899,6 +882,22 @@ class Database { } } + private fun removeOldestEntryHistory(entry: Entry) { + entry.removeOldestEntryFromHistory()?.let { + it.getAttachments(binaryPool, false).forEach { attachmentToRemove -> + removeAttachmentIfNotUsed(attachmentToRemove) + } + } + } + + fun removeEntryHistory(entry: Entry, entryHistoryPosition: Int) { + entry.removeEntryFromHistory(entryHistoryPosition)?.let { + it.getAttachments(binaryPool, false).forEach { attachmentToRemove -> + removeAttachmentIfNotUsed(attachmentToRemove) + } + } + } + companion object : SingletonHolder(::Database) { private val TAG = Database::class.java.name diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt index a7f6b3a29..6bae6e325 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt @@ -325,12 +325,12 @@ class Entry : Node, EntryVersionedInterface { entryKDBX?.stopToManageFieldReferences() } - fun getAttachments(binaryPool: BinaryPool): Set { + fun getAttachments(binaryPool: BinaryPool, inHistory: Boolean = false): Set { val attachments = HashSet() entryKDB?.getAttachments()?.let { attachments.addAll(it) } - entryKDBX?.getAttachments(binaryPool)?.let { + entryKDBX?.getAttachments(binaryPool, inHistory)?.let { attachments.addAll(it) } return attachments @@ -366,16 +366,18 @@ class Entry : Node, EntryVersionedInterface { } } - fun removeEntryFromHistory(position: Int) { - entryKDBX?.removeEntryFromHistory(position) + fun removeEntryFromHistory(position: Int): Entry? { + entryKDBX?.removeEntryFromHistory(position)?.let { + return Entry(it) + } + return null } - fun removeAllHistory() { - entryKDBX?.removeAllHistory() - } - - fun removeOldestEntryFromHistory() { - entryKDBX?.removeOldestEntryFromHistory() + fun removeOldestEntryFromHistory(): Entry? { + entryKDBX?.removeOldestEntryFromHistory()?.let { + return Entry(it) + } + return null } fun getSize(binaryPool: BinaryPool): Long { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt index 6d99a3ce9..81387f19f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt @@ -21,7 +21,9 @@ package com.kunzisoft.keepass.database.element.entry import android.os.Parcel import android.os.Parcelable -import com.kunzisoft.keepass.database.element.* +import com.kunzisoft.keepass.database.element.Attachment +import com.kunzisoft.keepass.database.element.DateInstant +import com.kunzisoft.keepass.database.element.database.BinaryPool import com.kunzisoft.keepass.database.element.database.DatabaseKDBX import com.kunzisoft.keepass.database.element.group.GroupKDBX import com.kunzisoft.keepass.database.element.icon.IconImage @@ -32,8 +34,6 @@ import com.kunzisoft.keepass.database.element.node.NodeIdUUID import com.kunzisoft.keepass.database.element.node.NodeKDBXInterface import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.database.element.security.ProtectedString -import com.kunzisoft.keepass.database.element.Attachment -import com.kunzisoft.keepass.database.element.database.BinaryPool import com.kunzisoft.keepass.utils.ParcelableUtil import com.kunzisoft.keepass.utils.UnsignedLong import java.util.* @@ -337,15 +337,11 @@ class EntryKDBX : EntryVersioned, NodeKDBXInte history.add(entry) } - fun removeEntryFromHistory(position: Int) { - history.removeAt(position) + fun removeEntryFromHistory(position: Int): EntryKDBX? { + return history.removeAt(position) } - fun removeAllHistory() { - history.clear() - } - - fun removeOldestEntryFromHistory() { + fun removeOldestEntryFromHistory(): EntryKDBX? { var min: Date? = null var index = -1 @@ -358,9 +354,9 @@ class EntryKDBX : EntryVersioned, NodeKDBXInte } } - if (index != -1) { + return if (index != -1) { history.removeAt(index) - } + } else null } override fun touch(modified: Boolean, touchParents: Boolean) {