From 0f8b56f52196ed4a5d0e2572246be9c53b47f04f Mon Sep 17 00:00:00 2001 From: timedout Date: Sun, 5 Apr 2026 20:12:21 +0100 Subject: [PATCH] feat: Add admin command to reset user push rules --- src/admin/user/commands.rs | 16 +++++++++++++++- src/admin/user/mod.rs | 6 ++++++ src/api/client/mod.rs | 1 + src/api/client/push.rs | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/admin/user/commands.rs b/src/admin/user/commands.rs index b7f129fd2..d4725a940 100644 --- a/src/admin/user/commands.rs +++ b/src/admin/user/commands.rs @@ -3,7 +3,10 @@ use std::{ fmt::Write as _, }; -use api::client::{full_user_deactivate, join_room_by_id_helper, leave_room, remote_leave_room}; +use api::client::{ + full_user_deactivate, join_room_by_id_helper, leave_room, recreate_push_rules_and_return, + remote_leave_room, +}; use conduwuit::{ Err, Result, debug_warn, error, info, matrix::{Event, pdu::PduBuilder}, @@ -1198,3 +1201,14 @@ pub(super) async fn change_email(&self, user_id: String, email: Option) }, } } + +#[admin_command] +pub(super) async fn reset_push_rules(&self, user_id: String) -> Result { + let user_id = parse_local_user_id(self.services, &user_id)?; + if !self.services.users.is_active(&user_id).await { + return Err!("User is not active."); + } + recreate_push_rules_and_return(self.services, &user_id).await?; + self.write_str("Reset user's push rules to the server default.") + .await +} diff --git a/src/admin/user/mod.rs b/src/admin/user/mod.rs index ef5506840..916fcd205 100644 --- a/src/admin/user/mod.rs +++ b/src/admin/user/mod.rs @@ -257,4 +257,10 @@ pub enum UserCommand { #[arg(long)] yes_i_want_to_do_this: bool, }, + + /// Resets the push-rules (notification settings) of the target user to the + /// server defaults. + ResetPushRules { + user_id: String, + }, } diff --git a/src/api/client/mod.rs b/src/api/client/mod.rs index f0054fe40..caa65f8f0 100644 --- a/src/api/client/mod.rs +++ b/src/api/client/mod.rs @@ -64,6 +64,7 @@ pub(super) use openid::*; pub(super) use presence::*; pub(super) use profile::*; pub use profile::{update_all_rooms, update_avatar_url, update_displayname}; +pub use push::recreate_push_rules_and_return; pub(super) use push::*; pub(super) use read_marker::*; pub(super) use redact::*; diff --git a/src/api/client/push.rs b/src/api/client/push.rs index d8d84ec73..984a09330 100644 --- a/src/api/client/push.rs +++ b/src/api/client/push.rs @@ -489,7 +489,7 @@ pub(crate) async fn set_pushers_route( /// user somehow has bad push rules, these must always exist per spec. /// so recreate it and return server default silently -async fn recreate_push_rules_and_return( +pub async fn recreate_push_rules_and_return( services: &Services, sender_user: &ruma::UserId, ) -> Result {