Merge pull request 'don't crash on malformed avatar and banner values' (#506) from...
authorfloatingghost <hannah@coffee-and-dreams.uk>
Mon, 13 Mar 2023 00:28:16 +0000 (00:28 +0000)
committerfloatingghost <hannah@coffee-and-dreams.uk>
Mon, 13 Mar 2023 00:28:16 +0000 (00:28 +0000)
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/506

lib/pleroma/user.ex
test/pleroma/user_test.exs

index f94202af5df22510d19f30fb73a5133ae923e9c7..48052198489faeac2338782b1b4b8db76757690a 100644 (file)
@@ -366,21 +366,21 @@ defmodule Pleroma.User do
   def invisible?(_), do: false
 
   def avatar_url(user, options \\ []) do
-    case user.avatar do
-      %{"url" => [%{"href" => href} | _]} ->
-        href
-
-      _ ->
-        unless options[:no_default] do
-          Config.get([:assets, :default_user_avatar], "#{Endpoint.url()}/images/avi.png")
-        end
-    end
+    default = Config.get([:assets, :default_user_avatar], "#{Endpoint.url()}/images/avi.png")
+    do_optional_url(user.avatar, default, options)
   end
 
   def banner_url(user, options \\ []) do
-    case user.banner do
-      %{"url" => [%{"href" => href} | _]} -> href
-      _ -> !options[:no_default] && "#{Endpoint.url()}/images/banner.png"
+    do_optional_url(user.banner, "#{Endpoint.url()}/images/banner.png", options)
+  end
+
+  defp do_optional_url(field, default, options \\ []) do
+    case field do
+      %{"url" => [%{"href" => href} | _]} when is_binary(href) ->
+        href
+
+      _ ->
+        unless options[:no_default], do: default
     end
   end
 
index a590946c215ea2d3781b75b76ec1028a50945923..12ccc6bf4aa3a2c207f1fa1703ceaa97f695551c 100644 (file)
@@ -2509,6 +2509,16 @@ defmodule Pleroma.UserTest do
     assert User.avatar_url(user, no_default: true) == nil
   end
 
+  test "avatar object with nil in href" do
+    user = insert(:user, avatar: %{"url" => [%{"href" => nil}]})
+    assert User.avatar_url(user) != nil
+  end
+
+  test "banner object with nil in href" do
+    user = insert(:user, banner: %{"url" => [%{"href" => nil}]})
+    assert User.banner_url(user) != nil
+  end
+
   test "get_host/1" do
     user = insert(:user, ap_id: "https://lain.com/users/lain", nickname: "lain")
     assert User.get_host(user) == "lain.com"