authorize_plugins_api.ex 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. defmodule PlausibleWeb.Plugs.AuthorizePluginsAPI do
  2. @moduledoc """
  3. Plug for Basic HTTP Authentication using
  4. Plugins API Tokens lookup.
  5. """
  6. alias PlausibleWeb.Plugins.API.Errors
  7. alias Plausible.Plugins.API.Tokens
  8. import Plug.Conn
  9. def init(opts), do: opts
  10. def call(conn, opts \\ []) do
  11. send_error? =
  12. Keyword.get(opts, :send_error?, true)
  13. with {:ok, token} <- extract_token(conn),
  14. {:ok, conn} <- authorize(conn, token) do
  15. conn
  16. else
  17. {:unauthorized, conn} ->
  18. if send_error? do
  19. Errors.unauthorized(conn)
  20. else
  21. conn
  22. end
  23. end
  24. end
  25. defp authorize(conn, token_value) do
  26. case Tokens.find(token_value) do
  27. {:ok, token} ->
  28. {:ok, token} = Tokens.update_last_seen(token)
  29. {:ok, Plug.Conn.assign(conn, :authorized_site, token.site)}
  30. {:error, :not_found} ->
  31. {:unauthorized, conn}
  32. end
  33. end
  34. defp extract_token(conn) do
  35. with ["Basic " <> encoded_user_and_pass] <- get_req_header(conn, "authorization"),
  36. {:ok, decoded_user_and_pass} <- Base.decode64(encoded_user_and_pass) do
  37. case :binary.split(decoded_user_and_pass, ":") do
  38. [_user, token_value] -> {:ok, token_value}
  39. [token_value] -> {:ok, token_value}
  40. end
  41. else
  42. _ ->
  43. {:unauthorized, conn}
  44. end
  45. end
  46. end