Merge branch 'develop' into 'develop'
ForceBotUnlistedPolicy See merge request pleroma/pleroma!2967
This commit is contained in:
commit
bf048ab72f
|
@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Rich media failure tracking (along with `:failure_backoff` option)
|
- Rich media failure tracking (along with `:failure_backoff` option)
|
||||||
|
- MRF policy to rewrite bot posts scope from public to unlisted
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,7 @@ To add configuration to your config file, you can copy it from the base config.
|
||||||
* `Pleroma.Web.ActivityPub.MRF.VocabularyPolicy`: Restricts activities to a configured set of vocabulary. (See [`:mrf_vocabulary`](#mrf_vocabulary)).
|
* `Pleroma.Web.ActivityPub.MRF.VocabularyPolicy`: Restricts activities to a configured set of vocabulary. (See [`:mrf_vocabulary`](#mrf_vocabulary)).
|
||||||
* `Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy`: Rejects or delists posts based on their age when received. (See [`:mrf_object_age`](#mrf_object_age)).
|
* `Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy`: Rejects or delists posts based on their age when received. (See [`:mrf_object_age`](#mrf_object_age)).
|
||||||
* `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Sets a default expiration on all posts made by users of the local instance. Requires `Pleroma.ActivityExpiration` to be enabled for processing the scheduled delections.
|
* `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Sets a default expiration on all posts made by users of the local instance. Requires `Pleroma.ActivityExpiration` to be enabled for processing the scheduled delections.
|
||||||
|
* `Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicy`: Makes all bot posts to disappear from public timelines.
|
||||||
* `transparency`: Make the content of your Message Rewrite Facility settings public (via nodeinfo).
|
* `transparency`: Make the content of your Message Rewrite Facility settings public (via nodeinfo).
|
||||||
* `transparency_exclusions`: Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value.
|
* `transparency_exclusions`: Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicy do
|
||||||
|
alias Pleroma.User
|
||||||
|
@behaviour Pleroma.Web.ActivityPub.MRF
|
||||||
|
@moduledoc "Remove bot posts from federated timeline"
|
||||||
|
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
|
defp check_by_actor_type(user), do: user.actor_type in ["Application", "Service"]
|
||||||
|
defp check_by_nickname(user), do: Regex.match?(~r/bot@|ebooks@/i, user.nickname)
|
||||||
|
|
||||||
|
defp check_if_bot(user), do: check_by_actor_type(user) or check_by_nickname(user)
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def filter(
|
||||||
|
%{
|
||||||
|
"type" => "Create",
|
||||||
|
"to" => to,
|
||||||
|
"cc" => cc,
|
||||||
|
"actor" => actor,
|
||||||
|
"object" => object
|
||||||
|
} = message
|
||||||
|
) do
|
||||||
|
user = User.get_cached_by_ap_id(actor)
|
||||||
|
isbot = check_if_bot(user)
|
||||||
|
|
||||||
|
if isbot and Enum.member?(to, Pleroma.Constants.as_public()) do
|
||||||
|
to = List.delete(to, Pleroma.Constants.as_public()) ++ [user.follower_address]
|
||||||
|
cc = List.delete(cc, user.follower_address) ++ [Pleroma.Constants.as_public()]
|
||||||
|
|
||||||
|
object =
|
||||||
|
object
|
||||||
|
|> Map.put("to", to)
|
||||||
|
|> Map.put("cc", cc)
|
||||||
|
|
||||||
|
message =
|
||||||
|
message
|
||||||
|
|> Map.put("to", to)
|
||||||
|
|> Map.put("cc", cc)
|
||||||
|
|> Map.put("object", object)
|
||||||
|
|
||||||
|
{:ok, message}
|
||||||
|
else
|
||||||
|
{:ok, message}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def filter(message), do: {:ok, message}
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def describe, do: {:ok, %{}}
|
||||||
|
end
|
|
@ -0,0 +1,60 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicyTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
alias Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicy
|
||||||
|
@public "https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
|
||||||
|
defp generate_messages(actor) do
|
||||||
|
{%{
|
||||||
|
"actor" => actor.ap_id,
|
||||||
|
"type" => "Create",
|
||||||
|
"object" => %{},
|
||||||
|
"to" => [@public, "f"],
|
||||||
|
"cc" => [actor.follower_address, "d"]
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
"actor" => actor.ap_id,
|
||||||
|
"type" => "Create",
|
||||||
|
"object" => %{"to" => ["f", actor.follower_address], "cc" => ["d", @public]},
|
||||||
|
"to" => ["f", actor.follower_address],
|
||||||
|
"cc" => ["d", @public]
|
||||||
|
}}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "removes from the federated timeline by nickname heuristics 1" do
|
||||||
|
actor = insert(:user, %{nickname: "annoying_ebooks@example.com"})
|
||||||
|
|
||||||
|
{message, except_message} = generate_messages(actor)
|
||||||
|
|
||||||
|
assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "removes from the federated timeline by nickname heuristics 2" do
|
||||||
|
actor = insert(:user, %{nickname: "cirnonewsnetworkbot@meow.cat"})
|
||||||
|
|
||||||
|
{message, except_message} = generate_messages(actor)
|
||||||
|
|
||||||
|
assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "removes from the federated timeline by actor type Application" do
|
||||||
|
actor = insert(:user, %{actor_type: "Application"})
|
||||||
|
|
||||||
|
{message, except_message} = generate_messages(actor)
|
||||||
|
|
||||||
|
assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "removes from the federated timeline by actor type Service" do
|
||||||
|
actor = insert(:user, %{actor_type: "Service"})
|
||||||
|
|
||||||
|
{message, except_message} = generate_messages(actor)
|
||||||
|
|
||||||
|
assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue