mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Better date XML implementation and DeletedObject as parcelable
This commit is contained in:
@@ -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>(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<DeletedObject> {
|
||||
override fun createFromParcel(parcel: Parcel): DeletedObject {
|
||||
return DeletedObject(parcel)
|
||||
}
|
||||
|
||||
override fun newArray(size: Int): Array<DeletedObject?> {
|
||||
return arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
|
||||
*/
|
||||
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<UUID, UUID, GroupKDBX, EntryKDBX> {
|
||||
}
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user