Emoji reactions: Add sanity checks for the cache
authorlain <lain@soykaf.club>
Thu, 23 Jan 2020 11:34:34 +0000 (12:34 +0100)
committerlain <lain@soykaf.club>
Thu, 23 Jan 2020 11:34:34 +0000 (12:34 +0100)
lib/pleroma/web/activity_pub/utils.ex
test/web/activity_pub/utils_test.exs

index 4def431f152518fdcb0f0d6880f1db42dce5742b..4f7fdaf38a1796d00b5bfb6480f9bab5e7107b97 100644 (file)
@@ -337,7 +337,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
         %Activity{data: %{"content" => emoji, "actor" => actor}},
         object
       ) do
-    reactions = object.data["reactions"] || []
+    reactions = get_cached_emoji_reactions(object)
 
     new_reactions =
       case Enum.find_index(reactions, fn [candidate, _] -> emoji == candidate end) do
@@ -365,7 +365,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
         %Activity{data: %{"content" => emoji, "actor" => actor}},
         object
       ) do
-    reactions = object.data["reactions"] || []
+    reactions = get_cached_emoji_reactions(object)
 
     new_reactions =
       case Enum.find_index(reactions, fn [candidate, _] -> emoji == candidate end) do
@@ -385,6 +385,14 @@ defmodule Pleroma.Web.ActivityPub.Utils do
     update_element_in_object("reaction", new_reactions, object, count)
   end
 
+  def get_cached_emoji_reactions(object) do
+    if is_list(object.data["reactions"]) do
+      object.data["reactions"]
+    else
+      []
+    end
+  end
+
   @spec add_like_to_object(Activity.t(), Object.t()) ::
           {:ok, Object.t()} | {:error, Ecto.Changeset.t()}
   def add_like_to_object(%Activity{data: %{"actor" => actor}}, object) do
index 586eb1d2f902bf11b83e9be7d2d2af942f68aa5d..211fa6c95ca1cc8b11649b3c2b07355ca64ba0e4 100644 (file)
@@ -636,4 +636,17 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do
       assert updated_object.data["announcement_count"] == 1
     end
   end
+
+  describe "get_cached_emoji_reactions/1" do
+    test "returns the data or an emtpy list" do
+      object = insert(:note)
+      assert Utils.get_cached_emoji_reactions(object) == []
+
+      object = insert(:note, data: %{"reactions" => [["x", ["lain"]]]})
+      assert Utils.get_cached_emoji_reactions(object) == [["x", ["lain"]]]
+
+      object = insert(:note, data: %{"reactions" => %{}})
+      assert Utils.get_cached_emoji_reactions(object) == []
+    end
+  end
 end