streamer: contain list updates in the same way as we do with the database query
authorWilliam Pitcock <nenolod@dereferenced.org>
Wed, 29 Aug 2018 09:23:05 +0000 (09:23 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Wed, 29 Aug 2018 09:23:05 +0000 (09:23 +0000)
lib/pleroma/web/streamer.ex

index c61bad83029dc00a5bd682b2b262822593343202..6b6d40346191c00c662077c57894ff34a14852ae 100644 (file)
@@ -1,7 +1,8 @@
 defmodule Pleroma.Web.Streamer do
   use GenServer
   require Logger
-  alias Pleroma.{User, Notification, Activity, Object}
+  alias Pleroma.{User, Notification, Activity, Object, Repo}
+  alias Pleroma.Web.ActivityPub.ActivityPub
 
   def init(args) do
     {:ok, args}
@@ -60,8 +61,24 @@ defmodule Pleroma.Web.Streamer do
   end
 
   def handle_cast(%{action: :stream, topic: "list", item: item}, topics) do
+    author = User.get_cached_by_ap_id(item.data["actor"])
+
+    # filter the recipient list if the activity is not public, see #270.
+    recipient_lists =
+      case ActivityPub.is_public?(item) do
+        true ->
+          Pleroma.List.get_lists_from_activity(item)
+
+        _ ->
+          Pleroma.List.get_lists_from_activity(item)
+          |> Enum.filter(fn list ->
+            owner = Repo.get(User, list.user_id)
+            author.follower_address in owner.following
+          end)
+      end
+
     recipient_topics =
-      Pleroma.List.get_lists_from_activity(item)
+      recipient_lists
       |> Enum.map(fn %{id: id} -> "list:#{id}" end)
 
     Enum.each(recipient_topics || [], fn list_topic ->