mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-09-07 21:44:36 +08:00
Allow user to logout from Livebook app (#2961)
This commit is contained in:
parent
e52ed86aee
commit
78aebde2ad
4 changed files with 57 additions and 13 deletions
|
@ -274,4 +274,32 @@ defmodule LivebookWeb.SessionHelpers do
|
||||||
Livebook.Session.register_file(session_pid, path, key)
|
Livebook.Session.register_file(session_pid, path, key)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@logout_topic "logout"
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Subscribes to #{@logout_topic} topic.
|
||||||
|
"""
|
||||||
|
@spec subscribe_to_logout() :: :ok | {:error, term()}
|
||||||
|
def subscribe_to_logout do
|
||||||
|
Phoenix.PubSub.subscribe(Livebook.PubSub, @logout_topic)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Shows the confirmation modal to logout user from Livebook.
|
||||||
|
"""
|
||||||
|
@spec confirm_logout(Socket.t()) :: Socket.t()
|
||||||
|
def confirm_logout(socket) do
|
||||||
|
on_confirm = fn socket ->
|
||||||
|
Phoenix.PubSub.broadcast(Livebook.PubSub, @logout_topic, :logout)
|
||||||
|
put_flash(socket, :info, "Livebook is logging out. You will be redirected soon.")
|
||||||
|
end
|
||||||
|
|
||||||
|
confirm(socket, on_confirm,
|
||||||
|
title: "Log out",
|
||||||
|
description: "Are you sure you want to log out Livebook now?",
|
||||||
|
confirm_text: "Log out",
|
||||||
|
confirm_icon: "logout-box-line"
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -140,6 +140,12 @@ defmodule LivebookWeb.AppSessionLive do
|
||||||
<span>Debug</span>
|
<span>Debug</span>
|
||||||
</.link>
|
</.link>
|
||||||
</.menu_item>
|
</.menu_item>
|
||||||
|
<.menu_item :if={Livebook.Config.logout_enabled?() and @current_user.email != nil}>
|
||||||
|
<button phx-click="logout" role="menuitem">
|
||||||
|
<.remix_icon icon="logout-box-line" />
|
||||||
|
<span>Logout</span>
|
||||||
|
</button>
|
||||||
|
</.menu_item>
|
||||||
</.menu>
|
</.menu>
|
||||||
</div>
|
</div>
|
||||||
<div data-el-js-view-iframes phx-update="ignore" id="js-view-iframes"></div>
|
<div data-el-js-view-iframes phx-update="ignore" id="js-view-iframes"></div>
|
||||||
|
|
|
@ -41,9 +41,17 @@ defmodule LivebookWeb.AppAuthHook do
|
||||||
#
|
#
|
||||||
|
|
||||||
def on_mount(:default, %{"slug" => slug}, session, socket) do
|
def on_mount(:default, %{"slug" => slug}, session, socket) do
|
||||||
|
if connected?(socket) do
|
||||||
|
LivebookWeb.SessionHelpers.subscribe_to_logout()
|
||||||
|
end
|
||||||
|
|
||||||
livebook_authenticated? = livebook_authenticated?(session, socket)
|
livebook_authenticated? = livebook_authenticated?(session, socket)
|
||||||
|
|
||||||
socket = assign(socket, livebook_authenticated?: livebook_authenticated?)
|
socket =
|
||||||
|
socket
|
||||||
|
|> assign(livebook_authenticated?: livebook_authenticated?)
|
||||||
|
|> attach_hook(:logout, :handle_info, &handle_info/2)
|
||||||
|
|> attach_hook(:logout, :handle_event, &handle_event/3)
|
||||||
|
|
||||||
case Livebook.Apps.fetch_settings(slug) do
|
case Livebook.Apps.fetch_settings(slug) do
|
||||||
{:ok, %{access_type: :public} = app_settings} ->
|
{:ok, %{access_type: :public} = app_settings} ->
|
||||||
|
@ -70,6 +78,18 @@ defmodule LivebookWeb.AppAuthHook do
|
||||||
LivebookWeb.AuthPlug.authenticated?(session, uri.port)
|
LivebookWeb.AuthPlug.authenticated?(session, uri.port)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp handle_info(:logout, socket) do
|
||||||
|
{:halt, redirect(socket, to: ~p"/logout")}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp handle_info(_event, socket), do: {:cont, socket}
|
||||||
|
|
||||||
|
defp handle_event("logout", %{}, socket) do
|
||||||
|
{:halt, LivebookWeb.SessionHelpers.confirm_logout(socket)}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp handle_event(_event, _params, socket), do: {:cont, socket}
|
||||||
|
|
||||||
defp has_valid_token?(socket, app_settings) do
|
defp has_valid_token?(socket, app_settings) do
|
||||||
connect_params = get_connect_params(socket) || %{}
|
connect_params = get_connect_params(socket) || %{}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ defmodule LivebookWeb.SidebarHook do
|
||||||
def on_mount(:default, _params, _session, socket) do
|
def on_mount(:default, _params, _session, socket) do
|
||||||
if connected?(socket) do
|
if connected?(socket) do
|
||||||
Livebook.Hubs.Broadcasts.subscribe([:crud, :connection])
|
Livebook.Hubs.Broadcasts.subscribe([:crud, :connection])
|
||||||
|
LivebookWeb.SessionHelpers.subscribe_to_logout()
|
||||||
Phoenix.PubSub.subscribe(Livebook.PubSub, "sidebar")
|
Phoenix.PubSub.subscribe(Livebook.PubSub, "sidebar")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -67,18 +68,7 @@ defmodule LivebookWeb.SidebarHook do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp handle_event("logout", _params, socket) do
|
defp handle_event("logout", _params, socket) do
|
||||||
on_confirm = fn socket ->
|
{:halt, LivebookWeb.SessionHelpers.confirm_logout(socket)}
|
||||||
Phoenix.PubSub.broadcast(Livebook.PubSub, "sidebar", :logout)
|
|
||||||
put_flash(socket, :info, "Livebook is logging out. You will be redirected soon.")
|
|
||||||
end
|
|
||||||
|
|
||||||
{:halt,
|
|
||||||
confirm(socket, on_confirm,
|
|
||||||
title: "Log out",
|
|
||||||
description: "Are you sure you want to log out Livebook now?",
|
|
||||||
confirm_text: "Log out",
|
|
||||||
confirm_icon: "logout-box-line"
|
|
||||||
)}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp handle_event(_event, _params, socket), do: {:cont, socket}
|
defp handle_event(_event, _params, socket), do: {:cont, socket}
|
||||||
|
|
Loading…
Add table
Reference in a new issue