+
+ @known_suffixes ["/publickey", "/main-key"]
+
+ def key_id_to_actor_id(key_id) do
+ uri =
+ key_id
+ |> URI.parse()
+ |> Map.put(:fragment, nil)
+ |> remove_suffix(@known_suffixes)
+
+ maybe_ap_id = URI.to_string(uri)
+
+ case ObjectValidators.ObjectID.cast(maybe_ap_id) do
+ {:ok, ap_id} ->
+ {:ok, ap_id}
+
+ _ ->
+ case Pleroma.Web.WebFinger.finger(maybe_ap_id) do
+ {:ok, %{"ap_id" => ap_id}} -> {:ok, ap_id}
+ _ -> {:error, maybe_ap_id}
+ end
+ end
+ end
+
+ defp remove_suffix(uri, [test | rest]) do
+ if not is_nil(uri.path) and String.ends_with?(uri.path, test) do
+ Map.put(uri, :path, String.replace(uri.path, test, ""))
+ else
+ remove_suffix(uri, rest)
+ end
+ end
+
+ defp remove_suffix(uri, []), do: uri