allow instructeur and administrateur to change their email to legit domain (#6550)

This commit is contained in:
simon lehericey 2021-10-18 12:03:13 +02:00
parent 8616a06937
commit 44c880adc4
6 changed files with 48 additions and 14 deletions

View file

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

View file

@ -18,10 +18,16 @@
%p
Pour finaliser votre changement dadresse, 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

View file

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

View file

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

View file

@ -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: >
<b class="bold">%{application_name}</b> doit s'assurer que votre compte est utilisé dans un cadre professionnel.
<br>
<br>
Nous pouvons autoriser automatiquement les changements d'email vers les domaines suivants&nbsp;:
<br>
%{legit_admin_domains}
<br>
<br>
Si ce n'est pas votre cas, contactez le support&nbsp;:
<a href="mailto:%{contact_email}">%{contact_email}</a>
update_email:
email_not_allowed: "Lemail %{requested_email} ne peut être utilisé, contactez le support : <a href='mailto:%{contact_email}'>%{contact_email}</a>"
transfer_all_dossiers:
new_transfer:
one: "Le transfert d'un dossier à %{email} est en cours"

View file

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