[#1878] fix reset confirmation email in admin section See merge request pleroma/pleroma!2751chores/our-libs-hex-releases
@@ -16,6 +16,7 @@ defmodule Pleroma.ApplicationRequirements do | |||
@spec verify!() :: :ok | VerifyError.t() | |||
def verify! do | |||
:ok | |||
|> check_confirmation_accounts! | |||
|> check_migrations_applied!() | |||
|> check_rum!() | |||
|> handle_result() | |||
@@ -24,6 +25,24 @@ defmodule Pleroma.ApplicationRequirements do | |||
defp handle_result(:ok), do: :ok | |||
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( | |||
"Account activation enabled, but no Mailer settings enabled.\nPlease set config :pleroma, :instance, account_activation_required: false\nOtherwise setup and enable Mailer." | |||
) | |||
{:error, | |||
"Account activation enabled, but Mailer is disabled. Cannot send confirmation emails."} | |||
else | |||
:ok | |||
end | |||
end | |||
def check_confirmation_accounts!(result), do: result | |||
# Checks for pending migrations. | |||
# | |||
def check_migrations_applied!(:ok) do | |||
@@ -719,21 +719,25 @@ defmodule Pleroma.User do | |||
end | |||
end | |||
def try_send_confirmation_email(%User{} = user) do | |||
if user.confirmation_pending && | |||
Config.get([:instance, :account_activation_required]) do | |||
user | |||
|> Pleroma.Emails.UserEmail.account_confirmation_email() | |||
|> Pleroma.Emails.Mailer.deliver_async() | |||
@spec try_send_confirmation_email(User.t()) :: {:ok, :enqueued | :noop} | |||
def try_send_confirmation_email(%User{confirmation_pending: true} = user) do | |||
if Config.get([:instance, :account_activation_required]) do | |||
send_confirmation_email(user) | |||
{:ok, :enqueued} | |||
else | |||
{:ok, :noop} | |||
end | |||
end | |||
def try_send_confirmation_email(users) do | |||
Enum.each(users, &try_send_confirmation_email/1) | |||
def try_send_confirmation_email(_), do: {:ok, :noop} | |||
@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 | |||
def needs_update?(%User{local: true}), do: false | |||
@@ -616,29 +616,24 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||
end | |||
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) | |||
ModerationLog.insert_log(%{ | |||
actor: admin, | |||
subject: users, | |||
action: "confirm_email" | |||
}) | |||
ModerationLog.insert_log(%{actor: admin, subject: users, action: "confirm_email"}) | |||
json(conn, "") | |||
end | |||
def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do | |||
users = nicknames |> Enum.map(&User.get_cached_by_nickname/1) | |||
User.try_send_confirmation_email(users) | |||
users = | |||
Enum.map(nicknames, fn nickname -> | |||
nickname | |||
|> User.get_cached_by_nickname() | |||
|> User.send_confirmation_email() | |||
end) | |||
ModerationLog.insert_log(%{ | |||
actor: admin, | |||
subject: users, | |||
action: "resend_confirmation_email" | |||
}) | |||
ModerationLog.insert_log(%{actor: admin, subject: users, action: "resend_confirmation_email"}) | |||
json(conn, "") | |||
end | |||
@@ -9,6 +9,42 @@ defmodule Pleroma.ApplicationRequirementsTest do | |||
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, | |||
"Account activation enabled, but Mailer is disabled. Cannot send confirmation emails.", | |||
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 | |||
setup_with_mocks([ | |||
{Pleroma.ApplicationRequirements, [:passthrough], | |||
@@ -17,6 +17,7 @@ defmodule Pleroma.UserTest do | |||
import Pleroma.Factory | |||
import ExUnit.CaptureLog | |||
import Swoosh.TestAssertions | |||
setup_all do | |||
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) | |||
@@ -385,9 +386,11 @@ defmodule Pleroma.UserTest do | |||
password_confirmation: "test", | |||
email: "email@example.com" | |||
} | |||
setup do: clear_config([:instance, :autofollowed_nicknames]) | |||
setup do: clear_config([:instance, :welcome_message]) | |||
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 | |||
user = insert(:user) | |||
@@ -421,7 +424,14 @@ defmodule Pleroma.UserTest do | |||
assert activity.actor == welcome_user.ap_id | |||
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 | |||
Pleroma.Config.put([:instance, :account_activation_required], true) | |||
@@ -9,6 +9,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||
import ExUnit.CaptureLog | |||
import Mock | |||
import Pleroma.Factory | |||
import Swoosh.TestAssertions | |||
alias Pleroma.Activity | |||
alias Pleroma.Config | |||
@@ -1731,6 +1732,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||
"@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{ | |||
second_user.nickname | |||
}" | |||
ObanHelpers.perform_all() | |||
assert_email_sent(Pleroma.Emails.UserEmail.account_confirmation_email(first_user)) | |||
end | |||
end | |||