Cancel verification flow if request sending fails (after retry)

This commit is contained in:
ganfra 2022-06-09 10:56:41 +02:00
parent e5ce77de34
commit 87c1d69e26
4 changed files with 68 additions and 46 deletions

View File

@ -24,6 +24,7 @@ import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel
import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
import org.matrix.android.sdk.api.session.crypto.model.UnsignedDeviceInfo import org.matrix.android.sdk.api.session.crypto.model.UnsignedDeviceInfo
import org.matrix.android.sdk.api.session.crypto.verification.CancelCode
import org.matrix.android.sdk.api.session.crypto.verification.VerificationMethod import org.matrix.android.sdk.api.session.crypto.verification.VerificationMethod
import org.matrix.android.sdk.internal.crypto.network.RequestSender import org.matrix.android.sdk.internal.crypto.network.RequestSender
import org.matrix.android.sdk.internal.crypto.verification.SasVerification import org.matrix.android.sdk.internal.crypto.verification.SasVerification
@ -83,8 +84,13 @@ internal class Device @AssistedInject constructor(
innerMachine.requestVerificationWithDevice(innerDevice.userId, innerDevice.deviceId, stringMethods) innerMachine.requestVerificationWithDevice(innerDevice.userId, innerDevice.deviceId, stringMethods)
} }
return if (result != null) { return if (result != null) {
try {
requestSender.sendVerificationRequest(result.request) requestSender.sendVerificationRequest(result.request)
verificationRequestFactory.create(result.verification) verificationRequestFactory.create(result.verification)
} catch (failure: Throwable) {
innerMachine.cancelVerification(result.verification.otherUserId, result.verification.flowId, CancelCode.UserError.value)
null
}
} else { } else {
null null
} }
@ -104,10 +110,14 @@ internal class Device @AssistedInject constructor(
val result = withContext(coroutineDispatchers.io) { val result = withContext(coroutineDispatchers.io) {
innerMachine.startSasWithDevice(innerDevice.userId, innerDevice.deviceId) innerMachine.startSasWithDevice(innerDevice.userId, innerDevice.deviceId)
} }
return if (result != null) { return if (result != null) {
try {
requestSender.sendVerificationRequest(result.request) requestSender.sendVerificationRequest(result.request)
sasVerificationFactory.create(result.sas) sasVerificationFactory.create(result.sas)
}catch (failure: Throwable){
innerMachine.cancelVerification(result.sas.otherUserId, result.sas.flowId, CancelCode.UserError.value)
null
}
} else { } else {
null null
} }
@ -140,9 +150,7 @@ internal class Device @AssistedInject constructor(
val request = withContext(coroutineDispatchers.io) { val request = withContext(coroutineDispatchers.io) {
innerMachine.verifyDevice(innerDevice.userId, innerDevice.deviceId) innerMachine.verifyDevice(innerDevice.userId, innerDevice.deviceId)
} }
requestSender.sendSignatureUpload(request) requestSender.sendSignatureUpload(request)
return true return true
} }

View File

@ -19,8 +19,10 @@ package org.matrix.android.sdk.internal.crypto.verification
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.crypto.verification.CancelCode import org.matrix.android.sdk.api.session.crypto.verification.CancelCode
import org.matrix.android.sdk.api.session.crypto.verification.EmojiRepresentation import org.matrix.android.sdk.api.session.crypto.verification.EmojiRepresentation
import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTransaction import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTransaction
@ -193,11 +195,12 @@ internal class SasVerification @AssistedInject constructor(
} }
internal suspend fun accept() { internal suspend fun accept() {
val request = innerMachine.acceptSasVerification(inner.otherUserId, inner.flowId) val request = innerMachine.acceptSasVerification(inner.otherUserId, inner.flowId) ?: return
if (request != null) {
sender.sendVerificationRequest(request)
dispatchTxUpdated() dispatchTxUpdated()
try {
sender.sendVerificationRequest(request)
} catch (failure: Throwable) {
cancelHelper(CancelCode.UserError)
} }
} }
@ -205,8 +208,10 @@ internal class SasVerification @AssistedInject constructor(
private suspend fun confirm() { private suspend fun confirm() {
val result = withContext(coroutineDispatchers.io) { val result = withContext(coroutineDispatchers.io) {
innerMachine.confirmVerification(inner.otherUserId, inner.flowId) innerMachine.confirmVerification(inner.otherUserId, inner.flowId)
} } ?: return
if (result != null) {
dispatchTxUpdated()
try {
for (verificationRequest in result.requests) { for (verificationRequest in result.requests) {
sender.sendVerificationRequest(verificationRequest) sender.sendVerificationRequest(verificationRequest)
} }
@ -214,16 +219,16 @@ internal class SasVerification @AssistedInject constructor(
if (signatureRequest != null) { if (signatureRequest != null) {
sender.sendSignatureUpload(signatureRequest) sender.sendSignatureUpload(signatureRequest)
} }
dispatchTxUpdated() } catch (failure: Throwable) {
cancelHelper(CancelCode.UserError)
} }
} }
private suspend fun cancelHelper(code: CancelCode) { private suspend fun cancelHelper(code: CancelCode) = withContext(NonCancellable) {
val request = innerMachine.cancelVerification(inner.otherUserId, inner.flowId, code.value) val request = innerMachine.cancelVerification(inner.otherUserId, inner.flowId, code.value) ?: return@withContext
if (request != null) {
sender.sendVerificationRequest(request)
dispatchTxUpdated() dispatchTxUpdated()
tryOrNull("Fail to send cancel request") {
sender.sendVerificationRequest(request, retryCount = Int.MAX_VALUE)
} }
} }

View File

@ -19,8 +19,10 @@ package org.matrix.android.sdk.internal.crypto.verification
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.crypto.verification.CancelCode import org.matrix.android.sdk.api.session.crypto.verification.CancelCode
import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest
import org.matrix.android.sdk.api.session.crypto.verification.ValidVerificationInfoReady import org.matrix.android.sdk.api.session.crypto.verification.ValidVerificationInfoReady
@ -140,11 +142,13 @@ internal class VerificationRequest @AssistedInject constructor(
innerVerificationRequest.otherUserId, innerVerificationRequest.otherUserId,
innerVerificationRequest.flowId, innerVerificationRequest.flowId,
stringMethods stringMethods
) ) ?: return
if (request != null) { try {
requestSender.sendVerificationRequest(request)
dispatchRequestUpdated() dispatchRequestUpdated()
requestSender.sendVerificationRequest(request)
} catch (failure: Throwable) {
cancel(CancelCode.UserError)
} }
} }
@ -163,12 +167,12 @@ internal class VerificationRequest @AssistedInject constructor(
*/ */
internal suspend fun startSasVerification(): SasVerification? { internal suspend fun startSasVerification(): SasVerification? {
return withContext(coroutineDispatchers.io) { return withContext(coroutineDispatchers.io) {
val result = innerOlmMachine.startSasVerification(innerVerificationRequest.otherUserId, innerVerificationRequest.flowId) val result = innerOlmMachine.startSasVerification(innerVerificationRequest.otherUserId, innerVerificationRequest.flowId) ?: return@withContext null
try {
if (result != null) {
requestSender.sendVerificationRequest(result.request) requestSender.sendVerificationRequest(result.request)
sasVerificationFactory.create(result.sas) sasVerificationFactory.create(result.sas)
} else { } catch (failure: Throwable) {
cancel(CancelCode.UserError)
null null
} }
} }
@ -192,8 +196,12 @@ internal class VerificationRequest @AssistedInject constructor(
val byteArray = data.toByteArray(Charsets.ISO_8859_1) val byteArray = data.toByteArray(Charsets.ISO_8859_1)
val encodedData = byteArray.toBase64NoPadding() val encodedData = byteArray.toBase64NoPadding()
val result = innerOlmMachine.scanQrCode(otherUser(), flowId(), encodedData) ?: return null val result = innerOlmMachine.scanQrCode(otherUser(), flowId(), encodedData) ?: return null
try {
requestSender.sendVerificationRequest(result.request) requestSender.sendVerificationRequest(result.request)
} catch (failure: Throwable) {
cancel(CancelCode.UserError)
return null
}
return qrCodeVerificationFactory.create(this, result.qr) return qrCodeVerificationFactory.create(this, result.qr)
} }
@ -233,16 +241,15 @@ internal class VerificationRequest @AssistedInject constructor(
* *
* The method turns into a noop, if the verification flow has already been cancelled. * The method turns into a noop, if the verification flow has already been cancelled.
*/ */
internal suspend fun cancel() { internal suspend fun cancel(cancelCode: CancelCode = CancelCode.User) = withContext(NonCancellable) {
val request = innerOlmMachine.cancelVerification( val request = innerOlmMachine.cancelVerification(
innerVerificationRequest.otherUserId, innerVerificationRequest.otherUserId,
innerVerificationRequest.flowId, innerVerificationRequest.flowId,
CancelCode.User.value cancelCode.value
) ) ?: return@withContext
if (request != null) {
requestSender.sendVerificationRequest(request)
dispatchRequestUpdated() dispatchRequestUpdated()
tryOrNull("Fail to send cancel request") {
requestSender.sendVerificationRequest(request, retryCount = Int.MAX_VALUE)
} }
} }

View File

@ -19,8 +19,10 @@ package org.matrix.android.sdk.internal.crypto.verification.qrcode
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.crypto.verification.CancelCode import org.matrix.android.sdk.api.session.crypto.verification.CancelCode
import org.matrix.android.sdk.api.session.crypto.verification.QrCodeVerificationTransaction import org.matrix.android.sdk.api.session.crypto.verification.QrCodeVerificationTransaction
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState
@ -184,9 +186,9 @@ internal class QrCodeVerification @AssistedInject constructor(
private suspend fun confirm() { private suspend fun confirm() {
val result = withContext(coroutineDispatchers.io) { val result = withContext(coroutineDispatchers.io) {
innerMachine.confirmVerification(request.otherUser(), request.flowId()) innerMachine.confirmVerification(request.otherUser(), request.flowId())
} } ?: return
dispatchTxUpdated()
if (result != null) { try {
for (verificationRequest in result.requests) { for (verificationRequest in result.requests) {
sender.sendVerificationRequest(verificationRequest) sender.sendVerificationRequest(verificationRequest)
} }
@ -194,16 +196,16 @@ internal class QrCodeVerification @AssistedInject constructor(
if (signatureRequest != null) { if (signatureRequest != null) {
sender.sendSignatureUpload(signatureRequest) sender.sendSignatureUpload(signatureRequest)
} }
dispatchTxUpdated() } catch (failure: Throwable) {
cancelHelper(CancelCode.UserError)
} }
} }
private suspend fun cancelHelper(code: CancelCode) { private suspend fun cancelHelper(code: CancelCode) = withContext(NonCancellable) {
val request = innerMachine.cancelVerification(request.otherUser(), request.flowId(), code.value) val request = innerMachine.cancelVerification(request.otherUser(), request.flowId(), code.value) ?: return@withContext
if (request != null) {
sender.sendVerificationRequest(request)
dispatchTxUpdated() dispatchTxUpdated()
tryOrNull("Fail to send cancel verification request") {
sender.sendVerificationRequest(request, retryCount = Int.MAX_VALUE)
} }
} }