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

126 lines
3.3 KiB
Elixir
Raw Normal View History

# Pleroma: A lightweight social networking server
2020-02-27 06:27:49 -07:00
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
2017-03-21 10:53:20 -06:00
defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
alias Pleroma.Emails.Mailer
alias Pleroma.Emails.UserEmail
2019-02-09 08:16:26 -07:00
alias Pleroma.Repo
alias Pleroma.User
alias Pleroma.UserInviteToken
2017-03-21 10:53:20 -06:00
require Pleroma.Constants
def register_user(params, opts \\ []) do
2019-04-06 07:24:22 -06:00
token = params["token"]
trusted_app? = params["trusted_app"]
2018-06-12 05:52:54 -06:00
2017-04-16 02:25:27 -06:00
params = %{
nickname: params["nickname"],
name: params["fullname"],
2018-12-02 12:03:53 -07:00
bio: User.parse_bio(params["bio"]),
2017-04-16 02:25:27 -06:00
email: params["email"],
password: params["password"],
password_confirmation: params["confirm"],
captcha_solution: params["captcha_solution"],
captcha_token: params["captcha_token"],
captcha_answer_data: params["captcha_answer_data"]
2017-04-16 02:25:27 -06:00
}
2018-12-14 16:00:00 -07:00
captcha_enabled = Pleroma.Config.get([Pleroma.Captcha, :enabled])
# true if captcha is disabled or enabled and valid, false otherwise
2018-12-15 12:08:26 -07:00
captcha_ok =
if trusted_app? || not captcha_enabled do
:ok
2018-12-15 12:08:26 -07:00
else
Pleroma.Captcha.validate(
params[:captcha_token],
params[:captcha_solution],
params[:captcha_answer_data]
)
2018-12-15 12:08:26 -07:00
end
2018-12-14 16:00:00 -07:00
# Captcha invalid
if captcha_ok != :ok do
{:error, error} = captcha_ok
# I have no idea how this error handling works
{:error, %{error: Jason.encode!(%{captcha: [error]})}}
else
registration_process(
params,
%{
registrations_open: Pleroma.Config.get([:instance, :registrations_open]),
token: token
},
opts
)
end
end
defp registration_process(params, %{registrations_open: true}, opts) do
create_user(params, opts)
end
defp registration_process(params, %{token: token}, opts) do
2019-04-06 07:24:22 -06:00
invite =
unless is_nil(token) do
Repo.get_by(UserInviteToken, %{token: token})
end
2017-04-16 02:25:27 -06:00
2019-04-06 07:24:22 -06:00
valid_invite? = invite && UserInviteToken.valid_invite?(invite)
2018-12-18 07:30:30 -07:00
2019-04-06 07:24:22 -06:00
case invite do
nil ->
{:error, "Invalid token"}
2018-12-18 07:30:30 -07:00
2019-04-06 07:24:22 -06:00
invite when valid_invite? ->
UserInviteToken.update_usage!(invite)
create_user(params, opts)
2018-06-12 05:52:54 -06:00
_ ->
{: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 07:01:53 -06:00
{:error, changeset} ->
errors =
Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
|> Jason.encode!()
{:error, %{error: errors}}
2017-04-16 02:25:27 -06:00
end
end
def password_reset(nickname_or_email) do
with true <- is_binary(nickname_or_email),
2020-02-27 06:27:49 -07: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 09:51:25 -07:00
|> Mailer.deliver_async()
{:ok, :enqueued}
else
false ->
{:error, "bad user identifier"}
2020-02-27 06:27:49 -07:00
%User{local: true, email: nil} ->
{:ok, :noop}
%User{local: false} ->
{:error, "remote user"}
nil ->
{:error, "unknown user"}
end
end
2017-03-21 10:53:20 -06:00
end