defmodule Pleroma.Web.WebFinger do
- alias Pleroma.XmlBuilder
- alias Pleroma.{Repo, User}
+ @httpoison Application.get_env(:pleroma, :httpoison)
+
+ alias Pleroma.{Repo, User, XmlBuilder}
+ alias Pleroma.Web
alias Pleroma.Web.{XML, Salmon, OStatus}
require Logger
- def host_meta() do
- base_url = Pleroma.Web.base_url
+ def host_meta do
+ base_url = Web.base_url
{
- :XRD, %{ xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0" },
+ :XRD, %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"},
{
- :Link, %{ rel: "lrdd", type: "application/xrd+xml", template: "#{base_url}/.well-known/webfinger?resource={uri}" }
+ :Link, %{rel: "lrdd", type: "application/xrd+xml", template: "#{base_url}/.well-known/webfinger?resource={uri}"}
}
}
|> XmlBuilder.to_doc
end
def webfinger(resource) do
- host = Pleroma.Web.host
+ host = Pleroma.Web.Endpoint.host
regex = ~r/(acct:)?(?<username>\w+)@#{host}/
with %{"username" => username} <- Regex.named_captures(regex, resource) do
user = User.get_by_nickname(username)
{
:XRD, %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"},
[
- {:Subject, "acct:#{user.nickname}@#{Pleroma.Web.host}"},
+ {:Subject, "acct:#{user.nickname}@#{Pleroma.Web.Endpoint.host}"},
{:Alias, user.ap_id},
{:Link, %{rel: "http://schemas.google.com/g/2010#updates-from", type: "application/atom+xml", href: OStatus.feed_path(user)}},
{:Link, %{rel: "http://webfinger.net/rel/profile-page", type: "text/html", href: user.ap_id}},
subject = XML.string_from_xpath("//Subject", doc)
salmon = XML.string_from_xpath(~s{//Link[@rel="salmon"]/@href}, doc)
data = %{
- magic_key: magic_key,
- topic: topic,
- subject: subject,
- salmon: salmon
+ "magic_key" => magic_key,
+ "topic" => topic,
+ "subject" => subject,
+ "salmon" => salmon
}
{:ok, data}
end
- def finger(account, getter \\ &HTTPoison.get/3) do
+ def finger(account, getter \\ &@httpoison.get/3) do
domain = with [_name, domain] <- String.split(account, "@") do
domain
else _e ->
response = with {:ok, result} <- getter.("https:" <> address, ["Accept": "application/xrd+xml"], [params: [resource: account]]) do
{:ok, result}
else _ ->
- getter.("http:" <> address, ["Accept": "application/xrd+xml"], [params: [resource: account]])
+ getter.("http:" <> address, ["Accept": "application/xrd+xml"], [params: [resource: account], follow_redirect: true])
end
with {:ok, %{status_code: status_code, body: body}} when status_code in 200..299 <- response,
{:ok, data}
else
e ->
- Logger.debug("Couldn't finger #{account}.")
- Logger.debug(inspect(e))
+ Logger.debug(fn -> "Couldn't finger #{account}." end)
+ Logger.debug(fn -> inspect(e) end)
{:error, e}
end
end