adding dedicated error for missing room keys cipher
This commit is contained in:
parent
ef25d01c6d
commit
3a8c4c11ce
|
@ -156,6 +156,7 @@ internal fun SettingsScreen(viewModel: SettingsViewModel, onSignOut: () -> Unit,
|
||||||
ImportResult.Error.Type.UnexpectedDecryptionOutput -> "Unable to decrypt file, double check your passphrase"
|
ImportResult.Error.Type.UnexpectedDecryptionOutput -> "Unable to decrypt file, double check your passphrase"
|
||||||
is ImportResult.Error.Type.Unknown -> "${type.cause::class.java.simpleName}: ${type.cause.message}"
|
is ImportResult.Error.Type.Unknown -> "${type.cause::class.java.simpleName}: ${type.cause.message}"
|
||||||
ImportResult.Error.Type.UnableToOpenFile -> "Unable to open file"
|
ImportResult.Error.Type.UnableToOpenFile -> "Unable to open file"
|
||||||
|
ImportResult.Error.Type.InvalidFile -> "Unable to process file"
|
||||||
}
|
}
|
||||||
|
|
||||||
Text(text = "Import failed\n$message", textAlign = TextAlign.Center)
|
Text(text = "Import failed\n$message", textAlign = TextAlign.Center)
|
||||||
|
|
|
@ -184,6 +184,7 @@ sealed interface ImportResult {
|
||||||
object NoKeysFound : Type
|
object NoKeysFound : Type
|
||||||
object UnexpectedDecryptionOutput : Type
|
object UnexpectedDecryptionOutput : Type
|
||||||
object UnableToOpenFile : Type
|
object UnableToOpenFile : Type
|
||||||
|
object InvalidFile : Type
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,21 +86,27 @@ class RoomKeyImporter(
|
||||||
val line = it.joinToString(separator = "").replace("\n", "")
|
val line = it.joinToString(separator = "").replace("\n", "")
|
||||||
val toByteArray = base64.decode(line)
|
val toByteArray = base64.decode(line)
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
decryptCipher.initialize(toByteArray, password)
|
toByteArray.ensureHasCipherPayloadOrThrow()
|
||||||
toByteArray
|
val initializer = toByteArray.copyOfRange(0, 37)
|
||||||
.copyOfRange(37, toByteArray.size)
|
decryptCipher.initialize(initializer, password)
|
||||||
.decrypt(decryptCipher)
|
val content = toByteArray.copyOfRange(37, toByteArray.size)
|
||||||
.also {
|
content.decrypt(decryptCipher).also {
|
||||||
if (!it.startsWith("[{")) {
|
if (!it.startsWith("[{")) {
|
||||||
throw ImportException(ImportResult.Error.Type.UnexpectedDecryptionOutput)
|
throw ImportException(ImportResult.Error.Type.UnexpectedDecryptionOutput)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
toByteArray.decrypt(decryptCipher)
|
toByteArray.decrypt(decryptCipher)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ByteArray.ensureHasCipherPayloadOrThrow() {
|
||||||
|
if (this.size < 37) {
|
||||||
|
throw ImportException(ImportResult.Error.Type.InvalidFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun Cipher.initialize(payload: ByteArray, passphrase: String) {
|
private fun Cipher.initialize(payload: ByteArray, passphrase: String) {
|
||||||
val salt = payload.copyOfRange(1, 1 + 16)
|
val salt = payload.copyOfRange(1, 1 + 16)
|
||||||
val iv = payload.copyOfRange(17, 17 + 16)
|
val iv = payload.copyOfRange(17, 17 + 16)
|
||||||
|
@ -176,6 +182,7 @@ private class JsonAccumulator {
|
||||||
jsonSegment = withLatest
|
jsonSegment = withLatest
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
val string = withLatest.substring(objectRange)
|
val string = withLatest.substring(objectRange)
|
||||||
importJson.decodeFromString(ElementMegolmExportObject.serializer(), string).also {
|
importJson.decodeFromString(ElementMegolmExportObject.serializer(), string).also {
|
||||||
|
@ -200,6 +207,7 @@ private class JsonAccumulator {
|
||||||
}
|
}
|
||||||
opens++
|
opens++
|
||||||
}
|
}
|
||||||
|
|
||||||
c == '}' -> {
|
c == '}' -> {
|
||||||
opens--
|
opens--
|
||||||
if (opens == 0) {
|
if (opens == 0) {
|
||||||
|
|
Loading…
Reference in New Issue