mirror of
https://github.com/element-hq/element-android
synced 2024-12-21 00:42:04 +03:00
crypto: Allow verification requests to be canelled
This commit is contained in:
parent
05119bcf90
commit
1f7311a428
3 changed files with 34 additions and 10 deletions
|
@ -20,6 +20,7 @@ import android.os.Handler
|
|||
import android.os.Looper
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.matrix.android.sdk.api.session.crypto.verification.CancelCode
|
||||
import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest
|
||||
import org.matrix.android.sdk.api.session.crypto.verification.ValidVerificationInfoReady
|
||||
import org.matrix.android.sdk.api.session.crypto.verification.ValidVerificationInfoRequest
|
||||
|
@ -108,6 +109,15 @@ internal class VerificationRequest(
|
|||
}
|
||||
}
|
||||
|
||||
suspend fun cancel() {
|
||||
val request = this.machine.cancelVerification(this.inner.otherUserId, this.inner.flowId, CancelCode.User.value)
|
||||
|
||||
if (request != null) {
|
||||
this.sender.sendVerificationRequest(request)
|
||||
this.dispatchRequestUpdated()
|
||||
}
|
||||
}
|
||||
|
||||
fun isCanceled(): Boolean {
|
||||
refreshData()
|
||||
return this.inner.isCancelled
|
||||
|
|
|
@ -33,6 +33,7 @@ import org.matrix.android.sdk.internal.crypto.QrCodeVerification
|
|||
import org.matrix.android.sdk.internal.crypto.RequestSender
|
||||
import org.matrix.android.sdk.internal.crypto.SasVerification
|
||||
import org.matrix.android.sdk.internal.crypto.VerificationRequest
|
||||
import org.matrix.android.sdk.internal.crypto.model.rest.KeyVerificationCancel
|
||||
import org.matrix.android.sdk.internal.crypto.model.rest.KeyVerificationDone
|
||||
import org.matrix.android.sdk.internal.crypto.model.rest.KeyVerificationKey
|
||||
import org.matrix.android.sdk.internal.crypto.model.rest.KeyVerificationRequest
|
||||
|
@ -106,8 +107,10 @@ constructor(
|
|||
}
|
||||
|
||||
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)
|
||||
EventType.KEY_VERIFICATION_CANCEL -> {}
|
||||
EventType.KEY_VERIFICATION_CANCEL -> onCancel(event)
|
||||
EventType.KEY_VERIFICATION_ACCEPT -> {}
|
||||
EventType.KEY_VERIFICATION_KEY -> onKey(event)
|
||||
EventType.KEY_VERIFICATION_MAC -> {}
|
||||
|
@ -117,13 +120,24 @@ constructor(
|
|||
else -> {}
|
||||
}
|
||||
|
||||
private fun getAndDispatch(sender: String, flowId: String) {
|
||||
val verification = this.getExistingTransaction(sender, flowId) ?: return
|
||||
dispatchTxUpdated(verification)
|
||||
}
|
||||
|
||||
private fun onCancel(event: Event) {
|
||||
val content = event.getClearContent().toModel<KeyVerificationCancel>() ?: return
|
||||
val flowId = content.transactionId ?: return
|
||||
val sender = event.senderId ?: return
|
||||
|
||||
getAndDispatch(sender, flowId)
|
||||
}
|
||||
private fun onStart(event: Event) {
|
||||
val content = event.getClearContent().toModel<KeyVerificationStart>() ?: return
|
||||
val flowId = content.transactionId ?: return
|
||||
val sender = event.senderId ?: return
|
||||
|
||||
val verification = this.getExistingTransaction(sender, flowId) ?: return
|
||||
dispatchTxUpdated(verification)
|
||||
getAndDispatch(sender, flowId)
|
||||
}
|
||||
|
||||
private fun onDone(event: Event) {
|
||||
|
@ -131,8 +145,7 @@ constructor(
|
|||
val flowId = content.transactionId ?: return
|
||||
val sender = event.senderId ?: return
|
||||
|
||||
val verification = this.getExistingTransaction(sender, flowId) ?: return
|
||||
dispatchTxUpdated(verification)
|
||||
getAndDispatch(sender, flowId)
|
||||
}
|
||||
|
||||
private fun onKey(event: Event) {
|
||||
|
@ -140,8 +153,7 @@ constructor(
|
|||
val flowId = content.transactionId ?: return
|
||||
val sender = event.senderId ?: return
|
||||
|
||||
val verification = this.getExistingTransaction(sender, flowId) ?: return
|
||||
dispatchTxUpdated(verification)
|
||||
getAndDispatch(sender, flowId)
|
||||
}
|
||||
|
||||
private fun onRequest(event: Event) {
|
||||
|
@ -246,8 +258,8 @@ constructor(
|
|||
}
|
||||
|
||||
override fun cancelVerificationRequest(request: PendingVerificationRequest) {
|
||||
// TODO get the request out of the olm machine and cancel here
|
||||
TODO()
|
||||
val verificationRequest = request.transactionId?.let { this.getVerificationRequest(request.otherUserId, it) }
|
||||
runBlocking { verificationRequest?.cancel() }
|
||||
}
|
||||
|
||||
override fun declineVerificationRequestInDMs(
|
||||
|
|
|
@ -797,7 +797,9 @@ impl OlmMachine {
|
|||
) -> Option<OutgoingVerificationRequest> {
|
||||
let user_id = UserId::try_from(user_id).ok()?;
|
||||
|
||||
if let Some(verification) = self.inner.get_verification(&user_id, flow_id) {
|
||||
if let Some(request) = self.inner.get_verification_request(&user_id, flow_id) {
|
||||
request.cancel().map(|r| r.into())
|
||||
} else if let Some(verification) = self.inner.get_verification(&user_id, flow_id) {
|
||||
match verification {
|
||||
RustVerification::SasV1(v) => {
|
||||
v.cancel_with_code(cancel_code.into()).map(|r| r.into())
|
||||
|
|
Loading…
Reference in a new issue