5e3ac26f98c3bd7fc30f8b5ab976049b6a57523a
[anni] / test / pleroma / web / web_finger / web_finger_controller_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
6   use Pleroma.Web.ConnCase
7
8   import ExUnit.CaptureLog
9   import Pleroma.Factory
10   import Tesla.Mock
11
12   setup do
13     mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
14     :ok
15   end
16
17   setup_all do: clear_config([:instance, :federating], true)
18
19   test "GET host-meta" do
20     response =
21       build_conn()
22       |> get("/.well-known/host-meta")
23
24     assert response.status == 200
25
26     assert response.resp_body ==
27              ~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.Endpoint.url()}/.well-known/webfinger?resource={uri}" type="application/xrd+xml" /></XRD>)
28   end
29
30   test "Webfinger JRD" do
31     user =
32       insert(:user,
33         ap_id: "https://hyrule.world/users/zelda",
34         also_known_as: ["https://mushroom.kingdom/users/toad"]
35       )
36
37     response =
38       build_conn()
39       |> put_req_header("accept", "application/jrd+json")
40       |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
41       |> json_response(200)
42
43     assert response["subject"] == "acct:#{user.nickname}@localhost"
44
45     assert response["aliases"] == [
46              "https://hyrule.world/users/zelda",
47              "https://mushroom.kingdom/users/toad"
48            ]
49   end
50
51   test "reach user on tld, while pleroma is runned on subdomain" do
52     Pleroma.Web.Endpoint.config_change(
53       [{Pleroma.Web.Endpoint, url: [host: "sub.example.com"]}],
54       []
55     )
56
57     clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com")
58
59     clear_config([Pleroma.Web.WebFinger, :domain], "example.com")
60
61     user = insert(:user, ap_id: "https://sub.example.com/users/bobby", nickname: "bobby")
62
63     response =
64       build_conn()
65       |> put_req_header("accept", "application/jrd+json")
66       |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@example.com")
67       |> json_response(200)
68
69     assert response["subject"] == "acct:#{user.nickname}@example.com"
70     assert response["aliases"] == ["https://sub.example.com/users/#{user.nickname}"]
71
72     on_exit(fn ->
73       Pleroma.Web.Endpoint.config_change(
74         [{Pleroma.Web.Endpoint, url: [host: "localhost"]}],
75         []
76       )
77     end)
78   end
79
80   test "it returns 404 when user isn't found (JSON)" do
81     result =
82       build_conn()
83       |> put_req_header("accept", "application/jrd+json")
84       |> get("/.well-known/webfinger?resource=acct:jimm@localhost")
85       |> json_response(404)
86
87     assert result == "Couldn't find user"
88   end
89
90   test "Webfinger XML" do
91     user =
92       insert(:user,
93         ap_id: "https://hyrule.world/users/zelda",
94         also_known_as: ["https://mushroom.kingdom/users/toad"]
95       )
96
97     response =
98       build_conn()
99       |> put_req_header("accept", "application/xrd+xml")
100       |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
101       |> response(200)
102
103     assert response =~ "<Alias>https://hyrule.world/users/zelda</Alias>"
104     assert response =~ "<Alias>https://mushroom.kingdom/users/toad</Alias>"
105   end
106
107   test "it returns 404 when user isn't found (XML)" do
108     result =
109       build_conn()
110       |> put_req_header("accept", "application/xrd+xml")
111       |> get("/.well-known/webfinger?resource=acct:jimm@localhost")
112       |> response(404)
113
114     assert result == "Couldn't find user"
115   end
116
117   test "Sends a 404 when invalid format" do
118     user = insert(:user)
119
120     assert capture_log(fn ->
121              assert_raise Phoenix.NotAcceptableError, fn ->
122                build_conn()
123                |> put_req_header("accept", "text/html")
124                |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
125              end
126            end) =~ "no supported media type in accept header"
127   end
128
129   test "Sends a 400 when resource param is missing" do
130     response =
131       build_conn()
132       |> put_req_header("accept", "application/xrd+xml,application/jrd+json")
133       |> get("/.well-known/webfinger")
134
135     assert response(response, 400)
136   end
137 end