diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/crosssigning/CrossSigningService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/crosssigning/CrossSigningService.kt index df8265a051..edc9c3b2dc 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/crosssigning/CrossSigningService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/crosssigning/CrossSigningService.kt @@ -17,7 +17,6 @@ package org.matrix.android.sdk.api.session.crypto.crosssigning import kotlinx.coroutines.flow.Flow -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.api.util.Optional @@ -92,8 +91,7 @@ interface CrossSigningService { fun allPrivateKeysKnown(): Boolean /** Mark a user identity as trusted and sign and upload signatures of our user-signing key to the server */ - suspend fun trustUser(otherUserId: String, - callback: MatrixCallback) + suspend fun trustUser(otherUserId: String) /** Mark our own master key as trusted */ suspend fun markMyMasterKeyAsTrusted() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt index 0c77b574e7..d33e318cc3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt @@ -91,6 +91,7 @@ object EventType { const val SEND_SECRET = "m.secret.send" // Interactive key verification + const val KEY_VERIFICATION_REQUEST = "m.key.verification.request" const val KEY_VERIFICATION_START = "m.key.verification.start" const val KEY_VERIFICATION_ACCEPT = "m.key.verification.accept" const val KEY_VERIFICATION_KEY = "m.key.verification.key" diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageType.kt index 2a6138ae60..f4eb4b21a6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageType.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageType.kt @@ -16,6 +16,8 @@ package org.matrix.android.sdk.api.session.room.model.message +import org.matrix.android.sdk.api.session.events.model.EventType + object MessageType { const val MSGTYPE_TEXT = "m.text" const val MSGTYPE_EMOTE = "m.emote" @@ -26,7 +28,7 @@ object MessageType { const val MSGTYPE_LOCATION = "m.location" const val MSGTYPE_FILE = "m.file" - const val MSGTYPE_VERIFICATION_REQUEST = "m.key.verification.request" + const val MSGTYPE_VERIFICATION_REQUEST = EventType.KEY_VERIFICATION_REQUEST // Add, in local, a fake message type in order to StickerMessage can inherit Message class // Because sticker isn't a message type but a event type without msgtype field diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCrossSigningService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCrossSigningService.kt index 07b34ca1c2..992782f3a7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCrossSigningService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCrossSigningService.kt @@ -146,22 +146,20 @@ internal class RustCrossSigningService @Inject constructor( } /** Mark a user identity as trusted and sign and upload signatures of our user-signing key to the server */ - override suspend fun trustUser(otherUserId: String, callback: MatrixCallback) { + override suspend fun trustUser(otherUserId: String) { // This is only used in a test val userIdentity = olmMachine.getIdentity(otherUserId) - if (userIdentity != null) { userIdentity.verify() - callback.onSuccess(Unit) } else { - callback.onFailure(Throwable("## CrossSigning - CrossSigning is not setup for this account")) + throw Throwable("## CrossSigning - CrossSigning is not setup for this account") } } /** Mark our own master key as trusted */ override suspend fun markMyMasterKeyAsTrusted() { // This doesn't seem to be used? - trustUser(olmMachine.userId(), NoOpMatrixCallback()) + trustUser(olmMachine.userId()) } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendVerificationMessageTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendVerificationMessageTask.kt index c4a6ba27d6..7f782818c0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendVerificationMessageTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendVerificationMessageTask.kt @@ -67,7 +67,6 @@ internal class DefaultSendVerificationMessageTask @Inject constructor( return encryptEventTask.execute(EncryptEventTask.Params( params.event.roomId ?: "", params.event, - listOf("m.relates_to") )) } catch (throwable: Throwable) { // We said it's ok to send verification request in clear 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 01087dfaed..8ef383f193 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 @@ -25,6 +25,7 @@ import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransa import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.model.message.MessageRelationContent import org.matrix.android.sdk.api.session.room.model.message.MessageType import org.matrix.android.sdk.internal.crypto.OlmMachineProvider @@ -76,7 +77,7 @@ internal class RustVerificationService @Inject constructor(private val olmMachin olmMachineProvider.olmMachine } - private val dispatcher = UpdateDispatcher(this.olmMachine.verificationListeners) + private val dispatcher = UpdateDispatcher(olmMachine.verificationListeners) /** The main entry point for the verification service * @@ -89,18 +90,22 @@ internal class RustVerificationService @Inject constructor(private val olmMachin * dispatches updates to our listeners. */ internal suspend fun onEvent(event: Event) = when (event.getClearType()) { - // I'm not entirely sure why getClearType() returns a msgtype in one case - // and a event type in the other case, but this is how the old verification - // service did things and it does seem to work. - MessageType.MSGTYPE_VERIFICATION_REQUEST -> onRequest(event) - EventType.KEY_VERIFICATION_START -> onStart(event) + EventType.KEY_VERIFICATION_REQUEST -> onRequest(event, fromRoomMessage = false) + EventType.KEY_VERIFICATION_START -> onStart(event) EventType.KEY_VERIFICATION_READY, EventType.KEY_VERIFICATION_ACCEPT, EventType.KEY_VERIFICATION_KEY, EventType.KEY_VERIFICATION_MAC, EventType.KEY_VERIFICATION_CANCEL, - EventType.KEY_VERIFICATION_DONE -> onUpdate(event) - else -> { + EventType.KEY_VERIFICATION_DONE -> onUpdate(event) + EventType.MESSAGE -> onRoomMessage(event) + else -> Unit + } + + private fun onRoomMessage(event: Event) { + val messageContent = event.getClearContent()?.toModel() ?: return + if (messageContent.msgType == MessageType.MSGTYPE_VERIFICATION_REQUEST) { + onRequest(event, fromRoomMessage = true) } } @@ -109,9 +114,9 @@ internal class RustVerificationService @Inject constructor(private val olmMachin val sender = event.senderId ?: return val flowId = getFlowId(event) ?: return - this.olmMachine.getVerificationRequest(sender, flowId)?.dispatchRequestUpdated() - val verification = this.getExistingTransaction(sender, flowId) ?: return - this.dispatcher.dispatchTxUpdated(verification) + olmMachine.getVerificationRequest(sender, flowId)?.dispatchRequestUpdated() + val verification = getExistingTransaction(sender, flowId) ?: return + dispatcher.dispatchTxUpdated(verification) } /** Check if the start event created new verification objects and dispatch updates */ @@ -119,8 +124,8 @@ internal class RustVerificationService @Inject constructor(private val olmMachin val sender = event.senderId ?: return val flowId = getFlowId(event) ?: return - val verification = this.getExistingTransaction(sender, flowId) ?: return - val request = this.olmMachine.getVerificationRequest(sender, flowId) + val verification = getExistingTransaction(sender, flowId) ?: return + val request = olmMachine.getVerificationRequest(sender, flowId) if (request != null && request.isReady()) { // If this is a SAS verification originating from a `m.key.verification.request` @@ -131,34 +136,37 @@ internal class RustVerificationService @Inject constructor(private val olmMachin Timber.d("## Verification: Auto accepting SAS verification with $sender") verification.accept() } else { - this.dispatcher.dispatchTxUpdated(verification) + dispatcher.dispatchTxUpdated(verification) } } else { // This didn't originate from a request, so tell our listeners that // this is a new verification. - this.dispatcher.dispatchTxAdded(verification) + dispatcher.dispatchTxAdded(verification) // The IncomingVerificationRequestHandler seems to only listen to updates // so let's trigger an update after the addition as well. - this.dispatcher.dispatchTxUpdated(verification) + dispatcher.dispatchTxUpdated(verification) } } /** Check if the request event created a nev verification request object and dispatch that it dis so */ - private fun onRequest(event: Event) { - val flowId = getFlowId(event) ?: return + private fun onRequest(event: Event, fromRoomMessage: Boolean) { + val flowId = if (fromRoomMessage) { + event.eventId + } else { + event.getClearContent().toModel()?.transactionId + } ?: return val sender = event.senderId ?: return + val request = getExistingVerificationRequest(sender, flowId) ?: return - val request = this.getExistingVerificationRequest(sender, flowId) ?: return - - this.dispatcher.dispatchRequestAdded(request) + dispatcher.dispatchRequestAdded(request) } override fun addListener(listener: VerificationService.Listener) { - this.dispatcher.addListener(listener) + dispatcher.addListener(listener) } override fun removeListener(listener: VerificationService.Listener) { - this.dispatcher.removeListener(listener) + dispatcher.removeListener(listener) } override suspend fun markedLocallyAsManuallyVerified(userId: String, deviceID: String) { @@ -175,13 +183,13 @@ internal class RustVerificationService @Inject constructor(private val olmMachin otherUserId: String, tid: String, ): VerificationTransaction? { - return this.olmMachine.getVerification(otherUserId, tid) + return olmMachine.getVerification(otherUserId, tid) } override fun getExistingVerificationRequests( otherUserId: String ): List { - return this.olmMachine.getVerificationRequests(otherUserId).map { + return olmMachine.getVerificationRequests(otherUserId).map { it.toPendingVerificationRequest() } } @@ -191,7 +199,7 @@ internal class RustVerificationService @Inject constructor(private val olmMachin tid: String? ): PendingVerificationRequest? { return if (tid != null) { - this.olmMachine.getVerificationRequest(otherUserId, tid)?.toPendingVerificationRequest() + olmMachine.getVerificationRequest(otherUserId, tid)?.toPendingVerificationRequest() } else { null } @@ -256,8 +264,7 @@ internal class RustVerificationService @Inject constructor(private val olmMachin otherUserId: String, transactionId: String ): Boolean { - val request = this.olmMachine.getVerificationRequest(otherUserId, transactionId) - + val request = olmMachine.getVerificationRequest(otherUserId, transactionId) return if (request != null) { request.acceptWithMethods(methods) @@ -265,7 +272,7 @@ internal class RustVerificationService @Inject constructor(private val olmMachin val qrcode = request.startQrVerification() if (qrcode != null) { - this.dispatcher.dispatchTxAdded(qrcode) + dispatcher.dispatchTxAdded(qrcode) } true @@ -294,7 +301,7 @@ internal class RustVerificationService @Inject constructor(private val olmMachin ): String? { return if (method == VerificationMethod.SAS) { if (transactionId != null) { - val request = this.olmMachine.getVerificationRequest(otherUserId, transactionId) + val request = olmMachine.getVerificationRequest(otherUserId, transactionId) val sas = request?.startSasVerification() @@ -310,7 +317,8 @@ internal class RustVerificationService @Inject constructor(private val olmMachin // be wise do do so as well // DeviceListBottomSheetViewModel triggers this, interestingly the method that // triggers this is called `manuallyVerify()` - val verification = olmMachine.getDevice(otherUserId, otherDeviceId)?.startVerification() + val otherDevice = olmMachine.getDevice(otherUserId, otherDeviceId) + val verification = otherDevice?.startVerification() if (verification != null) { dispatcher.dispatchTxAdded(verification) verification.transactionId @@ -338,7 +346,7 @@ internal class RustVerificationService @Inject constructor(private val olmMachin override suspend fun cancelVerificationRequest(request: PendingVerificationRequest) { val verificationRequest = request.transactionId?.let { - this.olmMachine.getVerificationRequest(request.otherUserId, it) + olmMachine.getVerificationRequest(request.otherUserId, it) } verificationRequest?.cancel() } @@ -348,7 +356,7 @@ internal class RustVerificationService @Inject constructor(private val olmMachin transactionId: String, roomId: String ) { - val verificationRequest = this.olmMachine.getVerificationRequest(otherUserId, transactionId) + val verificationRequest = olmMachine.getVerificationRequest(otherUserId, transactionId) verificationRequest?.cancel() } }