Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

86 líneas
2.3KB

  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.Web.MastodonAPI.AuthController do
  5. use Pleroma.Web, :controller
  6. import Pleroma.Web.ControllerHelper, only: [json_response: 3]
  7. alias Pleroma.User
  8. alias Pleroma.Web.OAuth.App
  9. alias Pleroma.Web.OAuth.Authorization
  10. alias Pleroma.Web.OAuth.Token
  11. alias Pleroma.Web.TwitterAPI.TwitterAPI
  12. action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
  13. plug(Pleroma.Web.Plugs.RateLimiter, [name: :password_reset] when action == :password_reset)
  14. @local_mastodon_name "Mastodon-Local"
  15. @doc "GET /web/login"
  16. def login(%{assigns: %{user: %User{}}} = conn, _params) do
  17. redirect(conn, to: local_mastodon_root_path(conn))
  18. end
  19. @doc "Local Mastodon FE login init action"
  20. def login(conn, %{"code" => auth_token}) do
  21. with {:ok, app} <- get_or_make_app(),
  22. {:ok, auth} <- Authorization.get_by_token(app, auth_token),
  23. {:ok, token} <- Token.exchange_token(app, auth) do
  24. conn
  25. |> put_session(:oauth_token, token.token)
  26. |> redirect(to: local_mastodon_root_path(conn))
  27. end
  28. end
  29. @doc "Local Mastodon FE callback action"
  30. def login(conn, _) do
  31. with {:ok, app} <- get_or_make_app() do
  32. path =
  33. o_auth_path(conn, :authorize,
  34. response_type: "code",
  35. client_id: app.client_id,
  36. redirect_uri: ".",
  37. scope: Enum.join(app.scopes, " ")
  38. )
  39. redirect(conn, to: path)
  40. end
  41. end
  42. @doc "DELETE /auth/sign_out"
  43. def logout(conn, _) do
  44. conn
  45. |> clear_session
  46. |> redirect(to: "/")
  47. end
  48. @doc "POST /auth/password"
  49. def password_reset(conn, params) do
  50. nickname_or_email = params["email"] || params["nickname"]
  51. TwitterAPI.password_reset(nickname_or_email)
  52. json_response(conn, :no_content, "")
  53. end
  54. defp local_mastodon_root_path(conn) do
  55. case get_session(conn, :return_to) do
  56. nil ->
  57. masto_fe_path(conn, :index, ["getting-started"])
  58. return_to ->
  59. delete_session(conn, :return_to)
  60. return_to
  61. end
  62. end
  63. @spec get_or_make_app() :: {:ok, App.t()} | {:error, Ecto.Changeset.t()}
  64. defp get_or_make_app do
  65. %{client_name: @local_mastodon_name, redirect_uris: "."}
  66. |> App.get_or_make(["read", "write", "follow", "push", "admin"])
  67. end
  68. end