1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2025-09-05 18:41:00 +00:00

fix: set previous creators to max power level if "upgraded" room doesn't support creator power level

This commit is contained in:
Matthias Ahouansou 2025-08-17 13:20:30 +02:00
parent 03dfa72b8f
commit 1018d8d608
No known key found for this signature in database

View file

@ -23,13 +23,15 @@ use ruma::{
},
int,
serde::JsonObject,
CanonicalJsonObject, CanonicalJsonValue, OwnedRoomAliasId, OwnedUserId, RoomAliasId,
CanonicalJsonObject, CanonicalJsonValue, Int, OwnedRoomAliasId, OwnedUserId, RoomAliasId,
RoomVersionId,
};
use serde::Deserialize;
use serde_json::{json, value::to_raw_value};
use std::{
cmp::max,
collections::{BTreeMap, HashSet},
str::FromStr,
sync::Arc,
};
use tracing::{error, info, warn};
@ -600,17 +602,30 @@ pub async fn upgrade_room_route(
.authorization;
// Get the old room creation event
let mut create_event_content = serde_json::from_str::<CanonicalJsonObject>(
services()
let create_event = services()
.rooms
.state_accessor
.room_state_get(&body.room_id, &StateEventType::RoomCreate, "")?
.ok_or_else(|| Error::bad_database("Found room without m.room.create event."))?
.content
.get(),
)
.ok_or_else(|| Error::bad_database("Found room without m.room.create event."))?;
let mut create_event_content =
serde_json::from_str::<CanonicalJsonObject>(create_event.content.get())
.map_err(|_| Error::bad_database("Invalid room event in database."))?;
let old_rules = if let Some(CanonicalJsonValue::String(old_version)) =
create_event_content.get("room_version")
{
RoomVersionId::from_str(old_version)
.map_err(|_| Error::BadDatabase("Create event must be a valid room version ID"))?
.rules()
.expect("Supported room version must have rules")
.authorization
} else {
return Err(Error::BadDatabase(
"Room create event does not have content",
));
};
// Use the m.room.tombstone event as the predecessor
let predecessor = Some(ruma::events::room::create::PreviousRoom::new(
body.room_id.clone(),
@ -772,8 +787,7 @@ pub async fn upgrade_room_route(
None => continue, // Skipping missing events.
};
if event_type == StateEventType::RoomPowerLevels && rules.explicitly_privilege_room_creators
{
if event_type == StateEventType::RoomPowerLevels {
let mut pl_event_content: CanonicalJsonObject =
serde_json::from_str(event_content.get()).map_err(|e| {
error!(
@ -784,6 +798,7 @@ pub async fn upgrade_room_route(
})?;
if let Some(CanonicalJsonValue::Object(users)) = pl_event_content.get_mut("users") {
if rules.explicitly_privilege_room_creators {
users.remove(sender_user.as_str());
if rules.additional_room_creators {
@ -791,6 +806,21 @@ pub async fn upgrade_room_route(
users.remove(user.as_str());
}
}
} else if old_rules.explicitly_privilege_room_creators {
users.insert(create_event.sender.to_string(), Int::MAX.into());
if old_rules.additional_room_creators {
if let Some(CanonicalJsonValue::Array(creators)) =
create_event_content.get("additional_creators")
{
for creator in creators {
if let CanonicalJsonValue::String(creator) = creator {
users.insert(creator.to_owned(), Int::MAX.into());
}
}
}
}
}
}
event_content = to_raw_value(&pl_event_content)