Small refactoring code

This commit is contained in:
J-Jamet
2021-02-09 18:23:48 +01:00
parent 3719bf3593
commit 6bd5b2345c
4 changed files with 73 additions and 77 deletions

View File

@@ -215,10 +215,10 @@ class DatabaseOutputKDB(private val mDatabaseKDB: DatabaseKDB,
mDatabaseKDB.doForEachGroupInIndex { group -> mDatabaseKDB.doForEachGroupInIndex { group ->
GroupOutputKDB.write(outputStream, group) GroupOutputKDB.write(outputStream, group)
} }
val binaryCipherKey = mDatabaseKDB.loadedCipherKey
?: throw DatabaseOutputException("Unable to retrieve cipher key to write binaries")
mDatabaseKDB.doForEachEntryInIndex { entry -> mDatabaseKDB.doForEachEntryInIndex { entry ->
val binaryCipherKey = mDatabaseKDB.loadedCipherKey EntryOutputKDB.write(outputStream, entry, binaryCipherKey)
?: throw DatabaseOutputException("Unable to retrieve cipher key to write binaries")
EntryOutputKDB.writeEntry(outputStream, entry, binaryCipherKey)
} }
} }

View File

@@ -36,81 +36,80 @@ class EntryOutputKDB {
companion object { companion object {
@Throws(DatabaseOutputException::class) @Throws(DatabaseOutputException::class)
fun writeEntry(mOutputStream: OutputStream, fun write(outputStream: OutputStream,
mEntry: EntryKDB, entry: EntryKDB,
binaryCipherKey: Database.LoadedKey) { binaryCipherKey: Database.LoadedKey) {
//NOTE: Need be to careful about using ints. The actual type written to file is a unsigned int //NOTE: Need be to careful about using ints. The actual type written to file is a unsigned int
try { try {
// UUID // UUID
mOutputStream.write(UUID_FIELD_TYPE) outputStream.write(UUID_FIELD_TYPE)
mOutputStream.write(UUID_FIELD_SIZE) outputStream.write(UUID_FIELD_SIZE)
mOutputStream.write(uuidTo16Bytes(mEntry.id)) outputStream.write(uuidTo16Bytes(entry.id))
// Group ID // Group ID
mOutputStream.write(GROUPID_FIELD_TYPE) outputStream.write(GROUPID_FIELD_TYPE)
mOutputStream.write(GROUPID_FIELD_SIZE) outputStream.write(GROUPID_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mEntry.parent!!.id))) outputStream.write(uIntTo4Bytes(UnsignedInt(entry.parent!!.id)))
// Image ID // Image ID
mOutputStream.write(IMAGEID_FIELD_TYPE) outputStream.write(IMAGEID_FIELD_TYPE)
mOutputStream.write(IMAGEID_FIELD_SIZE) outputStream.write(IMAGEID_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mEntry.icon.iconId))) outputStream.write(uIntTo4Bytes(UnsignedInt(entry.icon.iconId)))
// Title // Title
//byte[] title = mEntry.title.getBytes("UTF-8"); outputStream.write(TITLE_FIELD_TYPE)
mOutputStream.write(TITLE_FIELD_TYPE) StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.title)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.title, mOutputStream)
// URL // URL
mOutputStream.write(URL_FIELD_TYPE) outputStream.write(URL_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.url, mOutputStream) StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.url)
// Username // Username
mOutputStream.write(USERNAME_FIELD_TYPE) outputStream.write(USERNAME_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.username, mOutputStream) StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.username)
// Password // Password
mOutputStream.write(PASSWORD_FIELD_TYPE) outputStream.write(PASSWORD_FIELD_TYPE)
writePassword(mOutputStream, mEntry.password) writePassword(outputStream, entry.password)
// Additional // Additional
mOutputStream.write(ADDITIONAL_FIELD_TYPE) outputStream.write(ADDITIONAL_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.notes, mOutputStream) StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.notes)
// Create date // Create date
writeDate(mOutputStream, CREATE_FIELD_TYPE, dateTo5Bytes(mEntry.creationTime.date)) writeDate(outputStream, CREATE_FIELD_TYPE, dateTo5Bytes(entry.creationTime.date))
// Modification date // Modification date
writeDate(mOutputStream, MOD_FIELD_TYPE, dateTo5Bytes(mEntry.lastModificationTime.date)) writeDate(outputStream, MOD_FIELD_TYPE, dateTo5Bytes(entry.lastModificationTime.date))
// Access date // Access date
writeDate(mOutputStream, ACCESS_FIELD_TYPE, dateTo5Bytes(mEntry.lastAccessTime.date)) writeDate(outputStream, ACCESS_FIELD_TYPE, dateTo5Bytes(entry.lastAccessTime.date))
// Expiration date // Expiration date
writeDate(mOutputStream, EXPIRE_FIELD_TYPE, dateTo5Bytes(mEntry.expiryTime.date)) writeDate(outputStream, EXPIRE_FIELD_TYPE, dateTo5Bytes(entry.expiryTime.date))
// Binary description // Binary description
mOutputStream.write(BINARY_DESC_FIELD_TYPE) outputStream.write(BINARY_DESC_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.binaryDescription, mOutputStream) StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.binaryDescription)
// Binary // Binary
mOutputStream.write(BINARY_DATA_FIELD_TYPE) outputStream.write(BINARY_DATA_FIELD_TYPE)
val binaryData = mEntry.binaryData val binaryData = entry.binaryData
val binaryDataLength = binaryData?.length ?: 0L val binaryDataLength = binaryData?.length ?: 0L
// Write data length // Write data length
mOutputStream.write(uIntTo4Bytes(UnsignedInt.fromKotlinLong(binaryDataLength))) outputStream.write(uIntTo4Bytes(UnsignedInt.fromKotlinLong(binaryDataLength)))
// Write data // Write data
if (binaryDataLength > 0) { if (binaryDataLength > 0) {
binaryData?.getInputDataStream(binaryCipherKey).use { inputStream -> binaryData?.getInputDataStream(binaryCipherKey).use { inputStream ->
inputStream?.readAllBytes { buffer -> inputStream?.readAllBytes { buffer ->
mOutputStream.write(buffer) outputStream.write(buffer)
} }
} }
} }
// End // End
mOutputStream.write(END_FIELD_TYPE) outputStream.write(END_FIELD_TYPE)
mOutputStream.write(ZERO_FIELD_SIZE) outputStream.write(ZERO_FIELD_SIZE)
} catch (e: IOException) { } catch (e: IOException) {
throw DatabaseOutputException("Failed to output an entry.", e) throw DatabaseOutputException("Failed to output an entry.", e)
} }
@@ -156,13 +155,10 @@ class EntryOutputKDB {
private val BINARY_DATA_FIELD_TYPE:ByteArray = uShortTo2Bytes(14) private val BINARY_DATA_FIELD_TYPE:ByteArray = uShortTo2Bytes(14)
private val END_FIELD_TYPE:ByteArray = uShortTo2Bytes(0xFFFF) private val END_FIELD_TYPE:ByteArray = uShortTo2Bytes(0xFFFF)
private val LONG_FOUR:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val UUID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(16)) private val UUID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(16))
private val GROUPID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4)) private val GROUPID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val DATE_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(5)) private val DATE_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(5))
private val IMAGEID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4)) private val IMAGEID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val LEVEL_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val FLAGS_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val ZERO_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(0)) private val ZERO_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(0))
private val ZERO_FIVE:ByteArray = byteArrayOf(0x00, 0x00, 0x00, 0x00, 0x00) private val ZERO_FIVE:ByteArray = byteArrayOf(0x00, 0x00, 0x00, 0x00, 0x00)
} }

View File

@@ -36,57 +36,57 @@ class GroupOutputKDB {
companion object { companion object {
@Throws(DatabaseOutputException::class) @Throws(DatabaseOutputException::class)
fun write(mOutputStream: OutputStream, fun write(outputStream: OutputStream,
mGroup: GroupKDB) { group: GroupKDB) {
//NOTE: Need be to careful about using ints. The actual type written to file is a unsigned int, but most values can't be greater than 2^31, so it probably doesn't matter. //NOTE: Need be to careful about using ints. The actual type written to file is a unsigned int, but most values can't be greater than 2^31, so it probably doesn't matter.
try { try {
// Group ID // Group ID
mOutputStream.write(GROUPID_FIELD_TYPE) outputStream.write(GROUPID_FIELD_TYPE)
mOutputStream.write(GROUPID_FIELD_SIZE) outputStream.write(GROUPID_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mGroup.id))) outputStream.write(uIntTo4Bytes(UnsignedInt(group.id)))
// Name // Name
mOutputStream.write(NAME_FIELD_TYPE) outputStream.write(NAME_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mGroup.title, mOutputStream) StringDatabaseKDBUtils.writeStringToStream(outputStream, group.title)
// Create date // Create date
mOutputStream.write(CREATE_FIELD_TYPE) outputStream.write(CREATE_FIELD_TYPE)
mOutputStream.write(DATE_FIELD_SIZE) outputStream.write(DATE_FIELD_SIZE)
mOutputStream.write(dateTo5Bytes(mGroup.creationTime.date)) outputStream.write(dateTo5Bytes(group.creationTime.date))
// Modification date // Modification date
mOutputStream.write(MOD_FIELD_TYPE) outputStream.write(MOD_FIELD_TYPE)
mOutputStream.write(DATE_FIELD_SIZE) outputStream.write(DATE_FIELD_SIZE)
mOutputStream.write(dateTo5Bytes(mGroup.lastModificationTime.date)) outputStream.write(dateTo5Bytes(group.lastModificationTime.date))
// Access date // Access date
mOutputStream.write(ACCESS_FIELD_TYPE) outputStream.write(ACCESS_FIELD_TYPE)
mOutputStream.write(DATE_FIELD_SIZE) outputStream.write(DATE_FIELD_SIZE)
mOutputStream.write(dateTo5Bytes(mGroup.lastAccessTime.date)) outputStream.write(dateTo5Bytes(group.lastAccessTime.date))
// Expiration date // Expiration date
mOutputStream.write(EXPIRE_FIELD_TYPE) outputStream.write(EXPIRE_FIELD_TYPE)
mOutputStream.write(DATE_FIELD_SIZE) outputStream.write(DATE_FIELD_SIZE)
mOutputStream.write(dateTo5Bytes(mGroup.expiryTime.date)) outputStream.write(dateTo5Bytes(group.expiryTime.date))
// Image ID // Image ID
mOutputStream.write(IMAGEID_FIELD_TYPE) outputStream.write(IMAGEID_FIELD_TYPE)
mOutputStream.write(IMAGEID_FIELD_SIZE) outputStream.write(IMAGEID_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mGroup.icon.iconId))) outputStream.write(uIntTo4Bytes(UnsignedInt(group.icon.iconId)))
// Level // Level
mOutputStream.write(LEVEL_FIELD_TYPE) outputStream.write(LEVEL_FIELD_TYPE)
mOutputStream.write(LEVEL_FIELD_SIZE) outputStream.write(LEVEL_FIELD_SIZE)
mOutputStream.write(uShortTo2Bytes(mGroup.level)) outputStream.write(uShortTo2Bytes(group.level))
// Flags // Flags
mOutputStream.write(FLAGS_FIELD_TYPE) outputStream.write(FLAGS_FIELD_TYPE)
mOutputStream.write(FLAGS_FIELD_SIZE) outputStream.write(FLAGS_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mGroup.groupFlags))) outputStream.write(uIntTo4Bytes(UnsignedInt(group.groupFlags)))
// End // End
mOutputStream.write(END_FIELD_TYPE) outputStream.write(END_FIELD_TYPE)
mOutputStream.write(ZERO_FIELD_SIZE) outputStream.write(ZERO_FIELD_SIZE)
} catch (e: IOException) { } catch (e: IOException) {
throw DatabaseOutputException("Failed to output a group", e) throw DatabaseOutputException("Failed to output a group", e)
} }

View File

@@ -53,12 +53,12 @@ object StringDatabaseKDBUtils {
} }
@Throws(IOException::class) @Throws(IOException::class)
fun writeStringToBytes(string: String?, os: OutputStream): Int { fun writeStringToStream(outputStream: OutputStream, string: String?): Int {
var str = string var str = string
if (str == null) { if (str == null) {
// Write out a null character // Write out a null character
os.write(uIntTo4Bytes(UnsignedInt(1))) outputStream.write(uIntTo4Bytes(UnsignedInt(1)))
os.write(0x00) outputStream.write(0x00)
return 0 return 0
} }
@@ -69,9 +69,9 @@ object StringDatabaseKDBUtils {
val initial = str.toByteArray(defaultCharset) val initial = str.toByteArray(defaultCharset)
val length = initial.size + 1 val length = initial.size + 1
os.write(uIntTo4Bytes(UnsignedInt(length))) outputStream.write(uIntTo4Bytes(UnsignedInt(length)))
os.write(initial) outputStream.write(initial)
os.write(0x00) outputStream.write(0x00)
return length return length
} }