X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Factivities%2Fdeletion%2Fdelete_user.rs;h=b388ed9e1ec597642a672756f65a33495af069a3;hb=e9e76549a88cfbdab36f00d302cceabcaaa24f4c;hp=771d33eb35d1f74b1e6680975c4ffdd47958f6b9;hpb=fcaf7a084c8161941181a0473457b4e7f4acae8c;p=lemmy.git diff --git a/crates/apub/src/activities/deletion/delete_user.rs b/crates/apub/src/activities/deletion/delete_user.rs index 771d33eb..b388ed9e 100644 --- a/crates/apub/src/activities/deletion/delete_user.rs +++ b/crates/apub/src/activities/deletion/delete_user.rs @@ -1,24 +1,65 @@ use crate::{ activities::{generate_activity_id, send_lemmy_activity, verify_is_public, verify_person}, - local_instance, + insert_received_activity, objects::{instance::remote_instance_inboxes, person::ApubPerson}, protocol::activities::deletion::delete_user::DeleteUser, + SendActivity, }; use activitypub_federation::{ - core::object_id::ObjectId, - data::Data, - traits::ActivityHandler, - utils::verify_urls_match, + config::Data, + kinds::{activity::DeleteType, public}, + protocol::verification::verify_urls_match, + traits::{ActivityHandler, Actor}, +}; +use lemmy_api_common::{ + context::LemmyContext, + person::{DeleteAccount, DeleteAccountResponse}, + utils::{delete_user_account, local_user_view_from_jwt}, }; -use activitystreams_kinds::{activity::DeleteType, public}; -use lemmy_api_common::utils::delete_user_account; use lemmy_utils::error::LemmyError; -use lemmy_websocket::LemmyContext; use url::Url; +#[async_trait::async_trait] +impl SendActivity for DeleteAccount { + type Response = DeleteAccountResponse; + + 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?; + let actor: ApubPerson = local_user_view.person.into(); + delete_user_account( + actor.id, + &mut context.pool(), + context.settings(), + context.client(), + ) + .await?; + + let id = generate_activity_id( + DeleteType::Delete, + &context.settings().get_protocol_and_hostname(), + )?; + let delete = DeleteUser { + actor: actor.id().into(), + to: vec![public()], + object: actor.id().into(), + kind: DeleteType::Delete, + id: id.clone(), + cc: vec![], + }; + + let inboxes = remote_instance_inboxes(&mut context.pool()).await?; + send_lemmy_activity(context, delete, &actor, inboxes, true).await?; + Ok(()) + } +} + /// This can be separate from Delete activity because it doesn't need to be handled in shared inbox /// (cause instance actor doesn't have shared inbox). -#[async_trait::async_trait(?Send)] +#[async_trait::async_trait] impl ActivityHandler for DeleteUser { type DataType = LemmyContext; type Error = LemmyError; @@ -31,50 +72,23 @@ impl ActivityHandler for DeleteUser { self.actor.inner() } - async fn verify( - &self, - context: &Data, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { + async fn verify(&self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &[])?; - verify_person(&self.actor, context, request_counter).await?; + verify_person(&self.actor, context).await?; verify_urls_match(self.actor.inner(), self.object.inner())?; Ok(()) } - async fn receive( - self, - context: &Data, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { - let actor = self - .actor - .dereference(context, local_instance(context), request_counter) - .await?; - delete_user_account(actor.id, context.pool()).await?; - Ok(()) - } -} - -impl DeleteUser { - #[tracing::instrument(skip_all)] - pub async fn send(actor: &ApubPerson, context: &LemmyContext) -> Result<(), LemmyError> { - let actor_id = ObjectId::new(actor.actor_id.clone()); - let id = generate_activity_id( - DeleteType::Delete, - &context.settings().get_protocol_and_hostname(), - )?; - let delete = DeleteUser { - actor: actor_id.clone(), - to: vec![public()], - object: actor_id, - kind: DeleteType::Delete, - id: id.clone(), - cc: vec![], - }; - - let inboxes = remote_instance_inboxes(context.pool()).await?; - send_lemmy_activity(context, delete, actor, inboxes, true).await?; + async fn receive(self, context: &Data) -> Result<(), LemmyError> { + let actor = self.actor.dereference(context).await?; + delete_user_account( + actor.id, + &mut context.pool(), + context.settings(), + context.client(), + ) + .await?; Ok(()) } }