streamer: use direct object for filter checks when there is no valid child object...
authorAriadne Conill <ariadne@dereferenced.org>
Sun, 3 Nov 2019 15:05:12 +0000 (09:05 -0600)
committerAriadne Conill <ariadne@dereferenced.org>
Sun, 3 Nov 2019 15:05:12 +0000 (09:05 -0600)
We call Object.normalize/1 to get the child object for situations like Announce.
However, the check is flawed and immediately fails if Object.normalize/1 fails.
Instead, we should use the activity itself in those cases to allow activities which
never have a child object to pass through the filter.

Closes #1291

lib/pleroma/web/streamer/worker.ex
test/web/streamer/streamer_test.exs

index c2ee9e1f5c2385cb171f822a0f2295d96254ba74..33b24840d1794c17625c03507f6667c68f17fb35 100644 (file)
@@ -136,7 +136,7 @@ defmodule Pleroma.Web.Streamer.Worker do
     recipients = MapSet.new(item.recipients)
     domain_blocks = Pleroma.Web.ActivityPub.MRF.subdomains_regex(user.domain_blocks)
 
-    with parent when not is_nil(parent) <- Object.normalize(item),
+    with parent <- Object.normalize(item) || item,
          true <- Enum.all?([blocks, mutes, reblog_mutes], &(item.actor not in &1)),
          true <- Enum.all?([blocks, mutes], &(parent.data["actor"] not in &1)),
          true <- MapSet.disjoint?(recipients, recipient_blocks),
index cb10151719a45b43ebaa11be20f4de2c3d964606..d6968f4d049f975d5cc9ff195b46026aa43641d1 100644 (file)
@@ -110,6 +110,24 @@ defmodule Pleroma.Web.StreamerTest do
       Streamer.stream("user:notification", notif)
       Task.await(task)
     end
+
+    test "it sends follow activities to the 'user:notification' stream", %{
+      user: user
+    } do
+      user2 = insert(:user)
+      task = Task.async(fn -> assert_receive {:text, _}, 4_000 end)
+
+      Streamer.add_socket(
+        "user:notification",
+        %{transport_pid: task.pid, assigns: %{user: user}}
+      )
+
+      {:ok, _follower, _followed, _activity} = CommonAPI.follow(user2, user)
+
+      # We don't directly pipe the notification to the streamer as it's already
+      # generated as a side effect of CommonAPI.follow().
+      Task.await(task)
+    end
   end
 
   test "it sends to public" do