From fae29d1696ab4734da2d28eba8dab7337c06042c Mon Sep 17 00:00:00 2001
From: Clara Bridges
Date: Mon, 26 Aug 2019 12:02:40 -0400
Subject: [PATCH 01/17] LG-1722
---
app/controllers/users/phones_controller.rb | 12 ++--
app/forms/edit_phone_form.rb | 70 +++++++++++++++++++
app/views/users/phone_setup/index.html.erb | 20 ++++--
app/views/users/phones/add.html.erb | 19 +++--
app/views/users/phones/edit.html.erb | 33 ++++++---
...otp_delivery_preference_selection.html.erb | 4 +-
.../shared/_otp_make_default_number.html.erb | 2 +-
app/views/users/shared/_phone_form.html.erb | 25 -------
.../users/phones_controller_spec.rb | 18 -----
.../two_factor_authentication/sign_in_spec.rb | 1 -
spec/forms/user_phone_form_spec.rb | 26 ++++---
11 files changed, 149 insertions(+), 81 deletions(-)
create mode 100644 app/forms/edit_phone_form.rb
delete mode 100644 app/views/users/shared/_phone_form.html.erb
diff --git a/app/controllers/users/phones_controller.rb b/app/controllers/users/phones_controller.rb
index b70b138274b..d73de9d7992 100644
--- a/app/controllers/users/phones_controller.rb
+++ b/app/controllers/users/phones_controller.rb
@@ -22,15 +22,15 @@ def create
def edit
set_phone_id
# memoized for view
- user_phone_form
+ edit_phone_form
end
def update
- if user_phone_form.submit(user_params).success? && !already_has_phone?
+ if edit_phone_form.submit(user_params).success?
process_updates
bypass_sign_in current_user
else
- render_edit
+ render :edit
end
end
@@ -50,8 +50,8 @@ def delete
private
- def user_phone_form
- @user_phone_form ||= UserPhoneForm.new(current_user, phone_configuration)
+ def edit_phone_form
+ @edit_phone_form ||= EditPhoneForm.new(current_user, phone_configuration)
end
def render_edit
@@ -81,7 +81,7 @@ def delivery_preference
end
def process_updates
- form = @user_phone_form
+ form = @user_phone_form || @edit_phone_form
if form.phone_config_changed?
analytics.track_event(Analytics::PHONE_CHANGE_REQUESTED)
diff --git a/app/forms/edit_phone_form.rb b/app/forms/edit_phone_form.rb
new file mode 100644
index 00000000000..b8eaa170124
--- /dev/null
+++ b/app/forms/edit_phone_form.rb
@@ -0,0 +1,70 @@
+class EditPhoneForm
+ include ActiveModel::Model
+ include RememberDeviceConcern
+
+ validates :otp_delivery_preference, inclusion: { in: %w[voice sms] }
+
+ attr_accessor :phone, :otp_delivery_preference, :otp_make_default_number, :phone_configuration
+
+ def initialize(user, phone_configuration)
+ self.user = user
+ self.phone_configuration = phone_configuration
+ self.otp_make_default_number = true if default_phone_configuration?
+ end
+
+ def submit(params)
+ ingest_submitted_params(params)
+ success = valid?
+
+ self.phone = submitted_phone unless success
+ revoke_remember_device(user) if success
+ FormResponse.new(success: success, errors: errors.messages, extra: extra_analytics_attributes)
+ end
+
+ def delivery_preference_sms?
+ return true if phone_configuration.blank?
+ phone_configuration&.delivery_preference == 'sms'
+ end
+
+ def delivery_preference_voice?
+ phone_configuration&.delivery_preference == 'voice'
+ end
+
+ def phone_config_changed?
+ return true if phone_configuration&.delivery_preference != otp_delivery_preference
+ return true if otp_make_default_number && !default_phone_configuration?
+ false
+ end
+
+ # :reek:FeatureEnvy
+ def masked_number
+ phone_number = phone_configuration == nil ? nil : phone_configuration.phone
+ return '' if !phone_number || phone_number.blank?
+ "***-***-#{phone_number[-4..-1]}"
+ end
+
+ private
+
+ attr_accessor :user, :submitted_phone
+
+
+ def extra_analytics_attributes
+ {
+ otp_delivery_preference: otp_delivery_preference,
+ }
+ end
+
+ def ingest_submitted_params(params)
+
+ delivery_prefs = params[:otp_delivery_preference]
+ default_prefs = params[:otp_make_default_number]
+
+ self.otp_delivery_preference = delivery_prefs if delivery_prefs
+ self.otp_make_default_number = true if default_prefs
+ end
+
+ def default_phone_configuration?
+ phone_configuration == user.default_phone_configuration
+ end
+
+end
diff --git a/app/views/users/phone_setup/index.html.erb b/app/views/users/phone_setup/index.html.erb
index 02b14be4515..c9dafd0bdc8 100644
--- a/app/views/users/phone_setup/index.html.erb
+++ b/app/views/users/phone_setup/index.html.erb
@@ -12,10 +12,22 @@
<%= t('two_factor_authentication.phone_fee_disclosure') %>
-<%= render 'users/shared/phone_form',
- http_method: :patch,
- target_url: phone_setup_path,
- button: t('forms.buttons.send_security_code') %>
+<%= simple_form_for(@user_phone_form,
+ html: { autocomplete: 'off', method: :patch, role: 'form' },
+ data: { international_phone_form: true },
+ url: phone_setup_path) do |f| %>
+
+ <%= render 'users/shared/phone_number_edit', f: f %>
+
+ <%= render 'users/shared/otp_delivery_preference_selection',
+ form_obj: @user_phone_form%>
+ <% if TwoFactorAuthentication::PhonePolicy.new(current_user).enabled? %>
+ <%= render 'users/shared/otp_make_default_number',
+ form_obj: @user_phone_form%>
+ <% end %>
+ <%= f.button :submit, t('forms.buttons.send_security_code'), class: 'no-auto-enable btn-wide' %>
+<% end %>
+
<%= link_to t('two_factor_authentication.choose_another_option'), two_factor_options_path %>
diff --git a/app/views/users/phones/add.html.erb b/app/views/users/phones/add.html.erb
index b27b8d8e3f8..7f76ab1d563 100644
--- a/app/views/users/phones/add.html.erb
+++ b/app/views/users/phones/add.html.erb
@@ -10,10 +10,21 @@
<%= t('two_factor_authentication.phone_fee_disclosure') %>
-<%= render 'users/shared/phone_form',
- http_method: :post,
- target_url: add_phone_path,
- button: t('forms.buttons.continue') %>
+<%= simple_form_for(@user_phone_form,
+ html: { autocomplete: 'off', method: :post, role: 'form' },
+ data: { international_phone_form: true },
+ url: add_phone_path) do |f| %>
+
+ <%= render 'users/shared/phone_number_edit', f: f %>
+
+ <%= render 'users/shared/otp_delivery_preference_selection',
+ form_obj: @user_phone_form%>
+ <% if TwoFactorAuthentication::PhonePolicy.new(current_user).enabled? %>
+ <%= render 'users/shared/otp_make_default_number',
+ form_obj: @user_phone_form%>
+ <% end %>
+ <%= f.button :submit, t('forms.buttons.continue'), class: 'no-auto-enable btn-wide' %>
+<% end %>
<%= render 'shared/cancel', link: account_path %>
diff --git a/app/views/users/phones/edit.html.erb b/app/views/users/phones/edit.html.erb
index 000524725cf..a50704357ad 100644
--- a/app/views/users/phones/edit.html.erb
+++ b/app/views/users/phones/edit.html.erb
@@ -1,15 +1,32 @@
-<% title t('titles.edit_info.phone') %>
+<% title t('titles.edit_info.phone') %>
+
<%= t('headings.edit_info.phone') %>
+
-
<%= render 'users/shared/phone_form',
- http_method: :put,
- target_url: manage_phone_path,
- button: t('forms.buttons.submit.confirm_change') %>
+<%= simple_form_for(@edit_phone_form,
+ html: { autocomplete: 'off', method: :put, role: 'form' },
+ data: { international_phone_form: true },
+ url: manage_phone_path) do |f| %>
-<% if MfaPolicy.new(current_user).more_than_two_factors_enabled? && @user_phone_form.phone.present? %>
+
+ <%= t('two_factor_authentication.phone_label') %>:
+ <%= @edit_phone_form.masked_number %>
+
+
+ <%= render 'users/shared/otp_delivery_preference_selection',
+ form_obj: @edit_phone_form%>
+ <% if TwoFactorAuthentication::PhonePolicy.new(current_user).enabled? %>
+ <%= render 'users/shared/otp_make_default_number',
+ form_obj: @edit_phone_form%>
+ <% end %>
+ <%= f.button :submit, t('forms.buttons.submit.confirm_change'), class: 'no-auto-enable btn-wide' %>
+<% end %>
+
+
+<% if MfaPolicy.new(current_user).more_than_two_factors_enabled? && @edit_phone_form.phone.present? %>
- <%= button_to t('forms.phone.buttons.delete'), manage_phone_url(id: params[:id]),
+ <%= button_to t('forms.phone.buttons.delete'), manage_phone_path(id: params[:id]),
class: 'btn btn-danger btn-wide',
method: :delete %>
@@ -17,5 +34,3 @@
<%= render 'shared/cancel', link: account_path %>
-<%= stylesheet_link_tag 'intl-tel-number/intlTelInput' %>
-<%= javascript_pack_tag 'intl-tel-input' %>
diff --git a/app/views/users/shared/_otp_delivery_preference_selection.html.erb b/app/views/users/shared/_otp_delivery_preference_selection.html.erb
index a293049a6dd..cc4b030b00c 100644
--- a/app/views/users/shared/_otp_delivery_preference_selection.html.erb
+++ b/app/views/users/shared/_otp_delivery_preference_selection.html.erb
@@ -12,7 +12,7 @@
>
<%= radio_button_tag 'user_phone_form[otp_delivery_preference]',
- :sms, @user_phone_form.delivery_preference_sms?,
+ :sms, form_obj.delivery_preference_sms?,
class: :otp_delivery_preference_sms %>
<%= t('two_factor_authentication.otp_delivery_preference.sms') %>
@@ -24,7 +24,7 @@
>
<%= radio_button_tag 'user_phone_form[otp_delivery_preference]',
- :voice, @user_phone_form.delivery_preference_voice?,
+ :voice, form_obj.delivery_preference_voice?,
class: :otp_delivery_preference_voice %>
<%= t('two_factor_authentication.otp_delivery_preference.voice') %>
diff --git a/app/views/users/shared/_otp_make_default_number.html.erb b/app/views/users/shared/_otp_make_default_number.html.erb
index 74486b9f7d9..22ef43a982d 100644
--- a/app/views/users/shared/_otp_make_default_number.html.erb
+++ b/app/views/users/shared/_otp_make_default_number.html.erb
@@ -9,7 +9,7 @@