total rebase
[anni] / lib / pleroma / web / fallback / redirect_controller.ex
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.Fallback.RedirectController do
6   use Pleroma.Web, :controller
7
8   require Logger
9
10   alias Pleroma.User
11   alias Pleroma.Web.Metadata
12   alias Pleroma.Web.Preload
13
14   def api_not_implemented(conn, _params) do
15     conn
16     |> put_status(404)
17     |> json(%{error: "Not implemented"})
18   end
19
20   def add_generated_metadata(page_content, extra \\ "") do
21     title = "<title>#{Pleroma.Config.get([:instance, :name])}</title>"
22     favicon = "<link rel='icon' href='#{Pleroma.Config.get([:instance, :favicon])}'>"
23     manifest = "<link rel='manifest' href='/manifest.json'>"
24
25     page_content
26     |> String.replace(
27       "<!--server-generated-meta-->",
28       title <> favicon <> manifest <> extra
29     )
30   end
31
32   def redirector(conn, _params, code \\ 200) do
33     {:ok, index_content} = File.read(index_file_path())
34
35     response =
36       index_content
37       |> add_generated_metadata()
38
39     conn
40     |> put_resp_content_type("text/html")
41     |> send_resp(code, response)
42   end
43
44   def redirector_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} = params) do
45     with %User{} = user <- User.get_cached_by_nickname_or_id(maybe_nickname_or_id) do
46       redirector_with_meta(conn, %{user: user})
47     else
48       nil ->
49         redirector(conn, params)
50     end
51   end
52
53   def redirector_with_meta(conn, params) do
54     {:ok, index_content} = File.read(index_file_path())
55     tags = build_tags(conn, params)
56     preloads = preload_data(conn, params)
57
58     response =
59       index_content
60       |> add_generated_metadata(tags <> preloads)
61
62     conn
63     |> put_resp_content_type("text/html")
64     |> send_resp(200, response)
65   end
66
67   def redirector_with_preload(conn, %{"path" => ["pleroma", "admin"]}) do
68     redirect(conn, to: "/pleroma/admin/")
69   end
70
71   def redirector_with_preload(conn, params) do
72     {:ok, index_content} = File.read(index_file_path())
73     preloads = preload_data(conn, params)
74
75     response =
76       index_content
77       |> add_generated_metadata(preloads)
78
79     conn
80     |> put_resp_content_type("text/html")
81     |> send_resp(200, response)
82   end
83
84   def registration_page(conn, params) do
85     redirector(conn, params)
86   end
87
88   def empty(conn, _params) do
89     conn
90     |> put_status(204)
91     |> text("")
92   end
93
94   defp index_file_path do
95     Pleroma.Web.Plugs.InstanceStatic.file_path("index.html")
96   end
97
98   defp build_tags(conn, params) do
99     try do
100       Metadata.build_tags(params)
101     rescue
102       e ->
103         Logger.error(
104           "Metadata rendering for #{conn.request_path} failed.\n" <>
105             Exception.format(:error, e, __STACKTRACE__)
106         )
107
108         ""
109     end
110   end
111
112   defp preload_data(conn, params) do
113     try do
114       Preload.build_tags(conn, params)
115     rescue
116       e ->
117         Logger.error(
118           "Preloading for #{conn.request_path} failed.\n" <>
119             Exception.format(:error, e, __STACKTRACE__)
120         )
121
122         ""
123     end
124   end
125 end