Cancel verification flow if request sending fails (after retry)
This commit is contained in:
parent
e5ce77de34
commit
87c1d69e26
@ -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) {
|
||||||
requestSender.sendVerificationRequest(result.request)
|
try {
|
||||||
verificationRequestFactory.create(result.verification)
|
requestSender.sendVerificationRequest(result.request)
|
||||||
|
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) {
|
||||||
requestSender.sendVerificationRequest(result.request)
|
try {
|
||||||
sasVerificationFactory.create(result.sas)
|
requestSender.sendVerificationRequest(result.request)
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
dispatchTxUpdated()
|
||||||
if (request != null) {
|
try {
|
||||||
sender.sendVerificationRequest(request)
|
sender.sendVerificationRequest(request)
|
||||||
dispatchTxUpdated()
|
} 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
|
||||||
|
dispatchTxUpdated()
|
||||||
if (request != null) {
|
tryOrNull("Fail to send cancel request") {
|
||||||
sender.sendVerificationRequest(request)
|
sender.sendVerificationRequest(request, retryCount = Int.MAX_VALUE)
|
||||||
dispatchTxUpdated()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
dispatchRequestUpdated()
|
||||||
if (request != null) {
|
tryOrNull("Fail to send cancel request") {
|
||||||
requestSender.sendVerificationRequest(request)
|
requestSender.sendVerificationRequest(request, retryCount = Int.MAX_VALUE)
|
||||||
dispatchRequestUpdated()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
dispatchTxUpdated()
|
||||||
if (request != null) {
|
tryOrNull("Fail to send cancel verification request") {
|
||||||
sender.sendVerificationRequest(request)
|
sender.sendVerificationRequest(request, retryCount = Int.MAX_VALUE)
|
||||||
dispatchTxUpdated()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user