Skip to content

Commit 0e622cc

Browse files
authored
Upgrade Ruma (phase 3)
This upgrade introduces support for room version 12[1]. [1]: https://matrix.org/blog/2025/07/security-predisclosure/) Signed-off-by: Kévin Commaille <[email protected]>
1 parent 6d562ef commit 0e622cc

File tree

31 files changed

+413
-163
lines changed

31 files changed

+413
-163
lines changed

Cargo.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ proptest = { version = "1.6.0", default-features = false, features = ["std"] }
5959
rand = "0.8.5"
6060
reqwest = { version = "0.12.12", default-features = false }
6161
rmp-serde = "1.3.0"
62-
ruma = { git = "https://github.com/ruma/ruma", rev = "7bae3d0c0b8edf008899ac2b04cf9722182eef68", features = [
62+
ruma = { git = "https://github.com/ruma/ruma", rev = "de19ebaf71af620eb17abaefd92e43153f9d041d", features = [
6363
"client-api-c",
6464
"compat-upload-signatures",
6565
"compat-arbitrary-length-ids",
@@ -77,7 +77,7 @@ ruma = { git = "https://github.com/ruma/ruma", rev = "7bae3d0c0b8edf008899ac2b04
7777
"unstable-msc4278",
7878
"unstable-msc4286",
7979
] }
80-
ruma-common = { git = "https://github.com/ruma/ruma", rev = "7bae3d0c0b8edf008899ac2b04cf9722182eef68" }
80+
ruma-common = { git = "https://github.com/ruma/ruma", rev = "de19ebaf71af620eb17abaefd92e43153f9d041d" }
8181
sentry = "0.36.0"
8282
sentry-tracing = "0.36.0"
8383
serde = { version = "1.0.217", features = ["rc"] }

bindings/matrix-sdk-ffi/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ All notable changes to this project will be documented in this file.
2525

2626
### Breaking changes:
2727

28+
- The `creator` field of `RoomInfo` has been renamed to `creators` and can now contain a list of
29+
user IDs, to reflect that a room can now have several creators, as introduced in room version 12.
30+
([#5436](https://github.com/matrix-org/matrix-rust-sdk/pull/5436))
31+
- The `PowerLevel` type was introduced to represent power levels instead of `i64` to differentiate
32+
the infinite power level of creators, as introduced in room version 12. It is used in
33+
`suggested_role_for_power_level`, `suggested_power_level_for_role` and `RoomMember`.
34+
([#5436](https://github.com/matrix-org/matrix-rust-sdk/pull/5436))
2835
- `Client::get_url` now returns a `Vec<u8>` instead of a `String`. It also throws an error when the
2936
response isn't status code 200 OK, instead of providing the error in the response body.
3037
([#5438](https://github.com/matrix-org/matrix-rust-sdk/pull/5438))

bindings/matrix-sdk-ffi/src/client.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ use ruma::{
7878
RoomAccountDataEvent as RumaRoomAccountDataEvent,
7979
},
8080
push::{HttpPusherData as RumaHttpPusherData, PushFormat as RumaPushFormat},
81+
room_version_rules::AuthorizationRules,
8182
OwnedDeviceId, OwnedServerName, RoomAliasId, RoomOrAliasId, ServerName,
8283
};
8384
use serde::{Deserialize, Serialize};
@@ -1911,7 +1912,7 @@ pub struct PowerLevels {
19111912

19121913
impl From<PowerLevels> for RoomPowerLevelsEventContent {
19131914
fn from(value: PowerLevels) -> Self {
1914-
let mut power_levels = RoomPowerLevelsEventContent::new();
1915+
let mut power_levels = RoomPowerLevelsEventContent::new(&AuthorizationRules::V1);
19151916

19161917
if let Some(users_default) = value.users_default {
19171918
power_levels.users_default = users_default.into();

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(),

bindings/matrix-sdk-ffi/src/room_member.rs

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use matrix_sdk::room::{RoomMember as SdkRoomMember, RoomMemberRole};
2-
use ruma::UserId;
2+
use ruma::{events::room::power_levels::UserPowerLevel, UserId};
33

44
use crate::error::{ClientError, NotYetImplemented};
55

@@ -57,16 +57,25 @@ impl TryFrom<matrix_sdk::ruma::events::room::member::MembershipState> for Member
5757
}
5858
}
5959

60+
/// Get the suggested role for the given power level.
61+
///
62+
/// Returns an error if the value of the power level is out of range for numbers
63+
/// accepted in canonical JSON.
6064
#[matrix_sdk_ffi_macros::export]
61-
pub fn suggested_role_for_power_level(power_level: i64) -> RoomMemberRole {
65+
pub fn suggested_role_for_power_level(
66+
power_level: PowerLevel,
67+
) -> Result<RoomMemberRole, ClientError> {
6268
// It's not possible to expose the constructor on the Enum through Uniffi ☹️
63-
RoomMemberRole::suggested_role_for_power_level(power_level)
69+
Ok(RoomMemberRole::suggested_role_for_power_level(power_level.try_into()?))
6470
}
6571

72+
/// Get the suggested power level for the given role.
73+
///
74+
/// Returns an error if the value of the power level is unsupported.
6675
#[matrix_sdk_ffi_macros::export]
67-
pub fn suggested_power_level_for_role(role: RoomMemberRole) -> i64 {
76+
pub fn suggested_power_level_for_role(role: RoomMemberRole) -> Result<PowerLevel, ClientError> {
6877
// It's not possible to expose methods on an Enum through Uniffi ☹️
69-
role.suggested_power_level()
78+
Ok(role.suggested_power_level().try_into()?)
7079
}
7180

7281
/// Generates a `matrix.to` permalink to the given userID.
@@ -83,8 +92,8 @@ pub struct RoomMember {
8392
pub avatar_url: Option<String>,
8493
pub membership: MembershipState,
8594
pub is_name_ambiguous: bool,
86-
pub power_level: i64,
87-
pub normalized_power_level: i64,
95+
pub power_level: PowerLevel,
96+
pub normalized_power_level: PowerLevel,
8897
pub is_ignored: bool,
8998
pub suggested_role_for_power_level: RoomMemberRole,
9099
pub membership_change_reason: Option<String>,
@@ -100,8 +109,8 @@ impl TryFrom<SdkRoomMember> for RoomMember {
100109
avatar_url: m.avatar_url().map(|a| a.to_string()),
101110
membership: m.membership().clone().try_into()?,
102111
is_name_ambiguous: m.name_ambiguous(),
103-
power_level: m.power_level(),
104-
normalized_power_level: m.normalized_power_level(),
112+
power_level: m.power_level().try_into()?,
113+
normalized_power_level: m.normalized_power_level().try_into()?,
105114
is_ignored: m.is_ignored(),
106115
suggested_role_for_power_level: m.suggested_role_for_power_level(),
107116
membership_change_reason: m.event().reason().map(|s| s.to_owned()),
@@ -130,3 +139,42 @@ impl TryFrom<matrix_sdk::room::RoomMemberWithSenderInfo> for RoomMemberWithSende
130139
})
131140
}
132141
}
142+
143+
#[derive(Clone, uniffi::Enum)]
144+
pub enum PowerLevel {
145+
/// The user is a room creator and has infinite power level.
146+
///
147+
/// This power level was introduced in room version 12.
148+
Infinite,
149+
150+
/// The user has the given power level.
151+
Value { value: i64 },
152+
}
153+
154+
impl TryFrom<UserPowerLevel> for PowerLevel {
155+
type Error = NotYetImplemented;
156+
157+
fn try_from(value: UserPowerLevel) -> Result<Self, Self::Error> {
158+
match value {
159+
UserPowerLevel::Infinite => Ok(Self::Infinite),
160+
UserPowerLevel::Int(value) => Ok(Self::Value { value: value.into() }),
161+
_ => Err(NotYetImplemented),
162+
}
163+
}
164+
}
165+
166+
impl TryFrom<PowerLevel> for UserPowerLevel {
167+
type Error = ClientError;
168+
169+
fn try_from(value: PowerLevel) -> Result<Self, Self::Error> {
170+
Ok(match value {
171+
PowerLevel::Infinite => Self::Infinite,
172+
PowerLevel::Value { value } => {
173+
Self::Int(value.try_into().map_err(|err| ClientError::Generic {
174+
msg: "Power level is out of range".to_owned(),
175+
details: Some(format!("{err:?}")),
176+
})?)
177+
}
178+
})
179+
}
180+
}

crates/matrix-sdk-base/CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ All notable changes to this project will be documented in this file.
77
## [Unreleased] - ReleaseDate
88

99
### Features
10+
- [**breaking**] `RoomCreateWithCreatorEventContent` has a new field
11+
`additional_creators` that allows to specify additional room creators beside
12+
the user sending the `m.room.create` event, introduced with room version 12.
13+
([#5436](https://github.com/matrix-org/matrix-rust-sdk/pull/5436))
1014
- [**breaking**] The `RoomInfo` method now remembers the inviter at the time
1115
when the `BaseClient::room_joined()` method was called. The caller is
1216
responsible to remember the inviter before a server request to join the room
@@ -16,6 +20,19 @@ All notable changes to this project will be documented in this file.
1620
([#5390](https://github.com/matrix-org/matrix-rust-sdk/pull/5390))
1721

1822
### Refactor
23+
- [**breaking**] `SyncOrStrippedState<RoomPowerLevelsEventContent>::power_levels()`
24+
takes `AuthorizationRules` and a list of creators, because creators can have
25+
infinite power levels, as introduced in room version 12.
26+
([#5436](https://github.com/matrix-org/matrix-rust-sdk/pull/5436))
27+
- [**breaking**] `RoomMember::power_level()` and
28+
`RoomMember::normalized_power_level()` now use `UserPowerLevel` to represent
29+
power levels instead of `i64` to differentiate the infinite power level of
30+
creators, as introduced in room version 12.
31+
([#5436](https://github.com/matrix-org/matrix-rust-sdk/pull/5436))
32+
- [**breaking**] The `creator()` methods of `Room` and `RoomInfo` have been
33+
renamed to `creators()` and can now return a list of user IDs, to reflect that
34+
a room can have several creators, as introduced in room version 12.
35+
([#5436](https://github.com/matrix-org/matrix-rust-sdk/pull/5436))
1936
- [**breaking**] `RoomInfo::room_version_or_default()` was replaced with
2037
`room_version_rules_or_default()`. The room version should only be used for
2138
display purposes. The rules contain flags for all the differences in behavior

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use ruma::{
3030
power_levels::{RoomPowerLevels, RoomPowerLevelsEventContent},
3131
},
3232
},
33+
room_version_rules::AuthorizationRules,
3334
serde::Raw,
3435
};
3536
use serde::Serialize;
@@ -517,10 +518,14 @@ impl MemberEvent {
517518

518519
impl SyncOrStrippedState<RoomPowerLevelsEventContent> {
519520
/// The power levels of the event.
520-
pub fn power_levels(&self) -> RoomPowerLevels {
521+
pub fn power_levels(
522+
&self,
523+
rules: &AuthorizationRules,
524+
creators: Vec<OwnedUserId>,
525+
) -> RoomPowerLevels {
521526
match self {
522-
Self::Sync(e) => e.power_levels(),
523-
Self::Stripped(e) => e.power_levels(),
527+
Self::Sync(e) => e.power_levels(rules, creators),
528+
Self::Stripped(e) => e.power_levels(rules, creators),
524529
}
525530
}
526531
}

0 commit comments

Comments
 (0)