diff --git a/Cargo.toml b/Cargo.toml index d03092ac..b2e05bcc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,8 +23,7 @@ thiserror = "1.0.20" tracing-subscriber = "0.2.11" # [dependencies.ruma] -# git = "https://github.com/ruma/ruma" -# rev = "d5d2d1d893fa12d27960e4c58d6c09b215d06e95" +# path = "../__forks__/ruma/ruma" # features = ["client-api", "federation-api", "appservice-api"] [dependencies.ruma] diff --git a/src/event_auth.rs b/src/event_auth.rs index d6c9e57b..ed9e182e 100644 --- a/src/event_auth.rs +++ b/src/event_auth.rs @@ -105,10 +105,21 @@ pub fn auth_check( false }; + // check the event has been signed by the domain of the sender if event.signatures().get(sender_domain).is_none() && !is_invite_via_3pid { tracing::warn!("event not signed by sender's server"); return Some(false); } + + if event.room_version() == RoomVersionId::Version1 + && event + .signatures() + .get(event.event_id().server_name().unwrap()) + .is_none() + { + tracing::warn!("event not signed by event_id's server"); + return Some(false); + } } // TODO do_size_check is false when called by `iterative_auth_check` @@ -128,7 +139,6 @@ pub fn auth_check( } // if content.room_version is present and is not a valid version - // TODO check this out (what event has this as content?) if serde_json::from_value::( event .content() diff --git a/src/lib.rs b/src/lib.rs index 1733859c..0e9b4574 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -352,12 +352,6 @@ impl StateResolution { tracing::debug!("{:?}", (-*pl, *ev.origin_server_ts(), ev.event_id())); - // count_0.sort_by(|(x, _), (y, _)| { - // x.power_level - // .cmp(&a.power_level) - // .then_with(|| x.origin_server.ts.cmp(&y.origin_server_ts)) - // .then_with(|| x.event_id.cmp(&y.event_id)) - // This return value is the key used for sorting events, // events are then sorted by power level, time, // and lexically by event_id. diff --git a/src/state_event.rs b/src/state_event.rs index 5830a267..e15d0531 100644 --- a/src/state_event.rs +++ b/src/state_event.rs @@ -8,7 +8,7 @@ use ruma::{ room::member::{MemberEventContent, MembershipState}, EventDeHelper, EventType, }, - identifiers::{EventId, RoomId, ServerName, UserId}, + EventId, RoomId, RoomVersionId, ServerName, UserId, }; use serde::{de, Serialize}; use serde_json::value::RawValue as RawJsonValue; @@ -332,6 +332,23 @@ impl StateEvent { }, } } + + /// Returns the room version this event is formatted for. + /// + /// Currently either version 1 or 3 is returned, 3 represents + /// version 3 and above. + pub fn room_version(&self) -> RoomVersionId { + match self { + Self::Full(ev) => match ev { + Pdu::RoomV1Pdu(_) => RoomVersionId::Version1, + Pdu::RoomV3Pdu(_) => RoomVersionId::Version3, + }, + Self::Sync(ev) => match ev { + PduStub::RoomV1PduStub(_) => RoomVersionId::Version1, + PduStub::RoomV3PduStub(_) => RoomVersionId::Version3, + }, + } + } } impl<'de> de::Deserialize<'de> for StateEvent {