state-res: Inline get_named_level
This commit is contained in:
parent
8b4d019861
commit
4d0064330a
@ -314,9 +314,12 @@ where
|
|||||||
if incoming_event.event_type() == EventType::RoomPowerLevels {
|
if incoming_event.event_type() == EventType::RoomPowerLevels {
|
||||||
info!("starting m.room.power_levels check");
|
info!("starting m.room.power_levels check");
|
||||||
|
|
||||||
if let Some(required_pwr_lvl) =
|
if let Some(required_pwr_lvl) = check_power_levels(
|
||||||
check_power_levels(room_version, incoming_event, power_levels_event, sender_power_level)
|
room_version,
|
||||||
{
|
incoming_event,
|
||||||
|
power_levels_event.as_ref(),
|
||||||
|
sender_power_level,
|
||||||
|
) {
|
||||||
if !required_pwr_lvl {
|
if !required_pwr_lvl {
|
||||||
warn!("power level was not allowed");
|
warn!("power level was not allowed");
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
@ -337,15 +340,23 @@ where
|
|||||||
|
|
||||||
if room_version.extra_redaction_checks
|
if room_version.extra_redaction_checks
|
||||||
&& incoming_event.event_type() == EventType::RoomRedaction
|
&& incoming_event.event_type() == EventType::RoomRedaction
|
||||||
&& !check_redaction(
|
|
||||||
room_version,
|
|
||||||
incoming_event,
|
|
||||||
sender_power_level,
|
|
||||||
get_named_level(fetch_state, "redact", int!(50)),
|
|
||||||
)?
|
|
||||||
{
|
{
|
||||||
|
let default = int!(50);
|
||||||
|
let redact_level = if let Some(pl) = power_levels_event {
|
||||||
|
// TODO do this the right way and deserialize
|
||||||
|
if let Some(level) = pl.content().get("redact") {
|
||||||
|
level.to_string().parse().unwrap_or(default)
|
||||||
|
} else {
|
||||||
|
int!(0)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
default
|
||||||
|
};
|
||||||
|
|
||||||
|
if !check_redaction(room_version, incoming_event, sender_power_level, redact_level)? {
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
info!("allowing event passed all checks");
|
info!("allowing event passed all checks");
|
||||||
Ok(true)
|
Ok(true)
|
||||||
@ -580,7 +591,7 @@ fn can_send_event<E: Event>(event: &Arc<E>, ple: Option<&Arc<E>>, user_level: In
|
|||||||
fn check_power_levels<E>(
|
fn check_power_levels<E>(
|
||||||
room_version: &RoomVersion,
|
room_version: &RoomVersion,
|
||||||
power_event: &Arc<E>,
|
power_event: &Arc<E>,
|
||||||
previous_power_event: Option<Arc<E>>,
|
previous_power_event: Option<&Arc<E>>,
|
||||||
user_level: Int,
|
user_level: Int,
|
||||||
) -> Option<bool>
|
) -> Option<bool>
|
||||||
where
|
where
|
||||||
@ -787,26 +798,6 @@ pub fn can_federate<E: Event>(auth_events: &StateMap<Arc<E>>) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Helper function to fetch a field, `name`, from a "m.room.power_level" event's content.
|
|
||||||
/// or return `default` if no power level event is found or zero if no field matches `name`.
|
|
||||||
pub fn get_named_level<E, F>(fetch_state: F, name: &str, default: Int) -> Int
|
|
||||||
where
|
|
||||||
E: Event,
|
|
||||||
F: Fn(&EventType, &str) -> Option<Arc<E>>,
|
|
||||||
{
|
|
||||||
let power_level_event = fetch_state(&EventType::RoomPowerLevels, "");
|
|
||||||
if let Some(pl) = power_level_event {
|
|
||||||
// TODO do this the right way and deserialize
|
|
||||||
if let Some(level) = pl.content().get(name) {
|
|
||||||
level.to_string().parse().unwrap_or(default)
|
|
||||||
} else {
|
|
||||||
int!(0)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
default
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Helper function to fetch the power level needed to send an event of type
|
/// Helper function to fetch the power level needed to send an event of type
|
||||||
/// `e_type` based on the rooms "m.room.power_level" event.
|
/// `e_type` based on the rooms "m.room.power_level" event.
|
||||||
pub fn get_send_level<E: Event>(
|
pub fn get_send_level<E: Event>(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user