forked from AkkomaGang/akkoma
Merge branch 'accept-deletes' into 'develop'
Always accept deletions through SimplePolicy, add :reject_deletes group See merge request pleroma/pleroma!2371
This commit is contained in:
commit
e57c1b60e4
6 changed files with 97 additions and 4 deletions
|
@ -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.
|
- 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.
|
- Mix task to create trusted OAuth App.
|
||||||
- Notifications: Added `follow_request` notification type (configurable, see `[:notifications, :enable_follow_request_notifications]` setting).
|
- Notifications: Added `follow_request` notification type (configurable, see `[:notifications, :enable_follow_request_notifications]` setting).
|
||||||
|
- Added `:reject_deletes` group to SimplePolicy
|
||||||
<details>
|
<details>
|
||||||
<summary>API Changes</summary>
|
<summary>API Changes</summary>
|
||||||
- Mastodon API: Support for `include_types` in `/api/v1/notifications`.
|
- 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
|
### Fixed
|
||||||
- Support pagination in conversations API
|
- Support pagination in conversations API
|
||||||
|
- **Breaking**: SimplePolicy `:reject` and `:accept` allow deletions again
|
||||||
|
|
||||||
## [unreleased-patch]
|
## [unreleased-patch]
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
|
@ -336,7 +336,8 @@
|
||||||
reject: [],
|
reject: [],
|
||||||
accept: [],
|
accept: [],
|
||||||
avatar_removal: [],
|
avatar_removal: [],
|
||||||
banner_removal: []
|
banner_removal: [],
|
||||||
|
reject_deletes: []
|
||||||
|
|
||||||
config :pleroma, :mrf_keyword,
|
config :pleroma, :mrf_keyword,
|
||||||
reject: [],
|
reject: [],
|
||||||
|
|
|
@ -1317,13 +1317,13 @@
|
||||||
%{
|
%{
|
||||||
key: :reject,
|
key: :reject,
|
||||||
type: {:list, :string},
|
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"]
|
suggestions: ["example.com", "*.example.com"]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
key: :accept,
|
key: :accept,
|
||||||
type: {:list, :string},
|
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"]
|
suggestions: ["example.com", "*.example.com"]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
|
@ -1343,6 +1343,12 @@
|
||||||
type: {:list, :string},
|
type: {:list, :string},
|
||||||
description: "List of instances to strip banners from",
|
description: "List of instances to strip banners from",
|
||||||
suggestions: ["example.com", "*.example.com"]
|
suggestions: ["example.com", "*.example.com"]
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
key: :reject_deletes,
|
||||||
|
type: {:list, :string},
|
||||||
|
description: "List of instances to reject deletions from",
|
||||||
|
suggestions: ["example.com", "*.example.com"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
@ -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.
|
* `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.
|
* `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.
|
* `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.
|
Servers should be configured as lists.
|
||||||
|
|
||||||
|
|
|
@ -148,6 +148,21 @@ defp check_banner_removal(%{host: actor_host} = _actor_info, %{"image" => _image
|
||||||
|
|
||||||
defp check_banner_removal(_actor_info, object), do: {:ok, object}
|
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
|
@impl true
|
||||||
def filter(%{"actor" => actor} = object) do
|
def filter(%{"actor" => actor} = object) do
|
||||||
actor_info = URI.parse(actor)
|
actor_info = URI.parse(actor)
|
||||||
|
|
|
@ -17,7 +17,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
|
||||||
reject: [],
|
reject: [],
|
||||||
accept: [],
|
accept: [],
|
||||||
avatar_removal: [],
|
avatar_removal: [],
|
||||||
banner_removal: []
|
banner_removal: [],
|
||||||
|
reject_deletes: []
|
||||||
)
|
)
|
||||||
|
|
||||||
describe "when :media_removal" do
|
describe "when :media_removal" do
|
||||||
|
@ -382,6 +383,66 @@ test "match with wildcard domain" do
|
||||||
end
|
end
|
||||||
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
|
defp build_local_message do
|
||||||
%{
|
%{
|
||||||
"actor" => "#{Pleroma.Web.base_url()}/users/alice",
|
"actor" => "#{Pleroma.Web.base_url()}/users/alice",
|
||||||
|
@ -408,4 +469,11 @@ defp build_remote_user do
|
||||||
"type" => "Person"
|
"type" => "Person"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp build_remote_deletion_message do
|
||||||
|
%{
|
||||||
|
"type" => "Delete",
|
||||||
|
"actor" => "https://remote.instance/users/bob"
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue