Streamer: Don't send out stream events for blocked users.
authorlain <lain@soykaf.club>
Sat, 5 May 2018 11:40:47 +0000 (13:40 +0200)
committerlain <lain@soykaf.club>
Sat, 5 May 2018 11:40:47 +0000 (13:40 +0200)
lib/pleroma/web/streamer.ex
test/web/streamer_test.exs [new file with mode: 0644]

index 10670e71fbd343aac1f30e0ecedc8ba8ddad1e40..3375af8414acfc742716d1e34955ead8d2f3102c 100644 (file)
@@ -110,20 +110,26 @@ defmodule Pleroma.Web.Streamer do
 
   def push_to_socket(topics, topic, item) do
     Enum.each(topics[topic] || [], fn socket ->
-      json =
-        %{
-          event: "update",
-          payload:
-            Pleroma.Web.MastodonAPI.StatusView.render(
-              "status.json",
-              activity: item,
-              for: socket.assigns[:user]
-            )
-            |> Jason.encode!()
-        }
-        |> Jason.encode!()
-
-      send(socket.transport_pid, {:text, json})
+      # 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"] || []
+
+      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})
+      end
     end)
   end
 
diff --git a/test/web/streamer_test.exs b/test/web/streamer_test.exs
new file mode 100644 (file)
index 0000000..47d491d
--- /dev/null
@@ -0,0 +1,63 @@
+defmodule Pleroma.Web.StreamerTest do
+  use Pleroma.DataCase
+
+  alias Pleroma.Web.Streamer
+  alias Pleroma.User
+  alias Pleroma.Web.CommonAPI
+  import Pleroma.Factory
+
+  test "it sends to public" do
+    user = insert(:user)
+    other_user = insert(:user)
+
+    task =
+      Task.async(fn ->
+        assert_receive {:text, _}, 4_000
+      end)
+
+    fake_socket = %{
+      transport_pid: task.pid,
+      assigns: %{
+        user: user
+      }
+    }
+
+    {:ok, activity} = CommonAPI.post(other_user, %{"status" => "Test"})
+
+    topics = %{
+      "public" => [fake_socket]
+    }
+
+    Streamer.push_to_socket(topics, "public", activity)
+
+    Task.await(task)
+  end
+
+  test "it doesn't send to blocked users" do
+    user = insert(:user)
+    blocked_user = insert(:user)
+    {:ok, user} = User.block(user, blocked_user)
+
+    task =
+      Task.async(fn ->
+        refute_receive {:text, _}, 1_000
+      end)
+
+    fake_socket = %{
+      transport_pid: task.pid,
+      assigns: %{
+        user: user
+      }
+    }
+
+    {:ok, activity} = CommonAPI.post(blocked_user, %{"status" => "Test"})
+
+    topics = %{
+      "public" => [fake_socket]
+    }
+
+    Streamer.push_to_socket(topics, "public", activity)
+
+    Task.await(task)
+  end
+end