From b83aa3226418ee8998ac5e597e88fd52501a5fa9 Mon Sep 17 00:00:00 2001 From: Kirill Sukhorukov Date: Fri, 6 May 2016 10:32:36 +0300 Subject: [PATCH 1/5] Checking the expiration of the registration token --- extensions/confirmable/lib/confirmable.ex | 1 + .../confirmable/lib/confirmable/resource.ex | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/extensions/confirmable/lib/confirmable.ex b/extensions/confirmable/lib/confirmable.ex index 96d3021..251e96e 100644 --- a/extensions/confirmable/lib/confirmable.ex +++ b/extensions/confirmable/lib/confirmable.ex @@ -2,6 +2,7 @@ defmodule Confirmable do def send_confirmation?, do: config(:send_confirmation, true) def mailer, do: config(:mailer, Confirmable.Mailer) def email_view, do: config(:email_view, Confirmable.EmailView) + def ttl, do: config(:confirmation_ttl_in_days, 30) @doc false defp config(key), do: config_entry(key) diff --git a/extensions/confirmable/lib/confirmable/resource.ex b/extensions/confirmable/lib/confirmable/resource.ex index a642f67..f67d52f 100644 --- a/extensions/confirmable/lib/confirmable/resource.ex +++ b/extensions/confirmable/lib/confirmable/resource.ex @@ -18,11 +18,27 @@ defmodule Confirmable.Resource do true -> {:ok, resource} false -> {:ok, datetime} = Ecto.DateTime.cast(:calendar.universal_time()) - Ecto.Changeset.change(resource, %{confirmed_at: datetime}) - |> Concierge.repo.update + IO.inspect Confirmable.ttl + {:ok, send_at} = Ecto.DateTime.cast(resource.confirmation_sent_at) + IO.inspect send_at + case greater_than_ttl_days?(Ecto.DateTime.to_erl(send_at), Ecto.DateTime.to_erl(datetime)) do + true -> {:error_expired_ttl} + false -> + Ecto.Changeset.change(resource, %{confirmed_at: datetime}) + |> Concierge.repo.update + end end end + @doc """ + Verifies if date A is greater than date B by TTL days or not + """ + def greater_than_ttl_days?(a, b) do + min = Confirmable.ttl * 24 * 60 * 60 + (:calendar.datetime_to_gregorian_seconds(b) - + :calendar.datetime_to_gregorian_seconds(a)) >= min + end + @doc """ Verifies whether a resource is confirmed or not """ From ec8adda047badb999f683b866d0ed7f0e686c92f Mon Sep 17 00:00:00 2001 From: Kirill Sukhorukov Date: Fri, 6 May 2016 11:15:14 +0300 Subject: [PATCH 2/5] Error. Confirmation token expired --- .../confirmable/lib/confirmable/resource.ex | 23 +++++++++++-------- .../controllers/confirmation_controller.ex | 1 + 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/extensions/confirmable/lib/confirmable/resource.ex b/extensions/confirmable/lib/confirmable/resource.ex index f67d52f..511207c 100644 --- a/extensions/confirmable/lib/confirmable/resource.ex +++ b/extensions/confirmable/lib/confirmable/resource.ex @@ -18,11 +18,8 @@ defmodule Confirmable.Resource do true -> {:ok, resource} false -> {:ok, datetime} = Ecto.DateTime.cast(:calendar.universal_time()) - IO.inspect Confirmable.ttl - {:ok, send_at} = Ecto.DateTime.cast(resource.confirmation_sent_at) - IO.inspect send_at - case greater_than_ttl_days?(Ecto.DateTime.to_erl(send_at), Ecto.DateTime.to_erl(datetime)) do - true -> {:error_expired_ttl} + case confirmation_expired?(resource) do + true -> {:error, "Expired confirmation token!"} false -> Ecto.Changeset.change(resource, %{confirmed_at: datetime}) |> Concierge.repo.update @@ -30,13 +27,21 @@ defmodule Confirmable.Resource do end end + @doc """ + Verifies if confirmation has been expired or not + """ + def confirmation_expired?(resource) do + {:ok, datetime} = Ecto.DateTime.cast(:calendar.universal_time()) + {:ok, send_at} = Ecto.DateTime.cast(resource.confirmation_sent_at) + greater_than_ttl_days?(Ecto.DateTime.to_erl(send_at), Ecto.DateTime.to_erl(datetime), Confirmable.ttl) + end + @doc """ Verifies if date A is greater than date B by TTL days or not """ - def greater_than_ttl_days?(a, b) do - min = Confirmable.ttl * 24 * 60 * 60 - (:calendar.datetime_to_gregorian_seconds(b) - - :calendar.datetime_to_gregorian_seconds(a)) >= min + def greater_than_ttl_days?(a, b, ttl) do + min = ttl * 24 * 60 * 60 + (:calendar.datetime_to_gregorian_seconds(b) - :calendar.datetime_to_gregorian_seconds(a)) >= min end @doc """ diff --git a/extensions/confirmable/web/controllers/confirmation_controller.ex b/extensions/confirmable/web/controllers/confirmation_controller.ex index 92f0cbb..58958bf 100644 --- a/extensions/confirmable/web/controllers/confirmation_controller.ex +++ b/extensions/confirmable/web/controllers/confirmation_controller.ex @@ -4,6 +4,7 @@ defmodule Concierge.Confirmable.ConfirmationController do def show(conn, %{"email" => email, "confirmation_token" => confirmation_token}) do case Confirmable.Resource.confirm!(email, confirmation_token) do {:ok, resource} -> sign_in_and_redirect(conn, resource) + {:error, message} -> error!(conn, message) {:error} -> error!(conn, "Confirmation token is invalid") end end From 5d378c198bf1a563ddb499c10a4772d1d590d57d Mon Sep 17 00:00:00 2001 From: Kirill Sukhorukov Date: Fri, 6 May 2016 11:18:29 +0300 Subject: [PATCH 3/5] Error message fixed --- .../confirmable/web/controllers/confirmation_controller.ex | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/confirmable/web/controllers/confirmation_controller.ex b/extensions/confirmable/web/controllers/confirmation_controller.ex index 58958bf..d4e1c17 100644 --- a/extensions/confirmable/web/controllers/confirmation_controller.ex +++ b/extensions/confirmable/web/controllers/confirmation_controller.ex @@ -16,7 +16,6 @@ defmodule Concierge.Confirmable.ConfirmationController do defp error!(conn, message) do conn |> put_flash(:error, message) - |> put_status(:unprocessable_entity) |> redirect(to: "/") end end \ No newline at end of file From 6df7ddbfc5eec29663c14dfe36b4b1298a3d4e7b Mon Sep 17 00:00:00 2001 From: Kirill Sukhorukov Date: Fri, 6 May 2016 12:14:28 +0300 Subject: [PATCH 4/5] Fixed 2 failing tests after HTTP status change --- .../test/controller/confirmation_controller_test.exs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/confirmable/test/controller/confirmation_controller_test.exs b/extensions/confirmable/test/controller/confirmation_controller_test.exs index 2a00e72..2f5c86f 100644 --- a/extensions/confirmable/test/controller/confirmation_controller_test.exs +++ b/extensions/confirmable/test/controller/confirmation_controller_test.exs @@ -38,7 +38,7 @@ defmodule Confirmable.ConfirmationControllerTest do conn = get(conn, Concierge.route_helpers.confirmation_path(conn, :show), [email: user.email, confirmation_token: "invalid_token"]) - assert conn.status == 422 + assert get_flash(conn, "error") == "Confirmation token is invalid" user = Confirmable.TestRepo.get(Confirmable.TestUser, user.id) refute Confirmable.Resource.confirmed?(user) @@ -54,9 +54,12 @@ defmodule Confirmable.ConfirmationControllerTest do conn = get(conn, Concierge.route_helpers.confirmation_path(conn, :show), [email: user.email]) - assert conn.status == 422 + assert get_flash(conn, "error") == "Invalid parameters" user = Confirmable.TestRepo.get(Confirmable.TestUser, user.id) refute Confirmable.Resource.confirmed?(user) end + + test "shows error when registration token has been expired" do + end end From 9b9fa044d1fff68b989b12eabf88272406410b1e Mon Sep 17 00:00:00 2001 From: Kirill Sukhorukov Date: Fri, 6 May 2016 13:24:56 +0300 Subject: [PATCH 5/5] shows error when registration token has been expired --- .../controller/confirmation_controller_test.exs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/extensions/confirmable/test/controller/confirmation_controller_test.exs b/extensions/confirmable/test/controller/confirmation_controller_test.exs index 2f5c86f..5b2ad6d 100644 --- a/extensions/confirmable/test/controller/confirmation_controller_test.exs +++ b/extensions/confirmable/test/controller/confirmation_controller_test.exs @@ -61,5 +61,21 @@ defmodule Confirmable.ConfirmationControllerTest do end test "shows error when registration token has been expired" do + {:ok, user = %Confirmable.TestUser{}} = Concierge.Resource.Registration.create(%{ + "email" => "concierge@test.com", + "password" => "123456789", + "password_confirmation" => "123456789", + }) + + user = Confirmable.TestRepo.get(Confirmable.TestUser, user.id) + {:ok, expired} = Ecto.DateTime.cast("2015-05-05 12:27:33") + user = Ecto.Changeset.change user, confirmation_sent_at: expired + Confirmable.TestRepo.update user + + conn = get(conn, Concierge.route_helpers.confirmation_path(conn, :show), + [email: user.email, confirmation_token: user.confirmation_token]) + + assert get_flash(conn, "error") == "Expired confirmation token!" + end end