diff --git a/lib/music_library_web/auth.ex b/lib/music_library_web/auth.ex index 1c5bc3c1..9d8a00cf 100644 --- a/lib/music_library_web/auth.ex +++ b/lib/music_library_web/auth.ex @@ -1,4 +1,8 @@ defmodule MusicLibraryWeb.Auth do + use Gettext, backend: MusicLibraryWeb.Gettext + import Plug.Conn + import Phoenix.Controller, only: [put_flash: 3, redirect: 2] + def correct_login_password?(password) do Plug.Crypto.secure_compare(correct_login_password(), password) end @@ -7,4 +11,15 @@ defmodule MusicLibraryWeb.Auth do Application.get_env(:music_library, MusicLibraryWeb) |> Keyword.fetch!(:login_password) end + + def require_logged_in(conn, _opts) do + if get_session(conn, :logged_in) do + conn + else + conn + |> put_flash(:error, gettext("You must be logged in to access this page")) + |> redirect(to: "/login") + |> halt() + end + end end diff --git a/lib/music_library_web/plug/require_login.ex b/lib/music_library_web/plug/require_login.ex deleted file mode 100644 index f9d2cb5f..00000000 --- a/lib/music_library_web/plug/require_login.ex +++ /dev/null @@ -1,22 +0,0 @@ -defmodule MusicLibraryWeb.Plug.RequireLogin do - @behaviour Plug - - use Gettext, backend: MusicLibraryWeb.Gettext - import Plug.Conn - import Phoenix.Controller, only: [put_flash: 3, redirect: 2] - - @impl true - def init(opts), do: opts - - @impl true - def call(conn, _opts) do - if get_session(conn, :logged_in) do - conn - else - conn - |> put_flash(:error, gettext("You must be logged in to access this page")) - |> redirect(to: "/login") - |> halt() - end - end -end diff --git a/lib/music_library_web/router.ex b/lib/music_library_web/router.ex index 41dd10e7..b61b967c 100644 --- a/lib/music_library_web/router.ex +++ b/lib/music_library_web/router.ex @@ -1,6 +1,8 @@ defmodule MusicLibraryWeb.Router do use MusicLibraryWeb, :router + import MusicLibraryWeb.Auth, only: [require_logged_in: 2] + pipeline :browser do plug :accepts, ["html"] plug :fetch_session @@ -14,8 +16,8 @@ defmodule MusicLibraryWeb.Router do plug :accepts, ["json"] end - pipeline :require_login do - plug MusicLibraryWeb.Plug.RequireLogin + pipeline :logged_in do + plug :require_logged_in end scope "/", MusicLibraryWeb do @@ -26,7 +28,7 @@ defmodule MusicLibraryWeb.Router do post "/sessions/create", SessionController, :create scope "/" do - pipe_through :require_login + pipe_through :logged_in get "/covers/:record_id", CoverController, :show @@ -56,11 +58,6 @@ defmodule MusicLibraryWeb.Router do get "/collection/latest", CollectionController, :latest end - # Other scopes may use custom stacks. - # scope "/api", MusicLibraryWeb do - # pipe_through :api - # end - # Enable LiveDashboard in development if Application.compile_env(:music_library, :dev_routes) do # If you want to use the LiveDashboard in production, you should put @@ -71,7 +68,7 @@ defmodule MusicLibraryWeb.Router do import Phoenix.LiveDashboard.Router scope "/dev" do - pipe_through [:browser, :require_login] + pipe_through [:browser, :logged_in] live_dashboard "/dashboard", metrics: MusicLibraryWeb.Telemetry, diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 1a05081d..14c92f39 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -335,7 +335,7 @@ msgstr "" msgid "Wishlist" msgstr "" -#: lib/music_library_web/plug/require_login.ex:17 +#: lib/music_library_web/auth.ex:20 #, elixir-autogen, elixir-format msgid "You must be logged in to access this page" msgstr "" diff --git a/test/music_library_web/plug/require_login_test.exs b/test/music_library_web/plug/auth_test.exs similarity index 50% rename from test/music_library_web/plug/require_login_test.exs rename to test/music_library_web/plug/auth_test.exs index da81e66c..76dd38b9 100644 --- a/test/music_library_web/plug/require_login_test.exs +++ b/test/music_library_web/plug/auth_test.exs @@ -1,28 +1,23 @@ -defmodule MusicLibraryWeb.Plug.RequireLoginTest do +defmodule MusicLibraryWeb.AuthTest do use ExUnit.Case, async: true use Plug.Test - alias MusicLibraryWeb.Plug.RequireLogin + alias MusicLibraryWeb.Auth - defp setup_conn(config) do - Map.put( - config, - :conn, + defp setup_conn(_config) do + conn = conn(:get, "/any-path") |> Phoenix.ConnTest.init_test_session(%{}) |> Phoenix.ConnTest.fetch_flash() - ) + + %{conn: conn} end - defp authenticate(%{conn: conn} = config) do - Map.put(config, :conn, Phoenix.ConnTest.init_test_session(conn, %{logged_in: true})) - end - - describe "when logged out" do + describe "require_logged_in/2" do setup [:setup_conn] - test "it redirects to /login", %{conn: conn} do - conn = RequireLogin.call(conn, []) + test "when logged out, it redirects to /login", %{conn: conn} do + conn = Auth.require_logged_in(conn, []) {"location", location} = conn.resp_headers @@ -34,13 +29,12 @@ defmodule MusicLibraryWeb.Plug.RequireLoginTest do assert location == "/login" assert conn.assigns.flash == %{"error" => "You must be logged in to access this page"} end - end - describe "when logged in" do - setup [:setup_conn, :authenticate] - - test "it passes through", %{conn: conn} do - conn = RequireLogin.call(conn, []) + test "when logged in, it passes through", %{conn: conn} do + conn = + conn + |> Phoenix.ConnTest.init_test_session(%{logged_in: true}) + |> Auth.require_logged_in([]) assert conn.status == nil assert conn.state == :unset