summaryrefslogtreecommitdiff
path: root/src/api/client_server/state.rs
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2023-08-10 17:01:56 +0000
committerTimo Kösters <timo@koesters.xyz>2023-08-10 17:01:56 +0000
commit0c2cfda3ae923d9e922d5edf379e4d8976a52d4e (patch)
treea8a8ecddf12f8ea183fc8f9948d8483648b9e187 /src/api/client_server/state.rs
parent53f14a2c4c216b529cc63137d8704573197aed19 (diff)
parent4bf8ee1f7481a222efe87235fa400f6cd14ebd11 (diff)
downloadconduit-0c2cfda3ae923d9e922d5edf379e4d8976a52d4e.zip
Merge branch 'next' into 'master'v0.6.0
Merge remote-tracking branch 'origin/next' See merge request famedly/conduit!538
Diffstat (limited to 'src/api/client_server/state.rs')
-rw-r--r--src/api/client_server/state.rs98
1 files changed, 22 insertions, 76 deletions
diff --git a/src/api/client_server/state.rs b/src/api/client_server/state.rs
index d9c1464..d6d3939 100644
--- a/src/api/client_server/state.rs
+++ b/src/api/client_server/state.rs
@@ -7,15 +7,12 @@ use ruma::{
state::{get_state_events, get_state_events_for_key, send_state_event},
},
events::{
- room::{
- canonical_alias::RoomCanonicalAliasEventContent,
- history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent},
- },
- AnyStateEventContent, StateEventType,
+ room::canonical_alias::RoomCanonicalAliasEventContent, AnyStateEventContent, StateEventType,
},
serde::Raw,
EventId, RoomId, UserId,
};
+use tracing::log::warn;
/// # `PUT /_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey}`
///
@@ -85,29 +82,10 @@ pub async fn get_state_events_route(
) -> Result<get_state_events::v3::Response> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
- #[allow(clippy::blocks_in_if_conditions)]
- // Users not in the room should not be able to access the state unless history_visibility is
- // WorldReadable
if !services()
.rooms
- .state_cache
- .is_joined(sender_user, &body.room_id)?
- && !matches!(
- services()
- .rooms
- .state_accessor
- .room_state_get(&body.room_id, &StateEventType::RoomHistoryVisibility, "")?
- .map(|event| {
- serde_json::from_str(event.content.get())
- .map(|e: RoomHistoryVisibilityEventContent| e.history_visibility)
- .map_err(|_| {
- Error::bad_database(
- "Invalid room history visibility event in database.",
- )
- })
- }),
- Some(Ok(HistoryVisibility::WorldReadable))
- )
+ .state_accessor
+ .user_can_see_state_events(&sender_user, &body.room_id)?
{
return Err(Error::BadRequest(
ErrorKind::Forbidden,
@@ -137,29 +115,10 @@ pub async fn get_state_events_for_key_route(
) -> Result<get_state_events_for_key::v3::Response> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
- #[allow(clippy::blocks_in_if_conditions)]
- // Users not in the room should not be able to access the state unless history_visibility is
- // WorldReadable
if !services()
.rooms
- .state_cache
- .is_joined(sender_user, &body.room_id)?
- && !matches!(
- services()
- .rooms
- .state_accessor
- .room_state_get(&body.room_id, &StateEventType::RoomHistoryVisibility, "")?
- .map(|event| {
- serde_json::from_str(event.content.get())
- .map(|e: RoomHistoryVisibilityEventContent| e.history_visibility)
- .map_err(|_| {
- Error::bad_database(
- "Invalid room history visibility event in database.",
- )
- })
- }),
- Some(Ok(HistoryVisibility::WorldReadable))
- )
+ .state_accessor
+ .user_can_see_state_events(&sender_user, &body.room_id)?
{
return Err(Error::BadRequest(
ErrorKind::Forbidden,
@@ -171,10 +130,13 @@ pub async fn get_state_events_for_key_route(
.rooms
.state_accessor
.room_state_get(&body.room_id, &body.event_type, &body.state_key)?
- .ok_or(Error::BadRequest(
- ErrorKind::NotFound,
- "State event not found.",
- ))?;
+ .ok_or_else(|| {
+ warn!(
+ "State event {:?} not found in room {:?}",
+ &body.event_type, &body.room_id
+ );
+ Error::BadRequest(ErrorKind::NotFound, "State event not found.")
+ })?;
Ok(get_state_events_for_key::v3::Response {
content: serde_json::from_str(event.content.get())
@@ -192,29 +154,10 @@ pub async fn get_state_events_for_empty_key_route(
) -> Result<RumaResponse<get_state_events_for_key::v3::Response>> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
- #[allow(clippy::blocks_in_if_conditions)]
- // Users not in the room should not be able to access the state unless history_visibility is
- // WorldReadable
if !services()
.rooms
- .state_cache
- .is_joined(sender_user, &body.room_id)?
- && !matches!(
- services()
- .rooms
- .state_accessor
- .room_state_get(&body.room_id, &StateEventType::RoomHistoryVisibility, "")?
- .map(|event| {
- serde_json::from_str(event.content.get())
- .map(|e: RoomHistoryVisibilityEventContent| e.history_visibility)
- .map_err(|_| {
- Error::bad_database(
- "Invalid room history visibility event in database.",
- )
- })
- }),
- Some(Ok(HistoryVisibility::WorldReadable))
- )
+ .state_accessor
+ .user_can_see_state_events(&sender_user, &body.room_id)?
{
return Err(Error::BadRequest(
ErrorKind::Forbidden,
@@ -226,10 +169,13 @@ pub async fn get_state_events_for_empty_key_route(
.rooms
.state_accessor
.room_state_get(&body.room_id, &body.event_type, "")?
- .ok_or(Error::BadRequest(
- ErrorKind::NotFound,
- "State event not found.",
- ))?;
+ .ok_or_else(|| {
+ warn!(
+ "State event {:?} not found in room {:?}",
+ &body.event_type, &body.room_id
+ );
+ Error::BadRequest(ErrorKind::NotFound, "State event not found.")
+ })?;
Ok(get_state_events_for_key::v3::Response {
content: serde_json::from_str(event.content.get())