refactor: Fix errors in api/client/membership/

This commit is contained in:
Ginger
2026-04-28 09:16:51 -04:00
parent ccd6072f2d
commit 755006c66d
5 changed files with 69 additions and 69 deletions
+16 -7
View File
@@ -9,7 +9,7 @@ use futures::FutureExt;
use ruma::{ use ruma::{
RoomId, UserId, RoomId, UserId,
api::{ api::{
client::membership::invite_user, client::membership::invite_user::{self, v3::InviteUserId},
federation::membership::{RawStrippedState, create_invite}, federation::membership::{RawStrippedState, create_invite},
}, },
events::room::member::{MembershipState, RoomMemberEventContent}, events::room::member::{MembershipState, RoomMemberEventContent},
@@ -52,7 +52,11 @@ pub(crate) async fn invite_user_route(
.await?; .await?;
match &body.recipient { 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 let sender_filter_level = services
.users .users
.invite_filter_level(recipient_user, sender_user) .invite_filter_level(recipient_user, sender_user)
@@ -96,7 +100,7 @@ pub(crate) async fn invite_user_route(
sender_user, sender_user,
recipient_user, recipient_user,
&body.room_id, &body.room_id,
body.reason.clone(), reason.clone(),
false, false,
) )
.boxed() .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 // We do not add the event_id field to the pdu here because of signature and
// hashes checks // hashes checks
let (event_id, value) = gen_event_id_canonical_json(&response.event, &room_version_id) let (event_id, value) = gen_event_id_canonical_json(
.map_err(|e| { &response.event,
err!(Request(BadJson(warn!("Could not convert event to canonical JSON: {e}")))) &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 { if pdu.event_id != event_id {
return Err!(Request(BadJson(warn!( return Err!(Request(BadJson(warn!(
+21 -23
View File
@@ -24,10 +24,8 @@ use ruma::{
CanonicalJsonObject, CanonicalJsonValue, OwnedRoomId, OwnedServerName, OwnedUserId, RoomId, CanonicalJsonObject, CanonicalJsonValue, OwnedRoomId, OwnedServerName, OwnedUserId, RoomId,
RoomVersionId, UserId, RoomVersionId, UserId,
api::{ api::{
client::{ client::membership::{join_room_by_id, join_room_by_id_or_alias},
error::ErrorKind, error::{ErrorKind, IncompatibleRoomVersionErrorData},
membership::{join_room_by_id, join_room_by_id_or_alias},
},
federation::{self}, federation::{self},
}, },
canonical_json::to_canonical_value, canonical_json::to_canonical_value,
@@ -379,12 +377,15 @@ async fn join_room_by_id_helper_remote(
info!("make_join finished"); 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? // How did we get here?
return Err!(BadServerResponse( 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 = { let join_authorized_via_users_server = {
use RoomVersionId::*; 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 join_event_stub
.get("content") .get("content")
.map(|s| { .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"), 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 // Remove event id if it exists
// v2 rooms join_event_stub.remove("event_id");
match room_version_id {
| RoomVersionId::V1 | RoomVersionId::V2 => {},
| _ => {
join_event_stub.remove("event_id");
},
}
// In order to create a compatible ref hash (EventID) the `hashes` field needs // In order to create a compatible ref hash (EventID) the `hashes` field needs
// to be present // to be present
services services
.server_keys .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 // 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 // Add event_id back
join_event_stub join_event_stub
@@ -489,7 +484,7 @@ async fn join_room_by_id_helper_remote(
); );
let (signed_event_id, signed_value) = 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!( err!(Request(BadJson(warn!(
"Could not convert event to canonical JSON: {e}" "Could not convert event to canonical JSON: {e}"
)))) ))))
@@ -564,7 +559,7 @@ async fn join_room_by_id_helper_remote(
.then(|pdu| { .then(|pdu| {
services services
.server_keys .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| { .inspect_err(|e| {
debug_warn!("Could not validate send_join response room_state event: {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| { .then(|pdu| {
services services
.server_keys .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_filter_map(Result::ok)
.ready_for_each(|(event_id, value)| { .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( let auth_check = state_res::event_auth::auth_check(
&room_version_id.rules().unwrap(), &room_version.rules().unwrap(),
&parsed_join_pdu, &parsed_join_pdu,
None, // TODO: third party invite None, // TODO: third party invite
|k, s| state_fetch(k.clone(), s.into()), |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." rules, but is unable to authorise a join for us. Will continue trying."
); );
}, },
| ErrorKind::IncompatibleRoomVersion { room_version } => { | ErrorKind::IncompatibleRoomVersion(IncompatibleRoomVersionErrorData {
room_version,
..
}) => {
warn!( warn!(
"{remote_server} reports the room we are trying to join is \ "{remote_server} reports the room we are trying to join is \
v{room_version}, which we do not support." v{room_version}, which we do not support."
+1 -4
View File
@@ -1,9 +1,6 @@
use axum::extract::State; use axum::extract::State;
use conduwuit::{Err, Result, matrix::pdu::PduBuilder}; use conduwuit::{Err, Result, matrix::pdu::PduBuilder};
use ruma::{ use ruma::{api::client::membership::kick_user, events::room::member::MembershipState};
api::client::membership::kick_user,
events::room::member::{MembershipState, RoomMemberEventContent},
};
use crate::Ruma; use crate::Ruma;
+23 -26
View File
@@ -16,7 +16,7 @@ use conduwuit::{
use futures::{FutureExt, StreamExt}; use futures::{FutureExt, StreamExt};
use ruma::{ use ruma::{
CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, OwnedRoomId, OwnedServerName, CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, OwnedRoomId, OwnedServerName,
OwnedUserId, RoomId, RoomVersionId, UserId, OwnedUserId, RoomId, UserId,
api::{ api::{
client::knock::knock_room, client::knock::knock_room,
federation::{self}, federation::{self},
@@ -334,17 +334,12 @@ async fn knock_room_helper_local(
) -> Result { ) -> Result {
debug_info!("We can knock locally"); 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!( if !room_version_rules.authorization.knocking {
room_version_id,
RoomVersionId::V1
| RoomVersionId::V2
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
) {
return Err!(Request(Forbidden("This room does not support knocking."))); return Err!(Request(Forbidden("This room does not support knocking.")));
} }
@@ -374,19 +369,18 @@ async fn knock_room_helper_local(
return Err(error); 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) = let (make_knock_response, remote_server) =
make_knock_request(services, sender_user, room_id, servers).await?; make_knock_request(services, sender_user, room_id, servers).await?;
info!("make_knock finished"); 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( return Err!(BadServerResponse("Remote room version {room_version} is not supported"));
"Remote room version {room_version_id} is not supported by conduwuit"
));
} }
let mut knock_event_stub = serde_json::from_str::<CanonicalJsonObject>( let mut knock_event_stub = serde_json::from_str::<CanonicalJsonObject>(
@@ -424,10 +418,10 @@ async fn knock_room_helper_local(
// to be present // to be present
services services
.server_keys .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 // 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 // Add event_id
knock_event_stub knock_event_stub
@@ -506,11 +500,14 @@ async fn knock_room_helper_remote(
info!("make_knock finished"); 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( 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 // to be present
services services
.server_keys .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 // 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 // Add event_id
knock_event_stub knock_event_stub
@@ -625,7 +622,7 @@ async fn knock_room_helper_remote(
continue; continue;
}; };
let event_id = gen_event_id(&event, &room_version_id)?; let event_id = gen_event_id(&event, &room_version_rules)?;
let shortstatekey = services let shortstatekey = services
.rooms .rooms
.short .short
+8 -9
View File
@@ -9,7 +9,7 @@ use conduwuit::{
}; };
use futures::{FutureExt, StreamExt, pin_mut}; use futures::{FutureExt, StreamExt, pin_mut};
use ruma::{ use ruma::{
CanonicalJsonObject, CanonicalJsonValue, OwnedServerName, RoomId, RoomVersionId, UserId, CanonicalJsonObject, CanonicalJsonValue, OwnedServerName, RoomId, UserId,
api::{ api::{
client::membership::leave_room, client::membership::leave_room,
federation::{self}, federation::{self},
@@ -323,6 +323,10 @@ pub async fn remote_leave_room<S: ::std::hash::BuildHasher>(
))); )));
} }
let room_version_rules = room_version_id
.rules()
.expect("room version should have defined rules");
let mut leave_event_stub = serde_json::from_str::<CanonicalJsonObject>( let mut leave_event_stub = serde_json::from_str::<CanonicalJsonObject>(
make_leave_response.event.get(), make_leave_response.event.get(),
) )
@@ -360,21 +364,16 @@ pub async fn remote_leave_room<S: ::std::hash::BuildHasher>(
} }
// room v3 and above removed the "event_id" field from remote PDU format // room v3 and above removed the "event_id" field from remote PDU format
match room_version_id { leave_event_stub.remove("event_id");
| RoomVersionId::V1 | RoomVersionId::V2 => {},
| _ => {
leave_event_stub.remove("event_id");
},
}
// In order to create a compatible ref hash (EventID) the `hashes` field needs // In order to create a compatible ref hash (EventID) the `hashes` field needs
// to be present // to be present
services services
.server_keys .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 // 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 // Add event_id back
leave_event_stub leave_event_stub