diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt index f01254d2f..7306dde70 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt @@ -19,30 +19,37 @@ */ package com.kunzisoft.keepass.database.element +import android.os.Parcel +import android.os.ParcelUuid +import android.os.Parcelable import com.kunzisoft.keepass.database.element.database.DatabaseVersioned -import java.util.Date -import java.util.UUID +import java.util.* -class DeletedObject { +class DeletedObject : Parcelable { var uuid: UUID = DatabaseVersioned.UUID_ZERO - private var mDeletionTime: Date? = null + private var mDeletionTime: DateInstant? = null - fun getDeletionTime(): Date { + constructor() + + constructor(uuid: UUID, deletionTime: DateInstant = DateInstant()) { + this.uuid = uuid + this.mDeletionTime = deletionTime + } + + constructor(parcel: Parcel) { + uuid = parcel.readParcelable(ParcelUuid::class.java.classLoader)?.uuid ?: DatabaseVersioned.UUID_ZERO + mDeletionTime = parcel.readParcelable(DateInstant::class.java.classLoader) + } + + fun getDeletionTime(): DateInstant { if (mDeletionTime == null) { - mDeletionTime = Date(System.currentTimeMillis()) + mDeletionTime = DateInstant(System.currentTimeMillis()) } return mDeletionTime!! } - fun setDeletionTime(deletionTime: Date) { - this.mDeletionTime = deletionTime - } - - constructor() - - constructor(uuid: UUID, deletionTime: Date = Date()) { - this.uuid = uuid + fun setDeletionTime(deletionTime: DateInstant) { this.mDeletionTime = deletionTime } @@ -59,4 +66,23 @@ class DeletedObject { override fun hashCode(): Int { return uuid.hashCode() } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeParcelable(ParcelUuid(uuid), flags) + parcel.writeParcelable(mDeletionTime, flags) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): DeletedObject { + return DeletedObject(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt index 6f31c857b..1428ed6af 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt @@ -105,7 +105,7 @@ class DatabaseKDBX : DatabaseVersioned { */ var isRecycleBinEnabled = true var recycleBinUUID: UUID = UUID_ZERO - var recycleBinChanged = Date() + var recycleBinChanged = DateInstant() var entryTemplatesGroup = UUID_ZERO var entryTemplatesGroupChanged = DateInstant() var historyMaxItems = DEFAULT_HISTORY_MAX_ITEMS @@ -617,14 +617,14 @@ class DatabaseKDBX : DatabaseVersioned { } addGroupTo(recycleBinGroup, rootGroup) recycleBinUUID = recycleBinGroup.id - recycleBinChanged = recycleBinGroup.lastModificationTime.date + recycleBinChanged = recycleBinGroup.lastModificationTime } } fun removeRecycleBin() { if (recycleBin != null) { recycleBinUUID = UUID_ZERO - recycleBinChanged = DateInstant().date + recycleBinChanged = DateInstant() } } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt index edaae5913..c11e59563 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt @@ -390,25 +390,25 @@ class DatabaseInputKDBX(cacheDirectory: File, } } } else if (name.equals(DatabaseKDBXXML.ElemSettingsChanged, ignoreCase = true)) { - mDatabase.settingsChanged = readPwTime(xpp) + mDatabase.settingsChanged = readDateInstant(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbName, ignoreCase = true)) { mDatabase.name = readString(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbNameChanged, ignoreCase = true)) { - mDatabase.nameChanged = readPwTime(xpp) + mDatabase.nameChanged = readDateInstant(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbDesc, ignoreCase = true)) { mDatabase.description = readString(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbDescChanged, ignoreCase = true)) { - mDatabase.descriptionChanged = readPwTime(xpp) + mDatabase.descriptionChanged = readDateInstant(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbDefaultUser, ignoreCase = true)) { mDatabase.defaultUserName = readString(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbDefaultUserChanged, ignoreCase = true)) { - mDatabase.defaultUserNameChanged = readPwTime(xpp) + mDatabase.defaultUserNameChanged = readDateInstant(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbColor, ignoreCase = true)) { mDatabase.color = readString(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbMntncHistoryDays, ignoreCase = true)) { mDatabase.maintenanceHistoryDays = readUInt(xpp, DEFAULT_HISTORY_DAYS) } else if (name.equals(DatabaseKDBXXML.ElemDbKeyChanged, ignoreCase = true)) { - mDatabase.keyLastChanged = readPwTime(xpp) + mDatabase.keyLastChanged = readDateInstant(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDbKeyChangeRec, ignoreCase = true)) { mDatabase.keyChangeRecDays = readLong(xpp, -1) } else if (name.equals(DatabaseKDBXXML.ElemDbKeyChangeForce, ignoreCase = true)) { @@ -424,11 +424,11 @@ class DatabaseInputKDBX(cacheDirectory: File, } else if (name.equals(DatabaseKDBXXML.ElemRecycleBinUuid, ignoreCase = true)) { mDatabase.recycleBinUUID = readUuid(xpp) } else if (name.equals(DatabaseKDBXXML.ElemRecycleBinChanged, ignoreCase = true)) { - mDatabase.recycleBinChanged = readTime(xpp) + mDatabase.recycleBinChanged = readDateInstant(xpp) } else if (name.equals(DatabaseKDBXXML.ElemEntryTemplatesGroup, ignoreCase = true)) { mDatabase.entryTemplatesGroup = readUuid(xpp) } else if (name.equals(DatabaseKDBXXML.ElemEntryTemplatesGroupChanged, ignoreCase = true)) { - mDatabase.entryTemplatesGroupChanged = readPwTime(xpp) + mDatabase.entryTemplatesGroupChanged = readDateInstant(xpp) } else if (name.equals(DatabaseKDBXXML.ElemHistoryMaxItems, ignoreCase = true)) { mDatabase.historyMaxItems = readInt(xpp, -1) } else if (name.equals(DatabaseKDBXXML.ElemHistoryMaxSize, ignoreCase = true)) { @@ -475,7 +475,7 @@ class DatabaseInputKDBX(cacheDirectory: File, } else if (name.equals(DatabaseKDBXXML.ElemName, ignoreCase = true)) { customIconName = readString(xpp) } else if (name.equals(DatabaseKDBXXML.ElemLastModTime, ignoreCase = true)) { - customIconLastModificationTime = readPwTime(xpp) + customIconLastModificationTime = readDateInstant(xpp) } else { readUnknown(xpp) } @@ -497,7 +497,7 @@ class DatabaseInputKDBX(cacheDirectory: File, } else if (name.equals(DatabaseKDBXXML.ElemValue, ignoreCase = true)) { customDataValue = readString(xpp) } else if (name.equals(DatabaseKDBXXML.ElemLastModTime, ignoreCase = true)) { - customDataLastModificationTime = readPwTime(xpp) + customDataLastModificationTime = readDateInstant(xpp) } else { readUnknown(xpp) } @@ -634,13 +634,13 @@ class DatabaseInputKDBX(cacheDirectory: File, } when { - name.equals(DatabaseKDBXXML.ElemLastModTime, ignoreCase = true) -> tl?.lastModificationTime = readPwTime(xpp) - name.equals(DatabaseKDBXXML.ElemCreationTime, ignoreCase = true) -> tl?.creationTime = readPwTime(xpp) - name.equals(DatabaseKDBXXML.ElemLastAccessTime, ignoreCase = true) -> tl?.lastAccessTime = readPwTime(xpp) - name.equals(DatabaseKDBXXML.ElemExpiryTime, ignoreCase = true) -> tl?.expiryTime = readPwTime(xpp) + name.equals(DatabaseKDBXXML.ElemLastModTime, ignoreCase = true) -> tl?.lastModificationTime = readDateInstant(xpp) + name.equals(DatabaseKDBXXML.ElemCreationTime, ignoreCase = true) -> tl?.creationTime = readDateInstant(xpp) + name.equals(DatabaseKDBXXML.ElemLastAccessTime, ignoreCase = true) -> tl?.lastAccessTime = readDateInstant(xpp) + name.equals(DatabaseKDBXXML.ElemExpiryTime, ignoreCase = true) -> tl?.expiryTime = readDateInstant(xpp) name.equals(DatabaseKDBXXML.ElemExpires, ignoreCase = true) -> tl?.expires = readBool(xpp, false) name.equals(DatabaseKDBXXML.ElemUsageCount, ignoreCase = true) -> tl?.usageCount = readULong(xpp, UnsignedLong(0)) - name.equals(DatabaseKDBXXML.ElemLocationChanged, ignoreCase = true) -> tl?.locationChanged = readPwTime(xpp) + name.equals(DatabaseKDBXXML.ElemLocationChanged, ignoreCase = true) -> tl?.locationChanged = readDateInstant(xpp) else -> readUnknown(xpp) } } @@ -701,7 +701,7 @@ class DatabaseInputKDBX(cacheDirectory: File, KdbContext.DeletedObject -> if (name.equals(DatabaseKDBXXML.ElemUuid, ignoreCase = true)) { ctxDeletedObject?.uuid = readUuid(xpp) } else if (name.equals(DatabaseKDBXXML.ElemDeletionTime, ignoreCase = true)) { - ctxDeletedObject?.setDeletionTime(readTime(xpp)) + ctxDeletedObject?.setDeletionTime(readDateInstant(xpp)) } else { readUnknown(xpp) } @@ -854,12 +854,7 @@ class DatabaseInputKDBX(cacheDirectory: File, } @Throws(IOException::class, XmlPullParserException::class) - private fun readPwTime(xpp: XmlPullParser): DateInstant { - return DateInstant(readTime(xpp)) - } - - @Throws(IOException::class, XmlPullParserException::class) - private fun readTime(xpp: XmlPullParser): Date { + private fun readDateInstant(xpp: XmlPullParser): DateInstant { val sDate = readString(xpp) var utcDate: Date? = null @@ -881,7 +876,7 @@ class DatabaseInputKDBX(cacheDirectory: File, utcDate = DateKDBXUtil.convertKDBX4Time(seconds) } - return utcDate ?: Date(0L) + return DateInstant(utcDate ?: Date(0L)) } @Throws(XmlPullParserException::class, IOException::class) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt index 5e162fe72..1830a162b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt @@ -23,15 +23,12 @@ import android.util.Base64 import android.util.Log import android.util.Xml import com.kunzisoft.encrypt.StreamCipher -import com.kunzisoft.keepass.database.crypto.CrsAlgorithm import com.kunzisoft.keepass.database.action.node.NodeHandler import com.kunzisoft.keepass.database.crypto.CipherEngine +import com.kunzisoft.keepass.database.crypto.CrsAlgorithm import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.kdf.KdfFactory -import com.kunzisoft.keepass.database.element.CustomData -import com.kunzisoft.keepass.database.element.CustomDataItem -import com.kunzisoft.keepass.database.element.DeletedObject -import com.kunzisoft.keepass.database.element.Tags +import com.kunzisoft.keepass.database.element.* import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm import com.kunzisoft.keepass.database.element.database.DatabaseKDBX import com.kunzisoft.keepass.database.element.database.DatabaseKDBX.Companion.BASE_64_FLAG @@ -244,14 +241,14 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX, } writeObject(DatabaseKDBXXML.ElemDbName, mDatabaseKDBX.name, true) - writeObject(DatabaseKDBXXML.ElemDbNameChanged, mDatabaseKDBX.nameChanged.date) + writeDateInstant(DatabaseKDBXXML.ElemDbNameChanged, mDatabaseKDBX.nameChanged) writeObject(DatabaseKDBXXML.ElemDbDesc, mDatabaseKDBX.description, true) - writeObject(DatabaseKDBXXML.ElemDbDescChanged, mDatabaseKDBX.descriptionChanged.date) + writeDateInstant(DatabaseKDBXXML.ElemDbDescChanged, mDatabaseKDBX.descriptionChanged) writeObject(DatabaseKDBXXML.ElemDbDefaultUser, mDatabaseKDBX.defaultUserName, true) - writeObject(DatabaseKDBXXML.ElemDbDefaultUserChanged, mDatabaseKDBX.defaultUserNameChanged.date) + writeDateInstant(DatabaseKDBXXML.ElemDbDefaultUserChanged, mDatabaseKDBX.defaultUserNameChanged) writeObject(DatabaseKDBXXML.ElemDbMntncHistoryDays, mDatabaseKDBX.maintenanceHistoryDays.toKotlinLong()) writeObject(DatabaseKDBXXML.ElemDbColor, mDatabaseKDBX.color) - writeObject(DatabaseKDBXXML.ElemDbKeyChanged, mDatabaseKDBX.keyLastChanged.date) + writeDateInstant(DatabaseKDBXXML.ElemDbKeyChanged, mDatabaseKDBX.keyLastChanged) writeObject(DatabaseKDBXXML.ElemDbKeyChangeRec, mDatabaseKDBX.keyChangeRecDays) writeObject(DatabaseKDBXXML.ElemDbKeyChangeForce, mDatabaseKDBX.keyChangeForceDays) @@ -261,9 +258,9 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX, writeObject(DatabaseKDBXXML.ElemRecycleBinEnabled, mDatabaseKDBX.isRecycleBinEnabled) writeUuid(DatabaseKDBXXML.ElemRecycleBinUuid, mDatabaseKDBX.recycleBinUUID) - writeObject(DatabaseKDBXXML.ElemRecycleBinChanged, mDatabaseKDBX.recycleBinChanged) + writeDateInstant(DatabaseKDBXXML.ElemRecycleBinChanged, mDatabaseKDBX.recycleBinChanged) writeUuid(DatabaseKDBXXML.ElemEntryTemplatesGroup, mDatabaseKDBX.entryTemplatesGroup) - writeObject(DatabaseKDBXXML.ElemEntryTemplatesGroupChanged, mDatabaseKDBX.entryTemplatesGroupChanged.date) + writeDateInstant(DatabaseKDBXXML.ElemEntryTemplatesGroupChanged, mDatabaseKDBX.entryTemplatesGroupChanged) writeObject(DatabaseKDBXXML.ElemHistoryMaxItems, mDatabaseKDBX.historyMaxItems.toLong()) writeObject(DatabaseKDBXXML.ElemHistoryMaxSize, mDatabaseKDBX.historyMaxSize) writeUuid(DatabaseKDBXXML.ElemLastSelectedGroup, mDatabaseKDBX.lastSelectedGroupUUID) @@ -427,13 +424,12 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX, } @Throws(IllegalArgumentException::class, IllegalStateException::class, IOException::class) - private fun writeObject(name: String, value: Date) { + private fun writeDateInstant(name: String, value: DateInstant) { + val date = value.date if (header!!.version.isBefore(FILE_VERSION_40)) { - writeObject(name, DatabaseKDBXXML.DateFormatter.format(value)) + writeObject(name, DatabaseKDBXXML.DateFormatter.format(date)) } else { - val dt = DateTime(value) - val seconds = DateKDBXUtil.convertDateToKDBX4Time(dt) - val buf = longTo8Bytes(seconds) + val buf = longTo8Bytes(DateKDBXUtil.convertDateToKDBX4Time(DateTime(date))) val b64 = String(Base64.encode(buf, BASE_64_FLAG)) writeObject(name, b64) } @@ -597,7 +593,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX, xml.startTag(null, DatabaseKDBXXML.ElemDeletedObject) writeUuid(DatabaseKDBXXML.ElemUuid, value.uuid) - writeObject(DatabaseKDBXXML.ElemDeletionTime, value.getDeletionTime()) + writeDateInstant(DatabaseKDBXXML.ElemDeletionTime, value.getDeletionTime()) xml.endTag(null, DatabaseKDBXXML.ElemDeletedObject) } @@ -671,7 +667,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX, xml.endTag(null, DatabaseKDBXXML.ElemValue) customDataItem.lastModificationTime?.let { lastModificationTime -> - writeObject(DatabaseKDBXXML.ElemLastModTime, lastModificationTime.date) + writeDateInstant(DatabaseKDBXXML.ElemLastModTime, lastModificationTime) } xml.endTag(null, DatabaseKDBXXML.ElemStringDictExItem) @@ -688,13 +684,13 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX, private fun writeTimes(node: NodeKDBXInterface) { xml.startTag(null, DatabaseKDBXXML.ElemTimes) - writeObject(DatabaseKDBXXML.ElemLastModTime, node.lastModificationTime.date) - writeObject(DatabaseKDBXXML.ElemCreationTime, node.creationTime.date) - writeObject(DatabaseKDBXXML.ElemLastAccessTime, node.lastAccessTime.date) - writeObject(DatabaseKDBXXML.ElemExpiryTime, node.expiryTime.date) + writeDateInstant(DatabaseKDBXXML.ElemLastModTime, node.lastModificationTime) + writeDateInstant(DatabaseKDBXXML.ElemCreationTime, node.creationTime) + writeDateInstant(DatabaseKDBXXML.ElemLastAccessTime, node.lastAccessTime) + writeDateInstant(DatabaseKDBXXML.ElemExpiryTime, node.expiryTime) writeObject(DatabaseKDBXXML.ElemExpires, node.expires) writeObject(DatabaseKDBXXML.ElemUsageCount, node.usageCount.toKotlinLong()) - writeObject(DatabaseKDBXXML.ElemLocationChanged, node.locationChanged.date) + writeDateInstant(DatabaseKDBXXML.ElemLocationChanged, node.locationChanged) xml.endTag(null, DatabaseKDBXXML.ElemTimes) } @@ -742,7 +738,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX, writeObject(DatabaseKDBXXML.ElemName, iconCustom.name) } iconCustom.lastModificationTime?.let { lastModificationTime -> - writeObject(DatabaseKDBXXML.ElemLastModTime, lastModificationTime.date) + writeDateInstant(DatabaseKDBXXML.ElemLastModTime, lastModificationTime) } xml.endTag(null, DatabaseKDBXXML.ElemCustomIconItem)