events: Make creator field of RoomCreateEventContent optional and RedactedRoomreateEventContent a typedef
According to MSC2175
This commit is contained in:
parent
ffdd632701
commit
1701d9a803
@ -162,7 +162,7 @@ pub mod v3 {
|
||||
creator: OwnedUserId,
|
||||
room_version: RoomVersionId,
|
||||
) -> RoomCreateEventContent {
|
||||
assign!(RoomCreateEventContent::new(creator), {
|
||||
assign!(RoomCreateEventContent::new_v1(creator), {
|
||||
federate: self.federate,
|
||||
room_version: room_version,
|
||||
predecessor: self.predecessor,
|
||||
|
@ -29,6 +29,10 @@ Breaking changes:
|
||||
according to MSC2174 / MSC3820
|
||||
- `RoomRedactionEventContent::new()` was renamed to `new_v1()`, and `with_reason()` is no
|
||||
longer a constructor but a builder-type method
|
||||
- Make the `creator` field of `RoomCreateEventContent` optional and deprecate it, as it was removed
|
||||
in room version 11, according to MSC2175 / MSC3820
|
||||
- `RoomCreateEventContent::new()` was renamed to `new_v1()`
|
||||
- `RedactedRoomCreateEventContent` is now a typedef over `RoomCreateEventContent`
|
||||
|
||||
Improvements:
|
||||
|
||||
|
@ -6,7 +6,9 @@ use ruma_macros::EventContent;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
events::EmptyStateKey, room::RoomType, OwnedEventId, OwnedRoomId, OwnedUserId, RoomVersionId,
|
||||
events::{EmptyStateKey, RedactContent, RedactedStateEventContent},
|
||||
room::RoomType,
|
||||
OwnedEventId, OwnedRoomId, OwnedUserId, RoomVersionId,
|
||||
};
|
||||
|
||||
/// The content of an `m.room.create` event.
|
||||
@ -16,13 +18,17 @@ use crate::{
|
||||
/// It acts as the root of all other events.
|
||||
#[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
|
||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||
#[ruma_event(type = "m.room.create", kind = State, state_key_type = EmptyStateKey)]
|
||||
#[ruma_event(type = "m.room.create", kind = State, state_key_type = EmptyStateKey, custom_redacted)]
|
||||
pub struct RoomCreateEventContent {
|
||||
/// The `user_id` of the room creator.
|
||||
///
|
||||
/// This is set by the homeserver.
|
||||
#[ruma_event(skip_redaction)]
|
||||
pub creator: OwnedUserId,
|
||||
///
|
||||
/// This is required in room versions 1 trough 10, but is removed starting from room version
|
||||
/// 11.
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
#[deprecated = "Since Matrix 1.8. This field was removed in Room version 11, clients should use the event's sender instead"]
|
||||
pub creator: Option<OwnedUserId>,
|
||||
|
||||
/// Whether or not this room's data should be transferred to other homeservers.
|
||||
#[serde(
|
||||
@ -50,16 +56,58 @@ pub struct RoomCreateEventContent {
|
||||
}
|
||||
|
||||
impl RoomCreateEventContent {
|
||||
/// Creates a new `RoomCreateEventContent` with the given creator.
|
||||
pub fn new(creator: OwnedUserId) -> Self {
|
||||
/// Creates a new `RoomCreateEventContent` with the given creator, as required for room versions
|
||||
/// 1 through 10.
|
||||
pub fn new_v1(creator: OwnedUserId) -> Self {
|
||||
#[allow(deprecated)]
|
||||
Self {
|
||||
creator,
|
||||
creator: Some(creator),
|
||||
federate: true,
|
||||
room_version: default_room_version_id(),
|
||||
predecessor: None,
|
||||
room_type: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new `RoomCreateEventContent` with the default values and no creator, as introduced
|
||||
/// in room version 11.
|
||||
///
|
||||
/// The room version is set to [`RoomVersionId::V11`].
|
||||
pub fn new_v11() -> Self {
|
||||
#[allow(deprecated)]
|
||||
Self {
|
||||
creator: None,
|
||||
federate: true,
|
||||
room_version: RoomVersionId::V11,
|
||||
predecessor: None,
|
||||
room_type: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl RedactContent for RoomCreateEventContent {
|
||||
type Redacted = RedactedRoomCreateEventContent;
|
||||
|
||||
fn redact(self, version: &RoomVersionId) -> Self::Redacted {
|
||||
#[allow(deprecated)]
|
||||
match version {
|
||||
RoomVersionId::V1
|
||||
| RoomVersionId::V2
|
||||
| RoomVersionId::V3
|
||||
| RoomVersionId::V4
|
||||
| RoomVersionId::V5
|
||||
| RoomVersionId::V6
|
||||
| RoomVersionId::V7
|
||||
| RoomVersionId::V8
|
||||
| RoomVersionId::V9
|
||||
| RoomVersionId::V10 => Self {
|
||||
room_version: default_room_version_id(),
|
||||
creator: self.creator,
|
||||
..Self::new_v11()
|
||||
},
|
||||
_ => self,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// A reference to an old room replaced during a room version upgrade.
|
||||
@ -85,6 +133,20 @@ fn default_room_version_id() -> RoomVersionId {
|
||||
RoomVersionId::V1
|
||||
}
|
||||
|
||||
/// Redacted form of [`RoomCreateEventContent`].
|
||||
///
|
||||
/// The redaction rules of this event changed with room version 11:
|
||||
///
|
||||
/// - In room versions 1 through 10, the `creator` field was preserved during redaction, starting
|
||||
/// from room version 11 the field is removed.
|
||||
/// - In room versions 1 through 10, all the other fields were redacted, starting from room version
|
||||
/// 11 all the fields are preserved.
|
||||
pub type RedactedRoomCreateEventContent = RoomCreateEventContent;
|
||||
|
||||
impl RedactedStateEventContent for RedactedRoomCreateEventContent {
|
||||
type StateKey = EmptyStateKey;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use assert_matches2::assert_matches;
|
||||
@ -95,8 +157,9 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn serialization() {
|
||||
#[allow(deprecated)]
|
||||
let content = RoomCreateEventContent {
|
||||
creator: owned_user_id!("@carl:example.com"),
|
||||
creator: Some(owned_user_id!("@carl:example.com")),
|
||||
federate: false,
|
||||
room_version: RoomVersionId::V4,
|
||||
predecessor: None,
|
||||
@ -114,8 +177,9 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn space_serialization() {
|
||||
#[allow(deprecated)]
|
||||
let content = RoomCreateEventContent {
|
||||
creator: owned_user_id!("@carl:example.com"),
|
||||
creator: Some(owned_user_id!("@carl:example.com")),
|
||||
federate: false,
|
||||
room_version: RoomVersionId::V4,
|
||||
predecessor: None,
|
||||
@ -133,6 +197,7 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[allow(deprecated)]
|
||||
fn deserialization() {
|
||||
let json = json!({
|
||||
"creator": "@carl:example.com",
|
||||
@ -141,7 +206,7 @@ mod tests {
|
||||
});
|
||||
|
||||
let content = from_json_value::<RoomCreateEventContent>(json).unwrap();
|
||||
assert_eq!(content.creator, "@carl:example.com");
|
||||
assert_eq!(content.creator.unwrap(), "@carl:example.com");
|
||||
assert!(content.federate);
|
||||
assert_eq!(content.room_version, RoomVersionId::V4);
|
||||
assert_matches!(content.predecessor, None);
|
||||
@ -149,6 +214,7 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[allow(deprecated)]
|
||||
fn space_deserialization() {
|
||||
let json = json!({
|
||||
"creator": "@carl:example.com",
|
||||
@ -158,7 +224,7 @@ mod tests {
|
||||
});
|
||||
|
||||
let content = from_json_value::<RoomCreateEventContent>(json).unwrap();
|
||||
assert_eq!(content.creator, "@carl:example.com");
|
||||
assert_eq!(content.creator.unwrap(), "@carl:example.com");
|
||||
assert!(content.federate);
|
||||
assert_eq!(content.room_version, RoomVersionId::V4);
|
||||
assert_matches!(content.predecessor, None);
|
||||
|
@ -113,6 +113,7 @@ fn deserialize_redacted_any_room_sync() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[allow(deprecated)]
|
||||
fn deserialize_redacted_state_event() {
|
||||
let redacted = json!({
|
||||
"content": {
|
||||
@ -133,7 +134,7 @@ fn deserialize_redacted_state_event() {
|
||||
),)))
|
||||
);
|
||||
assert_eq!(redacted.event_id, "$h29iv0s8:example.com");
|
||||
assert_eq!(redacted.content.creator, "@carl:example.com");
|
||||
assert_eq!(redacted.content.creator.unwrap(), "@carl:example.com");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -213,6 +214,7 @@ fn redact_message_content() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[allow(deprecated)]
|
||||
fn redact_state_content() {
|
||||
let json = json!({
|
||||
"creator": "@carl:example.com",
|
||||
@ -227,5 +229,5 @@ fn redact_state_content() {
|
||||
content.redact(&RoomVersionId::V6),
|
||||
RedactedRoomCreateEventContent { creator, .. }
|
||||
);
|
||||
assert_eq!(creator, "@carl:example.com");
|
||||
assert_eq!(creator.unwrap(), "@carl:example.com");
|
||||
}
|
||||
|
@ -343,9 +343,10 @@ pub fn auth_check<E: Event>(
|
||||
}
|
||||
} else {
|
||||
// If no power level event found the creator gets 100 everyone else gets 0
|
||||
#[allow(deprecated)]
|
||||
from_json_str::<RoomCreateEventContent>(room_create_event.content().get())
|
||||
.ok()
|
||||
.and_then(|create| (create.creator == *sender).then(|| int!(100)))
|
||||
.and_then(|create| (create.creator.unwrap() == *sender).then(|| int!(100)))
|
||||
.unwrap_or_default()
|
||||
};
|
||||
|
||||
@ -533,7 +534,9 @@ fn valid_membership_change(
|
||||
let create_content =
|
||||
from_json_str::<RoomCreateEventContent>(create_room.content().get())?;
|
||||
|
||||
if create_content.creator == sender && create_content.creator == target_user {
|
||||
#[allow(deprecated)]
|
||||
let creator = create_content.creator.unwrap();
|
||||
if creator == sender && creator == target_user {
|
||||
return Ok(true);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user