fix: room version warnings and other bugs when joining rooms
This commit is contained in:
		
							parent
							
								
									989d843c40
								
							
						
					
					
						commit
						3e2f742f30
					
				
					 3 changed files with 12 additions and 44 deletions
				
			
		|  | @ -546,12 +546,6 @@ async fn join_room_by_id_helper( | |||
|             ) | ||||
|             .await?; | ||||
| 
 | ||||
|         let count = db.globals.next_count()?; | ||||
| 
 | ||||
|         let mut pdu_id = room_id.as_bytes().to_vec(); | ||||
|         pdu_id.push(0xff); | ||||
|         pdu_id.extend_from_slice(&count.to_be_bytes()); | ||||
| 
 | ||||
|         let pdu = PduEvent::from_id_val(&event_id, join_event.clone()) | ||||
|             .map_err(|_| Error::BadServerResponse("Invalid join event PDU."))?; | ||||
| 
 | ||||
|  | @ -579,36 +573,6 @@ async fn join_room_by_id_helper( | |||
| 
 | ||||
|             db.rooms.add_pdu_outlier(&event_id, &value)?; | ||||
|             if let Some(state_key) = &pdu.state_key { | ||||
|                 if pdu.kind == EventType::RoomMember { | ||||
|                     let target_user_id = UserId::try_from(state_key.clone()).map_err(|e| { | ||||
|                         warn!( | ||||
|                             "Invalid user id in send_join response: {}: {}", | ||||
|                             state_key, e | ||||
|                         ); | ||||
|                         Error::BadServerResponse("Invalid user id in send_join response.") | ||||
|                     })?; | ||||
| 
 | ||||
|                     let invite_state = Vec::new(); // TODO add a few important events
 | ||||
| 
 | ||||
|                     // Update our membership info, we do this here incase a user is invited
 | ||||
|                     // and immediately leaves we need the DB to record the invite event for auth
 | ||||
|                     db.rooms.update_membership( | ||||
|                         &pdu.room_id, | ||||
|                         &target_user_id, | ||||
|                         serde_json::from_value::<member::MembershipState>( | ||||
|                             pdu.content | ||||
|                                 .get("membership") | ||||
|                                 .ok_or(Error::BadServerResponse("Invalid member event content"))? | ||||
|                                 .clone(), | ||||
|                         ) | ||||
|                         .map_err(|_| { | ||||
|                             Error::BadServerResponse("Invalid membership state content.") | ||||
|                         })?, | ||||
|                         &pdu.sender, | ||||
|                         Some(invite_state), | ||||
|                         db, | ||||
|                     )?; | ||||
|                 } | ||||
|                 state.insert((pdu.kind.clone(), state_key.clone()), pdu.event_id.clone()); | ||||
|             } | ||||
|         } | ||||
|  | @ -648,10 +612,15 @@ async fn join_room_by_id_helper( | |||
|         // pdu without it's state. This is okay because append_pdu can't fail.
 | ||||
|         let statehashid = db.rooms.append_to_state(&pdu, &db.globals)?; | ||||
| 
 | ||||
|         let count = db.globals.next_count()?; | ||||
|         let mut pdu_id = room_id.as_bytes().to_vec(); | ||||
|         pdu_id.push(0xff); | ||||
|         pdu_id.extend_from_slice(&count.to_be_bytes()); | ||||
| 
 | ||||
|         db.rooms.append_pdu( | ||||
|             &pdu, | ||||
|             utils::to_canonical_object(&pdu).expect("Pdu is valid canonical object"), | ||||
|             db.globals.next_count()?, | ||||
|             count, | ||||
|             pdu_id.into(), | ||||
|             &[pdu.event_id.clone()], | ||||
|             db, | ||||
|  |  | |||
|  | @ -103,11 +103,6 @@ pub async fn sync_events_route( | |||
|         // The inner Option is None when there is an event, but there is no state hash associated
 | ||||
|         // with it. This can happen for the RoomCreate event, so all updates should arrive.
 | ||||
|         let first_pdu_before_since = db.rooms.pdus_until(sender_user, &room_id, since).next(); | ||||
|         let pdus_after_since = db | ||||
|             .rooms | ||||
|             .pdus_after(sender_user, &room_id, since) | ||||
|             .next() | ||||
|             .is_some(); | ||||
| 
 | ||||
|         let since_shortstatehash = first_pdu_before_since.as_ref().map(|pdu| { | ||||
|             db.rooms | ||||
|  | @ -121,7 +116,7 @@ pub async fn sync_events_route( | |||
|             invited_member_count, | ||||
|             joined_since_last_sync, | ||||
|             state_events, | ||||
|         ) = if pdus_after_since && Some(current_shortstatehash) != since_shortstatehash { | ||||
|         ) = if Some(current_shortstatehash) != since_shortstatehash { | ||||
|             let current_state = db.rooms.room_state_full(&room_id)?; | ||||
|             let current_members = current_state | ||||
|                 .iter() | ||||
|  | @ -224,6 +219,7 @@ pub async fn sync_events_route( | |||
|                                 device_list_updates.insert(user_id); | ||||
|                             } | ||||
|                         } | ||||
|                         // TODO: Remove, this should never happen here, right?
 | ||||
|                         (MembershipState::Join, MembershipState::Leave) => { | ||||
|                             // Write down users that have left encrypted rooms we are in
 | ||||
|                             left_encrypted_users.insert(user_id); | ||||
|  |  | |||
|  | @ -374,7 +374,7 @@ impl Rooms { | |||
| 
 | ||||
|         for event_id in new_state.difference(&old_state) { | ||||
|             if let Some(pdu) = self.get_pdu_json(event_id)? { | ||||
|                 if pdu.get("event_type").and_then(|val| val.as_str()) == Some("m.room.member") { | ||||
|                 if pdu.get("type").and_then(|val| val.as_str()) == Some("m.room.member") { | ||||
|                     if let Ok(pdu) = serde_json::from_value::<PduEvent>( | ||||
|                         serde_json::to_value(&pdu).expect("CanonicalJsonObj is a valid JsonValue"), | ||||
|                     ) { | ||||
|  | @ -1158,6 +1158,9 @@ impl Rooms { | |||
|     ) -> Result<Vec<Raw<AnyStrippedStateEvent>>> { | ||||
|         let mut state = Vec::new(); | ||||
|         // Add recommended events
 | ||||
|         if let Some(e) = self.room_state_get(&invite_event.room_id, &EventType::RoomCreate, "")? { | ||||
|             state.push(e.to_stripped_state_event()); | ||||
|         } | ||||
|         if let Some(e) = | ||||
|             self.room_state_get(&invite_event.room_id, &EventType::RoomJoinRules, "")? | ||||
|         { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue