From f9d563d80ab2f773cf9dc23c1ef6983dd3935370 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Thu, 7 Apr 2022 20:44:28 +0000 Subject: [PATCH] Add missing mod log entries for federated actions (fixes #1489) (#2198) --- .../apub/src/activities/block/block_user.rs | 10 ++- .../src/activities/block/undo_block_user.rs | 10 ++- .../apub/src/activities/community/add_mod.rs | 23 ++++++- .../src/activities/community/remove_mod.rs | 24 ++++++- crates/apub/src/activities/deletion/delete.rs | 12 ++-- .../src/activities/deletion/undo_delete.rs | 62 ++++++++++++++++++- crates/apub/src/objects/post.rs | 2 + 7 files changed, 123 insertions(+), 20 deletions(-) diff --git a/crates/apub/src/activities/block/block_user.rs b/crates/apub/src/activities/block/block_user.rs index 28104dba1..d21c038be 100644 --- a/crates/apub/src/activities/block/block_user.rs +++ b/crates/apub/src/activities/block/block_user.rs @@ -31,7 +31,7 @@ use lemmy_db_schema::{ CommunityPersonBan, CommunityPersonBanForm, }, - moderator::{ModBan, ModBanForm}, + moderator::{ModBan, ModBanForm, ModBanFromCommunity, ModBanFromCommunityForm}, person::Person, }, traits::{Bannable, Crud, Followable}, @@ -213,14 +213,18 @@ impl ActivityHandler for BlockUser { } // write to mod log - let form = ModBanForm { + let form = ModBanFromCommunityForm { mod_person_id: mod_person.id, other_person_id: blocked_person.id, + community_id: community.id, reason: self.summary, banned: Some(true), expires, }; - blocking(context.pool(), move |conn| ModBan::create(conn, &form)).await??; + blocking(context.pool(), move |conn| { + ModBanFromCommunity::create(conn, &form) + }) + .await??; } } diff --git a/crates/apub/src/activities/block/undo_block_user.rs b/crates/apub/src/activities/block/undo_block_user.rs index 014b01fd8..29c9cd10e 100644 --- a/crates/apub/src/activities/block/undo_block_user.rs +++ b/crates/apub/src/activities/block/undo_block_user.rs @@ -22,7 +22,7 @@ use lemmy_apub_lib::{ use lemmy_db_schema::{ source::{ community::{CommunityPersonBan, CommunityPersonBanForm}, - moderator::{ModBan, ModBanForm}, + moderator::{ModBan, ModBanForm, ModBanFromCommunity, ModBanFromCommunityForm}, person::Person, }, traits::{Bannable, Crud}, @@ -136,14 +136,18 @@ impl ActivityHandler for UndoBlockUser { .await??; // write to mod log - let form = ModBanForm { + let form = ModBanFromCommunityForm { mod_person_id: mod_person.id, other_person_id: blocked_person.id, + community_id: community.id, reason: self.object.summary, banned: Some(false), expires, }; - blocking(context.pool(), move |conn| ModBan::create(conn, &form)).await??; + blocking(context.pool(), move |conn| { + ModBanFromCommunity::create(conn, &form) + }) + .await??; } } diff --git a/crates/apub/src/activities/community/add_mod.rs b/crates/apub/src/activities/community/add_mod.rs index 10baa781c..a86c8ac31 100644 --- a/crates/apub/src/activities/community/add_mod.rs +++ b/crates/apub/src/activities/community/add_mod.rs @@ -25,8 +25,11 @@ use lemmy_apub_lib::{ traits::{ActivityHandler, ActorType}, }; use lemmy_db_schema::{ - source::community::{CommunityModerator, CommunityModeratorForm}, - traits::Joinable, + source::{ + community::{CommunityModerator, CommunityModeratorForm}, + moderator::{ModAddCommunity, ModAddCommunityForm}, + }, + traits::{Crud, Joinable}, }; use lemmy_utils::LemmyError; use lemmy_websocket::LemmyContext; @@ -114,6 +117,22 @@ impl ActivityHandler for AddMod { CommunityModerator::join(conn, &form) }) .await??; + + // write mod log + let actor = self + .actor + .dereference(context, context.client(), request_counter) + .await?; + let form = ModAddCommunityForm { + mod_person_id: actor.id, + other_person_id: new_mod.id, + community_id: community.id, + removed: Some(false), + }; + blocking(context.pool(), move |conn| { + ModAddCommunity::create(conn, &form) + }) + .await??; } // TODO: send websocket notification about added mod Ok(()) diff --git a/crates/apub/src/activities/community/remove_mod.rs b/crates/apub/src/activities/community/remove_mod.rs index e404df04d..7e43fcbf7 100644 --- a/crates/apub/src/activities/community/remove_mod.rs +++ b/crates/apub/src/activities/community/remove_mod.rs @@ -25,8 +25,11 @@ use lemmy_apub_lib::{ traits::{ActivityHandler, ActorType}, }; use lemmy_db_schema::{ - source::community::{CommunityModerator, CommunityModeratorForm}, - traits::Joinable, + source::{ + community::{CommunityModerator, CommunityModeratorForm}, + moderator::{ModAddCommunity, ModAddCommunityForm}, + }, + traits::{Crud, Joinable}, }; use lemmy_utils::LemmyError; use lemmy_websocket::LemmyContext; @@ -106,6 +109,23 @@ impl ActivityHandler for RemoveMod { CommunityModerator::leave(conn, &form) }) .await??; + + // write mod log + let actor = self + .actor + .dereference(context, context.client(), request_counter) + .await?; + let form = ModAddCommunityForm { + mod_person_id: actor.id, + other_person_id: remove_mod.id, + community_id: community.id, + removed: Some(true), + }; + blocking(context.pool(), move |conn| { + ModAddCommunity::create(conn, &form) + }) + .await??; + // TODO: send websocket notification about removed mod Ok(()) } diff --git a/crates/apub/src/activities/deletion/delete.rs b/crates/apub/src/activities/deletion/delete.rs index 3bb4b5bc8..275683a37 100644 --- a/crates/apub/src/activities/deletion/delete.rs +++ b/crates/apub/src/activities/deletion/delete.rs @@ -67,11 +67,13 @@ impl ActivityHandler for Delete { Some(reason) }; receive_remove_action( - &self.actor, + &self + .actor + .dereference(context, context.client(), request_counter) + .await?, self.object.id(), reason, context, - request_counter, ) .await } else { @@ -119,15 +121,11 @@ impl Delete { #[tracing::instrument(skip_all)] pub(in crate::activities) async fn receive_remove_action( - actor: &ObjectId, + actor: &ApubPerson, object: &Url, reason: Option, context: &LemmyContext, - request_counter: &mut i32, ) -> Result<(), LemmyError> { - let actor = actor - .dereference(context, context.client(), request_counter) - .await?; use UserOperationCrud::*; match DeletableObjects::read_from_db(object, context).await? { DeletableObjects::Community(community) => { diff --git a/crates/apub/src/activities/deletion/undo_delete.rs b/crates/apub/src/activities/deletion/undo_delete.rs index 7ee90b6e8..6dced4395 100644 --- a/crates/apub/src/activities/deletion/undo_delete.rs +++ b/crates/apub/src/activities/deletion/undo_delete.rs @@ -5,13 +5,29 @@ use crate::{ generate_activity_id, verify_activity, }, - objects::community::ApubCommunity, + objects::{community::ApubCommunity, person::ApubPerson}, protocol::activities::deletion::{delete::Delete, undo_delete::UndoDelete}, }; use activitystreams_kinds::activity::UndoType; use lemmy_api_common::blocking; use lemmy_apub_lib::{data::Data, object_id::ObjectId, traits::ActivityHandler}; -use lemmy_db_schema::source::{comment::Comment, community::Community, person::Person, post::Post}; +use lemmy_db_schema::{ + source::{ + comment::Comment, + community::Community, + moderator::{ + ModRemoveComment, + ModRemoveCommentForm, + ModRemoveCommunity, + ModRemoveCommunityForm, + ModRemovePost, + ModRemovePostForm, + }, + person::Person, + post::Post, + }, + traits::Crud, +}; use lemmy_utils::LemmyError; use lemmy_websocket::{ send::{send_comment_ws_message_simple, send_community_ws_message, send_post_ws_message}, @@ -49,7 +65,15 @@ impl ActivityHandler for UndoDelete { request_counter: &mut i32, ) -> Result<(), LemmyError> { if self.object.summary.is_some() { - UndoDelete::receive_undo_remove_action(self.object.object.id(), context).await + UndoDelete::receive_undo_remove_action( + &self + .actor + .dereference(context, context.client(), request_counter) + .await?, + self.object.object.id(), + context, + ) + .await } else { receive_delete_action( self.object.object.id(), @@ -93,6 +117,7 @@ impl UndoDelete { #[tracing::instrument(skip_all)] pub(in crate::activities) async fn receive_undo_remove_action( + actor: &ApubPerson, object: &Url, context: &LemmyContext, ) -> Result<(), LemmyError> { @@ -104,6 +129,17 @@ impl UndoDelete { "Only local admin can restore community", )); } + let form = ModRemoveCommunityForm { + mod_person_id: actor.id, + community_id: community.id, + removed: Some(false), + reason: None, + expires: None, + }; + blocking(context.pool(), move |conn| { + ModRemoveCommunity::create(conn, &form) + }) + .await??; let deleted_community = blocking(context.pool(), move |conn| { Community::update_removed(conn, community.id, false) }) @@ -111,6 +147,16 @@ impl UndoDelete { send_community_ws_message(deleted_community.id, EditCommunity, None, None, context).await?; } DeletableObjects::Post(post) => { + let form = ModRemovePostForm { + mod_person_id: actor.id, + post_id: post.id, + removed: Some(false), + reason: None, + }; + blocking(context.pool(), move |conn| { + ModRemovePost::create(conn, &form) + }) + .await??; let removed_post = blocking(context.pool(), move |conn| { Post::update_removed(conn, post.id, false) }) @@ -118,6 +164,16 @@ impl UndoDelete { send_post_ws_message(removed_post.id, EditPost, None, None, context).await?; } DeletableObjects::Comment(comment) => { + let form = ModRemoveCommentForm { + mod_person_id: actor.id, + comment_id: comment.id, + removed: Some(false), + reason: None, + }; + blocking(context.pool(), move |conn| { + ModRemoveComment::create(conn, &form) + }) + .await??; let removed_comment = blocking(context.pool(), move |conn| { Comment::update_removed(conn, comment.id, false) }) diff --git a/crates/apub/src/objects/post.rs b/crates/apub/src/objects/post.rs index b5fbe9424..3d0725b72 100644 --- a/crates/apub/src/objects/post.rs +++ b/crates/apub/src/objects/post.rs @@ -161,6 +161,8 @@ impl ApubObject for ApubPost { .await?; let community = page.extract_community(context, request_counter).await?; + // TODO: write mod log if stickied or locked changed + let url = if let Some(attachment) = page.attachment.first() { Some(attachment.href.clone()) } else {