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