Accept EmojiReacts with non-array tag

JSON-LD compaction strips the array since it’s just one object

Fixes: AkkomaGang/akkoma#720
This commit is contained in:
Oneric 2024-04-09 01:04:16 +02:00
parent debd686418
commit 462225880a
2 changed files with 32 additions and 2 deletions

View file

@ -8,6 +8,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do
alias Pleroma.Emoji alias Pleroma.Emoji
alias Pleroma.Object alias Pleroma.Object
alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes
alias Pleroma.Web.ActivityPub.Transmogrifier
import Ecto.Changeset import Ecto.Changeset
import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
@ -52,6 +53,7 @@ def changeset(struct, data) do
defp fix(data) do defp fix(data) do
data = data =
data data
|> Transmogrifier.fix_tag()
|> fix_emoji_qualification() |> fix_emoji_qualification()
|> CommonFixes.fix_actor() |> CommonFixes.fix_actor()
|> CommonFixes.fix_activity_addressing() |> CommonFixes.fix_activity_addressing()

View file

@ -84,6 +84,32 @@ test "it works for incoming custom emoji with image url as id" do
assert match?([[^shortcode, _, ^imgurl]], object.data["reactions"]) assert match?([[^shortcode, _, ^imgurl]], object.data["reactions"])
end end
test "it works for incoming custom emoji without tag array" do
user = insert(:user)
other_user = insert(:user, local: false)
{:ok, activity} = CommonAPI.post(user, %{status: "hello"})
shortcode = "blobcatgoogly"
imgurl = "https://example.org/emoji/b.png"
emoji = emoji_object(shortcode, imgurl, imgurl)
data = react_with_custom(activity.data["object"], other_user.ap_id, emoji, false)
assert %{} = data["tag"]
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
assert data["actor"] == other_user.ap_id
assert data["type"] == "EmojiReact"
assert data["object"] == activity.data["object"]
assert data["content"] == ":" <> shortcode <> ":"
assert [%{}] = data["tag"]
object = Object.get_by_ap_id(data["object"])
assert object.data["reaction_count"] == 1
assert match?([[^shortcode, _, _]], object.data["reactions"])
end
test "it works for incoming custom emoji reactions from Misskey" do test "it works for incoming custom emoji reactions from Misskey" do
user = insert(:user) user = insert(:user)
other_user = insert(:user, local: false) other_user = insert(:user, local: false)
@ -198,12 +224,14 @@ defp emoji_object(shortcode, id \\ nil, url \\ "https://example.org/emoji.png")
} }
end end
defp react_with_custom(object_id, as_actor, emoji) do defp react_with_custom(object_id, as_actor, emoji, tag_array \\ true) do
tag = if tag_array, do: [emoji], else: emoji
File.read!("test/fixtures/emoji-reaction.json") File.read!("test/fixtures/emoji-reaction.json")
|> Jason.decode!() |> Jason.decode!()
|> Map.put("object", object_id) |> Map.put("object", object_id)
|> Map.put("actor", as_actor) |> Map.put("actor", as_actor)
|> Map.put("content", ":" <> emoji["name"] <> ":") |> Map.put("content", ":" <> emoji["name"] <> ":")
|> Map.put("tag", [emoji]) |> Map.put("tag", tag)
end end
end end