add config option to control sending admin notices of alerts

Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
strawberry 2024-10-24 22:19:18 -04:00
parent 0760150822
commit 75be68fa61
No known key found for this signature in database
6 changed files with 128 additions and 76 deletions

View file

@ -351,6 +351,14 @@ allow_profile_lookup_federation_requests = true
# defaults to true # defaults to true
#admin_escape_commands = true #admin_escape_commands = true
# Controls whether admin room notices like account registrations, password changes, account deactivations,
# room directory publications, etc will be sent to the admin room.
#
# Update notices and normal admin command responses will still be sent.
#
# defaults to true
#admin_room_notices = true
### Misc ### Misc

View file

@ -310,21 +310,27 @@ pub(crate) async fn register_route(
if body.appservice_info.is_none() && !is_guest { if body.appservice_info.is_none() && !is_guest {
if !device_display_name.is_empty() { if !device_display_name.is_empty() {
info!("New user \"{user_id}\" registered on this server with device display name: {device_display_name}"); info!("New user \"{user_id}\" registered on this server with device display name: {device_display_name}");
services
.admin if services.globals.config.admin_room_notices {
.send_message(RoomMessageEventContent::notice_plain(format!( services
"New user \"{user_id}\" registered on this server from IP {client} and device display name \ .admin
\"{device_display_name}\"" .send_message(RoomMessageEventContent::notice_plain(format!(
))) "New user \"{user_id}\" registered on this server from IP {client} and device display name \
.await; \"{device_display_name}\""
)))
.await;
}
} else { } else {
info!("New user \"{user_id}\" registered on this server."); info!("New user \"{user_id}\" registered on this server.");
services
.admin if services.globals.config.admin_room_notices {
.send_message(RoomMessageEventContent::notice_plain(format!( services
"New user \"{user_id}\" registered on this server from IP {client}" .admin
))) .send_message(RoomMessageEventContent::notice_plain(format!(
.await; "New user \"{user_id}\" registered on this server from IP {client}"
)))
.await;
}
} }
} }
@ -333,20 +339,26 @@ pub(crate) async fn register_route(
info!("New guest user \"{user_id}\" registered on this server."); info!("New guest user \"{user_id}\" registered on this server.");
if !device_display_name.is_empty() { if !device_display_name.is_empty() {
services if services.globals.config.admin_room_notices {
.admin services
.send_message(RoomMessageEventContent::notice_plain(format!( .admin
"Guest user \"{user_id}\" with device display name \"{device_display_name}\" registered on this \ .send_message(RoomMessageEventContent::notice_plain(format!(
server from IP {client}" "Guest user \"{user_id}\" with device display name \"{device_display_name}\" registered on \
))) this server from IP {client}"
.await; )))
.await;
}
} else { } else {
services #[allow(clippy::collapsible_else_if)]
.admin if services.globals.config.admin_room_notices {
.send_message(RoomMessageEventContent::notice_plain(format!( services
"Guest user \"{user_id}\" with no device display name registered on this server from IP {client}", .admin
))) .send_message(RoomMessageEventContent::notice_plain(format!(
.await; "Guest user \"{user_id}\" with no device display name registered on this server from IP \
{client}",
)))
.await;
}
} }
} }
@ -481,12 +493,15 @@ pub(crate) async fn change_password_route(
} }
info!("User {sender_user} changed their password."); info!("User {sender_user} changed their password.");
services
.admin if services.globals.config.admin_room_notices {
.send_message(RoomMessageEventContent::notice_plain(format!( services
"User {sender_user} changed their password." .admin
))) .send_message(RoomMessageEventContent::notice_plain(format!(
.await; "User {sender_user} changed their password."
)))
.await;
}
Ok(change_password::v3::Response {}) Ok(change_password::v3::Response {})
} }
@ -572,12 +587,15 @@ pub(crate) async fn deactivate_route(
full_user_deactivate(&services, sender_user, all_joined_rooms).await?; full_user_deactivate(&services, sender_user, all_joined_rooms).await?;
info!("User {sender_user} deactivated their account."); info!("User {sender_user} deactivated their account.");
services
.admin if services.globals.config.admin_room_notices {
.send_message(RoomMessageEventContent::notice_plain(format!( services
"User {sender_user} deactivated their account." .admin
))) .send_message(RoomMessageEventContent::notice_plain(format!(
.await; "User {sender_user} deactivated their account."
)))
.await;
}
Ok(deactivate::v3::Response { Ok(deactivate::v3::Response {
id_server_unbind_result: ThirdPartyIdRemovalStatus::NoSupport, id_server_unbind_result: ThirdPartyIdRemovalStatus::NoSupport,

View file

@ -146,14 +146,17 @@ pub(crate) async fn set_room_visibility_route(
\"lockdown_public_room_directory\" is enabled", \"lockdown_public_room_directory\" is enabled",
body.room_id body.room_id
); );
services
.admin if services.globals.config.admin_room_notices {
.send_text(&format!( services
"Non-admin user {sender_user} tried to publish {0} to the room directory while \ .admin
\"lockdown_public_room_directory\" is enabled", .send_text(&format!(
body.room_id "Non-admin user {sender_user} tried to publish {0} to the room directory while \
)) \"lockdown_public_room_directory\" is enabled",
.await; body.room_id
))
.await;
}
return Err(Error::BadRequest( return Err(Error::BadRequest(
ErrorKind::forbidden(), ErrorKind::forbidden(),
@ -162,10 +165,13 @@ pub(crate) async fn set_room_visibility_route(
} }
services.rooms.directory.set_public(&body.room_id)?; services.rooms.directory.set_public(&body.room_id)?;
services
.admin if services.globals.config.admin_room_notices {
.send_text(&format!("{sender_user} made {} public to the room directory", body.room_id)) services
.await; .admin
.send_text(&format!("{sender_user} made {} public to the room directory", body.room_id))
.await;
}
info!("{sender_user} made {0} public to the room directory", body.room_id); info!("{sender_user} made {0} public to the room directory", body.room_id);
}, },
room::Visibility::Private => services.rooms.directory.set_not_public(&body.room_id)?, room::Visibility::Private => services.rooms.directory.set_not_public(&body.room_id)?,

View file

@ -71,13 +71,16 @@ async fn banned_room_check(
if services.globals.config.auto_deactivate_banned_room_attempts { if services.globals.config.auto_deactivate_banned_room_attempts {
warn!("Automatically deactivating user {user_id} due to attempted banned room join"); warn!("Automatically deactivating user {user_id} due to attempted banned room join");
services
.admin if services.globals.config.admin_room_notices {
.send_message(RoomMessageEventContent::text_plain(format!( services
"Automatically deactivating user {user_id} due to attempted banned room join from IP \ .admin
{client_ip}" .send_message(RoomMessageEventContent::text_plain(format!(
))) "Automatically deactivating user {user_id} due to attempted banned room join from IP \
.await; {client_ip}"
)))
.await;
}
let all_joined_rooms: Vec<OwnedRoomId> = services let all_joined_rooms: Vec<OwnedRoomId> = services
.rooms .rooms
@ -108,13 +111,16 @@ async fn banned_room_check(
if services.globals.config.auto_deactivate_banned_room_attempts { if services.globals.config.auto_deactivate_banned_room_attempts {
warn!("Automatically deactivating user {user_id} due to attempted banned room join"); warn!("Automatically deactivating user {user_id} due to attempted banned room join");
services
.admin if services.globals.config.admin_room_notices {
.send_message(RoomMessageEventContent::text_plain(format!( services
"Automatically deactivating user {user_id} due to attempted banned room join from IP \ .admin
{client_ip}" .send_message(RoomMessageEventContent::text_plain(format!(
))) "Automatically deactivating user {user_id} due to attempted banned room join from IP \
.await; {client_ip}"
)))
.await;
}
let all_joined_rooms: Vec<OwnedRoomId> = services let all_joined_rooms: Vec<OwnedRoomId> = services
.rooms .rooms

View file

@ -103,14 +103,17 @@ pub(crate) async fn create_room_route(
\"lockdown_public_room_directory\" is enabled", \"lockdown_public_room_directory\" is enabled",
&room_id &room_id
); );
services
.admin if services.globals.config.admin_room_notices {
.send_text(&format!( services
"Non-admin user {sender_user} tried to publish {0} to the room directory while \ .admin
\"lockdown_public_room_directory\" is enabled", .send_text(&format!(
&room_id "Non-admin user {sender_user} tried to publish {0} to the room directory while \
)) \"lockdown_public_room_directory\" is enabled",
.await; &room_id
))
.await;
}
return Err!(Request(Forbidden("Publishing rooms to the room directory is not allowed"))); return Err!(Request(Forbidden("Publishing rooms to the room directory is not allowed")));
} }
@ -473,10 +476,13 @@ pub(crate) async fn create_room_route(
if body.visibility == room::Visibility::Public { if body.visibility == room::Visibility::Public {
services.rooms.directory.set_public(&room_id)?; services.rooms.directory.set_public(&room_id)?;
services
.admin if services.globals.config.admin_room_notices {
.send_text(&format!("{sender_user} made {} public to the room directory", &room_id)) services
.await; .admin
.send_text(&format!("{sender_user} made {} public to the room directory", &room_id))
.await;
}
info!("{sender_user} made {0} public to the room directory", &room_id); info!("{sender_user} made {0} public to the room directory", &room_id);
} }

View file

@ -377,6 +377,13 @@ pub struct Config {
#[serde(default)] #[serde(default)]
pub test: BTreeSet<String>, pub test: BTreeSet<String>,
/// Controls whether admin room notices like account registrations, password
/// changes, account deactivations, room directory publications, etc will
/// be sent to the admin room. Update notices and normal admin command
/// responses will still be sent.
#[serde(default = "true_fn")]
pub admin_room_notices: bool,
#[serde(flatten)] #[serde(flatten)]
#[allow(clippy::zero_sized_map_values)] // this is a catchall, the map shouldn't be zero at runtime #[allow(clippy::zero_sized_map_values)] // this is a catchall, the map shouldn't be zero at runtime
catchall: BTreeMap<String, IgnoredAny>, catchall: BTreeMap<String, IgnoredAny>,
@ -867,6 +874,7 @@ impl fmt::Display for Config {
.map_or("", |url| url.as_str()), .map_or("", |url| url.as_str()),
); );
line("Enable the tokio-console", &self.tokio_console.to_string()); line("Enable the tokio-console", &self.tokio_console.to_string());
line("Admin room notices", &self.admin_room_notices.to_string());
Ok(()) Ok(())
} }