state-res: Don't turn Int into i64 internally

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

View File

@ -1,6 +1,6 @@
use std::{collections::BTreeSet, convert::TryFrom, sync::Arc}; use std::{collections::BTreeSet, convert::TryFrom, sync::Arc};
use js_int::int; use js_int::{int, Int};
use ruma_events::{ use ruma_events::{
room::{ room::{
create::CreateEventContent, create::CreateEventContent,
@ -267,16 +267,14 @@ where
// 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 {
let user_level = get_user_power_level(incoming_event.sender(), &fetch_state); let user_level = get_user_power_level(incoming_event.sender(), &fetch_state);
let invite_level = fetch_state(&EventType::RoomPowerLevels, "") let invite_level = fetch_state(&EventType::RoomPowerLevels, "").map_or_else(
.map_or_else(
|| Ok::<_, Error>(int!(50)), || Ok::<_, Error>(int!(50)),
|power_levels| { |power_levels| {
serde_json::from_value::<PowerLevelsEventContent>(power_levels.content()) serde_json::from_value::<PowerLevelsEventContent>(power_levels.content())
.map(|pl| pl.invite) .map(|pl| pl.invite)
.map_err(Into::into) .map_err(Into::into)
}, },
)? )?;
.into();
if user_level < invite_level { if user_level < invite_level {
warn!("sender's cannot send invites in this room"); warn!("sender's cannot send invites in this room");
@ -636,15 +634,15 @@ where
} }
// If the current value is equal to the sender's current power level, reject // If the current value is equal to the sender's current power level, reject
if user != power_event.sender() && old_level.map(|int| (*int).into()) == Some(user_level) { if user != power_event.sender() && old_level == Some(&user_level) {
warn!("m.room.power_level cannot remove ops == to own"); warn!("m.room.power_level cannot remove ops == to own");
return Some(false); // cannot remove ops level == to own return Some(false); // cannot remove ops level == to own
} }
// If the current value is higher than the sender's current power level, reject // If the current value is higher than the sender's current power level, reject
// If the new value is higher than the sender's current power level, reject // If the new value is higher than the sender's current power level, reject
let old_level_too_big = old_level.map(|int| (*int).into()) > Some(user_level); let old_level_too_big = old_level > Some(&user_level);
let new_level_too_big = new_level.map(|int| (*int).into()) > Some(user_level); let new_level_too_big = new_level > Some(&user_level);
if old_level_too_big || new_level_too_big { if old_level_too_big || new_level_too_big {
warn!("m.room.power_level failed to add ops > than own"); warn!("m.room.power_level failed to add ops > than own");
return Some(false); // cannot add ops greater than own return Some(false); // cannot add ops greater than own
@ -661,8 +659,8 @@ where
// If the current value is higher than the sender's current power level, reject // If the current value is higher than the sender's current power level, reject
// If the new value is higher than the sender's current power level, reject // If the new value is higher than the sender's current power level, reject
let old_level_too_big = old_level.map(|int| (*int).into()) > Some(user_level); let old_level_too_big = old_level > Some(&user_level);
let new_level_too_big = new_level.map(|int| (*int).into()) > Some(user_level); let new_level_too_big = new_level > Some(&user_level);
if old_level_too_big || new_level_too_big { if old_level_too_big || new_level_too_big {
warn!("m.room.power_level failed to add ops > than own"); warn!("m.room.power_level failed to add ops > than own");
return Some(false); // cannot add ops greater than own return Some(false); // cannot add ops greater than own
@ -676,8 +674,8 @@ where
if old_level != new_level { if old_level != new_level {
// If the current value is higher than the sender's current power level, reject // If the current value is higher than the sender's current power level, reject
// If the new value is higher than the sender's current power level, reject // If the new value is higher than the sender's current power level, reject
let old_level_too_big = i64::from(old_level) > user_level; let old_level_too_big = old_level > user_level;
let new_level_too_big = i64::from(new_level) > user_level; let new_level_too_big = new_level > user_level;
if old_level_too_big || new_level_too_big { if old_level_too_big || new_level_too_big {
warn!("m.room.power_level failed to add ops > than own"); warn!("m.room.power_level failed to add ops > than own");
return Some(false); // cannot add ops greater than own return Some(false); // cannot add ops greater than own
@ -708,7 +706,7 @@ fn get_deserialize_levels(
old: &serde_json::Value, old: &serde_json::Value,
new: &serde_json::Value, new: &serde_json::Value,
name: &str, name: &str,
) -> Option<(i64, i64)> { ) -> Option<(Int, Int)> {
Some(( Some((
serde_json::from_value(old.get(name)?.clone()).ok()?, serde_json::from_value(old.get(name)?.clone()).ok()?,
serde_json::from_value(new.get(name)?.clone()).ok()?, serde_json::from_value(new.get(name)?.clone()).ok()?,
@ -726,7 +724,7 @@ where
F: Fn(&EventType, &str) -> Option<Arc<E>>, F: Fn(&EventType, &str) -> Option<Arc<E>>,
{ {
let user_level = get_user_power_level(redaction_event.sender(), &fetch_state); let user_level = get_user_power_level(redaction_event.sender(), &fetch_state);
let redact_level = get_named_level(fetch_state, "redact", 50); let redact_level = get_named_level(fetch_state, "redact", int!(50));
if user_level >= redact_level { if user_level >= redact_level {
info!("redaction allowed via power levels"); info!("redaction allowed via power levels");
@ -780,7 +778,7 @@ 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. /// 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`. /// 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: i64) -> i64 pub fn get_named_level<E, F>(fetch_state: F, name: &str, default: Int) -> Int
where where
E: Event, E: Event,
F: Fn(&EventType, &str) -> Option<Arc<E>>, F: Fn(&EventType, &str) -> Option<Arc<E>>,
@ -791,7 +789,7 @@ where
if let Some(level) = pl.content().get(name) { if let Some(level) = pl.content().get(name) {
level.to_string().parse().unwrap_or(default) level.to_string().parse().unwrap_or(default)
} else { } else {
0 int!(0)
} }
} else { } else {
default default
@ -800,7 +798,7 @@ where
/// Helper function to fetch a users default power level from a "m.room.power_level" event's `users` /// Helper function to fetch a users default power level from a "m.room.power_level" event's `users`
/// object. /// object.
pub fn get_user_power_level<E, F>(user_id: &UserId, fetch_state: F) -> i64 pub fn get_user_power_level<E, F>(user_id: &UserId, fetch_state: F) -> Int
where where
E: Event, E: Event,
F: Fn(&EventType, &str) -> Option<Arc<E>>, F: Fn(&EventType, &str) -> Option<Arc<E>>,
@ -808,18 +806,18 @@ where
if let Some(pl) = fetch_state(&EventType::RoomPowerLevels, "") { if let Some(pl) = fetch_state(&EventType::RoomPowerLevels, "") {
if let Ok(content) = serde_json::from_value::<PowerLevelsEventContent>(pl.content()) { if let Ok(content) = serde_json::from_value::<PowerLevelsEventContent>(pl.content()) {
if let Some(level) = content.users.get(user_id) { if let Some(level) = content.users.get(user_id) {
(*level).into() *level
} else { } else {
content.users_default.into() content.users_default
} }
} else { } else {
0 // TODO if this fails DB error? int!(0) // TODO if this fails DB error?
} }
} else { } else {
// If no power level event found the creator gets 100 everyone else gets 0 // If no power level event found the creator gets 100 everyone else gets 0
fetch_state(&EventType::RoomCreate, "") fetch_state(&EventType::RoomCreate, "")
.and_then(|create| serde_json::from_value::<CreateEventContent>(create.content()).ok()) .and_then(|create| serde_json::from_value::<CreateEventContent>(create.content()).ok())
.and_then(|create| (create.creator == *user_id).then(|| 100)) .and_then(|create| (create.creator == *user_id).then(|| int!(100)))
.unwrap_or_default() .unwrap_or_default()
} }
} }
@ -830,7 +828,7 @@ pub fn get_send_level<E: Event>(
e_type: &EventType, e_type: &EventType,
state_key: Option<String>, state_key: Option<String>,
power_lvl: Option<&Arc<E>>, power_lvl: Option<&Arc<E>>,
) -> i64 { ) -> Int {
power_lvl power_lvl
.and_then(|ple| { .and_then(|ple| {
serde_json::from_value::<PowerLevelsEventContent>(ple.content()) serde_json::from_value::<PowerLevelsEventContent>(ple.content())
@ -845,8 +843,7 @@ pub fn get_send_level<E: Event>(
}) })
.ok() .ok()
}) })
.map(i64::from) .unwrap_or_else(|| if state_key.is_some() { int!(50) } else { int!(0) })
.unwrap_or_else(|| if state_key.is_some() { 50 } else { 0 })
} }
pub fn verify_third_party_invite<E: Event>( pub fn verify_third_party_invite<E: Event>(