recipients fixes/hardening for CreateGenericValidator
[akkoma] / lib / pleroma / ecto_type / activity_pub / object_validators / recipients.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.Recipients do
6 use Ecto.Type
7
8 alias Pleroma.EctoType.ActivityPub.ObjectValidators.ObjectID
9
10 def type, do: {:array, ObjectID}
11
12 def cast(object) when is_binary(object) do
13 cast([object])
14 end
15
16 def cast(object) when is_map(object) do
17 case ObjectID.cast(object) do
18 {:ok, data} -> {:ok, [data]}
19 _ -> :error
20 end
21 end
22
23 def cast(data) when is_list(data) do
24 data =
25 data
26 |> Enum.reduce_while([], fn element, list ->
27 case ObjectID.cast(element) do
28 {:ok, id} ->
29 {:cont, [id | list]}
30
31 _ ->
32 {:cont, list}
33 end
34 end)
35 |> Enum.sort()
36 |> Enum.uniq()
37
38 {:ok, data}
39 end
40
41 def cast(data) do
42 {:error, data}
43 end
44
45 def dump(data) do
46 {:ok, data}
47 end
48
49 def load(data) do
50 {:ok, data}
51 end
52 end