[fractal] Fix #606



commit 198a86135e8352caa01e751a2b28c60d493cd862
Author: Alejandro Domínguez <adomu net-c com>
Date:   Tue Mar 24 23:57:51 2020 +0100

    Fix #606

 fractal-matrix-api/src/backend/sync.rs               |  4 +---
 fractal-matrix-api/src/model/room.rs                 |  2 +-
 fractal-matrix-api/src/r0/profile/set_avatar_url.rs  |  1 +
 fractal-matrix-api/src/r0/search/user.rs             |  1 -
 fractal-matrix-api/src/r0/sync/get_joined_members.rs |  1 +
 fractal-matrix-api/src/serde.rs                      |  8 +++++++-
 fractal-matrix-api/src/util.rs                       | 12 ++++++++----
 7 files changed, 19 insertions(+), 10 deletions(-)
---
diff --git a/fractal-matrix-api/src/backend/sync.rs b/fractal-matrix-api/src/backend/sync.rs
index dd310939..d008eda7 100644
--- a/fractal-matrix-api/src/backend/sync.rs
+++ b/fractal-matrix-api/src/backend/sync.rs
@@ -243,9 +243,7 @@ pub fn sync(
                             }
                         });
                 } else {
-                    if let Ok(m_direct) = parse_m_direct(&response.account_data.events) {
-                        data.lock().unwrap().m_direct = m_direct;
-                    }
+                    data.lock().unwrap().m_direct = parse_m_direct(&response.account_data.events);
 
                     let rooms_def =
                         Room::from_sync_response(&response, user_id, &base)
diff --git a/fractal-matrix-api/src/model/room.rs b/fractal-matrix-api/src/model/room.rs
index e49ee5d0..a0b0b12e 100644
--- a/fractal-matrix-api/src/model/room.rs
+++ b/fractal-matrix-api/src/model/room.rs
@@ -135,7 +135,7 @@ impl Room {
         baseu: &Url,
     ) -> Result<Vec<Self>, IdError> {
         // getting the list of direct rooms
-        let direct: HashSet<RoomId> = parse_m_direct(&response.account_data.events)?
+        let direct: HashSet<RoomId> = parse_m_direct(&response.account_data.events)
             .values()
             .flatten()
             .cloned()
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 9002fa7e..e5582535 100644
--- a/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
+++ b/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
@@ -15,6 +15,7 @@ pub struct Parameters {
 #[derive(Clone, Debug, Serialize)]
 pub struct Body {
     #[serde(with = "option_url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
     pub avatar_url: Option<Url>,
 }
 
diff --git a/fractal-matrix-api/src/r0/search/user.rs b/fractal-matrix-api/src/r0/search/user.rs
index 14994959..08be068a 100644
--- a/fractal-matrix-api/src/r0/search/user.rs
+++ b/fractal-matrix-api/src/r0/search/user.rs
@@ -37,7 +37,6 @@ pub struct Response {
 #[derive(Clone, Debug, Deserialize)]
 pub struct User {
     pub user_id: UserId,
-    #[serde(default)]
     pub display_name: Option<String>,
     #[serde(with = "option_url")]
     #[serde(default)]
diff --git a/fractal-matrix-api/src/r0/sync/get_joined_members.rs 
b/fractal-matrix-api/src/r0/sync/get_joined_members.rs
index 39a68646..dc65c18c 100644
--- a/fractal-matrix-api/src/r0/sync/get_joined_members.rs
+++ b/fractal-matrix-api/src/r0/sync/get_joined_members.rs
@@ -23,6 +23,7 @@ pub struct Response {
 pub struct RoomMember {
     pub display_name: Option<String>,
     #[serde(with = "option_url")]
+    #[serde(default)]
     pub avatar_url: Option<Url>,
 }
 
diff --git a/fractal-matrix-api/src/serde.rs b/fractal-matrix-api/src/serde.rs
index c9bdec8a..63df68ae 100644
--- a/fractal-matrix-api/src/serde.rs
+++ b/fractal-matrix-api/src/serde.rs
@@ -72,7 +72,13 @@ pub mod option_url {
         where
             D: Deserializer<'de>,
         {
-            serde_url::deserialize(de).map(Some)
+            // serde_url::deserialize(de).map(Some)
+            //
+            // Using an alternative way because Synapse sends empty strings
+            // and junk data as url, so instead of failing it returns an
+            // empty value (see #606 "relative URL without a base" error)
+
+            Ok(serde_url::deserialize(de).ok())
         }
     }
 
diff --git a/fractal-matrix-api/src/util.rs b/fractal-matrix-api/src/util.rs
index 4ac33d5b..284a5f49 100644
--- a/fractal-matrix-api/src/util.rs
+++ b/fractal-matrix-api/src/util.rs
@@ -171,7 +171,7 @@ impl ContentType {
     }
 }
 
-pub fn parse_m_direct(events: &Vec<JsonValue>) -> Result<HashMap<UserId, Vec<RoomId>>, IdError> {
+pub fn parse_m_direct(events: &Vec<JsonValue>) -> HashMap<UserId, Vec<RoomId>> {
     events
         .iter()
         .find(|x| x["type"] == "m.direct")
@@ -179,14 +179,18 @@ pub fn parse_m_direct(events: &Vec<JsonValue>) -> Result<HashMap<UserId, Vec<Roo
         .cloned()
         .unwrap_or_default()
         .iter()
-        .map(|(uid, rid)| {
+        // Synapse sometimes sends an object with the key "[object Object]"
+        // instead of a user ID, so we have to skip those invalid objects
+        // in the array in order to avoid discarding everything
+        .filter_map(|(uid, rid)| {
             let value = rid
                 .as_array()
                 .unwrap_or(&vec![])
                 .iter()
                 .map(|rid| RoomId::try_from(rid.as_str().unwrap_or_default()))
-                .collect::<Result<Vec<RoomId>, IdError>>()?;
-            Ok((UserId::try_from(uid.as_str())?, value))
+                .collect::<Result<Vec<RoomId>, IdError>>()
+                .ok()?;
+            Some((UserId::try_from(uid.as_str()).ok()?, value))
         })
         .collect()
 }


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