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