use ruma::{ DeviceId, UserId, api::client::{error::ErrorKind, uiaa::UiaaInfo}, }; use crate::{Error, Result, database::KeyValueDatabase, service}; impl service::uiaa::Data for KeyValueDatabase { fn update_uiaa_session( &self, user_id: &UserId, device_id: &DeviceId, session: &str, uiaainfo: Option<&UiaaInfo>, ) -> Result<()> { let mut userdevicesessionid = user_id.as_bytes().to_vec(); userdevicesessionid.push(0xFF); userdevicesessionid.extend_from_slice(device_id.as_bytes()); userdevicesessionid.push(0xFF); userdevicesessionid.extend_from_slice(session.as_bytes()); if let Some(uiaainfo) = uiaainfo { self.userdevicesessionid_uiaainfo.insert( &userdevicesessionid, &serde_json::to_vec(&uiaainfo) .expect("UiaaInfo::to_vec always works"), )?; } else { self.userdevicesessionid_uiaainfo.remove(&userdevicesessionid)?; } Ok(()) } fn get_uiaa_session( &self, user_id: &UserId, device_id: &DeviceId, session: &str, ) -> Result { let mut userdevicesessionid = user_id.as_bytes().to_vec(); userdevicesessionid.push(0xFF); userdevicesessionid.extend_from_slice(device_id.as_bytes()); userdevicesessionid.push(0xFF); userdevicesessionid.extend_from_slice(session.as_bytes()); serde_json::from_slice( &self .userdevicesessionid_uiaainfo .get(&userdevicesessionid)? .ok_or(Error::BadRequest( ErrorKind::forbidden(), "UIAA session does not exist.", ))?, ) .map_err(|_| { Error::bad_database("UiaaInfo in userdeviceid_uiaainfo is invalid.") }) } }