[fractal] Fix #606
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] Fix #606
- Date: Thu, 26 Mar 2020 07:23:20 +0000 (UTC)
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]