refactor to room_state_get_content() for serde_json::from_ elim
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
68315ac112
commit
f7af6966b7
7 changed files with 91 additions and 142 deletions
|
@ -190,32 +190,31 @@ impl Service {
|
|||
// Always allow the server service account to remove the alias, since there may not be an admin room
|
||||
|| server_user == user_id
|
||||
{
|
||||
Ok(true)
|
||||
// Checking whether the user is able to change canonical aliases of the
|
||||
// room
|
||||
} else if let Ok(event) = self
|
||||
return Ok(true);
|
||||
}
|
||||
|
||||
// Checking whether the user is able to change canonical aliases of the room
|
||||
if let Ok(content) = self
|
||||
.services
|
||||
.state_accessor
|
||||
.room_state_get(&room_id, &StateEventType::RoomPowerLevels, "")
|
||||
.room_state_get_content::<RoomPowerLevelsEventContent>(&room_id, &StateEventType::RoomPowerLevels, "")
|
||||
.await
|
||||
{
|
||||
serde_json::from_str(event.content.get())
|
||||
.map_err(|_| Error::bad_database("Invalid event content for m.room.power_levels"))
|
||||
.map(|content: RoomPowerLevelsEventContent| {
|
||||
RoomPowerLevels::from(content).user_can_send_state(user_id, StateEventType::RoomCanonicalAlias)
|
||||
})
|
||||
return Ok(RoomPowerLevels::from(content).user_can_send_state(user_id, StateEventType::RoomCanonicalAlias));
|
||||
}
|
||||
|
||||
// If there is no power levels event, only the room creator can change
|
||||
// canonical aliases
|
||||
} else if let Ok(event) = self
|
||||
if let Ok(event) = self
|
||||
.services
|
||||
.state_accessor
|
||||
.room_state_get(&room_id, &StateEventType::RoomCreate, "")
|
||||
.await
|
||||
{
|
||||
Ok(event.sender == user_id)
|
||||
} else {
|
||||
Err(Error::bad_database("Room has no m.room.create event"))
|
||||
return Ok(event.sender == user_id);
|
||||
}
|
||||
|
||||
Err!(Database("Room has no m.room.create event"))
|
||||
}
|
||||
|
||||
async fn who_created_alias(&self, alias: &RoomAliasId) -> Result<OwnedUserId> {
|
||||
|
|
|
@ -380,14 +380,9 @@ impl Service {
|
|||
let join_rule = self
|
||||
.services
|
||||
.state_accessor
|
||||
.room_state_get(room_id, &StateEventType::RoomJoinRules, "")
|
||||
.room_state_get_content(room_id, &StateEventType::RoomJoinRules, "")
|
||||
.await
|
||||
.map_or(JoinRule::Invite, |s| {
|
||||
serde_json::from_str(s.content.get())
|
||||
.map(|c: RoomJoinRulesEventContent| c.join_rule)
|
||||
.map_err(|e| err!(Database(error!("Invalid room join rule event in database: {e}"))))
|
||||
.unwrap()
|
||||
});
|
||||
.map_or(JoinRule::Invite, |c: RoomJoinRulesEventContent| c.join_rule);
|
||||
|
||||
let allowed_room_ids = self
|
||||
.services
|
||||
|
|
|
@ -338,14 +338,13 @@ impl Service {
|
|||
.map(|c: RoomNameEventContent| c.name)
|
||||
}
|
||||
|
||||
pub async fn get_avatar(&self, room_id: &RoomId) -> ruma::JsOption<RoomAvatarEventContent> {
|
||||
self.room_state_get(room_id, &StateEventType::RoomAvatar, "")
|
||||
pub async fn get_avatar(&self, room_id: &RoomId) -> JsOption<RoomAvatarEventContent> {
|
||||
let content = self
|
||||
.room_state_get_content(room_id, &StateEventType::RoomAvatar, "")
|
||||
.await
|
||||
.map_or(ruma::JsOption::Undefined, |s| {
|
||||
serde_json::from_str(s.content.get())
|
||||
.map_err(|_| Error::bad_database("Invalid room avatar event in database."))
|
||||
.unwrap()
|
||||
})
|
||||
.ok();
|
||||
|
||||
JsOption::from_option(content)
|
||||
}
|
||||
|
||||
pub async fn get_member(&self, room_id: &RoomId, user_id: &UserId) -> Result<RoomMemberEventContent> {
|
||||
|
@ -416,16 +415,10 @@ impl Service {
|
|||
&self, redacts: &EventId, sender: &UserId, room_id: &RoomId, federation: bool,
|
||||
) -> Result<bool> {
|
||||
if let Ok(event) = self
|
||||
.room_state_get(room_id, &StateEventType::RoomPowerLevels, "")
|
||||
.room_state_get_content::<RoomPowerLevelsEventContent>(room_id, &StateEventType::RoomPowerLevels, "")
|
||||
.await
|
||||
{
|
||||
let Ok(event) = serde_json::from_str(event.content.get())
|
||||
.map(|content: RoomPowerLevelsEventContent| content.into())
|
||||
.map(|event: RoomPowerLevels| event)
|
||||
else {
|
||||
return Ok(false);
|
||||
};
|
||||
|
||||
let event: RoomPowerLevels = event.into();
|
||||
Ok(event.user_can_redact_event_of_other(sender)
|
||||
|| event.user_can_redact_own_event(sender)
|
||||
&& if let Ok(pdu) = self.services.timeline.get_pdu(redacts).await {
|
||||
|
|
|
@ -1061,13 +1061,8 @@ impl Service {
|
|||
let power_levels: RoomPowerLevelsEventContent = self
|
||||
.services
|
||||
.state_accessor
|
||||
.room_state_get(room_id, &StateEventType::RoomPowerLevels, "")
|
||||
.room_state_get_content(room_id, &StateEventType::RoomPowerLevels, "")
|
||||
.await
|
||||
.map(|ev| {
|
||||
serde_json::from_str(ev.content.get())
|
||||
.map_err(|_| Error::bad_database("invalid m.room.power_levels event"))
|
||||
.unwrap()
|
||||
})
|
||||
.unwrap_or_default();
|
||||
|
||||
let room_mods = power_levels.users.iter().filter_map(|(user_id, level)| {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue