base: Respect the history visiblity setting when sharing group sessions
parent
bdaed6237e
commit
347f79d08c
|
@ -31,7 +31,10 @@ use matrix_sdk_common::{
|
||||||
},
|
},
|
||||||
events::{
|
events::{
|
||||||
presence::PresenceEvent,
|
presence::PresenceEvent,
|
||||||
room::member::{MemberEventContent, MembershipState},
|
room::{
|
||||||
|
history_visibility::HistoryVisibility,
|
||||||
|
member::{MemberEventContent, MembershipState},
|
||||||
|
},
|
||||||
AnyBasicEvent, AnyStrippedStateEvent, AnySyncRoomEvent, AnySyncStateEvent,
|
AnyBasicEvent, AnyStrippedStateEvent, AnySyncRoomEvent, AnySyncStateEvent,
|
||||||
AnyToDeviceEvent, EventContent, StateEvent,
|
AnyToDeviceEvent, EventContent, StateEvent,
|
||||||
},
|
},
|
||||||
|
@ -1154,9 +1157,21 @@ impl BaseClient {
|
||||||
|
|
||||||
match &*olm {
|
match &*olm {
|
||||||
Some(o) => {
|
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 joined = self.store.get_joined_user_ids(room_id).await?;
|
||||||
let invited = self.store.get_invited_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(
|
Ok(
|
||||||
o.share_group_session(room_id, members, EncryptionSettings::default())
|
o.share_group_session(room_id, members, EncryptionSettings::default())
|
||||||
.await?,
|
.await?,
|
||||||
|
|
|
@ -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.
|
/// Are the members for this room synced.
|
||||||
pub fn are_members_synced(&self) -> bool {
|
pub fn are_members_synced(&self) -> bool {
|
||||||
if let RoomState::Joined(r) = self {
|
if let RoomState::Joined(r) = self {
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
use std::sync::{Arc, Mutex as SyncMutex};
|
use std::sync::{Arc, Mutex as SyncMutex};
|
||||||
|
|
||||||
use matrix_sdk_common::{
|
use matrix_sdk_common::{
|
||||||
events::AnyStrippedStateEvent,
|
events::{room::history_visibility::HistoryVisibility, AnyStrippedStateEvent},
|
||||||
identifiers::{RoomId, UserId},
|
identifiers::{RoomId, UserId},
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -96,6 +96,16 @@ impl StrippedRoom {
|
||||||
self.inner.lock().unwrap().base_info.encryption.is_some()
|
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
|
/// Calculate the canonical display name of the room, taking into account
|
||||||
/// its name, aliases and members.
|
/// its name, aliases and members.
|
||||||
///
|
///
|
||||||
|
|
Loading…
Reference in New Issue