Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85832399
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Authored By
Unknown
Size
2 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/changelog.d/emoji-react-single-tag.fix b/changelog.d/emoji-react-single-tag.fix
new file mode 100644
index 000000000..565775830
--- /dev/null
+++ b/changelog.d/emoji-react-single-tag.fix
@@ -0,0 +1 @@
+Accept incoming emoji reactions whose tag is a single object instead of an array
diff --git a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
index 65ba047e6..b7197c3f3 100644
--- a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
@@ -57,7 +57,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do
|> CommonFixes.fix_actor()
|> CommonFixes.fix_activity_addressing()
- data = Map.put_new(data, "tag", [])
+ data = fix_tag(data)
case Object.normalize(data["object"]) do
%Object{} = object ->
@@ -70,6 +70,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do
end
end
+ # JSON-LD compaction turns a single-element array into a bare object
+ defp fix_tag(%{"tag" => %{} = tag} = data), do: Map.put(data, "tag", [tag])
+ defp fix_tag(data), do: Map.put_new(data, "tag", [])
+
defp fix_emoji_qualification(%{"content" => emoji} = data) do
new_emoji = Pleroma.Emoji.fully_qualify_emoji(emoji)
diff --git a/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
index f2e1cefa3..2e1841559 100644
--- a/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
@@ -86,6 +86,31 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.EmojiReactHandlingTest do
)
end
+ test "it works for incoming custom emoji reactions with a single tag object" do
+ user = insert(:user)
+ other_user = insert(:user, local: false)
+ {:ok, activity} = CommonAPI.post(user, %{status: "hello"})
+
+ data =
+ File.read!("test/fixtures/custom-emoji-reaction.json")
+ |> Jason.decode!()
+ |> Map.put("object", activity.data["object"])
+ |> Map.put("actor", other_user.ap_id)
+
+ [tag] = data["tag"]
+ data = Map.put(data, "tag", tag)
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["content"] == ":hanapog:"
+ assert [%{"name" => "hanapog"}] = data["tag"]
+
+ object = Object.get_by_ap_id(data["object"])
+ url = tag["icon"]["url"]
+
+ assert match?([["hanapog", _, ^url]], object.data["reactions"])
+ end
+
test "it works for incoming unqualified emoji reactions" do
user = insert(:user)
other_user = insert(:user, local: false)
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Nov 2, 8:18 AM (16 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1803771
Default Alt Text
(2 KB)
Attached To
Mode
rPUBE pleroma-upstream
Attached
Detach File
Event Timeline