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:
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user