+
+<%= render 'shared/cancel', link: decorated_session.cancel_link_url %>
+
+<%= javascript_packs_tag_once 'accept-terms-button' %>
diff --git a/config/locales/errors/en.yml b/config/locales/errors/en.yml
index 9e4d96ea6b2..534ba7be711 100644
--- a/config/locales/errors/en.yml
+++ b/config/locales/errors/en.yml
@@ -103,6 +103,7 @@ en:
registration:
terms: Before you can continue, you must give us permission. Please check the
box below and then click continue.
+ rules_of_use: Please check this box to continue
two_factor_auth_setup:
must_select_option: Select an authentication method.
verify_personal_key:
diff --git a/config/locales/errors/es.yml b/config/locales/errors/es.yml
index b3bfa19ed09..48631fd4e34 100644
--- a/config/locales/errors/es.yml
+++ b/config/locales/errors/es.yml
@@ -107,6 +107,7 @@ es:
registration:
terms: Antes de continuar, debe darnos permiso. Marque la casilla a continuación
y luego haga clic en continuar.
+ rules_of_use: Marque esta casilla para continuar
two_factor_auth_setup:
must_select_option: Seleccione un método de autenticación.
verify_personal_key:
diff --git a/config/locales/errors/fr.yml b/config/locales/errors/fr.yml
index 83ea6e447e3..a7140d77fb2 100644
--- a/config/locales/errors/fr.yml
+++ b/config/locales/errors/fr.yml
@@ -116,6 +116,7 @@ fr:
registration:
terms: Avant de pouvoir continuer, vous devez nous donner la permission.
Veuillez cocher la case ci-dessous puis cliquez sur continuer.
+ rules_of_use: Veuillez cocher cette case pour continuer
two_factor_auth_setup:
must_select_option: Sélectionnez une méthode d’authentification.
verify_personal_key:
diff --git a/config/locales/users/en.yml b/config/locales/users/en.yml
index 262c194072d..813816b7396 100644
--- a/config/locales/users/en.yml
+++ b/config/locales/users/en.yml
@@ -24,3 +24,15 @@ en:
generated_on_html: Generated on %{date}
header: Your personal key
print: Print
+ rules_of_use:
+ check_box_to_accept: Check this box to accept the login.gov
+ details_html: |-
+
Rules of Use:
+
+
Explain how the login.gov service works and what you can expect from it,
+
The terms under which we provide the login.gov service to you,
+
How we use your information and your rights to that information, and
+
The conditions you agree to when you take certain actions on the login.gov service.
+
+ overview_html: We’ve updated our %{link}. Please review and check the box below
+ to continue.
diff --git a/config/locales/users/es.yml b/config/locales/users/es.yml
index 88c4fe6263d..cf797834288 100644
--- a/config/locales/users/es.yml
+++ b/config/locales/users/es.yml
@@ -25,3 +25,15 @@ es:
generated_on_html: Generado el %{date}
header: Su clave personal
print: Imprima esta página
+ rules_of_use:
+ check_box_to_accept: Marque esta casilla para aceptar las reglas de uso de login.gov
+ details_html: |-
+
Reglas de uso:
+
+
Explique cómo funciona el servicio login.gov y qué puede esperar de él,
+
Los términos bajo los cuales le brindamos el servicio login.gov,
+
Cómo usamos su información y sus derechos sobre esa información, y
+
Las condiciones que acepta cuando realiza determinadas acciones en el servicio login.gov.
+
+ overview_html: Actualizamos nuestro %{link}. Revise y marque la casilla a
+ continuación para continuar.
diff --git a/config/locales/users/fr.yml b/config/locales/users/fr.yml
index 7bbe3aefb51..203fa9ebf53 100644
--- a/config/locales/users/fr.yml
+++ b/config/locales/users/fr.yml
@@ -27,3 +27,15 @@ fr:
generated_on_html: Générée le %{date}
header: Votre clé personnelle
print: Imprimer cette page
+ rules_of_use:
+ check_box_to_accept: Cochez cette case pour accepter les règles d’utilisation de login.gov
+ details_html: |-
+
Règles d’utilisation:
+
+
Expliquez le fonctionnement du service login.gov et ce que vous pouvez en attendre,
+
Les conditions dans lesquelles nous vous fournissons le service login.gov,
+
Comment nous utilisons vos informations et vos droits sur ces informations, et
+
Les conditions que vous acceptez lorsque vous effectuez certaines actions sur le service login.gov.
+
+ overview_html: Nous avons mis à jour notre %{link}. Veuillez consulter et cocher
+ la case ci-dessous pour continuer.
diff --git a/config/routes.rb b/config/routes.rb
index 66e9d5861be..d4b8ea5de6c 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -161,6 +161,9 @@
get '/events/disavow' => 'event_disavowal#new', as: :event_disavowal
post '/events/disavow' => 'event_disavowal#create', as: :events_disavowal
+ get '/rules_of_use' => 'users/rules_of_use#new'
+ post '/rules_of_use' => 'users/rules_of_use#create'
+
get '/piv_cac' => 'users/piv_cac_authentication_setup#new', as: :setup_piv_cac
get '/piv_cac_error' => 'users/piv_cac_authentication_setup#error', as: :setup_piv_cac_error
delete '/piv_cac' => 'users/piv_cac_authentication_setup#delete', as: :disable_piv_cac
diff --git a/spec/controllers/users/rules_of_use_controller_spec.rb b/spec/controllers/users/rules_of_use_controller_spec.rb
new file mode 100644
index 00000000000..5a10fbb38fe
--- /dev/null
+++ b/spec/controllers/users/rules_of_use_controller_spec.rb
@@ -0,0 +1,123 @@
+require 'rails_helper'
+
+RSpec.describe Users::RulesOfUseController do
+ describe 'before_actions' do
+ it 'includes appropriate before_actions' do
+ expect(subject).to have_actions(
+ :before,
+ :confirm_signed_in,
+ :confirm_need_to_accept_rules_of_use,
+ )
+ end
+ end
+
+ describe '#new' do
+ subject(:action) { get :new }
+
+ context 'with a user that has not accepted the rules of use' do
+ before do
+ sign_in_before_2fa_with_user_that_needs_to_accept_rules_of_use
+ end
+
+ it 'renders' do
+ action
+ expect(response).to render_template(:new)
+ end
+
+ it 'logs an analytics event for visiting' do
+ stub_analytics
+ expect(@analytics).to receive(:track_event).with(Analytics::RULES_OF_USE_VISIT)
+
+ action
+ end
+ end
+
+ context 'with a user that has accepted the rules of use' do
+ before do
+ sign_in_before_2fa
+ end
+
+ it 'redirects to mfa' do
+ action
+
+ expect(response).to redirect_to user_two_factor_authentication_url
+ end
+ end
+
+ context 'with no user signed in' do
+ it 'redirects to root' do
+ action
+
+ expect(response).to redirect_to root_url
+ end
+ end
+ end
+
+ describe '#create' do
+ context 'when the user needs to accept the rules of use and does accept them' do
+ subject(:action) do
+ post :create, params: { user: { terms_accepted: 'true' } }
+ end
+
+ before do
+ sign_in_before_2fa_with_user_that_needs_to_accept_rules_of_use
+ end
+
+ it 'updates the user accepted terms at timestamp' do
+ action
+
+ expect(controller.current_user.reload.accepted_terms_at).to be_present
+ end
+
+ it 'redirects to the two factor authentication page' do
+ action
+
+ expect(response).to redirect_to user_two_factor_authentication_url
+ end
+
+ it 'logs a successful analytics event' do
+ stub_analytics
+ expect(@analytics).to receive(:track_event).
+ with(Analytics::RULES_OF_USE_SUBMITTED, hash_including(success: true))
+
+ action
+ end
+ end
+
+ context 'when the user needs to accept the rules of use and does not accept them' do
+ subject(:action) do
+ post :create, params: { user: { terms_accepted: 'false' } }
+ end
+
+ before do
+ sign_in_before_2fa_with_user_that_needs_to_accept_rules_of_use
+ end
+
+ it 'does not updates the user accepted terms at timestamp' do
+ action
+
+ expect(controller.current_user.reload.accepted_terms_at).to be_nil
+ end
+
+ it 'redirects to the two factor authentication page' do
+ action
+
+ expect(response).to render_template(:new)
+ end
+
+ it 'logs a failure analytics event' do
+ stub_analytics
+ expect(@analytics).to receive(:track_event).
+ with(Analytics::RULES_OF_USE_SUBMITTED, hash_including(success: false))
+
+ action
+ end
+ end
+ end
+
+ def sign_in_before_2fa_with_user_that_needs_to_accept_rules_of_use
+ user = create(:user, :signed_up)
+ UpdateUser.new(user: user, attributes: {accepted_terms_at: nil}).call
+ sign_in_before_2fa(user)
+ end
+end
diff --git a/spec/factories/users.rb b/spec/factories/users.rb
index 3cf048e54cd..8059bb9e53b 100644
--- a/spec/factories/users.rb
+++ b/spec/factories/users.rb
@@ -8,6 +8,7 @@
with { {} }
email { Faker::Internet.safe_email }
confirmed_at { Time.zone.now }
+ accepted_terms_at { Time.zone.now }
end
after(:build) do |user, evaluator|
@@ -18,6 +19,7 @@
)
user.email = evaluator.email
user.confirmed_at = evaluator.confirmed_at
+ user.accepted_terms_at = Time.zone.now
end
after(:stub) do |user, evaluator|
@@ -28,6 +30,7 @@
)
user.email = evaluator.email
user.confirmed_at = evaluator.confirmed_at
+ user.accepted_terms_at = Time.zone.now
end
trait :with_multiple_emails do
diff --git a/spec/support/features/session_helper.rb b/spec/support/features/session_helper.rb
index 77e4756a9a9..10692cbb671 100644
--- a/spec/support/features/session_helper.rb
+++ b/spec/support/features/session_helper.rb
@@ -17,6 +17,8 @@ def expect_email_invalid(page)
end
def choose_another_security_option(option)
+ accept_rules_of_use_and_continue_if_displayed
+
click_link t('two_factor_authentication.login_options_link_text')
expect(current_path).to eq login_two_factor_options_path
@@ -262,9 +264,16 @@ def sign_in_live_with_piv_cac(user = user_with_piv_cac)
end
def fill_in_code_with_last_phone_otp
+ accept_rules_of_use_and_continue_if_displayed
fill_in :code, with: last_phone_otp
end
+ def accept_rules_of_use_and_continue_if_displayed
+ return unless current_path == rules_of_use_path
+ check t('users.rules_of_use.check_box_to_accept'), allow_label_click: true
+ click_button t('forms.buttons.continue')
+ end
+
def click_submit_default
click_button t('forms.buttons.submit.default')
end
diff --git a/spec/support/monitor/monitor_idp_steps.rb b/spec/support/monitor/monitor_idp_steps.rb
index d9bbce230f6..70424655d63 100644
--- a/spec/support/monitor/monitor_idp_steps.rb
+++ b/spec/support/monitor/monitor_idp_steps.rb
@@ -57,6 +57,12 @@ def sign_in_and_2fa(email)
fill_in 'user_email', with: email
fill_in 'user_password', with: monitor.config.login_gov_sign_in_password
click_on 'Sign in'
+
+ if current_path == rules_of_use_path
+ check 'user_terms_accepted', allow_label_click: true
+ click_button 'Continue'
+ end
+
fill_in 'code', with: monitor.check_for_otp
uncheck 'Remember this browser'
click_on 'Submit'