crypto: Add docs to the VerificationRequest class
This commit is contained in:
parent
b500364322
commit
93615ddba9
|
@ -18,7 +18,6 @@ package org.matrix.android.sdk.internal.crypto
|
||||||
|
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import com.sun.jna.Native.toByteArray
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.matrix.android.sdk.api.session.crypto.verification.CancelCode
|
import org.matrix.android.sdk.api.session.crypto.verification.CancelCode
|
||||||
|
@ -30,10 +29,6 @@ import org.matrix.android.sdk.api.session.crypto.verification.VerificationServic
|
||||||
import org.matrix.android.sdk.api.session.crypto.verification.safeValueOf
|
import org.matrix.android.sdk.api.session.crypto.verification.safeValueOf
|
||||||
import org.matrix.android.sdk.internal.crypto.crosssigning.toBase64NoPadding
|
import org.matrix.android.sdk.internal.crypto.crosssigning.toBase64NoPadding
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_QR_CODE_SCAN
|
import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_QR_CODE_SCAN
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_QR_CODE_SHOW
|
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_RECIPROCATE
|
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_SAS
|
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.toValue
|
|
||||||
import org.matrix.android.sdk.internal.crypto.verification.prepareMethods
|
import org.matrix.android.sdk.internal.crypto.verification.prepareMethods
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import uniffi.olm.OlmMachine
|
import uniffi.olm.OlmMachine
|
||||||
|
@ -59,37 +54,74 @@ internal class VerificationRequest(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the flow ID of this verification request
|
||||||
|
*
|
||||||
|
* This is either the transaction ID if the verification is happening
|
||||||
|
* over to-device events, or the event ID of the m.key.verification.request
|
||||||
|
* event that initiated the flow.
|
||||||
|
*/
|
||||||
internal fun flowId(): String {
|
internal fun flowId(): String {
|
||||||
return this.inner.flowId
|
return this.inner.flowId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** The user ID of the other user that is participating in this verification flow */
|
||||||
internal fun otherUser(): String {
|
internal fun otherUser(): String {
|
||||||
return this.inner.otherUserId
|
return this.inner.otherUserId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** The device ID of the other user's device that is participating in this verification flow
|
||||||
|
*
|
||||||
|
* This will we null if we're initiating the request and the other side
|
||||||
|
* didn't yet accept the verification flow.
|
||||||
|
* */
|
||||||
internal fun otherDeviceId(): String? {
|
internal fun otherDeviceId(): String? {
|
||||||
refreshData()
|
refreshData()
|
||||||
return this.inner.otherDeviceId
|
return this.inner.otherDeviceId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Did we initiate this verification flow */
|
||||||
internal fun weStarted(): Boolean {
|
internal fun weStarted(): Boolean {
|
||||||
return this.inner.weStarted
|
return this.inner.weStarted
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the id of the room where this verification is happening
|
||||||
|
*
|
||||||
|
* Will be null if the verification is not happening inside a room.
|
||||||
|
*/
|
||||||
internal fun roomId(): String? {
|
internal fun roomId(): String? {
|
||||||
return this.inner.roomId
|
return this.inner.roomId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Did the non-initiating side respond with a m.key.verification.read event
|
||||||
|
*
|
||||||
|
* Once the verification request is ready, we're able to transition into a
|
||||||
|
* concrete verification flow, i.e. we can show/scan a QR code or start emoji
|
||||||
|
* verification.
|
||||||
|
*/
|
||||||
internal fun isReady(): Boolean {
|
internal fun isReady(): Boolean {
|
||||||
refreshData()
|
refreshData()
|
||||||
return this.inner.isReady
|
return this.inner.isReady
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Did we advertise that we're able to scan QR codes */
|
||||||
internal fun canScanQrCodes(): Boolean {
|
internal fun canScanQrCodes(): Boolean {
|
||||||
refreshData()
|
refreshData()
|
||||||
return this.inner.ourMethods?.contains(VERIFICATION_METHOD_QR_CODE_SCAN) ?: false
|
return this.inner.ourMethods?.contains(VERIFICATION_METHOD_QR_CODE_SCAN) ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Accept the verification request advertising the given methods as supported
|
||||||
|
*
|
||||||
|
* This will send out a m.key.verification.ready event advertising support for
|
||||||
|
* the given verification methods to the other side. After this method call, the
|
||||||
|
* verification request will be considered to be ready and will be able to transition
|
||||||
|
* into concrete verification flows.
|
||||||
|
*
|
||||||
|
* The method turns into a noop, if the verification flow has already been accepted
|
||||||
|
* and is in the ready state, which can be checked with the isRead() method.
|
||||||
|
*
|
||||||
|
* @param methods The list of VerificationMethod that we wish to advertise to the other
|
||||||
|
* side as supported.
|
||||||
|
*/
|
||||||
suspend fun acceptWithMethods(methods: List<VerificationMethod>) {
|
suspend fun acceptWithMethods(methods: List<VerificationMethod>) {
|
||||||
val stringMethods = prepareMethods(methods)
|
val stringMethods = prepareMethods(methods)
|
||||||
|
|
||||||
|
@ -105,6 +137,19 @@ internal class VerificationRequest(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Transition from a ready verification request into emoji verification
|
||||||
|
*
|
||||||
|
* This method will move the verification forward into emoji verification,
|
||||||
|
* it will send out a m.key.verification.start event with the method set to
|
||||||
|
* m.sas.v1.
|
||||||
|
*
|
||||||
|
* Note: This method will be a noop and return null if the verification request
|
||||||
|
* isn't considered to be ready, you can check if the request is ready using the
|
||||||
|
* isReady() method.
|
||||||
|
*
|
||||||
|
* @return A freshly created SasVerification object that represents the newly started
|
||||||
|
* emoji verification, or null if we can't yet transition into emoji verification.
|
||||||
|
*/
|
||||||
internal suspend fun startSasVerification(): SasVerification? {
|
internal suspend fun startSasVerification(): SasVerification? {
|
||||||
return withContext(Dispatchers.IO) {
|
return withContext(Dispatchers.IO) {
|
||||||
val result = machine.startSasVerification(inner.otherUserId, inner.flowId)
|
val result = machine.startSasVerification(inner.otherUserId, inner.flowId)
|
||||||
|
@ -118,6 +163,19 @@ internal class VerificationRequest(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Scan a QR code and transition into QR code verification
|
||||||
|
*
|
||||||
|
* This method will move the verification forward into QR code verification.
|
||||||
|
* It will send out a m.key.verification.start event with the method
|
||||||
|
* set to m.reciprocate.v1.
|
||||||
|
*
|
||||||
|
* Note: This method will be a noop and return null if the verification request
|
||||||
|
* isn't considered to be ready, you can check if the request is ready using the
|
||||||
|
* isReady() method.
|
||||||
|
*
|
||||||
|
* @return A freshly created QrCodeVerification object that represents the newly started
|
||||||
|
* QR code verification, or null if we can't yet transition into QR code verification.
|
||||||
|
*/
|
||||||
internal suspend fun scanQrCode(data: String): QrCodeVerification? {
|
internal suspend fun scanQrCode(data: String): QrCodeVerification? {
|
||||||
// TODO again, what's the deal with ISO_8859_1?
|
// TODO again, what's the deal with ISO_8859_1?
|
||||||
val byteArray = data.toByteArray(Charsets.ISO_8859_1)
|
val byteArray = data.toByteArray(Charsets.ISO_8859_1)
|
||||||
|
@ -128,6 +186,23 @@ internal class VerificationRequest(
|
||||||
return QrCodeVerification(this.machine, this, result.qr, this.sender, this.listeners)
|
return QrCodeVerification(this.machine, this, result.qr, this.sender, this.listeners)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Transition into a QR code verification to display a QR code
|
||||||
|
*
|
||||||
|
* This method will move the verification forward into QR code verification.
|
||||||
|
* It will not send out any event out, it should instead be used to display
|
||||||
|
* a QR code which then can be scanned out of bound by the other side.
|
||||||
|
*
|
||||||
|
* A m.key.verification.start event with the method set to m.reciprocate.v1
|
||||||
|
* incoming from the other side will only be accepted if this method is called
|
||||||
|
* and the QR code verification is successfully initiated.
|
||||||
|
*
|
||||||
|
* Note: This method will be a noop and return null if the verification request
|
||||||
|
* isn't considered to be ready, you can check if the request is ready using the
|
||||||
|
* isReady() method.
|
||||||
|
*
|
||||||
|
* @return A freshly created QrCodeVerification object that represents the newly started
|
||||||
|
* QR code verification, or null if we can't yet transition into QR code verification.
|
||||||
|
*/
|
||||||
internal fun startQrVerification(): QrCodeVerification? {
|
internal fun startQrVerification(): QrCodeVerification? {
|
||||||
val qrcode = this.machine.startQrVerification(this.inner.otherUserId, this.inner.flowId)
|
val qrcode = this.machine.startQrVerification(this.inner.otherUserId, this.inner.flowId)
|
||||||
|
|
||||||
|
@ -144,6 +219,16 @@ internal class VerificationRequest(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Cancel the verification flow
|
||||||
|
*
|
||||||
|
* This will send out a m.key.verification.cancel event with the cancel
|
||||||
|
* code set to m.user.
|
||||||
|
*
|
||||||
|
* Cancelling the verification request will also cancel any QrcodeVerification and
|
||||||
|
* SasVerification objects that are related to this verification request.
|
||||||
|
*
|
||||||
|
* The method turns into a noop, if the verification flow has already been cancelled.
|
||||||
|
*/
|
||||||
internal suspend fun cancel() {
|
internal suspend fun cancel() {
|
||||||
val request = this.machine.cancelVerification(
|
val request = this.machine.cancelVerification(
|
||||||
this.inner.otherUserId,
|
this.inner.otherUserId,
|
||||||
|
@ -157,6 +242,7 @@ internal class VerificationRequest(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Fetch fresh data from the Rust side for our verification flow */
|
||||||
private fun refreshData() {
|
private fun refreshData() {
|
||||||
val request = this.machine.getVerificationRequest(this.inner.otherUserId, this.inner.flowId)
|
val request = this.machine.getVerificationRequest(this.inner.otherUserId, this.inner.flowId)
|
||||||
|
|
||||||
|
@ -165,6 +251,15 @@ internal class VerificationRequest(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Convert the VerificationRequest into a PendingVerificationRequest
|
||||||
|
*
|
||||||
|
* The public interface of the VerificationService dispatches the data class
|
||||||
|
* PendingVerificationRequest, this method allows us to easily transform this
|
||||||
|
* request into the data class. It fetches fresh info from the Rust side before
|
||||||
|
* it does the transform.
|
||||||
|
*
|
||||||
|
* @return The PendingVerificationRequest that matches data from this VerificationRequest.
|
||||||
|
*/
|
||||||
internal fun toPendingVerificationRequest(): PendingVerificationRequest {
|
internal fun toPendingVerificationRequest(): PendingVerificationRequest {
|
||||||
refreshData()
|
refreshData()
|
||||||
val cancelInfo = this.inner.cancelInfo
|
val cancelInfo = this.inner.cancelInfo
|
||||||
|
|
Loading…
Reference in New Issue