]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/deletion/delete_user.rs
d74a3c8aa3f16a0c8945e6bd6d364258cc74b7aa
[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_activity,
4   objects::{instance::remote_instance_inboxes, person::ApubPerson},
5   protocol::activities::deletion::delete_user::DeleteUser,
6   SendActivity,
7 };
8 use activitypub_federation::{
9   config::Data,
10   kinds::{activity::DeleteType, public},
11   protocol::verification::verify_urls_match,
12   traits::{ActivityHandler, Actor},
13 };
14 use lemmy_api_common::{
15   context::LemmyContext,
16   person::{DeleteAccount, DeleteAccountResponse},
17   utils::{delete_user_account, local_user_view_from_jwt},
18 };
19 use lemmy_utils::error::LemmyError;
20 use url::Url;
21
22 #[async_trait::async_trait]
23 impl SendActivity for DeleteAccount {
24   type Response = DeleteAccountResponse;
25
26   async fn send_activity(
27     request: &Self,
28     _response: &Self::Response,
29     context: &Data<LemmyContext>,
30   ) -> Result<(), LemmyError> {
31     let local_user_view = local_user_view_from_jwt(&request.auth, context).await?;
32     let actor: ApubPerson = local_user_view.person.into();
33     delete_user_account(
34       actor.id,
35       &mut context.pool(),
36       context.settings(),
37       context.client(),
38     )
39     .await?;
40
41     let id = generate_activity_id(
42       DeleteType::Delete,
43       &context.settings().get_protocol_and_hostname(),
44     )?;
45     let delete = DeleteUser {
46       actor: actor.id().into(),
47       to: vec![public()],
48       object: actor.id().into(),
49       kind: DeleteType::Delete,
50       id: id.clone(),
51       cc: vec![],
52     };
53
54     let inboxes = remote_instance_inboxes(&mut context.pool()).await?;
55     send_lemmy_activity(context, delete, &actor, inboxes, true).await?;
56     Ok(())
57   }
58 }
59
60 /// This can be separate from Delete activity because it doesn't need to be handled in shared inbox
61 /// (cause instance actor doesn't have shared inbox).
62 #[async_trait::async_trait]
63 impl ActivityHandler for DeleteUser {
64   type DataType = LemmyContext;
65   type Error = LemmyError;
66
67   fn id(&self) -> &Url {
68     &self.id
69   }
70
71   fn actor(&self) -> &Url {
72     self.actor.inner()
73   }
74
75   async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
76     verify_is_public(&self.to, &[])?;
77     verify_person(&self.actor, context).await?;
78     verify_urls_match(self.actor.inner(), self.object.inner())?;
79     Ok(())
80   }
81
82   async fn receive(self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
83     insert_activity(&self.id, &self, false, false, context).await?;
84     let actor = self.actor.dereference(context).await?;
85     delete_user_account(
86       actor.id,
87       &mut context.pool(),
88       context.settings(),
89       context.client(),
90     )
91     .await?;
92     Ok(())
93   }
94 }