diff --git a/src/admin/user/commands.rs b/src/admin/user/commands.rs index 6d385e05..b2feff10 100644 --- a/src/admin/user/commands.rs +++ b/src/admin/user/commands.rs @@ -2,7 +2,7 @@ use std::{collections::BTreeMap, fmt::Write as _}; use futures::{FutureExt, StreamExt}; use ruma::{ - Int, OwnedEventId, OwnedRoomId, OwnedRoomOrAliasId, OwnedUserId, UserId, + Int, OwnedDeviceId, OwnedEventId, OwnedRoomId, OwnedRoomOrAliasId, OwnedUserId, UserId, events::{ RoomAccountDataEventType, StateEventType, room::{ @@ -224,6 +224,25 @@ pub(super) async fn deactivate(&self, no_leave_rooms: bool, user_id: String) -> .await } +#[admin_command] +pub(super) async fn delete_device( + &self, + user_id: OwnedUserId, + device_id: OwnedDeviceId, +) -> Result { + if !self.services.globals.user_is_local(&user_id) { + return Err!("Cannot delete device of remote user"); + } + + self.services + .users + .remove_device(&user_id, &device_id) + .await; + + self.write_str(&format!("User {user_id}'s device {device_id} removed.")) + .await +} + #[admin_command] pub(super) async fn reset_password(&self, username: String, password: Option) -> Result { let user_id = parse_local_user_id(self.services, &username)?; diff --git a/src/admin/user/mod.rs b/src/admin/user/mod.rs index 55520b80..9e571e14 100644 --- a/src/admin/user/mod.rs +++ b/src/admin/user/mod.rs @@ -1,7 +1,7 @@ mod commands; use clap::Subcommand; -use ruma::{OwnedEventId, OwnedRoomId, OwnedRoomOrAliasId}; +use ruma::{OwnedDeviceId, OwnedEventId, OwnedRoomId, OwnedRoomOrAliasId, OwnedUserId}; use tuwunel_core::Result; use crate::admin_command_dispatch; @@ -59,6 +59,12 @@ pub(super) enum UserCommand { force: bool, }, + /// - Deletes a user's device. + DeleteDevice { + user_id: OwnedUserId, + device_id: OwnedDeviceId, + }, + /// - List local users in the database #[clap(alias = "list")] ListUsers,