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:
@@ -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}")))
|
||||
|
||||
Reference in New Issue
Block a user