From 347f79d08c18a52824452b95901cb0e8191ad713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 3 Feb 2021 13:56:31 +0100 Subject: [PATCH] base: Respect the history visiblity setting when sharing group sessions --- matrix_sdk_base/src/client.rs | 19 +++++++++++++++++-- matrix_sdk_base/src/rooms/mod.rs | 9 +++++++++ matrix_sdk_base/src/rooms/stripped.rs | 12 +++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/matrix_sdk_base/src/client.rs b/matrix_sdk_base/src/client.rs index 81b339c8..479608c1 100644 --- a/matrix_sdk_base/src/client.rs +++ b/matrix_sdk_base/src/client.rs @@ -31,7 +31,10 @@ use matrix_sdk_common::{ }, events::{ presence::PresenceEvent, - room::member::{MemberEventContent, MembershipState}, + room::{ + history_visibility::HistoryVisibility, + member::{MemberEventContent, MembershipState}, + }, AnyBasicEvent, AnyStrippedStateEvent, AnySyncRoomEvent, AnySyncStateEvent, AnyToDeviceEvent, EventContent, StateEvent, }, @@ -1154,9 +1157,21 @@ impl BaseClient { match &*olm { Some(o) => { + let history_visiblity = self + .get_room(room_id) + .map(|r| r.history_visiblity()) + .unwrap_or(HistoryVisibility::Joined); let joined = self.store.get_joined_user_ids(room_id).await?; let invited = self.store.get_invited_user_ids(room_id).await?; - let members = joined.iter().chain(&invited); + + // Don't share the group session with members that are invited + // if the history visiblity is set to `Joined` + let members = if history_visiblity == HistoryVisibility::Joined { + joined.iter().chain(&[]) + } else { + joined.iter().chain(&invited) + }; + Ok( o.share_group_session(room_id, members, EncryptionSettings::default()) .await?, diff --git a/matrix_sdk_base/src/rooms/mod.rs b/matrix_sdk_base/src/rooms/mod.rs index 6b7360ce..200271a6 100644 --- a/matrix_sdk_base/src/rooms/mod.rs +++ b/matrix_sdk_base/src/rooms/mod.rs @@ -80,6 +80,15 @@ impl RoomState { } } + /// Get the history visiblity policy of this room. + pub fn history_visiblity(&self) -> HistoryVisibility { + match self { + RoomState::Joined(r) => r.inner.history_visibility(), + RoomState::Left(r) => r.inner.history_visibility(), + RoomState::Invited(r) => r.inner.history_visibility(), + } + } + /// Are the members for this room synced. pub fn are_members_synced(&self) -> bool { if let RoomState::Joined(r) = self { diff --git a/matrix_sdk_base/src/rooms/stripped.rs b/matrix_sdk_base/src/rooms/stripped.rs index 447e4886..ffcb6654 100644 --- a/matrix_sdk_base/src/rooms/stripped.rs +++ b/matrix_sdk_base/src/rooms/stripped.rs @@ -15,7 +15,7 @@ use std::sync::{Arc, Mutex as SyncMutex}; use matrix_sdk_common::{ - events::AnyStrippedStateEvent, + events::{room::history_visibility::HistoryVisibility, AnyStrippedStateEvent}, identifiers::{RoomId, UserId}, }; use serde::{Deserialize, Serialize}; @@ -96,6 +96,16 @@ impl StrippedRoom { self.inner.lock().unwrap().base_info.encryption.is_some() } + /// Get the history visiblity policy of this room. + pub fn history_visibility(&self) -> HistoryVisibility { + self.inner + .lock() + .unwrap() + .base_info + .history_visibility + .clone() + } + /// Calculate the canonical display name of the room, taking into account /// its name, aliases and members. ///