logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

redirect_controller.ex (3066B)


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