summaryrefslogtreecommitdiff
path: root/test/pleroma/web/web_finger/web_finger_controller_test.exs
blob: 5e3ac26f98c3bd7fc30f8b5ab976049b6a57523a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
  use Pleroma.Web.ConnCase

  import ExUnit.CaptureLog
  import Pleroma.Factory
  import Tesla.Mock

  setup do
    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
    :ok
  end

  setup_all do: clear_config([:instance, :federating], true)

  test "GET host-meta" do
    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="#{Pleroma.Web.Endpoint.url()}/.well-known/webfinger?resource={uri}" type="application/xrd+xml" /></XRD>)
  end

  test "Webfinger JRD" do
    user =
      insert(:user,
        ap_id: "https://hyrule.world/users/zelda",
        also_known_as: ["https://mushroom.kingdom/users/toad"]
      )

    response =
      build_conn()
      |> put_req_header("accept", "application/jrd+json")
      |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
      |> json_response(200)

    assert response["subject"] == "acct:#{user.nickname}@localhost"

    assert response["aliases"] == [
             "https://hyrule.world/users/zelda",
             "https://mushroom.kingdom/users/toad"
           ]
  end

  test "reach user on tld, while pleroma is runned on subdomain" do
    Pleroma.Web.Endpoint.config_change(
      [{Pleroma.Web.Endpoint, url: [host: "sub.example.com"]}],
      []
    )

    clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com")

    clear_config([Pleroma.Web.WebFinger, :domain], "example.com")

    user = insert(:user, ap_id: "https://sub.example.com/users/bobby", nickname: "bobby")

    response =
      build_conn()
      |> put_req_header("accept", "application/jrd+json")
      |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@example.com")
      |> json_response(200)

    assert response["subject"] == "acct:#{user.nickname}@example.com"
    assert response["aliases"] == ["https://sub.example.com/users/#{user.nickname}"]

    on_exit(fn ->
      Pleroma.Web.Endpoint.config_change(
        [{Pleroma.Web.Endpoint, url: [host: "localhost"]}],
        []
      )
    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)

    assert result == "Couldn't find user"
  end

  test "Webfinger XML" do
    user =
      insert(:user,
        ap_id: "https://hyrule.world/users/zelda",
        also_known_as: ["https://mushroom.kingdom/users/toad"]
      )

    response =
      build_conn()
      |> put_req_header("accept", "application/xrd+xml")
      |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
      |> response(200)

    assert response =~ "<Alias>https://hyrule.world/users/zelda</Alias>"
    assert response =~ "<Alias>https://mushroom.kingdom/users/toad</Alias>"
  end

  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

  test "Sends a 404 when invalid format" do
    user = insert(:user)

    assert capture_log(fn ->
             assert_raise Phoenix.NotAcceptableError, fn ->
               build_conn()
               |> put_req_header("accept", "text/html")
               |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
             end
           end) =~ "no supported media type in accept header"
  end

  test "Sends a 400 when resource param is missing" do
    response =
      build_conn()
      |> put_req_header("accept", "application/xrd+xml,application/jrd+json")
      |> get("/.well-known/webfinger")

    assert response(response, 400)
  end
end