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?; |             .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()) |         let pdu = PduEvent::from_id_val(&event_id, join_event.clone()) | ||||||
|             .map_err(|_| Error::BadServerResponse("Invalid join event PDU."))?; |             .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)?; |             db.rooms.add_pdu_outlier(&event_id, &value)?; | ||||||
|             if let Some(state_key) = &pdu.state_key { |             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()); |                 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.
 |         // 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 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( |         db.rooms.append_pdu( | ||||||
|             &pdu, |             &pdu, | ||||||
|             utils::to_canonical_object(&pdu).expect("Pdu is valid canonical object"), |             utils::to_canonical_object(&pdu).expect("Pdu is valid canonical object"), | ||||||
|             db.globals.next_count()?, |             count, | ||||||
|             pdu_id.into(), |             pdu_id.into(), | ||||||
|             &[pdu.event_id.clone()], |             &[pdu.event_id.clone()], | ||||||
|             db, |             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
 |         // 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.
 |         // 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 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| { |         let since_shortstatehash = first_pdu_before_since.as_ref().map(|pdu| { | ||||||
|             db.rooms |             db.rooms | ||||||
|  | @ -121,7 +116,7 @@ pub async fn sync_events_route( | ||||||
|             invited_member_count, |             invited_member_count, | ||||||
|             joined_since_last_sync, |             joined_since_last_sync, | ||||||
|             state_events, |             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_state = db.rooms.room_state_full(&room_id)?; | ||||||
|             let current_members = current_state |             let current_members = current_state | ||||||
|                 .iter() |                 .iter() | ||||||
|  | @ -224,6 +219,7 @@ pub async fn sync_events_route( | ||||||
|                                 device_list_updates.insert(user_id); |                                 device_list_updates.insert(user_id); | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|  |                         // TODO: Remove, this should never happen here, right?
 | ||||||
|                         (MembershipState::Join, MembershipState::Leave) => { |                         (MembershipState::Join, MembershipState::Leave) => { | ||||||
|                             // Write down users that have left encrypted rooms we are in
 |                             // Write down users that have left encrypted rooms we are in
 | ||||||
|                             left_encrypted_users.insert(user_id); |                             left_encrypted_users.insert(user_id); | ||||||
|  |  | ||||||
|  | @ -374,7 +374,7 @@ impl Rooms { | ||||||
| 
 | 
 | ||||||
|         for event_id in new_state.difference(&old_state) { |         for event_id in new_state.difference(&old_state) { | ||||||
|             if let Some(pdu) = self.get_pdu_json(event_id)? { |             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>( |                     if let Ok(pdu) = serde_json::from_value::<PduEvent>( | ||||||
|                         serde_json::to_value(&pdu).expect("CanonicalJsonObj is a valid JsonValue"), |                         serde_json::to_value(&pdu).expect("CanonicalJsonObj is a valid JsonValue"), | ||||||
|                     ) { |                     ) { | ||||||
|  | @ -1158,6 +1158,9 @@ impl Rooms { | ||||||
|     ) -> Result<Vec<Raw<AnyStrippedStateEvent>>> { |     ) -> Result<Vec<Raw<AnyStrippedStateEvent>>> { | ||||||
|         let mut state = Vec::new(); |         let mut state = Vec::new(); | ||||||
|         // Add recommended events
 |         // 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) = |         if let Some(e) = | ||||||
|             self.room_state_get(&invite_event.room_id, &EventType::RoomJoinRules, "")? |             self.room_state_get(&invite_event.room_id, &EventType::RoomJoinRules, "")? | ||||||
|         { |         { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue