Fix canonical alias event check

The old version was checking all aliases instead of only the newly added ones that
prevented modifying the event if one of current aliases became invalid
This commit is contained in:
dasha_uwu
2026-02-20 00:27:29 +05:00
parent d6d576d48e
commit 0381547c52
3 changed files with 29 additions and 17 deletions

View File

@@ -1,7 +1,7 @@
use axum::extract::State;
use futures::{FutureExt, TryFutureExt, TryStreamExt};
use ruma::{
OwnedEventId, RoomId, UserId,
OwnedEventId, OwnedRoomAliasId, RoomId, UserId,
api::client::state::{get_state_event_for_key, get_state_events, send_state_event},
events::{
AnyStateEventContent, StateEventType,
@@ -320,16 +320,28 @@ async fn allowed_to_send_state_event(
| StateEventType::RoomCanonicalAlias => {
match json.deserialize_as_unchecked::<RoomCanonicalAliasEventContent>() {
| Ok(canonical_alias_content) => {
let mut aliases = canonical_alias_content.alt_aliases.clone();
let current_event = services
.state_accessor
.room_state_get_content::<RoomCanonicalAliasEventContent>(
room_id,
&StateEventType::RoomCanonicalAlias,
"",
)
.await
.ok();
if let Some(alias) = canonical_alias_content.alias {
aliases.push(alias);
}
let current_aliases: Vec<OwnedRoomAliasId> = current_event
.map(|content| content.aliases().cloned().collect())
.unwrap_or_default();
let aliases = canonical_alias_content
.aliases()
.filter(|alias| !current_aliases.contains(alias));
for alias in aliases {
let (alias_room_id, _servers) = services
.alias
.resolve_alias(&alias)
.resolve_alias(alias)
.await
.map_err(|e| {
err!(Request(BadAlias("Failed resolving alias \"{alias}\": {e}")))