optimize further into state-res with SmallString

triage and de-lints for state-res.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-02-08 01:58:13 +00:00
committed by strawberry
parent 0a9a9b3c92
commit f2ca670c3b
15 changed files with 192 additions and 145 deletions
+78 -64
View File
@@ -21,7 +21,6 @@ use serde::{
Deserialize,
};
use serde_json::{from_str as from_json_str, value::RawValue as RawJsonValue};
use tracing::{debug, error, instrument, trace, warn};
use super::{
power_levels::{
@@ -29,8 +28,9 @@ use super::{
deserialize_power_levels_content_invite, deserialize_power_levels_content_redact,
},
room_version::RoomVersion,
Error, Event, Result, StateEventType, TimelineEventType,
Error, Event, Result, StateEventType, StateKey, TimelineEventType,
};
use crate::{debug, error, trace, warn};
// FIXME: field extracting could be bundled for `content`
#[derive(Deserialize)]
@@ -56,15 +56,15 @@ pub fn auth_types_for_event(
sender: &UserId,
state_key: Option<&str>,
content: &RawJsonValue,
) -> serde_json::Result<Vec<(StateEventType, String)>> {
) -> serde_json::Result<Vec<(StateEventType, StateKey)>> {
if kind == &TimelineEventType::RoomCreate {
return Ok(vec![]);
}
let mut auth_types = vec![
(StateEventType::RoomPowerLevels, String::new()),
(StateEventType::RoomMember, sender.to_string()),
(StateEventType::RoomCreate, String::new()),
(StateEventType::RoomPowerLevels, StateKey::new()),
(StateEventType::RoomMember, sender.as_str().into()),
(StateEventType::RoomCreate, StateKey::new()),
];
if kind == &TimelineEventType::RoomMember {
@@ -82,7 +82,7 @@ pub fn auth_types_for_event(
if [MembershipState::Join, MembershipState::Invite, MembershipState::Knock]
.contains(&membership)
{
let key = (StateEventType::RoomJoinRules, String::new());
let key = (StateEventType::RoomJoinRules, StateKey::new());
if !auth_types.contains(&key) {
auth_types.push(key);
}
@@ -91,21 +91,22 @@ pub fn auth_types_for_event(
.join_authorised_via_users_server
.map(|m| m.deserialize())
{
let key = (StateEventType::RoomMember, u.to_string());
let key = (StateEventType::RoomMember, u.as_str().into());
if !auth_types.contains(&key) {
auth_types.push(key);
}
}
}
let key = (StateEventType::RoomMember, state_key.to_owned());
let key = (StateEventType::RoomMember, state_key.into());
if !auth_types.contains(&key) {
auth_types.push(key);
}
if membership == MembershipState::Invite {
if let Some(Ok(t_id)) = content.third_party_invite.map(|t| t.deserialize()) {
let key = (StateEventType::RoomThirdPartyInvite, t_id.signed.token);
let key =
(StateEventType::RoomThirdPartyInvite, t_id.signed.token.into());
if !auth_types.contains(&key) {
auth_types.push(key);
}
@@ -128,7 +129,13 @@ pub fn auth_types_for_event(
/// The `fetch_state` closure should gather state from a state snapshot. We need
/// to know if the event passes auth against some state not a recursive
/// collection of auth_events fields.
#[instrument(level = "debug", skip_all, fields(event_id = incoming_event.event_id().borrow().as_str()))]
#[tracing::instrument(
level = "debug",
skip_all,
fields(
event_id = incoming_event.event_id().borrow().as_str()
)
)]
pub async fn auth_check<F, Fut, Fetched, Incoming>(
room_version: &RoomVersion,
incoming_event: &Incoming,
@@ -136,10 +143,10 @@ pub async fn auth_check<F, Fut, Fetched, Incoming>(
fetch_state: F,
) -> Result<bool, Error>
where
F: Fn(&'static StateEventType, &str) -> Fut,
F: Fn(&StateEventType, &str) -> Fut + Send,
Fut: Future<Output = Option<Fetched>> + Send,
Fetched: Event + Send,
Incoming: Event + Send,
Incoming: Event + Send + Sync,
{
debug!(
"auth_check beginning for {} ({})",
@@ -262,6 +269,7 @@ where
// sender domain of the event does not match the sender domain of the create
// event, reject.
#[derive(Deserialize)]
#[allow(clippy::items_after_statements)]
struct RoomCreateContentFederate {
#[serde(rename = "m.federate", default = "ruma::serde::default_true")]
federate: bool,
@@ -354,7 +362,7 @@ where
join_rules_event.as_ref(),
user_for_join_auth.as_deref(),
&user_for_join_auth_membership,
room_create_event,
&room_create_event,
)? {
return Ok(false);
}
@@ -364,6 +372,7 @@ where
}
// If the sender's current membership state is not join, reject
#[allow(clippy::manual_let_else)]
let sender_member_event = match sender_member_event {
| Some(mem) => mem,
| None => {
@@ -498,19 +507,20 @@ where
/// This is generated by calling `auth_types_for_event` with the membership
/// event and the current State.
#[allow(clippy::too_many_arguments)]
#[allow(clippy::cognitive_complexity)]
fn valid_membership_change(
room_version: &RoomVersion,
target_user: &UserId,
target_user_membership_event: Option<impl Event>,
target_user_membership_event: Option<&impl Event>,
sender: &UserId,
sender_membership_event: Option<impl Event>,
sender_membership_event: Option<&impl Event>,
current_event: impl Event,
current_third_party_invite: Option<impl Event>,
power_levels_event: Option<impl Event>,
join_rules_event: Option<impl Event>,
current_third_party_invite: Option<&impl Event>,
power_levels_event: Option<&impl Event>,
join_rules_event: Option<&impl Event>,
user_for_join_auth: Option<&UserId>,
user_for_join_auth_membership: &MembershipState,
create_room: impl Event,
create_room: &impl Event,
) -> Result<bool> {
#[derive(Deserialize)]
struct GetThirdPartyInvite {
@@ -856,6 +866,7 @@ fn check_power_levels(
// and integers here
debug!("validation of power event finished");
#[allow(clippy::manual_let_else)]
let current_state = match previous_power_event {
| Some(current_state) => current_state,
// If there is no previous m.room.power_levels event in the room, allow
@@ -1054,6 +1065,7 @@ fn verify_third_party_invite(
// If there is no m.room.third_party_invite event in the current room state with
// state_key matching token, reject
#[allow(clippy::manual_let_else)]
let current_tpid = match current_third_party_invite {
| Some(id) => id,
| None => return false,
@@ -1069,12 +1081,14 @@ fn verify_third_party_invite(
// If any signature in signed matches any public key in the
// m.room.third_party_invite event, allow
#[allow(clippy::manual_let_else)]
let tpid_ev =
match from_json_str::<RoomThirdPartyInviteEventContent>(current_tpid.content().get()) {
| Ok(ev) => ev,
| Err(_) => return false,
};
#[allow(clippy::manual_let_else)]
let decoded_invite_token = match Base64::parse(&tp_id.signed.token) {
| Ok(tok) => tok,
// FIXME: Log a warning?
@@ -1096,7 +1110,7 @@ fn verify_third_party_invite(
mod tests {
use std::sync::Arc;
use ruma_events::{
use ruma::events::{
room::{
join_rules::{
AllowRule, JoinRule, Restricted, RoomJoinRulesEventContent, RoomMembership,
@@ -1107,7 +1121,7 @@ mod tests {
};
use serde_json::value::to_raw_value as to_raw_json_value;
use crate::{
use crate::state_res::{
event_auth::valid_membership_change,
test_utils::{
alice, charlie, ella, event_id, member_content_ban, member_content_join, room_id,
@@ -1145,16 +1159,16 @@ mod tests {
assert!(valid_membership_change(
&RoomVersion::V6,
target_user,
fetch_state(StateEventType::RoomMember, target_user.to_string()),
fetch_state(StateEventType::RoomMember, target_user.as_str().into()).as_ref(),
sender,
fetch_state(StateEventType::RoomMember, sender.to_string()),
fetch_state(StateEventType::RoomMember, sender.as_str().into()).as_ref(),
&requester,
None::<PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".to_owned()),
fetch_state(StateEventType::RoomJoinRules, "".to_owned()),
None::<&PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".into()).as_ref(),
fetch_state(StateEventType::RoomJoinRules, "".into()).as_ref(),
None,
&MembershipState::Leave,
fetch_state(StateEventType::RoomCreate, "".to_owned()).unwrap(),
&fetch_state(StateEventType::RoomCreate, "".into()).unwrap(),
)
.unwrap());
}
@@ -1188,16 +1202,16 @@ mod tests {
assert!(!valid_membership_change(
&RoomVersion::V6,
target_user,
fetch_state(StateEventType::RoomMember, target_user.to_string()),
fetch_state(StateEventType::RoomMember, target_user.as_str().into()).as_ref(),
sender,
fetch_state(StateEventType::RoomMember, sender.to_string()),
fetch_state(StateEventType::RoomMember, sender.as_str().into()).as_ref(),
&requester,
None::<PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".to_owned()),
fetch_state(StateEventType::RoomJoinRules, "".to_owned()),
None::<&PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".into()).as_ref(),
fetch_state(StateEventType::RoomJoinRules, "".into()).as_ref(),
None,
&MembershipState::Leave,
fetch_state(StateEventType::RoomCreate, "".to_owned()).unwrap(),
&fetch_state(StateEventType::RoomCreate, "".into()).unwrap(),
)
.unwrap());
}
@@ -1231,16 +1245,16 @@ mod tests {
assert!(valid_membership_change(
&RoomVersion::V6,
target_user,
fetch_state(StateEventType::RoomMember, target_user.to_string()),
fetch_state(StateEventType::RoomMember, target_user.as_str().into()).as_ref(),
sender,
fetch_state(StateEventType::RoomMember, sender.to_string()),
fetch_state(StateEventType::RoomMember, sender.as_str().into()).as_ref(),
&requester,
None::<PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".to_owned()),
fetch_state(StateEventType::RoomJoinRules, "".to_owned()),
None::<&PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".into()).as_ref(),
fetch_state(StateEventType::RoomJoinRules, "".into()).as_ref(),
None,
&MembershipState::Leave,
fetch_state(StateEventType::RoomCreate, "".to_owned()).unwrap(),
&fetch_state(StateEventType::RoomCreate, "".into()).unwrap(),
)
.unwrap());
}
@@ -1274,16 +1288,16 @@ mod tests {
assert!(!valid_membership_change(
&RoomVersion::V6,
target_user,
fetch_state(StateEventType::RoomMember, target_user.to_string()),
fetch_state(StateEventType::RoomMember, target_user.as_str().into()).as_ref(),
sender,
fetch_state(StateEventType::RoomMember, sender.to_string()),
fetch_state(StateEventType::RoomMember, sender.as_str().into()).as_ref(),
&requester,
None::<PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".to_owned()),
fetch_state(StateEventType::RoomJoinRules, "".to_owned()),
None::<&PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".into()).as_ref(),
fetch_state(StateEventType::RoomJoinRules, "".into()).as_ref(),
None,
&MembershipState::Leave,
fetch_state(StateEventType::RoomCreate, "".to_owned()).unwrap(),
&fetch_state(StateEventType::RoomCreate, "".into()).unwrap(),
)
.unwrap());
}
@@ -1334,32 +1348,32 @@ mod tests {
assert!(valid_membership_change(
&RoomVersion::V9,
target_user,
fetch_state(StateEventType::RoomMember, target_user.to_string()),
fetch_state(StateEventType::RoomMember, target_user.as_str().into()).as_ref(),
sender,
fetch_state(StateEventType::RoomMember, sender.to_string()),
fetch_state(StateEventType::RoomMember, sender.as_str().into()).as_ref(),
&requester,
None::<PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".to_owned()),
fetch_state(StateEventType::RoomJoinRules, "".to_owned()),
None::<&PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".into()).as_ref(),
fetch_state(StateEventType::RoomJoinRules, "".into()).as_ref(),
Some(alice()),
&MembershipState::Join,
fetch_state(StateEventType::RoomCreate, "".to_owned()).unwrap(),
&fetch_state(StateEventType::RoomCreate, "".into()).unwrap(),
)
.unwrap());
assert!(!valid_membership_change(
&RoomVersion::V9,
target_user,
fetch_state(StateEventType::RoomMember, target_user.to_string()),
fetch_state(StateEventType::RoomMember, target_user.as_str().into()).as_ref(),
sender,
fetch_state(StateEventType::RoomMember, sender.to_string()),
fetch_state(StateEventType::RoomMember, sender.as_str().into()).as_ref(),
&requester,
None::<PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".to_owned()),
fetch_state(StateEventType::RoomJoinRules, "".to_owned()),
None::<&PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".into()).as_ref(),
fetch_state(StateEventType::RoomJoinRules, "".into()).as_ref(),
Some(ella()),
&MembershipState::Leave,
fetch_state(StateEventType::RoomCreate, "".to_owned()).unwrap(),
&fetch_state(StateEventType::RoomCreate, "".into()).unwrap(),
)
.unwrap());
}
@@ -1402,16 +1416,16 @@ mod tests {
assert!(valid_membership_change(
&RoomVersion::V7,
target_user,
fetch_state(StateEventType::RoomMember, target_user.to_string()),
fetch_state(StateEventType::RoomMember, target_user.as_str().into()).as_ref(),
sender,
fetch_state(StateEventType::RoomMember, sender.to_string()),
fetch_state(StateEventType::RoomMember, sender.as_str().into()).as_ref(),
&requester,
None::<PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".to_owned()),
fetch_state(StateEventType::RoomJoinRules, "".to_owned()),
None::<&PduEvent>,
fetch_state(StateEventType::RoomPowerLevels, "".into()).as_ref(),
fetch_state(StateEventType::RoomJoinRules, "".into()).as_ref(),
None,
&MembershipState::Leave,
fetch_state(StateEventType::RoomCreate, "".to_owned()).unwrap(),
&fetch_state(StateEventType::RoomCreate, "".into()).unwrap(),
)
.unwrap());
}