X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fweb%2Factivity_pub%2Fobject_validators%2Femoji_react_validator.ex;h=b133cbb741ec53e71c8fc013d3e966c45b893319;hb=142646426e1830ac0e0461075a99a27ac5813ceb;hp=ec75665158b864a811f1283b48ff1bcd6a238f03;hpb=926a233cc4683b5c2511690166bca0bf09338361;p=akkoma 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 ec7566515..b133cbb74 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 @@ -5,23 +5,28 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do use Ecto.Schema - alias Pleroma.EctoType.ActivityPub.ObjectValidators + alias Pleroma.Emoji alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes import Ecto.Changeset import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @primary_key false + @emoji_regex ~r/:[A-Za-z_-]+:/ embedded_schema do - field(:id, ObjectValidators.ObjectID, primary_key: true) - field(:type, :string) - field(:object, ObjectValidators.ObjectID) - field(:actor, ObjectValidators.ObjectID) + quote do + unquote do + import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields + message_fields() + activity_fields() + tag_fields() + end + end + field(:context, :string) field(:content, :string) - field(:to, ObjectValidators.Recipients, default: []) - field(:cc, ObjectValidators.Recipients, default: []) end def cast_and_validate(data) do @@ -31,42 +36,73 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do end def cast_data(data) do + data = + data + |> fix() + %__MODULE__{} |> changeset(data) end def changeset(struct, data) do struct - |> cast(data, __schema__(:fields)) - |> fix_after_cast() + |> cast(data, __schema__(:fields) -- [:tag]) + |> cast_embed(:tag) end - def fix_after_cast(cng) do - cng - |> fix_context() + defp fix(data) do + data = + data + |> CommonFixes.fix_actor() + |> CommonFixes.fix_activity_addressing() + + data = + if Map.has_key?(data, "tag") do + data + else + Map.put(data, "tag", []) + end + + case Object.normalize(data["object"]) do + %Object{} = object -> + data + |> CommonFixes.fix_activity_context(object) + |> CommonFixes.fix_object_action_recipients(object) + + _ -> + data + end end - def fix_context(cng) do - object = get_field(cng, :object) + defp matches_shortcode?(nil), do: false + defp matches_shortcode?(s), do: Regex.match?(@emoji_regex, s) + + defp validate_emoji(cng) do + content = get_field(cng, :content) - with nil <- get_field(cng, :context), - %Object{data: %{"context" => context}} <- Object.get_cached_by_ap_id(object) do + if Emoji.is_unicode_emoji?(content) || matches_shortcode?(content) do cng - |> put_change(:context, context) else - _ -> - cng + cng + |> add_error(:content, "is not a valid emoji") end end - def validate_emoji(cng) do + defp maybe_validate_tag_presence(cng) do content = get_field(cng, :content) - if Pleroma.Emoji.is_unicode_emoji?(content) do + if Emoji.is_unicode_emoji?(content) do cng else - cng - |> add_error(:content, "must be a single character emoji") + tag = get_field(cng, :tag) + emoji_name = Emoji.stripped_name(content) + case tag do + [%{name: ^emoji_name, type: "Emoji", icon: %{url: _}}] -> + cng + _ -> + cng + |> add_error(:tag, "does not contain an Emoji tag") + end end end @@ -77,5 +113,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do |> validate_actor_presence() |> validate_object_presence() |> validate_emoji() + |> maybe_validate_tag_presence() end end