allow adding canonical aliases from remote servers

Like is mentioned in the comment, this isn't explicitly required by the
spec, but it's reasonable and what synapse does.
This commit is contained in:
Olivia Lee 2025-01-20 16:53:08 -08:00
parent 29d8fbaefa
commit 472f51c350
No known key found for this signature in database
GPG key ID: 54D568A15B9CD1F9
4 changed files with 57 additions and 12 deletions

View file

@ -107,6 +107,8 @@ pub(crate) async fn get_alias_route(
get_alias_helper(body.body.room_alias).await.map(Ra)
}
// Can't use `services().rooms.alias.resolve_alias` because we also need the set
// of servers from the remote get_room_information request.
pub(crate) async fn get_alias_helper(
room_alias: OwnedRoomAliasId,
) -> Result<get_alias::v3::Response> {

View file

@ -212,7 +212,7 @@ async fn send_state_event_for_key_helper(
let sender_user = sender;
if event_type == &StateEventType::RoomCanonicalAlias {
validate_canonical_alias_event(room_id, json.cast_ref())?;
validate_canonical_alias_event(room_id, json.cast_ref()).await?;
}
let room_token = services()
@ -253,7 +253,7 @@ async fn send_state_event_for_key_helper(
/// > are already present in the state event.
///
/// [spec]: https://spec.matrix.org/v1.13/client-server-api/#put_matrixclientv3roomsroomidstateeventtypestatekey
fn validate_canonical_alias_event(
async fn validate_canonical_alias_event(
room_id: &RoomId,
json: &Raw<RoomCanonicalAliasEventContent>,
) -> Result<()> {
@ -311,13 +311,11 @@ fn validate_canonical_alias_event(
)
})?;
if alias.server_name() != services().globals.server_name()
|| services()
.rooms
.alias
.resolve_local_alias(&alias)?
.filter(|room| room == room_id)
.is_none()
// The spec doesn't say explicitly that we should allow adding new
// remote canonical aliases, but it's reasonable behavior and what
// synapse does.
if services().rooms.alias.resolve_alias(&alias).await?.as_deref()
!= Some(room_id)
{
return Err(Error::BadRequest(
ErrorKind::BadAlias,