[fractal] Request 3PID (phone) verification through matrix-sdk



commit 1685540bf48a7a3da1232ec76267a64130164545
Author: Alejandro Domínguez <adomu net-c com>
Date:   Fri Sep 25 08:03:47 2020 +0200

    Request 3PID (phone) verification through matrix-sdk

 fractal-gtk/src/backend/user.rs                    | 97 +++++++---------------
 fractal-gtk/src/widgets/address.rs                 | 67 ++++++---------
 fractal-matrix-api/src/meson.build                 |  1 -
 fractal-matrix-api/src/r0/contact.rs               |  1 -
 .../contact/request_verification_token_msisdn.rs   | 49 -----------
 5 files changed, 54 insertions(+), 161 deletions(-)
---
diff --git a/fractal-gtk/src/backend/user.rs b/fractal-gtk/src/backend/user.rs
index 42433d73..881bf533 100644
--- a/fractal-gtk/src/backend/user.rs
+++ b/fractal-gtk/src/backend/user.rs
@@ -19,6 +19,7 @@ use super::room::AttachedFileError;
 use crate::model::member::Member;
 use fractal_api::api::r0::account::change_password::Request as ChangePasswordRequest;
 use fractal_api::api::r0::account::request_3pid_management_token_via_email::Request as EmailTokenRequest;
+use fractal_api::api::r0::account::request_3pid_management_token_via_msisdn::Request as PhoneTokenRequest;
 use fractal_api::api::r0::contact::get_contacts::Request as GetContactsRequest;
 use fractal_api::api::r0::contact::get_contacts::ThirdPartyIdentifier;
 use fractal_api::api::r0::profile::get_display_name::Request as GetDisplayNameRequest;
@@ -43,10 +44,6 @@ use fractal_api::r0::contact::create::Parameters as AddThreePIDParameters;
 use fractal_api::r0::contact::delete::request as delete_contact;
 use fractal_api::r0::contact::delete::Body as DeleteThreePIDBody;
 use fractal_api::r0::contact::delete::Parameters as DeleteThreePIDParameters;
-use fractal_api::r0::contact::request_verification_token_msisdn::request as 
request_contact_verification_token_msisdn;
-use fractal_api::r0::contact::request_verification_token_msisdn::Body as PhoneTokenBody;
-use fractal_api::r0::contact::request_verification_token_msisdn::Parameters as PhoneTokenParameters;
-use fractal_api::r0::contact::request_verification_token_msisdn::Response as PhoneTokenResponse;
 use fractal_api::r0::AccessToken;
 use fractal_api::r0::Medium;
 use fractal_api::r0::ThreePIDCredentials;
@@ -176,82 +173,48 @@ pub async fn get_email_token(
 }
 
 #[derive(Debug)]
-pub enum GetTokenPhoneError {
-    IdentityServerUrl(UrlError),
-    Reqwest(ReqwestError),
-    TokenUsed,
-    Denied,
-}
+pub struct GetTokenPhoneError(MatrixError);
 
-impl From<ReqwestError> for GetTokenPhoneError {
-    fn from(err: ReqwestError) -> Self {
-        Self::Reqwest(err)
+impl From<MatrixError> for GetTokenPhoneError {
+    fn from(err: MatrixError) -> Self {
+        Self(err)
     }
 }
 
 impl HandleError for GetTokenPhoneError {
     fn handle_error(&self) {
-        match self {
-            Self::TokenUsed => {
-                let error = i18n("Phone number is already in use");
-                APPOP!(show_error_dialog_in_settings, (error));
-            }
-            Self::Denied => {
-                let error = i18n(
-                    "Please enter your phone number in the format: \n + your country code and your phone 
number.",
-                );
-                APPOP!(show_error_dialog_in_settings, (error));
-            }
-            Self::Reqwest(err) => {
-                let error = i18n("Couldn’t add the phone number.");
-                let err_str = format!("{:?}", err);
-                error!(
-                    "{}",
-                    remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
-                );
-                APPOP!(show_error_dialog_in_settings, (error));
-            }
-            Self::IdentityServerUrl(err) => {
-                let error = i18n("The identity server is invalid.");
-                error!("The identity server is invalid: {:?}", err);
-                APPOP!(show_error_dialog_in_settings, (error));
-            }
+        let err = &self.0;
+        let ruma_error_kind = get_ruma_error_kind(err);
+
+        if ruma_error_kind == Some(&RumaErrorKind::ThreepidInUse) {
+            let error = i18n("Phone number is already in use");
+            APPOP!(show_error_dialog_in_settings, (error));
+        } else if ruma_error_kind == Some(&RumaErrorKind::ThreepidDenied) {
+            let error = i18n(
+                "Please enter your phone number in the format: \n + your country code and your phone 
number.",
+            );
+            APPOP!(show_error_dialog_in_settings, (error));
+        } else {
+            let error = i18n("Couldn’t add the phone number.");
+            let err_str = format!("{:?}", err);
+            error!(
+                "{}",
+                remove_matrix_access_token_if_present(&err_str).unwrap_or(err_str)
+            );
+            APPOP!(show_error_dialog_in_settings, (error));
         }
     }
 }
 
-pub fn get_phone_token(
-    base: Url,
-    access_token: AccessToken,
-    identity: Url,
-    phone_number: String,
+pub async fn get_phone_token(
+    session_client: MatrixClient,
+    phone_number: &str,
     client_secret: String,
 ) -> Result<(String, String), GetTokenPhoneError> {
-    use PhoneTokenResponse::*;
-
-    let params = PhoneTokenParameters { access_token };
-    let body = PhoneTokenBody {
-        id_server: identity
-            .try_into()
-            .map_err(GetTokenPhoneError::IdentityServerUrl)?,
-        client_secret: client_secret.clone(),
-        phone_number,
-        country: String::new(),
-        send_attempt: 1,
-        next_link: None,
-    };
-
-    let request = request_contact_verification_token_msisdn(base, &params, &body)?;
+    let request = PhoneTokenRequest::new(&client_secret, "", phone_number, 1_u32.into());
+    let response = session_client.send(request).await?;
 
-    match HTTP_CLIENT
-        .get_client()
-        .execute(request)?
-        .json::<PhoneTokenResponse>()?
-    {
-        Passed(info) => Ok((info.sid, client_secret)),
-        Failed(info) if info.errcode == "M_THREEPID_IN_USE" => Err(GetTokenPhoneError::TokenUsed),
-        Failed(_) => Err(GetTokenPhoneError::Denied),
-    }
+    Ok((response.sid, client_secret))
 }
 
 #[derive(Debug)]
diff --git a/fractal-gtk/src/widgets/address.rs b/fractal-gtk/src/widgets/address.rs
index 87c1c0b4..bcec63da 100644
--- a/fractal-gtk/src/widgets/address.rs
+++ b/fractal-gtk/src/widgets/address.rs
@@ -163,7 +163,6 @@ impl<'a> Address<'a> {
         let address = self.address.clone();
         let access_token = login_data.access_token;
         let session_client = login_data.session_client;
-        let id_server = login_data.identity_url;
         self.signal_id = Some(self.button.clone().connect_clicked(move |w| {
             if !w.get_sensitive() || !w.is_visible() {
                 return;
@@ -193,13 +192,7 @@ impl<'a> Address<'a> {
                 }
                 Some(AddressAction::Add) => {
                     let address = entry.get_text().to_string();
-                    add_address(
-                        session_client.clone(),
-                        medium,
-                        id_server.clone(),
-                        address,
-                        access_token.clone(),
-                    );
+                    add_address(session_client.clone(), medium, address);
                 }
                 _ => {}
             }
@@ -220,43 +213,31 @@ fn delete_address(medium: Medium, address: String, server_url: Url, access_token
     });
 }
 
-fn add_address(
-    session_client: MatrixClient,
-    medium: Medium,
-    id_server: Url,
-    address: String,
-    access_token: AccessToken,
-) {
-    let server_url = session_client.homeserver().clone();
+fn add_address(session_client: MatrixClient, medium: Medium, address: String) {
     let secret: String = thread_rng().sample_iter(&Alphanumeric).take(36).collect();
-    match medium {
-        Medium::MsIsdn => {
-            thread::spawn(move || {
-                match user::get_phone_token(server_url, access_token, id_server, address, secret) {
-                    Ok((sid, secret)) => {
-                        let sid = Some(sid);
-                        let secret = Some(secret);
-                        APPOP!(get_token_phone, (sid, secret))
-                    }
-                    Err(err) => {
-                        err.handle_error();
-                    }
+
+    RUNTIME.spawn(async move {
+        match medium {
+            Medium::MsIsdn => match user::get_phone_token(session_client, &address, secret).await {
+                Ok((sid, secret)) => {
+                    let sid = Some(sid);
+                    let secret = Some(secret);
+                    APPOP!(get_token_phone, (sid, secret))
                 }
-            });
-        }
-        Medium::Email => {
-            RUNTIME.spawn(async move {
-                match user::get_email_token(session_client, &address, secret).await {
-                    Ok((sid, secret)) => {
-                        let sid = Some(sid);
-                        let secret = Some(secret);
-                        APPOP!(get_token_email, (sid, secret));
-                    }
-                    Err(err) => {
-                        err.handle_error();
-                    }
+                Err(err) => {
+                    err.handle_error();
+                }
+            },
+            Medium::Email => match user::get_email_token(session_client, &address, secret).await {
+                Ok((sid, secret)) => {
+                    let sid = Some(sid);
+                    let secret = Some(secret);
+                    APPOP!(get_token_email, (sid, secret));
                 }
-            });
+                Err(err) => {
+                    err.handle_error();
+                }
+            },
         }
-    };
+    });
 }
diff --git a/fractal-matrix-api/src/meson.build b/fractal-matrix-api/src/meson.build
index b97cc735..27307166 100644
--- a/fractal-matrix-api/src/meson.build
+++ b/fractal-matrix-api/src/meson.build
@@ -8,7 +8,6 @@ api_sources = files(
   'r0/account/logout.rs',
   'r0/contact/create.rs',
   'r0/contact/delete.rs',
-  'r0/contact/request_verification_token_msisdn.rs',
   'r0/server/domain_info.rs',
   'r0/sync/sync_events.rs',
   'r0/account.rs',
diff --git a/fractal-matrix-api/src/r0/contact.rs b/fractal-matrix-api/src/r0/contact.rs
index 14804e9d..da1aa3ac 100644
--- a/fractal-matrix-api/src/r0/contact.rs
+++ b/fractal-matrix-api/src/r0/contact.rs
@@ -1,3 +1,2 @@
 pub mod create;
 pub mod delete;
-pub mod request_verification_token_msisdn;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]