added web domain to use in webfinger
This commit is contained in:
parent
c27d1d65bf
commit
0ffad24e2d
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:)?(?<username>[a-z0-9A-Z_\.-]+)@#{host}/
|
||||
hosts = Enum.join(Pleroma.Web.domains(), "|")
|
||||
regex = ~r/(acct:)?(?<username>[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
|
||||
|
|
|
@ -8,17 +8,34 @@ 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
|
||||
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")
|
||||
|
||||
response =
|
||||
build_conn()
|
||||
|> get("/.well-known/host-meta")
|
||||
|
||||
assert response.status == 200
|
||||
|
||||
assert response.resp_body ==
|
||||
~s(<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><Link rel="lrdd" template="http://pleroma.localhost/.well-known/webfinger?resource={uri}" type="application/xrd+xml" /></XRD>)
|
||||
end
|
||||
|
||||
test "host-meta for domain" do
|
||||
response =
|
||||
build_conn()
|
||||
|> get("/.well-known/host-meta")
|
||||
|
@ -27,11 +44,13 @@ test "GET host-meta" do
|
|||
|
||||
assert response.resp_body ==
|
||||
~s(<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><Link rel="lrdd" template="#{
|
||||
Pleroma.Web.base_url()
|
||||
Pleroma.Web.web_url()
|
||||
}/.well-known/webfinger?resource={uri}" type="application/xrd+xml" /></XRD>)
|
||||
end
|
||||
end
|
||||
|
||||
test "Webfinger JRD" do
|
||||
describe "Webfinger JRD" do
|
||||
test "main domain" do
|
||||
user = insert(:user)
|
||||
|
||||
response =
|
||||
|
@ -42,6 +61,39 @@ test "Webfinger JRD" do
|
|||
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()
|
||||
|
@ -51,16 +103,34 @@ test "it returns 404 when user isn't found (JSON)" do
|
|||
|
||||
assert result == "Couldn't find user"
|
||||
end
|
||||
end
|
||||
|
||||
test "Webfinger XML" do
|
||||
describe "webfinger XML" do
|
||||
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/xrd+xml")
|
||||
|> get("/.well-known/webfinger?resource=acct:#{user.nickname}@pleroma.localhost")
|
||||
|> response(200)
|
||||
|> parse()
|
||||
|
||||
assert xpath(response, ~x"//Subject/text()"s) == "acct:#{user.nickname}@pleroma.localhost"
|
||||
end
|
||||
|
||||
test "for main domain" do
|
||||
user = insert(:user)
|
||||
|
||||
response =
|
||||
build_conn()
|
||||
|> put_req_header("accept", "application/xrd+xml")
|
||||
|> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
|
||||
|> response(200)
|
||||
|> parse()
|
||||
|
||||
assert response(response, 200)
|
||||
assert xpath(response, ~x"//Subject/text()"s) == "acct:#{user.nickname}@localhost"
|
||||
end
|
||||
|
||||
test "it returns 404 when user isn't found (XML)" do
|
||||
|
@ -72,6 +142,7 @@ test "it returns 404 when user isn't found (XML)" do
|
|||
|
||||
assert result == "Couldn't find user"
|
||||
end
|
||||
end
|
||||
|
||||
test "Sends a 404 when invalid format" do
|
||||
user = insert(:user)
|
||||
|
|
Loading…
Reference in New Issue