* Send purges to federated instances (fixes #4119) * clippy * review * remove unused function * clippy
This commit is contained in:
parent
e8a52d3a5c
commit
dadf8f28f9
18 changed files with 286 additions and 179 deletions
|
@ -75,12 +75,12 @@ pub async fn like_comment(
|
||||||
}
|
}
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::LikePostOrComment(
|
SendActivityData::LikePostOrComment {
|
||||||
orig_comment.comment.ap_id,
|
object_id: orig_comment.comment.ap_id,
|
||||||
local_user_view.person.clone(),
|
actor: local_user_view.person.clone(),
|
||||||
orig_comment.community,
|
community: orig_comment.community,
|
||||||
data.score,
|
score: data.score,
|
||||||
),
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -66,12 +66,12 @@ pub async fn create_comment_report(
|
||||||
}
|
}
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::CreateReport(
|
SendActivityData::CreateReport {
|
||||||
comment_view.comment.ap_id.inner().clone(),
|
object_id: comment_view.comment.ap_id.inner().clone(),
|
||||||
local_user_view.person,
|
actor: local_user_view.person,
|
||||||
comment_view.community,
|
community: comment_view.community,
|
||||||
data.reason.clone(),
|
reason: data.reason.clone(),
|
||||||
),
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -69,12 +69,12 @@ pub async fn add_mod_to_community(
|
||||||
let moderators = CommunityModeratorView::for_community(&mut context.pool(), community_id).await?;
|
let moderators = CommunityModeratorView::for_community(&mut context.pool(), community_id).await?;
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::AddModToCommunity(
|
SendActivityData::AddModToCommunity {
|
||||||
local_user_view.person,
|
moderator: local_user_view.person,
|
||||||
data.community_id,
|
community_id: data.community_id,
|
||||||
data.person_id,
|
target: data.person_id,
|
||||||
data.added,
|
added: data.added,
|
||||||
),
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -92,12 +92,12 @@ pub async fn ban_from_community(
|
||||||
let person_view = PersonView::read(&mut context.pool(), data.person_id).await?;
|
let person_view = PersonView::read(&mut context.pool(), data.person_id).await?;
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::BanFromCommunity(
|
SendActivityData::BanFromCommunity {
|
||||||
local_user_view.person,
|
moderator: local_user_view.person,
|
||||||
data.community_id,
|
community_id: data.community_id,
|
||||||
person_view.person.clone(),
|
target: person_view.person.clone(),
|
||||||
data.0.clone(),
|
data: data.0.clone(),
|
||||||
),
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -72,11 +72,14 @@ pub async fn ban_from_site(
|
||||||
let person_view = PersonView::read(&mut context.pool(), data.person_id).await?;
|
let person_view = PersonView::read(&mut context.pool(), data.person_id).await?;
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::BanFromSite(
|
SendActivityData::BanFromSite {
|
||||||
local_user_view.person,
|
moderator: local_user_view.person,
|
||||||
person_view.person.clone(),
|
banned_user: person_view.person.clone(),
|
||||||
data.0.clone(),
|
reason: data.reason.clone(),
|
||||||
),
|
remove_data: data.remove_data,
|
||||||
|
ban: data.ban,
|
||||||
|
expires: data.expires,
|
||||||
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -70,12 +70,12 @@ pub async fn like_post(
|
||||||
mark_post_as_read(person_id, post_id, &mut context.pool()).await?;
|
mark_post_as_read(person_id, post_id, &mut context.pool()).await?;
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::LikePostOrComment(
|
SendActivityData::LikePostOrComment {
|
||||||
post.ap_id,
|
object_id: post.ap_id,
|
||||||
local_user_view.person.clone(),
|
actor: local_user_view.person.clone(),
|
||||||
Community::read(&mut context.pool(), post.community_id).await?,
|
community: Community::read(&mut context.pool(), post.community_id).await?,
|
||||||
data.score,
|
score: data.score,
|
||||||
),
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -67,12 +67,12 @@ pub async fn create_post_report(
|
||||||
}
|
}
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::CreateReport(
|
SendActivityData::CreateReport {
|
||||||
post_view.post.ap_id.inner().clone(),
|
object_id: post_view.post.ap_id.inner().clone(),
|
||||||
local_user_view.person,
|
actor: local_user_view.person,
|
||||||
post_view.community,
|
community: post_view.community,
|
||||||
data.reason.clone(),
|
reason: data.reason.clone(),
|
||||||
),
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
use actix_web::web::{Data, Json};
|
use activitypub_federation::config::Data;
|
||||||
|
use actix_web::web::Json;
|
||||||
use lemmy_api_common::{
|
use lemmy_api_common::{
|
||||||
context::LemmyContext,
|
context::LemmyContext,
|
||||||
|
send_activity::{ActivityChannel, SendActivityData},
|
||||||
site::PurgeComment,
|
site::PurgeComment,
|
||||||
utils::is_admin,
|
utils::is_admin,
|
||||||
SuccessResponse,
|
SuccessResponse,
|
||||||
|
@ -12,7 +14,7 @@ use lemmy_db_schema::{
|
||||||
},
|
},
|
||||||
traits::Crud,
|
traits::Crud,
|
||||||
};
|
};
|
||||||
use lemmy_db_views::structs::LocalUserView;
|
use lemmy_db_views::structs::{CommentView, LocalUserView};
|
||||||
use lemmy_utils::error::LemmyError;
|
use lemmy_utils::error::LemmyError;
|
||||||
|
|
||||||
#[tracing::instrument(skip(context))]
|
#[tracing::instrument(skip(context))]
|
||||||
|
@ -26,10 +28,10 @@ pub async fn purge_comment(
|
||||||
|
|
||||||
let comment_id = data.comment_id;
|
let comment_id = data.comment_id;
|
||||||
|
|
||||||
// Read the comment to get the post_id
|
// Read the comment to get the post_id and community
|
||||||
let comment = Comment::read(&mut context.pool(), comment_id).await?;
|
let comment_view = CommentView::read(&mut context.pool(), comment_id, None).await?;
|
||||||
|
|
||||||
let post_id = comment.post_id;
|
let post_id = comment_view.comment.post_id;
|
||||||
|
|
||||||
// TODO read comments for pictrs images and purge them
|
// TODO read comments for pictrs images and purge them
|
||||||
|
|
||||||
|
@ -41,8 +43,18 @@ pub async fn purge_comment(
|
||||||
reason: data.reason.clone(),
|
reason: data.reason.clone(),
|
||||||
post_id,
|
post_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
AdminPurgeComment::create(&mut context.pool(), &form).await?;
|
AdminPurgeComment::create(&mut context.pool(), &form).await?;
|
||||||
|
|
||||||
|
ActivityChannel::submit_activity(
|
||||||
|
SendActivityData::RemoveComment {
|
||||||
|
comment: comment_view.comment,
|
||||||
|
moderator: local_user_view.person.clone(),
|
||||||
|
community: comment_view.community,
|
||||||
|
reason: data.reason.clone(),
|
||||||
|
},
|
||||||
|
&context,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
Ok(Json(SuccessResponse::default()))
|
Ok(Json(SuccessResponse::default()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
use actix_web::web::{Data, Json};
|
use activitypub_federation::config::Data;
|
||||||
|
use actix_web::web::Json;
|
||||||
use lemmy_api_common::{
|
use lemmy_api_common::{
|
||||||
context::LemmyContext,
|
context::LemmyContext,
|
||||||
request::purge_image_from_pictrs,
|
request::purge_image_from_pictrs,
|
||||||
|
send_activity::{ActivityChannel, SendActivityData},
|
||||||
site::PurgeCommunity,
|
site::PurgeCommunity,
|
||||||
utils::{is_admin, purge_image_posts_for_community},
|
utils::{is_admin, purge_image_posts_for_community},
|
||||||
SuccessResponse,
|
SuccessResponse,
|
||||||
|
@ -25,30 +27,38 @@ pub async fn purge_community(
|
||||||
// Only let admin purge an item
|
// Only let admin purge an item
|
||||||
is_admin(&local_user_view)?;
|
is_admin(&local_user_view)?;
|
||||||
|
|
||||||
let community_id = data.community_id;
|
|
||||||
|
|
||||||
// Read the community to get its images
|
// Read the community to get its images
|
||||||
let community = Community::read(&mut context.pool(), community_id).await?;
|
let community = Community::read(&mut context.pool(), data.community_id).await?;
|
||||||
|
|
||||||
if let Some(banner) = community.banner {
|
if let Some(banner) = &community.banner {
|
||||||
purge_image_from_pictrs(&banner, &context).await.ok();
|
purge_image_from_pictrs(banner, &context).await.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(icon) = community.icon {
|
if let Some(icon) = &community.icon {
|
||||||
purge_image_from_pictrs(&icon, &context).await.ok();
|
purge_image_from_pictrs(icon, &context).await.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
purge_image_posts_for_community(community_id, &context).await?;
|
purge_image_posts_for_community(data.community_id, &context).await?;
|
||||||
|
|
||||||
Community::delete(&mut context.pool(), community_id).await?;
|
Community::delete(&mut context.pool(), data.community_id).await?;
|
||||||
|
|
||||||
// Mod tables
|
// Mod tables
|
||||||
let form = AdminPurgeCommunityForm {
|
let form = AdminPurgeCommunityForm {
|
||||||
admin_person_id: local_user_view.person.id,
|
admin_person_id: local_user_view.person.id,
|
||||||
reason: data.reason.clone(),
|
reason: data.reason.clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
AdminPurgeCommunity::create(&mut context.pool(), &form).await?;
|
AdminPurgeCommunity::create(&mut context.pool(), &form).await?;
|
||||||
|
|
||||||
|
ActivityChannel::submit_activity(
|
||||||
|
SendActivityData::RemoveCommunity {
|
||||||
|
moderator: local_user_view.person.clone(),
|
||||||
|
community,
|
||||||
|
reason: data.reason.clone(),
|
||||||
|
removed: true,
|
||||||
|
},
|
||||||
|
&context,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
Ok(Json(SuccessResponse::default()))
|
Ok(Json(SuccessResponse::default()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
use actix_web::web::{Data, Json};
|
use activitypub_federation::config::Data;
|
||||||
|
use actix_web::web::Json;
|
||||||
use lemmy_api_common::{
|
use lemmy_api_common::{
|
||||||
context::LemmyContext,
|
context::LemmyContext,
|
||||||
request::delete_image_from_pictrs,
|
request::delete_image_from_pictrs,
|
||||||
|
send_activity::{ActivityChannel, SendActivityData},
|
||||||
site::PurgePerson,
|
site::PurgePerson,
|
||||||
utils::is_admin,
|
utils::is_admin,
|
||||||
SuccessResponse,
|
SuccessResponse,
|
||||||
|
@ -27,9 +29,7 @@ pub async fn purge_person(
|
||||||
is_admin(&local_user_view)?;
|
is_admin(&local_user_view)?;
|
||||||
|
|
||||||
// Read the person to get their images
|
// Read the person to get their images
|
||||||
let person_id = data.person_id;
|
if let Ok(local_user) = LocalUserView::read_person(&mut context.pool(), data.person_id).await {
|
||||||
|
|
||||||
if let Ok(local_user) = LocalUserView::read_person(&mut context.pool(), person_id).await {
|
|
||||||
let pictrs_uploads =
|
let pictrs_uploads =
|
||||||
LocalImage::get_all_by_local_user_id(&mut context.pool(), &local_user.local_user.id).await?;
|
LocalImage::get_all_by_local_user_id(&mut context.pool(), &local_user.local_user.id).await?;
|
||||||
|
|
||||||
|
@ -41,11 +41,11 @@ pub async fn purge_person(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear profile data.
|
// Clear profile data.
|
||||||
Person::delete_account(&mut context.pool(), person_id).await?;
|
Person::delete_account(&mut context.pool(), data.person_id).await?;
|
||||||
// Keep person record, but mark as banned to prevent login or refetching from home instance.
|
// Keep person record, but mark as banned to prevent login or refetching from home instance.
|
||||||
Person::update(
|
let person = Person::update(
|
||||||
&mut context.pool(),
|
&mut context.pool(),
|
||||||
person_id,
|
data.person_id,
|
||||||
&PersonUpdateForm {
|
&PersonUpdateForm {
|
||||||
banned: Some(true),
|
banned: Some(true),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
@ -58,8 +58,20 @@ pub async fn purge_person(
|
||||||
admin_person_id: local_user_view.person.id,
|
admin_person_id: local_user_view.person.id,
|
||||||
reason: data.reason.clone(),
|
reason: data.reason.clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
AdminPurgePerson::create(&mut context.pool(), &form).await?;
|
AdminPurgePerson::create(&mut context.pool(), &form).await?;
|
||||||
|
|
||||||
|
ActivityChannel::submit_activity(
|
||||||
|
SendActivityData::BanFromSite {
|
||||||
|
moderator: local_user_view.person,
|
||||||
|
banned_user: person,
|
||||||
|
reason: data.reason.clone(),
|
||||||
|
remove_data: Some(true),
|
||||||
|
ban: true,
|
||||||
|
expires: None,
|
||||||
|
},
|
||||||
|
&context,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
Ok(Json(SuccessResponse::default()))
|
Ok(Json(SuccessResponse::default()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
use actix_web::web::{Data, Json};
|
use activitypub_federation::config::Data;
|
||||||
|
use actix_web::web::Json;
|
||||||
use lemmy_api_common::{
|
use lemmy_api_common::{
|
||||||
context::LemmyContext,
|
context::LemmyContext,
|
||||||
request::purge_image_from_pictrs,
|
request::purge_image_from_pictrs,
|
||||||
|
send_activity::{ActivityChannel, SendActivityData},
|
||||||
site::PurgePost,
|
site::PurgePost,
|
||||||
utils::is_admin,
|
utils::is_admin,
|
||||||
SuccessResponse,
|
SuccessResponse,
|
||||||
|
@ -25,32 +27,38 @@ pub async fn purge_post(
|
||||||
// Only let admin purge an item
|
// Only let admin purge an item
|
||||||
is_admin(&local_user_view)?;
|
is_admin(&local_user_view)?;
|
||||||
|
|
||||||
let post_id = data.post_id;
|
|
||||||
|
|
||||||
// Read the post to get the community_id
|
// Read the post to get the community_id
|
||||||
let post = Post::read(&mut context.pool(), post_id).await?;
|
let post = Post::read(&mut context.pool(), data.post_id).await?;
|
||||||
|
|
||||||
// Purge image
|
// Purge image
|
||||||
if let Some(url) = post.url {
|
if let Some(url) = &post.url {
|
||||||
purge_image_from_pictrs(&url, &context).await.ok();
|
purge_image_from_pictrs(url, &context).await.ok();
|
||||||
}
|
}
|
||||||
// Purge thumbnail
|
// Purge thumbnail
|
||||||
if let Some(thumbnail_url) = post.thumbnail_url {
|
if let Some(thumbnail_url) = &post.thumbnail_url {
|
||||||
purge_image_from_pictrs(&thumbnail_url, &context).await.ok();
|
purge_image_from_pictrs(thumbnail_url, &context).await.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
let community_id = post.community_id;
|
Post::delete(&mut context.pool(), data.post_id).await?;
|
||||||
|
|
||||||
Post::delete(&mut context.pool(), post_id).await?;
|
|
||||||
|
|
||||||
// Mod tables
|
// Mod tables
|
||||||
let form = AdminPurgePostForm {
|
let form = AdminPurgePostForm {
|
||||||
admin_person_id: local_user_view.person.id,
|
admin_person_id: local_user_view.person.id,
|
||||||
reason: data.reason.clone(),
|
reason: data.reason.clone(),
|
||||||
community_id,
|
community_id: post.community_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
AdminPurgePost::create(&mut context.pool(), &form).await?;
|
AdminPurgePost::create(&mut context.pool(), &form).await?;
|
||||||
|
|
||||||
|
ActivityChannel::submit_activity(
|
||||||
|
SendActivityData::RemovePost {
|
||||||
|
post,
|
||||||
|
moderator: local_user_view.person.clone(),
|
||||||
|
reason: data.reason.clone(),
|
||||||
|
removed: true,
|
||||||
|
},
|
||||||
|
&context,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
Ok(Json(SuccessResponse::default()))
|
Ok(Json(SuccessResponse::default()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,4 @@
|
||||||
use crate::{
|
use crate::{community::BanFromCommunity, context::LemmyContext, post::DeletePost};
|
||||||
community::BanFromCommunity,
|
|
||||||
context::LemmyContext,
|
|
||||||
person::BanPerson,
|
|
||||||
post::{DeletePost, RemovePost},
|
|
||||||
};
|
|
||||||
use activitypub_federation::config::Data;
|
use activitypub_federation::config::Data;
|
||||||
use futures::future::BoxFuture;
|
use futures::future::BoxFuture;
|
||||||
use lemmy_db_schema::{
|
use lemmy_db_schema::{
|
||||||
|
@ -40,26 +35,68 @@ pub enum SendActivityData {
|
||||||
CreatePost(Post),
|
CreatePost(Post),
|
||||||
UpdatePost(Post),
|
UpdatePost(Post),
|
||||||
DeletePost(Post, Person, DeletePost),
|
DeletePost(Post, Person, DeletePost),
|
||||||
RemovePost(Post, Person, RemovePost),
|
RemovePost {
|
||||||
|
post: Post,
|
||||||
|
moderator: Person,
|
||||||
|
reason: Option<String>,
|
||||||
|
removed: bool,
|
||||||
|
},
|
||||||
LockPost(Post, Person, bool),
|
LockPost(Post, Person, bool),
|
||||||
FeaturePost(Post, Person, bool),
|
FeaturePost(Post, Person, bool),
|
||||||
CreateComment(Comment),
|
CreateComment(Comment),
|
||||||
UpdateComment(Comment),
|
UpdateComment(Comment),
|
||||||
DeleteComment(Comment, Person, Community),
|
DeleteComment(Comment, Person, Community),
|
||||||
RemoveComment(Comment, Person, Community, Option<String>),
|
RemoveComment {
|
||||||
LikePostOrComment(DbUrl, Person, Community, i16),
|
comment: Comment,
|
||||||
|
moderator: Person,
|
||||||
|
community: Community,
|
||||||
|
reason: Option<String>,
|
||||||
|
},
|
||||||
|
LikePostOrComment {
|
||||||
|
object_id: DbUrl,
|
||||||
|
actor: Person,
|
||||||
|
community: Community,
|
||||||
|
score: i16,
|
||||||
|
},
|
||||||
FollowCommunity(Community, Person, bool),
|
FollowCommunity(Community, Person, bool),
|
||||||
UpdateCommunity(Person, Community),
|
UpdateCommunity(Person, Community),
|
||||||
DeleteCommunity(Person, Community, bool),
|
DeleteCommunity(Person, Community, bool),
|
||||||
RemoveCommunity(Person, Community, Option<String>, bool),
|
RemoveCommunity {
|
||||||
AddModToCommunity(Person, CommunityId, PersonId, bool),
|
moderator: Person,
|
||||||
BanFromCommunity(Person, CommunityId, Person, BanFromCommunity),
|
community: Community,
|
||||||
BanFromSite(Person, Person, BanPerson),
|
reason: Option<String>,
|
||||||
|
removed: bool,
|
||||||
|
},
|
||||||
|
AddModToCommunity {
|
||||||
|
moderator: Person,
|
||||||
|
community_id: CommunityId,
|
||||||
|
target: PersonId,
|
||||||
|
added: bool,
|
||||||
|
},
|
||||||
|
BanFromCommunity {
|
||||||
|
moderator: Person,
|
||||||
|
community_id: CommunityId,
|
||||||
|
target: Person,
|
||||||
|
data: BanFromCommunity,
|
||||||
|
},
|
||||||
|
BanFromSite {
|
||||||
|
moderator: Person,
|
||||||
|
banned_user: Person,
|
||||||
|
reason: Option<String>,
|
||||||
|
remove_data: Option<bool>,
|
||||||
|
ban: bool,
|
||||||
|
expires: Option<i64>,
|
||||||
|
},
|
||||||
CreatePrivateMessage(PrivateMessageView),
|
CreatePrivateMessage(PrivateMessageView),
|
||||||
UpdatePrivateMessage(PrivateMessageView),
|
UpdatePrivateMessage(PrivateMessageView),
|
||||||
DeletePrivateMessage(Person, PrivateMessage, bool),
|
DeletePrivateMessage(Person, PrivateMessage, bool),
|
||||||
DeleteUser(Person, bool),
|
DeleteUser(Person, bool),
|
||||||
CreateReport(Url, Person, Community, String),
|
CreateReport {
|
||||||
|
object_id: Url,
|
||||||
|
actor: Person,
|
||||||
|
community: Community,
|
||||||
|
reason: String,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: instead of static, move this into LemmyContext. make sure that stopping the process with
|
// TODO: instead of static, move this into LemmyContext. make sure that stopping the process with
|
||||||
|
|
|
@ -71,12 +71,12 @@ pub async fn remove_comment(
|
||||||
let updated_comment_id = updated_comment.id;
|
let updated_comment_id = updated_comment.id;
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::RemoveComment(
|
SendActivityData::RemoveComment {
|
||||||
updated_comment,
|
comment: updated_comment,
|
||||||
local_user_view.person.clone(),
|
moderator: local_user_view.person.clone(),
|
||||||
orig_comment.community,
|
community: orig_comment.community,
|
||||||
data.reason.clone(),
|
reason: data.reason.clone(),
|
||||||
),
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -58,12 +58,12 @@ pub async fn remove_community(
|
||||||
ModRemoveCommunity::create(&mut context.pool(), &form).await?;
|
ModRemoveCommunity::create(&mut context.pool(), &form).await?;
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::RemoveCommunity(
|
SendActivityData::RemoveCommunity {
|
||||||
local_user_view.person.clone(),
|
moderator: local_user_view.person.clone(),
|
||||||
community,
|
community,
|
||||||
data.reason.clone(),
|
reason: data.reason.clone(),
|
||||||
data.removed,
|
removed: data.removed,
|
||||||
),
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -57,7 +57,12 @@ pub async fn remove_post(
|
||||||
ModRemovePost::create(&mut context.pool(), &form).await?;
|
ModRemovePost::create(&mut context.pool(), &form).await?;
|
||||||
|
|
||||||
ActivityChannel::submit_activity(
|
ActivityChannel::submit_activity(
|
||||||
SendActivityData::RemovePost(post, local_user_view.person.clone(), data.0),
|
SendActivityData::RemovePost {
|
||||||
|
post,
|
||||||
|
moderator: local_user_view.person.clone(),
|
||||||
|
reason: data.reason.clone(),
|
||||||
|
removed: data.removed,
|
||||||
|
},
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
|
@ -14,7 +14,6 @@ use chrono::{DateTime, Utc};
|
||||||
use lemmy_api_common::{
|
use lemmy_api_common::{
|
||||||
community::BanFromCommunity,
|
community::BanFromCommunity,
|
||||||
context::LemmyContext,
|
context::LemmyContext,
|
||||||
person::BanPerson,
|
|
||||||
utils::check_expire_time,
|
utils::check_expire_time,
|
||||||
};
|
};
|
||||||
use lemmy_db_schema::{
|
use lemmy_db_schema::{
|
||||||
|
@ -133,23 +132,26 @@ async fn generate_cc(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn send_ban_from_site(
|
pub(crate) async fn send_ban_from_site(
|
||||||
mod_: Person,
|
moderator: Person,
|
||||||
banned_user: Person,
|
banned_user: Person,
|
||||||
data: BanPerson,
|
reason: Option<String>,
|
||||||
|
remove_data: Option<bool>,
|
||||||
|
ban: bool,
|
||||||
|
expires: Option<i64>,
|
||||||
context: Data<LemmyContext>,
|
context: Data<LemmyContext>,
|
||||||
) -> Result<(), LemmyError> {
|
) -> Result<(), LemmyError> {
|
||||||
let site = SiteOrCommunity::Site(SiteView::read_local(&mut context.pool()).await?.site.into());
|
let site = SiteOrCommunity::Site(SiteView::read_local(&mut context.pool()).await?.site.into());
|
||||||
let expires = check_expire_time(data.expires)?;
|
let expires = check_expire_time(expires)?;
|
||||||
|
|
||||||
// if the action affects a local user, federate to other instances
|
// if the action affects a local user, federate to other instances
|
||||||
if banned_user.local {
|
if banned_user.local {
|
||||||
if data.ban {
|
if ban {
|
||||||
BlockUser::send(
|
BlockUser::send(
|
||||||
&site,
|
&site,
|
||||||
&banned_user.into(),
|
&banned_user.into(),
|
||||||
&mod_.into(),
|
&moderator.into(),
|
||||||
data.remove_data.unwrap_or(false),
|
remove_data.unwrap_or(false),
|
||||||
data.reason.clone(),
|
reason.clone(),
|
||||||
expires,
|
expires,
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
|
@ -158,8 +160,8 @@ pub(crate) async fn send_ban_from_site(
|
||||||
UndoBlockUser::send(
|
UndoBlockUser::send(
|
||||||
&site,
|
&site,
|
||||||
&banned_user.into(),
|
&banned_user.into(),
|
||||||
&mod_.into(),
|
&moderator.into(),
|
||||||
data.reason.clone(),
|
reason.clone(),
|
||||||
&context,
|
&context,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|
|
@ -29,7 +29,6 @@ use activitypub_federation::{
|
||||||
};
|
};
|
||||||
use lemmy_api_common::{context::LemmyContext, utils::purge_user_account};
|
use lemmy_api_common::{context::LemmyContext, utils::purge_user_account};
|
||||||
use lemmy_db_schema::{
|
use lemmy_db_schema::{
|
||||||
newtypes::CommunityId,
|
|
||||||
source::{
|
source::{
|
||||||
activity::ActivitySendTargets,
|
activity::ActivitySendTargets,
|
||||||
comment::{Comment, CommentUpdateForm},
|
comment::{Comment, CommentUpdateForm},
|
||||||
|
@ -78,38 +77,6 @@ pub(crate) async fn send_apub_delete_in_community(
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parameter `reason` being set indicates that this is a removal by a mod. If its unset, this
|
|
||||||
/// action was done by a normal user.
|
|
||||||
#[tracing::instrument(skip_all)]
|
|
||||||
pub(crate) async fn send_apub_delete_in_community_new(
|
|
||||||
actor: Person,
|
|
||||||
community_id: CommunityId,
|
|
||||||
object: DeletableObjects,
|
|
||||||
reason: Option<String>,
|
|
||||||
deleted: bool,
|
|
||||||
context: Data<LemmyContext>,
|
|
||||||
) -> Result<(), LemmyError> {
|
|
||||||
let community = Community::read(&mut context.pool(), community_id).await?;
|
|
||||||
let actor = ApubPerson::from(actor);
|
|
||||||
let is_mod_action = reason.is_some();
|
|
||||||
let activity = if deleted {
|
|
||||||
let delete = Delete::new(&actor, object, public(), Some(&community), reason, &context)?;
|
|
||||||
AnnouncableActivities::Delete(delete)
|
|
||||||
} else {
|
|
||||||
let undo = UndoDelete::new(&actor, object, public(), Some(&community), reason, &context)?;
|
|
||||||
AnnouncableActivities::UndoDelete(undo)
|
|
||||||
};
|
|
||||||
send_activity_in_community(
|
|
||||||
activity,
|
|
||||||
&actor,
|
|
||||||
&community.into(),
|
|
||||||
ActivitySendTargets::empty(),
|
|
||||||
is_mod_action,
|
|
||||||
&context,
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tracing::instrument(skip_all)]
|
#[tracing::instrument(skip_all)]
|
||||||
pub(crate) async fn send_apub_delete_private_message(
|
pub(crate) async fn send_apub_delete_private_message(
|
||||||
actor: &ApubPerson,
|
actor: &ApubPerson,
|
||||||
|
|
|
@ -10,7 +10,6 @@ use crate::{
|
||||||
create_or_update::private_message::send_create_or_update_pm,
|
create_or_update::private_message::send_create_or_update_pm,
|
||||||
deletion::{
|
deletion::{
|
||||||
send_apub_delete_in_community,
|
send_apub_delete_in_community,
|
||||||
send_apub_delete_in_community_new,
|
|
||||||
send_apub_delete_private_message,
|
send_apub_delete_private_message,
|
||||||
send_apub_delete_user,
|
send_apub_delete_user,
|
||||||
DeletableObjects,
|
DeletableObjects,
|
||||||
|
@ -35,9 +34,12 @@ use lemmy_api_common::{
|
||||||
context::LemmyContext,
|
context::LemmyContext,
|
||||||
send_activity::{ActivityChannel, SendActivityData},
|
send_activity::{ActivityChannel, SendActivityData},
|
||||||
};
|
};
|
||||||
use lemmy_db_schema::source::{
|
use lemmy_db_schema::{
|
||||||
activity::{ActivitySendTargets, ActorType, SentActivity, SentActivityForm},
|
source::{
|
||||||
community::Community,
|
activity::{ActivitySendTargets, ActorType, SentActivity, SentActivityForm},
|
||||||
|
community::Community,
|
||||||
|
},
|
||||||
|
traits::Crud,
|
||||||
};
|
};
|
||||||
use lemmy_db_views_actor::structs::{CommunityPersonBanView, CommunityView};
|
use lemmy_db_views_actor::structs::{CommunityPersonBanView, CommunityView};
|
||||||
use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType, LemmyResult};
|
use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType, LemmyResult};
|
||||||
|
@ -246,24 +248,31 @@ pub async fn match_outgoing_activities(
|
||||||
CreateOrUpdatePage::send(post, creator_id, CreateOrUpdateType::Update, context).await
|
CreateOrUpdatePage::send(post, creator_id, CreateOrUpdateType::Update, context).await
|
||||||
}
|
}
|
||||||
DeletePost(post, person, data) => {
|
DeletePost(post, person, data) => {
|
||||||
send_apub_delete_in_community_new(
|
let community = Community::read(&mut context.pool(), post.community_id).await?;
|
||||||
|
send_apub_delete_in_community(
|
||||||
person,
|
person,
|
||||||
post.community_id,
|
community,
|
||||||
DeletableObjects::Post(post.into()),
|
DeletableObjects::Post(post.into()),
|
||||||
None,
|
None,
|
||||||
data.deleted,
|
data.deleted,
|
||||||
context,
|
&context,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
RemovePost(post, person, data) => {
|
RemovePost {
|
||||||
send_apub_delete_in_community_new(
|
post,
|
||||||
person,
|
moderator,
|
||||||
post.community_id,
|
reason,
|
||||||
|
removed,
|
||||||
|
} => {
|
||||||
|
let community = Community::read(&mut context.pool(), post.community_id).await?;
|
||||||
|
send_apub_delete_in_community(
|
||||||
|
moderator,
|
||||||
|
community,
|
||||||
DeletableObjects::Post(post.into()),
|
DeletableObjects::Post(post.into()),
|
||||||
data.reason.or_else(|| Some(String::new())),
|
reason.or_else(|| Some(String::new())),
|
||||||
data.removed,
|
removed,
|
||||||
context,
|
&context,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
@ -282,15 +291,25 @@ pub async fn match_outgoing_activities(
|
||||||
let deletable = DeletableObjects::Comment(comment.into());
|
let deletable = DeletableObjects::Comment(comment.into());
|
||||||
send_apub_delete_in_community(actor, community, deletable, None, is_deleted, &context).await
|
send_apub_delete_in_community(actor, community, deletable, None, is_deleted, &context).await
|
||||||
}
|
}
|
||||||
RemoveComment(comment, actor, community, reason) => {
|
RemoveComment {
|
||||||
|
comment,
|
||||||
|
moderator,
|
||||||
|
community,
|
||||||
|
reason,
|
||||||
|
} => {
|
||||||
let is_removed = comment.removed;
|
let is_removed = comment.removed;
|
||||||
let deletable = DeletableObjects::Comment(comment.into());
|
let deletable = DeletableObjects::Comment(comment.into());
|
||||||
send_apub_delete_in_community(actor, community, deletable, reason, is_removed, &context)
|
send_apub_delete_in_community(
|
||||||
.await
|
moderator, community, deletable, reason, is_removed, &context,
|
||||||
}
|
)
|
||||||
LikePostOrComment(object_id, person, community, score) => {
|
.await
|
||||||
send_like_activity(object_id, person, community, score, context).await
|
|
||||||
}
|
}
|
||||||
|
LikePostOrComment {
|
||||||
|
object_id,
|
||||||
|
actor,
|
||||||
|
community,
|
||||||
|
score,
|
||||||
|
} => send_like_activity(object_id, actor, community, score, context).await,
|
||||||
FollowCommunity(community, person, follow) => {
|
FollowCommunity(community, person, follow) => {
|
||||||
send_follow_community(community, person, follow, &context).await
|
send_follow_community(community, person, follow, &context).await
|
||||||
}
|
}
|
||||||
|
@ -299,10 +318,15 @@ pub async fn match_outgoing_activities(
|
||||||
let deletable = DeletableObjects::Community(community.clone().into());
|
let deletable = DeletableObjects::Community(community.clone().into());
|
||||||
send_apub_delete_in_community(actor, community, deletable, None, removed, &context).await
|
send_apub_delete_in_community(actor, community, deletable, None, removed, &context).await
|
||||||
}
|
}
|
||||||
RemoveCommunity(actor, community, reason, removed) => {
|
RemoveCommunity {
|
||||||
|
moderator,
|
||||||
|
community,
|
||||||
|
reason,
|
||||||
|
removed,
|
||||||
|
} => {
|
||||||
let deletable = DeletableObjects::Community(community.clone().into());
|
let deletable = DeletableObjects::Community(community.clone().into());
|
||||||
send_apub_delete_in_community(
|
send_apub_delete_in_community(
|
||||||
actor,
|
moderator,
|
||||||
community,
|
community,
|
||||||
deletable,
|
deletable,
|
||||||
reason.clone().or_else(|| Some(String::new())),
|
reason.clone().or_else(|| Some(String::new())),
|
||||||
|
@ -311,13 +335,37 @@ pub async fn match_outgoing_activities(
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
AddModToCommunity(actor, community_id, updated_mod_id, added) => {
|
AddModToCommunity {
|
||||||
send_add_mod_to_community(actor, community_id, updated_mod_id, added, context).await
|
moderator,
|
||||||
|
community_id,
|
||||||
|
target,
|
||||||
|
added,
|
||||||
|
} => send_add_mod_to_community(moderator, community_id, target, added, context).await,
|
||||||
|
BanFromCommunity {
|
||||||
|
moderator,
|
||||||
|
community_id,
|
||||||
|
target,
|
||||||
|
data,
|
||||||
|
} => send_ban_from_community(moderator, community_id, target, data, context).await,
|
||||||
|
BanFromSite {
|
||||||
|
moderator,
|
||||||
|
banned_user,
|
||||||
|
reason,
|
||||||
|
remove_data,
|
||||||
|
ban,
|
||||||
|
expires,
|
||||||
|
} => {
|
||||||
|
send_ban_from_site(
|
||||||
|
moderator,
|
||||||
|
banned_user,
|
||||||
|
reason,
|
||||||
|
remove_data,
|
||||||
|
ban,
|
||||||
|
expires,
|
||||||
|
context,
|
||||||
|
)
|
||||||
|
.await
|
||||||
}
|
}
|
||||||
BanFromCommunity(mod_, community_id, target, data) => {
|
|
||||||
send_ban_from_community(mod_, community_id, target, data, context).await
|
|
||||||
}
|
|
||||||
BanFromSite(mod_, target, data) => send_ban_from_site(mod_, target, data, context).await,
|
|
||||||
CreatePrivateMessage(pm) => {
|
CreatePrivateMessage(pm) => {
|
||||||
send_create_or_update_pm(pm, CreateOrUpdateType::Create, context).await
|
send_create_or_update_pm(pm, CreateOrUpdateType::Create, context).await
|
||||||
}
|
}
|
||||||
|
@ -328,9 +376,12 @@ pub async fn match_outgoing_activities(
|
||||||
send_apub_delete_private_message(&person.into(), pm, deleted, context).await
|
send_apub_delete_private_message(&person.into(), pm, deleted, context).await
|
||||||
}
|
}
|
||||||
DeleteUser(person, remove_data) => send_apub_delete_user(person, remove_data, context).await,
|
DeleteUser(person, remove_data) => send_apub_delete_user(person, remove_data, context).await,
|
||||||
CreateReport(url, actor, community, reason) => {
|
CreateReport {
|
||||||
Report::send(ObjectId::from(url), actor, community, reason, context).await
|
object_id,
|
||||||
}
|
actor,
|
||||||
|
community,
|
||||||
|
reason,
|
||||||
|
} => Report::send(ObjectId::from(object_id), actor, community, reason, context).await,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
fed_task.await?;
|
fed_task.await?;
|
||||||
|
|
Loading…
Reference in a new issue