]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/activities/deletion/delete_user.rs
Split activity table into sent and received parts (fixes #3103) (#3583)
[lemmy.git] / crates / apub / src / activities / deletion / delete_user.rs
index 9570d85d2199e36d495ece4f0fd53f390553fba7..b388ed9e1ec597642a672756f65a33495af069a3 100644 (file)
@@ -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<LemmyContext>,
+  ) -> 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,29 +72,19 @@ impl ActivityHandler for DeleteUser {
     self.actor.inner()
   }
 
-  async fn verify(
-    &self,
-    context: &Data<LemmyContext>,
-    request_counter: &mut i32,
-  ) -> Result<(), LemmyError> {
+  async fn verify(&self, context: &Data<Self::DataType>) -> 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<LemmyContext>,
-    request_counter: &mut i32,
-  ) -> Result<(), LemmyError> {
-    let actor = self
-      .actor
-      .dereference(context, local_instance(context), request_counter)
-      .await?;
+  async fn receive(self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
+    let actor = self.actor.dereference(context).await?;
     delete_user_account(
       actor.id,
-      context.pool(),
+      &mut context.pool(),
       context.settings(),
       context.client(),
     )
@@ -61,26 +92,3 @@ impl ActivityHandler for DeleteUser {
     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?;
-    Ok(())
-  }
-}