Packages
pow
1.0.0
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}
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
def before_respond(Pow.Phoenix.SessionController, :create, {:ok, conn}, _config) do
conn
|> Plug.current_user()
|> halt_unconfirmed(conn, {:ok, conn})
end
def before_respond(Pow.Phoenix.RegistrationController, :create, {:ok, user, conn}, _config) do
halt_unconfirmed(user, conn, {:ok, user, conn})
end
def before_respond(Pow.Phoenix.RegistrationController, :update, {:ok, user, conn}, _config) do
case should_send_email?(user, conn.private[:pow_user_before_update]) do
true ->
send_confirmation_email(user, conn)
{:ok, user, conn}
false ->
{:ok, user, conn}
end
end
defp should_send_email?(%{unconfirmed_email: new_email}, %{unconfirmed_email: old_email}),
do: new_email != old_email
defp halt_unconfirmed(%{email_confirmed_at: nil, email_confirmation_token: token} = user, conn, _success_response) when not is_nil(token) do
send_confirmation_email(user, conn)
{:ok, conn} = Plug.clear_authenticated_user(conn)
error = ConfirmationController.messages(conn).email_confirmation_required(conn)
path = ConfirmationController.routes(conn).session_path(conn, :new)
conn =
conn
|> Phoenix.Controller.put_flash(:error, error)
|> Phoenix.Controller.redirect(to: path)
{:halt, conn}
end
defp halt_unconfirmed(_user, _conn, success_response), do: success_response
@spec send_confirmation_email(map(), Conn.t()) :: any()
def send_confirmation_email(user, conn) do
token = user.email_confirmation_token
url = ConfirmationController.routes(conn).url_for(conn, ConfirmationController, :show, [token])
email = Mailer.email_confirmation(conn, user, url)
Pow.Phoenix.Mailer.deliver(conn, email)
end
end