diff --git a/Cargo.lock b/Cargo.lock index e7a61534..160be0c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3695,6 +3695,7 @@ dependencies = [ [[package]] name = "ruma" version = "0.10.1" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "assign", "js_int", @@ -3714,6 +3715,7 @@ dependencies = [ [[package]] name = "ruma-appservice-api" version = "0.10.0" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "js_int", "ruma-common", @@ -3725,6 +3727,7 @@ dependencies = [ [[package]] name = "ruma-client-api" version = "0.18.0" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "as_variant", "assign", @@ -3747,6 +3750,7 @@ dependencies = [ [[package]] name = "ruma-common" version = "0.13.0" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "as_variant", "base64 0.22.1", @@ -3778,6 +3782,7 @@ dependencies = [ [[package]] name = "ruma-events" version = "0.28.1" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "as_variant", "indexmap 2.9.0", @@ -3802,6 +3807,7 @@ dependencies = [ [[package]] name = "ruma-federation-api" version = "0.9.0" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "bytes", "headers", @@ -3823,6 +3829,7 @@ dependencies = [ [[package]] name = "ruma-identifiers-validation" version = "0.9.5" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "js_int", "thiserror 2.0.12", @@ -3831,6 +3838,7 @@ dependencies = [ [[package]] name = "ruma-identity-service-api" version = "0.9.0" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "js_int", "ruma-common", @@ -3840,6 +3848,7 @@ dependencies = [ [[package]] name = "ruma-macros" version = "0.13.0" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "cfg-if", "proc-macro-crate", @@ -3854,6 +3863,7 @@ dependencies = [ [[package]] name = "ruma-push-gateway-api" version = "0.9.0" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "js_int", "ruma-common", @@ -3865,6 +3875,7 @@ dependencies = [ [[package]] name = "ruma-signatures" version = "0.15.0" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" dependencies = [ "base64 0.22.1", "ed25519-dalek", diff --git a/Cargo.toml b/Cargo.toml index e4c2f665..1abff107 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -348,9 +348,9 @@ version = "0.1.2" # Used for matrix spec type definitions and helpers [workspace.dependencies.ruma] -#git = "https://forgejo.ellis.link/continuwuation/ruwuma" -#rev = "b1a55ab8fa3d2e3db3240d04339835f71cfc84d4" -path = "../ruwuma/crates/ruma" # nex: temp +git = "https://forgejo.ellis.link/continuwuation/ruwuma" +#branch = "conduwuit-changes" +rev = "d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" features = [ "compat", "rand", diff --git a/src/core/matrix/state_res/event_auth.rs b/src/core/matrix/state_res/event_auth.rs index 414c1b87..759ab5cb 100644 --- a/src/core/matrix/state_res/event_auth.rs +++ b/src/core/matrix/state_res/event_auth.rs @@ -5,7 +5,7 @@ use futures::{ future::{OptionFuture, join3}, }; use ruma::{ - EventId, Int, OwnedUserId, RoomVersionId, UserId, + Int, OwnedUserId, RoomVersionId, UserId, events::room::{ create::RoomCreateEventContent, join_rules::{JoinRule, RoomJoinRulesEventContent}, @@ -56,7 +56,6 @@ pub fn auth_types_for_event( sender: &UserId, state_key: Option<&str>, content: &RawJsonValue, - room_version: &RoomVersion, ) -> serde_json::Result> { if kind == &TimelineEventType::RoomCreate { return Ok(vec![]); @@ -65,11 +64,8 @@ pub fn auth_types_for_event( let mut auth_types = vec![ (StateEventType::RoomPowerLevels, StateKey::new()), (StateEventType::RoomMember, sender.as_str().into()), + (StateEventType::RoomCreate, StateKey::new()), ]; - if !room_version.create_id_as_room_id { - auth_types.push((StateEventType::RoomCreate, StateKey::new())) - // m.room.create is only referenced if it isn't the room ID - } if kind == &TimelineEventType::RoomMember { #[derive(Deserialize)] @@ -140,16 +136,14 @@ pub fn auth_types_for_event( event_id = incoming_event.event_id().as_str(), ) )] -pub async fn auth_check( +pub async fn auth_check( room_version: &RoomVersion, incoming_event: &Incoming, current_third_party_invite: Option<&Incoming>, - fetch_state: FS, - fetch_event: FE, + fetch_state: F, ) -> Result where - FS: Fn(&StateEventType, &str) -> Fut + Send, - FE: Fn(&EventId) -> Fut + Send, + F: Fn(&StateEventType, &str) -> Fut + Send, Fut: Future> + Send, Fetched: Event + Send, Incoming: Event + Send + Sync, @@ -189,19 +183,15 @@ where return Ok(false); } - if room_version.create_id_as_room_id { - let expected = - format!("!{}:{}", incoming_event.event_id().localpart(), sender.server_name()); - if incoming_event.room_id().as_str() != expected { - warn!("room create included a room ID that does not match the event ID"); - return Ok(false); - } - } else { - // If the domain of the room_id does not match the domain of the sender, reject - let Some(_room_id_server_name) = incoming_event.room_id().server_name() else { - warn!("room ID has no servername"); - return Ok(false); - }; + // If the domain of the room_id does not match the domain of the sender, reject + let Some(room_id_server_name) = incoming_event.room_id().server_name() else { + warn!("room ID has no servername"); + return Ok(false); + }; + + if room_id_server_name != sender.server_name() { + warn!("servername of room ID does not match servername of sender"); + return Ok(false); } // If content.room_version is present and is not a recognized version, reject @@ -251,39 +241,16 @@ where } */ - let (mut room_create_event, power_levels_event, sender_member_event) = join3( + let (room_create_event, power_levels_event, sender_member_event) = join3( fetch_state(&StateEventType::RoomCreate, ""), fetch_state(&StateEventType::RoomPowerLevels, ""), fetch_state(&StateEventType::RoomMember, sender.as_str()), ) .await; - if room_version.create_id_as_room_id { - // TODO: fetch the create event from the room ID - let create_event_id = &EventId::parse(incoming_event.room_id().localpart()); - // if let Err(e) = create_event_id { - // error!(?e, "invalid room ID for create event"); - // return Ok(false); - // } - // room_create_event = fetch_event(create_event_id).await; - match create_event_id { - | Ok(id) => { - room_create_event = fetch_event(id).await; - if room_create_event.is_none() { - warn!("could not find m.room.create event for PDU"); - return Ok(false); - } - room_create_event = room_create_event; - }, - | Err(e) => { - error!(?e, "invalid room ID for create event"); - return Ok(false); - }, - } - } - let real_room_create_event = match room_create_event { + let room_create_event = match room_create_event { | None => { - warn!("could not find an applicable m.room.create event for PDU"); + warn!("no m.room.create event in auth chain"); return Ok(false); }, | Some(e) => e, @@ -292,8 +259,7 @@ where // 3. If event does not have m.room.create in auth_events reject if !incoming_event .auth_events() - .any(|id| id == real_room_create_event.event_id()) - && !room_version.create_id_as_room_id + .any(|id| id == room_create_event.event_id()) { warn!("no m.room.create event in auth events"); return Ok(false); @@ -309,9 +275,9 @@ where federate: bool, } let room_create_content: RoomCreateContentFederate = - from_json_str(real_room_create_event.content().get())?; + from_json_str(room_create_event.content().get())?; if !room_create_content.federate - && real_room_create_event.sender().server_name() != incoming_event.sender().server_name() + && room_create_event.sender().server_name() != incoming_event.sender().server_name() { warn!( "room is not federated and event's sender domain does not match create event's \ @@ -396,7 +362,7 @@ where join_rules_event.as_ref(), user_for_join_auth.as_deref(), &user_for_join_auth_membership, - &real_room_create_event, + &room_create_event, )? { return Ok(false); } @@ -445,10 +411,10 @@ where | _ => { // If no power level event found the creator gets 100 everyone else gets 0 let is_creator = if room_version.use_room_create_sender { - real_room_create_event.sender() == sender + room_create_event.sender() == sender } else { #[allow(deprecated)] - from_json_str::(real_room_create_event.content().get()) + from_json_str::(room_create_event.content().get()) .is_ok_and(|create| create.creator.unwrap() == *sender) }; diff --git a/src/core/matrix/state_res/room_version.rs b/src/core/matrix/state_res/room_version.rs index 33da9368..8dfd6cde 100644 --- a/src/core/matrix/state_res/room_version.rs +++ b/src/core/matrix/state_res/room_version.rs @@ -29,8 +29,6 @@ pub enum StateResolutionVersion { V1, /// State resolution for room at version 2 or later. V2, - /// State resolution for hydra rooms - V2_1, } #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] @@ -82,29 +80,9 @@ pub struct RoomVersion { /// /// See: [MSC2175](https://github.com/matrix-org/matrix-spec-proposals/pull/2175) for more information. pub use_room_create_sender: bool, - /// Whether the room creator is a superuser. - /// A superuser will always have infinite power level and gains special - /// privileges. - /// - /// See: [MSC4289](https://github.com/matrix-org/matrix-spec-proposals/pull/4289) for more information. - pub room_creator_is_superuser: bool, - /// Whether the room version supports estoppel events. - /// - /// See: [MSC4290](https://github.com/matrix-org/matrix-spec-proposals/pull/4290) - pub estoppel_events: bool, - /// Whether the room's m.room.create event ID is itself the room ID. - /// - /// See: [MSC4291](https://github.com/matrix-org/matrix-spec-proposals/pull/4291) - pub create_id_as_room_id: bool, } impl RoomVersion { - pub const HYDRA_V11: Self = Self { - room_creator_is_superuser: true, - estoppel_events: true, - create_id_as_room_id: true, - ..Self::V11 - }; pub const V1: Self = Self { disposition: RoomDisposition::Stable, event_format: EventFormatVersion::V1, @@ -119,9 +97,6 @@ impl RoomVersion { knock_restricted_join_rule: false, integer_power_levels: false, use_room_create_sender: false, - room_creator_is_superuser: false, - estoppel_events: false, - create_id_as_room_id: false, }; pub const V10: Self = Self { knock_restricted_join_rule: true, @@ -169,7 +144,6 @@ impl RoomVersion { | RoomVersionId::V9 => Self::V9, | RoomVersionId::V10 => Self::V10, | RoomVersionId::V11 => Self::V11, - | RoomVersionId::HydraV11 => Self::HYDRA_V11, | ver => return Err(Error::Unsupported(format!("found version `{ver}`"))), }) } diff --git a/src/service/rooms/event_handler/handle_outlier_pdu.rs b/src/service/rooms/event_handler/handle_outlier_pdu.rs index 76aa9054..5339249d 100644 --- a/src/service/rooms/event_handler/handle_outlier_pdu.rs +++ b/src/service/rooms/event_handler/handle_outlier_pdu.rs @@ -130,17 +130,12 @@ pub(super) async fn handle_outlier_pdu<'a>( let key = (ty.to_owned(), sk.into()); ready(auth_events.get(&key)) }; - let event_fetch = |id: &EventId| { - let id = id.to_owned(); - Box::pin(self.services.timeline.get_pdu(&id)) - }; let auth_check = state_res::event_auth::auth_check( &to_room_version(&room_version_id), &incoming_pdu, None, // TODO: third party invite state_fetch, - event_fetch, ) .await .map_err(|e| err!(Request(Forbidden("Auth check failed: {e:?}"))))?;