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