2025-08-02 05:23:57 +00:00
|
|
|
use std::{ops::Range, time::Duration};
|
2024-11-08 07:30:52 +00:00
|
|
|
|
2025-08-02 06:30:48 +00:00
|
|
|
use ruma::{
|
|
|
|
|
CanonicalJsonObject, EventId, MilliSecondsSinceUnixEpoch, RoomId, RoomVersionId, ServerName,
|
|
|
|
|
};
|
2025-04-22 01:41:02 +00:00
|
|
|
use tuwunel_core::{
|
2025-04-27 09:34:07 +00:00
|
|
|
Err, Result, debug,
|
|
|
|
|
debug::INFO_SPAN_LEVEL,
|
2025-08-02 05:23:57 +00:00
|
|
|
implement,
|
2025-04-27 09:34:07 +00:00
|
|
|
matrix::{Event, PduEvent},
|
2024-12-15 00:05:47 -05:00
|
|
|
};
|
2024-11-08 07:30:52 +00:00
|
|
|
|
|
|
|
|
#[implement(super::Service)]
|
|
|
|
|
#[allow(clippy::too_many_arguments)]
|
|
|
|
|
#[tracing::instrument(
|
2025-01-02 05:30:51 +00:00
|
|
|
name = "prev",
|
2025-01-26 04:46:10 +00:00
|
|
|
level = INFO_SPAN_LEVEL,
|
2025-01-02 05:30:51 +00:00
|
|
|
skip_all,
|
|
|
|
|
fields(%prev_id),
|
2024-11-08 07:30:52 +00:00
|
|
|
)]
|
2025-08-02 06:30:48 +00:00
|
|
|
pub(super) async fn handle_prev_pdu(
|
2024-12-15 00:05:47 -05:00
|
|
|
&self,
|
2025-08-02 06:30:48 +00:00
|
|
|
origin: &ServerName,
|
|
|
|
|
room_id: &RoomId,
|
|
|
|
|
event_id: &EventId,
|
2025-08-02 04:59:58 +00:00
|
|
|
eventid_info: Option<(PduEvent, CanonicalJsonObject)>,
|
2025-08-02 06:30:48 +00:00
|
|
|
room_version: &RoomVersionId,
|
2025-04-27 09:34:07 +00:00
|
|
|
first_ts_in_room: MilliSecondsSinceUnixEpoch,
|
2025-08-02 06:30:48 +00:00
|
|
|
prev_id: &EventId,
|
|
|
|
|
create_event_id: &EventId,
|
|
|
|
|
) -> Result {
|
2024-11-08 07:30:52 +00:00
|
|
|
// Check for disabled again because it might have changed
|
|
|
|
|
if self.services.metadata.is_disabled(room_id).await {
|
2024-12-28 00:57:02 +00:00
|
|
|
return Err!(Request(Forbidden(debug_warn!(
|
2024-12-15 00:05:47 -05:00
|
|
|
"Federaton of room {room_id} is currently disabled on this server. Request by \
|
|
|
|
|
origin {origin} and event ID {event_id}"
|
2024-12-28 00:57:02 +00:00
|
|
|
))));
|
2024-11-08 07:30:52 +00:00
|
|
|
}
|
|
|
|
|
|
2025-08-02 04:59:58 +00:00
|
|
|
if self.is_backed_off(prev_id, Range {
|
|
|
|
|
start: Duration::from_secs(5 * 60),
|
|
|
|
|
end: Duration::from_secs(60 * 60 * 24),
|
|
|
|
|
}) {
|
|
|
|
|
debug!(?prev_id, "Backing off from prev_event");
|
|
|
|
|
return Ok(());
|
2024-11-08 07:30:52 +00:00
|
|
|
}
|
|
|
|
|
|
2025-04-02 09:53:42 +00:00
|
|
|
let Some((pdu, json)) = eventid_info else {
|
|
|
|
|
return Ok(());
|
|
|
|
|
};
|
2024-11-08 07:30:52 +00:00
|
|
|
|
2025-04-02 09:53:42 +00:00
|
|
|
// Skip old events
|
2025-04-27 09:34:07 +00:00
|
|
|
if pdu.origin_server_ts() < first_ts_in_room {
|
2025-04-02 09:53:42 +00:00
|
|
|
return Ok(());
|
|
|
|
|
}
|
2024-11-08 07:30:52 +00:00
|
|
|
|
2025-08-02 06:30:48 +00:00
|
|
|
self.upgrade_outlier_to_timeline_pdu(
|
|
|
|
|
origin,
|
|
|
|
|
room_id,
|
|
|
|
|
pdu,
|
|
|
|
|
json,
|
|
|
|
|
room_version,
|
|
|
|
|
create_event_id,
|
|
|
|
|
)
|
|
|
|
|
.await?;
|
2025-04-02 09:53:42 +00:00
|
|
|
|
2024-11-08 07:30:52 +00:00
|
|
|
Ok(())
|
|
|
|
|
}
|