reduce RoomVersionId patterns

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-07-12 01:08:53 +00:00
parent b87f1649d4
commit b8baa1223d
7 changed files with 121 additions and 197 deletions

View file

@ -780,14 +780,9 @@ async fn join_room_by_id_helper_remote(
info!("send_join finished"); info!("send_join finished");
if join_authorized_via_users_server.is_some() { if join_authorized_via_users_server.is_some() {
use RoomVersionId::*;
match &room_version_id { match &room_version_id {
RoomVersionId::V1 V1 | V2 | V3 | V4 | V5 | V6 | V7 => {
| RoomVersionId::V2
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7 => {
warn!( warn!(
"Found `join_authorised_via_users_server` but room {} is version {}. Ignoring.", "Found `join_authorised_via_users_server` but room {} is version {}. Ignoring.",
room_id, &room_version_id room_id, &room_version_id
@ -795,7 +790,7 @@ async fn join_room_by_id_helper_remote(
}, },
// only room versions 8 and above using `join_authorized_via_users_server` (restricted joins) need to // only room versions 8 and above using `join_authorized_via_users_server` (restricted joins) need to
// validate and send signatures // validate and send signatures
RoomVersionId::V8 | RoomVersionId::V9 | RoomVersionId::V10 | RoomVersionId::V11 => { V8 | V9 | V10 | V11 => {
if let Some(signed_raw) = &send_join_response.room_state.event { if let Some(signed_raw) = &send_join_response.room_state.event {
info!( info!(
"There is a signed event. This room is probably using restricted joins. Adding signature to \ "There is a signed event. This room is probably using restricted joins. Adding signature to \

View file

@ -118,6 +118,8 @@ pub(crate) async fn create_room_route(body: Ruma<create_room::v3::Request>) -> R
let content = match &body.creation_content { let content = match &body.creation_content {
Some(content) => { Some(content) => {
use RoomVersionId::*;
let mut content = content let mut content = content
.deserialize_as::<CanonicalJsonObject>() .deserialize_as::<CanonicalJsonObject>()
.map_err(|e| { .map_err(|e| {
@ -125,16 +127,7 @@ pub(crate) async fn create_room_route(body: Ruma<create_room::v3::Request>) -> R
Error::bad_database("Failed to deserialise content as canonical JSON.") Error::bad_database("Failed to deserialise content as canonical JSON.")
})?; })?;
match room_version { match room_version {
RoomVersionId::V1 V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => {
| RoomVersionId::V2
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10 => {
content.insert( content.insert(
"creator".into(), "creator".into(),
json!(&sender_user).try_into().map_err(|e| { json!(&sender_user).try_into().map_err(|e| {
@ -143,7 +136,7 @@ pub(crate) async fn create_room_route(body: Ruma<create_room::v3::Request>) -> R
})?, })?,
); );
}, },
RoomVersionId::V11 => {}, // V11 removed the "creator" key V11 => {}, // V11 removed the "creator" key
_ => { _ => {
warn!("Unexpected or unsupported room version {room_version}"); warn!("Unexpected or unsupported room version {room_version}");
return Err(Error::BadRequest( return Err(Error::BadRequest(
@ -152,7 +145,6 @@ pub(crate) async fn create_room_route(body: Ruma<create_room::v3::Request>) -> R
)); ));
}, },
} }
content.insert( content.insert(
"room_version".into(), "room_version".into(),
json!(room_version.as_str()) json!(room_version.as_str())
@ -162,18 +154,11 @@ pub(crate) async fn create_room_route(body: Ruma<create_room::v3::Request>) -> R
content content
}, },
None => { None => {
use RoomVersionId::*;
let content = match room_version { let content = match room_version {
RoomVersionId::V1 V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => RoomCreateEventContent::new_v1(sender_user.clone()),
| RoomVersionId::V2 V11 => RoomCreateEventContent::new_v11(),
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10 => RoomCreateEventContent::new_v1(sender_user.clone()),
RoomVersionId::V11 => RoomCreateEventContent::new_v11(),
_ => { _ => {
warn!("Unexpected or unsupported room version {room_version}"); warn!("Unexpected or unsupported room version {room_version}");
return Err(Error::BadRequest( return Err(Error::BadRequest(
@ -623,17 +608,10 @@ pub(crate) async fn upgrade_room_route(body: Ruma<upgrade_room::v3::Request>) ->
// Send a m.room.create event containing a predecessor field and the applicable // Send a m.room.create event containing a predecessor field and the applicable
// room_version // room_version
{
use RoomVersionId::*;
match body.new_version { match body.new_version {
RoomVersionId::V1 V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => {
| RoomVersionId::V2
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10 => {
create_event_content.insert( create_event_content.insert(
"creator".into(), "creator".into(),
json!(&sender_user).try_into().map_err(|e| { json!(&sender_user).try_into().map_err(|e| {
@ -642,7 +620,7 @@ pub(crate) async fn upgrade_room_route(body: Ruma<upgrade_room::v3::Request>) ->
})?, })?,
); );
}, },
RoomVersionId::V11 => { V11 => {
// "creator" key no longer exists in V11 rooms // "creator" key no longer exists in V11 rooms
create_event_content.remove("creator"); create_event_content.remove("creator");
}, },
@ -654,6 +632,7 @@ pub(crate) async fn upgrade_room_route(body: Ruma<upgrade_room::v3::Request>) ->
)); ));
}, },
} }
}
create_event_content.insert( create_event_content.insert(
"room_version".into(), "room_version".into(),

View file

@ -7,7 +7,7 @@ use ruma::{
}, },
StateEventType, TimelineEventType, StateEventType, TimelineEventType,
}, },
RoomId, RoomVersionId, UserId, CanonicalJsonObject, RoomId, RoomVersionId, UserId,
}; };
use serde_json::value::to_raw_value; use serde_json::value::to_raw_value;
use tracing::warn; use tracing::warn;
@ -144,27 +144,7 @@ pub(crate) async fn create_join_event_template_route(
drop(state_lock); drop(state_lock);
// 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 { maybe_strip_event_id(&mut pdu_json, &room_version_id)?;
RoomVersionId::V1 | RoomVersionId::V2 => {},
RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10
| RoomVersionId::V11 => {
pdu_json.remove("event_id");
},
_ => {
warn!("Unexpected or unsupported room version {room_version_id}");
return Err(Error::BadRequest(
ErrorKind::BadJson,
"Unexpected or unsupported room version found",
));
},
};
Ok(prepare_join_event::v1::Response { Ok(prepare_join_event::v1::Response {
room_version: Some(room_version_id), room_version: Some(room_version_id),
@ -179,6 +159,8 @@ pub(crate) async fn create_join_event_template_route(
pub(crate) fn user_can_perform_restricted_join( pub(crate) fn user_can_perform_restricted_join(
user_id: &UserId, room_id: &RoomId, room_version_id: &RoomVersionId, user_id: &UserId, room_id: &RoomId, room_version_id: &RoomVersionId,
) -> Result<bool> { ) -> Result<bool> {
use RoomVersionId::*;
let join_rules_event = let join_rules_event =
services() services()
.rooms .rooms
@ -198,16 +180,7 @@ pub(crate) fn user_can_perform_restricted_join(
return Ok(false); return Ok(false);
}; };
if matches!( if matches!(room_version_id, V1 | V2 | V3 | V4 | V5 | V6 | V7) {
room_version_id,
RoomVersionId::V1
| RoomVersionId::V2
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
) {
return Ok(false); return Ok(false);
} }
@ -239,3 +212,23 @@ pub(crate) fn user_can_perform_restricted_join(
)) ))
} }
} }
pub(crate) fn maybe_strip_event_id(pdu_json: &mut CanonicalJsonObject, room_version_id: &RoomVersionId) -> Result<()> {
use RoomVersionId::*;
match room_version_id {
V1 | V2 => {},
V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 | V11 => {
pdu_json.remove("event_id");
},
_ => {
warn!("Unexpected or unsupported room version {room_version_id}");
return Err(Error::BadRequest(
ErrorKind::BadJson,
"Unexpected or unsupported room version found",
));
},
};
Ok(())
}

View file

@ -1,14 +1,15 @@
use conduit::{Error, Result};
use ruma::{ use ruma::{
api::{client::error::ErrorKind, federation::membership::prepare_leave_event}, api::{client::error::ErrorKind, federation::membership::prepare_leave_event},
events::{ events::{
room::member::{MembershipState, RoomMemberEventContent}, room::member::{MembershipState, RoomMemberEventContent},
TimelineEventType, TimelineEventType,
}, },
RoomVersionId,
}; };
use serde_json::value::to_raw_value; use serde_json::value::to_raw_value;
use crate::{service::pdu::PduBuilder, services, Error, Result, Ruma}; use super::make_join::maybe_strip_event_id;
use crate::{service::pdu::PduBuilder, services, Ruma};
/// # `PUT /_matrix/federation/v1/make_leave/{roomId}/{eventId}` /// # `PUT /_matrix/federation/v1/make_leave/{roomId}/{eventId}`
/// ///
@ -64,26 +65,7 @@ pub(crate) async fn create_leave_event_template_route(
drop(state_lock); drop(state_lock);
// 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 { maybe_strip_event_id(&mut pdu_json, &room_version_id)?;
RoomVersionId::V1 | RoomVersionId::V2 => {},
RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10
| RoomVersionId::V11 => {
pdu_json.remove("event_id");
},
_ => {
return Err(Error::BadRequest(
ErrorKind::BadJson,
"Unexpected or unsupported room version found",
));
},
};
Ok(prepare_leave_event::v1::Response { Ok(prepare_leave_event::v1::Response {
room_version: Some(room_version_id), room_version: Some(room_version_id),

View file

@ -41,18 +41,12 @@ pub async fn create_admin_room() -> Result<()> {
services().users.create(server_user, None)?; services().users.create(server_user, None)?;
let room_version = services().globals.default_room_version(); let room_version = services().globals.default_room_version();
let mut content = match room_version {
RoomVersionId::V1 let mut content = {
| RoomVersionId::V2 use RoomVersionId::*;
| RoomVersionId::V3 match room_version {
| RoomVersionId::V4 V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => RoomCreateEventContent::new_v1(server_user.clone()),
| RoomVersionId::V5 V11 => RoomCreateEventContent::new_v11(),
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10 => RoomCreateEventContent::new_v1(server_user.clone()),
RoomVersionId::V11 => RoomCreateEventContent::new_v11(),
_ => { _ => {
warn!("Unexpected or unsupported room version {}", room_version); warn!("Unexpected or unsupported room version {}", room_version);
return Err(Error::BadRequest( return Err(Error::BadRequest(
@ -60,6 +54,7 @@ pub async fn create_admin_room() -> Result<()> {
"Unexpected or unsupported room version found", "Unexpected or unsupported room version found",
)); ));
}, },
}
}; };
content.federate = true; content.federate = true;

View file

@ -551,22 +551,16 @@ impl Service {
// Soft fail check before doing state res // Soft fail check before doing state res
debug!("Performing soft-fail check"); debug!("Performing soft-fail check");
let soft_fail = !state_res::event_auth::auth_check(&room_version, &incoming_pdu, None::<PduEvent>, |k, s| { let soft_fail = {
use RoomVersionId::*;
!state_res::event_auth::auth_check(&room_version, &incoming_pdu, None::<PduEvent>, |k, s| {
auth_events.get(&(k.clone(), s.to_owned())) auth_events.get(&(k.clone(), s.to_owned()))
}) })
.map_err(|_e| Error::BadRequest(ErrorKind::forbidden(), "Auth check failed."))? .map_err(|_e| Error::BadRequest(ErrorKind::forbidden(), "Auth check failed."))?
|| incoming_pdu.kind == TimelineEventType::RoomRedaction || incoming_pdu.kind == TimelineEventType::RoomRedaction
&& match room_version_id { && match room_version_id {
RoomVersionId::V1 V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => {
| RoomVersionId::V2
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10 => {
if let Some(redact_id) = &incoming_pdu.redacts { if let Some(redact_id) = &incoming_pdu.redacts {
!services().rooms.state_accessor.user_can_redact( !services().rooms.state_accessor.user_can_redact(
redact_id, redact_id,
@ -593,6 +587,7 @@ impl Service {
false false
} }
}, },
}
}; };
// 13. Use state resolution to find new room state // 13. Use state resolution to find new room state

View file

@ -389,18 +389,11 @@ impl Service {
match pdu.kind { match pdu.kind {
TimelineEventType::RoomRedaction => { TimelineEventType::RoomRedaction => {
use RoomVersionId::*;
let room_version_id = services().rooms.state.get_room_version(&pdu.room_id)?; let room_version_id = services().rooms.state.get_room_version(&pdu.room_id)?;
match room_version_id { match room_version_id {
RoomVersionId::V1 V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => {
| RoomVersionId::V2
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10 => {
if let Some(redact_id) = &pdu.redacts { if let Some(redact_id) = &pdu.redacts {
if services().rooms.state_accessor.user_can_redact( if services().rooms.state_accessor.user_can_redact(
redact_id, redact_id,
@ -412,7 +405,7 @@ impl Service {
} }
} }
}, },
RoomVersionId::V11 => { V11 => {
let content = let content =
serde_json::from_str::<RoomRedactionEventContent>(pdu.content.get()).map_err(|e| { serde_json::from_str::<RoomRedactionEventContent>(pdu.content.get()).map_err(|e| {
warn!("Invalid content in redaction pdu: {e}"); warn!("Invalid content in redaction pdu: {e}");
@ -868,17 +861,9 @@ impl Service {
// If redaction event is not authorized, do not append it to the timeline // If redaction event is not authorized, do not append it to the timeline
if pdu.kind == TimelineEventType::RoomRedaction { if pdu.kind == TimelineEventType::RoomRedaction {
use RoomVersionId::*;
match services().rooms.state.get_room_version(&pdu.room_id)? { match services().rooms.state.get_room_version(&pdu.room_id)? {
RoomVersionId::V1 V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => {
| RoomVersionId::V2
| RoomVersionId::V3
| RoomVersionId::V4
| RoomVersionId::V5
| RoomVersionId::V6
| RoomVersionId::V7
| RoomVersionId::V8
| RoomVersionId::V9
| RoomVersionId::V10 => {
if let Some(redact_id) = &pdu.redacts { if let Some(redact_id) = &pdu.redacts {
if !services().rooms.state_accessor.user_can_redact( if !services().rooms.state_accessor.user_can_redact(
redact_id, redact_id,