From 4f509fa113c5707c808f2f549a8530e94778335f Mon Sep 17 00:00:00 2001 From: timedout Date: Sat, 11 Jul 2026 18:29:28 +0100 Subject: [PATCH] fix: Convert room summary to federation format when sending invites --- src/api/client/membership/invite.rs | 2 +- src/api/server/send_knock.rs | 2 +- src/service/migrations.rs | 2 +- src/service/rooms/state/mod.rs | 21 ++++++++++++++++++--- src/service/rooms/state_cache/update.rs | 2 +- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/api/client/membership/invite.rs b/src/api/client/membership/invite.rs index f4d310ea6..7c638c7d1 100644 --- a/src/api/client/membership/invite.rs +++ b/src/api/client/membership/invite.rs @@ -166,7 +166,7 @@ pub(crate) async fn invite_helper( let invite_room_state = services .rooms .state - .summary_stripped(&pdu, room_id, recipient_user) + .summary_stripped(&pdu, room_id, recipient_user, true) .await; drop(state_lock); diff --git a/src/api/server/send_knock.rs b/src/api/server/send_knock.rs index 905b73a65..15edc6a11 100644 --- a/src/api/server/send_knock.rs +++ b/src/api/server/send_knock.rs @@ -113,7 +113,7 @@ pub(crate) async fn create_knock_event_v1_route( let knock_room_state = services .rooms .state - .summary_stripped(&pdu, &body.room_id, &sender) + .summary_stripped(&pdu, &body.room_id, &sender, true) .await; Ok(create_knock_event::v1::Response::new(knock_room_state)) diff --git a/src/service/migrations.rs b/src/service/migrations.rs index ac7813836..b718b3f04 100644 --- a/src/service/migrations.rs +++ b/src/service/migrations.rs @@ -829,7 +829,7 @@ async fn fix_local_invite_state(services: &Services) -> Result { && services.globals.user_is_local(&membership_event.sender) { // build and save stripped state for their invite in the database - let stripped_state = services.rooms.state.summary_stripped(&membership_event, &room_id, &user_id).await; + let stripped_state = services.rooms.state.summary_stripped(&membership_event, &room_id, &user_id, false).await; userroomid_invitestate.put((&user_id, &room_id), Json(stripped_state)); fixed = fixed.saturating_add(1); } diff --git a/src/service/rooms/state/mod.rs b/src/service/rooms/state/mod.rs index 09db154f2..200e03f7f 100644 --- a/src/service/rooms/state/mod.rs +++ b/src/service/rooms/state/mod.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, fmt::Write, sync::Arc}; use async_trait::async_trait; -use conduwuit::debug; +use conduwuit::{debug, utils::stream::WidebandExt}; use conduwuit_core::{ Event, PduEvent, Result, err, result::FlatOk, @@ -30,7 +30,7 @@ use crate::{ short::{ShortEventId, ShortStateHash}, state_compressor::{CompressedState, parse_compressed_state_event}, }, - sync, + sending, sync, }; pub struct Service { @@ -45,6 +45,7 @@ struct Services { state_cache: Dep, state_accessor: Dep, state_compressor: Dep, + sending: Dep, sync: Dep, timeline: Dep, } @@ -71,6 +72,7 @@ impl crate::Service for Service { .depend::("rooms::state_accessor"), state_compressor: args .depend::("rooms::state_compressor"), + sending: args.depend::("sending"), sync: args.depend::("sync"), timeline: args.depend::("rooms::timeline"), }, @@ -307,6 +309,7 @@ impl Service { event: &PduEvent, room_id: &RoomId, target_user: &UserId, + federation: bool, ) -> Vec { let mut state_events = [ (&StateEventType::RoomCreate, ""), @@ -343,8 +346,20 @@ impl Service { .await .into_iter() .filter_map(Result::ok) - .map(|pdu| RawStrippedState::Pdu(serde_json::value::to_raw_value(&pdu).unwrap())) + .stream() + .wide_then(async |pdu| { + let formatted = if federation { + self.services + .sending + .convert_to_outgoing_federation_event(pdu.to_canonical_object()) + .await + } else { + serde_json::value::to_raw_value(&pdu).unwrap() + }; + RawStrippedState::Pdu(formatted) + }) .collect() + .await } /// Set the state hash to a new version, but does not update state_cache. diff --git a/src/service/rooms/state_cache/update.rs b/src/service/rooms/state_cache/update.rs index 197c4bc0f..1988ee015 100644 --- a/src/service/rooms/state_cache/update.rs +++ b/src/service/rooms/state_cache/update.rs @@ -114,7 +114,7 @@ impl super::Service { let invite_state = if is_local { self.services .state - .summary_stripped(pdu, room_id, user_id) + .summary_stripped(pdu, room_id, user_id, false) .await } else { vec![]