Fix / bootstrap crosssigning only was not supported

This commit is contained in:
Valere 2020-06-29 10:22:24 +02:00
parent 6643923981
commit 5c091339f0
2 changed files with 51 additions and 25 deletions

View File

@ -40,12 +40,14 @@ import im.vector.riotx.core.platform.ViewModelTask
import im.vector.riotx.core.platform.WaitingViewData
import im.vector.riotx.core.resources.StringProvider
import timber.log.Timber
import java.lang.IllegalArgumentException
import java.util.UUID
import javax.inject.Inject
sealed class BootstrapResult {
data class Success(val keyInfo: SsssKeyCreationInfo) : BootstrapResult()
object SuccessCrossSigningOnly : BootstrapResult()
abstract class Failure(val error: String?) : BootstrapResult()
@ -67,6 +69,7 @@ interface BootstrapProgressListener {
data class Params(
val userPasswordAuth: UserPasswordAuth? = null,
val initOnlyCrossSigning: Boolean = false,
val progressListener: BootstrapProgressListener? = null,
val passphrase: String?,
val keySpec: SsssKeySpec? = null
@ -94,11 +97,20 @@ class BootstrapCrossSigningTask @Inject constructor(
awaitCallback<Unit> {
crossSigningService.initializeCrossSigning(params.userPasswordAuth, it)
}
if (params.initOnlyCrossSigning) {
return BootstrapResult.SuccessCrossSigningOnly
}
} catch (failure: Throwable) {
return handleInitializeXSigningError(failure)
}
} else {
// not sure how this can happen??
if (params.initOnlyCrossSigning) {
return handleInitializeXSigningError(IllegalArgumentException("Cross signing already setup"))
}
}
val keyInfo: SsssKeyCreationInfo
val ssssService = session.sharedSecretStorageService

View File

@ -68,36 +68,45 @@ class BootstrapSharedViewModel @AssistedInject constructor(
private var _pendingSession: String? = null
init {
// need to check if user have an existing keybackup
setState {
copy(step = BootstrapStep.CheckingMigration)
}
// We need to check if there is an existing backup
viewModelScope.launch(Dispatchers.IO) {
val version = awaitCallback<KeysVersionResult?> {
session.cryptoService().keysBackupService().getCurrentVersion(it)
if (args.initCrossSigningOnly) {
// Go straight to account password
setState {
copy(step = BootstrapStep.AccountPassword(false))
}
if (version == null) {
// we just resume plain bootstrap
doesKeyBackupExist = false
setState {
copy(step = BootstrapStep.FirstForm(keyBackUpExist = doesKeyBackupExist))
} else {
// need to check if user have an existing keybackup
setState {
copy(step = BootstrapStep.CheckingMigration)
}
// We need to check if there is an existing backup
viewModelScope.launch(Dispatchers.IO) {
val version = awaitCallback<KeysVersionResult?> {
session.cryptoService().keysBackupService().getCurrentVersion(it)
}
} else {
// we need to get existing backup passphrase/key and convert to SSSS
val keyVersion = awaitCallback<KeysVersionResult?> {
session.cryptoService().keysBackupService().getVersion(version.version ?: "", it)
}
if (keyVersion == null) {
// strange case... just finish?
_viewEvents.post(BootstrapViewEvents.Dismiss)
} else {
doesKeyBackupExist = true
isBackupCreatedFromPassphrase = keyVersion.getAuthDataAsMegolmBackupAuthData()?.privateKeySalt != null
if (version == null) {
// we just resume plain bootstrap
doesKeyBackupExist = false
setState {
copy(step = BootstrapStep.FirstForm(keyBackUpExist = doesKeyBackupExist))
}
} else {
// we need to get existing backup passphrase/key and convert to SSSS
val keyVersion = awaitCallback<KeysVersionResult?> {
session.cryptoService().keysBackupService().getVersion(version.version ?: "", it)
}
if (keyVersion == null) {
// strange case... just finish?
_viewEvents.post(BootstrapViewEvents.Dismiss)
} else {
doesKeyBackupExist = true
isBackupCreatedFromPassphrase = keyVersion.getAuthDataAsMegolmBackupAuthData()?.privateKeySalt != null
setState {
copy(step = BootstrapStep.FirstForm(keyBackUpExist = doesKeyBackupExist))
}
}
}
}
}
@ -383,12 +392,17 @@ class BootstrapSharedViewModel @AssistedInject constructor(
bootstrapTask.invoke(this,
Params(
userPasswordAuth = userPasswordAuth,
initOnlyCrossSigning = args.initCrossSigningOnly,
progressListener = progressListener,
passphrase = state.passphrase,
keySpec = state.migrationRecoveryKey?.let { extractCurveKeyFromRecoveryKey(it)?.let { RawBytesKeySpec(it) } }
)
) { bootstrapResult ->
when (bootstrapResult) {
is BootstrapResult.SuccessCrossSigningOnly -> {
// TPD
_viewEvents.post(BootstrapViewEvents.Dismiss)
}
is BootstrapResult.Success -> {
setState {
copy(
@ -435,7 +449,7 @@ class BootstrapSharedViewModel @AssistedInject constructor(
}
}
}
}
}.exhaustive
}
}
}