From 755006c66db8c2b4a182d3e37b3e9ea8cbbd29b0 Mon Sep 17 00:00:00 2001 From: Ginger Date: Tue, 7 Apr 2026 13:10:34 -0400 Subject: [PATCH] refactor: Fix errors in `api/client/membership/` --- src/api/client/membership/invite.rs | 23 +++++++++----- src/api/client/membership/join.rs | 44 +++++++++++++------------- src/api/client/membership/kick.rs | 5 +-- src/api/client/membership/knock.rs | 49 ++++++++++++++--------------- src/api/client/membership/leave.rs | 17 +++++----- 5 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/api/client/membership/invite.rs b/src/api/client/membership/invite.rs index 76da32c9d..ca7c0eb72 100644 --- a/src/api/client/membership/invite.rs +++ b/src/api/client/membership/invite.rs @@ -9,7 +9,7 @@ use futures::FutureExt; use ruma::{ RoomId, UserId, api::{ - client::membership::invite_user, + client::membership::invite_user::{self, v3::InviteUserId}, federation::membership::{RawStrippedState, create_invite}, }, events::room::member::{MembershipState, RoomMemberEventContent}, @@ -52,7 +52,11 @@ pub(crate) async fn invite_user_route( .await?; match &body.recipient { - | invite_user::v3::InvitationRecipient::UserId { user_id: recipient_user } => { + | invite_user::v3::InvitationRecipient::UserId(InviteUserId { + user_id: recipient_user, + reason, + .. + }) => { let sender_filter_level = services .users .invite_filter_level(recipient_user, sender_user) @@ -96,7 +100,7 @@ pub(crate) async fn invite_user_route( sender_user, recipient_user, &body.room_id, - body.reason.clone(), + reason.clone(), false, ) .boxed() @@ -200,10 +204,15 @@ pub(crate) async fn invite_helper( // We do not add the event_id field to the pdu here because of signature and // hashes checks - let (event_id, value) = gen_event_id_canonical_json(&response.event, &room_version_id) - .map_err(|e| { - err!(Request(BadJson(warn!("Could not convert event to canonical JSON: {e}")))) - })?; + let (event_id, value) = gen_event_id_canonical_json( + &response.event, + &room_version_id + .rules() + .expect("room version should have defined rules"), + ) + .map_err(|e| { + err!(Request(BadJson(warn!("Could not convert event to canonical JSON: {e}")))) + })?; if pdu.event_id != event_id { return Err!(Request(BadJson(warn!( diff --git a/src/api/client/membership/join.rs b/src/api/client/membership/join.rs index 05249a57f..64a5c461e 100644 --- a/src/api/client/membership/join.rs +++ b/src/api/client/membership/join.rs @@ -24,10 +24,8 @@ use ruma::{ CanonicalJsonObject, CanonicalJsonValue, OwnedRoomId, OwnedServerName, OwnedUserId, RoomId, RoomVersionId, UserId, api::{ - client::{ - error::ErrorKind, - membership::{join_room_by_id, join_room_by_id_or_alias}, - }, + client::membership::{join_room_by_id, join_room_by_id_or_alias}, + error::{ErrorKind, IncompatibleRoomVersionErrorData}, federation::{self}, }, canonical_json::to_canonical_value, @@ -379,12 +377,15 @@ async fn join_room_by_id_helper_remote( info!("make_join finished"); - let room_version_id = make_join_response.room_version.unwrap_or(RoomVersionId::V1); + let room_version = make_join_response.room_version.unwrap_or(RoomVersionId::V1); + let room_version_rules = room_version + .rules() + .expect("room version should have defined rules"); - if !services.server.supported_room_version(&room_version_id) { + if !services.server.supported_room_version(&room_version) { // How did we get here? return Err!(BadServerResponse( - "Remote room version {room_version_id} is not supported by conduwuit" + "Remote room version {room_version} is not supported by conduwuit" )); } @@ -397,7 +398,7 @@ async fn join_room_by_id_helper_remote( let join_authorized_via_users_server = { use RoomVersionId::*; - if !matches!(room_version_id, V1 | V2 | V3 | V4 | V5 | V6 | V7) { + if !matches!(room_version, V1 | V2 | V3 | V4 | V5 | V6 | V7) { join_event_stub .get("content") .map(|s| { @@ -432,23 +433,17 @@ async fn join_room_by_id_helper_remote( to_canonical_value(join_content).expect("event is valid, we just created it"), ); - // We keep the "event_id" in the pdu only in v1 or - // v2 rooms - match room_version_id { - | RoomVersionId::V1 | RoomVersionId::V2 => {}, - | _ => { - join_event_stub.remove("event_id"); - }, - } + // Remove event id if it exists + join_event_stub.remove("event_id"); // In order to create a compatible ref hash (EventID) the `hashes` field needs // to be present services .server_keys - .hash_and_sign_event(&mut join_event_stub, &room_version_id)?; + .hash_and_sign_event(&mut join_event_stub, &room_version_rules)?; // Generate event id - let event_id = gen_event_id(&join_event_stub, &room_version_id)?; + let event_id = gen_event_id(&join_event_stub, &room_version_rules)?; // Add event_id back join_event_stub @@ -489,7 +484,7 @@ async fn join_room_by_id_helper_remote( ); let (signed_event_id, signed_value) = - gen_event_id_canonical_json(signed_raw, &room_version_id).map_err(|e| { + gen_event_id_canonical_json(signed_raw, &room_version_rules).map_err(|e| { err!(Request(BadJson(warn!( "Could not convert event to canonical JSON: {e}" )))) @@ -564,7 +559,7 @@ async fn join_room_by_id_helper_remote( .then(|pdu| { services .server_keys - .validate_and_add_event_id_no_fetch(pdu, &room_version_id) + .validate_and_add_event_id_no_fetch(pdu, &room_version_rules) .inspect_err(|e| { debug_warn!("Could not validate send_join response room_state event: {e:?}"); }) @@ -612,7 +607,7 @@ async fn join_room_by_id_helper_remote( .then(|pdu| { services .server_keys - .validate_and_add_event_id_no_fetch(pdu, &room_version_id) + .validate_and_add_event_id_no_fetch(pdu, &room_version_rules) }) .ready_filter_map(Result::ok) .ready_for_each(|(event_id, value)| { @@ -633,7 +628,7 @@ async fn join_room_by_id_helper_remote( }; let auth_check = state_res::event_auth::auth_check( - &room_version_id.rules().unwrap(), + &room_version.rules().unwrap(), &parsed_join_pdu, None, // TODO: third party invite |k, s| state_fetch(k.clone(), s.into()), @@ -857,7 +852,10 @@ async fn make_join_request( rules, but is unable to authorise a join for us. Will continue trying." ); }, - | ErrorKind::IncompatibleRoomVersion { room_version } => { + | ErrorKind::IncompatibleRoomVersion(IncompatibleRoomVersionErrorData { + room_version, + .. + }) => { warn!( "{remote_server} reports the room we are trying to join is \ v{room_version}, which we do not support." diff --git a/src/api/client/membership/kick.rs b/src/api/client/membership/kick.rs index ee166aa57..28b4a71c0 100644 --- a/src/api/client/membership/kick.rs +++ b/src/api/client/membership/kick.rs @@ -1,9 +1,6 @@ use axum::extract::State; use conduwuit::{Err, Result, matrix::pdu::PduBuilder}; -use ruma::{ - api::client::membership::kick_user, - events::room::member::{MembershipState, RoomMemberEventContent}, -}; +use ruma::{api::client::membership::kick_user, events::room::member::MembershipState}; use crate::Ruma; diff --git a/src/api/client/membership/knock.rs b/src/api/client/membership/knock.rs index cd9581db7..4e2175b0f 100644 --- a/src/api/client/membership/knock.rs +++ b/src/api/client/membership/knock.rs @@ -16,7 +16,7 @@ use conduwuit::{ use futures::{FutureExt, StreamExt}; use ruma::{ CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, OwnedRoomId, OwnedServerName, - OwnedUserId, RoomId, RoomVersionId, UserId, + OwnedUserId, RoomId, UserId, api::{ client::knock::knock_room, federation::{self}, @@ -334,17 +334,12 @@ async fn knock_room_helper_local( ) -> Result { debug_info!("We can knock locally"); - let room_version_id = services.rooms.state.get_room_version(room_id).await?; + let room_version = services.rooms.state.get_room_version(room_id).await?; + let room_version_rules = room_version + .rules() + .expect("room version should have defined rules"); - if matches!( - room_version_id, - RoomVersionId::V1 - | RoomVersionId::V2 - | RoomVersionId::V3 - | RoomVersionId::V4 - | RoomVersionId::V5 - | RoomVersionId::V6 - ) { + if !room_version_rules.authorization.knocking { return Err!(Request(Forbidden("This room does not support knocking."))); } @@ -374,19 +369,18 @@ async fn knock_room_helper_local( return Err(error); } - warn!("We couldn't do the knock locally, maybe federation can help to satisfy the knock"); - let (make_knock_response, remote_server) = make_knock_request(services, sender_user, room_id, servers).await?; info!("make_knock finished"); - let room_version_id = make_knock_response.room_version; + let room_version = make_knock_response.room_version; + let room_version_rules = room_version + .rules() + .expect("room version should have defined rules"); - if !services.server.supported_room_version(&room_version_id) { - return Err!(BadServerResponse( - "Remote room version {room_version_id} is not supported by conduwuit" - )); + if !services.server.supported_room_version(&room_version) { + return Err!(BadServerResponse("Remote room version {room_version} is not supported")); } let mut knock_event_stub = serde_json::from_str::( @@ -424,10 +418,10 @@ async fn knock_room_helper_local( // to be present services .server_keys - .hash_and_sign_event(&mut knock_event_stub, &room_version_id)?; + .hash_and_sign_event(&mut knock_event_stub, &room_version_rules)?; // Generate event id - let event_id = gen_event_id(&knock_event_stub, &room_version_id)?; + let event_id = gen_event_id(&knock_event_stub, &room_version_rules)?; // Add event_id knock_event_stub @@ -506,11 +500,14 @@ async fn knock_room_helper_remote( info!("make_knock finished"); - let room_version_id = make_knock_response.room_version; + let room_version = make_knock_response.room_version; + let room_version_rules = room_version + .rules() + .expect("room version should have defined rules"); - if !services.server.supported_room_version(&room_version_id) { + if !services.server.supported_room_version(&room_version) { return Err!(BadServerResponse( - "Remote room version {room_version_id} is not supported by conduwuit" + "Remote room version {room_version} is not supported by conduwuit" )); } @@ -547,10 +544,10 @@ async fn knock_room_helper_remote( // to be present services .server_keys - .hash_and_sign_event(&mut knock_event_stub, &room_version_id)?; + .hash_and_sign_event(&mut knock_event_stub, &room_version_rules)?; // Generate event id - let event_id = gen_event_id(&knock_event_stub, &room_version_id)?; + let event_id = gen_event_id(&knock_event_stub, &room_version_rules)?; // Add event_id knock_event_stub @@ -625,7 +622,7 @@ async fn knock_room_helper_remote( continue; }; - let event_id = gen_event_id(&event, &room_version_id)?; + let event_id = gen_event_id(&event, &room_version_rules)?; let shortstatekey = services .rooms .short diff --git a/src/api/client/membership/leave.rs b/src/api/client/membership/leave.rs index f7a6d05bc..304f23f4a 100644 --- a/src/api/client/membership/leave.rs +++ b/src/api/client/membership/leave.rs @@ -9,7 +9,7 @@ use conduwuit::{ }; use futures::{FutureExt, StreamExt, pin_mut}; use ruma::{ - CanonicalJsonObject, CanonicalJsonValue, OwnedServerName, RoomId, RoomVersionId, UserId, + CanonicalJsonObject, CanonicalJsonValue, OwnedServerName, RoomId, UserId, api::{ client::membership::leave_room, federation::{self}, @@ -323,6 +323,10 @@ pub async fn remote_leave_room( ))); } + let room_version_rules = room_version_id + .rules() + .expect("room version should have defined rules"); + let mut leave_event_stub = serde_json::from_str::( make_leave_response.event.get(), ) @@ -360,21 +364,16 @@ pub async fn remote_leave_room( } // room v3 and above removed the "event_id" field from remote PDU format - match room_version_id { - | RoomVersionId::V1 | RoomVersionId::V2 => {}, - | _ => { - leave_event_stub.remove("event_id"); - }, - } + leave_event_stub.remove("event_id"); // In order to create a compatible ref hash (EventID) the `hashes` field needs // to be present services .server_keys - .hash_and_sign_event(&mut leave_event_stub, &room_version_id)?; + .hash_and_sign_event(&mut leave_event_stub, &room_version_rules)?; // Generate event id - let event_id = gen_event_id(&leave_event_stub, &room_version_id)?; + let event_id = gen_event_id(&leave_event_stub, &room_version_rules)?; // Add event_id back leave_event_stub