diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/verification/SasVerificationTransaction.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/verification/SasVerificationTransaction.kt index da546be68f..2922d98a62 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/verification/SasVerificationTransaction.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/verification/SasVerificationTransaction.kt @@ -32,5 +32,7 @@ interface SasVerificationTransaction : VerificationTransaction { */ fun userHasVerifiedShortCode() + fun acceptVerification() + fun shortCodeDoesNotMatch() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustSasVerification.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustSasVerification.kt index df6cb2de52..63e2e0f3a4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustSasVerification.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustSasVerification.kt @@ -40,7 +40,7 @@ internal class SasVerification( private var inner: Sas, private val sender: RequestSender, private val listeners: ArrayList, - ) : +) : SasVerificationTransaction { private val uiHandler = Handler(Looper.getMainLooper()) @@ -58,10 +58,11 @@ internal class SasVerification( private fun refreshData() { when (val verification = this.machine.getVerification(this.inner.otherUserId, this.inner.flowId)) { - is Verification.SasV1 -> { + is Verification.SasV1 -> { this.inner = verification.sas } - else -> {} + else -> { + } } return @@ -73,7 +74,8 @@ internal class SasVerification( override var otherDeviceId: String? get() = this.inner.otherDeviceId @Suppress("UNUSED_PARAMETER") - set(value) {} + set(value) { + } override val otherUserId: String = this.inner.otherUserId @@ -81,21 +83,21 @@ internal class SasVerification( get() { refreshData() return when { - this.inner.isDone -> VerificationTxState.Verified - this.inner.haveWeConfirmed -> VerificationTxState.ShortCodeAccepted - this.inner.canBePresented -> VerificationTxState.ShortCodeReady - this.inner.isCancelled -> { + this.inner.isCancelled -> { val cancelCode = safeValueOf(this.inner.cancelCode) val byMe = this.inner.cancelledByUs ?: false VerificationTxState.Cancelled(cancelCode, byMe) } - else -> { - VerificationTxState.Started - } + this.inner.isDone -> VerificationTxState.Verified + this.inner.haveWeConfirmed -> VerificationTxState.ShortCodeAccepted + this.inner.canBePresented -> VerificationTxState.ShortCodeReady + this.inner.hasBeenAccepted -> VerificationTxState.Accepted + else -> VerificationTxState.OnStarted } } @Suppress("UNUSED_PARAMETER") - set(v) {} + set(v) { + } override val transactionId: String get() = this.inner.flowId @@ -132,6 +134,10 @@ internal class SasVerification( sendRequest(request) } + override fun acceptVerification() { + runBlocking { accept() } + } + suspend fun accept() { val request = this.machine.acceptSasVerification(this.inner.otherUserId, inner.flowId) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/VerificationRequest.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/VerificationRequest.kt index c5d3a19cc7..ac3058b592 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/VerificationRequest.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/VerificationRequest.kt @@ -33,9 +33,7 @@ import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_REC import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_SAS import timber.log.Timber import uniffi.olm.OlmMachine -import uniffi.olm.OutgoingVerificationRequest import uniffi.olm.Sas -import uniffi.olm.StartSasResult import uniffi.olm.VerificationRequest internal class VerificationRequest( diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultIncomingSASDefaultVerificationTransaction.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultIncomingSASDefaultVerificationTransaction.kt index fde9f70e7b..e061976618 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultIncomingSASDefaultVerificationTransaction.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultIncomingSASDefaultVerificationTransaction.kt @@ -82,6 +82,10 @@ internal class DefaultIncomingSASDefaultVerificationTransaction( } } + override fun acceptVerification() { + this.performAccept() + } + override fun onVerificationStart(startReq: ValidVerificationInfoStart.SasVerificationInfoStart) { Timber.v("## SAS I: received verification request from state $state") if (state != VerificationTxState.None) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultOutgoingSASDefaultVerificationTransaction.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultOutgoingSASDefaultVerificationTransaction.kt index 1a41f89006..d8568b0a96 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultOutgoingSASDefaultVerificationTransaction.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultOutgoingSASDefaultVerificationTransaction.kt @@ -85,6 +85,10 @@ internal class DefaultOutgoingSASDefaultVerificationTransaction( cancel(CancelCode.UnexpectedMessage) } + override fun acceptVerification() { + return + } + fun start() { if (state != VerificationTxState.None) { Timber.e("## SAS O: start verification from invalid state") diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/RustVerificationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/RustVerificationService.kt index 41a0972b7a..b39022589c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/RustVerificationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/RustVerificationService.kt @@ -103,10 +103,11 @@ constructor( } override fun markedLocallyAsManuallyVerified(userId: String, deviceID: String) { + // TODO this doesn't seem to be used anymore? runBlocking { olmMachine.markDeviceAsTrusted(userId, deviceID) } } - fun onEvent(event: Event) = when (event.getClearType()) { + suspend fun onEvent(event: Event) = when (event.getClearType()) { // TODO most of those methods do the same, we just need to get the // flow id and the sender from the event, can we add a generic method for this? EventType.KEY_VERIFICATION_START -> onStart(event) @@ -133,12 +134,36 @@ constructor( this.getVerificationRequest(sender, flowId)?.dispatchRequestUpdated() getAndDispatch(sender, flowId) } - private fun onStart(event: Event) { + + private suspend fun onStart(event: Event) { val content = event.getClearContent().toModel() ?: return val flowId = content.transactionId ?: return val sender = event.senderId ?: return - getAndDispatch(sender, flowId) + val verification = this.getExistingTransaction(sender, flowId) ?: return + val request = this.getVerificationRequest(sender, flowId) + + if (request != null && request.isReady()) { + // If this is a SAS verification originating from a `m.key.verification.request` + // event we auto-accept here considering that we either initiated the request or + // accepted the request, otherwise it's a QR code verification, just dispatch an update. + if (verification is SasVerification) { + // Accept dispatches an update, no need to do it twice. + verification.accept() + } else { + dispatchTxUpdated(verification) + } + } else { + Timber.d("HELLOOOOO DISPATCHING NEW VERIFICATIONO $verification") + // This didn't originate from a request, so tell our listeners that + // this is a new verification. + dispatchTxAdded(verification) + // The IncomingVerificationRequestHandler seems to only listen to updates + // so let's trigger an update after the addition as well. + dispatchTxUpdated(verification) + } + + } private fun onDone(event: Event) { @@ -292,7 +317,7 @@ constructor( ): Boolean { Timber.e("## TRYING TO READY PENDING ROOM VERIFICATION") // TODO do the same as readyPendingVerification - return true + TODO() } private fun getVerificationRequest(otherUserId: String, transactionId: String): VerificationRequest? { diff --git a/rust-sdk/Cargo.toml b/rust-sdk/Cargo.toml index 0a910616cb..963eec3424 100644 --- a/rust-sdk/Cargo.toml +++ b/rust-sdk/Cargo.toml @@ -25,11 +25,11 @@ features = ["lax_deserialize"] [dependencies.matrix-sdk-common] git = "https://github.com/matrix-org/matrix-rust-sdk/" -rev = "59a07da99e76a162b71b026ed244fb0cbc39f0c9" +rev = "d2e4b3f3bbcdc139560cdacbdf62dedab6f156b9" [dependencies.matrix-sdk-crypto] git = "https://github.com/matrix-org/matrix-rust-sdk/" -rev = "59a07da99e76a162b71b026ed244fb0cbc39f0c9" +rev = "d2e4b3f3bbcdc139560cdacbdf62dedab6f156b9" features = ["sled_cryptostore"] [dependencies.tokio] diff --git a/rust-sdk/src/machine.rs b/rust-sdk/src/machine.rs index 8affeeca3f..7deb409c45 100644 --- a/rust-sdk/src/machine.rs +++ b/rust-sdk/src/machine.rs @@ -63,6 +63,7 @@ pub struct Sas { pub is_done: bool, pub cancel_code: Option, pub cancelled_by_us: Option, + pub has_been_accepted: bool, pub we_started: bool, pub can_be_presented: bool, pub supports_emoji: bool, @@ -122,6 +123,7 @@ impl From for Sas { we_started: sas.we_started(), room_id: sas.room_id().map(|r| r.to_string()), cancelled_by_us: sas.cancelled_by_us(), + has_been_accepted: sas.has_been_accepted(), } } } diff --git a/rust-sdk/src/olm.udl b/rust-sdk/src/olm.udl index 2acb35bb23..d3297b84c5 100644 --- a/rust-sdk/src/olm.udl +++ b/rust-sdk/src/olm.udl @@ -78,6 +78,7 @@ dictionary Sas { string? room_id; boolean we_started; boolean? cancelled_by_us; + boolean has_been_accepted; boolean have_we_confirmed; boolean is_done; boolean is_cancelled; diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt index 8e21412715..f38dcb6a4e 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt @@ -41,7 +41,6 @@ import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NA import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME import org.matrix.android.sdk.api.session.crypto.verification.CancelCode -import org.matrix.android.sdk.api.session.crypto.verification.IncomingSasVerificationTransaction import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest import org.matrix.android.sdk.api.session.crypto.verification.QrCodeVerificationTransaction import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTransaction @@ -466,11 +465,18 @@ class VerificationBottomSheetViewModel @AssistedInject constructor( // is this an incoming with that user if (tx.isIncoming && tx.otherUserId == state.otherUserMxItem?.id) { // Also auto accept incoming if needed! + // TODO is state.transactionId ever null for self verifications, doesn't seem + // like this will ever trigger + if (tx is SasVerificationTransaction && tx.state == VerificationTxState.OnStarted) { + tx.acceptVerification() + } + /* if (tx is IncomingSasVerificationTransaction) { if (tx.uxState == IncomingSasVerificationTransaction.UxState.SHOW_ACCEPT) { tx.performAccept() } } + */ // Use this one! setState { copy( diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt index 01290a57ea..2b2128d67e 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt @@ -85,7 +85,7 @@ import im.vector.app.features.terms.ReviewTermsActivity import im.vector.app.features.widgets.WidgetActivity import im.vector.app.features.widgets.WidgetArgsBuilder import im.vector.app.space -import org.matrix.android.sdk.api.session.crypto.verification.IncomingSasVerificationTransaction +import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTransaction import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoom import org.matrix.android.sdk.api.session.terms.TermsService import org.matrix.android.sdk.api.session.widgets.model.Widget @@ -159,7 +159,10 @@ class DefaultNavigator @Inject constructor( val session = sessionHolder.getSafeActiveSession() ?: return val tx = session.cryptoService().verificationService().getExistingTransaction(otherUserId, sasTransactionId) ?: return - (tx as? IncomingSasVerificationTransaction)?.performAccept() + if (tx is SasVerificationTransaction && tx.isIncoming) { + tx.acceptVerification() + } + if (context is AppCompatActivity) { VerificationBottomSheet.withArgs( roomId = null,