Handle webfinger JSON data being invalid format

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2022-04-20 11:35:22 +02:00
parent 0ebb797740
commit 28f5cdd03a
No known key found for this signature in database
GPG Key ID: A061B9DDE0CA0773
1 changed files with 29 additions and 18 deletions

View File

@ -129,6 +129,7 @@ defmodule Mobilizon.Federation.WebFinger do
| :address_invalid | :address_invalid
| :http_error | :http_error
| :webfinger_information_not_json | :webfinger_information_not_json
| :webfinger_information_not_valid
| :no_url_in_webfinger_data | :no_url_in_webfinger_data
@doc """ @doc """
@ -164,7 +165,9 @@ defmodule Mobilizon.Federation.WebFinger do
end end
@spec fetch_webfinger_data(String.t()) :: @spec fetch_webfinger_data(String.t()) ::
{:ok, map()} | {:error, :webfinger_information_not_json | :http_error} {:ok, map()}
| {:error,
:webfinger_information_not_json | :webfinger_information_not_valid | :http_error}
defp fetch_webfinger_data(address) do defp fetch_webfinger_data(address) do
Logger.debug("Calling WebfingerClient with #{inspect(address)}") Logger.debug("Calling WebfingerClient with #{inspect(address)}")
@ -243,28 +246,36 @@ defmodule Mobilizon.Federation.WebFinger do
end end
@spec webfinger_from_json(map() | String.t()) :: @spec webfinger_from_json(map() | String.t()) ::
{:ok, map()} | {:error, :webfinger_information_not_json} {:ok, map()}
| {:error, :webfinger_information_not_json | :webfinger_information_not_valid}
defp webfinger_from_json(doc) when is_map(doc) do defp webfinger_from_json(doc) when is_map(doc) do
data = links = Map.get(doc, "links")
Enum.reduce(doc["links"], %{"subject" => doc["subject"]}, fn link, data -> subject = Map.get(doc, "subject")
case {link["type"], link["rel"]} do
{"application/activity+json", "self"} ->
Map.put(data, "url", link["href"])
{nil, _rel} -> if !is_nil(links) && !is_nil(subject) do
Logger.debug("No type declared for the following link #{inspect(link)}") data =
data Enum.reduce(links, %{"subject" => subject}, fn link, data ->
case {link["type"], link["rel"]} do
{"application/activity+json", "self"} ->
Map.put(data, "url", link["href"])
_ -> {nil, _rel} ->
Logger.debug(fn -> Logger.debug("No type declared for the following link #{inspect(link)}")
"Unhandled type to finger: #{inspect(link["type"])}" data
end)
data _ ->
end Logger.debug(fn ->
end) "Unhandled type to finger: #{inspect(link)}"
end)
{:ok, data} data
end
end)
{:ok, data}
else
{:error, :webfinger_information_not_valid}
end
end end
defp webfinger_from_json(_doc), do: {:error, :webfinger_information_not_json} defp webfinger_from_json(_doc), do: {:error, :webfinger_information_not_json}