]> Untitled Git - lemmy.git/commitdiff
Dont handle activities twice in inbox
authorFelix Ableitner <me@nutomic.com>
Mon, 16 Nov 2020 20:41:47 +0000 (21:41 +0100)
committerFelix Ableitner <me@nutomic.com>
Thu, 26 Nov 2020 12:24:12 +0000 (13:24 +0100)
lemmy_apub/src/inbox/shared_inbox.rs

index b693f48ad010c01bac1a9862031f4456523a46b2..dfd5836626634d53604c6c52ac16f5434e831585 100644 (file)
@@ -65,10 +65,12 @@ pub async fn shared_inbox(
   let activity_any_base = activity.clone().into_any_base()?;
   let mut res: Option<HttpResponse> = None;
   let to_and_cc = get_activity_to_and_cc(&activity)?;
-  // If to_and_cc contains a local community, pass to receive_community_message()
   // Handle community first, so in case the sender is banned by the community, it will error out.
   // If we handled the user receive first, the activity would be inserted to the database before the
   // community could check for bans.
+  // Note that an activity can be addressed to a community and to a user (or multiple users) at the
+  // same time. In this case we still only handle it once, to avoid duplicate websocket
+  // notifications.
   let community = extract_local_community_from_destinations(&to_and_cc, context.pool()).await?;
   if let Some(community) = community {
     let community_activity = CommunityAcceptedActivities::from_any_base(activity_any_base.clone())?
@@ -83,10 +85,7 @@ pub async fn shared_inbox(
       )
       .await?,
     );
-  }
-
-  // If to_and_cc contains a local user, pass to receive_user_message()
-  if is_addressed_to_local_user(&to_and_cc, context.pool()).await? {
+  } else if is_addressed_to_local_user(&to_and_cc, context.pool()).await? {
     let user_activity = UserAcceptedActivities::from_any_base(activity_any_base.clone())?
       .context(location_info!())?;
     // `to_user` is only used for follow activities (which we dont receive here), so no need to pass
@@ -99,10 +98,7 @@ pub async fn shared_inbox(
       request_counter,
     )
     .await?;
-  }
-
-  // If to_and_cc contains followers collection of a community, pass to receive_user_message()
-  if is_addressed_to_community_followers(&to_and_cc, context.pool())
+  } else if is_addressed_to_community_followers(&to_and_cc, context.pool())
     .await?
     .is_some()
   {