From bf28f14b8b3a75d8d787df5a63b5115e8423d508 Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 2 Jan 2020 16:12:20 +0100 Subject: [PATCH] Fix / Decline request was not implemented --- .../crypto/sas/SasVerificationService.kt | 2 ++ .../DefaultSasVerificationService.kt | 21 +++++++++++++++++++ .../PendingVerificationRequest.kt | 2 ++ .../verification/VerificationBottomSheet.kt | 6 +++++- .../home/room/detail/RoomDetailAction.kt | 2 +- .../home/room/detail/RoomDetailViewModel.kt | 17 ++++++--------- .../timeline/item/VerificationRequestItem.kt | 2 +- 7 files changed, 38 insertions(+), 14 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/sas/SasVerificationService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/sas/SasVerificationService.kt index fab9351dea..0e35b58a6c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/sas/SasVerificationService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/sas/SasVerificationService.kt @@ -57,6 +57,8 @@ interface SasVerificationService { fun requestKeyVerificationInDMs(userId: String, roomId: String): PendingVerificationRequest + fun declineVerificationRequestInDMs(otherUserId: String, otherDeviceId: String, transactionId: String, roomId: String) + fun beginKeyVerificationInDMs(method: String, transactionId: String, roomId: String, 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 8592e21db3..ee33b96734 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 @@ -704,6 +704,16 @@ internal class DefaultSasVerificationService @Inject constructor( val transport = sasTransportRoomMessageFactory.createTransport(context, credentials.userId, credentials.deviceId ?: "", roomId, null) + // Cancel existing pending requests? + requestsForUser.forEach { existingRequest -> + existingRequest.transactionId?.let { tid -> + if (!existingRequest.isFinished) { + Timber.d("## SAS, cancelling pending requests to start a new one") + transport.cancelTransaction(tid, existingRequest.otherUserId, "", CancelCode.User) + } + } + } + val localID = LocalEcho.createLocalEchoId() val verificationRequest = PendingVerificationRequest( @@ -727,6 +737,17 @@ internal class DefaultSasVerificationService @Inject constructor( return verificationRequest } + override fun declineVerificationRequestInDMs(otherUserId: String, otherDeviceId: String, transactionId: String, roomId: String) { + sasTransportRoomMessageFactory.createTransport(context, credentials.userId, credentials.deviceId + ?: "", roomId, null).cancelTransaction(transactionId, otherUserId, otherDeviceId, CancelCode.User) + + getExistingVerificationRequest(otherUserId, transactionId)?.let { + updatePendingRequest(it.copy( + cancelConclusion = CancelCode.User + )) + } + } + private fun updatePendingRequest(updated: PendingVerificationRequest) { val requestsForUser = pendingRequests[updated.otherUserId] ?: ArrayList().also { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/PendingVerificationRequest.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/PendingVerificationRequest.kt index 74b8c95a80..c416bd3be3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/PendingVerificationRequest.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/PendingVerificationRequest.kt @@ -37,4 +37,6 @@ data class PendingVerificationRequest( val isReady: Boolean = readyInfo != null val isSent: Boolean = transactionId != null + + val isFinished: Boolean = isSuccessful || cancelConclusion != null } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt index f4c4d6bd6e..fe324b430a 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt @@ -146,7 +146,11 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { } // Transaction has not yet started - if (it.pendingRequest == null || !it.pendingRequest.isReady) { + if (it.pendingRequest?.cancelConclusion != null) { + // The request has been declined, we should dismiss + dismiss() + } else if (it.pendingRequest == null || !it.pendingRequest.isReady) { + // We are waiting for other party to reply with ready showFragment(VerificationRequestFragment::class, Bundle().apply { putParcelable(MvRx.KEY_ARG, VerificationArgs(it.otherUserMxItem?.id ?: "")) }) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailAction.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailAction.kt index 013c908f16..768f188d7e 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailAction.kt @@ -65,7 +65,7 @@ sealed class RoomDetailAction : VectorViewModelAction { object ResendAll : RoomDetailAction() data class AcceptVerificationRequest(val transactionId: String, val otherUserId: String, val otherdDeviceId: String) : RoomDetailAction() - data class DeclineVerificationRequest(val transactionId: String) : RoomDetailAction() + data class DeclineVerificationRequest(val transactionId: String, val otherUserId: String, val otherdDeviceId: String) : RoomDetailAction() data class RequestVerification(val userId: String) : RoomDetailAction() } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt index 689e4ba269..ef1b72a402 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt @@ -27,7 +27,6 @@ import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixPatterns -import im.vector.matrix.android.api.failure.Failure import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.isImageMessage @@ -185,7 +184,7 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro is RoomDetailAction.ExitTrackingUnreadMessagesState -> stopTrackingUnreadMessages() is RoomDetailAction.AcceptVerificationRequest -> handleAcceptVerification(action) is RoomDetailAction.DeclineVerificationRequest -> handleDeclineVerification(action) - is RoomDetailAction.RequestVerification -> handleRequestVerification(action) + is RoomDetailAction.RequestVerification -> handleRequestVerification(action) } } @@ -799,18 +798,14 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro session.getSasVerificationService().readyPendingVerificationInDMs(action.otherUserId, room.roomId, action.transactionId) _requestLiveData.postValue(LiveEvent(Success(action))) -// session.getSasVerificationService().beginKeyVerificationInDMs( -// KeyVerificationStart.VERIF_METHOD_SAS, -// action.transactionId, -// room.roomId, -// action.otherUserMxItem, -// action.otherdDeviceId, -// null -// ) } private fun handleDeclineVerification(action: RoomDetailAction.DeclineVerificationRequest) { - Timber.e("TODO implement $action") + session.getSasVerificationService().declineVerificationRequestInDMs( + action.otherUserId, + action.otherdDeviceId, + action.transactionId, + room.roomId) } private fun handleRequestVerification(action: RoomDetailAction.RequestVerification) { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/VerificationRequestItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/VerificationRequestItem.kt index d00e90760a..3022c7974a 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/VerificationRequestItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/VerificationRequestItem.kt @@ -137,7 +137,7 @@ abstract class VerificationRequestItem : AbsBaseMessageItem