From bd6fe4678ccc33e01e481c37089f2e00660bad25 Mon Sep 17 00:00:00 2001 From: Nikita Naumenko Date: Tue, 27 Aug 2019 05:26:44 +0000 Subject: [PATCH 1/2] Fix when not active user can login --- services/app/lib/hexlet_basics/user_manager.ex | 14 +++++++++----- .../controllers/session_controller.ex | 4 ++-- .../controllers/user_controller.ex | 6 +++--- services/app/priv/gettext/default.pot | 7 ++++++- .../app/priv/gettext/en/LC_MESSAGES/default.po | 7 ++++++- .../app/priv/gettext/ru/LC_MESSAGES/default.po | 7 ++++++- .../controllers/session_controller_test.exs | 7 +++++++ .../app/test/support/factories/user_factory.ex | 3 ++- 8 files changed, 41 insertions(+), 14 deletions(-) diff --git a/services/app/lib/hexlet_basics/user_manager.ex b/services/app/lib/hexlet_basics/user_manager.ex index 20d9267..b7b4854 100644 --- a/services/app/lib/hexlet_basics/user_manager.ex +++ b/services/app/lib/hexlet_basics/user_manager.ex @@ -3,6 +3,7 @@ defmodule HexletBasics.UserManager do alias HexletBasics.User import Ecto.Query, warn: false alias HexletBasics.Repo + import HexletBasicsWeb.Gettext def get_user!(id), do: Repo.get!(User, id) @@ -18,12 +19,15 @@ defmodule HexletBasics.UserManager do case Repo.one(query) do nil -> Bcrypt.no_user_verify() - {:error, :invalid_credentials} + {:error, gettext("There was a problem with your email/password")} user -> - if Bcrypt.verify_pass(plain_text_password, user.encrypted_password) do - {:ok, user} - else - {:error, :invalid_credentials} + cond do + !User.active?(user) -> + {:error, gettext("You have not yet verified your email")} + Bcrypt.verify_pass(plain_text_password, user.encrypted_password) -> + {:ok, user} + true -> + {:error, gettext("There was a problem with your email/password")} end end end diff --git a/services/app/lib/hexlet_basics_web/controllers/session_controller.ex b/services/app/lib/hexlet_basics_web/controllers/session_controller.ex index ad10cd6..fc8cd67 100644 --- a/services/app/lib/hexlet_basics_web/controllers/session_controller.ex +++ b/services/app/lib/hexlet_basics_web/controllers/session_controller.ex @@ -30,9 +30,9 @@ defmodule HexletBasicsWeb.SessionController do |> redirect(to: Routes.page_path(conn, :index)) end - defp login_reply({:error, _reason}, conn) do + defp login_reply({:error, reason}, conn) do conn - |> put_flash(:error, gettext("There was a problem with your email/password")) + |> put_flash(:error, reason) |> new(%{}) end diff --git a/services/app/lib/hexlet_basics_web/controllers/user_controller.ex b/services/app/lib/hexlet_basics_web/controllers/user_controller.ex index b488617..e38496c 100644 --- a/services/app/lib/hexlet_basics_web/controllers/user_controller.ex +++ b/services/app/lib/hexlet_basics_web/controllers/user_controller.ex @@ -50,9 +50,9 @@ defmodule HexletBasicsWeb.UserController do else {:ok, %User{state: state}} = Machinery.transition_to(user, UserStateMachine, "active") - user - |> User.state_changeset(%{state: state}) - |> Repo.update() + {:ok, user} = user + |> User.state_changeset(%{state: state}) + |> Repo.update() conn |> Guardian.Plug.sign_in(user) diff --git a/services/app/priv/gettext/default.pot b/services/app/priv/gettext/default.pot index 370549c..25f9ac2 100644 --- a/services/app/priv/gettext/default.pot +++ b/services/app/priv/gettext/default.pot @@ -472,7 +472,7 @@ msgid "Registration confirmed! Welcome!" msgstr "" #, elixir-format -#: lib/hexlet_basics_web/controllers/session_controller.ex:35 +#: lib/hexlet_basics/user_manager.ex:22 lib/hexlet_basics/user_manager.ex:30 msgid "There was a problem with your email/password" msgstr "" @@ -480,3 +480,8 @@ msgstr "" #: lib/hexlet_basics_web/templates/layout/app.html.slime:1 msgid "Switch language to" msgstr "" + +#, elixir-format +#: lib/hexlet_basics/user_manager.ex:26 +msgid "You have not yet verified your email" +msgstr "" diff --git a/services/app/priv/gettext/en/LC_MESSAGES/default.po b/services/app/priv/gettext/en/LC_MESSAGES/default.po index 9a0b28e..7468c71 100644 --- a/services/app/priv/gettext/en/LC_MESSAGES/default.po +++ b/services/app/priv/gettext/en/LC_MESSAGES/default.po @@ -472,7 +472,7 @@ msgid "Registration confirmed! Welcome!" msgstr "" #, elixir-format -#: lib/hexlet_basics_web/controllers/session_controller.ex:35 +#: lib/hexlet_basics/user_manager.ex:22 lib/hexlet_basics/user_manager.ex:30 msgid "There was a problem with your email/password" msgstr "" @@ -480,3 +480,8 @@ msgstr "" #: lib/hexlet_basics_web/templates/layout/app.html.slime:1 msgid "Switch language to" msgstr "" + +#, elixir-format +#: lib/hexlet_basics/user_manager.ex:26 +msgid "You have not yet verified your email" +msgstr "" diff --git a/services/app/priv/gettext/ru/LC_MESSAGES/default.po b/services/app/priv/gettext/ru/LC_MESSAGES/default.po index 9d41779..467f10d 100644 --- a/services/app/priv/gettext/ru/LC_MESSAGES/default.po +++ b/services/app/priv/gettext/ru/LC_MESSAGES/default.po @@ -472,7 +472,7 @@ msgid "Registration confirmed! Welcome!" msgstr " Ваш e-mail подтвержден, и вы авторизованы. Добро пожаловать!" #, elixir-format -#: lib/hexlet_basics_web/controllers/session_controller.ex:35 +#: lib/hexlet_basics/user_manager.ex:22 lib/hexlet_basics/user_manager.ex:30 msgid "There was a problem with your email/password" msgstr " Неправильные email/пароль" @@ -480,3 +480,8 @@ msgstr " Неправильные email/пароль" #: lib/hexlet_basics_web/templates/layout/app.html.slime:1 msgid "Switch language to" msgstr "Сменить язык на" + +#, elixir-format +#: lib/hexlet_basics/user_manager.ex:26 +msgid "You have not yet verified your email" +msgstr "Вы еще не подтвердили свой e-mail" diff --git a/services/app/test/hexlet_basics_web/controllers/session_controller_test.exs b/services/app/test/hexlet_basics_web/controllers/session_controller_test.exs index e4b716c..c6bb033 100644 --- a/services/app/test/hexlet_basics_web/controllers/session_controller_test.exs +++ b/services/app/test/hexlet_basics_web/controllers/session_controller_test.exs @@ -16,6 +16,13 @@ defmodule HexletBasicsWeb.SessionControllerTest do assert redirected_to(conn) == page_path(conn, :index) end + test "#create with not active state", %{conn: conn} do + user = insert(:user, Map.put(@create_attrs, :state, "waiting_confirmation")) + conn = post conn, session_path(conn, :create), session: @session_attrs + + assert html_response(conn, 200) + end + test "#create when user doesnt have encrypted_password", %{conn: conn} do user = insert(:user, %{email: "user@mail.ru"}) conn = post conn, session_path(conn, :create), session: @session_attrs diff --git a/services/app/test/support/factories/user_factory.ex b/services/app/test/support/factories/user_factory.ex index bc15ab5..a1d5b1a 100644 --- a/services/app/test/support/factories/user_factory.ex +++ b/services/app/test/support/factories/user_factory.ex @@ -4,7 +4,8 @@ defmodule HexletBasics.UserFactory do def user_factory do %HexletBasics.User{ github_uid: System.unique_integer([:monotonic, :positive]), - nickname: Faker.Internet.slug + nickname: Faker.Internet.slug, + state: "active" } end end From 01c3de29704ab6a414d3b056955809c9689bb3a7 Mon Sep 17 00:00:00 2001 From: Nikita Naumenko Date: Tue, 27 Aug 2019 06:45:08 +0000 Subject: [PATCH 2/2] use update with bang --- .../lib/hexlet_basics_web/controllers/user_controller.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/app/lib/hexlet_basics_web/controllers/user_controller.ex b/services/app/lib/hexlet_basics_web/controllers/user_controller.ex index e38496c..4ee10ea 100644 --- a/services/app/lib/hexlet_basics_web/controllers/user_controller.ex +++ b/services/app/lib/hexlet_basics_web/controllers/user_controller.ex @@ -50,9 +50,9 @@ defmodule HexletBasicsWeb.UserController do else {:ok, %User{state: state}} = Machinery.transition_to(user, UserStateMachine, "active") - {:ok, user} = user - |> User.state_changeset(%{state: state}) - |> Repo.update() + user = user + |> User.state_changeset(%{state: state}) + |> Repo.update!() conn |> Guardian.Plug.sign_in(user)