logo

pleroma

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

twitter_api.ex (4115B)


  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.TwitterAPI.TwitterAPI do
  5. import Pleroma.Web.Gettext
  6. alias Pleroma.Emails.Mailer
  7. alias Pleroma.Emails.UserEmail
  8. alias Pleroma.Repo
  9. alias Pleroma.User
  10. alias Pleroma.UserInviteToken
  11. def register_user(params, opts \\ []) do
  12. fallback_language = Gettext.get_locale()
  13. params =
  14. params
  15. |> Map.take([:email, :token, :password])
  16. |> Map.put(:bio, params |> Map.get(:bio, "") |> User.parse_bio())
  17. |> Map.put(:nickname, params[:username])
  18. |> Map.put(:name, Map.get(params, :fullname, params[:username]))
  19. |> Map.put(:password_confirmation, params[:password])
  20. |> Map.put(:registration_reason, params[:reason])
  21. |> Map.put(:birthday, params[:birthday])
  22. |> Map.put(
  23. :language,
  24. Pleroma.Web.Gettext.normalize_locale(params[:language]) || fallback_language
  25. )
  26. if Pleroma.Config.get([:instance, :registrations_open]) do
  27. create_user(params, opts)
  28. else
  29. create_user_with_invite(params, opts)
  30. end
  31. end
  32. defp create_user_with_invite(params, opts) do
  33. with %{token: token} when is_binary(token) <- params,
  34. %UserInviteToken{} = invite <- Repo.get_by(UserInviteToken, %{token: token}),
  35. true <- UserInviteToken.valid_invite?(invite) do
  36. UserInviteToken.update_usage!(invite)
  37. create_user(params, opts)
  38. else
  39. nil -> {:error, "Invalid token"}
  40. _ -> {:error, "Expired token"}
  41. end
  42. end
  43. defp create_user(params, opts) do
  44. changeset = User.register_changeset(%User{}, params, opts)
  45. case User.register(changeset) do
  46. {:ok, user} ->
  47. {:ok, user}
  48. {:error, changeset} ->
  49. errors =
  50. changeset
  51. |> Ecto.Changeset.traverse_errors(fn {msg, _opts} -> msg end)
  52. |> Jason.encode!()
  53. {:error, errors}
  54. end
  55. end
  56. def password_reset(nickname_or_email) do
  57. with true <- is_binary(nickname_or_email),
  58. %User{local: true, email: email, is_active: true} = user when is_binary(email) <-
  59. User.get_by_nickname_or_email(nickname_or_email),
  60. {:ok, token_record} <- Pleroma.PasswordResetToken.create_token(user) do
  61. user
  62. |> UserEmail.password_reset_email(token_record.token)
  63. |> Mailer.deliver_async()
  64. {:ok, :enqueued}
  65. else
  66. _ ->
  67. {:ok, :noop}
  68. end
  69. end
  70. def validate_captcha(app, params) do
  71. if app.trusted || not Pleroma.Captcha.enabled?() do
  72. :ok
  73. else
  74. do_validate_captcha(params)
  75. end
  76. end
  77. defp do_validate_captcha(params) do
  78. with :ok <- validate_captcha_presence(params),
  79. :ok <-
  80. Pleroma.Captcha.validate(
  81. params[:captcha_token],
  82. params[:captcha_solution],
  83. params[:captcha_answer_data]
  84. ) do
  85. :ok
  86. else
  87. {:error, :captcha_error} ->
  88. captcha_error(dgettext("errors", "CAPTCHA Error"))
  89. {:error, :invalid} ->
  90. captcha_error(dgettext("errors", "Invalid CAPTCHA"))
  91. {:error, :kocaptcha_service_unavailable} ->
  92. captcha_error(dgettext("errors", "Kocaptcha service unavailable"))
  93. {:error, :expired} ->
  94. captcha_error(dgettext("errors", "CAPTCHA expired"))
  95. {:error, :already_used} ->
  96. captcha_error(dgettext("errors", "CAPTCHA already used"))
  97. {:error, :invalid_answer_data} ->
  98. captcha_error(dgettext("errors", "Invalid answer data"))
  99. {:error, error} ->
  100. captcha_error(error)
  101. end
  102. end
  103. defp validate_captcha_presence(params) do
  104. [:captcha_solution, :captcha_token, :captcha_answer_data]
  105. |> Enum.find_value(:ok, fn key ->
  106. unless is_binary(params[key]) do
  107. error = dgettext("errors", "Invalid CAPTCHA (Missing parameter: %{name})", name: key)
  108. {:error, error}
  109. end
  110. end)
  111. end
  112. # For some reason FE expects error message to be a serialized JSON
  113. defp captcha_error(error), do: {:error, Jason.encode!(%{captcha: [error]})}
  114. end