diff --git a/src/core/matrix/event/id.rs b/src/core/matrix/event/id.rs index 8a1d05fe5..9e3b175ff 100644 --- a/src/core/matrix/event/id.rs +++ b/src/core/matrix/event/id.rs @@ -1,4 +1,7 @@ -use ruma::{CanonicalJsonObject, OwnedEventId, room_version_rules::RoomVersionRules}; +use ruma::{ + CanonicalJsonObject, EventId, OwnedEventId, + room_version_rules::{EventIdFormatVersion, RoomVersionRules}, +}; use serde_json::value::RawValue as RawJsonValue; use crate::{Result, err}; @@ -24,8 +27,11 @@ pub fn gen_event_id( value: &CanonicalJsonObject, room_version_rules: &RoomVersionRules, ) -> Result { + assert_ne!( + room_version_rules.event_id_format, + EventIdFormatVersion::V1, + "Continuwuity does not support PDU v1" + ); let reference_hash = ruma::signatures::reference_hash(value, room_version_rules)?; - let event_id: OwnedEventId = format!("${reference_hash}").try_into()?; - - Ok(event_id) + Ok(EventId::new_v2_or_v3(&reference_hash)?) } diff --git a/src/service/rooms/event_handler/parse_incoming_pdu.rs b/src/service/rooms/event_handler/parse_incoming_pdu.rs index 1edea3330..3d9803440 100644 --- a/src/service/rooms/event_handler/parse_incoming_pdu.rs +++ b/src/service/rooms/event_handler/parse_incoming_pdu.rs @@ -1,13 +1,15 @@ use std::str::FromStr; use conduwuit::{ - Err, Result, err, + Err, Error, Result, err, matrix::event::{gen_event_id, gen_event_id_canonical_json}, }; use itertools::Itertools; use ruma::{ CanonicalJsonObject, CanonicalJsonValue, EventId, OwnedEventId, OwnedRoomId, RoomId, - RoomVersionId, room_version_rules::RoomVersionRules, + RoomVersionId, + api::error::{ErrorKind, IncompatibleRoomVersionErrorData}, + room_version_rules::RoomVersionRules, }; use serde_json::value::RawValue as RawJsonValue; @@ -102,14 +104,25 @@ impl super::Service { let room_version_rules = match room_version_rules { | Some(r) => r, - | None => &self - .services - .state - .get_room_version(&room_id) - .await - .unwrap_or(RoomVersionId::V1) - .rules() - .expect("room version must be supported"), + | None => { + let room_version = self + .services + .state + .get_room_version(&room_id) + .await + .map_err(|_| err!(Request(NotFound("no version associated with room ID"))))?; + if matches!(room_version, RoomVersionId::V1 | RoomVersionId::V2) { + return Err(Error::BadRequest( + ErrorKind::IncompatibleRoomVersion( + IncompatibleRoomVersionErrorData::new(room_version), + ), + "Room version is too old.", + )); + } + &room_version + .rules() + .expect("room version must be supported") + }, }; let (event_id, value) =