2 activities::{generate_activity_id, send_lemmy_activity, verify_person},
5 objects::{person::ApubPerson, private_message::ApubPrivateMessage},
6 protocol::activities::{
7 create_or_update::private_message::CreateOrUpdatePrivateMessage,
12 use activitypub_federation::{
13 core::object_id::ObjectId,
15 traits::{ActivityHandler, Actor, ApubObject},
16 utils::verify_domains_match,
18 use lemmy_api_common::utils::blocking;
19 use lemmy_db_schema::{source::person::Person, traits::Crud};
20 use lemmy_utils::error::LemmyError;
21 use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperationCrud};
24 impl CreateOrUpdatePrivateMessage {
25 #[tracing::instrument(skip_all)]
27 private_message: ApubPrivateMessage,
29 kind: CreateOrUpdateType,
30 context: &LemmyContext,
31 ) -> Result<(), LemmyError> {
32 let recipient_id = private_message.recipient_id;
33 let recipient: ApubPerson =
34 blocking(context.pool(), move |conn| Person::read(conn, recipient_id))
38 let id = generate_activity_id(
40 &context.settings().get_protocol_and_hostname(),
42 let create_or_update = CreateOrUpdatePrivateMessage {
44 actor: ObjectId::new(actor.actor_id()),
45 to: [ObjectId::new(recipient.actor_id())],
46 object: private_message.into_apub(context).await?,
48 unparsed: Default::default(),
50 let inbox = vec![recipient.shared_inbox_or_inbox()];
51 send_lemmy_activity(context, create_or_update, actor, inbox, true).await
55 #[async_trait::async_trait(?Send)]
56 impl ActivityHandler for CreateOrUpdatePrivateMessage {
57 type DataType = LemmyContext;
58 type Error = LemmyError;
60 fn id(&self) -> &Url {
64 fn actor(&self) -> &Url {
68 #[tracing::instrument(skip_all)]
71 context: &Data<LemmyContext>,
72 request_counter: &mut i32,
73 ) -> Result<(), LemmyError> {
74 let local_site_data = blocking(context.pool(), fetch_local_site_data).await??;
75 check_apub_id_valid(self.id(), &local_site_data, context.settings())
76 .map_err(LemmyError::from_message)?;
78 verify_person(&self.actor, context, request_counter).await?;
79 verify_domains_match(self.actor.inner(), self.object.id.inner())?;
80 verify_domains_match(self.to[0].inner(), self.object.to[0].inner())?;
81 ApubPrivateMessage::verify(&self.object, self.actor.inner(), context, request_counter).await?;
85 #[tracing::instrument(skip_all)]
88 context: &Data<LemmyContext>,
89 request_counter: &mut i32,
90 ) -> Result<(), LemmyError> {
92 ApubPrivateMessage::from_apub(self.object, context, request_counter).await?;
94 let notif_type = match self.kind {
95 CreateOrUpdateType::Create => UserOperationCrud::CreatePrivateMessage,
96 CreateOrUpdateType::Update => UserOperationCrud::EditPrivateMessage,
98 send_pm_ws_message(private_message.id, notif_type, None, context).await?;