streamer: don't relay boosts of messages which would otherwise be blocked
authorWilliam Pitcock <nenolod@dereferenced.org>
Wed, 13 Jun 2018 21:57:14 +0000 (21:57 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Wed, 13 Jun 2018 21:59:56 +0000 (21:59 +0000)
lib/pleroma/web/streamer.ex

index 0c9e954854a6ca49f581a69ffa8a59b13a29ac75..ce38f3cc3e1d97f219776df995d6cdc0972973c1 100644 (file)
@@ -1,7 +1,7 @@
 defmodule Pleroma.Web.Streamer do
   use GenServer
   require Logger
-  alias Pleroma.{User, Notification}
+  alias Pleroma.{User, Notification, Activity, Object}
 
   def init(args) do
     {:ok, args}
@@ -138,6 +138,34 @@ defmodule Pleroma.Web.Streamer do
     {:noreply, state}
   end
 
+  defp represent_update(%Activity{} = activity, %User{} = user) do
+    %{
+      event: "update",
+      payload:
+        Pleroma.Web.MastodonAPI.StatusView.render(
+          "status.json",
+          activity: activity,
+          for: user
+        )
+        |> Jason.encode!()
+    }
+    |> Jason.encode!()
+  end
+
+  def push_to_socket(topics, topic, %Activity{data: %{"type" => "Announce"}} = item) do
+    Enum.each(topics[topic] || [], fn socket ->
+      # Get the current user so we have up-to-date blocks etc.
+      user = User.get_cached_by_ap_id(socket.assigns[:user].ap_id)
+      blocks = user.info["blocks"] || []
+
+      parent = Object.get_by_ap_id(item.data["object"])
+
+      unless is_nil(parent) or item.actor in blocks or parent.data["actor"] in blocks do
+        send(socket.transport_pid, {:text, represent_update(item, user)})
+      end
+    end)
+  end
+
   def push_to_socket(topics, topic, item) do
     Enum.each(topics[topic] || [], fn socket ->
       # Get the current user so we have up-to-date blocks etc.
@@ -145,20 +173,7 @@ defmodule Pleroma.Web.Streamer do
       blocks = user.info["blocks"] || []
 
       unless item.actor in blocks do
-        json =
-          %{
-            event: "update",
-            payload:
-              Pleroma.Web.MastodonAPI.StatusView.render(
-                "status.json",
-                activity: item,
-                for: user
-              )
-              |> Jason.encode!()
-          }
-          |> Jason.encode!()
-
-        send(socket.transport_pid, {:text, json})
+        send(socket.transport_pid, {:text, represent_update(item, user)})
       end
     end)
   end