From eec6e453584d668bbc38e754577f0448e36634c7 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 31 Aug 2025 10:17:54 +0000 Subject: [PATCH] Improve error messages for missing auth event and invalid join validations. Signed-off-by: Jason Volk --- src/core/matrix/event/id.rs | 5 +++-- src/core/matrix/state_res/event_auth.rs | 9 +++++---- src/service/membership/join.rs | 6 ++++-- src/service/rooms/event_handler/parse_incoming_pdu.rs | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/core/matrix/event/id.rs b/src/core/matrix/event/id.rs index 6ac9a878..587e17a3 100644 --- a/src/core/matrix/event/id.rs +++ b/src/core/matrix/event/id.rs @@ -1,7 +1,7 @@ use ruma::{CanonicalJsonObject, OwnedEventId, RoomVersionId}; use serde_json::value::RawValue as RawJsonValue; -use crate::{Result, err, matrix::room_version}; +use crate::{Result, debug_error, err, matrix::room_version}; /// Generates a correct eventId for the incoming pdu. /// @@ -12,7 +12,8 @@ pub fn gen_event_id_canonical_json( room_version_id: &RoomVersionId, ) -> Result<(OwnedEventId, CanonicalJsonObject)> { let value: CanonicalJsonObject = serde_json::from_str(pdu.get()) - .map_err(|e| err!(BadServerResponse(warn!("Error parsing incoming event: {e:?}"))))?; + .map_err(|e| err!(BadServerResponse(warn!("Error parsing canonical event: {e}")))) + .inspect_err(|e| debug_error!("{pdu:#?} {e:?}"))?; let event_id = gen_event_id(&value, room_version_id)?; diff --git a/src/core/matrix/state_res/event_auth.rs b/src/core/matrix/state_res/event_auth.rs index bf79eb2d..058212ed 100644 --- a/src/core/matrix/state_res/event_auth.rs +++ b/src/core/matrix/state_res/event_auth.rs @@ -4,7 +4,7 @@ mod room_member; mod tests; use futures::{ - FutureExt, TryFutureExt, TryStreamExt, + FutureExt, TryStreamExt, future::{join3, try_join}, }; use ruma::{ @@ -119,9 +119,10 @@ where let seen_auth_types = incoming_event .auth_events() .try_stream() - .and_then(|event_id: &EventId| { - fetch_event(event_id.to_owned()) - .map_err(|_| err!(Request(NotFound("failed to find auth event")))) + .and_then(async |event_id: &EventId| match fetch_event(event_id.to_owned()).await { + | Ok(auth_event) => Ok(auth_event), + | Err(e) if e.is_not_found() => Err!(Request(NotFound("auth event {event_id}: {e}"))), + | Err(e) => Err(e), }) .ready_try_fold(seen_auth_types, |mut seen_auth_types, auth_event| { let event_id = auth_event.event_id(); diff --git a/src/service/membership/join.rs b/src/service/membership/join.rs index 5d700e42..c3cb39fd 100644 --- a/src/service/membership/join.rs +++ b/src/service/membership/join.rs @@ -1,6 +1,6 @@ use std::{borrow::Borrow, collections::HashMap, iter::once, sync::Arc}; -use futures::{FutureExt, StreamExt, TryFutureExt, pin_mut}; +use futures::{FutureExt, StreamExt, TryFutureExt, TryStreamExt, pin_mut}; use ruma::{ CanonicalJsonObject, CanonicalJsonValue, OwnedServerName, OwnedUserId, RoomId, RoomVersionId, UserId, @@ -16,7 +16,7 @@ use ruma::{ room::{AllowRule, JoinRule}, }; use tuwunel_core::{ - Err, Result, debug, debug_info, debug_warn, err, error, implement, info, + Err, Result, debug, debug_error, debug_info, debug_warn, err, error, implement, info, matrix::{ event::{gen_event_id, gen_event_id_canonical_json}, room_version, @@ -366,6 +366,7 @@ pub async fn join_remote( .server_keys .validate_and_add_event_id_no_fetch(pdu, &room_version_id) }) + .inspect_err(|e| debug_error!("Invalid send_join state event: {e:?}")) .ready_filter_map(Result::ok) .fold(HashMap::new(), async |mut state, (event_id, mut value)| { let pdu = if value["type"] == "m.room.create" { @@ -419,6 +420,7 @@ pub async fn join_remote( .server_keys .validate_and_add_event_id_no_fetch(pdu, &room_version_id) }) + .inspect_err(|e| debug_error!("Invalid send_join auth_chain event: {e:?}")) .ready_filter_map(Result::ok) .ready_for_each(|(event_id, mut value)| { if !value.contains_key("room_id") { diff --git a/src/service/rooms/event_handler/parse_incoming_pdu.rs b/src/service/rooms/event_handler/parse_incoming_pdu.rs index 58938fa3..b8216a87 100644 --- a/src/service/rooms/event_handler/parse_incoming_pdu.rs +++ b/src/service/rooms/event_handler/parse_incoming_pdu.rs @@ -9,7 +9,7 @@ type Parsed = (OwnedRoomId, OwnedEventId, CanonicalJsonObject); #[implement(super::Service)] pub async fn parse_incoming_pdu(&self, pdu: &RawJsonValue) -> Result { let value = serde_json::from_str::(pdu.get()).map_err(|e| { - err!(BadServerResponse(debug_warn!("Error parsing incoming event {e:?}"))) + err!(BadServerResponse(debug_error!("Error parsing incoming event: {e} {pdu:#?}"))) })?; let room_id: OwnedRoomId = value