fix reset confirmation email in admin section

This commit is contained in:
Maksim Pechnikov 2020-07-11 07:20:35 +03:00
parent d6f67fa91b
commit 62fc8eab0d
6 changed files with 91 additions and 24 deletions

View file

@ -16,6 +16,7 @@ defmodule VerifyError, do: defexception([:message])
@spec verify!() :: :ok | VerifyError.t() @spec verify!() :: :ok | VerifyError.t()
def verify! do def verify! do
:ok :ok
|> check_confirmation_accounts!
|> check_migrations_applied!() |> check_migrations_applied!()
|> check_rum!() |> check_rum!()
|> handle_result() |> handle_result()
@ -24,6 +25,23 @@ def verify! do
defp handle_result(:ok), do: :ok defp handle_result(:ok), do: :ok
defp handle_result({:error, message}), do: raise(VerifyError, message: message) defp handle_result({:error, message}), do: raise(VerifyError, message: message)
# Checks account confirmation email
#
def check_confirmation_accounts!(:ok) do
if Pleroma.Config.get([:instance, :account_activation_required]) &&
not Pleroma.Config.get([Pleroma.Emails.Mailer, :enabled]) do
Logger.error(
"To use confirmation an user account need to enable and setting mailer.\nIf you want to start Pleroma anyway, set\nconfig :pleroma, :instance, account_activation_required: false\nOtherwise setup and enable mailer."
)
{:error, "Confirmation account: Mailer is disabled"}
else
:ok
end
end
def check_confirmation_accounts!(result), do: result
# Checks for pending migrations. # Checks for pending migrations.
# #
def check_migrations_applied!(:ok) do def check_migrations_applied!(:ok) do

View file

@ -709,21 +709,25 @@ def post_register_action(%User{} = user) do
end end
end end
def try_send_confirmation_email(%User{} = user) do @spec try_send_confirmation_email(User.t()) :: {:ok, :enqueued | :noop}
if user.confirmation_pending && def try_send_confirmation_email(%User{confirmation_pending: true} = user) do
Config.get([:instance, :account_activation_required]) do if Config.get([:instance, :account_activation_required]) do
user send_confirmation_email(user)
|> Pleroma.Emails.UserEmail.account_confirmation_email()
|> Pleroma.Emails.Mailer.deliver_async()
{:ok, :enqueued} {:ok, :enqueued}
else else
{:ok, :noop} {:ok, :noop}
end end
end end
def try_send_confirmation_email(users) do def try_send_confirmation_email(_), do: {:ok, :noop}
Enum.each(users, &try_send_confirmation_email/1)
@spec send_confirmation_email(Uset.t()) :: User.t()
def send_confirmation_email(%User{} = user) do
user
|> Pleroma.Emails.UserEmail.account_confirmation_email()
|> Pleroma.Emails.Mailer.deliver_async()
user
end end
def needs_update?(%User{local: true}), do: false def needs_update?(%User{local: true}), do: false

View file

@ -616,29 +616,24 @@ def reload_emoji(conn, _params) do
end end
def confirm_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do def confirm_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do
users = nicknames |> Enum.map(&User.get_cached_by_nickname/1) users = Enum.map(nicknames, &User.get_cached_by_nickname/1)
User.toggle_confirmation(users) User.toggle_confirmation(users)
ModerationLog.insert_log(%{ ModerationLog.insert_log(%{actor: admin, subject: users, action: "confirm_email"})
actor: admin,
subject: users,
action: "confirm_email"
})
json(conn, "") json(conn, "")
end end
def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do
users = nicknames |> Enum.map(&User.get_cached_by_nickname/1) users =
Enum.map(nicknames, fn nickname ->
nickname
|> User.get_cached_by_nickname()
|> User.send_confirmation_email()
end)
User.try_send_confirmation_email(users) ModerationLog.insert_log(%{actor: admin, subject: users, action: "resend_confirmation_email"})
ModerationLog.insert_log(%{
actor: admin,
subject: users,
action: "resend_confirmation_email"
})
json(conn, "") json(conn, "")
end end

View file

@ -9,6 +9,42 @@ defmodule Pleroma.ApplicationRequirementsTest do
alias Pleroma.Repo alias Pleroma.Repo
describe "check_confirmation_accounts!" do
setup_with_mocks([
{Pleroma.ApplicationRequirements, [:passthrough],
[
check_migrations_applied!: fn _ -> :ok end
]}
]) do
:ok
end
setup do: clear_config([:instance, :account_activation_required])
test "raises if account confirmation is required but mailer isn't enable" do
Pleroma.Config.put([:instance, :account_activation_required], true)
Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], false)
assert_raise Pleroma.ApplicationRequirements.VerifyError,
"Confirmation account: Mailer is disabled",
fn ->
capture_log(&Pleroma.ApplicationRequirements.verify!/0)
end
end
test "doesn't do anything if account confirmation is disabled" do
Pleroma.Config.put([:instance, :account_activation_required], false)
Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], false)
assert Pleroma.ApplicationRequirements.verify!() == :ok
end
test "doesn't do anything if account confirmation is required and mailer is enabled" do
Pleroma.Config.put([:instance, :account_activation_required], true)
Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], true)
assert Pleroma.ApplicationRequirements.verify!() == :ok
end
end
describe "check_rum!" do describe "check_rum!" do
setup_with_mocks([ setup_with_mocks([
{Pleroma.ApplicationRequirements, [:passthrough], {Pleroma.ApplicationRequirements, [:passthrough],

View file

@ -17,6 +17,7 @@ defmodule Pleroma.UserTest do
import Pleroma.Factory import Pleroma.Factory
import ExUnit.CaptureLog import ExUnit.CaptureLog
import Swoosh.TestAssertions
setup_all do setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
@ -385,9 +386,11 @@ test "fetches correct profile for nickname beginning with number" do
password_confirmation: "test", password_confirmation: "test",
email: "email@example.com" email: "email@example.com"
} }
setup do: clear_config([:instance, :autofollowed_nicknames]) setup do: clear_config([:instance, :autofollowed_nicknames])
setup do: clear_config([:instance, :welcome_message]) setup do: clear_config([:instance, :welcome_message])
setup do: clear_config([:instance, :welcome_user_nickname]) setup do: clear_config([:instance, :welcome_user_nickname])
setup do: clear_config([:instance, :account_activation_required])
test "it autofollows accounts that are set for it" do test "it autofollows accounts that are set for it" do
user = insert(:user) user = insert(:user)
@ -421,7 +424,14 @@ test "it sends a welcome message if it is set" do
assert activity.actor == welcome_user.ap_id assert activity.actor == welcome_user.ap_id
end end
setup do: clear_config([:instance, :account_activation_required]) test "it sends a confirm email" do
Pleroma.Config.put([:instance, :account_activation_required], true)
cng = User.register_changeset(%User{}, @full_user_data)
{:ok, registered_user} = User.register(cng)
ObanHelpers.perform_all()
assert_email_sent(Pleroma.Emails.UserEmail.account_confirmation_email(registered_user))
end
test "it requires an email, name, nickname and password, bio is optional when account_activation_required is enabled" do test "it requires an email, name, nickname and password, bio is optional when account_activation_required is enabled" do
Pleroma.Config.put([:instance, :account_activation_required], true) Pleroma.Config.put([:instance, :account_activation_required], true)

View file

@ -9,6 +9,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
import ExUnit.CaptureLog import ExUnit.CaptureLog
import Mock import Mock
import Pleroma.Factory import Pleroma.Factory
import Swoosh.TestAssertions
alias Pleroma.Activity alias Pleroma.Activity
alias Pleroma.Config alias Pleroma.Config
@ -1721,6 +1722,9 @@ test "it resend emails for two users", %{conn: conn, admin: admin} do
"@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{ "@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{
second_user.nickname second_user.nickname
}" }"
ObanHelpers.perform_all()
assert_email_sent(Pleroma.Emails.UserEmail.account_confirmation_email(first_user))
end end
end end