logo

pleroma

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

admin_secret_authentication_plug.ex (1352B)


  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.Plugs.AdminSecretAuthenticationPlug do
  5. import Plug.Conn
  6. alias Pleroma.Helpers.AuthHelper
  7. alias Pleroma.User
  8. alias Pleroma.Web.Plugs.RateLimiter
  9. def init(options) do
  10. options
  11. end
  12. def call(%{assigns: %{user: %User{}}} = conn, _), do: conn
  13. def call(conn, _) do
  14. if secret_token() do
  15. authenticate(conn)
  16. else
  17. conn
  18. end
  19. end
  20. defp authenticate(%{params: %{"admin_token" => admin_token}} = conn) do
  21. if admin_token == secret_token() do
  22. assign_admin_user(conn)
  23. else
  24. handle_bad_token(conn)
  25. end
  26. end
  27. defp authenticate(conn) do
  28. token = secret_token()
  29. case get_req_header(conn, "x-admin-token") do
  30. blank when blank in [[], [""]] -> conn
  31. [^token] -> assign_admin_user(conn)
  32. _ -> handle_bad_token(conn)
  33. end
  34. end
  35. defp secret_token do
  36. case Pleroma.Config.get(:admin_token) do
  37. blank when blank in [nil, ""] -> nil
  38. token -> token
  39. end
  40. end
  41. defp assign_admin_user(conn) do
  42. conn
  43. |> assign(:user, %User{is_admin: true})
  44. |> AuthHelper.skip_oauth()
  45. end
  46. defp handle_bad_token(conn) do
  47. RateLimiter.call(conn, name: :authentication)
  48. end
  49. end