state-res: Inline can_send_invite

This commit is contained in:
Jonas Platte 2021-09-03 22:43:37 +02:00
parent 983ce8451f
commit b0d475eac3
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67

View File

@ -265,12 +265,24 @@ where
// Allow if and only if sender's current power level is greater than // Allow if and only if sender's current power level is greater than
// or equal to the invite level // or equal to the invite level
if incoming_event.event_type() == EventType::RoomThirdPartyInvite if incoming_event.event_type() == EventType::RoomThirdPartyInvite {
&& !can_send_invite(incoming_event, &fetch_state)? let user_level = get_user_power_level(incoming_event.sender(), &fetch_state);
{ let invite_level = fetch_state(&EventType::RoomPowerLevels, "")
.map_or_else(
|| Ok::<_, Error>(int!(50)),
|power_levels| {
serde_json::from_value::<PowerLevelsEventContent>(power_levels.content())
.map(|pl| pl.invite)
.map_err(Into::into)
},
)?
.into();
if user_level < invite_level {
warn!("sender's cannot send invites in this room"); warn!("sender's cannot send invites in this room");
return Ok(false); return Ok(false);
} }
}
// If the event type's required power level is greater than the sender's power level, reject // If the event type's required power level is greater than the sender's power level, reject
// If the event has a state_key that starts with an @ and does not match the sender, reject. // If the event has a state_key that starts with an @ and does not match the sender, reject.
@ -837,27 +849,6 @@ pub fn get_send_level<E: Event>(
.unwrap_or_else(|| if state_key.is_some() { 50 } else { 0 }) .unwrap_or_else(|| if state_key.is_some() { 50 } else { 0 })
} }
/// Check user can send invite.
pub fn can_send_invite<E, F>(event: &Arc<E>, fetch_state: F) -> Result<bool>
where
E: Event,
F: Fn(&EventType, &str) -> Option<Arc<E>>,
{
let user_level = get_user_power_level(event.sender(), &fetch_state);
let invite_level = fetch_state(&EventType::RoomPowerLevels, "")
.map_or_else(
|| Ok::<_, Error>(int!(50)),
|power_levels| {
serde_json::from_value::<PowerLevelsEventContent>(power_levels.content())
.map(|pl| pl.invite)
.map_err(Into::into)
},
)?
.into();
Ok(user_level >= invite_level)
}
pub fn verify_third_party_invite<E: Event>( pub fn verify_third_party_invite<E: Event>(
target_user: Option<&UserId>, target_user: Option<&UserId>,
sender: &UserId, sender: &UserId,