Update open database methods

This commit is contained in:
J-Jamet
2022-02-11 20:58:23 +01:00
parent 6686ce15c1
commit 445ed92ff7
5 changed files with 55 additions and 73 deletions

View File

@@ -41,7 +41,7 @@ class MergeDatabaseRunnable(private val context: Context,
override fun onActionRun() { override fun onActionRun() {
try { try {
mDatabase.mergeData(mDatabaseToMergeUri, context.contentResolver, mDatabase.mergeData(mDatabaseToMergeUri, null, context.contentResolver,
{ memoryWanted -> { memoryWanted ->
BinaryData.canMemoryBeAllocatedInRAM(context, memoryWanted) BinaryData.canMemoryBeAllocatedInRAM(context, memoryWanted)
}, },

View File

@@ -634,9 +634,13 @@ class Database {
} }
DatabaseInputKDB(databaseKDB) DatabaseInputKDB(databaseKDB)
.openDatabase(databaseInputStream, .openDatabase(databaseInputStream,
mainCredential.masterPassword, progressTaskUpdater
keyFileInputStream, ) {
progressTaskUpdater) databaseKDB.retrieveMasterKey(
mainCredential.masterPassword,
keyFileInputStream
)
}
databaseKDB databaseKDB
}, },
{ databaseInputStream -> { databaseInputStream ->
@@ -647,9 +651,12 @@ class Database {
DatabaseInputKDBX(databaseKDBX).apply { DatabaseInputKDBX(databaseKDBX).apply {
setMethodToCheckIfRAMIsSufficient(isRAMSufficient) setMethodToCheckIfRAMIsSufficient(isRAMSufficient)
openDatabase(databaseInputStream, openDatabase(databaseInputStream,
mainCredential.masterPassword, progressTaskUpdater) {
keyFileInputStream, databaseKDBX.retrieveMasterKey(
progressTaskUpdater) mainCredential.masterPassword,
keyFileInputStream,
)
}
} }
databaseKDBX databaseKDBX
} }
@@ -672,6 +679,7 @@ class Database {
@Throws(LoadDatabaseException::class) @Throws(LoadDatabaseException::class)
fun mergeData(databaseToMergeUri: Uri?, fun mergeData(databaseToMergeUri: Uri?,
databaseToMergeMainCredential: MainCredential?,
contentResolver: ContentResolver, contentResolver: ContentResolver,
isRAMSufficient: (memoryWanted: Long) -> Boolean, isRAMSufficient: (memoryWanted: Long) -> Boolean,
progressTaskUpdater: ProgressTaskUpdater?) { progressTaskUpdater: ProgressTaskUpdater?) {
@@ -684,26 +692,45 @@ class Database {
val databaseToMerge = Database() val databaseToMerge = Database()
databaseToMerge.fileUri = databaseToMergeUri ?: this.fileUri databaseToMerge.fileUri = databaseToMergeUri ?: this.fileUri
// Pass KeyFile Uri as InputStreams
var keyFileInputStream: InputStream? = null
try { try {
databaseToMerge.fileUri?.let { databaseUri -> databaseToMerge.fileUri?.let { databaseUri ->
val databaseKDB = DatabaseKDB() val databaseKDB = DatabaseKDB()
val databaseKDBX = DatabaseKDBX() val databaseKDBX = DatabaseKDBX()
if (databaseToMergeMainCredential != null) {
// Get keyFile inputStream
databaseToMergeMainCredential.keyFileUri?.let { keyFile ->
keyFileInputStream = UriUtil.getUriInputStream(contentResolver, keyFile)
}
}
databaseToMerge.readDatabaseStream(contentResolver, databaseUri, databaseToMerge.readDatabaseStream(contentResolver, databaseUri,
{ databaseInputStream -> { databaseInputStream ->
DatabaseInputKDB(databaseKDB) DatabaseInputKDB(databaseKDB)
.openDatabase(databaseInputStream, .openDatabase(databaseInputStream, progressTaskUpdater) {
masterKey, if (databaseToMergeMainCredential != null) {
progressTaskUpdater) databaseKDB.retrieveMasterKey(
databaseToMergeMainCredential.masterPassword,
keyFileInputStream,
)
}
}
databaseKDB databaseKDB
}, },
{ databaseInputStream -> { databaseInputStream ->
DatabaseInputKDBX(databaseKDBX).apply { DatabaseInputKDBX(databaseKDBX).apply {
setMethodToCheckIfRAMIsSufficient(isRAMSufficient) setMethodToCheckIfRAMIsSufficient(isRAMSufficient)
openDatabase(databaseInputStream, openDatabase(databaseInputStream, progressTaskUpdater) {
masterKey, if (databaseToMergeMainCredential != null) {
progressTaskUpdater) databaseKDBX.retrieveMasterKey(
databaseToMergeMainCredential.masterPassword,
keyFileInputStream,
)
}
}
} }
databaseKDBX databaseKDBX
} }
@@ -730,6 +757,7 @@ class Database {
} catch (e: Exception) { } catch (e: Exception) {
throw LoadDatabaseException(e) throw LoadDatabaseException(e)
} finally { } finally {
keyFileInputStream?.close()
databaseToMerge.clearAndClose() databaseToMerge.clearAndClose()
} }
} }
@@ -749,9 +777,9 @@ class Database {
databaseKDB.binaryCache = it.binaryCache databaseKDB.binaryCache = it.binaryCache
} }
DatabaseInputKDB(databaseKDB) DatabaseInputKDB(databaseKDB)
.openDatabase(databaseInputStream, .openDatabase(databaseInputStream, progressTaskUpdater) {
masterKey, databaseKDB.masterKey = masterKey
progressTaskUpdater) }
databaseKDB databaseKDB
}, },
{ databaseInputStream -> { databaseInputStream ->
@@ -761,9 +789,9 @@ class Database {
} }
DatabaseInputKDBX(databaseKDBX).apply { DatabaseInputKDBX(databaseKDBX).apply {
setMethodToCheckIfRAMIsSufficient(isRAMSufficient) setMethodToCheckIfRAMIsSufficient(isRAMSufficient)
openDatabase(databaseInputStream, openDatabase(databaseInputStream, progressTaskUpdater) {
masterKey, databaseKDBX.masterKey = masterKey
progressTaskUpdater) }
} }
databaseKDBX databaseKDBX
} }

View File

@@ -43,15 +43,8 @@ abstract class DatabaseInput<D : DatabaseVersioned<*, *, *, *>> (protected var m
@Throws(LoadDatabaseException::class) @Throws(LoadDatabaseException::class)
abstract fun openDatabase(databaseInputStream: InputStream, abstract fun openDatabase(databaseInputStream: InputStream,
password: String?, progressTaskUpdater: ProgressTaskUpdater?,
keyfileInputStream: InputStream?, assignMasterKey: (() -> Unit)): D
progressTaskUpdater: ProgressTaskUpdater?): D
@Throws(LoadDatabaseException::class)
abstract fun openDatabase(databaseInputStream: InputStream,
masterKey: ByteArray,
progressTaskUpdater: ProgressTaskUpdater?): D
protected fun startKeyTimer(progressTaskUpdater: ProgressTaskUpdater?) { protected fun startKeyTimer(progressTaskUpdater: ProgressTaskUpdater?) {
progressTaskUpdater?.updateMessage(R.string.retrieving_db_key) progressTaskUpdater?.updateMessage(R.string.retrieving_db_key)

View File

@@ -39,7 +39,6 @@ import java.security.MessageDigest
import java.util.* import java.util.*
import javax.crypto.Cipher import javax.crypto.Cipher
import javax.crypto.CipherInputStream import javax.crypto.CipherInputStream
import kotlin.collections.HashMap
/** /**
@@ -50,27 +49,8 @@ class DatabaseInputKDB(database: DatabaseKDB)
@Throws(LoadDatabaseException::class) @Throws(LoadDatabaseException::class)
override fun openDatabase(databaseInputStream: InputStream, override fun openDatabase(databaseInputStream: InputStream,
password: String?, progressTaskUpdater: ProgressTaskUpdater?,
keyfileInputStream: InputStream?, assignMasterKey: (() -> Unit)): DatabaseKDB {
progressTaskUpdater: ProgressTaskUpdater?): DatabaseKDB {
return openDatabase(databaseInputStream, progressTaskUpdater) {
mDatabase.retrieveMasterKey(password, keyfileInputStream)
}
}
@Throws(LoadDatabaseException::class)
override fun openDatabase(databaseInputStream: InputStream,
masterKey: ByteArray,
progressTaskUpdater: ProgressTaskUpdater?): DatabaseKDB {
return openDatabase(databaseInputStream, progressTaskUpdater) {
mDatabase.masterKey = masterKey
}
}
@Throws(LoadDatabaseException::class)
private fun openDatabase(databaseInputStream: InputStream,
progressTaskUpdater: ProgressTaskUpdater?,
assignMasterKey: (() -> Unit)? = null): DatabaseKDB {
try { try {
startKeyTimer(progressTaskUpdater) startKeyTimer(progressTaskUpdater)
@@ -96,7 +76,7 @@ class DatabaseInputKDB(database: DatabaseKDB)
throw VersionDatabaseException() throw VersionDatabaseException()
} }
assignMasterKey?.invoke() assignMasterKey.invoke()
// Select algorithm // Select algorithm
when { when {

View File

@@ -101,27 +101,8 @@ class DatabaseInputKDBX(database: DatabaseKDBX)
@Throws(LoadDatabaseException::class) @Throws(LoadDatabaseException::class)
override fun openDatabase(databaseInputStream: InputStream, override fun openDatabase(databaseInputStream: InputStream,
password: String?, progressTaskUpdater: ProgressTaskUpdater?,
keyfileInputStream: InputStream?, assignMasterKey: (() -> Unit)): DatabaseKDBX {
progressTaskUpdater: ProgressTaskUpdater?): DatabaseKDBX {
return openDatabase(databaseInputStream, progressTaskUpdater) {
mDatabase.retrieveMasterKey(password, keyfileInputStream)
}
}
@Throws(LoadDatabaseException::class)
override fun openDatabase(databaseInputStream: InputStream,
masterKey: ByteArray,
progressTaskUpdater: ProgressTaskUpdater?): DatabaseKDBX {
return openDatabase(databaseInputStream, progressTaskUpdater) {
mDatabase.masterKey = masterKey
}
}
@Throws(LoadDatabaseException::class)
private fun openDatabase(databaseInputStream: InputStream,
progressTaskUpdater: ProgressTaskUpdater?,
assignMasterKey: (() -> Unit)? = null): DatabaseKDBX {
try { try {
startKeyTimer(progressTaskUpdater) startKeyTimer(progressTaskUpdater)
@@ -133,7 +114,7 @@ class DatabaseInputKDBX(database: DatabaseKDBX)
hashOfHeader = headerAndHash.hash hashOfHeader = headerAndHash.hash
val pbHeader = headerAndHash.header val pbHeader = headerAndHash.header
assignMasterKey?.invoke() assignMasterKey.invoke()
mDatabase.makeFinalKey(header.masterSeed) mDatabase.makeFinalKey(header.masterSeed)
stopKeyTimer() stopKeyTimer()