Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into develop
authorRoger Braun <roger@rogerbraun.net>
Sun, 5 Nov 2017 11:12:19 +0000 (12:12 +0100)
committerRoger Braun <roger@rogerbraun.net>
Sun, 5 Nov 2017 11:12:19 +0000 (12:12 +0100)
1  2 
lib/pleroma/web/activity_pub/activity_pub.ex
test/web/activity_pub/activity_pub_test.exs

index d4eb503234cf86105e34e25f517bb5db1db21610,a62be2511767d3057568572db19059966cd349bf..4f7be4293332cb09bc75e86e337fe8a1589e7d62
@@@ -93,10 -93,11 +93,11 @@@ defmodule Pleroma.Web.ActivityPub.Activ
      end
    end
  
-   def fetch_activities_for_context(context) do
+   def fetch_activities_for_context(context, opts \\ %{}) do
      query = from activity in Activity,
        where: fragment("?->>'type' = ? and ?->>'context' = ?", activity.data, "Create", activity.data, ^context),
        order_by: [desc: :id]
+     query = restrict_blocked(query, opts)
      Repo.all(query)
    end
  
  
    # Only search through last 100_000 activities by default
    defp restrict_recent(query, _) do
 -    since = Repo.aggregate(Activity, :max, :id) - 100_000
 +    since = (Repo.aggregate(Activity, :max, :id) || 0) - 100_000
  
      from activity in query,
        where: activity.id > ^since
    end
  
+   defp restrict_blocked(query, %{"blocking_user" => %User{info: info}}) do
+     blocks = info["blocks"] || []
+     from activity in query,
+       where: fragment("not (?->>'actor' = ANY(?))", activity.data, ^blocks)
+   end
+   defp restrict_blocked(query, _), do: query
    def fetch_activities(recipients, opts \\ %{}) do
      base_query = from activity in Activity,
        limit: 20,
      |> restrict_type(opts)
      |> restrict_favorited_by(opts)
      |> restrict_recent(opts)
+     |> restrict_blocked(opts)
      |> Repo.all
      |> Enum.reverse
    end
index 48597f5fbcd55e834beb45916f1e0fb153c0f410,a02740d5d8780b2882b646c3b4ac1e4e5ced41a0..2cd33d623ee42a7c29b2df54494ce7e91ea91900
@@@ -73,17 -73,42 +73,44 @@@ defmodule Pleroma.Web.ActivityPub.Activ
        {:ok, activity_two} = ActivityBuilder.insert(%{"type" => "Create", "context" => "2hu"})
        {:ok, _activity_three} = ActivityBuilder.insert(%{"type" => "Create", "context" => "3hu"})
        {:ok, _activity_four} = ActivityBuilder.insert(%{"type" => "Announce", "context" => "2hu"})
+       activity_five = insert(:note_activity)
+       user = insert(:user)
  
-       activities = ActivityPub.fetch_activities_for_context("2hu")
+       {:ok, user} = User.block(user, %{ap_id: activity_five.data["actor"]})
  
+       activities = ActivityPub.fetch_activities_for_context("2hu", %{"blocking_user" => user})
        assert activities == [activity_two, activity]
      end
    end
  
+   test "doesn't return blocked activities" do
+     activity_one = insert(:note_activity)
+     activity_two = insert(:note_activity)
+     user = insert(:user)
+     {:ok, user} = User.block(user, %{ap_id: activity_one.data["actor"]})
+     activities = ActivityPub.fetch_activities([], %{"blocking_user" => user})
+     assert Enum.member?(activities, activity_two)
+     refute Enum.member?(activities, activity_one)
+     {:ok, user} = User.unblock(user, %{ap_id: activity_one.data["actor"]})
+     activities = ActivityPub.fetch_activities([], %{"blocking_user" => user})
+     assert Enum.member?(activities, activity_two)
+     assert Enum.member?(activities, activity_one)
+     activities = ActivityPub.fetch_activities([], %{"blocking_user" => nil})
+     assert Enum.member?(activities, activity_two)
+     assert Enum.member?(activities, activity_one)
+   end
    describe "public fetch activities" do
      test "retrieves public activities" do
 +      activities = ActivityPub.fetch_public_activities
 +
        %{public: public} = ActivityBuilder.public_and_non_public
  
        activities = ActivityPub.fetch_public_activities