|
1 | 1 | use axum::extract::State; |
2 | 2 | use futures::{FutureExt, TryFutureExt, TryStreamExt}; |
3 | 3 | use ruma::{ |
4 | | - OwnedEventId, RoomId, UserId, |
| 4 | + OwnedEventId, OwnedRoomAliasId, RoomId, UserId, |
5 | 5 | api::client::state::{get_state_event_for_key, get_state_events, send_state_event}, |
6 | 6 | events::{ |
7 | 7 | AnyStateEventContent, StateEventType, |
@@ -320,16 +320,28 @@ async fn allowed_to_send_state_event( |
320 | 320 | | StateEventType::RoomCanonicalAlias => { |
321 | 321 | match json.deserialize_as_unchecked::<RoomCanonicalAliasEventContent>() { |
322 | 322 | | Ok(canonical_alias_content) => { |
323 | | - let mut aliases = canonical_alias_content.alt_aliases.clone(); |
| 323 | + let current_event = services |
| 324 | + .state_accessor |
| 325 | + .room_state_get_content::<RoomCanonicalAliasEventContent>( |
| 326 | + room_id, |
| 327 | + &StateEventType::RoomCanonicalAlias, |
| 328 | + "", |
| 329 | + ) |
| 330 | + .await |
| 331 | + .ok(); |
324 | 332 |
|
325 | | - if let Some(alias) = canonical_alias_content.alias { |
326 | | - aliases.push(alias); |
327 | | - } |
| 333 | + let current_aliases: Vec<OwnedRoomAliasId> = current_event |
| 334 | + .map(|content| content.aliases().cloned().collect()) |
| 335 | + .unwrap_or_default(); |
| 336 | + |
| 337 | + let aliases = canonical_alias_content |
| 338 | + .aliases() |
| 339 | + .filter(|alias| !current_aliases.contains(alias)); |
328 | 340 |
|
329 | 341 | for alias in aliases { |
330 | 342 | let (alias_room_id, _servers) = services |
331 | 343 | .alias |
332 | | - .resolve_alias(&alias) |
| 344 | + .resolve_alias(alias) |
333 | 345 | .await |
334 | 346 | .map_err(|e| { |
335 | 347 | err!(Request(BadAlias("Failed resolving alias \"{alias}\": {e}"))) |
|
0 commit comments