diff options
| -rw-r--r-- | lib/pleroma/application.ex | 4 | ||||
| -rw-r--r-- | lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 38 | ||||
| -rw-r--r-- | test/web/node_info_test.exs | 51 | 
3 files changed, 85 insertions, 8 deletions
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index 40bff08c7..d67e2cdc8 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -6,11 +6,13 @@ defmodule Pleroma.Application do    use Application    import Supervisor.Spec -  @name "Pleroma" +  @name Mix.Project.config()[:name]    @version Mix.Project.config()[:version] +  @repository Mix.Project.config()[:source_url]    def name, do: @name    def version, do: @version    def named_version(), do: @name <> " " <> @version +  def repository, do: @repository    def user_agent() do      info = "#{Pleroma.Web.base_url()} <#{Pleroma.Config.get([:instance, :email], "")}>" diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 11b97164d..21694a5ee 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -19,6 +19,10 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do          %{            rel: "http://nodeinfo.diaspora.software/ns/schema/2.0",            href: Web.base_url() <> "/nodeinfo/2.0.json" +        }, +        %{ +          rel: "http://nodeinfo.diaspora.software/ns/schema/2.1", +          href: Web.base_url() <> "/nodeinfo/2.1.json"          }        ]      } @@ -26,8 +30,9 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do      json(conn, response)    end -  # Schema definition: https://github.com/jhass/nodeinfo/blob/master/schemas/2.0/schema.json -  def nodeinfo(conn, %{"version" => "2.0"}) do +  # returns a nodeinfo 2.0 map, since 2.1 just adds a repository field +  # under software. +  def raw_nodeinfo() do      instance = Application.get_env(:pleroma, :instance)      media_proxy = Application.get_env(:pleroma, :media_proxy)      suggestions = Application.get_env(:pleroma, :suggestions) @@ -98,10 +103,10 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do        ]        |> Enum.filter(& &1) -    response = %{ +    %{        version: "2.0",        software: %{ -        name: Pleroma.Application.name(), +        name: Pleroma.Application.name() |> String.downcase(),          version: Pleroma.Application.version()        },        protocols: ["ostatus", "activitypub"], @@ -142,12 +147,37 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do          restrictedNicknames: Pleroma.Config.get([Pleroma.User, :restricted_nicknames])        }      } +  end +  # Schema definition: https://github.com/jhass/nodeinfo/blob/master/schemas/2.0/schema.json +  # and https://github.com/jhass/nodeinfo/blob/master/schemas/2.1/schema.json +  def nodeinfo(conn, %{"version" => "2.0"}) do      conn      |> put_resp_header(        "content-type",        "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8"      ) +    |> json(raw_nodeinfo()) +  end + +  def nodeinfo(conn, %{"version" => "2.1"}) do +    raw_response = raw_nodeinfo() + +    updated_software = +      raw_response +      |> Map.get(:software) +      |> Map.put(:repository, Pleroma.Application.repository()) + +    response = +      raw_response +      |> Map.put(:software, updated_software) +      |> Map.put(:version, "2.1") + +    conn +    |> put_resp_header( +      "content-type", +      "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.1#; charset=utf-8" +    )      |> json(response)    end diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 5981c70a7..763549bd1 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -12,7 +12,7 @@ defmodule Pleroma.Web.NodeInfoTest do      conn =        conn -      |> get("/nodeinfo/2.0.json") +      |> get("/nodeinfo/2.1.json")      assert result = json_response(conn, 200) @@ -22,7 +22,7 @@ defmodule Pleroma.Web.NodeInfoTest do    test "nodeinfo shows restricted nicknames", %{conn: conn} do      conn =        conn -      |> get("/nodeinfo/2.0.json") +      |> get("/nodeinfo/2.1.json")      assert result = json_response(conn, 200) @@ -42,7 +42,7 @@ defmodule Pleroma.Web.NodeInfoTest do      |> json_response(404)      conn -    |> get("/nodeinfo/2.0.json") +    |> get("/nodeinfo/2.1.json")      |> json_response(404)      instance = @@ -58,7 +58,52 @@ defmodule Pleroma.Web.NodeInfoTest do      |> json_response(200)      conn +    |> get("/nodeinfo/2.1.json") +    |> json_response(200) +  end + +  test "returns 404 when federation is disabled (nodeinfo 2.0)", %{conn: conn} do +    instance = +      Application.get_env(:pleroma, :instance) +      |> Keyword.put(:federating, false) + +    Application.put_env(:pleroma, :instance, instance) + +    conn +    |> get("/.well-known/nodeinfo") +    |> json_response(404) + +    conn +    |> get("/nodeinfo/2.0.json") +    |> json_response(404) + +    instance = +      Application.get_env(:pleroma, :instance) +      |> Keyword.put(:federating, true) + +    Application.put_env(:pleroma, :instance, instance) +  end + +  test "returns 200 when federation is enabled (nodeinfo 2.0)", %{conn: conn} do +    conn +    |> get("/.well-known/nodeinfo") +    |> json_response(200) + +    conn      |> get("/nodeinfo/2.0.json")      |> json_response(200)    end + +  test "returns software.repository field in nodeinfo 2.1", %{conn: conn} do +    conn +    |> get("/.well-known/nodeinfo") +    |> json_response(200) + +    conn = +      conn +      |> get("/nodeinfo/2.1.json") + +    assert result = json_response(conn, 200) +    assert Pleroma.Application.repository() == result["software"]["repository"] +  end  end  | 
