From 44c880adc4d156db8ac54d67ce5e7917b351bbff Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Mon, 18 Oct 2021 12:03:13 +0200 Subject: [PATCH] allow instructeur and administrateur to change their email to legit domain (#6550) --- app/controllers/users/profil_controller.rb | 12 +++++------- app/views/users/profil/show.html.haml | 14 ++++++++++---- config/env.example.optional | 3 +++ config/initializers/legit_admin_domains.rb | 2 ++ config/locales/views/users/profil/fr.yml | 13 +++++++++++++ .../users/profil_controller_spec.rb | 18 +++++++++++++++--- 6 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 config/initializers/legit_admin_domains.rb diff --git a/app/controllers/users/profil_controller.rb b/app/controllers/users/profil_controller.rb index b8f6e93a0..f55752c11 100644 --- a/app/controllers/users/profil_controller.rb +++ b/app/controllers/users/profil_controller.rb @@ -1,9 +1,5 @@ module Users class ProfilController < UserController - before_action :redirect_if_instructeur, - only: :update_email, - if: -> { instructeur_signed_in? } - def show @waiting_transfers = current_user.dossiers.joins(:transfer).group('dossier_transfers.email').count.to_a end @@ -15,7 +11,9 @@ module Users end def update_email - if current_user.update(update_email_params) + if current_user.instructeur? && !target_email_allowed? + flash.alert = t('.email_not_allowed', contact_email: CONTACT_EMAIL, requested_email: requested_email) + elsif current_user.update(update_email_params) flash.notice = t('devise.registrations.update_needs_confirmation') elsif current_user.errors&.details&.dig(:email)&.any? { |e| e[:error] == :taken } UserMailer.account_already_taken(current_user, requested_email).deliver_later @@ -44,8 +42,8 @@ module Users update_email_params[:email] end - def redirect_if_instructeur - redirect_to profil_path + def target_email_allowed? + LEGIT_ADMIN_DOMAINS.any? { |d| requested_email.end_with?(d) } end def next_owner_email diff --git a/app/views/users/profil/show.html.haml b/app/views/users/profil/show.html.haml index 615a4f335..46f60a875 100644 --- a/app/views/users/profil/show.html.haml +++ b/app/views/users/profil/show.html.haml @@ -18,10 +18,16 @@ %p Pour finaliser votre changement d’adresse, vérifiez vos emails et cliquez sur le lien de confirmation. - - if !instructeur_signed_in? - = form_for @current_user, url: update_email_path, method: :patch, html: { class: 'form' } do |f| - = f.email_field :email, value: nil, placeholder: 'Nouvelle adresse email', required: true - = f.submit "Changer mon adresse", class: 'button primary' + - if current_user.instructeur? + %p.mb-4 + = t('.email_explications_html', + contact_email: CONTACT_EMAIL, + application_name: APPLICATION_NAME, + legit_admin_domains: LEGIT_ADMIN_DOMAINS.join(', ')) + + = form_for @current_user, url: update_email_path, method: :patch, html: { class: 'form' } do |f| + = f.email_field :email, value: nil, placeholder: 'Nouvelle adresse email', required: true + = f.submit "Changer mon adresse", class: 'button primary' - if !instructeur_signed_in? .card diff --git a/config/env.example.optional b/config/env.example.optional index 2400a39fd..0c2b3a4c4 100644 --- a/config/env.example.optional +++ b/config/env.example.optional @@ -78,3 +78,6 @@ DS_ENV="staging" # API Particulier https://api.gouv.fr/les-api/api-particulier # API_PARTICULIER_URL="https://particulier.api.gouv.fr/api" + +# Les instructeurs et administrateurs peuvent changer leur email vers ces domaines +# LEGIT_ADMIN_DOMAINS = "domaine_1.com;domaine_2.com" diff --git a/config/initializers/legit_admin_domains.rb b/config/initializers/legit_admin_domains.rb new file mode 100644 index 000000000..cfa2bf3bc --- /dev/null +++ b/config/initializers/legit_admin_domains.rb @@ -0,0 +1,2 @@ +domains = ["gouv.fr", "sante.fr", "cnafmail.fr", "cnamts.fr", "cci.fr", "caf.fr", "msa.fr", "archi.fr", "ira-lille.fr"] +LEGIT_ADMIN_DOMAINS = ENV["LEGIT_ADMIN_DOMAINS"]&.split(';') || domains diff --git a/config/locales/views/users/profil/fr.yml b/config/locales/views/users/profil/fr.yml index b78dad849..8062880ff 100644 --- a/config/locales/views/users/profil/fr.yml +++ b/config/locales/views/users/profil/fr.yml @@ -10,6 +10,19 @@ fr: one: "Le nouveau propriétaire %{email} doit confirmer le transfert d'un dossier en suivant les instructions reçues dans son mail." other: "Le nouveau propriétaire %{email} doit confirmer le transfert de vos %{count} dossiers en suivant les instructions reçues dans son mail." transfer_confirmation: "Confirmez-vous le transfert ?" + email_explications_html: > + %{application_name} doit s'assurer que votre compte est utilisé dans un cadre professionnel. +
+
+ Nous pouvons autoriser automatiquement les changements d'email vers les domaines suivants : +
+ %{legit_admin_domains} +
+
+ Si ce n'est pas votre cas, contactez le support : + %{contact_email} + update_email: + email_not_allowed: "L’email %{requested_email} ne peut être utilisé, contactez le support : %{contact_email}" transfer_all_dossiers: new_transfer: one: "Le transfert d'un dossier à %{email} est en cours" diff --git a/spec/controllers/users/profil_controller_spec.rb b/spec/controllers/users/profil_controller_spec.rb index 12d8aebe0..bb8cf8fcc 100644 --- a/spec/controllers/users/profil_controller_spec.rb +++ b/spec/controllers/users/profil_controller_spec.rb @@ -90,12 +90,24 @@ describe Users::ProfilController, type: :controller do let!(:user) { create(:instructeur, email: instructeur_email).user } before do - patch :update_email, params: { user: { email: 'loulou@lou.com' } } + patch :update_email, params: { user: { email: requested_email } } user.reload end - it { expect(user.unconfirmed_email).to be_nil } - it { expect(response).to redirect_to(profil_path) } + context 'when the requested email is allowed' do + let(:requested_email) { 'legit@gouv.fr' } + + it { expect(user.unconfirmed_email).to eq('legit@gouv.fr') } + it { expect(response).to redirect_to(profil_path) } + it { expect(flash.notice).to eq(I18n.t('devise.registrations.update_needs_confirmation')) } + end + + context 'when the requested email is not allowed' do + let(:requested_email) { 'weird@gmail.com' } + + it { expect(response).to redirect_to(profil_path) } + it { expect(flash.alert).to include('contactez le support') } + end end end