Packages
livebook
0.19.2
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook_web/live/app_auth_live.ex
defmodule LivebookWeb.AppAuthLive do
use LivebookWeb, :live_view
@impl true
def mount(%{"slug" => slug} = params, _session, socket)
when not socket.assigns.app_authenticated? do
{:ok,
assign(socket,
slug: slug,
authenticated_path: authenticated_path(params),
password: "",
errors: []
)}
end
def mount(params, _session, socket) do
{:ok, push_navigate(socket, to: authenticated_path(params))}
end
defp authenticated_path(%{"slug" => slug, "id" => id}), do: ~p"/apps/#{slug}/sessions/#{id}"
defp authenticated_path(%{"slug" => slug}), do: ~p"/apps/#{slug}"
@impl true
def render(assigns) do
~H"""
<div class="h-screen flex items-center justify-center" id="app-auth" phx-hook="AppAuth">
<div class="flex flex-col space-y-4 items-center">
<a href={~p"/"}>
<img src={~p"/images/logo.png"} height="128" width="128" alt="livebook" />
</a>
<div class="text-2xl text-gray-800">
This app is password-protected
</div>
<div class="max-w-2xl text-center text-gray-700">
<span>Type the app password to access it or</span>
<a
class="border-b border-gray-700 hover:border-none"
href={~p"/authenticate?redirect_to=#{@authenticated_path}"}
>log in to Livebook</a>.
</div>
<div class="text-2xl text-gray-800 w-full pt-2">
<form class="flex flex-col space-y-4 items-center" phx-submit="authenticate">
<div class="w-[20ch]">
<.text_field
type="password"
name="password"
value={@password}
placeholder="Password"
autofocus
/>
<span :for={error <- @errors} class="mt-1 text-red-600 text-sm">
{translate_error(error)}
</span>
</div>
<.button type="submit">
Authenticate
</.button>
</form>
</div>
</div>
</div>
"""
end
@impl true
def handle_event("authenticate", %{"password" => password}, socket) do
socket =
if LivebookWeb.AppAuthHook.valid_password?(password, socket.assigns.app_settings) do
token = LivebookWeb.AppAuthHook.get_auth_token(socket.assigns.app_settings)
push_event(socket, "persist_app_auth", %{"slug" => socket.assigns.slug, "token" => token})
else
assign(socket, password: password, errors: [{"app password is invalid", []}])
end
{:noreply, socket}
end
def handle_event("app_auth_persisted", %{}, socket) do
{:noreply, push_navigate(socket, to: socket.assigns.authenticated_path)}
end
end