mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Update open database methods
This commit is contained in:
@@ -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)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user