forked from AkkomaGang/akkoma
Merge branch 'feature/federated-flags' into 'develop'
Federated reports See merge request pleroma/pleroma!935
This commit is contained in:
commit
6d6f48d079
5 changed files with 91 additions and 13 deletions
|
@ -370,20 +370,38 @@ def flag(
|
||||||
content: content
|
content: content
|
||||||
} = params
|
} = params
|
||||||
) do
|
) do
|
||||||
additional = params[:additional] || %{}
|
|
||||||
|
|
||||||
# only accept false as false value
|
# only accept false as false value
|
||||||
local = !(params[:local] == false)
|
local = !(params[:local] == false)
|
||||||
|
forward = !(params[:forward] == false)
|
||||||
|
|
||||||
%{
|
additional = params[:additional] || %{}
|
||||||
|
|
||||||
|
params = %{
|
||||||
actor: actor,
|
actor: actor,
|
||||||
context: context,
|
context: context,
|
||||||
account: account,
|
account: account,
|
||||||
statuses: statuses,
|
statuses: statuses,
|
||||||
content: content
|
content: content
|
||||||
}
|
}
|
||||||
|> make_flag_data(additional)
|
|
||||||
|> insert(local)
|
additional =
|
||||||
|
if forward do
|
||||||
|
Map.merge(additional, %{"to" => [], "cc" => [account.ap_id]})
|
||||||
|
else
|
||||||
|
Map.merge(additional, %{"to" => [], "cc" => []})
|
||||||
|
end
|
||||||
|
|
||||||
|
with flag_data <- make_flag_data(params, additional),
|
||||||
|
{:ok, activity} <- insert(flag_data, local),
|
||||||
|
:ok <- maybe_federate(activity) do
|
||||||
|
Enum.each(User.all_superusers(), fn superuser ->
|
||||||
|
superuser
|
||||||
|
|> Pleroma.AdminEmail.report(actor, account, statuses, content)
|
||||||
|
|> Pleroma.Mailer.deliver_async()
|
||||||
|
end)
|
||||||
|
|
||||||
|
{:ok, activity}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_activities_for_context(context, opts \\ %{}) do
|
def fetch_activities_for_context(context, opts \\ %{}) do
|
||||||
|
|
|
@ -355,6 +355,40 @@ defp get_follow_activity(follow_object, followed) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Flag objects are placed ahead of the ID check because Mastodon 2.8 and earlier send them
|
||||||
|
# with nil ID.
|
||||||
|
def handle_incoming(%{"type" => "Flag", "object" => objects, "actor" => actor} = data) do
|
||||||
|
with context <- data["context"] || Utils.generate_context_id(),
|
||||||
|
content <- data["content"] || "",
|
||||||
|
%User{} = actor <- User.get_cached_by_ap_id(actor),
|
||||||
|
|
||||||
|
# Reduce the object list to find the reported user.
|
||||||
|
%User{} = account <-
|
||||||
|
Enum.reduce_while(objects, nil, fn ap_id, _ ->
|
||||||
|
with %User{} = user <- User.get_cached_by_ap_id(ap_id) do
|
||||||
|
{:halt, user}
|
||||||
|
else
|
||||||
|
_ -> {:cont, nil}
|
||||||
|
end
|
||||||
|
end),
|
||||||
|
|
||||||
|
# Remove the reported user from the object list.
|
||||||
|
statuses <- Enum.filter(objects, fn ap_id -> ap_id != account.ap_id end) do
|
||||||
|
params = %{
|
||||||
|
actor: actor,
|
||||||
|
context: context,
|
||||||
|
account: account,
|
||||||
|
statuses: statuses,
|
||||||
|
content: content,
|
||||||
|
additional: %{
|
||||||
|
"cc" => [account.ap_id]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ActivityPub.flag(params)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# disallow objects with bogus IDs
|
# disallow objects with bogus IDs
|
||||||
def handle_incoming(%{"id" => nil}), do: :error
|
def handle_incoming(%{"id" => nil}), do: :error
|
||||||
def handle_incoming(%{"id" => ""}), do: :error
|
def handle_incoming(%{"id" => ""}), do: :error
|
||||||
|
|
|
@ -621,7 +621,13 @@ def make_create_data(params, additional) do
|
||||||
#### Flag-related helpers
|
#### Flag-related helpers
|
||||||
|
|
||||||
def make_flag_data(params, additional) do
|
def make_flag_data(params, additional) do
|
||||||
status_ap_ids = Enum.map(params.statuses || [], & &1.data["id"])
|
status_ap_ids =
|
||||||
|
Enum.map(params.statuses || [], fn
|
||||||
|
%Activity{} = act -> act.data["id"]
|
||||||
|
act when is_map(act) -> act["id"]
|
||||||
|
act when is_binary(act) -> act
|
||||||
|
end)
|
||||||
|
|
||||||
object = [params.account.ap_id] ++ status_ap_ids
|
object = [params.account.ap_id] ++ status_ap_ids
|
||||||
|
|
||||||
%{
|
%{
|
||||||
|
|
|
@ -284,14 +284,9 @@ def report(user, data) do
|
||||||
actor: user,
|
actor: user,
|
||||||
account: account,
|
account: account,
|
||||||
statuses: statuses,
|
statuses: statuses,
|
||||||
content: content_html
|
content: content_html,
|
||||||
|
forward: data["forward"] || false
|
||||||
}) do
|
}) do
|
||||||
Enum.each(User.all_superusers(), fn superuser ->
|
|
||||||
superuser
|
|
||||||
|> Pleroma.AdminEmail.report(user, account, statuses, content_html)
|
|
||||||
|> Pleroma.Mailer.deliver_async()
|
|
||||||
end)
|
|
||||||
|
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
else
|
else
|
||||||
{:error, err} -> {:error, err}
|
{:error, err} -> {:error, err}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|
defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Object
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
@ -764,6 +765,30 @@ test "it remaps video URLs as attachments if necessary" do
|
||||||
|
|
||||||
assert object.data["attachment"] == [attachment]
|
assert object.data["attachment"] == [attachment]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it accepts Flag activities" do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "test post"})
|
||||||
|
object = Object.normalize(activity.data["object"])
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"@context" => "https://www.w3.org/ns/activitystreams",
|
||||||
|
"cc" => [user.ap_id],
|
||||||
|
"object" => [user.ap_id, object.data["id"]],
|
||||||
|
"type" => "Flag",
|
||||||
|
"content" => "blocked AND reported!!!",
|
||||||
|
"actor" => other_user.ap_id
|
||||||
|
}
|
||||||
|
|
||||||
|
assert {:ok, activity} = Transmogrifier.handle_incoming(message)
|
||||||
|
|
||||||
|
assert activity.data["object"] == [user.ap_id, object.data["id"]]
|
||||||
|
assert activity.data["content"] == "blocked AND reported!!!"
|
||||||
|
assert activity.data["actor"] == other_user.ap_id
|
||||||
|
assert activity.data["cc"] == [user.ap_id]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "prepare outgoing" do
|
describe "prepare outgoing" do
|
||||||
|
|
Loading…
Reference in a new issue