Move ignore invite logic into update_member
This commit is contained in:
		
							parent
							
								
									f2fab27d81
								
							
						
					
					
						commit
						8aac332b3a
					
				
					 1 changed files with 44 additions and 42 deletions
				
			
		|  | @ -355,12 +355,13 @@ impl Rooms { | |||
|                             .membership) | ||||
|                         })?; | ||||
| 
 | ||||
|                     let target_membership = | ||||
|                     let member_content = | ||||
|                         serde_json::from_value::<Raw<member::MemberEventContent>>(content.clone()) | ||||
|                             .expect("Raw::from_value always works.") | ||||
|                             .deserialize() | ||||
|                             .map_err(|_| Error::bad_database("Invalid Member event in db."))? | ||||
|                             .membership; | ||||
|                             .map_err(|_| Error::bad_database("Invalid Member event in db."))?; | ||||
| 
 | ||||
|                     let target_membership = member_content.membership; | ||||
| 
 | ||||
|                     let target_power = power_levels.users.get(&target_user_id).map_or_else( | ||||
|                         || { | ||||
|  | @ -413,43 +414,6 @@ impl Rooms { | |||
|                                 || join_rules == join_rules::JoinRule::Public | ||||
|                         } | ||||
|                     } else if target_membership == member::MembershipState::Invite { | ||||
|                         // we want to know if the sender is ignored by the receiver
 | ||||
|                         let is_ignored = if let Ok(Some(ignored)) = | ||||
|                             account_data.get::<ignored_user_list::IgnoredUserListEventContent>( | ||||
|                                 None,            // we cannot use the provided room_id it's the invite room
 | ||||
|                                 &target_user_id, // receiver
 | ||||
|                                 EventType::IgnoredUserList, | ||||
|                             ) { | ||||
|                             ignored.ignored_users.contains(&sender) | ||||
|                         } else { | ||||
|                             false | ||||
|                         }; | ||||
| 
 | ||||
|                         if is_ignored { | ||||
|                             let mut event = | ||||
|                                 serde_json::from_value::<Raw<member::MemberEventContent>>(content) | ||||
|                                     .expect("from_value::<Raw<..>> cannot fail") | ||||
|                                     .deserialize() | ||||
|                                     .map_err(|_| { | ||||
|                                         Error::bad_database("Invalid member event in database.") | ||||
|                                     })?; | ||||
| 
 | ||||
|                             event.membership = member::MembershipState::Leave; | ||||
| 
 | ||||
|                             return self.append_pdu( | ||||
|                                 room_id, | ||||
|                                 target_user_id.clone(), | ||||
|                                 EventType::RoomMember, | ||||
|                                 serde_json::to_value(event) | ||||
|                                     .expect("event is valid, we just created it"), | ||||
|                                 None, | ||||
|                                 Some(target_user_id.to_string()), | ||||
|                                 None, | ||||
|                                 globals, | ||||
|                                 account_data, | ||||
|                             ); | ||||
|                         } | ||||
| 
 | ||||
|                         if let Some(third_party_invite_json) = content.get("third_party_invite") { | ||||
|                             if current_membership == member::MembershipState::Ban { | ||||
|                                 false | ||||
|  | @ -502,7 +466,14 @@ impl Rooms { | |||
| 
 | ||||
|                     if authorized { | ||||
|                         // Update our membership info
 | ||||
|                         self.update_membership(&room_id, &target_user_id, &target_membership)?; | ||||
|                         self.update_membership( | ||||
|                             &room_id, | ||||
|                             &target_user_id, | ||||
|                             member_content, | ||||
|                             &sender, | ||||
|                             account_data, | ||||
|                             globals, | ||||
|                         )?; | ||||
|                     } | ||||
| 
 | ||||
|                     authorized | ||||
|  | @ -780,8 +751,12 @@ impl Rooms { | |||
|         &self, | ||||
|         room_id: &RoomId, | ||||
|         user_id: &UserId, | ||||
|         membership: &member::MembershipState, | ||||
|         mut member_event: member::MemberEventContent, | ||||
|         sender: &UserId, | ||||
|         account_data: &super::account_data::AccountData, | ||||
|         globals: &super::globals::Globals, | ||||
|     ) -> Result<()> { | ||||
|         let membership = member_event.membership; | ||||
|         let mut userroom_id = user_id.to_string().as_bytes().to_vec(); | ||||
|         userroom_id.push(0xff); | ||||
|         userroom_id.extend_from_slice(room_id.to_string().as_bytes()); | ||||
|  | @ -799,6 +774,33 @@ impl Rooms { | |||
|                 self.userroomid_left.remove(&userroom_id)?; | ||||
|             } | ||||
|             member::MembershipState::Invite => { | ||||
|                 // We want to know if the sender is ignored by the receiver
 | ||||
|                 let is_ignored = account_data | ||||
|                     .get::<ignored_user_list::IgnoredUserListEventContent>( | ||||
|                         None,     // Ignored users are in global account data
 | ||||
|                         &user_id, // Receiver
 | ||||
|                         EventType::IgnoredUserList, | ||||
|                     )? | ||||
|                     .map_or(false, |ignored| ignored.ignored_users.contains(&sender)); | ||||
| 
 | ||||
|                 if is_ignored { | ||||
|                     member_event.membership = member::MembershipState::Leave; | ||||
| 
 | ||||
|                     return self | ||||
|                         .append_pdu( | ||||
|                             room_id.clone(), | ||||
|                             user_id.clone(), | ||||
|                             EventType::RoomMember, | ||||
|                             serde_json::to_value(member_event) | ||||
|                                 .expect("event is valid, we just created it"), | ||||
|                             None, | ||||
|                             Some(user_id.to_string()), | ||||
|                             None, | ||||
|                             globals, | ||||
|                             account_data, | ||||
|                         ) | ||||
|                         .map(|_| ()); | ||||
|                 } | ||||
|                 self.userroomid_invited.insert(&userroom_id, &[])?; | ||||
|                 self.roomuserid_invited.insert(&roomuser_id, &[])?; | ||||
|                 self.userroomid_joined.remove(&userroom_id)?; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue