Add logout route and database methods (#21)
Condense keys Move remove methods to remove_device Code cleanup Add method for removing todevice events Remove unnecessary existence checks Add logout route and database methods Co-authored-by: Josias <justjosias@tutanota.com>
This commit is contained in:
		
							parent
							
								
									1014388a9c
								
							
						
					
					
						commit
						b106d1393b
					
				
					 3 changed files with 46 additions and 1 deletions
				
			
		|  | @ -29,7 +29,7 @@ use ruma_client_api::{ | |||
|         push::{self, get_pushrules_all, set_pushrule, set_pushrule_enabled}, | ||||
|         read_marker::set_read_marker, | ||||
|         room::create_room, | ||||
|         session::{get_login_types, login}, | ||||
|         session::{get_login_types, login, logout}, | ||||
|         state::{ | ||||
|             create_state_event_for_empty_key, create_state_event_for_key, get_state_events, | ||||
|             get_state_events_for_empty_key, get_state_events_for_key, | ||||
|  | @ -311,6 +311,19 @@ pub fn login_route( | |||
|     })) | ||||
| } | ||||
| 
 | ||||
| #[post("/_matrix/client/r0/logout", data = "<body>")] | ||||
| pub fn logout_route( | ||||
|     db: State<'_, Database>, | ||||
|     body: Ruma<logout::Request>, | ||||
| ) -> MatrixResult<logout::Response> { | ||||
|     let user_id = body.user_id.as_ref().expect("user is authenticated"); | ||||
|     let device_id = body.device_id.as_ref().expect("user is authenticated"); | ||||
| 
 | ||||
|     db.users.remove_device(&user_id, &device_id).unwrap(); | ||||
| 
 | ||||
|     MatrixResult(Ok(logout::Response)) | ||||
| } | ||||
| 
 | ||||
| #[get("/_matrix/client/r0/capabilities")] | ||||
| pub fn get_capabilities_route() -> MatrixResult<get_capabilities::Response> { | ||||
|     // TODO
 | ||||
|  |  | |||
|  | @ -123,6 +123,37 @@ impl Users { | |||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     /// Removes a device from a user
 | ||||
|     pub fn remove_device(&self, user_id: &UserId, device_id: &DeviceId) -> Result<()> { | ||||
|         let mut userdeviceid = user_id.to_string().as_bytes().to_vec(); | ||||
|         userdeviceid.push(0xff); | ||||
|         userdeviceid.extend_from_slice(device_id.as_bytes()); | ||||
| 
 | ||||
|         // Remove device keys
 | ||||
|         self.userdeviceid_devicekeys.remove(&userdeviceid)?; | ||||
| 
 | ||||
|         // Remove tokens
 | ||||
|         if let Some(old_token) = self.userdeviceid_token.remove(&userdeviceid)? { | ||||
|             self.token_userdeviceid.remove(&old_token)?; | ||||
|         } | ||||
| 
 | ||||
|         // Remove todevice events
 | ||||
|         let mut prefix = userdeviceid.clone(); | ||||
|         prefix.push(0xff); | ||||
| 
 | ||||
|         for result in self.todeviceid_events.scan_prefix(&prefix) { | ||||
|             let (key, value) = result?; | ||||
|             self.todeviceid_events.remove(key)?; | ||||
|         } | ||||
| 
 | ||||
|         // TODO: Remove onetimekeys
 | ||||
| 
 | ||||
|         // Remove the device
 | ||||
|         self.userdeviceids.remove(userdeviceid)?; | ||||
| 
 | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     /// Returns an iterator over all device ids of this user.
 | ||||
|     pub fn all_device_ids(&self, user_id: &UserId) -> impl Iterator<Item = Result<DeviceId>> { | ||||
|         let mut prefix = user_id.to_string().as_bytes().to_vec(); | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ fn setup_rocket() -> rocket::Rocket { | |||
|                 client_server::register_route, | ||||
|                 client_server::get_login_route, | ||||
|                 client_server::login_route, | ||||
|                 client_server::logout_route, | ||||
|                 client_server::get_capabilities_route, | ||||
|                 client_server::get_pushrules_all_route, | ||||
|                 client_server::set_pushrule_route, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue