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