reduce RoomVersionId patterns
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
b87f1649d4
commit
b8baa1223d
7 changed files with 121 additions and 197 deletions
|
@ -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 \
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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(())
|
||||||
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue