diff --git a/app/controllers/users/email_addresses/confirmations_controller.rb b/app/controllers/users/email_addresses/confirmations_controller.rb
index dad998671..b5fd334ea 100644
--- a/app/controllers/users/email_addresses/confirmations_controller.rb
+++ b/app/controllers/users/email_addresses/confirmations_controller.rb
@@ -8,12 +8,14 @@ class Users::EmailAddresses::ConfirmationsController < ApplicationController
end
def create
- user = @user.change_email_address_using_token(token)
+ if @user.change_email_address_using_token(token)
+ terminate_session if Current.session
+ start_new_session_for @user.identity
- terminate_session if Current.session
- start_new_session_for user.identity
-
- redirect_to edit_user_url(script_name: user.account.slug, id: user)
+ redirect_to edit_user_url(script_name: @user.account.slug, id: @user)
+ else
+ render :invalid_token, status: :unprocessable_entity
+ end
end
private
diff --git a/app/models/user/email_address_changeable.rb b/app/models/user/email_address_changeable.rb
index ce18d46d0..2c8de7217 100644
--- a/app/models/user/email_address_changeable.rb
+++ b/app/models/user/email_address_changeable.rb
@@ -7,14 +7,12 @@ module User::EmailAddressChangeable
def change_email_address_using_token(token)
parsed_token = SignedGlobalID.parse(token, for: EMAIL_CHANGE_TOKEN_PURPOSE)
- if parsed_token.nil?
- raise ArgumentError, "The token is invalid"
- elsif parsed_token.find != self
- raise ArgumentError, "The token was generated for a different user"
- elsif identity.email_address != parsed_token.params.fetch("old_email_address")
- raise ArgumentError, "The token was generated for a different email address"
+ old_email_address = parsed_token&.params&.fetch("old_email_address")
+ new_email_address = parsed_token&.params&.fetch("new_email_address")
+
+ if parsed_token.nil? || parsed_token.find != self || identity.email_address != old_email_address
+ false
else
- new_email_address = parsed_token.params.fetch("new_email_address")
change_email_address(new_email_address)
end
end
@@ -37,8 +35,6 @@ module User::EmailAddressChangeable
new_identity = Identity.find_or_create_by!(email_address: new_email_address)
update!(identity: new_identity)
end
-
- self
end
private
diff --git a/app/views/users/email_addresses/confirmations/invalid_token.html.erb b/app/views/users/email_addresses/confirmations/invalid_token.html.erb
new file mode 100644
index 000000000..ec3950efb
--- /dev/null
+++ b/app/views/users/email_addresses/confirmations/invalid_token.html.erb
@@ -0,0 +1,16 @@
+<% @page_title = "Link expired" %>
+
+
+
+ <%= @page_title %>
+
+
+ That email confirmation link is no longer valid—they expire after 30 minues. You’ll have to try again.
+
+
+ <%= link_to "Change my email address", new_user_email_address_path(user_id: @user, script_name: @user.account.slug), class: "btn btn--link center" %>
+
+
+ If you get stuck, <%= mail_to "support@fizzy.do", "send us an email" %> and we’ll get you back on track.
+
+
diff --git a/app/views/users/email_addresses/confirmations/show.html.erb b/app/views/users/email_addresses/confirmations/show.html.erb
index ed6e24f72..15347e887 100644
--- a/app/views/users/email_addresses/confirmations/show.html.erb
+++ b/app/views/users/email_addresses/confirmations/show.html.erb
@@ -1,11 +1,11 @@
<% @page_title = "Confirm email change" %>
-
+
<%= @page_title %>
- Just a sec while we confirm your new email address.
+ Just a sec while we confirm your new email address.
<%= form_with url: user_email_address_confirmation_path(user_id: @user.id), method: :post, data: { controller: "form auto-submit" } do |form| %>
diff --git a/app/views/users/email_addresses/create.html.erb b/app/views/users/email_addresses/create.html.erb
index 0ed95d7cc..00b660457 100644
--- a/app/views/users/email_addresses/create.html.erb
+++ b/app/views/users/email_addresses/create.html.erb
@@ -6,10 +6,10 @@
<% end %>
-
+
Check your email
We just sent an email to <%= params[:email_address] %>
-
Hit the link in the email to confirm this is the email address you want to use with Fizzy going forward.
+
Hit the link in the email to confirm this is the email address you want to use with Fizzy going forward.
<%= link_to "Done", edit_user_path(@user, script_name: @user.account.slug), class: "btn btn--link center" %>
diff --git a/app/views/users/email_addresses/new.html.erb b/app/views/users/email_addresses/new.html.erb
index 397e62300..589dca937 100644
--- a/app/views/users/email_addresses/new.html.erb
+++ b/app/views/users/email_addresses/new.html.erb
@@ -6,7 +6,7 @@
<% end %>
-
+
<%= @page_title %>
@@ -18,7 +18,7 @@
-
Enter your new email address, then hit the link to confirm it
+
Enter your new email address, then check your email to confirm the change.