From 0ffad24e2d66a98e0fae768d754d3670425b6412 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Mon, 3 Feb 2020 21:31:59 +0300 Subject: [PATCH] added web domain to use in webfinger --- config/test.exs | 3 +- lib/pleroma/web/activity_pub/publisher.ex | 3 +- lib/pleroma/web/web.ex | 25 ++- lib/pleroma/web/web_finger/web_finger.ex | 22 +-- .../web_finger/web_finger_controller_test.exs | 149 +++++++++++++----- 5 files changed, 148 insertions(+), 54 deletions(-) diff --git a/config/test.exs b/config/test.exs index 5c66a36f1..e48a8df5a 100644 --- a/config/test.exs +++ b/config/test.exs @@ -3,8 +3,9 @@ # We don't run a server during test. If one is required, # you can enable the server option below. config :pleroma, Pleroma.Web.Endpoint, + web_endpoint: nil, http: [port: 4001], - url: [port: 4001], + url: [host: "localhost", port: 4001], server: true # Disable captha for tests diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index e4e3ab44a..eb6b8899d 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User + alias Pleroma.Web alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Transmogrifier @@ -267,7 +268,7 @@ def gather_webfinger_links(%User{} = user) do }, %{ "rel" => "http://ostatus.org/schema/1.0/subscribe", - "template" => "#{Pleroma.Web.base_url()}/ostatus_subscribe?acct={uri}" + "template" => Web.web_url(%{path: "/ostatus_subscribe", query: "acct={uri}"}) } ] end diff --git a/lib/pleroma/web/web.ex b/lib/pleroma/web/web.ex index 687346554..5fc24b285 100644 --- a/lib/pleroma/web/web.ex +++ b/lib/pleroma/web/web.ex @@ -20,6 +20,8 @@ defmodule Pleroma.Web do below. """ + alias Pleroma.Web.Endpoint + def controller do quote do use Phoenix.Controller, namespace: Pleroma.Web @@ -103,7 +105,26 @@ defmacro __using__(which) when is_atom(which) do apply(__MODULE__, which, []) end - def base_url do - Pleroma.Web.Endpoint.url() + def base_url, do: Endpoint.url() + + def web_url(map \\ %{}) do + Pleroma.Web.web_endpoint() + |> URI.parse() + |> Map.merge(map) + |> URI.to_string() + end + + def web_endpoint do + Pleroma.Config.get([Endpoint, :web_endpoint], Endpoint.url()) + end + + def web_host do + Pleroma.Web.web_endpoint() + |> URI.parse() + |> Map.get(:host) + end + + def domains do + Enum.uniq([Pleroma.Web.web_host(), Pleroma.Web.Endpoint.host()]) end end diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex index b4cc80179..0b644c57f 100644 --- a/lib/pleroma/web/web_finger/web_finger.ex +++ b/lib/pleroma/web/web_finger/web_finger.ex @@ -13,8 +13,6 @@ defmodule Pleroma.Web.WebFinger do require Logger def host_meta do - base_url = Web.base_url() - { :XRD, %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"}, @@ -23,7 +21,7 @@ def host_meta do %{ rel: "lrdd", type: "application/xrd+xml", - template: "#{base_url}/.well-known/webfinger?resource={uri}" + template: Web.web_url(%{path: "/.well-known/webfinger", query: "resource={uri}"}) } } } @@ -31,8 +29,8 @@ def host_meta do end def webfinger(resource, fmt) when fmt in ["XML", "JSON"] do - host = Pleroma.Web.Endpoint.host() - regex = ~r/(acct:)?(?[a-z0-9A-Z_\.-]+)@#{host}/ + hosts = Enum.join(Pleroma.Web.domains(), "|") + regex = ~r/(acct:)?(?[a-z0-9A-Z_\.-]+)@(#{hosts})/ with %{"username" => username} <- Regex.named_captures(regex, resource), %User{} = user <- User.get_cached_by_nickname(username) do @@ -62,7 +60,7 @@ def represent_user(user, "JSON") do {:ok, user} = User.ensure_keys_present(user) %{ - "subject" => "acct:#{user.nickname}@#{Pleroma.Web.Endpoint.host()}", + "subject" => acct_uri(user), "aliases" => [user.ap_id], "links" => gather_links(user) } @@ -72,20 +70,22 @@ def represent_user(user, "XML") do {:ok, user} = User.ensure_keys_present(user) links = - gather_links(user) + user + |> gather_links() |> Enum.map(fn link -> {:Link, link} end) { :XRD, %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"}, - [ - {:Subject, "acct:#{user.nickname}@#{Pleroma.Web.Endpoint.host()}"}, - {:Alias, user.ap_id} - ] ++ links + [{:Subject, acct_uri(user)}, {:Alias, user.ap_id}] ++ links } |> XmlBuilder.to_doc() end + defp acct_uri(%User{nickname: nickname}) do + "acct:#{nickname}@#{Pleroma.Web.web_host()}" + end + defp get_magic_key("data:application/magic-public-key," <> magic_key) do {:ok, magic_key} end diff --git a/test/web/web_finger/web_finger_controller_test.exs b/test/web/web_finger/web_finger_controller_test.exs index 49cd1460b..c36f93419 100644 --- a/test/web/web_finger/web_finger_controller_test.exs +++ b/test/web/web_finger/web_finger_controller_test.exs @@ -8,69 +8,140 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do import ExUnit.CaptureLog import Pleroma.Factory import Tesla.Mock + import SweetXml setup do mock(fn env -> apply(HttpRequestMock, :request, [env]) end) :ok end + clear_config([Pleroma.Web.Endpoint, :web_endpoint]) + clear_config_all([:instance, :federating]) do Pleroma.Config.put([:instance, :federating], true) end - test "GET host-meta" do - response = - build_conn() - |> get("/.well-known/host-meta") + describe "GET /.well-known/host-meta" do + test "host-meta for set subdomain" do + Pleroma.Config.put([Pleroma.Web.Endpoint, :web_endpoint], "http://pleroma.localhost") - assert response.status == 200 + response = + build_conn() + |> get("/.well-known/host-meta") - assert response.resp_body == - ~s() + assert response.status == 200 + + assert response.resp_body == + ~s() + end + + test "host-meta for domain" do + response = + build_conn() + |> get("/.well-known/host-meta") + + assert response.status == 200 + + assert response.resp_body == + ~s() + end end - test "Webfinger JRD" do - user = insert(:user) + describe "Webfinger JRD" do + test "main domain" do + user = insert(:user) - response = - build_conn() - |> put_req_header("accept", "application/jrd+json") - |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost") + response = + build_conn() + |> put_req_header("accept", "application/jrd+json") + |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost") - assert json_response(response, 200)["subject"] == "acct:#{user.nickname}@localhost" + assert json_response(response, 200)["subject"] == "acct:#{user.nickname}@localhost" + end + + test "for subdomain" do + Pleroma.Config.put([Pleroma.Web.Endpoint, :web_endpoint], "http://pleroma.localhost") + user = insert(:user) + + response = + build_conn() + |> put_req_header("accept", "application/jrd+json") + |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@pleroma.localhost") + |> json_response(200) + + assert response["subject"] == "acct:#{user.nickname}@pleroma.localhost" + assert response["aliases"] == [user.ap_id] + + assert response["links"] == [ + %{ + "href" => user.ap_id, + "rel" => "http://webfinger.net/rel/profile-page", + "type" => "text/html" + }, + %{"href" => user.ap_id, "rel" => "self", "type" => "application/activity+json"}, + %{ + "href" => user.ap_id, + "rel" => "self", + "type" => + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" + }, + %{ + "rel" => "http://ostatus.org/schema/1.0/subscribe", + "template" => "http://pleroma.localhost/ostatus_subscribe?acct={uri}" + } + ] + end + + test "it returns 404 when user isn't found (JSON)" do + result = + build_conn() + |> put_req_header("accept", "application/jrd+json") + |> get("/.well-known/webfinger?resource=acct:jimm@localhost") + |> json_response(404) + + assert result == "Couldn't find user" + end end - test "it returns 404 when user isn't found (JSON)" do - result = - build_conn() - |> put_req_header("accept", "application/jrd+json") - |> get("/.well-known/webfinger?resource=acct:jimm@localhost") - |> json_response(404) + describe "webfinger XML" do + test "for subdomain" do + Pleroma.Config.put([Pleroma.Web.Endpoint, :web_endpoint], "http://pleroma.localhost") + user = insert(:user) - assert result == "Couldn't find user" - end + response = + build_conn() + |> put_req_header("accept", "application/xrd+xml") + |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@pleroma.localhost") + |> response(200) + |> parse() - test "Webfinger XML" do - user = insert(:user) + assert xpath(response, ~x"//Subject/text()"s) == "acct:#{user.nickname}@pleroma.localhost" + end - response = - build_conn() - |> put_req_header("accept", "application/xrd+xml") - |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost") + test "for main domain" do + user = insert(:user) - assert response(response, 200) - end + response = + build_conn() + |> put_req_header("accept", "application/xrd+xml") + |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost") + |> response(200) + |> parse() - test "it returns 404 when user isn't found (XML)" do - result = - build_conn() - |> put_req_header("accept", "application/xrd+xml") - |> get("/.well-known/webfinger?resource=acct:jimm@localhost") - |> response(404) + assert xpath(response, ~x"//Subject/text()"s) == "acct:#{user.nickname}@localhost" + end - assert result == "Couldn't find user" + test "it returns 404 when user isn't found (XML)" do + result = + build_conn() + |> put_req_header("accept", "application/xrd+xml") + |> get("/.well-known/webfinger?resource=acct:jimm@localhost") + |> response(404) + + assert result == "Couldn't find user" + end end test "Sends a 404 when invalid format" do