From 00b77144c192618c75e6c5c0106e021f18f2bbac Mon Sep 17 00:00:00 2001 From: avdb13 Date: Mon, 22 Jul 2024 13:38:29 +0200 Subject: [PATCH] chore: deprecate support for unstable room versions --- src/api/client_server/capabilities.rs | 3 -- src/api/client_server/room.rs | 53 +++++++++------------------ src/config.rs | 2 - src/service/admin.rs | 25 ++++++------- src/service/globals.rs | 27 ++------------ src/service/rooms/event_handler.rs | 15 ++------ src/service/rooms/timeline.rs | 17 +++------ 7 files changed, 41 insertions(+), 101 deletions(-) diff --git a/src/api/client_server/capabilities.rs b/src/api/client_server/capabilities.rs index 8a7d6b10..515ebfc1 100644 --- a/src/api/client_server/capabilities.rs +++ b/src/api/client_server/capabilities.rs @@ -14,9 +14,6 @@ pub(crate) async fn get_capabilities_route( _body: Ar, ) -> Result> { let mut available = BTreeMap::new(); - for room_version in &services().globals.unstable_room_versions { - available.insert(room_version.clone(), RoomVersionStability::Unstable); - } for room_version in &services().globals.stable_room_versions { available.insert(room_version.clone(), RoomVersionStability::Stable); } diff --git a/src/api/client_server/room.rs b/src/api/client_server/room.rs index c02526b3..835a57f4 100644 --- a/src/api/client_server/room.rs +++ b/src/api/client_server/room.rs @@ -138,17 +138,8 @@ pub(crate) async fn create_room_route( .deserialize_as::() .expect("Invalid creation content"); - match room_version { - RoomVersionId::V1 - | RoomVersionId::V2 - | RoomVersionId::V3 - | RoomVersionId::V4 - | RoomVersionId::V5 - | RoomVersionId::V6 - | RoomVersionId::V7 - | RoomVersionId::V8 - | RoomVersionId::V9 - | RoomVersionId::V10 => { + match &room_version { + room_version if *room_version < RoomVersionId::V11 => { content.insert( "creator".into(), json!(&sender_user).try_into().map_err(|_| { @@ -161,7 +152,11 @@ pub(crate) async fn create_room_route( } // V11 removed the "creator" key RoomVersionId::V11 => {} - _ => unreachable!("Validity of room version already checked"), + _ => { + return Err(Error::BadServerResponse( + "Unsupported room version.", + )) + } } content.insert( @@ -176,21 +171,16 @@ pub(crate) async fn create_room_route( content } None => { - let content = match room_version { - RoomVersionId::V1 - | RoomVersionId::V2 - | RoomVersionId::V3 - | RoomVersionId::V4 - | RoomVersionId::V5 - | RoomVersionId::V6 - | RoomVersionId::V7 - | RoomVersionId::V8 - | RoomVersionId::V9 - | RoomVersionId::V10 => { + let content = match &room_version { + room_version if *room_version < RoomVersionId::V11 => { RoomCreateEventContent::new_v1(sender_user.to_owned()) } RoomVersionId::V11 => RoomCreateEventContent::new_v11(), - _ => unreachable!("Validity of room version already checked"), + _ => { + return Err(Error::BadServerResponse( + "Unsupported room version.", + )) + } }; let mut content = serde_json::from_str::( to_raw_value(&content) @@ -671,17 +661,8 @@ pub(crate) async fn upgrade_room_route( // Send a m.room.create event containing a predecessor field and the // applicable room_version - match body.new_version { - RoomVersionId::V1 - | RoomVersionId::V2 - | RoomVersionId::V3 - | RoomVersionId::V4 - | RoomVersionId::V5 - | RoomVersionId::V6 - | RoomVersionId::V7 - | RoomVersionId::V8 - | RoomVersionId::V9 - | RoomVersionId::V10 => { + match &body.new_version { + room_version if *room_version < RoomVersionId::V11 => { create_event_content.insert( "creator".into(), json!(&sender_user).try_into().map_err(|_| { @@ -696,7 +677,7 @@ pub(crate) async fn upgrade_room_route( // "creator" key no longer exists in V11 rooms create_event_content.remove("creator"); } - _ => unreachable!("Validity of room version already checked"), + _ => return Err(Error::BadServerResponse("Unsupported room version.")), } create_event_content.insert( "room_version".into(), diff --git a/src/config.rs b/src/config.rs index 6fe3a43e..90b047c8 100644 --- a/src/config.rs +++ b/src/config.rs @@ -50,8 +50,6 @@ pub(crate) struct Config { pub(crate) allow_encryption: bool, #[serde(default = "true_fn")] pub(crate) allow_room_creation: bool, - #[serde(default = "true_fn")] - pub(crate) allow_unstable_room_versions: bool, #[serde(default = "default_default_room_version")] pub(crate) default_room_version: RoomVersionId, #[serde(default)] diff --git a/src/service/admin.rs b/src/service/admin.rs index e18a2039..43c9753d 100644 --- a/src/service/admin.rs +++ b/src/service/admin.rs @@ -1222,21 +1222,18 @@ impl Service { services().users.create(&services().globals.admin_bot_user_id, None)?; let room_version = services().globals.default_room_version(); - let mut content = match room_version { - RoomVersionId::V1 - | RoomVersionId::V2 - | RoomVersionId::V3 - | RoomVersionId::V4 - | RoomVersionId::V5 - | RoomVersionId::V6 - | RoomVersionId::V7 - | RoomVersionId::V8 - | RoomVersionId::V9 - | RoomVersionId::V10 => RoomCreateEventContent::new_v1( - services().globals.admin_bot_user_id.clone(), - ), + let mut content = match &room_version { + room_version if *room_version < RoomVersionId::V11 => { + RoomCreateEventContent::new_v1( + services().globals.admin_bot_user_id.clone(), + ) + } RoomVersionId::V11 => RoomCreateEventContent::new_v11(), - _ => unreachable!("Validity of room version already checked"), + _ => { + return Err(Error::BadServerResponse( + "Unsupported room version.", + )) + } }; content.federate = true; content.predecessor = None; diff --git a/src/service/globals.rs b/src/service/globals.rs index 7ef6fbb7..2bdad38c 100644 --- a/src/service/globals.rs +++ b/src/service/globals.rs @@ -68,7 +68,6 @@ pub(crate) struct Service { federation_client: reqwest::Client, default_client: reqwest::Client, pub(crate) stable_room_versions: Vec, - pub(crate) unstable_room_versions: Vec, pub(crate) admin_bot_user_id: OwnedUserId, pub(crate) admin_bot_room_alias_id: OwnedRoomAliasId, pub(crate) bad_event_ratelimiter: @@ -224,9 +223,6 @@ impl Service { RoomVersionId::V10, RoomVersionId::V11, ]; - // Experimental, partially supported room versions - let unstable_room_versions = - vec![RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5]; let admin_bot_user_id = UserId::parse(format!( "@{}:{}", @@ -268,7 +264,6 @@ impl Service { default_client, jwt_decoding_key, stable_room_versions, - unstable_room_versions, admin_bot_user_id, admin_bot_room_alias_id, bad_event_ratelimiter: Arc::new(RwLock::new(HashMap::new())), @@ -369,10 +364,6 @@ impl Service { self.config.allow_room_creation } - pub(crate) fn allow_unstable_room_versions(&self) -> bool { - self.config.allow_unstable_room_versions - } - pub(crate) fn default_room_version(&self) -> RoomVersionId { self.config.default_room_version.clone() } @@ -416,12 +407,7 @@ impl Service { } pub(crate) fn supported_room_versions(&self) -> Vec { - let mut room_versions: Vec = vec![]; - room_versions.extend(self.stable_room_versions.clone()); - if self.allow_unstable_room_versions() { - room_versions.extend(self.unstable_room_versions.clone()); - }; - room_versions + self.stable_room_versions.clone() } /// This doesn't actually check that the keys provided are newer than the @@ -479,15 +465,10 @@ impl Service { &self, keys: SigningKeys, timestamp: MilliSecondsSinceUnixEpoch, - room_version_id: &RoomVersionId, + _room_version_id: &RoomVersionId, ) -> Option> { - let all_valid = keys.valid_until_ts > timestamp - // valid_until_ts MUST be ignored in room versions 1, 2, 3, and 4. - // https://spec.matrix.org/v1.10/server-server-api/#get_matrixkeyv2server - || matches!(room_version_id, RoomVersionId::V1 - | RoomVersionId::V2 - | RoomVersionId::V4 - | RoomVersionId::V3); + let all_valid = keys.valid_until_ts > timestamp; + all_valid.then(|| { // Given that either the room version allows stale keys, or the // valid_until_ts is in the future, all verify_keys are diff --git a/src/service/rooms/event_handler.rs b/src/service/rooms/event_handler.rs index 3817fb90..1970ea3e 100644 --- a/src/service/rooms/event_handler.rs +++ b/src/service/rooms/event_handler.rs @@ -942,16 +942,7 @@ impl Service { })? || incoming_pdu.kind == TimelineEventType::RoomRedaction && match room_version_id { - RoomVersionId::V1 - | RoomVersionId::V2 - | RoomVersionId::V3 - | RoomVersionId::V4 - | RoomVersionId::V5 - | RoomVersionId::V6 - | RoomVersionId::V7 - | RoomVersionId::V8 - | RoomVersionId::V9 - | RoomVersionId::V10 => { + room_version if *room_version < RoomVersionId::V11 => { if let Some(redact_id) = &incoming_pdu.redacts { !services().rooms.state_accessor.user_can_redact( redact_id, @@ -985,7 +976,9 @@ impl Service { } } _ => { - unreachable!("Validity of room version already checked") + return Err(Error::BadServerResponse( + "Unsupported room version.", + )) } }; diff --git a/src/service/rooms/timeline.rs b/src/service/rooms/timeline.rs index b325f198..f1b9364f 100644 --- a/src/service/rooms/timeline.rs +++ b/src/service/rooms/timeline.rs @@ -391,17 +391,8 @@ impl Service { TimelineEventType::RoomRedaction => { let room_version_id = services().rooms.state.get_room_version(&pdu.room_id)?; - match room_version_id { - RoomVersionId::V1 - | RoomVersionId::V2 - | RoomVersionId::V3 - | RoomVersionId::V4 - | RoomVersionId::V5 - | RoomVersionId::V6 - | RoomVersionId::V7 - | RoomVersionId::V8 - | RoomVersionId::V9 - | RoomVersionId::V10 => { + match &room_version_id { + room_version if *room_version < RoomVersionId::V11 => { if let Some(redact_id) = &pdu.redacts { if services().rooms.state_accessor.user_can_redact( redact_id, @@ -435,7 +426,9 @@ impl Service { } } _ => { - unreachable!("Validity of room version already checked") + return Err(Error::BadServerResponse( + "Unsupported room version.", + )); } }; }