]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/deletion/delete_user.rs
Automatically resolve report when post/comment is removed (#3850)
[lemmy.git] / crates / apub / src / activities / deletion / delete_user.rs
1 use crate::{
2   activities::{generate_activity_id, send_lemmy_activity, verify_is_public, verify_person},
3   insert_received_activity,
4   objects::{instance::remote_instance_inboxes, person::ApubPerson},
5   protocol::activities::deletion::delete_user::DeleteUser,
6 };
7 use activitypub_federation::{
8   config::Data,
9   kinds::{activity::DeleteType, public},
10   protocol::verification::verify_urls_match,
11   traits::{ActivityHandler, Actor},
12 };
13 use lemmy_api_common::{context::LemmyContext, utils::delete_user_account};
14 use lemmy_db_schema::source::person::Person;
15 use lemmy_utils::error::LemmyError;
16 use url::Url;
17
18 pub async fn delete_user(person: Person, context: Data<LemmyContext>) -> Result<(), LemmyError> {
19   let actor: ApubPerson = person.into();
20   delete_user_account(
21     actor.id,
22     &mut context.pool(),
23     context.settings(),
24     context.client(),
25   )
26   .await?;
27
28   let id = generate_activity_id(
29     DeleteType::Delete,
30     &context.settings().get_protocol_and_hostname(),
31   )?;
32   let delete = DeleteUser {
33     actor: actor.id().into(),
34     to: vec![public()],
35     object: actor.id().into(),
36     kind: DeleteType::Delete,
37     id: id.clone(),
38     cc: vec![],
39   };
40
41   let inboxes = remote_instance_inboxes(&mut context.pool()).await?;
42   send_lemmy_activity(&context, delete, &actor, inboxes, true).await?;
43   Ok(())
44 }
45
46 /// This can be separate from Delete activity because it doesn't need to be handled in shared inbox
47 /// (cause instance actor doesn't have shared inbox).
48 #[async_trait::async_trait]
49 impl ActivityHandler for DeleteUser {
50   type DataType = LemmyContext;
51   type Error = LemmyError;
52
53   fn id(&self) -> &Url {
54     &self.id
55   }
56
57   fn actor(&self) -> &Url {
58     self.actor.inner()
59   }
60
61   async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
62     insert_received_activity(&self.id, context).await?;
63     verify_is_public(&self.to, &[])?;
64     verify_person(&self.actor, context).await?;
65     verify_urls_match(self.actor.inner(), self.object.inner())?;
66     Ok(())
67   }
68
69   async fn receive(self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
70     let actor = self.actor.dereference(context).await?;
71     delete_user_account(
72       actor.id,
73       &mut context.pool(),
74       context.settings(),
75       context.client(),
76     )
77     .await?;
78     Ok(())
79   }
80 }