fix: Apply validation to make_join process

This commit is contained in:
timedout
2026-02-06 18:15:39 +00:00
parent 0ea0d09b97
commit 184ae2ebb9
+45 -29
View File
@@ -15,6 +15,7 @@ use conduwuit::{
utils::{ utils::{
self, shuffle, self, shuffle,
stream::{IterStream, ReadyExt}, stream::{IterStream, ReadyExt},
to_canonical_object,
}, },
warn, warn,
}; };
@@ -1012,40 +1013,55 @@ async fn make_join_request(
trace!("make_join response: {:?}", make_join_response); trace!("make_join response: {:?}", make_join_response);
make_join_counter = make_join_counter.saturating_add(1); make_join_counter = make_join_counter.saturating_add(1);
if let Err(ref e) = make_join_response { match make_join_response {
if matches!( | Ok(response) => {
e.kind(), info!("Received make_join response from {remote_server}");
ErrorKind::IncompatibleRoomVersion { .. } | ErrorKind::UnsupportedRoomVersion if let Err(e) = validate_remote_member_event_stub(
) { &MembershipState::Join,
incompatible_room_version_count = sender_user,
incompatible_room_version_count.saturating_add(1); room_id,
} &to_canonical_object(&response.event)?,
) {
warn!("make_join response from {remote_server} failed validation: {e}");
continue;
}
make_join_response_and_server = Ok((response, remote_server.clone()));
break;
},
| Err(e) => {
info!("make_join request to {remote_server} failed: {e}");
if matches!(
e.kind(),
ErrorKind::IncompatibleRoomVersion { .. } | ErrorKind::UnsupportedRoomVersion
) {
incompatible_room_version_count =
incompatible_room_version_count.saturating_add(1);
}
if incompatible_room_version_count > 15 { if incompatible_room_version_count > 15 {
info!( info!(
"15 servers have responded with M_INCOMPATIBLE_ROOM_VERSION or \ "15 servers have responded with M_INCOMPATIBLE_ROOM_VERSION or \
M_UNSUPPORTED_ROOM_VERSION, assuming that conduwuit does not support the \ M_UNSUPPORTED_ROOM_VERSION, assuming that conduwuit does not support \
room version {room_id}: {e}" the room version {room_id}: {e}"
); );
make_join_response_and_server = make_join_response_and_server =
Err!(BadServerResponse("Room version is not supported by Conduwuit")); Err!(BadServerResponse("Room version is not supported by Conduwuit"));
return make_join_response_and_server; return make_join_response_and_server;
} }
if make_join_counter > 40 { if make_join_counter > 40 {
warn!( warn!(
"40 servers failed to provide valid make_join response, assuming no server \ "40 servers failed to provide valid make_join response, assuming no \
can assist in joining." server can assist in joining."
); );
make_join_response_and_server = make_join_response_and_server =
Err!(BadServerResponse("No server available to assist in joining.")); Err!(BadServerResponse("No server available to assist in joining."));
return make_join_response_and_server; return make_join_response_and_server;
} }
},
} }
make_join_response_and_server = make_join_response.map(|r| (r, remote_server.clone()));
if make_join_response_and_server.is_ok() { if make_join_response_and_server.is_ok() {
break; break;
} }