diff --git a/lib/service/web_finger/web_finger.ex b/lib/service/web_finger/web_finger.ex index 83e0d0662..36d62014b 100644 --- a/lib/service/web_finger/web_finger.ex +++ b/lib/service/web_finger/web_finger.ex @@ -33,29 +33,32 @@ defmodule Mobilizon.Service.WebFinger do regex = ~r/(acct:)?(?\w+)@#{host}/ with %{"name" => name} <- Regex.named_captures(regex, resource) do - user = Actors.get_local_actor_by_name(name) - {:ok, represent_user(user, "JSON")} + actor = Actors.get_local_actor_by_name(name) + {:ok, represent_actor(actor, "JSON")} else _e -> - with user when not is_nil(user) <- Actors.get_actor_by_url!(resource) do - {:ok, represent_user(user, "JSON")} + with actor when not is_nil(actor) <- Actors.get_actor_by_url!(resource) do + {:ok, represent_actor(actor, "JSON")} else _e -> - {:error, "Couldn't find user"} + {:error, "Couldn't find actor"} end end end - def represent_user(user, "JSON") do + @spec represent_actor(Actor.t()) :: struct() + def represent_actor(actor), do: represent_actor(actor, "JSON") + + def represent_actor(actor, "JSON") do %{ - "subject" => "acct:#{user.preferred_username}@#{MobilizonWeb.Endpoint.host()}", - "aliases" => [user.url], + "subject" => "acct:#{actor.preferred_username}@#{MobilizonWeb.Endpoint.host()}", + "aliases" => [actor.url], "links" => [ - %{"rel" => "self", "type" => "application/activity+json", "href" => user.url}, + %{"rel" => "self", "type" => "application/activity+json", "href" => actor.url}, %{ "rel" => "https://webfinger.net/rel/profile-page/", "type" => "text/html", - "href" => user.url + "href" => actor.url } ] } diff --git a/test/mobilizon_web/controllers/webfinger_controller_test.exs b/test/mobilizon_web/controllers/webfinger_controller_test.exs new file mode 100644 index 000000000..da2096112 --- /dev/null +++ b/test/mobilizon_web/controllers/webfinger_controller_test.exs @@ -0,0 +1,28 @@ +defmodule MobilizonWeb.WebFingerTest do + use MobilizonWeb.ConnCase + alias Mobilizon.Actors.Actor + alias Mobilizon.Service.WebFinger + import Mobilizon.Factory + + test "GET /.well-known/host-meta", %{conn: conn} do + conn = get(conn, "/.well-known/host-meta") + + assert response(conn, 200) == + "" + + assert {"content-type", "application/xrd+xml; charset=utf-8"} in conn.resp_headers + end + + test "GET /.well-known/webfinger with local actor", %{conn: conn} do + %Actor{preferred_username: username} = actor = insert(:actor) + conn = get(conn, "/.well-known/webfinger?resource=acct:#{username}@localhost:4001") + assert json_response(conn, 200) == WebFinger.represent_actor(actor) + end + + test "GET /.well-known/webfinger with no query", %{conn: conn} do + conn = get(conn, "/.well-known/webfinger") + assert response(conn, 400) == "No query provided" + end +end