state-res: Inline get_user_power_level
This commit is contained in:
parent
4259e9ec0c
commit
7f4eba5a5c
@ -109,6 +109,8 @@ where
|
|||||||
// do_size_check is also mostly accomplished by ruma with the exception of checking event_type,
|
// do_size_check is also mostly accomplished by ruma with the exception of checking event_type,
|
||||||
// state_key, and json are below a certain size (255 and 65_536 respectively)
|
// state_key, and json are below a certain size (255 and 65_536 respectively)
|
||||||
|
|
||||||
|
let sender = incoming_event.sender();
|
||||||
|
|
||||||
// Implementation of https://matrix.org/docs/spec/rooms/v1#authorization-rules
|
// Implementation of https://matrix.org/docs/spec/rooms/v1#authorization-rules
|
||||||
//
|
//
|
||||||
// 1. If type is m.room.create:
|
// 1. If type is m.room.create:
|
||||||
@ -122,7 +124,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If the domain of the room_id does not match the domain of the sender, reject
|
// If the domain of the room_id does not match the domain of the sender, reject
|
||||||
if incoming_event.room_id().server_name() != incoming_event.sender().server_name() {
|
if incoming_event.room_id().server_name() != sender.server_name() {
|
||||||
warn!("creation events server does not match sender");
|
warn!("creation events server does not match sender");
|
||||||
return Ok(false); // creation events room id does not match senders
|
return Ok(false); // creation events room id does not match senders
|
||||||
}
|
}
|
||||||
@ -158,7 +160,7 @@ where
|
|||||||
// b. All entries are valid auth events according to spec
|
// b. All entries are valid auth events according to spec
|
||||||
let expected_auth = auth_types_for_event(
|
let expected_auth = auth_types_for_event(
|
||||||
incoming_event.kind,
|
incoming_event.kind,
|
||||||
incoming_event.sender(),
|
sender,
|
||||||
incoming_event.state_key,
|
incoming_event.state_key,
|
||||||
incoming_event.content().clone(),
|
incoming_event.content().clone(),
|
||||||
);
|
);
|
||||||
@ -190,7 +192,7 @@ where
|
|||||||
info!("starting m.room.aliases check");
|
info!("starting m.room.aliases check");
|
||||||
|
|
||||||
// If sender's domain doesn't matches state_key, reject
|
// If sender's domain doesn't matches state_key, reject
|
||||||
if incoming_event.state_key() != Some(incoming_event.sender().server_name().to_string()) {
|
if incoming_event.state_key() != Some(sender.server_name().to_string()) {
|
||||||
warn!("state_key does not match sender");
|
warn!("state_key does not match sender");
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
}
|
}
|
||||||
@ -200,8 +202,6 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
let power_levels_event = fetch_state(&EventType::RoomPowerLevels, "");
|
let power_levels_event = fetch_state(&EventType::RoomPowerLevels, "");
|
||||||
|
|
||||||
let sender = incoming_event.sender();
|
|
||||||
let sender_member_event = fetch_state(&EventType::RoomMember, sender.as_str());
|
let sender_member_event = fetch_state(&EventType::RoomMember, sender.as_str());
|
||||||
|
|
||||||
if incoming_event.event_type() == EventType::RoomMember {
|
if incoming_event.event_type() == EventType::RoomMember {
|
||||||
@ -266,7 +266,23 @@ where
|
|||||||
return Ok(false);
|
return Ok(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
let sender_power_level = get_user_power_level(incoming_event.sender(), &fetch_state);
|
let sender_power_level = if let Some(pl) = fetch_state(&EventType::RoomPowerLevels, "") {
|
||||||
|
if let Ok(content) = serde_json::from_value::<PowerLevelsEventContent>(pl.content()) {
|
||||||
|
if let Some(level) = content.users.get(sender) {
|
||||||
|
*level
|
||||||
|
} else {
|
||||||
|
content.users_default
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int!(0) // TODO if this fails DB error?
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If no power level event found the creator gets 100 everyone else gets 0
|
||||||
|
fetch_state(&EventType::RoomCreate, "")
|
||||||
|
.and_then(|create| serde_json::from_value::<CreateEventContent>(create.content()).ok())
|
||||||
|
.and_then(|create| (create.creator == *sender).then(|| int!(100)))
|
||||||
|
.unwrap_or_default()
|
||||||
|
};
|
||||||
|
|
||||||
// Allow if and only if sender's current power level is greater than
|
// Allow if and only if sender's current power level is greater than
|
||||||
// or equal to the invite level
|
// or equal to the invite level
|
||||||
@ -789,32 +805,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Helper function to fetch a users default power level from a "m.room.power_level" event's `users`
|
|
||||||
/// object.
|
|
||||||
pub fn get_user_power_level<E, F>(user_id: &UserId, fetch_state: F) -> Int
|
|
||||||
where
|
|
||||||
E: Event,
|
|
||||||
F: Fn(&EventType, &str) -> Option<Arc<E>>,
|
|
||||||
{
|
|
||||||
if let Some(pl) = fetch_state(&EventType::RoomPowerLevels, "") {
|
|
||||||
if let Ok(content) = serde_json::from_value::<PowerLevelsEventContent>(pl.content()) {
|
|
||||||
if let Some(level) = content.users.get(user_id) {
|
|
||||||
*level
|
|
||||||
} else {
|
|
||||||
content.users_default
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int!(0) // TODO if this fails DB error?
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// If no power level event found the creator gets 100 everyone else gets 0
|
|
||||||
fetch_state(&EventType::RoomCreate, "")
|
|
||||||
.and_then(|create| serde_json::from_value::<CreateEventContent>(create.content()).ok())
|
|
||||||
.and_then(|create| (create.creator == *user_id).then(|| int!(100)))
|
|
||||||
.unwrap_or_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