Packages
pow
1.0.9
1.0.39
1.0.38
1.0.37
1.0.36
1.0.35
1.0.34
1.0.33
1.0.32
1.0.31
1.0.30
1.0.29
1.0.28
1.0.27
1.0.26
1.0.25
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.1.0-rc.1
0.1.0-alpha.8
0.1.0-alpha.7
retired
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha
Robust user authentication solution
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/extensions/email_confirmation/phoenix/controllers/controller_callbacks.ex
defmodule PowEmailConfirmation.Phoenix.ControllerCallbacks do
@moduledoc false
use Pow.Extension.Phoenix.ControllerCallbacks.Base
alias Plug.Conn
alias Pow.Plug
alias PowEmailConfirmation.Phoenix.{ConfirmationController, Mailer}
@impl true
def before_process(Pow.Phoenix.RegistrationController, :update, conn, _config) do
user = Plug.current_user(conn)
Conn.put_private(conn, :pow_user_before_update, user)
end
@impl true
def before_respond(Pow.Phoenix.SessionController, :create, {:ok, conn}, _config) do
conn
|> Plug.current_user()
|> halt_unconfirmed(conn, {:ok, conn}, :session)
end
def before_respond(Pow.Phoenix.RegistrationController, :create, {:ok, user, conn}, _config) do
halt_unconfirmed(user, conn, {:ok, user, conn}, :registration)
end
def before_respond(Pow.Phoenix.RegistrationController, :update, {:ok, user, conn}, _config), do: warn_unconfirmed(user, conn)
def before_respond(PowInvitation.Phoenix.InvitationController, :update, {:ok, user, conn}, _config), do: warn_unconfirmed(user, conn)
defp warn_unconfirmed(%{unconfirmed_email: new_email} = user, %{private: %{pow_user_before_update: %{unconfirmed_email: old_email}}} = conn) when new_email != old_email do
do_warn_unconfirmed(user, conn)
end
defp warn_unconfirmed(user, %{private: %{pow_user_before_update: _user}} = conn), do: {:ok, user, conn}
defp warn_unconfirmed(%{email_confirmed_at: nil, email_confirmation_token: token} = user, conn) when not is_nil(token) do
do_warn_unconfirmed(user, conn)
end
defp warn_unconfirmed(user, conn), do: {:ok, user, conn}
defp do_warn_unconfirmed(user, conn) do
send_confirmation_email(user, conn)
error = extension_messages(conn).email_confirmation_required_for_update(conn)
conn = Phoenix.Controller.put_flash(conn, :error, error)
{:ok, user, conn}
end
defp halt_unconfirmed(%{email_confirmed_at: nil, email_confirmation_token: token} = user, conn, _success_response, type) when not is_nil(token) do
send_confirmation_email(user, conn)
{:ok, conn} = Plug.clear_authenticated_user(conn)
error = extension_messages(conn).email_confirmation_required(conn)
path = return_path(conn, type)
conn =
conn
|> Phoenix.Controller.put_flash(:error, error)
|> Phoenix.Controller.redirect(to: path)
{:halt, conn}
end
defp halt_unconfirmed(_user, _conn, success_response, _type), do: success_response
defp return_path(conn, :registration), do: routes(conn).after_registration_path(conn)
defp return_path(conn, :session), do: routes(conn).after_sign_in_path(conn)
@spec send_confirmation_email(map(), Conn.t()) :: any()
def send_confirmation_email(user, conn) do
url = confirmation_url(conn, user.email_confirmation_token)
email = Mailer.email_confirmation(conn, user, url)
Pow.Phoenix.Mailer.deliver(conn, email)
end
defp confirmation_url(conn, token) do
routes(conn).url_for(conn, ConfirmationController, :show, [token])
end
end