pleroma/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex

121 lines
2.9 KiB
Elixir
Raw Normal View History

2020-08-17 18:48:42 -05:00
# Pleroma: A lightweight social networking server
2022-02-26 00:11:42 -06:00
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
2020-08-17 18:48:42 -05:00
# SPDX-License-Identifier: AGPL-3.0-only
2020-08-19 19:00:04 -05:00
defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator do
2020-08-17 18:48:42 -05:00
use Ecto.Schema
alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes
2020-08-17 18:48:42 -05:00
alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
alias Pleroma.Web.ActivityPub.Transmogrifier
2020-08-17 18:48:42 -05:00
import Ecto.Changeset
@primary_key false
@derive Jason.Encoder
embedded_schema do
quote do
unquote do
import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
message_fields()
object_fields()
status_object_fields()
end
end
2020-08-17 18:48:42 -05:00
end
def cast_and_apply(data) do
data
|> cast_data
|> apply_action(:insert)
end
def cast_and_validate(data) do
data
|> cast_data()
|> validate_data()
end
def cast_data(data) do
%__MODULE__{}
|> changeset(data)
end
defp find_attachment(url) do
mpeg_url =
Enum.find(url, fn
%{"mediaType" => mime_type, "tag" => tags} when is_list(tags) ->
mime_type == "application/x-mpegURL"
2020-08-19 19:00:04 -05:00
_ ->
false
2020-08-19 19:00:04 -05:00
end)
2020-08-18 17:05:48 -05:00
url
|> Enum.concat(mpeg_url["tag"] || [])
|> Enum.find(fn
%{"mediaType" => mime_type} -> String.starts_with?(mime_type, ["video/", "audio/"])
%{"mimeType" => mime_type} -> String.starts_with?(mime_type, ["video/", "audio/"])
_ -> false
end)
end
2020-08-19 19:00:04 -05:00
defp fix_url(%{"url" => url} = data) when is_list(url) do
attachment = find_attachment(url)
link_element =
Enum.find(url, fn
%{"mediaType" => "text/html"} -> true
%{"mimeType" => "text/html"} -> true
_ -> false
2020-08-19 19:00:04 -05:00
end)
2020-08-18 17:05:48 -05:00
data
|> Map.put("attachment", [attachment])
|> Map.put("url", link_element["href"])
end
defp fix_url(data), do: data
2020-08-19 19:00:04 -05:00
defp fix_content(%{"mediaType" => "text/markdown", "content" => content} = data)
when is_binary(content) do
content =
content
2020-10-13 14:27:50 -05:00
|> Pleroma.Formatter.markdown_to_html()
2020-08-19 19:00:04 -05:00
|> Pleroma.HTML.filter_tags()
Map.put(data, "content", content)
end
defp fix_content(data), do: data
2020-08-17 18:48:42 -05:00
defp fix(data) do
data
2020-08-19 19:00:04 -05:00
|> CommonFixes.fix_actor()
|> CommonFixes.fix_object_defaults()
|> Transmogrifier.fix_emoji()
2020-08-18 17:05:48 -05:00
|> fix_url()
2020-08-19 19:00:04 -05:00
|> fix_content()
2020-08-17 18:48:42 -05:00
end
def changeset(struct, data) do
data = fix(data)
struct
2021-01-07 11:23:01 -06:00
|> cast(data, __schema__(:fields) -- [:attachment, :tag])
|> cast_embed(:attachment, required: true)
2021-01-07 11:23:01 -06:00
|> cast_embed(:tag)
2020-08-17 18:48:42 -05:00
end
defp validate_data(data_cng) do
2020-08-17 18:48:42 -05:00
data_cng
2020-08-19 19:00:04 -05:00
|> validate_inclusion(:type, ["Audio", "Video"])
|> validate_required([:id, :actor, :attributedTo, :type, :context])
2020-08-17 18:48:42 -05:00
|> CommonValidations.validate_any_presence([:cc, :to])
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|> CommonValidations.validate_actor_presence()
|> CommonValidations.validate_host_match()
end
end