object containment: handle all cases where ID is invalid (missing, nil, non-string)
authorAriadne Conill <ariadne@dereferenced.org>
Fri, 8 Nov 2019 20:51:28 +0000 (14:51 -0600)
committerAriadne Conill <ariadne@dereferenced.org>
Fri, 8 Nov 2019 20:51:28 +0000 (14:51 -0600)
lib/pleroma/object/containment.ex
test/object/containment_test.exs

index 68535c09e66ab962bcbcb5ce91a53303f48b6d0f..a1f9c1250b3248c41cc79bf39042bda7b0101143 100644 (file)
@@ -64,15 +64,15 @@ defmodule Pleroma.Object.Containment do
   def contain_origin(id, %{"attributedTo" => actor} = params),
     do: contain_origin(id, Map.put(params, "actor", actor))
 
-  def contain_origin_from_id(_id, %{"id" => nil}), do: :error
-
-  def contain_origin_from_id(id, %{"id" => other_id} = _params) do
+  def contain_origin_from_id(id, %{"id" => other_id} = _params) when is_binary(other_id) do
     id_uri = URI.parse(id)
     other_uri = URI.parse(other_id)
 
     compare_uris(id_uri, other_uri)
   end
 
+  def contain_origin_from_id(_id, _data), do: :error
+
   def contain_child(%{"object" => %{"id" => id, "attributedTo" => _} = object}),
     do: contain_origin(id, object)
 
index 0dc2728b9a0a44a70d7455171120d5f5a6a11ff2..71fe5204cbf634ce2ee96c04147df5fe5d99d900 100644 (file)
@@ -67,6 +67,20 @@ defmodule Pleroma.Object.ContainmentTest do
              end) =~
                "[error] Could not decode user at fetch https://n1u.moe/users/rye"
     end
+
+    test "contain_origin_from_id() gracefully handles cases where no ID is present" do
+      data = %{
+        "type" => "Create",
+        "object" => %{
+          "id" => "http://example.net/~alyssa/activities/1234",
+          "attributedTo" => "http://example.org/~alyssa"
+        },
+        "actor" => "http://example.com/~bob"
+      }
+
+      :error =
+        Containment.contain_origin_from_id("http://example.net/~alyssa/activities/1234", data)
+    end
   end
 
   describe "containment of children" do