fix: Make PDU handle errors noisier & correct error types

This commit is contained in:
timedout
2026-06-27 20:16:41 +01:00
committed by Jade Ellis
parent 6d606d9277
commit 95473f4c24
4 changed files with 36 additions and 23 deletions
@@ -165,8 +165,13 @@ pub(super) async fn fetch_state(
.get_shortstatekey(&StateEventType::RoomCreate, "")
.await?;
if state.get(&create_shortstatekey).map(AsRef::as_ref) != Some(create_event.event_id()) {
return Err!(Request(Forbidden("Incoming event refers to wrong create event.")));
let create_event_id = state.get(&create_shortstatekey).map(AsRef::as_ref);
if create_event_id != Some(create_event.event_id()) {
return Err!(Request(Forbidden(
"Incoming event refers to wrong create event: expected {}, got: \
{create_event_id:?}",
create_event.event_id()
)));
}
Ok(Some(state))
@@ -1,7 +1,7 @@
use std::{collections::BTreeMap, time::Instant};
use conduwuit::{
Err, Event, PduEvent, Result, debug_error, debug_info, defer, err, info, trace, warn,
Err, Event, PduEvent, Result, debug_error, debug_info, defer, err, error, info, trace, warn,
};
use futures::{
FutureExt,
@@ -147,9 +147,7 @@ pub async fn handle_incoming_pdu<'a>(
.and_then(|v| v.as_str())
.ok_or_else(|| err!("No sender in object"))
.and_then(|v| Ok(UserId::parse(v)?))
.map_err(|e| {
err!(Request(InvalidParam("PDU does not have a valid sender key: {e}")))
})?;
.map_err(|e| err!(Request(BadJson("PDU does not have a valid sender key: {e}"))))?;
let sender_acl_check: OptionFuture<_> = sender
.server_name()
@@ -230,7 +228,8 @@ pub async fn handle_incoming_pdu<'a>(
let (incoming_pdu, val) = self
.handle_outlier_pdu(origin, create_event, event_id, room_id, value, false)
.await?;
.await
.inspect(|e| error!("[TODO] Failed to handle outlier PDU: {e:?}"))?;
// 8. if not timeline event: stop
if !is_timeline_event {
@@ -249,10 +248,12 @@ pub async fn handle_incoming_pdu<'a>(
// These are timeline events
self.fetch_prevs(room_id, create_event, &incoming_pdu, origin)
.await?;
.await
.inspect_err(|e| error!("[TODO] Failed to fetch_prevs: {e:?}"))?;
// Done with prev events, now handling the incoming event
self.upgrade_outlier_to_timeline_pdu(incoming_pdu, val, create_event, origin, room_id)
.await
.inspect_err(|e| error!("[TODO] Failed to upgrade outlier to timeline pdu: {e:?}"))
}
}
@@ -1,8 +1,8 @@
use std::collections::{BTreeMap, HashMap, hash_map};
use conduwuit::{
Err, Event, PduEvent, Result, debug, debug_info, debug_warn, err, info, state_res, trace,
warn,
Err, Event, PduEvent, Result, debug, debug_info, debug_warn, err, info, state_res,
state_res::EventTypeExt, trace, warn,
};
use futures::future::ready;
use ruma::{
@@ -110,7 +110,7 @@ pub(super) async fn handle_outlier_pdu<'a, Pdu>(
event_id,
);
self.services.pdu_metadata.mark_event_rejected(event_id);
return Err!(Request(InvalidParam("Event has rejected auth event: {aid}")));
return Err!(Request(Forbidden("Event has rejected auth event: {aid}")));
}
if let Ok(auth_event) = self.services.timeline.get_pdu(aid).await {
@@ -148,7 +148,7 @@ pub(super) async fn handle_outlier_pdu<'a, Pdu>(
let (auth_event_room_id, auth_event_id, auth_pdu_json) =
self.parse_incoming_pdu(&auth_pdu_json).await?;
if auth_event_room_id != room_id {
return Err!(Request(BadJson(
return Err!(Request(Forbidden(
"Auth event {auth_event_id} is in {auth_event_room_id}, not {room_id}."
)));
}
@@ -201,7 +201,7 @@ pub(super) async fn handle_outlier_pdu<'a, Pdu>(
.outlier
.add_pdu_outlier(pdu_event.event_id(), &incoming_pdu);
self.services.pdu_metadata.mark_event_rejected(event_id);
return Err!(Request(InvalidParam(
return Err!(Request(Forbidden(
"Auth event's type and state_key combination exists multiple times: {}, \
{}",
auth_event.kind,
@@ -212,15 +212,22 @@ pub(super) async fn handle_outlier_pdu<'a, Pdu>(
}
// The original create event must be in the auth events
if !matches!(
auth_events_by_key.get(&(StateEventType::RoomCreate, String::new().into())),
Some(_) | None
) {
self.services.pdu_metadata.mark_event_rejected(event_id);
self.services
.outlier
.add_pdu_outlier(pdu_event.event_id(), &incoming_pdu);
return Err!(Request(InvalidParam("Incoming event refers to wrong create event.")));
let claimed_create_event =
auth_events_by_key.get(&StateEventType::RoomCreate.with_state_key(""));
if let Some(claimed_create_event) = claimed_create_event {
if claimed_create_event.event_id() != create_event.event_id() {
self.services.pdu_metadata.mark_event_rejected(event_id);
self.services
.outlier
.add_pdu_outlier(pdu_event.event_id(), &incoming_pdu);
return Err!(Request(Forbidden(
"Incoming event refers to wrong create event (expected {}, got {})",
create_event.event_id(),
claimed_create_event.event_id(),
)));
}
} else if !pdu_event.auth_events.is_empty() {
return Err!(Request(Forbidden("Incoming event does not refer to any create event")));
}
let state_fetch = |ty: &StateEventType, sk: &str| {
@@ -92,7 +92,7 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
.fetch_state(origin, create_event, room_id, incoming_pdu.event_id())
.await
.debug_inspect_err(|e| {
debug_error!("Could not fetch state from {origin}: {e}")
debug_error!("Could not fetch state from {origin}: {e}");
})?;
}