diff --git a/src/api/client/device.rs b/src/api/client/device.rs index 1ca3152d..7563ec6d 100644 --- a/src/api/client/device.rs +++ b/src/api/client/device.rs @@ -61,18 +61,21 @@ pub(crate) async fn update_device_route( .await { | Ok(mut device) => { + let notify = device.display_name != body.display_name; device.display_name.clone_from(&body.display_name); + device .last_seen_ip .clone_from(&Some(client.to_string())); + device .last_seen_ts .clone_from(&Some(MilliSecondsSinceUnixEpoch::now())); + assert_eq!(device.device_id, body.device_id, "device_id mismatch"); services .users - .update_device_metadata(sender_user, &body.device_id, &device) - .await?; + .put_device_metadata(sender_user, notify, &device); Ok(update_device::v3::Response {}) }, @@ -80,6 +83,7 @@ pub(crate) async fn update_device_route( let Some(appservice) = appservice else { return Err!(Request(NotFound("Device not found."))); }; + if !appservice.registration.device_management { return Err!(Request(NotFound("Device not found."))); } diff --git a/src/service/users/device.rs b/src/service/users/device.rs index 3d04a8ba..09fcfae7 100644 --- a/src/service/users/device.rs +++ b/src/service/users/device.rs @@ -40,16 +40,13 @@ pub async fn create_device( )))); } - let key = (user_id, device_id); - let val = Device { + let notify = true; + self.put_device_metadata(user_id, notify, &Device { device_id: device_id.into(), display_name: initial_device_display_name, last_seen_ip: client_ip, last_seen_ts: Some(MilliSecondsSinceUnixEpoch::now()), - }; - - increment(&self.db.userid_devicelistversion, user_id.as_bytes()); - self.db.userdeviceid_metadata.put(key, Json(val)); + }); if let Some(access_token) = access_token { self.set_access_token(user_id, device_id, access_token, expires_in, refresh_token) @@ -97,11 +94,11 @@ pub async fn remove_device(&self, user_id: &UserId, device_id: &DeviceId) { // TODO: Remove onetimekeys - increment(&self.db.userid_devicelistversion, user_id.as_bytes()); - let userdeviceid = (user_id, device_id); self.db.userdeviceid_metadata.del(userdeviceid); + self.mark_device_key_update(user_id).await; + increment(&self.db.userid_devicelistversion, user_id.as_bytes()); } /// Returns an iterator over all device ids of this user. @@ -366,20 +363,15 @@ pub async fn remove_to_device_events( } #[implement(super::Service)] -pub async fn update_device_metadata( - &self, - user_id: &UserId, - device_id: &DeviceId, - device: &Device, -) -> Result { - increment(&self.db.userid_devicelistversion, user_id.as_bytes()); - - let key = (user_id, device_id); +pub fn put_device_metadata(&self, user_id: &UserId, notify: bool, device: &Device) { + let key = (user_id, &device.device_id); self.db .userdeviceid_metadata .put(key, Json(device)); - Ok(()) + if notify { + increment(&self.db.userid_devicelistversion, user_id.as_bytes()); + } } /// Get device metadata. @@ -394,6 +386,9 @@ pub async fn get_device_metadata( .qry(&(user_id, device_id)) .await .deserialized() + .inspect(|device: &Device| { + debug_assert_eq!(&device.device_id, device_id, "device_id mismatch"); + }) } #[implement(super::Service)]