Packages
livebook
0.9.3
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}, _session, socket) when not socket.assigns.app_authenticated? do
{:ok, assign(socket, slug: slug, password: "", errors: [])}
end
def mount(%{"slug" => slug}, _session, socket) do
{:ok, push_navigate(socket, to: ~p"/apps/#{slug}")}
end
@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=#{~p"/apps/#{@slug}"}"}
>login into 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 phx-feedback-for="password" class={["w-[20ch]", @errors != [] && "show-errors"]}>
<input
type="password"
name="password"
class="input"
value={@password}
placeholder="Password"
autofocus
/>
<span
:for={error <- @errors}
class="mt-1 hidden text-red-600 text-sm phx-form-error:block"
>
<%= translate_error(error) %>
</span>
</div>
<button type="submit" class="button-base button-blue">
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: ~p"/apps/#{socket.assigns.slug}")}
end
end