]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/deletion/delete_user.rs
Activitypub crate rewrite (#2782)
[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, get_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 =
32       get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
33     let actor: ApubPerson = local_user_view.person.into();
34     delete_user_account(
35       actor.id,
36       context.pool(),
37       context.settings(),
38       context.client(),
39     )
40     .await?;
41
42     let id = generate_activity_id(
43       DeleteType::Delete,
44       &context.settings().get_protocol_and_hostname(),
45     )?;
46     let delete = DeleteUser {
47       actor: actor.id().into(),
48       to: vec![public()],
49       object: actor.id().into(),
50       kind: DeleteType::Delete,
51       id: id.clone(),
52       cc: vec![],
53     };
54
55     let inboxes = remote_instance_inboxes(context.pool()).await?;
56     send_lemmy_activity(context, delete, &actor, inboxes, true).await?;
57     Ok(())
58   }
59 }
60
61 /// This can be separate from Delete activity because it doesn't need to be handled in shared inbox
62 /// (cause instance actor doesn't have shared inbox).
63 #[async_trait::async_trait]
64 impl ActivityHandler for DeleteUser {
65   type DataType = LemmyContext;
66   type Error = LemmyError;
67
68   fn id(&self) -> &Url {
69     &self.id
70   }
71
72   fn actor(&self) -> &Url {
73     self.actor.inner()
74   }
75
76   async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
77     verify_is_public(&self.to, &[])?;
78     verify_person(&self.actor, context).await?;
79     verify_urls_match(self.actor.inner(), self.object.inner())?;
80     Ok(())
81   }
82
83   async fn receive(self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
84     insert_activity(&self.id, &self, false, false, context).await?;
85     let actor = self.actor.dereference(context).await?;
86     delete_user_account(
87       actor.id,
88       context.pool(),
89       context.settings(),
90       context.client(),
91     )
92     .await?;
93     Ok(())
94   }
95 }