388bbc4978
Tries fully-qualifying emoji when receiving them, by adding the emoji variation sequence to the received reaction emoji. This issue arises when other instance software, such as Misskey, tries reacting with emoji that have unqualified or minimally qualified variants, like a red heart. Pleroma only accepts fully qualified emoji in emoji reactions, and refused those emoji. Now, Pleroma will attempt to properly qualify them first, and reject them if checks still fail. This commit contains changes to tests proposed by lanodan. Co-authored-by: Haelwenn <contact+git.pleroma.social@hacktivis.me>
88 lines
2.9 KiB
Elixir
88 lines
2.9 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Web.ActivityPub.Transmogrifier.EmojiReactHandlingTest do
|
|
use Pleroma.DataCase, async: true
|
|
|
|
alias Pleroma.Activity
|
|
alias Pleroma.Object
|
|
alias Pleroma.Web.ActivityPub.Transmogrifier
|
|
alias Pleroma.Web.CommonAPI
|
|
|
|
import Pleroma.Factory
|
|
|
|
test "it works for incoming emoji reactions" do
|
|
user = insert(:user)
|
|
other_user = insert(:user, local: false)
|
|
{:ok, activity} = CommonAPI.post(user, %{status: "hello"})
|
|
|
|
data =
|
|
File.read!("test/fixtures/emoji-reaction.json")
|
|
|> Jason.decode!()
|
|
|> Map.put("object", activity.data["object"])
|
|
|> Map.put("actor", other_user.ap_id)
|
|
|
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
|
|
assert data["actor"] == other_user.ap_id
|
|
assert data["type"] == "EmojiReact"
|
|
assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2"
|
|
assert data["object"] == activity.data["object"]
|
|
assert data["content"] == "👌"
|
|
|
|
object = Object.get_by_ap_id(data["object"])
|
|
|
|
assert object.data["reaction_count"] == 1
|
|
assert match?([["👌", _]], object.data["reactions"])
|
|
end
|
|
|
|
test "it works for incoming unqualified emoji reactions" do
|
|
user = insert(:user)
|
|
other_user = insert(:user, local: false)
|
|
{:ok, activity} = CommonAPI.post(user, %{status: "hello"})
|
|
|
|
data =
|
|
File.read!("test/fixtures/emoji-reaction-unqualified.json")
|
|
|> Jason.decode!()
|
|
|> Map.put("object", activity.data["object"])
|
|
|> Map.put("actor", other_user.ap_id)
|
|
|
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
|
|
assert data["actor"] == other_user.ap_id
|
|
assert data["type"] == "EmojiReact"
|
|
assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2"
|
|
assert data["object"] == activity.data["object"]
|
|
# heart emoji with added emoji variation sequence
|
|
assert data["content"] == "❤\uFE0F"
|
|
|
|
object = Object.get_by_ap_id(data["object"])
|
|
|
|
assert object.data["reaction_count"] == 1
|
|
assert match?([["❤\uFE0F", _]], object.data["reactions"])
|
|
end
|
|
|
|
test "it reject invalid emoji reactions" do
|
|
user = insert(:user)
|
|
other_user = insert(:user, local: false)
|
|
{:ok, activity} = CommonAPI.post(user, %{status: "hello"})
|
|
|
|
data =
|
|
File.read!("test/fixtures/emoji-reaction-too-long.json")
|
|
|> Jason.decode!()
|
|
|> Map.put("object", activity.data["object"])
|
|
|> Map.put("actor", other_user.ap_id)
|
|
|
|
assert {:error, _} = Transmogrifier.handle_incoming(data)
|
|
|
|
data =
|
|
File.read!("test/fixtures/emoji-reaction-no-emoji.json")
|
|
|> Jason.decode!()
|
|
|> Map.put("object", activity.data["object"])
|
|
|> Map.put("actor", other_user.ap_id)
|
|
|
|
assert {:error, _} = Transmogrifier.handle_incoming(data)
|
|
end
|
|
end
|