mirror of
https://gitlab.com/famedly/conduit.git
synced 2025-06-27 16:35:59 +00:00
Clean up client-server room hierarchy route
This commit is contained in:
parent
3ff6d54be6
commit
833d8f1b70
1 changed files with 33 additions and 2 deletions
|
@ -35,6 +35,37 @@ use tracing::warn;
|
||||||
pub async fn get_hierarchy_route(
|
pub async fn get_hierarchy_route(
|
||||||
body: Ruma<get_hierarchy::v1::IncomingRequest>,
|
body: Ruma<get_hierarchy::v1::IncomingRequest>,
|
||||||
) -> Result<get_hierarchy::v1::Response> {
|
) -> Result<get_hierarchy::v1::Response> {
|
||||||
|
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||||
|
|
||||||
|
// Check if room is world readable
|
||||||
|
let is_world_readable = services()
|
||||||
|
.rooms
|
||||||
|
.state_accessor
|
||||||
|
.room_state_get(&body.room_id, &StateEventType::RoomHistoryVisibility, "")?
|
||||||
|
.map_or(Ok(false), |s| {
|
||||||
|
serde_json::from_str(s.content.get())
|
||||||
|
.map(|c: RoomHistoryVisibilityEventContent| {
|
||||||
|
c.history_visibility == HistoryVisibility::WorldReadable
|
||||||
|
})
|
||||||
|
.map_err(|_| {
|
||||||
|
Error::bad_database("Invalid room history visibility event in database.")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.unwrap_or(false);
|
||||||
|
|
||||||
|
// Reject if user not in room and not world readable
|
||||||
|
if !services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.is_joined(sender_user, &body.room_id)?
|
||||||
|
&& !is_world_readable
|
||||||
|
{
|
||||||
|
return Err(Error::BadRequest(
|
||||||
|
ErrorKind::Forbidden,
|
||||||
|
"You don't have permission to view this room.",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
// from format is '{suggested_only}|{max_depth}|{skip}'
|
// from format is '{suggested_only}|{max_depth}|{skip}'
|
||||||
let (suggested_only, max_depth, start) = body
|
let (suggested_only, max_depth, start) = body
|
||||||
.from
|
.from
|
||||||
|
@ -200,11 +231,11 @@ async fn get_room_chunk(
|
||||||
.map(|c: RoomJoinRulesEventContent| match c.join_rule {
|
.map(|c: RoomJoinRulesEventContent| match c.join_rule {
|
||||||
JoinRule::Invite => SpaceRoomJoinRule::Invite,
|
JoinRule::Invite => SpaceRoomJoinRule::Invite,
|
||||||
JoinRule::Knock => SpaceRoomJoinRule::Knock,
|
JoinRule::Knock => SpaceRoomJoinRule::Knock,
|
||||||
|
JoinRule::KnockRestricted(_) => SpaceRoomJoinRule::KnockRestricted,
|
||||||
JoinRule::Private => SpaceRoomJoinRule::Private,
|
JoinRule::Private => SpaceRoomJoinRule::Private,
|
||||||
JoinRule::Public => SpaceRoomJoinRule::Public,
|
JoinRule::Public => SpaceRoomJoinRule::Public,
|
||||||
JoinRule::Restricted(_) => SpaceRoomJoinRule::Restricted,
|
JoinRule::Restricted(_) => SpaceRoomJoinRule::Restricted,
|
||||||
// Can't convert two type.
|
JoinRule::_Custom(_) => SpaceRoomJoinRule::from(c.join_rule.as_str()),
|
||||||
JoinRule::_Custom(_) => SpaceRoomJoinRule::Private,
|
|
||||||
})
|
})
|
||||||
.map_err(|_| Error::bad_database("Invalid room join rules event in database."))
|
.map_err(|_| Error::bad_database("Invalid room join rules event in database."))
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue