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