Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.2KB

  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.TwitterAPI.TwitterAPI do
  5. alias Pleroma.Emails.Mailer
  6. alias Pleroma.Emails.UserEmail
  7. alias Pleroma.Repo
  8. alias Pleroma.User
  9. alias Pleroma.UserInviteToken
  10. require Pleroma.Constants
  11. def register_user(params, opts \\ []) do
  12. token = params["token"]
  13. params = %{
  14. nickname: params["nickname"],
  15. name: params["fullname"],
  16. bio: User.parse_bio(params["bio"]),
  17. email: params["email"],
  18. password: params["password"],
  19. password_confirmation: params["confirm"],
  20. captcha_solution: params["captcha_solution"],
  21. captcha_token: params["captcha_token"],
  22. captcha_answer_data: params["captcha_answer_data"]
  23. }
  24. captcha_enabled = Pleroma.Config.get([Pleroma.Captcha, :enabled])
  25. # true if captcha is disabled or enabled and valid, false otherwise
  26. captcha_ok =
  27. if not captcha_enabled do
  28. :ok
  29. else
  30. Pleroma.Captcha.validate(
  31. params[:captcha_token],
  32. params[:captcha_solution],
  33. params[:captcha_answer_data]
  34. )
  35. end
  36. # Captcha invalid
  37. if captcha_ok != :ok do
  38. {:error, error} = captcha_ok
  39. # I have no idea how this error handling works
  40. {:error, %{error: Jason.encode!(%{captcha: [error]})}}
  41. else
  42. registration_process(
  43. params,
  44. %{
  45. registrations_open: Pleroma.Config.get([:instance, :registrations_open]),
  46. token: token
  47. },
  48. opts
  49. )
  50. end
  51. end
  52. defp registration_process(params, %{registrations_open: true}, opts) do
  53. create_user(params, opts)
  54. end
  55. defp registration_process(params, %{token: token}, opts) do
  56. invite =
  57. unless is_nil(token) do
  58. Repo.get_by(UserInviteToken, %{token: token})
  59. end
  60. valid_invite? = invite && UserInviteToken.valid_invite?(invite)
  61. case invite do
  62. nil ->
  63. {:error, "Invalid token"}
  64. invite when valid_invite? ->
  65. UserInviteToken.update_usage!(invite)
  66. create_user(params, opts)
  67. _ ->
  68. {:error, "Expired token"}
  69. end
  70. end
  71. defp create_user(params, opts) do
  72. changeset = User.register_changeset(%User{}, params, opts)
  73. case User.register(changeset) do
  74. {:ok, user} ->
  75. {:ok, user}
  76. {:error, changeset} ->
  77. errors =
  78. Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
  79. |> Jason.encode!()
  80. {:error, %{error: errors}}
  81. end
  82. end
  83. def password_reset(nickname_or_email) do
  84. with true <- is_binary(nickname_or_email),
  85. %User{local: true, email: email} = user when not is_nil(email) <-
  86. User.get_by_nickname_or_email(nickname_or_email),
  87. {:ok, token_record} <- Pleroma.PasswordResetToken.create_token(user) do
  88. user
  89. |> UserEmail.password_reset_email(token_record.token)
  90. |> Mailer.deliver_async()
  91. {:ok, :enqueued}
  92. else
  93. false ->
  94. {:error, "bad user identifier"}
  95. %User{local: true, email: nil} ->
  96. {:ok, :noop}
  97. %User{local: false} ->
  98. {:error, "remote user"}
  99. nil ->
  100. {:error, "unknown user"}
  101. end
  102. end
  103. end