From 4538945b8503c97350ac225f7d5ca8ca85abd915 Mon Sep 17 00:00:00 2001 From: Carsten Date: Tue, 21 Apr 2026 22:51:11 +0200 Subject: [PATCH] feat(server): session-based auth plug + login controller/template --- .../server_web/controllers/auth_controller.ex | 28 ++++++++++++ .../lib/server_web/controllers/auth_html.ex | 5 +++ .../controllers/auth_html/login.html.heex | 43 +++++++++++++++++++ server/lib/server_web/plugs/require_auth.ex | 19 ++++++++ 4 files changed, 95 insertions(+) create mode 100644 server/lib/server_web/controllers/auth_controller.ex create mode 100644 server/lib/server_web/controllers/auth_html.ex create mode 100644 server/lib/server_web/controllers/auth_html/login.html.heex create mode 100644 server/lib/server_web/plugs/require_auth.ex diff --git a/server/lib/server_web/controllers/auth_controller.ex b/server/lib/server_web/controllers/auth_controller.ex new file mode 100644 index 0000000..dd51b42 --- /dev/null +++ b/server/lib/server_web/controllers/auth_controller.ex @@ -0,0 +1,28 @@ +defmodule ServerWeb.AuthController do + use ServerWeb, :controller + + def login(conn, _params) do + render(conn, :login, error: nil, layout: false) + end + + def create(conn, %{"password" => password}) do + case Server.Auth.verify_password(password) do + :ok -> + conn + |> configure_session(renew: true) + |> put_session(:authenticated, true) + |> redirect(to: "/") + + :error -> + conn + |> put_status(:unauthorized) + |> render(:login, error: "Incorrect password.", layout: false) + end + end + + def delete(conn, _params) do + conn + |> configure_session(drop: true) + |> redirect(to: "/login") + end +end diff --git a/server/lib/server_web/controllers/auth_html.ex b/server/lib/server_web/controllers/auth_html.ex new file mode 100644 index 0000000..a48bc20 --- /dev/null +++ b/server/lib/server_web/controllers/auth_html.ex @@ -0,0 +1,5 @@ +defmodule ServerWeb.AuthHTML do + use ServerWeb, :html + + embed_templates "auth_html/*" +end diff --git a/server/lib/server_web/controllers/auth_html/login.html.heex b/server/lib/server_web/controllers/auth_html/login.html.heex new file mode 100644 index 0000000..75f4226 --- /dev/null +++ b/server/lib/server_web/controllers/auth_html/login.html.heex @@ -0,0 +1,43 @@ + + + + + + + Sign in ยท Proxmox Monitor + + + +
+
+

Proxmox Monitor

+ + <%= if @error do %> +

{@error}

+ <% end %> + +
+ + + + + +
+
+
+ + diff --git a/server/lib/server_web/plugs/require_auth.ex b/server/lib/server_web/plugs/require_auth.ex new file mode 100644 index 0000000..48065a5 --- /dev/null +++ b/server/lib/server_web/plugs/require_auth.ex @@ -0,0 +1,19 @@ +defmodule ServerWeb.Plugs.RequireAuth do + @moduledoc "Redirects to /login unless the session is authenticated." + + import Plug.Conn + import Phoenix.Controller + + def init(opts), do: opts + + def call(conn, _opts) do + if get_session(conn, :authenticated) do + conn + else + conn + |> put_flash(:error, "Please sign in.") + |> redirect(to: "/login") + |> halt() + end + end +end