From 73f0132d5dd073ae7d1b307ba0859439b41cf0ad Mon Sep 17 00:00:00 2001
From: Valere <valeref@matrix.org>
Date: Tue, 10 Dec 2019 16:37:54 +0100
Subject: [PATCH] FIx / room transport was not updating state

---
 .../DefaultSasVerificationService.kt          | 10 ++++-----
 .../verification/SasTransportRoomMessage.kt   | 22 +++++++++++++++----
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultSasVerificationService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultSasVerificationService.kt
index d7e01c2fde..d54ae3a22a 100644
--- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultSasVerificationService.kt
+++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultSasVerificationService.kt
@@ -206,7 +206,7 @@ internal class DefaultSasVerificationService @Inject constructor(
             Timber.e("## received invalid verification request")
             if (startReq.transactionID != null) {
                 sasTransportRoomMessageFactory.createTransport(event.roomId
-                        ?: "", cryptoService).cancelTransaction(
+                        ?: "", cryptoService, null).cancelTransaction(
                         startReq.transactionID ?: "",
                         otherUserId!!,
                         startReq.fromDevice ?: event.getSenderKey()!!,
@@ -218,10 +218,10 @@ internal class DefaultSasVerificationService @Inject constructor(
 
         handleStart(otherUserId, startReq as VerificationInfoStart) {
             it.transport = sasTransportRoomMessageFactory.createTransport(event.roomId
-                    ?: "", cryptoService)
+                    ?: "", cryptoService, it)
         }?.let {
             sasTransportRoomMessageFactory.createTransport(event.roomId
-                    ?: "", cryptoService).cancelTransaction(
+                    ?: "", cryptoService, null).cancelTransaction(
                     startReq.transactionID ?: "",
                     otherUserId!!,
                     startReq.fromDevice ?: event.getSenderKey()!!,
@@ -431,7 +431,7 @@ internal class DefaultSasVerificationService @Inject constructor(
         val otherUserId = event.senderId!!
         val existing = getExistingTransaction(otherUserId, keyReq.transactionID!!)
         if (existing == null) {
-            Timber.e("##  SAS Received invalid accept request")
+            Timber.e("##  SAS Received invalid key request")
             return
         }
         if (existing is SASVerificationTransaction) {
@@ -572,7 +572,7 @@ internal class DefaultSasVerificationService @Inject constructor(
                     transactionId,
                     otherUserId,
                     otherDeviceId)
-            tx.transport = sasTransportRoomMessageFactory.createTransport(roomId, cryptoService)
+            tx.transport = sasTransportRoomMessageFactory.createTransport(roomId, cryptoService, tx)
             addTransaction(tx)
 
             tx.start()
diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransportRoomMessage.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransportRoomMessage.kt
index fc131764af..8e956fd60e 100644
--- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransportRoomMessage.kt
+++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransportRoomMessage.kt
@@ -36,7 +36,7 @@ import javax.inject.Inject
 internal class SasTransportRoomMessage(
         private val roomId: String,
         private val cryptoService: CryptoService,
-//        private val tx: SASVerificationTransaction?,
+        private val tx: SASVerificationTransaction?,
         private val sendVerificationMessageTask: SendVerificationMessageTask,
         private val taskExecutor: TaskExecutor
 ) : SasTransport {
@@ -57,6 +57,20 @@ internal class SasTransportRoomMessage(
                 )
         ) {
             constraints = TaskConstraints(true)
+            callback = object : MatrixCallback<SendResponse> {
+                override fun onSuccess(data: SendResponse) {
+                    if (onDone != null) {
+                        onDone()
+                    } else {
+                        tx?.state = nextState
+                    }
+                }
+
+                override fun onFailure(failure: Throwable) {
+                    Timber.e("## SAS verification [${tx?.transactionId}] failed to send toDevice in state : ${tx?.state}")
+                    tx?.cancel(onErrorReason)
+                }
+            }
             retryCount = 3
         }
                 .executeBy(taskExecutor)
@@ -153,9 +167,9 @@ internal class SasTransportRoomMessageFactory @Inject constructor(
         private val taskExecutor: TaskExecutor) {
 
     fun createTransport(roomId: String,
-                        cryptoService: CryptoService
-//                        tx: SASVerificationTransaction?
+                        cryptoService: CryptoService,
+                        tx: SASVerificationTransaction?
     ): SasTransportRoomMessage {
-        return SasTransportRoomMessage(roomId, cryptoService, /*tx,*/ sendVerificationMessageTask, taskExecutor)
+        return SasTransportRoomMessage(roomId, cryptoService, tx, sendVerificationMessageTask, taskExecutor)
     }
 }