state-res: Return borrows from Event::{prev_events, auth_events}
This commit is contained in:
parent
34a10b87c5
commit
1e19de9579
@ -202,7 +202,7 @@ impl<E: Event> TestStore<E> {
|
|||||||
|
|
||||||
let event = self.get_event(room_id, &ev_id)?;
|
let event = self.get_event(room_id, &ev_id)?;
|
||||||
|
|
||||||
stack.extend(event.auth_events().clone());
|
stack.extend(event.auth_events().cloned());
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(result)
|
Ok(result)
|
||||||
@ -578,7 +578,7 @@ pub mod event {
|
|||||||
self.state_key()
|
self.state_key()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prev_events(&self) -> Vec<EventId> {
|
fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
|
||||||
self.prev_event_ids()
|
self.prev_event_ids()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -586,7 +586,7 @@ pub mod event {
|
|||||||
self.depth()
|
self.depth()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn auth_events(&self) -> Vec<EventId> {
|
fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
|
||||||
self.auth_events()
|
self.auth_events()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -732,19 +732,19 @@ pub mod event {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn prev_event_ids(&self) -> Vec<EventId> {
|
pub fn prev_event_ids(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
|
||||||
match &self.rest {
|
match &self.rest {
|
||||||
Pdu::RoomV1Pdu(ev) => ev.prev_events.iter().map(|(id, _)| id).cloned().collect(),
|
Pdu::RoomV1Pdu(ev) => Box::new(ev.prev_events.iter().map(|(id, _)| id)),
|
||||||
Pdu::RoomV3Pdu(ev) => ev.prev_events.clone(),
|
Pdu::RoomV3Pdu(ev) => Box::new(ev.prev_events.iter()),
|
||||||
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
||||||
_ => unreachable!("new PDU version"),
|
_ => unreachable!("new PDU version"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn auth_events(&self) -> Vec<EventId> {
|
pub fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
|
||||||
match &self.rest {
|
match &self.rest {
|
||||||
Pdu::RoomV1Pdu(ev) => ev.auth_events.iter().map(|(id, _)| id).cloned().collect(),
|
Pdu::RoomV1Pdu(ev) => Box::new(ev.auth_events.iter().map(|(id, _)| id)),
|
||||||
Pdu::RoomV3Pdu(ev) => ev.auth_events.to_vec(),
|
Pdu::RoomV3Pdu(ev) => Box::new(ev.auth_events.iter()),
|
||||||
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
||||||
_ => unreachable!("new PDU version"),
|
_ => unreachable!("new PDU version"),
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ where
|
|||||||
info!("start m.room.create check");
|
info!("start m.room.create check");
|
||||||
|
|
||||||
// If it has any previous events, reject
|
// If it has any previous events, reject
|
||||||
if !incoming_event.prev_events().is_empty() {
|
if incoming_event.prev_events().next().is_some() {
|
||||||
warn!("the room creation event had previous events");
|
warn!("the room creation event had previous events");
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
}
|
}
|
||||||
@ -431,7 +431,7 @@ fn valid_membership_change<E: Event>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(prev) = prev_event {
|
if let Some(prev) = prev_event {
|
||||||
if *prev.event_type() == EventType::RoomCreate && prev.prev_events().is_empty() {
|
if *prev.event_type() == EventType::RoomCreate && prev.prev_events().next().is_none() {
|
||||||
return Ok(true);
|
return Ok(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -341,8 +341,8 @@ where
|
|||||||
let event = fetch_event(event_id);
|
let event = fetch_event(event_id);
|
||||||
let mut pl = None;
|
let mut pl = None;
|
||||||
|
|
||||||
for aid in event.as_ref().map(|pdu| pdu.auth_events()).unwrap_or_default() {
|
for aid in event.as_ref().map(|pdu| pdu.auth_events()).into_iter().flatten() {
|
||||||
if let Some(aev) = fetch_event(&aid) {
|
if let Some(aev) = fetch_event(aid) {
|
||||||
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
|
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
|
||||||
pl = Some(aev);
|
pl = Some(aev);
|
||||||
break;
|
break;
|
||||||
@ -402,7 +402,7 @@ where
|
|||||||
.ok_or_else(|| Error::InvalidPdu("State event had no state key".to_owned()))?;
|
.ok_or_else(|| Error::InvalidPdu("State event had no state key".to_owned()))?;
|
||||||
|
|
||||||
let mut auth_events = HashMap::new();
|
let mut auth_events = HashMap::new();
|
||||||
for aid in &event.auth_events() {
|
for aid in event.auth_events() {
|
||||||
if let Some(ev) = fetch_event(aid) {
|
if let Some(ev) = fetch_event(aid) {
|
||||||
// TODO synapse check "rejected_reason" which is most likely
|
// TODO synapse check "rejected_reason" which is most likely
|
||||||
// related to soft-failing
|
// related to soft-failing
|
||||||
@ -439,7 +439,7 @@ where
|
|||||||
debug!("event to check {:?}", event.event_id());
|
debug!("event to check {:?}", event.event_id());
|
||||||
|
|
||||||
let most_recent_prev_event =
|
let most_recent_prev_event =
|
||||||
event.prev_events().iter().filter_map(|id| fetch_event(id)).next_back();
|
event.prev_events().filter_map(|id| fetch_event(id)).next_back();
|
||||||
|
|
||||||
// The key for this is (eventType + a state_key of the signed token not sender) so
|
// The key for this is (eventType + a state_key of the signed token not sender) so
|
||||||
// search for it
|
// search for it
|
||||||
@ -502,9 +502,8 @@ where
|
|||||||
|
|
||||||
let event =
|
let event =
|
||||||
fetch_event(&p).ok_or_else(|| Error::NotFound(format!("Failed to find {}", p)))?;
|
fetch_event(&p).ok_or_else(|| Error::NotFound(format!("Failed to find {}", p)))?;
|
||||||
let auth_events = &event.auth_events();
|
|
||||||
pl = None;
|
pl = None;
|
||||||
for aid in auth_events {
|
for aid in event.auth_events() {
|
||||||
let ev = fetch_event(aid)
|
let ev = fetch_event(aid)
|
||||||
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
|
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
|
||||||
if is_type_and_key(&ev, &EventType::RoomPowerLevels, "") {
|
if is_type_and_key(&ev, &EventType::RoomPowerLevels, "") {
|
||||||
@ -566,9 +565,8 @@ where
|
|||||||
return Ok(*depth);
|
return Ok(*depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
let auth_events = &sort_ev.auth_events();
|
|
||||||
event = None;
|
event = None;
|
||||||
for aid in auth_events {
|
for aid in sort_ev.auth_events() {
|
||||||
let aev = fetch_event(aid)
|
let aev = fetch_event(aid)
|
||||||
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
|
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
|
||||||
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
|
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
|
||||||
@ -594,7 +592,7 @@ fn add_event_and_auth_chain_to_graph<E, F>(
|
|||||||
while let Some(eid) = state.pop() {
|
while let Some(eid) = state.pop() {
|
||||||
graph.entry(eid.clone()).or_default();
|
graph.entry(eid.clone()).or_default();
|
||||||
// Prefer the store to event as the store filters dedups the events
|
// Prefer the store to event as the store filters dedups the events
|
||||||
for aid in &fetch_event(&eid).map(|ev| ev.auth_events()).unwrap_or_default() {
|
for aid in fetch_event(&eid).as_ref().map(|ev| ev.auth_events()).into_iter().flatten() {
|
||||||
if auth_diff.contains(aid) {
|
if auth_diff.contains(aid) {
|
||||||
if !graph.contains_key(aid) {
|
if !graph.contains_key(aid) {
|
||||||
state.push(aid.clone());
|
state.push(aid.clone());
|
||||||
|
@ -30,7 +30,8 @@ pub trait Event {
|
|||||||
fn state_key(&self) -> Option<&str>;
|
fn state_key(&self) -> Option<&str>;
|
||||||
|
|
||||||
/// The events before this event.
|
/// The events before this event.
|
||||||
fn prev_events(&self) -> Vec<EventId>;
|
// Requires GATs to avoid boxing (and TAIT for making it convenient).
|
||||||
|
fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_>;
|
||||||
|
|
||||||
/// The maximum number of `prev_events` plus 1.
|
/// The maximum number of `prev_events` plus 1.
|
||||||
///
|
///
|
||||||
@ -38,7 +39,8 @@ pub trait Event {
|
|||||||
fn depth(&self) -> &UInt;
|
fn depth(&self) -> &UInt;
|
||||||
|
|
||||||
/// All the authenticating events for this event.
|
/// All the authenticating events for this event.
|
||||||
fn auth_events(&self) -> Vec<EventId>;
|
// Requires GATs to avoid boxing (and TAIT for making it convenient).
|
||||||
|
fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_>;
|
||||||
|
|
||||||
/// If this event is a redaction event this is the event it redacts.
|
/// If this event is a redaction event this is the event it redacts.
|
||||||
fn redacts(&self) -> Option<&EventId>;
|
fn redacts(&self) -> Option<&EventId>;
|
||||||
|
@ -244,7 +244,7 @@ impl<E: Event> TestStore<E> {
|
|||||||
|
|
||||||
let event = self.get_event(room_id, &ev_id)?;
|
let event = self.get_event(room_id, &ev_id)?;
|
||||||
|
|
||||||
stack.extend(event.auth_events().clone());
|
stack.extend(event.auth_events().cloned());
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(result)
|
Ok(result)
|
||||||
@ -599,13 +599,13 @@ pub mod event {
|
|||||||
fn state_key(&self) -> Option<&str> {
|
fn state_key(&self) -> Option<&str> {
|
||||||
Some(self.state_key())
|
Some(self.state_key())
|
||||||
}
|
}
|
||||||
fn prev_events(&self) -> Vec<EventId> {
|
fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
|
||||||
self.prev_event_ids()
|
self.prev_event_ids()
|
||||||
}
|
}
|
||||||
fn depth(&self) -> &UInt {
|
fn depth(&self) -> &UInt {
|
||||||
self.depth()
|
self.depth()
|
||||||
}
|
}
|
||||||
fn auth_events(&self) -> Vec<EventId> {
|
fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
|
||||||
self.auth_events()
|
self.auth_events()
|
||||||
}
|
}
|
||||||
fn redacts(&self) -> Option<&EventId> {
|
fn redacts(&self) -> Option<&EventId> {
|
||||||
@ -748,19 +748,19 @@ pub mod event {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn prev_event_ids(&self) -> Vec<EventId> {
|
pub fn prev_event_ids(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
|
||||||
match &self.rest {
|
match &self.rest {
|
||||||
Pdu::RoomV1Pdu(ev) => ev.prev_events.iter().map(|(id, _)| id).cloned().collect(),
|
Pdu::RoomV1Pdu(ev) => Box::new(ev.prev_events.iter().map(|(id, _)| id)),
|
||||||
Pdu::RoomV3Pdu(ev) => ev.prev_events.clone(),
|
Pdu::RoomV3Pdu(ev) => Box::new(ev.prev_events.iter()),
|
||||||
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
||||||
_ => unreachable!("new PDU version"),
|
_ => unreachable!("new PDU version"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn auth_events(&self) -> Vec<EventId> {
|
pub fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
|
||||||
match &self.rest {
|
match &self.rest {
|
||||||
Pdu::RoomV1Pdu(ev) => ev.auth_events.iter().map(|(id, _)| id).cloned().collect(),
|
Pdu::RoomV1Pdu(ev) => Box::new(ev.auth_events.iter().map(|(id, _)| id)),
|
||||||
Pdu::RoomV3Pdu(ev) => ev.auth_events.to_vec(),
|
Pdu::RoomV3Pdu(ev) => Box::new(ev.auth_events.iter()),
|
||||||
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
||||||
_ => unreachable!("new PDU version"),
|
_ => unreachable!("new PDU version"),
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user