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 3130d857de..a626dd5573 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 @@ -45,22 +45,17 @@ interface SasVerificationService { fun getExistingVerificationRequest(otherUser: String, tid: String?): PendingVerificationRequest? fun getExistingVerificationRequestInRoom(roomId: String, tid: String?): PendingVerificationRequest? - /** - * Shortcut for KeyVerificationStart.VERIF_METHOD_SAS - * @see beginKeyVerification - */ - fun beginKeyVerificationSAS(userId: String, deviceID: String): String? + + fun beginKeyVerification(method: VerificationMethod, userId: String, deviceID: String): String? /** * Request a key verification from another user using toDevice events. */ - fun beginKeyVerification(method: String, userId: String, deviceID: String): String? - - fun requestKeyVerificationInDMs(userId: String, roomId: String): PendingVerificationRequest + fun requestKeyVerificationInDMs(methods: List, userId: String, roomId: String): PendingVerificationRequest fun declineVerificationRequestInDMs(otherUserId: String, otherDeviceId: String, transactionId: String, roomId: String) - fun beginKeyVerificationInDMs(method: String, + fun beginKeyVerificationInDMs(method: VerificationMethod, transactionId: String, roomId: String, otherUserId: String, @@ -68,7 +63,7 @@ interface SasVerificationService { callback: MatrixCallback?): String? /** - * Returns false if the request is unknwown + * Returns false if the request is unknown */ fun readyPendingVerificationInDMs(otherUserId: String, roomId: String, transactionId: String): Boolean @@ -85,14 +80,14 @@ interface SasVerificationService { companion object { - private const val TEN_MINTUTES_IN_MILLIS = 10 * 60 * 1000 - private const val FIVE_MINTUTES_IN_MILLIS = 5 * 60 * 1000 + private const val TEN_MINUTES_IN_MILLIS = 10 * 60 * 1000 + private const val FIVE_MINUTES_IN_MILLIS = 5 * 60 * 1000 fun isValidRequest(age: Long?): Boolean { if (age == null) return false val now = System.currentTimeMillis() - val tooInThePast = now - TEN_MINTUTES_IN_MILLIS - val tooInTheFuture = now + FIVE_MINTUTES_IN_MILLIS + val tooInThePast = now - TEN_MINUTES_IN_MILLIS + val tooInTheFuture = now + FIVE_MINUTES_IN_MILLIS return age in tooInThePast..tooInTheFuture } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/sas/VerificationMethod.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/sas/VerificationMethod.kt new file mode 100644 index 0000000000..a2dd90bc84 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/sas/VerificationMethod.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.matrix.android.api.session.crypto.sas + +/** + * Verification methods supported (or to be supported) by the matrix SDK + */ +enum class VerificationMethod { + SAS, + // Not supported yet + SCAN +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/message/MessageVerificationStartContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/message/MessageVerificationStartContent.kt index a33decc821..dffa4ba3cb 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/message/MessageVerificationStartContent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/message/MessageVerificationStartContent.kt @@ -20,7 +20,7 @@ import com.squareup.moshi.JsonClass import im.vector.matrix.android.api.session.crypto.sas.SasMode import im.vector.matrix.android.api.session.events.model.toContent import im.vector.matrix.android.api.session.room.model.relation.RelationDefaultContent -import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationStart +import im.vector.matrix.android.internal.crypto.model.rest.supportedVerificationMethods import im.vector.matrix.android.internal.crypto.verification.SASVerificationTransaction import im.vector.matrix.android.internal.crypto.verification.VerificationInfoStart import im.vector.matrix.android.internal.util.JsonCanonicalizer @@ -45,12 +45,11 @@ internal data class MessageVerificationStartContent( get() = relatesTo?.eventId override fun isValid(): Boolean { - if ( - (transactionID.isNullOrBlank() - || fromDevice.isNullOrBlank() - || method != KeyVerificationStart.VERIF_METHOD_SAS - || keyAgreementProtocols.isNullOrEmpty() - || hashes.isNullOrEmpty()) + if (transactionID.isNullOrBlank() + || fromDevice.isNullOrBlank() + || method !in supportedVerificationMethods + || keyAgreementProtocols.isNullOrEmpty() + || hashes.isNullOrEmpty() || !hashes.contains("sha256") || messageAuthenticationCodes.isNullOrEmpty() || (!messageAuthenticationCodes.contains(SASVerificationTransaction.SAS_MAC_SHA256) && !messageAuthenticationCodes.contains(SASVerificationTransaction.SAS_MAC_SHA256_LONGKDF)) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationReady.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationReady.kt index ca3b1e0075..84bc73fda0 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationReady.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationReady.kt @@ -25,8 +25,7 @@ import im.vector.matrix.android.internal.crypto.verification.VerificationInfoRea @JsonClass(generateAdapter = true) internal data class KeyVerificationReady( @Json(name = "from_device") override val fromDevice: String?, - // TODO add qr? - @Json(name = "methods") override val methods: List? = listOf(KeyVerificationStart.VERIF_METHOD_SAS), + @Json(name = "methods") override val methods: List?, @Json(name = "transaction_id") override var transactionID: String? = null ) : SendToDeviceObject, VerificationInfoReady { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationRequest.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationRequest.kt index 4511db324a..0af7b45b70 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationRequest.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationRequest.kt @@ -28,7 +28,7 @@ internal data class KeyVerificationRequest( @Json(name = "from_device") val fromDevice: String, /** The verification methods supported by the sender. */ - val methods: List = listOf(KeyVerificationStart.VERIF_METHOD_SAS), + val methods: List, /** * The POSIX timestamp in milliseconds for when the request was made. * If the request is in the future by more than 5 minutes or more than 10 minutes in the past, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationStart.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationStart.kt index e25ed10a6a..fa4ec3acfa 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationStart.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/KeyVerificationStart.kt @@ -27,7 +27,7 @@ import timber.log.Timber * Sent by Alice to initiate an interactive key verification. */ @JsonClass(generateAdapter = true) -data class KeyVerificationStart( +internal data class KeyVerificationStart( @Json(name = "from_device") override val fromDevice: String? = null, override val method: String? = null, @Json(name = "transaction_id") override val transactionID: String? = null, @@ -41,22 +41,18 @@ data class KeyVerificationStart( return JsonCanonicalizer.getCanonicalJson(KeyVerificationStart::class.java, this) } - companion object { - const val VERIF_METHOD_SAS = "m.sas.v1" - const val VERIF_METHOD_SCAN = "m.qr_code.scan.v1" - } - override fun isValid(): Boolean { - if ((transactionID.isNullOrBlank() - || fromDevice.isNullOrBlank() - || method != VERIF_METHOD_SAS - || keyAgreementProtocols.isNullOrEmpty() - || hashes.isNullOrEmpty()) + if (transactionID.isNullOrBlank() + || fromDevice.isNullOrBlank() + || method !in supportedVerificationMethods + || keyAgreementProtocols.isNullOrEmpty() + || hashes.isNullOrEmpty() || !hashes.contains("sha256") || messageAuthenticationCodes.isNullOrEmpty() || (!messageAuthenticationCodes.contains(SASVerificationTransaction.SAS_MAC_SHA256) && !messageAuthenticationCodes.contains(SASVerificationTransaction.SAS_MAC_SHA256_LONGKDF)) - || shortAuthenticationStrings.isNullOrEmpty() || !shortAuthenticationStrings.contains(SasMode.DECIMAL)) { + || shortAuthenticationStrings.isNullOrEmpty() + || !shortAuthenticationStrings.contains(SasMode.DECIMAL)) { Timber.e("## received invalid verification request") return false } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/VerificationMethodValues.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/VerificationMethodValues.kt new file mode 100644 index 0000000000..168a8c8f48 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/model/rest/VerificationMethodValues.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.matrix.android.internal.crypto.model.rest + +import im.vector.matrix.android.api.session.crypto.sas.VerificationMethod + +internal const val VERIFICATION_METHOD_SAS = "m.sas.v1" +internal const val VERIFICATION_METHOD_SCAN = "m.qr_code.scan.v1" + +internal fun VerificationMethod.toValue(): String { + return when (this) { + VerificationMethod.SAS -> VERIFICATION_METHOD_SAS + VerificationMethod.SCAN -> VERIFICATION_METHOD_SCAN + } +} + +// TODO Add SCAN +internal val supportedVerificationMethods = listOf(VERIFICATION_METHOD_SAS) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultOutgoingSASVerificationRequest.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultOutgoingSASVerificationRequest.kt index 5eead70c17..6e6f55b9fb 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultOutgoingSASVerificationRequest.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultOutgoingSASVerificationRequest.kt @@ -19,9 +19,10 @@ import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.session.crypto.sas.CancelCode import im.vector.matrix.android.api.session.crypto.sas.OutgoingSasVerificationRequest import im.vector.matrix.android.api.session.crypto.sas.SasVerificationTxState +import im.vector.matrix.android.api.session.crypto.sas.VerificationMethod import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.internal.crypto.actions.SetDeviceVerificationAction -import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationStart +import im.vector.matrix.android.internal.crypto.model.rest.toValue import im.vector.matrix.android.internal.crypto.store.IMXCryptoStore import timber.log.Timber @@ -71,7 +72,7 @@ internal class DefaultOutgoingSASVerificationRequest( cancel(CancelCode.UnexpectedMessage) } - fun start() { + fun start(method: VerificationMethod) { if (state != SasVerificationTxState.None) { Timber.e("## SAS O: start verification from invalid state") // should I cancel?? @@ -80,7 +81,7 @@ internal class DefaultOutgoingSASVerificationRequest( val startMessage = transport.createStart( credentials.deviceId ?: "", - KeyVerificationStart.VERIF_METHOD_SAS, + method.toValue(), transactionId, KNOWN_AGREEMENT_PROTOCOLS, KNOWN_HASHES, 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 f7634cc152..8fa91e2f4a 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 @@ -22,10 +22,7 @@ import dagger.Lazy import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.session.crypto.CryptoService -import im.vector.matrix.android.api.session.crypto.sas.CancelCode -import im.vector.matrix.android.api.session.crypto.sas.SasVerificationService -import im.vector.matrix.android.api.session.crypto.sas.SasVerificationTxState -import im.vector.matrix.android.api.session.crypto.sas.safeValueOf +import im.vector.matrix.android.api.session.crypto.sas.* import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.LocalEcho @@ -366,7 +363,7 @@ internal class DefaultSasVerificationService @Inject constructor( // cancelTransaction(tid, otherUserId, startReq.fromDevice!!, CancelCode.UnexpectedMessage) } else { // Ok we can create - if (KeyVerificationStart.VERIF_METHOD_SAS == startReq.method) { + if (startReq.method == VERIFICATION_METHOD_SAS) { Timber.v("## SAS onStartRequestReceived - request accepted ${startReq.transactionID!!}") // If there is a corresponding request, we can auto accept // as we are the one requesting in first place (or we accepted the request) @@ -690,14 +687,10 @@ internal class DefaultSasVerificationService @Inject constructor( } } - override fun beginKeyVerificationSAS(userId: String, deviceID: String): String? { - return beginKeyVerification(KeyVerificationStart.VERIF_METHOD_SAS, userId, deviceID) - } - - override fun beginKeyVerification(method: String, userId: String, deviceID: String): String? { + override fun beginKeyVerification(method: VerificationMethod, userId: String, deviceID: String): String? { val txID = createUniqueIDForTransaction(userId, deviceID) // should check if already one (and cancel it) - if (KeyVerificationStart.VERIF_METHOD_SAS == method) { + if (method == VerificationMethod.SAS) { val tx = DefaultOutgoingSASVerificationRequest( setDeviceVerificationAction, credentials, @@ -709,14 +702,14 @@ internal class DefaultSasVerificationService @Inject constructor( tx.transport = sasTransportToDeviceFactory.createTransport(tx) addTransaction(tx) - tx.start() + tx.start(method) return txID } else { throw IllegalArgumentException("Unknown verification method") } } - override fun requestKeyVerificationInDMs(userId: String, roomId: String) + override fun requestKeyVerificationInDMs(methods: List, userId: String, roomId: String) : PendingVerificationRequest { Timber.i("## SAS Requesting verification to user: $userId in room $roomId") @@ -747,7 +740,7 @@ internal class DefaultSasVerificationService @Inject constructor( otherUserId = userId ) - transport.sendVerificationRequest(localID, userId, roomId) { syncedId, info -> + transport.sendVerificationRequest(methods.map { it.toValue() }, localID, userId, roomId) { syncedId, info -> // We need to update with the syncedID updatePendingRequest(verificationRequest.copy( transactionId = syncedId, @@ -788,10 +781,13 @@ internal class DefaultSasVerificationService @Inject constructor( dispatchRequestUpdated(updated) } - override fun beginKeyVerificationInDMs(method: String, transactionId: String, roomId: String, - otherUserId: String, otherDeviceId: String, + override fun beginKeyVerificationInDMs(method: VerificationMethod, + transactionId: String, + roomId: String, + otherUserId: String, + otherDeviceId: String, callback: MatrixCallback?): String? { - if (KeyVerificationStart.VERIF_METHOD_SAS == method) { + if (method == VerificationMethod.SAS) { val tx = DefaultOutgoingSASVerificationRequest( setDeviceVerificationAction, credentials, @@ -803,7 +799,7 @@ internal class DefaultSasVerificationService @Inject constructor( tx.transport = sasTransportRoomMessageFactory.createTransport(roomId, tx) addTransaction(tx) - tx.start() + tx.start(method) return transactionId } else { throw IllegalArgumentException("Unknown verification method") @@ -817,7 +813,7 @@ internal class DefaultSasVerificationService @Inject constructor( if (existingRequest != null) { // we need to send a ready event, with matching methods val transport = sasTransportRoomMessageFactory.createTransport(roomId, null) - val methods = existingRequest.requestInfo?.methods?.intersect(listOf(KeyVerificationStart.VERIF_METHOD_SAS))?.toList() + val methods = existingRequest.requestInfo?.methods?.intersect(supportedVerificationMethods)?.toList() if (methods.isNullOrEmpty()) { Timber.i("Cannot ready this request, no common methods found txId:$transactionId") // TODO buttons should not be shown in this case? 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 2471062d69..0ac3847a53 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 @@ -16,29 +16,38 @@ package im.vector.matrix.android.internal.crypto.verification import im.vector.matrix.android.api.session.crypto.sas.CancelCode +import im.vector.matrix.android.api.session.crypto.sas.VerificationMethod import im.vector.matrix.android.api.session.room.model.message.MessageVerificationRequestContent +import im.vector.matrix.android.internal.crypto.model.rest.VERIFICATION_METHOD_SAS +import im.vector.matrix.android.internal.crypto.model.rest.VERIFICATION_METHOD_SCAN import java.util.* /** * Stores current pending verification requests */ data class PendingVerificationRequest( - val ageLocalTs : Long, + val ageLocalTs: Long, val isIncoming: Boolean = false, - val localID: String = UUID.randomUUID().toString(), + val localID: String = UUID.randomUUID().toString(), val otherUserId: String, val roomId: String?, val transactionId: String? = null, val requestInfo: MessageVerificationRequestContent? = null, val readyInfo: VerificationInfoReady? = null, val cancelConclusion: CancelCode? = null, - val isSuccessful : Boolean = false, - val handledByOtherSession : Boolean = false + val isSuccessful: Boolean = false, + val handledByOtherSession: Boolean = false ) { - val isReady: Boolean = readyInfo != null val isSent: Boolean = transactionId != null val isFinished: Boolean = isSuccessful || cancelConclusion != null + + fun hasMethod(method: VerificationMethod): Boolean? { + return when (method) { + VerificationMethod.SAS -> readyInfo?.methods?.contains(VERIFICATION_METHOD_SAS) + VerificationMethod.SCAN -> readyInfo?.methods?.contains(VERIFICATION_METHOD_SCAN) + } + } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransport.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransport.kt index a9ce2b3abc..12fe5c338f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransport.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransport.kt @@ -34,9 +34,16 @@ internal interface SasTransport { onErrorReason: CancelCode, onDone: (() -> Unit)?) - fun sendVerificationRequest(localID: String, otherUserId: String, roomId: String, callback: (String?, MessageVerificationRequestContent?) -> Unit) + fun sendVerificationRequest(supportedMethods: List, + localID: String, + otherUserId: String, + roomId: String, callback: + (String?, MessageVerificationRequestContent?) -> Unit) - fun cancelTransaction(transactionId: String, otherUserId: String, otherUserDeviceId: String, code: CancelCode) + fun cancelTransaction(transactionId: String, + otherUserId: String, + otherUserDeviceId: String, + code: CancelCode) fun done(transactionId: String) /** @@ -58,7 +65,7 @@ internal interface SasTransport { keyAgreementProtocols: List, hashes: List, messageAuthenticationCodes: List, - shortAuthenticationStrings: List) : VerificationInfoStart + shortAuthenticationStrings: List): VerificationInfoStart fun createMac(tid: String, mac: Map, keys: String): VerificationInfoMac 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 797581779e..c9799cc58d 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 @@ -24,7 +24,6 @@ import im.vector.matrix.android.api.session.crypto.sas.SasVerificationTxState import im.vector.matrix.android.api.session.events.model.* import im.vector.matrix.android.api.session.room.model.message.* import im.vector.matrix.android.api.session.room.model.relation.RelationDefaultContent -import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationStart import im.vector.matrix.android.internal.di.DeviceId import im.vector.matrix.android.internal.di.SessionId import im.vector.matrix.android.internal.di.UserId @@ -119,7 +118,8 @@ internal class SasTransportRoomMessage( } } - override fun sendVerificationRequest(localID: String, + override fun sendVerificationRequest(supportedMethods: List, + localID: String, otherUserId: String, roomId: String, callback: (String?, MessageVerificationRequestContent?) -> Unit) { @@ -127,7 +127,7 @@ internal class SasTransportRoomMessage( body = stringProvider.getString(R.string.key_verification_request_fallback_message, userId), fromDevice = userDeviceId ?: "", toUserId = otherUserId, - methods = listOf(KeyVerificationStart.VERIF_METHOD_SAS) + methods = supportedMethods ) val content = info.toContent() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransportToDevice.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransportToDevice.kt index db578c5047..8d280f50d8 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransportToDevice.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/SasTransportToDevice.kt @@ -34,7 +34,10 @@ internal class SasTransportToDevice( private var taskExecutor: TaskExecutor ) : SasTransport { - override fun sendVerificationRequest(localID: String, otherUserId: String, roomId: String, + override fun sendVerificationRequest(supportedMethods: List, + localID: String, + otherUserId: String, + roomId: String, callback: (String?, MessageVerificationRequestContent?) -> Unit) { // TODO "not implemented" } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/Config.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/Config.kt new file mode 100644 index 0000000000..0bc9a3e144 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/Config.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotx.features.crypto.verification + +import im.vector.matrix.android.api.session.crypto.sas.VerificationMethod + +// TODO Add support for SCAN (QR code) +val supportedVerificationMethods = listOf(VerificationMethod.SAS) diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt index e25a22e668..20383b306d 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt @@ -21,13 +21,9 @@ import com.airbnb.mvrx.* import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.session.Session -import im.vector.matrix.android.api.session.crypto.sas.CancelCode -import im.vector.matrix.android.api.session.crypto.sas.SasVerificationService -import im.vector.matrix.android.api.session.crypto.sas.SasVerificationTransaction -import im.vector.matrix.android.api.session.crypto.sas.SasVerificationTxState +import im.vector.matrix.android.api.session.crypto.sas.* import im.vector.matrix.android.api.util.MatrixItem import im.vector.matrix.android.api.util.toMatrixItem -import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationStart import im.vector.matrix.android.internal.crypto.verification.PendingVerificationRequest import im.vector.riotx.core.di.HasScreenInjector import im.vector.riotx.core.platform.VectorViewModel @@ -108,7 +104,7 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini is VerificationAction.RequestVerificationByDM -> { // session setState { - copy(pendingRequest = session.getSasVerificationService().requestKeyVerificationInDMs(otherUserId, roomId)) + copy(pendingRequest = session.getSasVerificationService().requestKeyVerificationInDMs(supportedVerificationMethods, otherUserId, roomId)) } } is VerificationAction.StartSASVerification -> { @@ -117,7 +113,7 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini val otherDevice = if (request.isIncoming) request.requestInfo?.fromDevice else request.readyInfo?.fromDevice session.getSasVerificationService().beginKeyVerificationInDMs( - KeyVerificationStart.VERIF_METHOD_SAS, + VerificationMethod.SAS, transactionId = action.pendingRequestTransactionId, roomId = roomId, otherUserId = request.otherUserId, diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/choose/VerificationChooseMethodViewModel.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/choose/VerificationChooseMethodViewModel.kt index f5cf1676ba..a1d566d77b 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/choose/VerificationChooseMethodViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/choose/VerificationChooseMethodViewModel.kt @@ -24,7 +24,7 @@ import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.crypto.sas.SasVerificationService import im.vector.matrix.android.api.session.crypto.sas.SasVerificationTransaction -import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationStart +import im.vector.matrix.android.api.session.crypto.sas.VerificationMethod import im.vector.matrix.android.internal.crypto.verification.PendingVerificationRequest import im.vector.riotx.core.di.HasScreenInjector import im.vector.riotx.core.platform.EmptyAction @@ -49,10 +49,8 @@ class VerificationChooseMethodViewModel @AssistedInject constructor( override fun verificationRequestUpdated(pr: PendingVerificationRequest) = withState { state -> val pvr = session.getSasVerificationService().getExistingVerificationRequest(state.otherUserId, state.transactionId) - val qrAvailable = pvr?.readyInfo?.methods?.contains(KeyVerificationStart.VERIF_METHOD_SCAN) - ?: false - val emojiAvailable = pvr?.readyInfo?.methods?.contains(KeyVerificationStart.VERIF_METHOD_SAS) - ?: false + val qrAvailable = pvr?.hasMethod(VerificationMethod.SCAN) ?: false + val emojiAvailable = pvr?.hasMethod(VerificationMethod.SAS) ?: false setState { copy( @@ -86,10 +84,8 @@ class VerificationChooseMethodViewModel @AssistedInject constructor( val args: VerificationBottomSheet.VerificationArgs = viewModelContext.args() val session = (viewModelContext.activity as HasScreenInjector).injector().activeSessionHolder().getActiveSession() val pvr = session.getSasVerificationService().getExistingVerificationRequest(args.otherUserId, args.verificationId) - val qrAvailable = pvr?.readyInfo?.methods?.contains(KeyVerificationStart.VERIF_METHOD_SCAN) - ?: false - val emojiAvailable = pvr?.readyInfo?.methods?.contains(KeyVerificationStart.VERIF_METHOD_SAS) - ?: false + val qrAvailable = pvr?.hasMethod(VerificationMethod.SCAN) ?: false + val emojiAvailable = pvr?.hasMethod(VerificationMethod.SAS) ?: false return VerificationChooseMethodViewState(otherUserId = args.otherUserId, transactionId = args.verificationId ?: "", 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 c8a8e6413f..9ca1feae21 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 @@ -61,6 +61,7 @@ import im.vector.riotx.core.utils.PublishDataSource import im.vector.riotx.core.utils.subscribeLogError import im.vector.riotx.features.command.CommandParser import im.vector.riotx.features.command.ParsedCommand +import im.vector.riotx.features.crypto.verification.supportedVerificationMethods import im.vector.riotx.features.home.room.detail.timeline.helper.TimelineDisplayableEvents import im.vector.riotx.features.home.room.typing.TypingHelper import im.vector.riotx.features.settings.VectorPreferences @@ -409,7 +410,7 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro popDraft() } is ParsedCommand.VerifyUser -> { - session.getSasVerificationService().requestKeyVerificationInDMs(slashCommandResult.userId, room.roomId) + session.getSasVerificationService().requestKeyVerificationInDMs(supportedVerificationMethods, slashCommandResult.userId, room.roomId) _sendMessageResultLiveData.postLiveEvent(SendMessageResult.SlashCommandHandled()) popDraft() }