Skip to content

Commit 702a157

Browse files
committed
refactor: Adapt to addition of additional_creators in RoomCreateEventContent
1 parent 222e088 commit 702a157

File tree

6 files changed

+58
-23
lines changed

6 files changed

+58
-23
lines changed

bindings/matrix-sdk-ffi/src/room/room_info.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::{
1717
pub struct RoomInfo {
1818
id: String,
1919
encryption_state: EncryptionState,
20-
creator: Option<String>,
20+
creators: Option<Vec<String>>,
2121
/// The room's name from the room state event if received from sync, or one
2222
/// that's been computed otherwise.
2323
display_name: Option<String>,
@@ -102,7 +102,9 @@ impl RoomInfo {
102102
Ok(Self {
103103
id: room.room_id().to_string(),
104104
encryption_state: room.encryption_state(),
105-
creator: room.creator().as_ref().map(ToString::to_string),
105+
creators: room
106+
.creators()
107+
.map(|creators| creators.into_iter().map(Into::into).collect()),
106108
display_name: room.cached_display_name().map(|name| name.to_string()),
107109
raw_name: room.name(),
108110
topic: room.topic(),

crates/matrix-sdk-base/src/room/create.rs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
use matrix_sdk_common::ROOM_VERSION_RULES_FALLBACK;
1516
use ruma::{
1617
assign,
1718
events::{
@@ -70,18 +71,38 @@ pub struct RoomCreateWithCreatorEventContent {
7071
/// This is currently only used for spaces.
7172
#[serde(skip_serializing_if = "Option::is_none", rename = "type")]
7273
pub room_type: Option<RoomType>,
74+
75+
/// Additional room creators, considered to have "infinite" power level, in
76+
/// room versions 12 onwards.
77+
#[serde(skip_serializing_if = "Vec::is_empty", default)]
78+
pub additional_creators: Vec<OwnedUserId>,
7379
}
7480

7581
impl RoomCreateWithCreatorEventContent {
7682
/// Constructs a `RoomCreateWithCreatorEventContent` with the given original
7783
/// content and sender.
7884
pub fn from_event_content(content: RoomCreateEventContent, sender: OwnedUserId) -> Self {
79-
let RoomCreateEventContent { federate, room_version, predecessor, room_type, .. } = content;
80-
Self { creator: sender, federate, room_version, predecessor, room_type }
85+
let RoomCreateEventContent {
86+
federate,
87+
room_version,
88+
predecessor,
89+
room_type,
90+
additional_creators,
91+
..
92+
} = content;
93+
Self {
94+
creator: sender,
95+
federate,
96+
room_version,
97+
predecessor,
98+
room_type,
99+
additional_creators,
100+
}
81101
}
82102

83103
fn into_event_content(self) -> (RoomCreateEventContent, OwnedUserId) {
84-
let Self { creator, federate, room_version, predecessor, room_type } = self;
104+
let Self { creator, federate, room_version, predecessor, room_type, additional_creators } =
105+
self;
85106

86107
#[allow(deprecated)]
87108
let content = assign!(RoomCreateEventContent::new_v11(), {
@@ -90,10 +111,25 @@ impl RoomCreateWithCreatorEventContent {
90111
room_version,
91112
predecessor,
92113
room_type,
114+
additional_creators,
93115
});
94116

95117
(content, creator)
96118
}
119+
120+
/// Get the creators of the room from this content, according to the room
121+
/// version.
122+
pub(crate) fn creators(&self) -> Vec<OwnedUserId> {
123+
let rules = self.room_version.rules().unwrap_or(ROOM_VERSION_RULES_FALLBACK);
124+
125+
if rules.authorization.explicitly_privilege_room_creators {
126+
std::iter::once(self.creator.clone())
127+
.chain(self.additional_creators.iter().cloned())
128+
.collect()
129+
} else {
130+
vec![self.creator.clone()]
131+
}
132+
}
97133
}
98134

99135
/// Redacted form of [`RoomCreateWithCreatorEventContent`].

crates/matrix-sdk-base/src/room/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ impl Room {
157157
&self.room_id
158158
}
159159

160-
/// Get a copy of the room creator.
161-
pub fn creator(&self) -> Option<OwnedUserId> {
162-
self.inner.read().creator().map(ToOwned::to_owned)
160+
/// Get a copy of the room creators.
161+
pub fn creators(&self) -> Option<Vec<OwnedUserId>> {
162+
self.inner.read().creators()
163163
}
164164

165165
/// Get our own user id.

crates/matrix-sdk-base/src/room/room_info.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ use ruma::{
5050
room_version_rules::{RedactionRules, RoomVersionRules},
5151
serde::Raw,
5252
EventId, MilliSecondsSinceUnixEpoch, MxcUri, OwnedEventId, OwnedMxcUri, OwnedRoomAliasId,
53-
OwnedRoomId, OwnedUserId, RoomAliasId, RoomId, RoomVersionId, UserId,
53+
OwnedRoomId, OwnedUserId, RoomAliasId, RoomId, RoomVersionId,
5454
};
5555
use serde::{Deserialize, Serialize};
5656
use tracing::{debug, error, field::debug, info, instrument, warn};
@@ -879,11 +879,11 @@ impl RoomInfo {
879879
}
880880
}
881881

882-
/// Get the creator of this room.
883-
pub fn creator(&self) -> Option<&UserId> {
882+
/// Get the creators of this room.
883+
pub fn creators(&self) -> Option<Vec<OwnedUserId>> {
884884
match self.base_info.create.as_ref()? {
885-
MinimalStateEvent::Original(ev) => Some(&ev.content.creator),
886-
MinimalStateEvent::Redacted(ev) => Some(&ev.content.creator),
885+
MinimalStateEvent::Original(ev) => Some(ev.content.creators()),
886+
MinimalStateEvent::Redacted(ev) => Some(ev.content.creators()),
887887
}
888888
}
889889

crates/matrix-sdk-base/src/utils.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,10 @@ impl From<&StrippedRoomNameEvent> for MinimalStateEvent<RoomNameEventContent> {
234234

235235
impl From<&StrippedRoomCreateEvent> for MinimalStateEvent<RoomCreateWithCreatorEventContent> {
236236
fn from(event: &StrippedRoomCreateEvent) -> Self {
237-
let content = RoomCreateWithCreatorEventContent {
238-
creator: event.sender.clone(),
239-
federate: event.content.federate,
240-
room_version: event.content.room_version.clone(),
241-
predecessor: event.content.predecessor.clone(),
242-
room_type: event.content.room_type.clone(),
243-
};
237+
let content = RoomCreateWithCreatorEventContent::from_event_content(
238+
event.content.clone(),
239+
event.sender.clone(),
240+
);
244241
Self::Original(OriginalMinimalStateEvent { content, event_id: None })
245242
}
246243
}

crates/matrix-sdk-sqlite/src/state_store.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2463,15 +2463,15 @@ mod migration_tests {
24632463

24642464
let room_a = room_infos.iter().find(|r| r.room_id() == room_a_id).unwrap();
24652465
assert_eq!(room_a.name(), Some(room_a_name));
2466-
assert_eq!(room_a.creator(), Some(room_a_create_sender));
2466+
assert_eq!(room_a.creators(), Some(vec![room_a_create_sender.to_owned()]));
24672467

24682468
let room_b = room_infos.iter().find(|r| r.room_id() == room_b_id).unwrap();
24692469
assert_eq!(room_b.name(), None);
2470-
assert_eq!(room_b.creator(), None);
2470+
assert_eq!(room_b.creators(), None);
24712471

24722472
let room_c = room_infos.iter().find(|r| r.room_id() == room_c_id).unwrap();
24732473
assert_eq!(room_c.name(), None);
2474-
assert_eq!(room_c.creator(), Some(room_c_create_sender));
2474+
assert_eq!(room_c.creators(), Some(vec![room_c_create_sender.to_owned()]));
24752475
}
24762476

24772477
#[async_test]

0 commit comments

Comments
 (0)