diff options
| -rw-r--r-- | CHANGELOG.md | 2 | ||||
| -rw-r--r-- | config/config.exs | 3 | ||||
| -rw-r--r-- | config/description.exs | 10 | ||||
| -rw-r--r-- | docs/configuration/mrf.md | 1 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/mrf/simple_policy.ex | 15 | ||||
| -rw-r--r-- | test/web/activity_pub/mrf/simple_policy_test.exs | 70 | 
6 files changed, 97 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index e454bd9d1..2d8e7efc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).  - New HTTP adapter [gun](https://github.com/ninenines/gun). Gun adapter requires minimum OTP version of 22.2 otherwise Pleroma won’t start. For hackney OTP update is not required.  - Mix task to create trusted OAuth App.  - Notifications: Added `follow_request` notification type (configurable, see `[:notifications, :enable_follow_request_notifications]` setting). +- Added `:reject_deletes` group to SimplePolicy  <details>    <summary>API Changes</summary>  - Mastodon API: Support for `include_types` in `/api/v1/notifications`. @@ -23,6 +24,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).  ### Fixed  - Support pagination in conversations API +- **Breaking**: SimplePolicy `:reject` and `:accept` allow deletions again  ## [unreleased-patch]  ### Fixed diff --git a/config/config.exs b/config/config.exs index f44837e24..2e538c4be 100644 --- a/config/config.exs +++ b/config/config.exs @@ -336,7 +336,8 @@ config :pleroma, :mrf_simple,    reject: [],    accept: [],    avatar_removal: [], -  banner_removal: [] +  banner_removal: [], +  reject_deletes: []  config :pleroma, :mrf_keyword,    reject: [], diff --git a/config/description.exs b/config/description.exs index b1938912c..7fac1e561 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1317,13 +1317,13 @@ config :pleroma, :config_description, [        %{          key: :reject,          type: {:list, :string}, -        description: "List of instances to reject any activities from", +        description: "List of instances to reject activities from (except deletes)",          suggestions: ["example.com", "*.example.com"]        },        %{          key: :accept,          type: {:list, :string}, -        description: "List of instances to accept any activities from", +        description: "List of instances to only accept activities from (except deletes)",          suggestions: ["example.com", "*.example.com"]        },        %{ @@ -1343,6 +1343,12 @@ config :pleroma, :config_description, [          type: {:list, :string},          description: "List of instances to strip banners from",          suggestions: ["example.com", "*.example.com"] +      }, +      %{ +        key: :reject_deletes, +        type: {:list, :string}, +        description: "List of instances to reject deletions from", +        suggestions: ["example.com", "*.example.com"]        }      ]    }, diff --git a/docs/configuration/mrf.md b/docs/configuration/mrf.md index 3fcae0761..d48d0cc99 100644 --- a/docs/configuration/mrf.md +++ b/docs/configuration/mrf.md @@ -49,6 +49,7 @@ Once `SimplePolicy` is enabled, you can configure various groups in the `:mrf_si  * `banner_removal`: Banner images from these servers will be stripped from incoming messages.  * `report_removal`: Servers in this group will have their reports (flags) rejected.  * `federated_timeline_removal`: Servers in this group will have their messages unlisted from the public timelines by flipping the `to` and `cc` fields. +* `reject_deletes`: Deletion requests will be rejected from these servers.  Servers should be configured as lists. diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index 4edc007fd..b7dcb1b86 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -149,6 +149,21 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do    defp check_banner_removal(_actor_info, object), do: {:ok, object}    @impl true +  def filter(%{"type" => "Delete", "actor" => actor} = object) do +    %{host: actor_host} = URI.parse(actor) + +    reject_deletes = +      Pleroma.Config.get([:mrf_simple, :reject_deletes]) +      |> MRF.subdomains_regex() + +    if MRF.subdomain_match?(reject_deletes, actor_host) do +      {:reject, nil} +    else +      {:ok, object} +    end +  end + +  @impl true    def filter(%{"actor" => actor} = object) do      actor_info = URI.parse(actor) diff --git a/test/web/activity_pub/mrf/simple_policy_test.exs b/test/web/activity_pub/mrf/simple_policy_test.exs index 91c24c2d9..b7b9bc6a2 100644 --- a/test/web/activity_pub/mrf/simple_policy_test.exs +++ b/test/web/activity_pub/mrf/simple_policy_test.exs @@ -17,7 +17,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do              reject: [],              accept: [],              avatar_removal: [], -            banner_removal: [] +            banner_removal: [], +            reject_deletes: []            )    describe "when :media_removal" do @@ -382,6 +383,66 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end    end +  describe "when :reject_deletes is empty" do +    setup do: Config.put([:mrf_simple, :reject_deletes], []) + +    test "it accepts deletions even from rejected servers" do +      Config.put([:mrf_simple, :reject], ["remote.instance"]) + +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} +    end + +    test "it accepts deletions even from non-whitelisted servers" do +      Config.put([:mrf_simple, :accept], ["non.matching.remote"]) + +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} +    end +  end + +  describe "when :reject_deletes is not empty but it doesn't have a matching host" do +    setup do: Config.put([:mrf_simple, :reject_deletes], ["non.matching.remote"]) + +    test "it accepts deletions even from rejected servers" do +      Config.put([:mrf_simple, :reject], ["remote.instance"]) + +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} +    end + +    test "it accepts deletions even from non-whitelisted servers" do +      Config.put([:mrf_simple, :accept], ["non.matching.remote"]) + +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} +    end +  end + +  describe "when :reject_deletes has a matching host" do +    setup do: Config.put([:mrf_simple, :reject_deletes], ["remote.instance"]) + +    test "it rejects the deletion" do +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:reject, nil} +    end +  end + +  describe "when :reject_deletes match with wildcard domain" do +    setup do: Config.put([:mrf_simple, :reject_deletes], ["*.remote.instance"]) + +    test "it rejects the deletion" do +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:reject, nil} +    end +  end +    defp build_local_message do      %{        "actor" => "#{Pleroma.Web.base_url()}/users/alice", @@ -408,4 +469,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        "type" => "Person"      }    end + +  defp build_remote_deletion_message do +    %{ +      "type" => "Delete", +      "actor" => "https://remote.instance/users/bob" +    } +  end  end  | 
