Add UserFetcherPlug.
authorlain <lain@soykaf.club>
Wed, 5 Sep 2018 15:44:38 +0000 (17:44 +0200)
committerlain <lain@soykaf.club>
Wed, 5 Sep 2018 15:44:38 +0000 (17:44 +0200)
lib/pleroma/plugs/user_fetcher_plug.ex [new file with mode: 0644]
test/plugs/user_fetcher_plug_test.exs [new file with mode: 0644]

diff --git a/lib/pleroma/plugs/user_fetcher_plug.ex b/lib/pleroma/plugs/user_fetcher_plug.ex
new file mode 100644 (file)
index 0000000..9cbaaf4
--- /dev/null
@@ -0,0 +1,34 @@
+defmodule Pleroma.Plugs.UserFetcherPlug do
+  import Plug.Conn
+  alias Pleroma.Repo
+  alias Pleroma.User
+
+  def init(options) do
+    options
+  end
+
+  def call(conn, options) do
+    with %{auth_credentials: %{username: username}} <- conn.assigns,
+         {:ok, %User{} = user} <- user_fetcher(username) do
+      conn
+      |> assign(:auth_user, user)
+    else
+      _ -> conn
+    end
+  end
+
+  defp user_fetcher(username_or_email) do
+    {
+      :ok,
+      cond do
+        # First, try logging in as if it was a name
+        user = Repo.get_by(User, %{nickname: username_or_email}) ->
+          user
+
+        # If we get nil, we try using it as an email
+        user = Repo.get_by(User, %{email: username_or_email}) ->
+          user
+      end
+    }
+  end
+end
diff --git a/test/plugs/user_fetcher_plug_test.exs b/test/plugs/user_fetcher_plug_test.exs
new file mode 100644 (file)
index 0000000..5195a0c
--- /dev/null
@@ -0,0 +1,37 @@
+defmodule Pleroma.Plugs.UserFetcherPlugTest do
+  use Pleroma.Web.ConnCase, async: true
+
+  alias Pleroma.Plugs.UserFetcherPlug
+  import Pleroma.Factory
+
+  setup do
+    user = insert(:user)
+    %{user: user}
+  end
+
+  test "if an auth_credentials assign is present, it tries to fetch the user and assigns it", %{
+    conn: conn,
+    user: user
+  } do
+    conn =
+      conn
+      |> assign(:auth_credentials, %{
+        username: user.nickname,
+        password: nil
+      })
+
+    conn =
+      conn
+      |> UserFetcherPlug.call(%{})
+
+    assert conn.assigns[:auth_user] == user
+  end
+
+  test "without a credential assign it doesn't do anything", %{conn: conn} do
+    ret_conn =
+      conn
+      |> UserFetcherPlug.call(%{})
+
+    assert conn == ret_conn
+  end
+end