Add UserFetcherPlug.

This commit is contained in:
lain 2018-09-05 17:44:38 +02:00
parent 42bd985e66
commit faf5347748
2 changed files with 71 additions and 0 deletions

View file

@ -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

View file

@ -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