Add missing mod log entries for federated actions (fixes #1489) (#2198)

initial-upvote-federation
Nutomic 2022-04-07 20:44:28 +00:00 committed by GitHub
parent b41f7f3eca
commit f9d563d80a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 123 additions and 20 deletions

View File

@ -31,7 +31,7 @@ use lemmy_db_schema::{
CommunityPersonBan, CommunityPersonBan,
CommunityPersonBanForm, CommunityPersonBanForm,
}, },
moderator::{ModBan, ModBanForm}, moderator::{ModBan, ModBanForm, ModBanFromCommunity, ModBanFromCommunityForm},
person::Person, person::Person,
}, },
traits::{Bannable, Crud, Followable}, traits::{Bannable, Crud, Followable},
@ -213,14 +213,18 @@ impl ActivityHandler for BlockUser {
} }
// write to mod log // write to mod log
let form = ModBanForm { let form = ModBanFromCommunityForm {
mod_person_id: mod_person.id, mod_person_id: mod_person.id,
other_person_id: blocked_person.id, other_person_id: blocked_person.id,
community_id: community.id,
reason: self.summary, reason: self.summary,
banned: Some(true), banned: Some(true),
expires, expires,
}; };
blocking(context.pool(), move |conn| ModBan::create(conn, &form)).await??; blocking(context.pool(), move |conn| {
ModBanFromCommunity::create(conn, &form)
})
.await??;
} }
} }

View File

@ -22,7 +22,7 @@ use lemmy_apub_lib::{
use lemmy_db_schema::{ use lemmy_db_schema::{
source::{ source::{
community::{CommunityPersonBan, CommunityPersonBanForm}, community::{CommunityPersonBan, CommunityPersonBanForm},
moderator::{ModBan, ModBanForm}, moderator::{ModBan, ModBanForm, ModBanFromCommunity, ModBanFromCommunityForm},
person::Person, person::Person,
}, },
traits::{Bannable, Crud}, traits::{Bannable, Crud},
@ -136,14 +136,18 @@ impl ActivityHandler for UndoBlockUser {
.await??; .await??;
// write to mod log // write to mod log
let form = ModBanForm { let form = ModBanFromCommunityForm {
mod_person_id: mod_person.id, mod_person_id: mod_person.id,
other_person_id: blocked_person.id, other_person_id: blocked_person.id,
community_id: community.id,
reason: self.object.summary, reason: self.object.summary,
banned: Some(false), banned: Some(false),
expires, expires,
}; };
blocking(context.pool(), move |conn| ModBan::create(conn, &form)).await??; blocking(context.pool(), move |conn| {
ModBanFromCommunity::create(conn, &form)
})
.await??;
} }
} }

View File

@ -25,8 +25,11 @@ use lemmy_apub_lib::{
traits::{ActivityHandler, ActorType}, traits::{ActivityHandler, ActorType},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::community::{CommunityModerator, CommunityModeratorForm}, source::{
traits::Joinable, community::{CommunityModerator, CommunityModeratorForm},
moderator::{ModAddCommunity, ModAddCommunityForm},
},
traits::{Crud, Joinable},
}; };
use lemmy_utils::LemmyError; use lemmy_utils::LemmyError;
use lemmy_websocket::LemmyContext; use lemmy_websocket::LemmyContext;
@ -114,6 +117,22 @@ impl ActivityHandler for AddMod {
CommunityModerator::join(conn, &form) CommunityModerator::join(conn, &form)
}) })
.await??; .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 // TODO: send websocket notification about added mod
Ok(()) Ok(())

View File

@ -25,8 +25,11 @@ use lemmy_apub_lib::{
traits::{ActivityHandler, ActorType}, traits::{ActivityHandler, ActorType},
}; };
use lemmy_db_schema::{ use lemmy_db_schema::{
source::community::{CommunityModerator, CommunityModeratorForm}, source::{
traits::Joinable, community::{CommunityModerator, CommunityModeratorForm},
moderator::{ModAddCommunity, ModAddCommunityForm},
},
traits::{Crud, Joinable},
}; };
use lemmy_utils::LemmyError; use lemmy_utils::LemmyError;
use lemmy_websocket::LemmyContext; use lemmy_websocket::LemmyContext;
@ -106,6 +109,23 @@ impl ActivityHandler for RemoveMod {
CommunityModerator::leave(conn, &form) CommunityModerator::leave(conn, &form)
}) })
.await??; .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 // TODO: send websocket notification about removed mod
Ok(()) Ok(())
} }

View File

@ -67,11 +67,13 @@ impl ActivityHandler for Delete {
Some(reason) Some(reason)
}; };
receive_remove_action( receive_remove_action(
&self.actor, &self
.actor
.dereference(context, context.client(), request_counter)
.await?,
self.object.id(), self.object.id(),
reason, reason,
context, context,
request_counter,
) )
.await .await
} else { } else {
@ -119,15 +121,11 @@ impl Delete {
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
pub(in crate::activities) async fn receive_remove_action( pub(in crate::activities) async fn receive_remove_action(
actor: &ObjectId<ApubPerson>, actor: &ApubPerson,
object: &Url, object: &Url,
reason: Option<String>, reason: Option<String>,
context: &LemmyContext, context: &LemmyContext,
request_counter: &mut i32,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let actor = actor
.dereference(context, context.client(), request_counter)
.await?;
use UserOperationCrud::*; use UserOperationCrud::*;
match DeletableObjects::read_from_db(object, context).await? { match DeletableObjects::read_from_db(object, context).await? {
DeletableObjects::Community(community) => { DeletableObjects::Community(community) => {

View File

@ -5,13 +5,29 @@ use crate::{
generate_activity_id, generate_activity_id,
verify_activity, verify_activity,
}, },
objects::community::ApubCommunity, objects::{community::ApubCommunity, person::ApubPerson},
protocol::activities::deletion::{delete::Delete, undo_delete::UndoDelete}, protocol::activities::deletion::{delete::Delete, undo_delete::UndoDelete},
}; };
use activitystreams_kinds::activity::UndoType; use activitystreams_kinds::activity::UndoType;
use lemmy_api_common::blocking; use lemmy_api_common::blocking;
use lemmy_apub_lib::{data::Data, object_id::ObjectId, traits::ActivityHandler}; 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_utils::LemmyError;
use lemmy_websocket::{ use lemmy_websocket::{
send::{send_comment_ws_message_simple, send_community_ws_message, send_post_ws_message}, 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, request_counter: &mut i32,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
if self.object.summary.is_some() { 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 { } else {
receive_delete_action( receive_delete_action(
self.object.object.id(), self.object.object.id(),
@ -93,6 +117,7 @@ impl UndoDelete {
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
pub(in crate::activities) async fn receive_undo_remove_action( pub(in crate::activities) async fn receive_undo_remove_action(
actor: &ApubPerson,
object: &Url, object: &Url,
context: &LemmyContext, context: &LemmyContext,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
@ -104,6 +129,17 @@ impl UndoDelete {
"Only local admin can restore community", "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| { let deleted_community = blocking(context.pool(), move |conn| {
Community::update_removed(conn, community.id, false) 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?; send_community_ws_message(deleted_community.id, EditCommunity, None, None, context).await?;
} }
DeletableObjects::Post(post) => { 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| { let removed_post = blocking(context.pool(), move |conn| {
Post::update_removed(conn, post.id, false) 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?; send_post_ws_message(removed_post.id, EditPost, None, None, context).await?;
} }
DeletableObjects::Comment(comment) => { 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| { let removed_comment = blocking(context.pool(), move |conn| {
Comment::update_removed(conn, comment.id, false) Comment::update_removed(conn, comment.id, false)
}) })

View File

@ -161,6 +161,8 @@ impl ApubObject for ApubPost {
.await?; .await?;
let community = page.extract_community(context, request_counter).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() { let url = if let Some(attachment) = page.attachment.first() {
Some(attachment.href.clone()) Some(attachment.href.clone())
} else { } else {