[fractal] API: Use AccessToken for the access token



commit 0b617adbd1ddd57f8a88d0809c17749103062a31
Author: Alejandro Domínguez <adomu net-c com>
Date:   Fri Oct 11 18:03:44 2019 +0200

    API: Use AccessToken for the access token
    
    Previously we used a `String` for this purpose, which
    made it harder to trace when and where we were passing
    access tokens. In the future, when it is used everywhere,
    it won't be possible to create tokens from within the app
    to avoid using non-existent tokens.

 fractal-matrix-api/src/backend/directory.rs        |   5 +-
 fractal-matrix-api/src/backend/media.rs            |   7 +-
 fractal-matrix-api/src/backend/mod.rs              |  16 +++-
 fractal-matrix-api/src/backend/register.rs         |  23 +++--
 fractal-matrix-api/src/backend/room.rs             | 102 +++++++++++++++++----
 fractal-matrix-api/src/backend/stickers.rs         |   2 +
 fractal-matrix-api/src/backend/sync.rs             |   5 +-
 fractal-matrix-api/src/backend/user.rs             |  20 ++--
 fractal-matrix-api/src/r0.rs                       |  23 +++++
 .../src/r0/account/change_password.rs              |   4 +-
 fractal-matrix-api/src/r0/account/deactivate.rs    |   4 +-
 fractal-matrix-api/src/r0/account/login.rs         |   3 +-
 fractal-matrix-api/src/r0/account/logout.rs        |   3 +-
 fractal-matrix-api/src/r0/account/register.rs      |   3 +-
 fractal-matrix-api/src/r0/contact/create.rs        |   3 +-
 fractal-matrix-api/src/r0/contact/delete.rs        |   3 +-
 .../src/r0/contact/get_identifiers.rs              |   3 +-
 .../r0/contact/request_verification_token_email.rs |   3 +-
 .../contact/request_verification_token_msisdn.rs   |   3 +-
 .../src/r0/directory/post_public_rooms.rs          |   3 +-
 fractal-matrix-api/src/r0/media/create.rs          |   3 +-
 .../src/r0/profile/set_avatar_url.rs               |   3 +-
 .../src/r0/profile/set_display_name.rs             |   3 +-
 fractal-matrix-api/src/r0/search/user.rs           |   3 +-
 fractal-matrix-api/src/r0/sync/sync_events.rs      |   5 +-
 .../src/r0/thirdparty/get_supported_protocols.rs   |   3 +-
 fractal-matrix-api/src/util.rs                     |   5 +-
 27 files changed, 196 insertions(+), 67 deletions(-)
---
diff --git a/fractal-matrix-api/src/backend/directory.rs b/fractal-matrix-api/src/backend/directory.rs
index 3136ac67..e7e18615 100644
--- a/fractal-matrix-api/src/backend/directory.rs
+++ b/fractal-matrix-api/src/backend/directory.rs
@@ -26,7 +26,7 @@ use crate::types::Room;
 
 pub fn protocols(bk: &Backend, base: Url) {
     let tx = bk.tx.clone();
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
 
     let params = SupportedProtocolsParameters { access_token };
 
@@ -78,8 +78,7 @@ pub fn room_search(
         })
         .unwrap_or(Ok(None))?;
 
-    let access_token = data.lock().unwrap().access_token.clone();
-
+    let access_token = bk.get_access_token();
     let since = if more {
         Some(data.lock().unwrap().rooms_since.clone())
     } else {
diff --git a/fractal-matrix-api/src/backend/media.rs b/fractal-matrix-api/src/backend/media.rs
index 1821c8f2..81ae7998 100644
--- a/fractal-matrix-api/src/backend/media.rs
+++ b/fractal-matrix-api/src/backend/media.rs
@@ -7,6 +7,7 @@ use std::sync::mpsc::Sender;
 use std::thread;
 use url::Url;
 
+use crate::r0::AccessToken;
 use crate::util::cache_dir_path;
 use crate::util::client_url;
 use crate::util::download_file;
@@ -44,7 +45,7 @@ pub fn get_media_list_async(
     prev_batch: Option<String>,
     tx: Sender<(Vec<Message>, String)>,
 ) {
-    let tk = bk.data.lock().unwrap().access_token.clone();
+    let tk = bk.get_access_token();
     let room = String::from(roomid);
 
     semaphore(bk.limit_threads.clone(), move || {
@@ -93,7 +94,7 @@ pub fn get_file_async(url: String, tx: Sender<String>) -> Result<(), Error> {
 
 fn get_room_media_list(
     baseu: &Url,
-    tk: &str,
+    tk: &AccessToken,
     roomid: &str,
     limit: i32,
     first_media_id: Option<String>,
@@ -102,7 +103,7 @@ fn get_room_media_list(
     let mut params = vec![
         ("dir", String::from("b")),
         ("limit", format!("{}", limit)),
-        ("access_token", String::from(tk)),
+        ("access_token", tk.to_string()),
         (
             "filter",
             serde_json::to_string(&RoomEventFilter {
diff --git a/fractal-matrix-api/src/backend/mod.rs b/fractal-matrix-api/src/backend/mod.rs
index 82284ab6..24d8ccb7 100644
--- a/fractal-matrix-api/src/backend/mod.rs
+++ b/fractal-matrix-api/src/backend/mod.rs
@@ -13,6 +13,8 @@ use crate::error::Error;
 
 use crate::cache::CacheMap;
 
+use crate::r0::AccessToken;
+
 mod directory;
 mod media;
 pub mod register;
@@ -53,10 +55,18 @@ impl Backend {
         }
     }
 
-    fn url(&self, base: Url, path: &str, mut params: Vec<(&str, String)>) -> Result<Url, Error> {
-        let tk = self.data.lock().unwrap().access_token.clone();
+    fn get_access_token(&self) -> AccessToken {
+        AccessToken::from(self.data.lock().unwrap().access_token.clone())
+    }
 
-        params.push(("access_token", tk));
+    fn url(
+        &self,
+        base: Url,
+        tk: &AccessToken,
+        path: &str,
+        mut params: Vec<(&str, String)>,
+    ) -> Result<Url, Error> {
+        params.push(("access_token", tk.to_string()));
 
         client_url(&base, path, &params)
     }
diff --git a/fractal-matrix-api/src/backend/register.rs b/fractal-matrix-api/src/backend/register.rs
index 73cd6e9d..6e4cc0ae 100644
--- a/fractal-matrix-api/src/backend/register.rs
+++ b/fractal-matrix-api/src/backend/register.rs
@@ -51,7 +51,11 @@ pub fn guest(bk: &Backend, server: &str) -> Result<(), Error> {
         match query {
             Ok(response) => {
                 let uid = response.user_id;
-                let tk = response.access_token.unwrap_or_default();
+                let tk = response
+                    .access_token
+                    .as_ref()
+                    .map(ToString::to_string)
+                    .unwrap_or_default();
                 let dev = response.device_id;
 
                 data.lock().unwrap().user_id = uid.clone();
@@ -111,7 +115,11 @@ pub fn login(bk: &Backend, user: String, password: String, server: &str) -> Resu
         match query {
             Ok(response) => {
                 let uid = response.user_id.unwrap_or(user);
-                let tk = response.access_token.unwrap_or_default();
+                let tk = response
+                    .access_token
+                    .as_ref()
+                    .map(ToString::to_string)
+                    .unwrap_or_default();
                 let dev = response.device_id;
 
                 if uid.is_empty() || tk.is_empty() {
@@ -147,10 +155,9 @@ pub fn set_token(bk: &Backend, token: String, uid: String) {
 pub fn logout(bk: &Backend, server: Url) {
     let data = bk.data.clone();
     let tx = bk.tx.clone();
+    let access_token = bk.get_access_token();
 
-    let params = LogoutParameters {
-        access_token: data.lock().unwrap().access_token.clone(),
-    };
+    let params = LogoutParameters { access_token };
 
     thread::spawn(move || {
         let query = logout_req(server, &params)
@@ -200,7 +207,11 @@ pub fn register(bk: &Backend, user: String, password: String, server: &str) -> R
         match query {
             Ok(response) => {
                 let uid = response.user_id;
-                let tk = response.access_token.unwrap_or_default();
+                let tk = response
+                    .access_token
+                    .as_ref()
+                    .map(ToString::to_string)
+                    .unwrap_or_default();
                 let dev = response.device_id;
 
                 data.lock().unwrap().user_id = uid.clone();
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index a785bfc7..6fdfc2cc 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -30,6 +30,7 @@ use crate::backend::types::BackendData;
 use crate::backend::types::RoomType;
 
 use crate::r0::filter::RoomEventFilter;
+use crate::r0::AccessToken;
 use crate::types::ExtraContent;
 use crate::types::Member;
 use crate::types::Message;
@@ -48,7 +49,13 @@ pub fn set_room(bk: &Backend, base: Url, id: String) -> Result<(), Error> {
 }
 
 pub fn get_room_detail(bk: &Backend, base: Url, roomid: String, key: String) -> Result<(), Error> {
-    let url = bk.url(base, &format!("rooms/{}/state/{}", roomid, key), vec![])?;
+    let access_token = bk.get_access_token();
+    let url = bk.url(
+        base,
+        &access_token,
+        &format!("rooms/{}/state/{}", roomid, key),
+        vec![],
+    )?;
 
     let tx = bk.tx.clone();
     let keys = key.clone();
@@ -71,8 +78,10 @@ pub fn get_room_detail(bk: &Backend, base: Url, roomid: String, key: String) ->
 }
 
 pub fn get_room_avatar(bk: &Backend, baseu: Url, roomid: String) -> Result<(), Error> {
+    let access_token = bk.get_access_token();
     let url = bk.url(
         baseu.clone(),
+        &access_token,
         &format!("rooms/{}/state/m.room.avatar", roomid),
         vec![],
     )?;
@@ -111,7 +120,13 @@ pub fn get_room_avatar(bk: &Backend, baseu: Url, roomid: String) -> Result<(), E
 }
 
 pub fn get_room_members(bk: &Backend, base: Url, roomid: String) -> Result<(), Error> {
-    let url = bk.url(base, &format!("rooms/{}/joined_members", roomid), vec![])?;
+    let access_token = bk.get_access_token();
+    let url = bk.url(
+        base,
+        &access_token,
+        &format!("rooms/{}/joined_members", roomid),
+        vec![],
+    )?;
 
     let tx = bk.tx.clone();
     get!(
@@ -147,6 +162,7 @@ pub fn get_room_messages(
     roomid: String,
     from: String,
 ) -> Result<(), Error> {
+    let access_token = bk.get_access_token();
     let params = vec![
         ("from", from),
         ("dir", String::from("b")),
@@ -160,7 +176,12 @@ pub fn get_room_messages(
             .expect("Failed to serialize room messages request filter"),
         ),
     ];
-    let url = bk.url(base, &format!("rooms/{}/messages", roomid), params)?;
+    let url = bk.url(
+        base,
+        &access_token,
+        &format!("rooms/{}/messages", roomid),
+        params,
+    )?;
     let tx = bk.tx.clone();
     get!(
         &url,
@@ -184,7 +205,7 @@ pub fn get_room_messages(
 pub fn get_room_messages_from_msg(bk: &Backend, baseu: Url, roomid: String, msg: Message) {
     // first of all, we calculate the from param using the context api, then we call the
     // normal get_room_messages
-    let tk = bk.data.lock().unwrap().access_token.clone();
+    let tk = bk.get_access_token();
     let itx = bk.internal_tx.clone();
 
     thread::spawn(move || {
@@ -199,7 +220,7 @@ pub fn get_room_messages_from_msg(bk: &Backend, baseu: Url, roomid: String, msg:
 
 fn parse_context(
     tx: Sender<BKResponse>,
-    tk: String,
+    tk: AccessToken,
     baseu: Url,
     roomid: String,
     eid: &str,
@@ -210,7 +231,7 @@ fn parse_context(
         &format!("rooms/{}/context/{}", roomid, eid),
         &[
             ("limit", format!("{}", limit)),
-            ("access_token", tk.clone()),
+            ("access_token", tk.to_string()),
         ],
     )?;
 
@@ -259,7 +280,7 @@ fn parse_context(
 pub fn get_message_context(bk: &Backend, baseu: Url, msg: Message) -> Result<(), Error> {
     let tx = bk.tx.clone();
     let roomid = msg.room.clone();
-    let tk = bk.data.lock().unwrap().access_token.clone();
+    let tk = bk.get_access_token();
 
     parse_context(tx, tk, baseu, roomid, &msg.id, globals::PAGE_LIMIT)?;
 
@@ -268,9 +289,11 @@ pub fn get_message_context(bk: &Backend, baseu: Url, msg: Message) -> Result<(),
 
 pub fn send_msg(bk: &Backend, base: Url, msg: Message) -> Result<(), Error> {
     let roomid = msg.room.clone();
+    let access_token = bk.get_access_token();
 
     let url = bk.url(
         base,
+        &access_token,
         &format!("rooms/{}/send/m.room.message/{}", roomid, msg.id),
         vec![],
     )?;
@@ -317,8 +340,14 @@ pub fn send_msg(bk: &Backend, base: Url, msg: Message) -> Result<(), Error> {
 }
 
 pub fn send_typing(bk: &Backend, base: Url, roomid: String) -> Result<(), Error> {
+    let access_token = bk.get_access_token();
     let userid = bk.data.lock().unwrap().user_id.clone();
-    let url = bk.url(base, &format!("rooms/{}/typing/{}", roomid, userid), vec![])?;
+    let url = bk.url(
+        base,
+        &access_token,
+        &format!("rooms/{}/typing/{}", roomid, userid),
+        vec![],
+    )?;
 
     let attrs = json!({
         "timeout": 4000,
@@ -337,9 +366,11 @@ pub fn send_typing(bk: &Backend, base: Url, roomid: String) -> Result<(), Error>
 pub fn redact_msg(bk: &Backend, base: Url, msg: &Message) -> Result<(), Error> {
     let roomid = msg.room.clone();
     let txnid = msg.id.clone();
+    let access_token = bk.get_access_token();
 
     let url = bk.url(
         base,
+        &access_token,
         &format!("rooms/{}/redact/{}/{}", roomid, msg.id, txnid),
         vec![],
     )?;
@@ -371,8 +402,10 @@ pub fn redact_msg(bk: &Backend, base: Url, msg: &Message) -> Result<(), Error> {
 }
 
 pub fn join_room(bk: &Backend, base: Url, roomid: String) -> Result<(), Error> {
+    let access_token = bk.get_access_token();
     let url = bk.url(
         base,
+        &access_token,
         &format!("join/{}", urlencoding::encode(&roomid)),
         vec![],
     )?;
@@ -396,7 +429,13 @@ pub fn join_room(bk: &Backend, base: Url, roomid: String) -> Result<(), Error> {
 }
 
 pub fn leave_room(bk: &Backend, base: Url, roomid: &str) -> Result<(), Error> {
-    let url = bk.url(base, &format!("rooms/{}/leave", roomid), vec![])?;
+    let access_token = bk.get_access_token();
+    let url = bk.url(
+        base,
+        &access_token,
+        &format!("rooms/{}/leave", roomid),
+        vec![],
+    )?;
 
     let tx = bk.tx.clone();
     post!(
@@ -415,8 +454,10 @@ pub fn leave_room(bk: &Backend, base: Url, roomid: &str) -> Result<(), Error> {
 }
 
 pub fn mark_as_read(bk: &Backend, base: Url, roomid: &str, eventid: &str) -> Result<(), Error> {
+    let access_token = bk.get_access_token();
     let url = bk.url(
         base.clone(),
+        &access_token,
         &format!("rooms/{}/receipt/m.read/{}", roomid, eventid),
         vec![],
     )?;
@@ -440,7 +481,12 @@ pub fn mark_as_read(bk: &Backend, base: Url, roomid: &str, eventid: &str) -> Res
     // This event API call isn't in the current doc but I found this in the
     // matrix-js-sdk
     // https://github.com/matrix-org/matrix-js-sdk/blob/master/src/base-apis.js#L851
-    let url = bk.url(base, &format!("rooms/{}/read_markers", roomid), vec![])?;
+    let url = bk.url(
+        base,
+        &access_token,
+        &format!("rooms/{}/read_markers", roomid),
+        vec![],
+    )?;
     let attrs = json!({
         "m.fully_read": eventid,
         "m.read": json!(null),
@@ -451,7 +497,13 @@ pub fn mark_as_read(bk: &Backend, base: Url, roomid: &str, eventid: &str) -> Res
 }
 
 pub fn set_room_name(bk: &Backend, base: Url, roomid: &str, name: &str) -> Result<(), Error> {
-    let url = bk.url(base, &format!("rooms/{}/state/m.room.name", roomid), vec![])?;
+    let access_token = bk.get_access_token();
+    let url = bk.url(
+        base,
+        &access_token,
+        &format!("rooms/{}/state/m.room.name", roomid),
+        vec![],
+    )?;
 
     let attrs = json!({
         "name": name,
@@ -476,8 +528,10 @@ pub fn set_room_name(bk: &Backend, base: Url, roomid: &str, name: &str) -> Resul
 }
 
 pub fn set_room_topic(bk: &Backend, base: Url, roomid: &str, topic: &str) -> Result<(), Error> {
+    let access_token = bk.get_access_token();
     let url = bk.url(
         base,
+        &access_token,
         &format!("rooms/{}/state/m.room.topic", roomid),
         vec![],
     )?;
@@ -505,11 +559,12 @@ pub fn set_room_topic(bk: &Backend, base: Url, roomid: &str, topic: &str) -> Res
 }
 
 pub fn set_room_avatar(bk: &Backend, baseu: Url, roomid: &str, avatar: &str) -> Result<(), Error> {
-    let tk = bk.data.lock().unwrap().access_token.clone();
-    let params = &[("access_token", tk.clone())];
+    let tk = bk.get_access_token();
+    let params = &[("access_token", tk.to_string())];
     let mediaurl = media_url(&baseu, "upload", params)?;
     let roomurl = bk.url(
         baseu,
+        &tk,
         &format!("rooms/{}/state/m.room.avatar", roomid),
         vec![],
     )?;
@@ -555,7 +610,7 @@ pub fn attach_file(bk: &Backend, baseu: Url, mut msg: Message) -> Result<(), Err
 
     let tx = bk.tx.clone();
     let itx = bk.internal_tx.clone();
-    let tk = bk.data.lock().unwrap().access_token.clone();
+    let tk = bk.get_access_token();
 
     if fname.starts_with("mxc://") && thumb.starts_with("mxc://") {
         return send_msg(bk, baseu, msg);
@@ -599,7 +654,7 @@ pub fn attach_file(bk: &Backend, baseu: Url, mut msg: Message) -> Result<(), Err
     Ok(())
 }
 
-fn upload_file(tk: &str, baseu: &Url, fname: &str) -> Result<String, Error> {
+fn upload_file(tk: &AccessToken, baseu: &Url, fname: &str) -> Result<String, Error> {
     let mut file = File::open(fname)?;
     let mut contents: Vec<u8> = vec![];
     file.read_to_end(&mut contents)?;
@@ -620,7 +675,8 @@ pub fn new_room(
     privacy: RoomType,
     internal_id: String,
 ) -> Result<(), Error> {
-    let url = bk.url(base, "createRoom", vec![])?;
+    let access_token = bk.get_access_token();
+    let url = bk.url(base, &access_token, "createRoom", vec![])?;
     let attrs = json!({
         "invite": [],
         "invite_3pid": [],
@@ -697,7 +753,8 @@ pub fn direct_chat(
     user: &Member,
     internal_id: String,
 ) -> Result<(), Error> {
-    let url = bk.url(base.clone(), "createRoom", vec![])?;
+    let access_token = bk.get_access_token();
+    let url = bk.url(base.clone(), &access_token, "createRoom", vec![])?;
     let attrs = json!({
         "invite": [user.uid.clone()],
         "invite_3pid": [],
@@ -715,6 +772,7 @@ pub fn direct_chat(
     let userid = bk.data.lock().unwrap().user_id.clone();
     let direct_url = bk.url(
         base,
+        &access_token,
         &format!("user/{}/account_data/m.direct", userid),
         vec![],
     )?;
@@ -745,9 +803,11 @@ pub fn direct_chat(
 }
 
 pub fn add_to_fav(bk: &Backend, base: Url, roomid: String, tofav: bool) -> Result<(), Error> {
+    let access_token = bk.get_access_token();
     let userid = bk.data.lock().unwrap().user_id.clone();
     let url = bk.url(
         base,
+        &access_token,
         &format!("user/{}/rooms/{}/tags/m.favourite", userid, roomid),
         vec![],
     )?;
@@ -776,7 +836,13 @@ pub fn add_to_fav(bk: &Backend, base: Url, roomid: String, tofav: bool) -> Resul
 }
 
 pub fn invite(bk: &Backend, base: Url, roomid: &str, userid: &str) -> Result<(), Error> {
-    let url = bk.url(base, &format!("rooms/{}/invite", roomid), vec![])?;
+    let access_token = bk.get_access_token();
+    let url = bk.url(
+        base,
+        &access_token,
+        &format!("rooms/{}/invite", roomid),
+        vec![],
+    )?;
 
     let attrs = json!({
         "user_id": userid,
diff --git a/fractal-matrix-api/src/backend/stickers.rs b/fractal-matrix-api/src/backend/stickers.rs
index d9f99fbc..bcc65444 100644
--- a/fractal-matrix-api/src/backend/stickers.rs
+++ b/fractal-matrix-api/src/backend/stickers.rs
@@ -104,6 +104,7 @@ pub fn get_sticker_widget_id(bk: &Backend, then: BKCommand) -> Result<(), Error>
 }
 
 pub fn send(bk: &Backend, base: Url, roomid: &str, sticker: &Sticker) -> Result<(), Error> {
+    let access_token = bk.get_access_token();
     let now = Local::now();
     let msg = format!("{}{}{}", roomid, sticker.name, now.to_string());
     let digest = md5::compute(msg.as_bytes());
@@ -112,6 +113,7 @@ pub fn send(bk: &Backend, base: Url, roomid: &str, sticker: &Sticker) -> Result<
 
     let url = bk.url(
         base,
+        &access_token,
         &format!("rooms/{}/send/m.sticker/{}", roomid, id),
         vec![],
     )?;
diff --git a/fractal-matrix-api/src/backend/sync.rs b/fractal-matrix-api/src/backend/sync.rs
index 8ddda518..169f089e 100644
--- a/fractal-matrix-api/src/backend/sync.rs
+++ b/fractal-matrix-api/src/backend/sync.rs
@@ -33,6 +33,7 @@ pub fn sync(bk: &Backend, base: Url, new_since: Option<String>, initial: bool) {
     let tx = bk.tx.clone();
     let data = bk.data.clone();
     let userid = bk.data.lock().unwrap().user_id.clone();
+    let access_token = bk.get_access_token();
 
     let since = bk
         .data
@@ -83,11 +84,11 @@ pub fn sync(bk: &Backend, base: Url, new_since: Option<String>, initial: bool) {
     };
 
     let params = SyncParameters {
-        access_token: data.lock().unwrap().access_token.clone(),
+        access_token,
         filter,
         since: since.clone(),
         include_state: IncludeState::Changed(timeout),
-        ..Default::default()
+        set_presence: Default::default(),
     };
 
     thread::spawn(move || {
diff --git a/fractal-matrix-api/src/backend/user.rs b/fractal-matrix-api/src/backend/user.rs
index 6cca1db1..a54b26a6 100644
--- a/fractal-matrix-api/src/backend/user.rs
+++ b/fractal-matrix-api/src/backend/user.rs
@@ -111,7 +111,7 @@ pub fn get_username_async(base: Url, uid: String, tx: Sender<String>) {
 pub fn set_username(bk: &Backend, base: Url, name: String) {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let uid = bk.data.lock().unwrap().user_id.clone();
     let params = SetDisplayNameParameters { access_token };
     let body = SetDisplayNameBody {
@@ -137,7 +137,7 @@ pub fn set_username(bk: &Backend, base: Url, name: String) {
 pub fn get_threepid(bk: &Backend, base: Url) {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params = ThirdPartyIDParameters { access_token };
 
     thread::spawn(move || {
@@ -166,7 +166,7 @@ pub fn get_email_token(
 ) -> Result<(), Error> {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params = EmailTokenParameters { access_token };
     let body = EmailTokenBody {
         id_server: Url::parse(&identity)?.try_into()?,
@@ -214,7 +214,7 @@ pub fn get_phone_token(
 ) -> Result<(), Error> {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params = PhoneTokenParameters { access_token };
     let body = PhoneTokenBody {
         id_server: Url::parse(&identity)?.try_into()?,
@@ -263,7 +263,7 @@ pub fn add_threepid(
 ) -> Result<(), Error> {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params = AddThreePIDParameters { access_token };
     let body = AddThreePIDBody {
         three_pid_creds: ThreePIDCredentials {
@@ -327,7 +327,7 @@ pub fn submit_phone_token(
 pub fn delete_three_pid(bk: &Backend, base: Url, medium: Medium, address: String) {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params = DeleteThreePIDParameters { access_token };
     let body = DeleteThreePIDBody { address, medium };
 
@@ -356,7 +356,7 @@ pub fn change_password(
 ) {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params = ChangePasswordParameters { access_token };
     let body = ChangePasswordBody {
         new_password,
@@ -386,7 +386,7 @@ pub fn change_password(
 pub fn account_destruction(bk: &Backend, base: Url, user: String, password: String) {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params = DeactivateParameters { access_token };
     let body = DeactivateBody {
         auth: Some(AuthenticationData::Password {
@@ -441,7 +441,7 @@ pub fn set_user_avatar(bk: &Backend, base: Url, avatar: String) {
     let tx = bk.tx.clone();
 
     let id = bk.data.lock().unwrap().user_id.clone();
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params_upload = CreateContentParameters {
         access_token: access_token.clone(),
         filename: None,
@@ -522,7 +522,7 @@ pub fn get_user_info_async(
 pub fn search(bk: &Backend, base: Url, search_term: String) {
     let tx = bk.tx.clone();
 
-    let access_token = bk.data.lock().unwrap().access_token.clone();
+    let access_token = bk.get_access_token();
     let params = UserDirectoryParameters { access_token };
     let body = UserDirectoryBody {
         search_term,
diff --git a/fractal-matrix-api/src/r0.rs b/fractal-matrix-api/src/r0.rs
index 7acfc49e..46c5ae18 100644
--- a/fractal-matrix-api/src/r0.rs
+++ b/fractal-matrix-api/src/r0.rs
@@ -68,3 +68,26 @@ impl<T: AsRef<str>> Serialize for HostAndPort<T> {
         ser.serialize_str(&self.to_string())
     }
 }
+
+#[derive(Clone, Debug, Deserialize, Serialize)]
+pub struct AccessToken(String);
+
+impl AccessToken {
+    pub fn into_string(self) -> String {
+        self.0
+    }
+}
+
+impl Display for AccessToken {
+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+        write!(f, "{}", self.0)
+    }
+}
+
+// TODO: Remove this constructor when AccessToken is everywhere.
+// It should not be manually created from the client
+impl From<String> for AccessToken {
+    fn from(token: String) -> Self {
+        Self(token)
+    }
+}
diff --git a/fractal-matrix-api/src/r0/account/change_password.rs 
b/fractal-matrix-api/src/r0/account/change_password.rs
index 21e9cd01..58caa105 100644
--- a/fractal-matrix-api/src/r0/account/change_password.rs
+++ b/fractal-matrix-api/src/r0/account/change_password.rs
@@ -1,4 +1,5 @@
 use super::AuthenticationData;
+use crate::r0::AccessToken;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -7,8 +8,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    #[serde(skip_serializing_if = "String::is_empty")]
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/account/deactivate.rs b/fractal-matrix-api/src/r0/account/deactivate.rs
index 6a322a80..3a689133 100644
--- a/fractal-matrix-api/src/r0/account/deactivate.rs
+++ b/fractal-matrix-api/src/r0/account/deactivate.rs
@@ -1,4 +1,5 @@
 use super::AuthenticationData;
+use crate::r0::AccessToken;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -7,8 +8,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    #[serde(skip_serializing_if = "String::is_empty")]
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/account/login.rs b/fractal-matrix-api/src/r0/account/login.rs
index 763d40b2..6d91098e 100644
--- a/fractal-matrix-api/src/r0/account/login.rs
+++ b/fractal-matrix-api/src/r0/account/login.rs
@@ -1,4 +1,5 @@
 use super::Identifier;
+use crate::r0::AccessToken;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -28,7 +29,7 @@ pub enum Auth {
 
 #[derive(Clone, Debug, Deserialize)]
 pub struct Response {
-    pub access_token: Option<String>,
+    pub access_token: Option<AccessToken>,
     pub user_id: Option<String>,
     pub device_id: Option<String>,
 }
diff --git a/fractal-matrix-api/src/r0/account/logout.rs b/fractal-matrix-api/src/r0/account/logout.rs
index 11486953..7a73e5b9 100644
--- a/fractal-matrix-api/src/r0/account/logout.rs
+++ b/fractal-matrix-api/src/r0/account/logout.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -6,7 +7,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 pub fn request(base: Url, params: &Parameters) -> Result<Request, Error> {
diff --git a/fractal-matrix-api/src/r0/account/register.rs b/fractal-matrix-api/src/r0/account/register.rs
index 0f75dc78..7cc320e9 100644
--- a/fractal-matrix-api/src/r0/account/register.rs
+++ b/fractal-matrix-api/src/r0/account/register.rs
@@ -1,4 +1,5 @@
 use super::AuthenticationData;
+use crate::r0::AccessToken;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -53,7 +54,7 @@ pub struct Body {
 #[derive(Clone, Debug, Deserialize)]
 pub struct Response {
     pub user_id: String,
-    pub access_token: Option<String>,
+    pub access_token: Option<AccessToken>,
     pub device_id: Option<String>,
 }
 
diff --git a/fractal-matrix-api/src/r0/contact/create.rs b/fractal-matrix-api/src/r0/contact/create.rs
index 76db1892..522e42a5 100644
--- a/fractal-matrix-api/src/r0/contact/create.rs
+++ b/fractal-matrix-api/src/r0/contact/create.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::r0::ThreePIDCredentials;
 use reqwest::Client;
 use reqwest::Error;
@@ -8,7 +9,7 @@ use url::Url;
 
 #[derive(Debug, Clone, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/contact/delete.rs b/fractal-matrix-api/src/r0/contact/delete.rs
index 541b0058..b51ef56f 100644
--- a/fractal-matrix-api/src/r0/contact/delete.rs
+++ b/fractal-matrix-api/src/r0/contact/delete.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::r0::Medium;
 use reqwest::Client;
 use reqwest::Error;
@@ -7,7 +8,7 @@ use url::Url;
 
 #[derive(Debug, Clone, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/contact/get_identifiers.rs 
b/fractal-matrix-api/src/r0/contact/get_identifiers.rs
index 50d1d1d6..2fd56e66 100644
--- a/fractal-matrix-api/src/r0/contact/get_identifiers.rs
+++ b/fractal-matrix-api/src/r0/contact/get_identifiers.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::r0::Medium;
 use reqwest::Client;
 use reqwest::Error;
@@ -7,7 +8,7 @@ use url::Url;
 
 #[derive(Debug, Clone, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Debug, Clone, Deserialize)]
diff --git a/fractal-matrix-api/src/r0/contact/request_verification_token_email.rs 
b/fractal-matrix-api/src/r0/contact/request_verification_token_email.rs
index 826d7ed1..06e61004 100644
--- a/fractal-matrix-api/src/r0/contact/request_verification_token_email.rs
+++ b/fractal-matrix-api/src/r0/contact/request_verification_token_email.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::r0::HostAndPort;
 use crate::serde::option_url;
 use reqwest::Client;
@@ -8,7 +9,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/contact/request_verification_token_msisdn.rs 
b/fractal-matrix-api/src/r0/contact/request_verification_token_msisdn.rs
index f2e5f947..b5934b9f 100644
--- a/fractal-matrix-api/src/r0/contact/request_verification_token_msisdn.rs
+++ b/fractal-matrix-api/src/r0/contact/request_verification_token_msisdn.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::r0::HostAndPort;
 use crate::serde::option_url;
 use reqwest::Client;
@@ -8,7 +9,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/directory/post_public_rooms.rs 
b/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
index 51c0a4d0..dd0a5826 100644
--- a/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
+++ b/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::serde::{option_host, option_url};
 use reqwest::Client;
 use reqwest::Error;
@@ -8,7 +9,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
     #[serde(with = "option_host")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub server: Option<Host<String>>,
diff --git a/fractal-matrix-api/src/r0/media/create.rs b/fractal-matrix-api/src/r0/media/create.rs
index 183963d9..4080d973 100644
--- a/fractal-matrix-api/src/r0/media/create.rs
+++ b/fractal-matrix-api/src/r0/media/create.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::serde::url as serde_url;
 use reqwest::header::{HeaderValue, CONTENT_TYPE};
 use reqwest::Client;
@@ -8,7 +9,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
     pub filename: Option<String>,
 }
 
diff --git a/fractal-matrix-api/src/r0/profile/set_avatar_url.rs 
b/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
index 7c2b0de2..715235e1 100644
--- a/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
+++ b/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
@@ -7,7 +8,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/profile/set_display_name.rs 
b/fractal-matrix-api/src/r0/profile/set_display_name.rs
index 198c53ed..a399042e 100644
--- a/fractal-matrix-api/src/r0/profile/set_display_name.rs
+++ b/fractal-matrix-api/src/r0/profile/set_display_name.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -6,7 +7,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/search/user.rs b/fractal-matrix-api/src/r0/search/user.rs
index 48055b13..2fc55367 100644
--- a/fractal-matrix-api/src/r0/search/user.rs
+++ b/fractal-matrix-api/src/r0/search/user.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
@@ -7,7 +8,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 #[derive(Clone, Debug, Serialize)]
diff --git a/fractal-matrix-api/src/r0/sync/sync_events.rs b/fractal-matrix-api/src/r0/sync/sync_events.rs
index 37e74a7d..e23c3298 100644
--- a/fractal-matrix-api/src/r0/sync/sync_events.rs
+++ b/fractal-matrix-api/src/r0/sync/sync_events.rs
@@ -1,4 +1,5 @@
 use crate::r0::filter::{serialize_filter_as_str, Filter};
+use crate::r0::AccessToken;
 use crate::serde::duration_as_millis;
 use reqwest::Client;
 use reqwest::Error;
@@ -9,9 +10,9 @@ use std::collections::HashMap;
 use std::time::Duration;
 use url::Url;
 
-#[derive(Clone, Debug, Default, Serialize)]
+#[derive(Clone, Debug, Serialize)]
 pub struct Parameters<'a> {
-    pub access_token: String,
+    pub access_token: AccessToken,
     #[serde(serialize_with = "serialize_filter_as_str")]
     #[serde(skip_serializing_if = "Filter::is_default")]
     pub filter: Filter<'a>,
diff --git a/fractal-matrix-api/src/r0/thirdparty/get_supported_protocols.rs 
b/fractal-matrix-api/src/r0/thirdparty/get_supported_protocols.rs
index 892ff119..93c188dd 100644
--- a/fractal-matrix-api/src/r0/thirdparty/get_supported_protocols.rs
+++ b/fractal-matrix-api/src/r0/thirdparty/get_supported_protocols.rs
@@ -1,3 +1,4 @@
+use crate::r0::AccessToken;
 use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
@@ -9,7 +10,7 @@ use url::Url;
 
 #[derive(Debug, Clone, Serialize)]
 pub struct Parameters {
-    pub access_token: String,
+    pub access_token: AccessToken,
 }
 
 pub type Response = BTreeMap<String, Protocol>;
diff --git a/fractal-matrix-api/src/util.rs b/fractal-matrix-api/src/util.rs
index c293acd6..408d0111 100644
--- a/fractal-matrix-api/src/util.rs
+++ b/fractal-matrix-api/src/util.rs
@@ -22,6 +22,7 @@ use crate::client::Client;
 use crate::error::Error;
 use crate::r0::profile::get_profile::request as get_profile;
 use crate::r0::profile::get_profile::Response as GetProfileResponse;
+use crate::r0::AccessToken;
 
 use reqwest::header::CONTENT_LENGTH;
 
@@ -191,11 +192,11 @@ pub fn parse_m_direct(events: &Vec<JsonValue>) -> HashMap<String, Vec<String>> {
 
 pub fn get_prev_batch_from(
     baseu: &Url,
-    tk: &str,
+    tk: &AccessToken,
     roomid: &str,
     evid: &str,
 ) -> Result<String, Error> {
-    let params = &[("access_token", String::from(tk)), ("limit", 0.to_string())];
+    let params = &[("access_token", tk.to_string()), ("limit", 0.to_string())];
 
     let path = format!("rooms/{}/context/{}", roomid, evid);
     let url = client_url(baseu, &path, params)?;


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