Do not crash when remote user follower and following counters are hidden
This commit is contained in:
		
							parent
							
								
									d23a80e691
								
							
						
					
					
						commit
						432b3067d4
					
				
					 2 changed files with 54 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -1298,28 +1298,26 @@ defp object_to_user_data(data) do
 | 
			
		|||
  def fetch_follow_information_for_user(user) do
 | 
			
		||||
    with {:ok, following_data} <-
 | 
			
		||||
           Fetcher.fetch_and_contain_remote_object_from_id(user.following_address),
 | 
			
		||||
         following_count when is_integer(following_count) <- following_data["totalItems"],
 | 
			
		||||
         {:ok, hide_follows} <- collection_private(following_data),
 | 
			
		||||
         {:ok, followers_data} <-
 | 
			
		||||
           Fetcher.fetch_and_contain_remote_object_from_id(user.follower_address),
 | 
			
		||||
         followers_count when is_integer(followers_count) <- followers_data["totalItems"],
 | 
			
		||||
         {:ok, hide_followers} <- collection_private(followers_data) do
 | 
			
		||||
      {:ok,
 | 
			
		||||
       %{
 | 
			
		||||
         hide_follows: hide_follows,
 | 
			
		||||
         follower_count: followers_count,
 | 
			
		||||
         following_count: following_count,
 | 
			
		||||
         follower_count: normalize_counter(followers_data["totalItems"]),
 | 
			
		||||
         following_count: normalize_counter(following_data["totalItems"]),
 | 
			
		||||
         hide_followers: hide_followers
 | 
			
		||||
       }}
 | 
			
		||||
    else
 | 
			
		||||
      {:error, _} = e ->
 | 
			
		||||
        e
 | 
			
		||||
 | 
			
		||||
      e ->
 | 
			
		||||
        {:error, e}
 | 
			
		||||
      {:error, _} = e -> e
 | 
			
		||||
      e -> {:error, e}
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp normalize_counter(counter) when is_integer(counter), do: counter
 | 
			
		||||
  defp normalize_counter(_), do: 0
 | 
			
		||||
 | 
			
		||||
  defp maybe_update_follow_information(data) do
 | 
			
		||||
    with {:enabled, true} <-
 | 
			
		||||
           {:enabled, Pleroma.Config.get([:instance, :external_user_synchronization])},
 | 
			
		||||
| 
						 | 
				
			
			@ -1339,24 +1337,18 @@ defp maybe_update_follow_information(data) do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp collection_private(%{"first" => %{"type" => type}})
 | 
			
		||||
       when type in ["CollectionPage", "OrderedCollectionPage"],
 | 
			
		||||
       do: {:ok, false}
 | 
			
		||||
 | 
			
		||||
  defp collection_private(%{"first" => first}) do
 | 
			
		||||
    if is_map(first) and
 | 
			
		||||
         first["type"] in ["CollectionPage", "OrderedCollectionPage"] do
 | 
			
		||||
    with {:ok, %{"type" => type}} when type in ["CollectionPage", "OrderedCollectionPage"] <-
 | 
			
		||||
           Fetcher.fetch_and_contain_remote_object_from_id(first) do
 | 
			
		||||
      {:ok, false}
 | 
			
		||||
    else
 | 
			
		||||
      with {:ok, %{"type" => type}} when type in ["CollectionPage", "OrderedCollectionPage"] <-
 | 
			
		||||
             Fetcher.fetch_and_contain_remote_object_from_id(first) do
 | 
			
		||||
        {:ok, false}
 | 
			
		||||
      else
 | 
			
		||||
        {:error, {:ok, %{status: code}}} when code in [401, 403] ->
 | 
			
		||||
          {:ok, true}
 | 
			
		||||
 | 
			
		||||
        {:error, _} = e ->
 | 
			
		||||
          e
 | 
			
		||||
 | 
			
		||||
        e ->
 | 
			
		||||
          {:error, e}
 | 
			
		||||
      end
 | 
			
		||||
      {:error, {:ok, %{status: code}}} when code in [401, 403] -> {:ok, true}
 | 
			
		||||
      {:error, _} = e -> e
 | 
			
		||||
      e -> {:error, e}
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1623,6 +1623,44 @@ test "detects hidden follows/followers for friendica" do
 | 
			
		|||
      assert follow_info.following_count == 32
 | 
			
		||||
      assert follow_info.hide_follows == true
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "doesn't crash when follower and following counters are hidden" do
 | 
			
		||||
      mock(fn env ->
 | 
			
		||||
        case env.url do
 | 
			
		||||
          "http://localhost:4001/users/masto_hidden_counters/following" ->
 | 
			
		||||
            json(%{
 | 
			
		||||
              "@context" => "https://www.w3.org/ns/activitystreams",
 | 
			
		||||
              "id" => "http://localhost:4001/users/masto_hidden_counters/followers"
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
          "http://localhost:4001/users/masto_hidden_counters/following?page=1" ->
 | 
			
		||||
            %Tesla.Env{status: 403, body: ""}
 | 
			
		||||
 | 
			
		||||
          "http://localhost:4001/users/masto_hidden_counters/followers" ->
 | 
			
		||||
            json(%{
 | 
			
		||||
              "@context" => "https://www.w3.org/ns/activitystreams",
 | 
			
		||||
              "id" => "http://localhost:4001/users/masto_hidden_counters/following"
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
          "http://localhost:4001/users/masto_hidden_counters/followers?page=1" ->
 | 
			
		||||
            %Tesla.Env{status: 403, body: ""}
 | 
			
		||||
        end
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
      user =
 | 
			
		||||
        insert(:user,
 | 
			
		||||
          local: false,
 | 
			
		||||
          follower_address: "http://localhost:4001/users/masto_hidden_counters/followers",
 | 
			
		||||
          following_address: "http://localhost:4001/users/masto_hidden_counters/following"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
      {:ok, follow_info} = ActivityPub.fetch_follow_information_for_user(user)
 | 
			
		||||
 | 
			
		||||
      assert follow_info.hide_followers == true
 | 
			
		||||
      assert follow_info.follower_count == 0
 | 
			
		||||
      assert follow_info.hide_follows == true
 | 
			
		||||
      assert follow_info.following_count == 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe "fetch_favourites/3" do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue