mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
fix(user_can): Fix room creators being unable to redact events in v12 rooms
(cherry picked from commit fbf48addc7)
This commit is contained in:
@@ -1,9 +1,10 @@
|
|||||||
use conduwuit::{Err, Result, implement, matrix::Event, pdu::PduBuilder};
|
use conduwuit::{Err, Result, RoomVersion, implement, matrix::Event, pdu::PduBuilder};
|
||||||
use ruma::{
|
use ruma::{
|
||||||
EventId, RoomId, UserId,
|
EventId, RoomId, UserId,
|
||||||
events::{
|
events::{
|
||||||
StateEventType, TimelineEventType,
|
StateEventType, TimelineEventType,
|
||||||
room::{
|
room::{
|
||||||
|
create::RoomCreateEventContent,
|
||||||
history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent},
|
history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent},
|
||||||
member::{MembershipState, RoomMemberEventContent},
|
member::{MembershipState, RoomMemberEventContent},
|
||||||
power_levels::{RoomPowerLevels, RoomPowerLevelsEventContent},
|
power_levels::{RoomPowerLevels, RoomPowerLevelsEventContent},
|
||||||
@@ -44,6 +45,23 @@ pub async fn user_can_redact(
|
|||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let room_create = self
|
||||||
|
.room_state_get(room_id, &StateEventType::RoomCreate, "")
|
||||||
|
.await?;
|
||||||
|
let create_content: RoomCreateEventContent =
|
||||||
|
serde_json::from_str(room_create.content().get())?;
|
||||||
|
let room_features = RoomVersion::new(&create_content.room_version)?;
|
||||||
|
if room_features.explicitly_privilege_room_creators {
|
||||||
|
let sender_owned = sender.to_owned();
|
||||||
|
if sender == room_create.sender()
|
||||||
|
|| create_content
|
||||||
|
.additional_creators
|
||||||
|
.is_some_and(|cs| cs.contains(&sender_owned))
|
||||||
|
{
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match self
|
match self
|
||||||
.room_state_get_content::<RoomPowerLevelsEventContent>(
|
.room_state_get_content::<RoomPowerLevelsEventContent>(
|
||||||
room_id,
|
room_id,
|
||||||
@@ -68,18 +86,10 @@ pub async fn user_can_redact(
|
|||||||
},
|
},
|
||||||
| _ => {
|
| _ => {
|
||||||
// Falling back on m.room.create to judge power level
|
// Falling back on m.room.create to judge power level
|
||||||
match self
|
Ok(room_create.sender() == sender
|
||||||
.room_state_get(room_id, &StateEventType::RoomCreate, "")
|
|| redacting_event
|
||||||
.await
|
.as_ref()
|
||||||
{
|
.is_ok_and(|redacting_event| redacting_event.sender() == sender))
|
||||||
| Ok(room_create) => Ok(room_create.sender() == sender
|
|
||||||
|| redacting_event
|
|
||||||
.as_ref()
|
|
||||||
.is_ok_and(|redacting_event| redacting_event.sender() == sender)),
|
|
||||||
| _ => Err!(Database(
|
|
||||||
"No m.room.power_levels or m.room.create events in database for room"
|
|
||||||
)),
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user