diff options
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 23 | ||||
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 27 | 
2 files changed, 45 insertions, 5 deletions
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index eb44cffec..bf89c228a 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -791,10 +791,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do        where:          fragment(            """ -          ?->>'type' != 'Create'     -- This isn't a Create       +          ?->>'type' != 'Create'     -- This isn't a Create            OR ?->>'inReplyTo' is null -- this isn't a reply -          OR ? && array_remove(?, ?) -- The recipient is us or one of our friends,  -                                     -- unless they are the author (because authors  +          OR ? && array_remove(?, ?) -- The recipient is us or one of our friends, +                                     -- unless they are the author (because authors                                       -- are also part of the recipients). This leads                                       -- to a bug that self-replies by friends won't                                       -- show up. @@ -850,7 +850,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      from(        [activity, object: o] in query, +      # You don't block the author        where: fragment("not (? = ANY(?))", activity.actor, ^blocked_ap_ids), + +      # You don't block any recipients, and didn't author the post        where:          fragment(            "((not (? && ?)) or ? = ?)", @@ -859,12 +862,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do            activity.actor,            ^user.ap_id          ), + +      # You don't block the domain of any recipients, and didn't author the post        where:          fragment( -          "recipients_contain_blocked_domains(?, ?) = false", +          "(recipients_contain_blocked_domains(?, ?) = false) or ? = ?",            activity.recipients, -          ^domain_blocks +          ^domain_blocks, +          activity.actor, +          ^user.ap_id          ), + +      # It's not a boost of a user you block        where:          fragment(            "not (?->>'type' = 'Announce' and ?->'to' \\?| ?)", @@ -872,6 +881,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do            activity.data,            ^blocked_ap_ids          ), + +      # You don't block the author's domain, and also don't follow the author        where:          fragment(            "(not (split_part(?, '/', 3) = ANY(?))) or ? = ANY(?)", @@ -880,6 +891,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do            activity.actor,            ^following_ap_ids          ), + +      # Same as above, but checks the Object        where:          fragment(            "(not (split_part(?->>'actor', '/', 3) = ANY(?))) or (?->>'actor') = ANY(?)", diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 804305a13..e4661b478 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -622,6 +622,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      assert Enum.member?(activities, activity_one)    end +  test "always see your own posts even when they address people you block" do +    user = insert(:user) +    blockee = insert(:user) + +    {:ok, _} = User.block(user, blockee) +    {:ok, activity} = CommonAPI.post(user, %{status: "hey! @#{blockee.nickname}"}) + +    activities = ActivityPub.fetch_activities([], %{blocking_user: user}) + +    assert Enum.member?(activities, activity) +  end +    test "doesn't return transitive interactions concerning blocked users" do      blocker = insert(:user)      blockee = insert(:user) @@ -721,6 +733,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      refute repeat_activity in activities    end +  test "see your own posts even when they adress actors from blocked domains" do +    user = insert(:user) + +    domain = "dogwhistle.zone" +    domain_user = insert(:user, %{ap_id: "https://#{domain}/@pundit"}) + +    {:ok, user} = User.block_domain(user, domain) + +    {:ok, activity} = CommonAPI.post(user, %{status: "hey! @#{domain_user.nickname}"}) + +    activities = ActivityPub.fetch_activities([], %{blocking_user: user}) + +    assert Enum.member?(activities, activity) +  end +    test "does return activities from followed users on blocked domains" do      domain = "meanies.social"      domain_user = insert(:user, %{ap_id: "https://#{domain}/@pundit"})  | 
