From 7977512d5d1848c12c0fe14504ff6da2556c9aae Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 28 Aug 2025 00:30:54 +0000 Subject: [PATCH] Fix additional cases for room_id. Signed-off-by: Jason Volk --- src/admin/debug/commands.rs | 17 ++++++++++++++--- src/service/membership/join.rs | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/admin/debug/commands.rs b/src/admin/debug/commands.rs index 5348a3dd..56fa0aa3 100644 --- a/src/admin/debug/commands.rs +++ b/src/admin/debug/commands.rs @@ -612,14 +612,25 @@ pub(super) async fn force_set_room_state_from_server( .server_keys .validate_and_add_event_id(pdu, &room_version) }) { - let Ok((event_id, value)) = result.await else { + let Ok((event_id, mut value)) = result.await else { continue; }; - let pdu = PduEvent::from_id_val(&event_id, value.clone()).map_err(|e| { + let invalid_pdu_err = |e| { debug_error!("Invalid PDU in fetching remote room state PDUs response: {value:#?}"); err!(BadServerResponse(debug_error!("Invalid PDU in send_join response: {e:?}"))) - })?; + }; + + let pdu = if value["type"] == "m.room.create" { + PduEvent::from_rid_val(&room_id, &event_id, value.clone()).map_err(invalid_pdu_err)? + } else { + PduEvent::from_id_val(&event_id, value.clone()).map_err(invalid_pdu_err)? + }; + + if !value.contains_key("room_id") { + let room_id = CanonicalJsonValue::String(room_id.as_str().into()); + value.insert("room_id".into(), room_id); + } self.services .timeline diff --git a/src/service/membership/join.rs b/src/service/membership/join.rs index a7174c62..5d700e42 100644 --- a/src/service/membership/join.rs +++ b/src/service/membership/join.rs @@ -367,8 +367,13 @@ pub async fn join_remote( .validate_and_add_event_id_no_fetch(pdu, &room_version_id) }) .ready_filter_map(Result::ok) - .fold(HashMap::new(), async |mut state, (event_id, value)| { + .fold(HashMap::new(), async |mut state, (event_id, mut value)| { let pdu = if value["type"] == "m.room.create" { + if !value.contains_key("room_id") { + let room_id = CanonicalJsonValue::String(room_id.as_str().into()); + value.insert("room_id".into(), room_id); + } + PduEvent::from_rid_val(room_id, &event_id, value.clone()) } else { PduEvent::from_id_val(&event_id, value.clone()) @@ -415,7 +420,12 @@ pub async fn join_remote( .validate_and_add_event_id_no_fetch(pdu, &room_version_id) }) .ready_filter_map(Result::ok) - .ready_for_each(|(event_id, value)| { + .ready_for_each(|(event_id, mut value)| { + if !value.contains_key("room_id") { + let room_id = CanonicalJsonValue::String(room_id.as_str().into()); + value.insert("room_id".into(), room_id); + } + self.services .timeline .add_pdu_outlier(&event_id, &value);