From 906cf53ab94742327d073f56255f695c91339295 Mon Sep 17 00:00:00 2001
From: lain <lain@soykaf.club>
Date: Tue, 28 Apr 2020 13:38:02 +0200
Subject: [PATCH] Recipient Type: Cast all elements as ObjectIDs.

---
 .../object_validators/types/recipients.ex         | 15 +++++++++++++--
 .../object_validators/types/recipients_test.exs   | 12 ++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex
index 5a3040842..48fe61e1a 100644
--- a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex
@@ -1,13 +1,24 @@
 defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients do
   use Ecto.Type
 
-  def type, do: {:array, :string}
+  alias Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID
+
+  def type, do: {:array, ObjectID}
 
   def cast(object) when is_binary(object) do
     cast([object])
   end
 
-  def cast([_ | _] = data), do: {:ok, data}
+  def cast(data) when is_list(data) do
+    data
+    |> Enum.reduce({:ok, []}, fn element, acc ->
+      case {acc, ObjectID.cast(element)} do
+        {:error, _} -> :error
+        {_, :error} -> :error
+        {{:ok, list}, {:ok, id}} -> {:ok, [id | list]}
+      end
+    end)
+  end
 
   def cast(_) do
     :error
diff --git a/test/web/activity_pub/object_validators/types/recipients_test.exs b/test/web/activity_pub/object_validators/types/recipients_test.exs
index 2f9218774..f278f039b 100644
--- a/test/web/activity_pub/object_validators/types/recipients_test.exs
+++ b/test/web/activity_pub/object_validators/types/recipients_test.exs
@@ -2,11 +2,23 @@ defmodule Pleroma.Web.ObjectValidators.Types.RecipientsTest do
   alias Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients
   use Pleroma.DataCase
 
+  test "it asserts that all elements of the list are object ids" do
+    list = ["https://lain.com/users/lain", "invalid"]
+
+    assert :error == Recipients.cast(list)
+  end
+
   test "it works with a list" do
     list = ["https://lain.com/users/lain"]
     assert {:ok, list} == Recipients.cast(list)
   end
 
+  test "it works with a list with whole objects" do
+    list = ["https://lain.com/users/lain", %{"id" => "https://gensokyo.2hu/users/raymoo"}]
+    resulting_list = ["https://gensokyo.2hu/users/raymoo", "https://lain.com/users/lain"]
+    assert {:ok, resulting_list} == Recipients.cast(list)
+  end
+
   test "it turns a single string into a list" do
     recipient = "https://lain.com/users/lain"
 
-- 
2.49.0