Allow disabling private messages. Fixes #3640 (#4094)

* Allow disabling private messages. Fixes #3640

* Fix typo.

* Fixing local user check in apub code.

* Removing pointless local check.
This commit is contained in:
Dessalines 2024-11-07 22:16:28 -05:00 committed by GitHub
parent 441b8518fa
commit 39eeb2cbb3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 52 additions and 1 deletions

View file

@ -141,6 +141,7 @@ pub async fn save_user_settings(
post_listing_mode: data.post_listing_mode,
enable_keyboard_navigation: data.enable_keyboard_navigation,
enable_animated_images: data.enable_animated_images,
enable_private_messages: data.enable_private_messages,
collapse_bot_comments: data.collapse_bot_comments,
..Default::default()
};

View file

@ -163,6 +163,9 @@ pub struct SaveUserSettings {
/// should be paused
#[cfg_attr(feature = "full", ts(optional))]
pub enable_animated_images: Option<bool>,
/// Whether a user can send / receive private messages
#[cfg_attr(feature = "full", ts(optional))]
pub enable_private_messages: Option<bool>,
/// Whether to auto-collapse bot comments.
#[cfg_attr(feature = "full", ts(optional))]
pub collapse_bot_comments: Option<bool>,

View file

@ -355,6 +355,16 @@ pub fn check_private_instance(
}
}
/// If private messages are disabled, dont allow them to be sent / received
#[tracing::instrument(skip_all)]
pub fn check_private_messages_enabled(local_user_view: &LocalUserView) -> Result<(), LemmyError> {
if !local_user_view.local_user.enable_private_messages {
Err(LemmyErrorType::CouldntCreatePrivateMessage)?
} else {
Ok(())
}
}
#[tracing::instrument(skip_all)]
pub async fn build_federated_instances(
local_site: &LocalSite,

View file

@ -5,6 +5,7 @@ use lemmy_api_common::{
private_message::{CreatePrivateMessage, PrivateMessageResponse},
send_activity::{ActivityChannel, SendActivityData},
utils::{
check_private_messages_enabled,
get_interface_language,
get_url_blocklist,
local_site_to_slur_regex,
@ -46,6 +47,16 @@ pub async fn create_private_message(
)
.await?;
check_private_messages_enabled(&local_user_view)?;
// Don't allow local sends to people who have private messages disabled
let recipient_local_user_opt = LocalUserView::read_person(&mut context.pool(), data.recipient_id)
.await
.ok();
if let Some(recipient_local_user) = recipient_local_user_opt {
check_private_messages_enabled(&recipient_local_user)?;
}
let private_message_form = PrivateMessageInsertForm::new(
local_user_view.person.id,
data.recipient_id,

View file

@ -16,7 +16,12 @@ use activitypub_federation::{
use chrono::{DateTime, Utc};
use lemmy_api_common::{
context::LemmyContext,
utils::{get_url_blocklist, local_site_opt_to_slur_regex, process_markdown},
utils::{
check_private_messages_enabled,
get_url_blocklist,
local_site_opt_to_slur_regex,
process_markdown,
},
};
use lemmy_db_schema::{
source::{
@ -28,6 +33,7 @@ use lemmy_db_schema::{
traits::Crud,
utils::naive_now,
};
use lemmy_db_views::structs::LocalUserView;
use lemmy_utils::{
error::{FederationError, LemmyError, LemmyErrorType, LemmyResult},
utils::markdown::markdown_to_html,
@ -130,9 +136,16 @@ impl Object for ApubPrivateMessage {
let recipient = note.to[0].dereference(context).await?;
PersonBlock::read(&mut context.pool(), recipient.id, creator.id).await?;
// Check that they can receive private messages
if let Ok(recipient_local_user) =
LocalUserView::read_person(&mut context.pool(), recipient.id).await
{
check_private_messages_enabled(&recipient_local_user)?;
}
let local_site = LocalSite::read(&mut context.pool()).await.ok();
let slur_regex = &local_site_opt_to_slur_regex(&local_site);
let url_blocklist = get_url_blocklist(context).await?;
let content = read_from_string_or_source(&note.content, &None, &note.source);
let content = process_markdown(&content, slur_regex, &url_blocklist, context).await?;
let content = markdown_rewrite_remote_links(content, context).await;

View file

@ -480,6 +480,7 @@ diesel::table! {
totp_2fa_enabled -> Bool,
enable_keyboard_navigation -> Bool,
enable_animated_images -> Bool,
enable_private_messages -> Bool,
collapse_bot_comments -> Bool,
default_comment_sort_type -> CommentSortTypeEnum,
}

View file

@ -63,6 +63,8 @@ pub struct LocalUser {
/// Whether user avatars and inline images in the UI that are gifs should be allowed to play or
/// should be paused
pub enable_animated_images: bool,
/// Whether a user can send / receive private messages
pub enable_private_messages: bool,
/// Whether to auto-collapse bot comments.
pub collapse_bot_comments: bool,
pub default_comment_sort_type: CommentSortType,
@ -117,6 +119,8 @@ pub struct LocalUserInsertForm {
#[new(default)]
pub enable_animated_images: Option<bool>,
#[new(default)]
pub enable_private_messages: Option<bool>,
#[new(default)]
pub collapse_bot_comments: Option<bool>,
#[new(default)]
pub default_comment_sort_type: Option<CommentSortType>,
@ -148,6 +152,7 @@ pub struct LocalUserUpdateForm {
pub totp_2fa_enabled: Option<bool>,
pub enable_keyboard_navigation: Option<bool>,
pub enable_animated_images: Option<bool>,
pub enable_private_messages: Option<bool>,
pub collapse_bot_comments: Option<bool>,
pub default_comment_sort_type: Option<CommentSortType>,
}

View file

@ -240,6 +240,7 @@ mod tests {
totp_2fa_enabled: inserted_sara_local_user.totp_2fa_enabled,
enable_keyboard_navigation: inserted_sara_local_user.enable_keyboard_navigation,
enable_animated_images: inserted_sara_local_user.enable_animated_images,
enable_private_messages: inserted_sara_local_user.enable_private_messages,
collapse_bot_comments: inserted_sara_local_user.collapse_bot_comments,
},
creator: Person {

View file

@ -0,0 +1,3 @@
ALTER TABLE local_user
DROP COLUMN enable_private_messages;

View file

@ -0,0 +1,3 @@
ALTER TABLE local_user
ADD COLUMN enable_private_messages boolean DEFAULT TRUE NOT NULL;