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

This commit is contained in:
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,
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??;
}
}

View File

@ -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??;
}
}

View File

@ -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(())

View File

@ -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(())
}

View File

@ -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<ApubPerson>,
actor: &ApubPerson,
object: &Url,
reason: Option<String>,
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) => {

View File

@ -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)
})

View File

@ -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 {