From 98c7b89fca712ff2d5e95083a18cb77e82067d88 Mon Sep 17 00:00:00 2001 From: Matthias Ahouansou Date: Mon, 1 Jul 2024 15:01:24 +0100 Subject: [PATCH] fixup! feat(federation): support /make_join and /send_join for restricted rooms Only sign join event if restricted join if required --- src/api/server_server.rs | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/api/server_server.rs b/src/api/server_server.rs index eec7cff3..7af4bdef 100644 --- a/src/api/server_server.rs +++ b/src/api/server_server.rs @@ -49,7 +49,7 @@ use ruma::{ to_device::DeviceIdOrAllDevices, uint, user_id, CanonicalJsonObject, CanonicalJsonValue, EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, OwnedServerName, OwnedServerSigningKeyId, OwnedUserId, RoomId, - ServerName, + RoomVersionId, ServerName, }; use serde_json::value::{to_raw_value, RawValue as RawJsonValue}; use std::{ @@ -1758,13 +1758,38 @@ async fn create_join_event( )); } - ruma::signatures::hash_and_sign_event( - services().globals.server_name().as_str(), - services().globals.keypair(), - &mut value, - &room_version_id, + let event_content: RoomMemberEventContent = serde_json::from_value( + value + .get("content") + .ok_or_else(|| Error::BadRequest(ErrorKind::BadJson, "Missing event content"))? + .clone() + .into(), ) - .map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "Failed to sign event."))?; + .map_err(|_| Error::BadRequest(ErrorKind::BadJson, "Invalid event content"))?; + + if event_content + .join_authorized_via_users_server + .map(|user| user.server_name() == services().globals.server_name()) + .unwrap_or_default() + && !matches!( + room_version_id, + RoomVersionId::V1 + | RoomVersionId::V2 + | RoomVersionId::V3 + | RoomVersionId::V4 + | RoomVersionId::V5 + | RoomVersionId::V6 + | RoomVersionId::V7 + ) + { + ruma::signatures::hash_and_sign_event( + services().globals.server_name().as_str(), + services().globals.keypair(), + &mut value, + &room_version_id, + ) + .map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "Failed to sign event."))?; + } let origin: OwnedServerName = serde_json::from_value( serde_json::to_value(value.get("origin").ok_or(Error::BadRequest(