1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2024-11-05 06:38:51 +01:00

style(db/rooms): refactor admin room pdu validating

This commit is contained in:
AndSDev 2022-08-31 08:22:45 +00:00
parent da2dbd2877
commit 912491cb28

View file

@ -691,47 +691,50 @@ impl Service {
.expect("#admins:server_name is a valid room alias"), .expect("#admins:server_name is a valid room alias"),
)?; )?;
if admin_room.filter(|v| v == room_id).is_some() { if admin_room.filter(|v| v == room_id).is_some() {
if pdu.event_type() == &RoomEventType::RoomEncryption { match pdu.event_type() {
warn!("Encryption is not allowed in the admins room"); RoomEventType::RoomEncryption => {
return Err(Error::BadRequest( warn!("Encryption is not allowed in the admins room");
ErrorKind::Forbidden, return Err(Error::BadRequest(
"Encryption is not allowed in the admins room.", ErrorKind::Forbidden,
)); "Encryption is not allowed in the admins room.",
} ));
if pdu.event_type() == &RoomEventType::RoomMember {
#[derive(Deserialize)]
struct ExtractMembership {
membership: MembershipState,
} }
RoomEventType::RoomMember => {
let content = serde_json::from_str::<ExtractMembership>(pdu.content.get()) #[derive(Deserialize)]
.map_err(|_| Error::bad_database("Invalid content in pdu."))?; struct ExtractMembership {
membership: MembershipState,
if content.membership == MembershipState::Leave {
let server_user = format!("@conduit:{}", services().globals.server_name());
if sender == &server_user {
warn!("Conduit user cannot leave from admins room");
return Err(Error::BadRequest(
ErrorKind::Forbidden,
"Conduit user cannot leave from admins room.",
));
} }
let count = services() let content = serde_json::from_str::<ExtractMembership>(pdu.content.get())
.rooms .map_err(|_| Error::bad_database("Invalid content in pdu."))?;
.state_cache
.room_members(room_id) if content.membership == MembershipState::Leave {
.filter_map(|m| m.ok()) let server_user = format!("@conduit:{}", services().globals.server_name());
.filter(|m| m.server_name() == services().globals.server_name()) if sender == &server_user {
.count(); warn!("Conduit user cannot leave from admins room");
if count < 3 { return Err(Error::BadRequest(
warn!("Last admin cannot leave from admins room"); ErrorKind::Forbidden,
return Err(Error::BadRequest( "Conduit user cannot leave from admins room.",
ErrorKind::Forbidden, ));
"Last admin cannot leave from admins room.", }
));
let count = services()
.rooms
.state_cache
.room_members(room_id)
.filter_map(|m| m.ok())
.filter(|m| m.server_name() == services().globals.server_name())
.count();
if count < 3 {
warn!("Last admin cannot leave from admins room");
return Err(Error::BadRequest(
ErrorKind::Forbidden,
"Last admin cannot leave from admins room.",
));
}
} }
} }
_ => {}
} }
} }