state-res: Reduce unnecessary Arc usage
This commit is contained in:
parent
2d83cf9a03
commit
00a59d0528
@ -86,9 +86,9 @@ pub fn auth_types_for_event(
|
|||||||
/// This returns an `Error` only when serialization fails or some other fatal outcome.
|
/// This returns an `Error` only when serialization fails or some other fatal outcome.
|
||||||
pub fn auth_check<E, F>(
|
pub fn auth_check<E, F>(
|
||||||
room_version: &RoomVersion,
|
room_version: &RoomVersion,
|
||||||
incoming_event: &Arc<E>,
|
incoming_event: &E,
|
||||||
prev_event: Option<Arc<E>>,
|
prev_event: Option<&E>,
|
||||||
current_third_party_invite: Option<Arc<E>>,
|
current_third_party_invite: Option<&E>,
|
||||||
fetch_state: F,
|
fetch_state: F,
|
||||||
) -> Result<bool>
|
) -> Result<bool>
|
||||||
where
|
where
|
||||||
@ -231,14 +231,14 @@ where
|
|||||||
|
|
||||||
if !valid_membership_change(
|
if !valid_membership_change(
|
||||||
&target_user,
|
&target_user,
|
||||||
fetch_state(&EventType::RoomMember, target_user.as_str()),
|
fetch_state(&EventType::RoomMember, target_user.as_str()).as_deref(),
|
||||||
sender,
|
sender,
|
||||||
sender_member_event,
|
sender_member_event.as_deref(),
|
||||||
incoming_event.content(),
|
incoming_event.content(),
|
||||||
prev_event,
|
prev_event.as_deref(),
|
||||||
current_third_party_invite,
|
current_third_party_invite,
|
||||||
power_levels_event,
|
power_levels_event.as_deref(),
|
||||||
fetch_state(&EventType::RoomJoinRules, ""),
|
fetch_state(&EventType::RoomJoinRules, "").as_deref(),
|
||||||
)? {
|
)? {
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
}
|
}
|
||||||
@ -304,7 +304,7 @@ where
|
|||||||
|
|
||||||
// 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.
|
||||||
if !can_send_event(incoming_event, power_levels_event.as_ref(), sender_power_level) {
|
if !can_send_event(incoming_event, power_levels_event.as_deref(), sender_power_level) {
|
||||||
warn!("user cannot send event");
|
warn!("user cannot send event");
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
}
|
}
|
||||||
@ -315,7 +315,7 @@ where
|
|||||||
if let Some(required_pwr_lvl) = check_power_levels(
|
if let Some(required_pwr_lvl) = check_power_levels(
|
||||||
room_version,
|
room_version,
|
||||||
incoming_event,
|
incoming_event,
|
||||||
power_levels_event.as_ref(),
|
power_levels_event.as_deref(),
|
||||||
sender_power_level,
|
sender_power_level,
|
||||||
) {
|
) {
|
||||||
if !required_pwr_lvl {
|
if !required_pwr_lvl {
|
||||||
@ -373,14 +373,14 @@ where
|
|||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn valid_membership_change<E: Event>(
|
fn valid_membership_change<E: Event>(
|
||||||
target_user: &UserId,
|
target_user: &UserId,
|
||||||
target_user_membership_event: Option<Arc<E>>,
|
target_user_membership_event: Option<&E>,
|
||||||
sender: &UserId,
|
sender: &UserId,
|
||||||
sender_membership_event: Option<Arc<E>>,
|
sender_membership_event: Option<&E>,
|
||||||
content: serde_json::Value,
|
content: serde_json::Value,
|
||||||
prev_event: Option<Arc<E>>,
|
prev_event: Option<&E>,
|
||||||
current_third_party_invite: Option<Arc<E>>,
|
current_third_party_invite: Option<&E>,
|
||||||
power_levels_event: Option<Arc<E>>,
|
power_levels_event: Option<&E>,
|
||||||
join_rules_event: Option<Arc<E>>,
|
join_rules_event: Option<&E>,
|
||||||
) -> Result<bool> {
|
) -> Result<bool> {
|
||||||
let target_membership = serde_json::from_value::<MembershipState>(
|
let target_membership = serde_json::from_value::<MembershipState>(
|
||||||
content.get("membership").expect("we test before that this field exists").clone(),
|
content.get("membership").expect("we test before that this field exists").clone(),
|
||||||
@ -564,7 +564,7 @@ fn valid_membership_change<E: Event>(
|
|||||||
/// Is the user allowed to send a specific event based on the rooms power levels.
|
/// Is the user allowed to send a specific event based on the rooms power levels.
|
||||||
///
|
///
|
||||||
/// Does the event have the correct userId as its state_key if it's not the "" state_key.
|
/// Does the event have the correct userId as its state_key if it's not the "" state_key.
|
||||||
fn can_send_event<E: Event>(event: &Arc<E>, ple: Option<&Arc<E>>, user_level: Int) -> bool {
|
fn can_send_event<E: Event>(event: &E, ple: Option<&E>, user_level: Int) -> bool {
|
||||||
let event_type_power_level = get_send_level(event.event_type(), event.state_key(), ple);
|
let event_type_power_level = get_send_level(event.event_type(), event.state_key(), ple);
|
||||||
|
|
||||||
debug!("{} ev_type {} usr {}", event.event_id(), event_type_power_level, user_level);
|
debug!("{} ev_type {} usr {}", event.event_id(), event_type_power_level, user_level);
|
||||||
@ -585,8 +585,8 @@ fn can_send_event<E: Event>(event: &Arc<E>, ple: Option<&Arc<E>>, user_level: In
|
|||||||
/// Confirm that the event sender has the required power levels.
|
/// Confirm that the event sender has the required power levels.
|
||||||
fn check_power_levels<E>(
|
fn check_power_levels<E>(
|
||||||
room_version: &RoomVersion,
|
room_version: &RoomVersion,
|
||||||
power_event: &Arc<E>,
|
power_event: &E,
|
||||||
previous_power_event: Option<&Arc<E>>,
|
previous_power_event: Option<&E>,
|
||||||
user_level: Int,
|
user_level: Int,
|
||||||
) -> Option<bool>
|
) -> Option<bool>
|
||||||
where
|
where
|
||||||
@ -738,7 +738,7 @@ fn get_deserialize_levels(
|
|||||||
/// Does the event redacting come from a user with enough power to redact the given event.
|
/// Does the event redacting come from a user with enough power to redact the given event.
|
||||||
fn check_redaction<E: Event>(
|
fn check_redaction<E: Event>(
|
||||||
_room_version: &RoomVersion,
|
_room_version: &RoomVersion,
|
||||||
redaction_event: &Arc<E>,
|
redaction_event: &E,
|
||||||
user_level: Int,
|
user_level: Int,
|
||||||
redact_level: Int,
|
redact_level: Int,
|
||||||
) -> Result<bool> {
|
) -> Result<bool> {
|
||||||
@ -764,7 +764,7 @@ fn check_redaction<E: Event>(
|
|||||||
fn get_send_level<E: Event>(
|
fn get_send_level<E: Event>(
|
||||||
e_type: &EventType,
|
e_type: &EventType,
|
||||||
state_key: Option<&str>,
|
state_key: Option<&str>,
|
||||||
power_lvl: Option<&Arc<E>>,
|
power_lvl: Option<&E>,
|
||||||
) -> Int {
|
) -> Int {
|
||||||
power_lvl
|
power_lvl
|
||||||
.and_then(|ple| {
|
.and_then(|ple| {
|
||||||
@ -787,7 +787,7 @@ fn verify_third_party_invite<E: Event>(
|
|||||||
target_user: Option<&UserId>,
|
target_user: Option<&UserId>,
|
||||||
sender: &UserId,
|
sender: &UserId,
|
||||||
tp_id: &ThirdPartyInvite,
|
tp_id: &ThirdPartyInvite,
|
||||||
current_third_party_invite: Option<Arc<E>>,
|
current_third_party_invite: Option<&E>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
// 1. Check for user being banned happens before this is called
|
// 1. Check for user being banned happens before this is called
|
||||||
// checking for mxid and token keys is done by ruma when deserializing
|
// checking for mxid and token keys is done by ruma when deserializing
|
||||||
@ -870,14 +870,14 @@ mod tests {
|
|||||||
|
|
||||||
assert!(valid_membership_change(
|
assert!(valid_membership_change(
|
||||||
&target_user,
|
&target_user,
|
||||||
fetch_state(EventType::RoomMember, target_user.to_string()),
|
fetch_state(EventType::RoomMember, target_user.to_string()).as_deref(),
|
||||||
&sender,
|
&sender,
|
||||||
fetch_state(EventType::RoomMember, sender.to_string()),
|
fetch_state(EventType::RoomMember, sender.to_string()).as_deref(),
|
||||||
requester.content(),
|
requester.content(),
|
||||||
prev_event,
|
prev_event.as_deref(),
|
||||||
None,
|
None,
|
||||||
fetch_state(EventType::RoomPowerLevels, "".to_owned()),
|
fetch_state(EventType::RoomPowerLevels, "".to_owned()).as_deref(),
|
||||||
fetch_state(EventType::RoomJoinRules, "".to_owned()),
|
fetch_state(EventType::RoomJoinRules, "".to_owned()).as_deref(),
|
||||||
)
|
)
|
||||||
.unwrap());
|
.unwrap());
|
||||||
}
|
}
|
||||||
@ -912,14 +912,14 @@ mod tests {
|
|||||||
|
|
||||||
assert!(!valid_membership_change(
|
assert!(!valid_membership_change(
|
||||||
&target_user,
|
&target_user,
|
||||||
fetch_state(EventType::RoomMember, target_user.to_string()),
|
fetch_state(EventType::RoomMember, target_user.to_string()).as_deref(),
|
||||||
&sender,
|
&sender,
|
||||||
fetch_state(EventType::RoomMember, sender.to_string()),
|
fetch_state(EventType::RoomMember, sender.to_string()).as_deref(),
|
||||||
requester.content(),
|
requester.content(),
|
||||||
prev_event,
|
prev_event.as_deref(),
|
||||||
None,
|
None,
|
||||||
fetch_state(EventType::RoomPowerLevels, "".to_owned()),
|
fetch_state(EventType::RoomPowerLevels, "".to_owned()).as_deref(),
|
||||||
fetch_state(EventType::RoomJoinRules, "".to_owned()),
|
fetch_state(EventType::RoomJoinRules, "".to_owned()).as_deref(),
|
||||||
)
|
)
|
||||||
.unwrap());
|
.unwrap());
|
||||||
}
|
}
|
||||||
|
@ -343,7 +343,7 @@ where
|
|||||||
|
|
||||||
for aid in event.as_ref().map(|pdu| pdu.auth_events()).into_iter().flatten() {
|
for aid in event.as_ref().map(|pdu| pdu.auth_events()).into_iter().flatten() {
|
||||||
if let Some(aev) = fetch_event(aid) {
|
if let Some(aev) = fetch_event(aid) {
|
||||||
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
|
if is_type_and_key(&*aev, &EventType::RoomPowerLevels, "") {
|
||||||
pl = Some(aev);
|
pl = Some(aev);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -452,9 +452,9 @@ where
|
|||||||
|
|
||||||
if auth_check(
|
if auth_check(
|
||||||
room_version,
|
room_version,
|
||||||
&event,
|
&*event,
|
||||||
most_recent_prev_event,
|
most_recent_prev_event.as_deref(),
|
||||||
current_third_party,
|
current_third_party.as_deref(),
|
||||||
|ty, key| auth_events.get(&(ty.clone(), key.to_owned())).cloned(),
|
|ty, key| auth_events.get(&(ty.clone(), key.to_owned())).cloned(),
|
||||||
)? {
|
)? {
|
||||||
// add event to resolved state map
|
// add event to resolved state map
|
||||||
@ -506,7 +506,7 @@ where
|
|||||||
for aid in event.auth_events() {
|
for aid in event.auth_events() {
|
||||||
let ev = fetch_event(aid)
|
let ev = fetch_event(aid)
|
||||||
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
|
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
|
||||||
if is_type_and_key(&ev, &EventType::RoomPowerLevels, "") {
|
if is_type_and_key(&*ev, &EventType::RoomPowerLevels, "") {
|
||||||
pl = Some(aid.clone());
|
pl = Some(aid.clone());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -569,7 +569,7 @@ where
|
|||||||
for aid in sort_ev.auth_events() {
|
for aid in sort_ev.auth_events() {
|
||||||
let aev = fetch_event(aid)
|
let aev = fetch_event(aid)
|
||||||
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
|
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
|
||||||
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
|
if is_type_and_key(&*aev, &EventType::RoomPowerLevels, "") {
|
||||||
event = Some(aev);
|
event = Some(aev);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -610,17 +610,17 @@ where
|
|||||||
E: Event,
|
E: Event,
|
||||||
F: Fn(&EventId) -> Option<Arc<E>>,
|
F: Fn(&EventId) -> Option<Arc<E>>,
|
||||||
{
|
{
|
||||||
match fetch(event_id).as_ref() {
|
match fetch(event_id).as_deref() {
|
||||||
Some(state) => is_power_event(state),
|
Some(state) => is_power_event(state),
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_type_and_key<E: Event>(ev: &Arc<E>, ev_type: &EventType, state_key: &str) -> bool {
|
pub fn is_type_and_key<E: Event>(ev: &E, ev_type: &EventType, state_key: &str) -> bool {
|
||||||
ev.event_type() == ev_type && ev.state_key() == Some(state_key)
|
ev.event_type() == ev_type && ev.state_key() == Some(state_key)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_power_event<E: Event>(event: &Arc<E>) -> bool {
|
pub fn is_power_event<E: Event>(event: &E) -> bool {
|
||||||
match event.event_type() {
|
match event.event_type() {
|
||||||
EventType::RoomPowerLevels | EventType::RoomJoinRules | EventType::RoomCreate => {
|
EventType::RoomPowerLevels | EventType::RoomJoinRules | EventType::RoomCreate => {
|
||||||
event.state_key() == Some("")
|
event.state_key() == Some("")
|
||||||
|
@ -23,7 +23,7 @@ fn test_event_sort() {
|
|||||||
|
|
||||||
let power_events = event_map
|
let power_events = event_map
|
||||||
.values()
|
.values()
|
||||||
.filter(|pdu| is_power_event(pdu))
|
.filter(|&pdu| is_power_event(&**pdu))
|
||||||
.map(|pdu| pdu.event_id().clone())
|
.map(|pdu| pdu.event_id().clone())
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user