Update state-res crate
This commit is contained in:
		
							parent
							
								
									f46c2d1eec
								
							
						
					
					
						commit
						3b40f3d60e
					
				
					 2 changed files with 44 additions and 31 deletions
				
			
		
							
								
								
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							|  | @ -2070,7 +2070,7 @@ checksum = "7345c971d1ef21ffdbd103a75990a15eb03604fc8b8852ca8cb418ee1a099028" | |||
| [[package]] | ||||
| name = "state-res" | ||||
| version = "0.1.0" | ||||
| source = "git+https://github.com/ruma/state-res?branch=spec-comp#17958665f6592af3ef478024fd1d75c384a30e7f" | ||||
| source = "git+https://github.com/ruma/state-res?branch=spec-comp#394d26744a6586ccdc01838964bb27dab289eee5" | ||||
| dependencies = [ | ||||
|  "itertools", | ||||
|  "js_int", | ||||
|  |  | |||
|  | @ -19,13 +19,12 @@ use ruma::{ | |||
|     EventId, Raw, RoomAliasId, RoomId, UserId, | ||||
| }; | ||||
| use sled::IVec; | ||||
| use state_res::{event_auth, Requester, StateEvent, StateMap, StateStore}; | ||||
| use state_res::{event_auth, Error as StateError, Requester, StateEvent, StateMap, StateStore}; | ||||
| 
 | ||||
| use std::{ | ||||
|     collections::{BTreeMap, HashMap}, | ||||
|     convert::{TryFrom, TryInto}, | ||||
|     mem, | ||||
|     result::Result as StdResult, | ||||
| }; | ||||
| 
 | ||||
| /// The unique identifier of each state group.
 | ||||
|  | @ -67,28 +66,32 @@ pub struct Rooms { | |||
| } | ||||
| 
 | ||||
| impl StateStore for Rooms { | ||||
|     fn get_event(&self, room_id: &RoomId, event_id: &EventId) -> StdResult<StateEvent, String> { | ||||
|     fn get_event(&self, room_id: &RoomId, event_id: &EventId) -> state_res::Result<StateEvent> { | ||||
|         let pid = self | ||||
|             .eventid_pduid | ||||
|             .get(event_id.as_bytes()) | ||||
|             .map_err(|e| e.to_string())? | ||||
|             .ok_or_else(|| "PDU via room_id and event_id not found in the db.".to_owned())?; | ||||
|             .map_err(StateError::custom)? | ||||
|             .ok_or_else(|| { | ||||
|                 StateError::NotFound("PDU via room_id and event_id not found in the db.".into()) | ||||
|             })?; | ||||
| 
 | ||||
|         serde_json::from_slice( | ||||
|             &self | ||||
|                 .pduid_pdu | ||||
|                 .get(pid) | ||||
|                 .map_err(|e| e.to_string())? | ||||
|                 .ok_or_else(|| "PDU via pduid not found in db.".to_owned())?, | ||||
|                 .map_err(StateError::custom)? | ||||
|                 .ok_or_else(|| StateError::NotFound("PDU via pduid not found in db.".into()))?, | ||||
|         ) | ||||
|         .map_err(|e| e.to_string()) | ||||
|         .map_err(Into::into) | ||||
|         .and_then(|pdu: StateEvent| { | ||||
|             // conduit's PDU's always contain a room_id but some
 | ||||
|             // of ruma's do not so this must be an Option
 | ||||
|             if pdu.room_id() == Some(room_id) { | ||||
|                 Ok(pdu) | ||||
|             } else { | ||||
|                 Err("Found PDU for incorrect room in db.".into()) | ||||
|                 Err(StateError::NotFound( | ||||
|                     "Found PDU for incorrect room in db.".into(), | ||||
|                 )) | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
|  | @ -732,27 +735,37 @@ impl Rooms { | |||
|                     // Don't allow encryption events when it's disabled
 | ||||
|                     !globals.encryption_disabled() | ||||
|                 } | ||||
|                 EventType::RoomMember => event_auth::is_membership_change_allowed( | ||||
|                     // TODO this is a bit of a hack but not sure how to have a type
 | ||||
|                     // declared in `state_res` crate easily convert to/from conduit::PduEvent
 | ||||
|                     Requester { | ||||
|                         prev_event_ids: prev_events.to_owned(), | ||||
|                         room_id: &room_id, | ||||
|                         content: &content, | ||||
|                         state_key: Some(state_key.to_owned()), | ||||
|                         sender: &sender, | ||||
|                     }, | ||||
|                     &auth_events | ||||
|                         .iter() | ||||
|                         .map(|((ty, key), pdu)| { | ||||
|                             Ok(((ty.clone(), key.clone()), pdu.convert_for_state_res()?)) | ||||
|                         }) | ||||
|                         .collect::<Result<StateMap<_>>>()?, | ||||
|                 ) | ||||
|                 .map_err(|e| { | ||||
|                     log::error!("{}", e); | ||||
|                     Error::Conflict("Found incoming PDU with invalid data.") | ||||
|                 })?, | ||||
|                 EventType::RoomMember => { | ||||
|                     let prev_event = self | ||||
|                         .get_pdu(prev_events.iter().next().ok_or(Error::BadRequest( | ||||
|                             ErrorKind::Unknown, | ||||
|                             "Membership can't be the first event", | ||||
|                         ))?)? | ||||
|                         .map(|pdu| pdu.convert_for_state_res()) | ||||
|                         .transpose()?; | ||||
|                     event_auth::valid_membership_change( | ||||
|                         // TODO this is a bit of a hack but not sure how to have a type
 | ||||
|                         // declared in `state_res` crate easily convert to/from conduit::PduEvent
 | ||||
|                         Requester { | ||||
|                             prev_event_ids: prev_events.to_owned(), | ||||
|                             room_id: &room_id, | ||||
|                             content: &content, | ||||
|                             state_key: Some(state_key.to_owned()), | ||||
|                             sender: &sender, | ||||
|                         }, | ||||
|                         prev_event.as_ref(), | ||||
|                         &auth_events | ||||
|                             .iter() | ||||
|                             .map(|((ty, key), pdu)| { | ||||
|                                 Ok(((ty.clone(), key.clone()), pdu.convert_for_state_res()?)) | ||||
|                             }) | ||||
|                             .collect::<Result<StateMap<_>>>()?, | ||||
|                     ) | ||||
|                     .map_err(|e| { | ||||
|                         log::error!("{}", e); | ||||
|                         Error::Conflict("Found incoming PDU with invalid data.") | ||||
|                     })? | ||||
|                 } | ||||
|                 EventType::RoomCreate => prev_events.is_empty(), | ||||
|                 // Not allow any of the following events if the sender is not joined.
 | ||||
|                 _ if sender_membership != member::MembershipState::Join => false, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue