New mix tasks for controlling user confirmation status and sending confirmation mails
[akkoma] / lib / pleroma / web / activity_pub / object_validators / attachment_validator.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do
6 use Ecto.Schema
7
8 alias Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator
9
10 import Ecto.Changeset
11
12 @primary_key false
13 embedded_schema do
14 field(:type, :string)
15 field(:mediaType, :string, default: "application/octet-stream")
16 field(:name, :string)
17
18 embeds_many(:url, UrlObjectValidator)
19 end
20
21 def cast_and_validate(data) do
22 data
23 |> cast_data()
24 |> validate_data()
25 end
26
27 def cast_data(data) do
28 %__MODULE__{}
29 |> changeset(data)
30 end
31
32 def changeset(struct, data) do
33 data =
34 data
35 |> fix_media_type()
36 |> fix_url()
37
38 struct
39 |> cast(data, [:type, :mediaType, :name])
40 |> cast_embed(:url, required: true)
41 end
42
43 def fix_media_type(data) do
44 data = Map.put_new(data, "mediaType", data["mimeType"])
45
46 if MIME.valid?(data["mediaType"]) do
47 data
48 else
49 Map.put(data, "mediaType", "application/octet-stream")
50 end
51 end
52
53 defp handle_href(href, mediaType) do
54 [
55 %{
56 "href" => href,
57 "type" => "Link",
58 "mediaType" => mediaType
59 }
60 ]
61 end
62
63 defp fix_url(data) do
64 cond do
65 is_binary(data["url"]) ->
66 Map.put(data, "url", handle_href(data["url"], data["mediaType"]))
67
68 is_binary(data["href"]) and data["url"] == nil ->
69 Map.put(data, "url", handle_href(data["href"], data["mediaType"]))
70
71 true ->
72 data
73 end
74 end
75
76 def validate_data(cng) do
77 cng
78 |> validate_required([:mediaType, :url, :type])
79 end
80 end