defmodule ComponentsElixir.Auth do @moduledoc """ Simple authentication system for the components inventory. Uses a configured password for authentication with session management. """ @doc """ Validates the provided password against the configured password. """ def authenticate(password) do configured_password = Application.get_env(:components_elixir, :auth_password, "changeme") if password == configured_password do {:ok, :authenticated} else {:error, :invalid_credentials} end end @doc """ Checks if the current session is authenticated. """ def authenticated?(conn_or_socket_or_session) do case get_session_value(conn_or_socket_or_session, :authenticated) do true -> true _ -> false end end @doc """ Marks the session as authenticated. """ def sign_in(conn_or_socket) do put_session_value(conn_or_socket, :authenticated, true) end @doc """ Clears the authentication from the session. """ def sign_out(conn_or_socket) do put_session_value(conn_or_socket, :authenticated, nil) end # Helper functions to handle both Plug.Conn and Phoenix.LiveView.Socket defp get_session_value(%Plug.Conn{} = conn, key) do Plug.Conn.get_session(conn, key) end defp get_session_value(%Phoenix.LiveView.Socket{} = socket, key) do get_in(socket.assigns, [:session, key]) end defp get_session_value(session, key) when is_map(session) do # Handle both string and atom keys Map.get(session, to_string(key)) || Map.get(session, key) end defp put_session_value(%Plug.Conn{} = conn, key, value) do Plug.Conn.put_session(conn, key, value) end defp put_session_value(%Phoenix.LiveView.Socket{} = socket, key, value) do session = Map.put(socket.assigns[:session] || %{}, key, value) %{socket | assigns: Map.put(socket.assigns, :session, session)} end end