refactor: Do not extract members for room each time
This commit is contained in:
parent
297c716807
commit
65d7df290f
2 changed files with 24 additions and 17 deletions
|
@ -1084,8 +1084,9 @@ fn get_missing_events(
|
||||||
|
|
||||||
if event_room_id != room_id {
|
if event_room_id != room_id {
|
||||||
warn!(
|
warn!(
|
||||||
"Evil event detected: Event {} found while searching in room {}",
|
?room_id,
|
||||||
queued_events[i], room_id
|
evil_event = ?queued_events[i],
|
||||||
|
"Evil event detected while searching in room"
|
||||||
);
|
);
|
||||||
return Err(Error::BadRequest(
|
return Err(Error::BadRequest(
|
||||||
ErrorKind::InvalidParam,
|
ErrorKind::InvalidParam,
|
||||||
|
@ -1093,9 +1094,26 @@ fn get_missing_events(
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let (room_members, room_errors): (Vec<_>, Vec<_>) = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.room_members(room_id)
|
||||||
|
.partition(Result::is_ok);
|
||||||
|
|
||||||
|
// Just log errors and continue with correct users
|
||||||
|
if !room_errors.is_empty() {
|
||||||
|
warn!(?room_id, "Some errors occurred when fetching room members");
|
||||||
|
}
|
||||||
|
|
||||||
|
let current_server_members: Vec<OwnedUserId> = room_members
|
||||||
|
.into_iter()
|
||||||
|
.map(Result::unwrap)
|
||||||
|
.filter(|member| member.server_name() == sender_servername)
|
||||||
|
.collect();
|
||||||
|
|
||||||
let event_is_visible = services().rooms.state_accessor.server_can_see_event(
|
let event_is_visible = services().rooms.state_accessor.server_can_see_event(
|
||||||
sender_servername,
|
sender_servername,
|
||||||
room_id,
|
current_server_members.as_slice(),
|
||||||
&queued_events[i],
|
&queued_events[i],
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,9 @@ use ruma::{
|
||||||
},
|
},
|
||||||
EventId, OwnedServerName, OwnedUserId, RoomId, ServerName, UserId,
|
EventId, OwnedServerName, OwnedUserId, RoomId, ServerName, UserId,
|
||||||
};
|
};
|
||||||
|
use tracing::warn;
|
||||||
|
|
||||||
use crate::{services, PduEvent, Result};
|
use crate::{PduEvent, Result};
|
||||||
|
|
||||||
pub struct Service {
|
pub struct Service {
|
||||||
pub db: &'static dyn Data,
|
pub db: &'static dyn Data,
|
||||||
|
@ -77,7 +78,7 @@ impl Service {
|
||||||
pub fn server_can_see_event(
|
pub fn server_can_see_event(
|
||||||
&self,
|
&self,
|
||||||
server_name: &ServerName,
|
server_name: &ServerName,
|
||||||
room_id: &RoomId,
|
current_server_members: &[OwnedUserId],
|
||||||
event_id: &EventId,
|
event_id: &EventId,
|
||||||
) -> Result<bool> {
|
) -> Result<bool> {
|
||||||
let shortstatehash = match self.pdu_shortstatehash(event_id) {
|
let shortstatehash = match self.pdu_shortstatehash(event_id) {
|
||||||
|
@ -94,18 +95,6 @@ impl Service {
|
||||||
return Ok(*visibility);
|
return Ok(*visibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
let current_server_members: Vec<OwnedUserId> = services()
|
|
||||||
.rooms
|
|
||||||
.state_cache
|
|
||||||
.room_members(room_id)
|
|
||||||
.filter(|member| {
|
|
||||||
member
|
|
||||||
.as_ref()
|
|
||||||
.map(|member| member.server_name() == server_name)
|
|
||||||
.unwrap_or(true)
|
|
||||||
})
|
|
||||||
.collect::<Result<_>>()?;
|
|
||||||
|
|
||||||
let history_visibility = self
|
let history_visibility = self
|
||||||
.state_get_content(shortstatehash, &StateEventType::RoomHistoryVisibility, "")?
|
.state_get_content(shortstatehash, &StateEventType::RoomHistoryVisibility, "")?
|
||||||
.map(|content| match content.get("history_visibility") {
|
.map(|content| match content.get("history_visibility") {
|
||||||
|
|
Loading…
Reference in a new issue