Optimize expected auth types checking.
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
@@ -3,10 +3,8 @@ mod room_member;
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|
||||||
use std::collections::HashSet;
|
|
||||||
|
|
||||||
use futures::{
|
use futures::{
|
||||||
TryFutureExt, TryStreamExt,
|
FutureExt, TryFutureExt, TryStreamExt,
|
||||||
future::{join3, try_join},
|
future::{join3, try_join},
|
||||||
};
|
};
|
||||||
use ruma::{
|
use ruma::{
|
||||||
@@ -107,20 +105,17 @@ where
|
|||||||
return check_room_create(&room_create_event, &rules.authorization);
|
return check_room_create(&room_create_event, &rules.authorization);
|
||||||
}
|
}
|
||||||
|
|
||||||
let expected_auth_types: HashSet<_> = auth_types_for_event(
|
let expected_auth_types = auth_types_for_event(
|
||||||
incoming_event.event_type(),
|
incoming_event.event_type(),
|
||||||
incoming_event.sender(),
|
incoming_event.sender(),
|
||||||
incoming_event.state_key(),
|
incoming_event.state_key(),
|
||||||
incoming_event.content(),
|
incoming_event.content(),
|
||||||
&rules.authorization,
|
&rules.authorization,
|
||||||
false,
|
false,
|
||||||
)?
|
)?;
|
||||||
.into_iter()
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let room_id = incoming_event.room_id();
|
|
||||||
|
|
||||||
// Since v1, considering auth_events:
|
// Since v1, considering auth_events:
|
||||||
|
let seen_auth_types = Vec::with_capacity(expected_auth_types.len());
|
||||||
let seen_auth_types = incoming_event
|
let seen_auth_types = incoming_event
|
||||||
.auth_events()
|
.auth_events()
|
||||||
.try_stream()
|
.try_stream()
|
||||||
@@ -128,11 +123,11 @@ where
|
|||||||
fetch_event(event_id.to_owned())
|
fetch_event(event_id.to_owned())
|
||||||
.map_err(|_| err!(Request(NotFound("failed to find auth event"))))
|
.map_err(|_| err!(Request(NotFound("failed to find auth event"))))
|
||||||
})
|
})
|
||||||
.ready_try_fold_default(|mut seen_auth_types: HashSet<TypeStateKey>, auth_event| {
|
.ready_try_fold(seen_auth_types, |mut seen_auth_types, auth_event| {
|
||||||
let event_id = auth_event.event_id();
|
let event_id = auth_event.event_id();
|
||||||
|
|
||||||
// The auth event must be in the same room as the incoming event.
|
// The auth event must be in the same room as the incoming event.
|
||||||
if auth_event.room_id() != room_id {
|
if auth_event.room_id() != incoming_event.room_id() {
|
||||||
return Err!("auth event {event_id} not in the same room");
|
return Err!("auth event {event_id} not in the same room");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +136,7 @@ where
|
|||||||
.ok_or_else(|| err!("auth event {event_id} has no `state_key`"))?;
|
.ok_or_else(|| err!("auth event {event_id} has no `state_key`"))?;
|
||||||
|
|
||||||
let event_type = auth_event.event_type();
|
let event_type = auth_event.event_type();
|
||||||
let key = (event_type.to_cow_str().into(), state_key.into());
|
let key: TypeStateKey = (event_type.to_cow_str().into(), state_key.into());
|
||||||
|
|
||||||
// Since v1, if there are duplicate entries for a given type and state_key pair,
|
// Since v1, if there are duplicate entries for a given type and state_key pair,
|
||||||
// reject.
|
// reject.
|
||||||
@@ -166,7 +161,7 @@ where
|
|||||||
return Err!("rejected auth event {event_id}");
|
return Err!("rejected auth event {event_id}");
|
||||||
}
|
}
|
||||||
|
|
||||||
seen_auth_types.insert(key);
|
seen_auth_types.push(key);
|
||||||
Ok(seen_auth_types)
|
Ok(seen_auth_types)
|
||||||
})
|
})
|
||||||
.await?;
|
.await?;
|
||||||
@@ -188,11 +183,14 @@ where
|
|||||||
.authorization
|
.authorization
|
||||||
.room_create_event_id_as_room_id
|
.room_create_event_id_as_room_id
|
||||||
{
|
{
|
||||||
let room_create_event_id = room_id.as_event_id().map_err(|e| {
|
let room_create_event_id = incoming_event
|
||||||
err!(Request(InvalidParam(
|
.room_id()
|
||||||
"could not construct `m.room.create` event ID from room ID: {e}"
|
.as_event_id()
|
||||||
)))
|
.map_err(|e| {
|
||||||
})?;
|
err!(Request(InvalidParam(
|
||||||
|
"could not construct `m.room.create` event ID from room ID: {e}"
|
||||||
|
)))
|
||||||
|
})?;
|
||||||
|
|
||||||
let Ok(room_create_event) = fetch_event(room_create_event_id.clone()).await else {
|
let Ok(room_create_event) = fetch_event(room_create_event_id.clone()).await else {
|
||||||
return Err!(Request(NotFound(
|
return Err!(Request(NotFound(
|
||||||
@@ -307,6 +305,7 @@ where
|
|||||||
&room_create_event,
|
&room_create_event,
|
||||||
fetch_state,
|
fetch_state,
|
||||||
)
|
)
|
||||||
|
.boxed()
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -293,6 +293,7 @@ where
|
|||||||
.state
|
.state
|
||||||
.get_room_version(pdu.room_id())
|
.get_room_version(pdu.room_id())
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
match room_version_id {
|
match room_version_id {
|
||||||
| V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => {
|
| V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 => {
|
||||||
if let Some(redact_id) = pdu.redacts() {
|
if let Some(redact_id) = pdu.redacts() {
|
||||||
@@ -434,6 +435,7 @@ where
|
|||||||
self.services
|
self.services
|
||||||
.sending
|
.sending
|
||||||
.send_pdu_appservice(appservice.registration.id.clone(), pdu_id)?;
|
.send_pdu_appservice(appservice.registration.id.clone(), pdu_id)?;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -450,6 +452,7 @@ where
|
|||||||
self.services
|
self.services
|
||||||
.sending
|
.sending
|
||||||
.send_pdu_appservice(appservice.registration.id.clone(), pdu_id)?;
|
.send_pdu_appservice(appservice.registration.id.clone(), pdu_id)?;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,7 +132,6 @@ pub async fn build_and_append_pdu(
|
|||||||
once(pdu.event_id()),
|
once(pdu.event_id()),
|
||||||
state_lock,
|
state_lock,
|
||||||
)
|
)
|
||||||
.boxed()
|
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
// We set the room state after inserting the pdu, so that we never have a moment
|
// We set the room state after inserting the pdu, so that we never have a moment
|
||||||
|
|||||||
Reference in New Issue
Block a user