akkoma/lib/pleroma/web/twitter_api/twitter_api.ex

110 lines
2.9 KiB
Elixir
Raw Normal View History

# Pleroma: A lightweight social networking server
2020-02-27 13:27:49 +00:00
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
2017-03-21 16:53:20 +00:00
defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
alias Pleroma.Emails.Mailer
alias Pleroma.Emails.UserEmail
2019-02-09 15:16:26 +00:00
alias Pleroma.Repo
alias Pleroma.User
alias Pleroma.UserInviteToken
2017-03-21 16:53:20 +00:00
require Pleroma.Constants
def register_user(params, opts \\ []) do
2020-04-03 18:45:08 +00:00
params =
params
|> Map.take([
:nickname,
:password,
:captcha_solution,
:captcha_token,
:captcha_answer_data,
:token,
:email,
:trusted_app
2020-04-03 18:45:08 +00:00
])
|> Map.put(:bio, User.parse_bio(params[:bio] || ""))
|> Map.put(:name, params.fullname)
|> Map.put(:password_confirmation, params[:confirm])
2018-06-12 11:52:54 +00:00
2020-04-03 18:45:08 +00:00
case validate_captcha(params) do
:ok ->
if Pleroma.Config.get([:instance, :registrations_open]) do
create_user(params, opts)
else
create_user_with_invite(params, opts)
end
2017-04-16 08:25:27 +00:00
2020-04-03 18:45:08 +00:00
{:error, error} ->
# I have no idea how this error handling works
{:error, %{error: Jason.encode!(%{captcha: [error]})}}
end
end
2020-04-03 18:45:08 +00:00
defp validate_captcha(params) do
if params[:trusted_app] || not Pleroma.Config.get([Pleroma.Captcha, :enabled]) do
:ok
else
2020-04-03 18:45:08 +00:00
Pleroma.Captcha.validate(
params[:captcha_token],
params[:captcha_solution],
params[:captcha_answer_data]
2020-04-03 18:45:08 +00:00
)
end
end
2020-04-03 18:45:08 +00:00
defp create_user_with_invite(params, opts) do
with %{token: token} when is_binary(token) <- params,
%UserInviteToken{} = invite <- Repo.get_by(UserInviteToken, %{token: token}),
true <- UserInviteToken.valid_invite?(invite) do
UserInviteToken.update_usage!(invite)
create_user(params, opts)
else
nil -> {:error, "Invalid token"}
_ -> {:error, "Expired token"}
end
end
defp create_user(params, opts) do
changeset = User.register_changeset(%User{}, params, opts)
case User.register(changeset) do
{:ok, user} ->
{:ok, user}
2018-03-30 13:01:53 +00:00
{:error, changeset} ->
errors =
Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
|> Jason.encode!()
{:error, %{error: errors}}
2017-04-16 08:25:27 +00:00
end
end
def password_reset(nickname_or_email) do
with true <- is_binary(nickname_or_email),
2020-02-27 13:27:49 +00:00
%User{local: true, email: email} = user when not is_nil(email) <-
User.get_by_nickname_or_email(nickname_or_email),
{:ok, token_record} <- Pleroma.PasswordResetToken.create_token(user) do
user
|> UserEmail.password_reset_email(token_record.token)
2019-02-20 16:51:25 +00:00
|> Mailer.deliver_async()
{:ok, :enqueued}
else
false ->
{:error, "bad user identifier"}
2020-02-27 13:27:49 +00:00
%User{local: true, email: nil} ->
{:ok, :noop}
%User{local: false} ->
{:error, "remote user"}
nil ->
{:error, "unknown user"}
end
end
2017-03-21 16:53:20 +00:00
end