From c5c8934db7fb6c6f1069a46fe0ae6f4d69b85406 Mon Sep 17 00:00:00 2001 From: strawberry Date: Tue, 16 Apr 2024 18:03:51 -0400 Subject: [PATCH] default to shared room history visibility if invalid (per spec) Signed-off-by: strawberry --- src/api/client_server/directory.rs | 9 ++++---- src/service/rooms/spaces/mod.rs | 11 +++++++-- src/service/rooms/state_accessor/mod.rs | 30 ++++++++++++++++++++----- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/api/client_server/directory.rs b/src/api/client_server/directory.rs index 2ec9bf67..f1d70e9a 100644 --- a/src/api/client_server/directory.rs +++ b/src/api/client_server/directory.rs @@ -254,8 +254,8 @@ pub(crate) async fn get_public_rooms_filtered_helper( .map_or(Ok(None), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomTopicEventContent| Some(c.topic)) - .map_err(|_| { - error!("Invalid room topic event in database for room {}", room_id); + .map_err(|e| { + error!("Invalid room topic event in database for room {room_id}: {e}"); Error::bad_database("Invalid room topic event in database.") }) }) @@ -271,11 +271,10 @@ pub(crate) async fn get_public_rooms_filtered_helper( }) .map_err(|e| { error!( - "Invalid room history visibility event in database for room {}: {e}", - &room_id + "Invalid room history visibility event in database for room {room_id}, assuming is \"shared\": {e}", ); Error::bad_database("Invalid room history visibility event in database.") - })})?, + })}).unwrap_or(false), guest_can_join: services() .rooms .state_accessor diff --git a/src/service/rooms/spaces/mod.rs b/src/service/rooms/spaces/mod.rs index 50ee1687..5f31828f 100644 --- a/src/service/rooms/spaces/mod.rs +++ b/src/service/rooms/spaces/mod.rs @@ -832,15 +832,22 @@ fn guest_can_join(room_id: &RoomId) -> Result { /// Checks if guests are able to view room content without joining fn world_readable(room_id: &RoomId) -> Result { - services() + Ok(services() .rooms .state_accessor .room_state_get(room_id, &StateEventType::RoomHistoryVisibility, "")? .map_or(Ok(false), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomHistoryVisibilityEventContent| c.history_visibility == HistoryVisibility::WorldReadable) - .map_err(|_| Error::bad_database("Invalid room history visibility event in database.")) + .map_err(|e| { + error!( + "Invalid room history visibility event in database for room {room_id}, assuming is \ + \"shared\": {e} " + ); + Error::bad_database("Invalid room history visibility event in database.") + }) }) + .unwrap_or(false)) } /// Returns the join rule for a given room diff --git a/src/service/rooms/state_accessor/mod.rs b/src/service/rooms/state_accessor/mod.rs index 57fbcd77..e03e5464 100644 --- a/src/service/rooms/state_accessor/mod.rs +++ b/src/service/rooms/state_accessor/mod.rs @@ -107,8 +107,15 @@ impl Service { .map_or(Ok(HistoryVisibility::Shared), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomHistoryVisibilityEventContent| c.history_visibility) - .map_err(|_| Error::bad_database("Invalid history visibility event in database.")) - })?; + .map_err(|e| { + error!( + "Invalid history visibility event in database for room {room_id}, assuming is \"shared\": \ + {e}" + ); + Error::bad_database("Invalid history visibility event in database.") + }) + }) + .unwrap_or(HistoryVisibility::Shared); let mut current_server_members = services() .rooms @@ -165,8 +172,15 @@ impl Service { .map_or(Ok(HistoryVisibility::Shared), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomHistoryVisibilityEventContent| c.history_visibility) - .map_err(|_| Error::bad_database("Invalid history visibility event in database.")) - })?; + .map_err(|e| { + error!( + "Invalid history visibility event in database for room {room_id}, assuming is \"shared\": \ + {e}" + ); + Error::bad_database("Invalid history visibility event in database.") + }) + }) + .unwrap_or(HistoryVisibility::Shared); let visibility = match history_visibility { HistoryVisibility::WorldReadable => true, @@ -205,10 +219,14 @@ impl Service { serde_json::from_str(s.content.get()) .map(|c: RoomHistoryVisibilityEventContent| c.history_visibility) .map_err(|e| { - error!("Invalid history visibility event in database for room {}: {e}", &room_id); + error!( + "Invalid history visibility event in database for room {room_id}, assuming is \"shared\": \ + {e}" + ); Error::bad_database("Invalid history visibility event in database.") }) - })?; + }) + .unwrap_or(HistoryVisibility::Shared); Ok(currently_member || history_visibility == HistoryVisibility::WorldReadable) }