use matrix_sdk_base::crypto::{CancelInfo, VerificationRequest as BaseVerificationRequest};
use ruma::events::key::verification::VerificationMethod;
use super::SasVerification;
#[cfg(feature = "qrcode")]
use super::{QrVerification, QrVerificationData};
use crate::{Client, Result};
#[derive(Debug, Clone)]
pub struct VerificationRequest {
pub(crate) inner: BaseVerificationRequest,
pub(crate) client: Client,
}
impl VerificationRequest {
pub fn is_done(&self) -> bool {
self.inner.is_done()
}
pub fn is_cancelled(&self) -> bool {
self.inner.is_cancelled()
}
pub fn flow_id(&self) -> &str {
self.inner.flow_id().as_str()
}
pub fn cancel_info(&self) -> Option<CancelInfo> {
self.inner.cancel_info()
}
pub fn own_user_id(&self) -> &ruma::UserId {
self.inner.own_user_id()
}
pub fn is_passive(&self) -> bool {
self.inner.is_passive()
}
pub fn is_ready(&self) -> bool {
self.inner.is_ready()
}
pub fn we_started(&self) -> bool {
self.inner.we_started()
}
pub fn other_user_id(&self) -> &ruma::UserId {
self.inner.other_user()
}
pub fn is_self_verification(&self) -> bool {
self.inner.is_self_verification()
}
pub fn their_supported_methods(&self) -> Option<Vec<VerificationMethod>> {
self.inner.their_supported_methods()
}
pub async fn accept(&self) -> Result<()> {
if let Some(request) = self.inner.accept() {
self.client.send_verification_request(request).await?;
}
Ok(())
}
pub async fn accept_with_methods(&self, methods: Vec<VerificationMethod>) -> Result<()> {
if let Some(request) = self.inner.accept_with_methods(methods) {
self.client.send_verification_request(request).await?;
}
Ok(())
}
#[cfg(feature = "qrcode")]
pub async fn generate_qr_code(&self) -> Result<Option<QrVerification>> {
Ok(self
.inner
.generate_qr_code()
.await?
.map(|qr| QrVerification { inner: qr, client: self.client.clone() }))
}
#[cfg(feature = "qrcode")]
pub async fn scan_qr_code(&self, data: QrVerificationData) -> Result<Option<QrVerification>> {
if let Some(qr) = self.inner.scan_qr_code(data).await? {
if let Some(request) = qr.reciprocate() {
self.client.send_verification_request(request).await?;
}
Ok(Some(QrVerification { inner: qr, client: self.client.clone() }))
} else {
Ok(None)
}
}
pub async fn start_sas(&self) -> Result<Option<SasVerification>> {
if let Some((sas, request)) = self.inner.start_sas().await? {
self.client.send_verification_request(request).await?;
Ok(Some(SasVerification { inner: sas, client: self.client.clone() }))
} else {
Ok(None)
}
}
pub async fn cancel(&self) -> Result<()> {
if let Some(request) = self.inner.cancel() {
self.client.send_verification_request(request).await?;
}
Ok(())
}
}