X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Factivities%2Fcommunity%2Freport.rs;h=22a8c12be116f53b215ac081e438ff1bc2e01ef5;hb=3471f3533cb724b2cf6953d563aadfcc9f66c1d2;hp=35a4266795123d29b482bd973de677a234663728;hpb=35cbae61bc03a1a0af29f79ee55223d4e9766c07;p=lemmy.git diff --git a/crates/apub/src/activities/community/report.rs b/crates/apub/src/activities/community/report.rs index 35a42667..22a8c12b 100644 --- a/crates/apub/src/activities/community/report.rs +++ b/crates/apub/src/activities/community/report.rs @@ -1,20 +1,22 @@ use crate::{ - activities::{ - generate_activity_id, - send_lemmy_activity, - verify_activity, - verify_person_in_community, - }, + activities::{generate_activity_id, send_lemmy_activity, verify_person_in_community}, + insert_received_activity, objects::{community::ApubCommunity, person::ApubPerson}, - protocol::activities::community::report::Report, + protocol::{activities::community::report::Report, InCommunity}, PostOrComment, + SendActivity, +}; +use activitypub_federation::{ + config::Data, + fetch::object_id::ObjectId, + kinds::activity::FlagType, + traits::{ActivityHandler, Actor}, }; -use activitystreams_kinds::activity::FlagType; -use lemmy_api_common::{blocking, comment::CommentReportResponse, post::PostReportResponse}; -use lemmy_apub_lib::{ - data::Data, - object_id::ObjectId, - traits::{ActivityHandler, ActorType}, +use lemmy_api_common::{ + comment::{CommentReportResponse, CreateCommentReport}, + context::LemmyContext, + post::{CreatePostReport, PostReportResponse}, + utils::{local_user_view_from_jwt, sanitize_html}, }; use lemmy_db_schema::{ source::{ @@ -23,18 +25,59 @@ use lemmy_db_schema::{ }, traits::Reportable, }; -use lemmy_db_views::{comment_report_view::CommentReportView, post_report_view::PostReportView}; -use lemmy_utils::LemmyError; -use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation}; +use lemmy_utils::error::LemmyError; +use url::Url; + +#[async_trait::async_trait] +impl SendActivity for CreatePostReport { + type Response = PostReportResponse; + + async fn send_activity( + request: &Self, + response: &Self::Response, + context: &Data, + ) -> Result<(), LemmyError> { + let local_user_view = local_user_view_from_jwt(&request.auth, context).await?; + Report::send( + ObjectId::from(response.post_report_view.post.ap_id.clone()), + &local_user_view.person.into(), + ObjectId::from(response.post_report_view.community.actor_id.clone()), + request.reason.to_string(), + context, + ) + .await + } +} + +#[async_trait::async_trait] +impl SendActivity for CreateCommentReport { + type Response = CommentReportResponse; + + async fn send_activity( + request: &Self, + response: &Self::Response, + context: &Data, + ) -> Result<(), LemmyError> { + let local_user_view = local_user_view_from_jwt(&request.auth, context).await?; + Report::send( + ObjectId::from(response.comment_report_view.comment.ap_id.clone()), + &local_user_view.person.into(), + ObjectId::from(response.comment_report_view.community.actor_id.clone()), + request.reason.to_string(), + context, + ) + .await + } +} impl Report { #[tracing::instrument(skip_all)] - pub async fn send( + async fn send( object_id: ObjectId, actor: &ApubPerson, community_id: ObjectId, reason: String, - context: &LemmyContext, + context: &Data, ) -> Result<(), LemmyError> { let community = community_id.dereference_local(context).await?; let kind = FlagType::Flag; @@ -43,104 +86,64 @@ impl Report { &context.settings().get_protocol_and_hostname(), )?; let report = Report { - actor: ObjectId::new(actor.actor_id()), - to: [ObjectId::new(community.actor_id())], + actor: actor.id().into(), + to: [community.id().into()], object: object_id, summary: reason, kind, id: id.clone(), - unparsed: Default::default(), + audience: Some(community.id().into()), }; - send_lemmy_activity( - context, - &report, - &id, - actor, - vec![community.shared_inbox_or_inbox_url()], - false, - ) - .await + + let inbox = vec![community.shared_inbox_or_inbox()]; + send_lemmy_activity(context, report, actor, inbox, false).await } } -#[async_trait::async_trait(?Send)] +#[async_trait::async_trait] impl ActivityHandler for Report { type DataType = LemmyContext; + type Error = LemmyError; + + fn id(&self) -> &Url { + &self.id + } + + fn actor(&self) -> &Url { + self.actor.inner() + } #[tracing::instrument(skip_all)] - async fn verify( - &self, - context: &Data, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { - verify_activity(&self.id, self.actor.inner(), &context.settings())?; - let community = self.to[0].dereference(context, request_counter).await?; - verify_person_in_community(&self.actor, &community, context, request_counter).await?; + async fn verify(&self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; + let community = self.community(context).await?; + verify_person_in_community(&self.actor, &community, context).await?; Ok(()) } #[tracing::instrument(skip_all)] - async fn receive( - self, - context: &Data, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { - let actor = self.actor.dereference(context, request_counter).await?; - match self.object.dereference(context, request_counter).await? { + async fn receive(self, context: &Data) -> Result<(), LemmyError> { + let actor = self.actor.dereference(context).await?; + match self.object.dereference(context).await? { PostOrComment::Post(post) => { let report_form = PostReportForm { creator_id: actor.id, post_id: post.id, original_post_name: post.name.clone(), original_post_url: post.url.clone(), - reason: self.summary, + reason: sanitize_html(&self.summary), original_post_body: post.body.clone(), }; - - let report = blocking(context.pool(), move |conn| { - PostReport::report(conn, &report_form) - }) - .await??; - - let post_report_view = blocking(context.pool(), move |conn| { - PostReportView::read(conn, report.id, actor.id) - }) - .await??; - - context.chat_server().do_send(SendModRoomMessage { - op: UserOperation::CreateCommentReport, - response: PostReportResponse { post_report_view }, - community_id: post.community_id, - websocket_id: None, - }); + PostReport::report(&mut context.pool(), &report_form).await?; } PostOrComment::Comment(comment) => { let report_form = CommentReportForm { creator_id: actor.id, comment_id: comment.id, original_comment_text: comment.content.clone(), - reason: self.summary, + reason: sanitize_html(&self.summary), }; - - let report = blocking(context.pool(), move |conn| { - CommentReport::report(conn, &report_form) - }) - .await??; - - let comment_report_view = blocking(context.pool(), move |conn| { - CommentReportView::read(conn, report.id, actor.id) - }) - .await??; - let community_id = comment_report_view.community.id; - - context.chat_server().do_send(SendModRoomMessage { - op: UserOperation::CreateCommentReport, - response: CommentReportResponse { - comment_report_view, - }, - community_id, - websocket_id: None, - }); + CommentReport::report(&mut context.pool(), &report_form).await?; } }; Ok(())