mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-11-13 12:16:54 +00:00
fix: Make PDU handle errors noisier & correct error types
This commit is contained in:
3 files changed
+35
-20
No files matched your search
@@ -165,8 +165,13 @@ impl super::Service {
|
||||
.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,8 +1,8 @@
|
||||
use std::{collections::BTreeMap, time::Instant};
|
||||
|
||||
use conduwuit::{
|
||||
Err, Event, PduEvent, Result, debug_error, debug_info, defer, err, implement, info, trace,
|
||||
warn,
|
||||
Err, Event, PduEvent, Result, debug_error, debug_info, defer, err, error, implement, info,
|
||||
trace, warn,
|
||||
};
|
||||
use futures::{
|
||||
FutureExt,
|
||||
@@ -146,7 +146,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()
|
||||
@@ -223,7 +223,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 {
|
||||
@@ -242,9 +243,11 @@ 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:?}"))
|
||||
}
|
||||
@@ -2,7 +2,7 @@ use std::collections::{BTreeMap, HashMap, hash_map};
|
||||
|
||||
use conduwuit::{
|
||||
Err, Event, PduEvent, Result, debug, debug_info, debug_warn, err, implement, info, state_res,
|
||||
trace, warn,
|
||||
state_res::EventTypeExt, trace, warn,
|
||||
};
|
||||
use futures::future::ready;
|
||||
use ruma::{
|
||||
@@ -106,7 +106,7 @@ where
|
||||
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 {
|
||||
@@ -142,7 +142,7 @@ where
|
||||
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}."
|
||||
)));
|
||||
}
|
||||
@@ -195,7 +195,7 @@ where
|
||||
.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,
|
||||
auth_event.state_key().unwrap_or("")
|
||||
@@ -205,15 +205,22 @@ where
|
||||
}
|
||||
|
||||
// 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| {
|
||||
|
||||
Reference in new issue
Block a user