From 6d606d92773d5c1d05a4ca0ae7a45406e27dfcf4 Mon Sep 17 00:00:00 2001 From: timedout Date: Fri, 29 May 2026 21:47:36 +0100 Subject: [PATCH] fix: Make dedupe noisy, don't allow non-create event as create event --- src/service/rooms/event_handler/fetch_state.rs | 15 ++++++++------- .../rooms/event_handler/upgrade_outlier_pdu.rs | 6 ++++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/service/rooms/event_handler/fetch_state.rs b/src/service/rooms/event_handler/fetch_state.rs index f2601856f..c23a562a0 100644 --- a/src/service/rooms/event_handler/fetch_state.rs +++ b/src/service/rooms/event_handler/fetch_state.rs @@ -133,7 +133,7 @@ impl super::Service { debug!(events = state_events.len(), "Processing state events"); for (event_id, pdu) in state_events { let state_key = pdu.state_key().ok_or_else(|| { - err!(Database("Found non-state pdu in state events: {event_id}")) + err!(Request(BadJson("Found non-state pdu in state events: {event_id}"))) })?; let shortstatekey = self @@ -146,13 +146,14 @@ impl super::Service { | hash_map::Entry::Vacant(v) => { v.insert(pdu.event_id().to_owned()); }, - | hash_map::Entry::Occupied(_) => { - return Err!(Database( + | hash_map::Entry::Occupied(existing) => { + return Err!(Request(Forbidden( "State event's type and state_key combination exists multiple times \ - ({event_id}): {}, {}", + ({event_id} + {}): ({}, \"{}\")", + existing.get(), pdu.kind(), - state_key - )); + state_key, + ))); }, } } @@ -165,7 +166,7 @@ impl super::Service { .await?; if state.get(&create_shortstatekey).map(AsRef::as_ref) != Some(create_event.event_id()) { - return Err!(Database("Incoming event refers to wrong create event.")); + return Err!(Request(Forbidden("Incoming event refers to wrong create event."))); } Ok(Some(state)) diff --git a/src/service/rooms/event_handler/upgrade_outlier_pdu.rs b/src/service/rooms/event_handler/upgrade_outlier_pdu.rs index b2b79b06b..1f5d8f17e 100644 --- a/src/service/rooms/event_handler/upgrade_outlier_pdu.rs +++ b/src/service/rooms/event_handler/upgrade_outlier_pdu.rs @@ -57,6 +57,12 @@ impl super::Service { return Err!(Request(Forbidden("Event has been soft-failed"))); } + assert_eq!( + *create_event.kind(), + StateEventType::RoomCreate.into(), + "tried to upgrade a PDU with a create_event that is not a room create event" + ); + debug!( event_id = %incoming_pdu.event_id, "Upgrading PDU from outlier to timeline"