diff --git a/CHANGES.md b/CHANGES.md index 1200be4a12..589972edc1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,7 @@ Improvements 🙌: Bugfix 🐛: - Regression | Share action menu do not work (#1647) + - verification issues on transition (#1555) Translations 🗣: - diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultVerificationService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultVerificationService.kt index 1b50d3caa1..4d4eeb21fd 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultVerificationService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultVerificationService.kt @@ -1234,7 +1234,7 @@ internal class DefaultVerificationService @Inject constructor( ) // We can SCAN or SHOW QR codes only if cross-signing is enabled - val methodValues = if (crossSigningService.isCrossSigningVerified()) { + val methodValues = if (crossSigningService.isCrossSigningInitialized()) { // Add reciprocate method if application declares it can scan or show QR codes // Not sure if it ok to do that (?) val reciprocateMethod = methods 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 7a3d38f649..cd9fed108b 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 @@ -250,7 +250,10 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { is VerificationTxState.Started, is VerificationTxState.WaitingOtherReciprocateConfirm -> { showFragment(VerificationQRWaitingFragment::class, Bundle().apply { - putParcelable(MvRx.KEY_ARG, VerificationQRWaitingFragment.Args(state.isMe, state.otherUserMxItem?.getBestName() ?: "")) + putParcelable(MvRx.KEY_ARG, VerificationQRWaitingFragment.Args( + isMe = state.isMe, + otherUserName = state.otherUserMxItem?.getBestName() ?: "" + )) }) return@withState } @@ -353,6 +356,17 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { } } } + fun forSelfVerification(session: Session, outgoingRequest: String): VerificationBottomSheet { + return VerificationBottomSheet().apply { + arguments = Bundle().apply { + putParcelable(MvRx.KEY_ARG, VerificationArgs( + otherUserId = session.myUserId, + selfVerificationMode = true, + verificationId = outgoingRequest + )) + } + } + } const val WAITING_SELF_VERIF_TAG: String = "WAITING_SELF_VERIF_TAG" } diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt index 8d5fc5f564..2723740996 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt @@ -177,7 +177,11 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet R.string.crosssigning_verify_this_session, R.string.confirm_your_identity ) { - it.navigator.waitSessionVerification(it) + if (event.waitForIncomingRequest) { + it.navigator.waitSessionVerification(it) + } else { + it.navigator.requestSelfSessionVerification(it) + } } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActivityViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActivityViewEvents.kt index 2f1d8b2705..1cdabe824c 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeActivityViewEvents.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActivityViewEvents.kt @@ -21,5 +21,5 @@ import im.vector.riotx.core.platform.VectorViewEvents sealed class HomeActivityViewEvents : VectorViewEvents { data class AskPasswordToInitCrossSigning(val userItem: MatrixItem.UserItem?) : HomeActivityViewEvents() - data class OnNewSession(val userItem: MatrixItem.UserItem?) : HomeActivityViewEvents() + data class OnNewSession(val userItem: MatrixItem.UserItem?, val waitForIncomingRequest: Boolean = true) : HomeActivityViewEvents() } diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActivityViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActivityViewModel.kt index fdf0936d58..f89bb5a547 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeActivityViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActivityViewModel.kt @@ -130,7 +130,14 @@ class HomeActivityViewModel @AssistedInject constructor( // Cross-signing is already set up for this user, is it trusted? if (!mxCrossSigningInfo.isTrusted()) { // New session - _viewEvents.post(HomeActivityViewEvents.OnNewSession(session.getUser(session.myUserId)?.toMatrixItem())) + _viewEvents.post( + HomeActivityViewEvents.OnNewSession( + session.getUser(session.myUserId)?.toMatrixItem(), + // If it's an old unverified, we should send requests + // instead of waiting for an incoming one + reAuthHelper.data != null + ) + ) } } else { // Initialize cross-signing diff --git a/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt index 0b89ab8ec4..83f0baa12c 100644 --- a/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt @@ -116,6 +116,27 @@ class DefaultNavigator @Inject constructor( } } + override fun requestSelfSessionVerification(context: Context) { + val session = sessionHolder.getSafeActiveSession() ?: return + val otherSessions = session.cryptoService() + .getCryptoDeviceInfo(session.myUserId) + .filter { it.deviceId != session.sessionParams.deviceId } + .map { it.deviceId } + if (context is VectorBaseActivity) { + if (otherSessions.isNotEmpty()) { + val pr = session.cryptoService().verificationService().requestKeyVerification( + supportedVerificationMethodsProvider.provide(), + session.myUserId, + otherSessions) + VerificationBottomSheet.forSelfVerification(session, pr.transactionId ?: pr.localId) + .show(context.supportFragmentManager, VerificationBottomSheet.WAITING_SELF_VERIF_TAG) + } else { + VerificationBottomSheet.forSelfVerification(session) + .show(context.supportFragmentManager, VerificationBottomSheet.WAITING_SELF_VERIF_TAG) + } + } + } + override fun waitSessionVerification(context: Context) { val session = sessionHolder.getSafeActiveSession() ?: return if (context is VectorBaseActivity) { diff --git a/vector/src/main/java/im/vector/riotx/features/navigation/Navigator.kt b/vector/src/main/java/im/vector/riotx/features/navigation/Navigator.kt index ce4d5ef3ea..3ead483369 100644 --- a/vector/src/main/java/im/vector/riotx/features/navigation/Navigator.kt +++ b/vector/src/main/java/im/vector/riotx/features/navigation/Navigator.kt @@ -40,6 +40,8 @@ interface Navigator { fun requestSessionVerification(context: Context, otherSessionId: String) + fun requestSelfSessionVerification(context: Context) + fun waitSessionVerification(context: Context) fun upgradeSessionSecurity(context: Context, initCrossSigningOnly: Boolean) diff --git a/vector/src/main/java/im/vector/riotx/features/settings/crosssigning/CrossSigningSettingsFragment.kt b/vector/src/main/java/im/vector/riotx/features/settings/crosssigning/CrossSigningSettingsFragment.kt index 37d9677f7f..5778d05d1c 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/crosssigning/CrossSigningSettingsFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/crosssigning/CrossSigningSettingsFragment.kt @@ -51,7 +51,7 @@ class CrossSigningSettingsFragment @Inject constructor( Unit } CrossSigningSettingsViewEvents.VerifySession -> { - navigator.waitSessionVerification(requireActivity()) + navigator.requestSelfSessionVerification(requireActivity()) } CrossSigningSettingsViewEvents.SetUpRecovery -> { navigator.upgradeSessionSecurity(requireActivity(), false)