Skip to content

Commit

Permalink
Show logout template after logging out
Browse files Browse the repository at this point in the history
  • Loading branch information
hugobarauna committed Jan 17, 2025
1 parent f20b2c6 commit fa49344
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 30 deletions.
2 changes: 1 addition & 1 deletion lib/livebook/config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ defmodule Livebook.Config do
identity_logout? =
Code.ensure_loaded?(module) and function_exported?(module, :logout, 2)

authentication().mode != :disabled or identity_logout?
identity_logout?
end

@doc """
Expand Down
32 changes: 4 additions & 28 deletions lib/livebook_web/controllers/auth_controller.ex
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
defmodule LivebookWeb.AuthController do
use LivebookWeb, :controller
alias LivebookWeb.AuthHelpers

plug(:require_unauthenticated)

alias LivebookWeb.AuthPlug

defp require_unauthenticated(conn, _opts) do
if AuthPlug.authenticated?(conn) do
redirect_to(conn)
AuthHelpers.redirect_to(conn)
else
conn
end
Expand All @@ -30,7 +31,7 @@ defmodule LivebookWeb.AuthController do
conn = AuthPlug.store(conn, :password, password)

if AuthPlug.authenticated?(conn) do
redirect_to(conn)
AuthHelpers.redirect_to(conn)
else
render_form_error(conn, :password)
end
Expand All @@ -40,23 +41,12 @@ defmodule LivebookWeb.AuthController do
conn = AuthPlug.store(conn, :token, token)

if AuthPlug.authenticated?(conn) do
redirect_to(conn)
AuthHelpers.redirect_to(conn)
else
render_form_error(conn, :token)
end
end

def logout(conn, _params) do
if get_session(conn, :user_id) do
conn
|> configure_session(renew: true)
|> clear_session()
|> render("logout.html")
else
redirect_to(conn)
end
end

defp render_form_error(conn, authentication_mode) do
errors = [{"%{authentication_mode} is invalid", [authentication_mode: authentication_mode]}]

Expand All @@ -65,18 +55,4 @@ defmodule LivebookWeb.AuthController do
authentication_mode: authentication_mode
)
end

defp redirect_to(conn) do
conn
|> then(fn conn ->
if redirect_to = get_session(conn, :redirect_to) do
conn
|> delete_session(:redirect_to)
|> redirect(to: redirect_to)
else
redirect(conn, to: ~p"/")
end
end)
|> halt()
end
end
17 changes: 17 additions & 0 deletions lib/livebook_web/controllers/auth_helpers.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
defmodule LivebookWeb.AuthHelpers do
use LivebookWeb, :controller

def redirect_to(conn) do
conn
|> then(fn conn ->
if redirect_to = get_session(conn, :redirect_to) do
conn
|> delete_session(:redirect_to)
|> redirect(to: redirect_to)
else
redirect(conn, to: ~p"/")
end
end)
|> halt()
end
end
15 changes: 15 additions & 0 deletions lib/livebook_web/controllers/user_auth_controller.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
defmodule LivebookWeb.UserAuthController do
use LivebookWeb, :controller
alias LivebookWeb.AuthHelpers

def logout(conn, _params) do
if get_session(conn, :user_id) do
conn
|> configure_session(renew: true)
|> clear_session()
|> render("logout.html")
else
AuthHelpers.redirect_to(conn)
end
end
end
5 changes: 5 additions & 0 deletions lib/livebook_web/controllers/user_auth_html.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
defmodule LivebookWeb.UserAuthHTML do
use LivebookWeb, :html

embed_templates "user_auth_html/*"
end
2 changes: 1 addition & 1 deletion lib/livebook_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ defmodule LivebookWeb.Router do

scope "/", LivebookWeb do
pipe_through [:browser]
get "/logout", AuthController, :logout
get "/logout", UserAuthController, :logout
end

defp within_iframe_secure_headers(conn, _opts) do
Expand Down
29 changes: 29 additions & 0 deletions test/livebook_web/controllers/user_auth_controller_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
defmodule LivebookWeb.UserAuthControllerTest do
use LivebookWeb.ConnCase, async: true

describe "GET /logout" do
test "renders logout template when logged in", %{conn: conn} do
conn = login_user(conn)

conn = get(conn, ~p"/logout")

assert html_response(conn, 200) =~ "You have been logged out"
end

test "redirects when already logged out", %{conn: conn} do
conn = logout_user(conn)

conn = get(conn, ~p"/logout")

assert redirected_to(conn) == ~p"/"
end

defp login_user(conn) do
Phoenix.ConnTest.init_test_session(conn, %{user_id: 1})
end

defp logout_user(conn) do
Phoenix.ConnTest.init_test_session(conn, %{})
end
end
end

0 comments on commit fa49344

Please sign in to comment.