logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

admin_secret_authentication_plug.ex (1348B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Plugs.AdminSecretAuthenticationPlug do
  5. import Plug.Conn
  6. alias Pleroma.Plugs.OAuthScopesPlug
  7. alias Pleroma.Plugs.RateLimiter
  8. alias Pleroma.User
  9. def init(options) do
  10. options
  11. end
  12. def secret_token do
  13. case Pleroma.Config.get(:admin_token) do
  14. blank when blank in [nil, ""] -> nil
  15. token -> token
  16. end
  17. end
  18. def call(%{assigns: %{user: %User{}}} = conn, _), do: conn
  19. def call(conn, _) do
  20. if secret_token() do
  21. authenticate(conn)
  22. else
  23. conn
  24. end
  25. end
  26. def authenticate(%{params: %{"admin_token" => admin_token}} = conn) do
  27. if admin_token == secret_token() do
  28. assign_admin_user(conn)
  29. else
  30. handle_bad_token(conn)
  31. end
  32. end
  33. def authenticate(conn) do
  34. token = secret_token()
  35. case get_req_header(conn, "x-admin-token") do
  36. blank when blank in [[], [""]] -> conn
  37. [^token] -> assign_admin_user(conn)
  38. _ -> handle_bad_token(conn)
  39. end
  40. end
  41. defp assign_admin_user(conn) do
  42. conn
  43. |> assign(:user, %User{is_admin: true})
  44. |> OAuthScopesPlug.skip_plug()
  45. end
  46. defp handle_bad_token(conn) do
  47. RateLimiter.call(conn, name: :authentication)
  48. end
  49. end