Merge pull request #4069 from betagouv/improve-email-change
Amélioration du changement d'adresse email
This commit is contained in:
commit
85f7412fa6
14 changed files with 106 additions and 21 deletions
|
@ -21,6 +21,14 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.warning {
|
||||||
|
border-top: 8px solid $orange;
|
||||||
|
|
||||||
|
.card-title {
|
||||||
|
color: $orange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&.feedback {
|
&.feedback {
|
||||||
max-width: 600px;
|
max-width: 600px;
|
||||||
margin: 30px auto;
|
margin: 30px auto;
|
||||||
|
|
|
@ -12,4 +12,8 @@
|
||||||
p {
|
p {
|
||||||
margin: 16px auto;
|
margin: 16px auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.email-address {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,9 @@ module Users
|
||||||
def update_email
|
def update_email
|
||||||
if @current_user.update(update_email_params)
|
if @current_user.update(update_email_params)
|
||||||
flash.notice = t('devise.registrations.update_needs_confirmation')
|
flash.notice = t('devise.registrations.update_needs_confirmation')
|
||||||
# to avoid leaking who has signed in
|
|
||||||
elsif @current_user.errors&.details&.dig(:email)&.any? { |e| e[:error] == :taken }
|
elsif @current_user.errors&.details&.dig(:email)&.any? { |e| e[:error] == :taken }
|
||||||
|
UserMailer.account_already_taken(@current_user, requested_email).deliver_later
|
||||||
|
# avoid leaking information about whether an account with this email exists or not
|
||||||
flash.notice = t('devise.registrations.update_needs_confirmation')
|
flash.notice = t('devise.registrations.update_needs_confirmation')
|
||||||
else
|
else
|
||||||
flash.alert = @current_user.errors.full_messages
|
flash.alert = @current_user.errors.full_messages
|
||||||
|
@ -27,5 +28,9 @@ module Users
|
||||||
def update_email_params
|
def update_email_params
|
||||||
params.require(:user).permit(:email)
|
params.require(:user).permit(:email)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def requested_email
|
||||||
|
update_email_params[:email]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,4 +8,12 @@ class UserMailer < ApplicationMailer
|
||||||
|
|
||||||
mail(to: user.email, subject: @subject)
|
mail(to: user.email, subject: @subject)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account_already_taken(user, requested_email)
|
||||||
|
@user = user
|
||||||
|
@requested_email = requested_email
|
||||||
|
@subject = "Changement d’adresse email"
|
||||||
|
|
||||||
|
mail(to: requested_email, subject: @subject)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -26,11 +26,11 @@
|
||||||
= link_to admin_procedures_path, class: "menu-item menu-link" do
|
= link_to admin_procedures_path, class: "menu-item menu-link" do
|
||||||
= image_tag "icons/switch-profile.svg"
|
= image_tag "icons/switch-profile.svg"
|
||||||
Passer en administrateur
|
Passer en administrateur
|
||||||
%li
|
|
||||||
= link_to profil_path, class: "menu-item menu-link" do
|
|
||||||
= image_tag "icons/switch-profile.svg"
|
|
||||||
Voir mon profil
|
|
||||||
|
|
||||||
|
%li
|
||||||
|
= link_to profil_path, class: "menu-item menu-link" do
|
||||||
|
= image_tag "icons/switch-profile.svg"
|
||||||
|
Voir mon profil
|
||||||
%li
|
%li
|
||||||
= link_to destroy_user_session_path, method: :delete, class: "menu-item menu-link" do
|
= link_to destroy_user_session_path, method: :delete, class: "menu-item menu-link" do
|
||||||
= image_tag "icons/sign-out.svg"
|
= image_tag "icons/sign-out.svg"
|
||||||
|
|
|
@ -157,6 +157,11 @@
|
||||||
Titre de la carte mise en avant
|
Titre de la carte mise en avant
|
||||||
%p Et voici le contenu de la carte
|
%p Et voici le contenu de la carte
|
||||||
|
|
||||||
|
.card.warning
|
||||||
|
.card-title
|
||||||
|
Titre de la carte d’avertissement
|
||||||
|
%p Et voici le contenu de la carte
|
||||||
|
|
||||||
.card.feedback
|
.card.feedback
|
||||||
.card-title
|
.card-title
|
||||||
Titre de la carte pour demander un avis
|
Titre de la carte pour demander un avis
|
||||||
|
|
20
app/views/user_mailer/account_already_taken.haml
Normal file
20
app/views/user_mailer/account_already_taken.haml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
- content_for(:title, @subject)
|
||||||
|
|
||||||
|
%p
|
||||||
|
Bonjour,
|
||||||
|
|
||||||
|
%p
|
||||||
|
L’utilisateur « #{@user.email} » a demandé le changement de son adresse vers « #{@requested_email} ».
|
||||||
|
|
||||||
|
%p
|
||||||
|
Malheureusement, votre compte « #{@requested_email} » existe déjà. Nous ne pouvons pas fusionner automatiquement vos comptes.
|
||||||
|
|
||||||
|
%p
|
||||||
|
%strong Nous ne pouvons donc pas effectuer le changement d’adresse email.
|
||||||
|
|
||||||
|
%p
|
||||||
|
Si vous n'êtes pas à l’origine de cette demande, vous pouvez ignorer ce message. Et si vous avez besoin d’assistance, n’hésitez pas à nous contacter à
|
||||||
|
= succeed '.' do
|
||||||
|
= mail_to CONTACT_EMAIL
|
||||||
|
|
||||||
|
= render partial: "layouts/mailers/signature"
|
|
@ -7,12 +7,16 @@
|
||||||
|
|
||||||
.card
|
.card
|
||||||
.card-title Coordonnées
|
.card-title Coordonnées
|
||||||
%p Votre email est actuellement #{current_user.email}
|
%p
|
||||||
|
Votre email est actuellement
|
||||||
|
%span.email-address= current_user.email
|
||||||
- if current_user.unconfirmed_email.present?
|
- if current_user.unconfirmed_email.present?
|
||||||
%p
|
.card.warning
|
||||||
Un email a été envoyé à #{current_user.unconfirmed_email}.
|
.card-title
|
||||||
%br
|
Changement en attente :
|
||||||
Merci de vérifier vos emails et de cliquer sur le lien d’activation pour finaliser la validation de votre nouvelle adresse.
|
%span.email-address= current_user.unconfirmed_email
|
||||||
|
%p
|
||||||
|
Pour finaliser votre changement d’adresse, vérifiez vos emails et cliquez sur le lien de confirmation.
|
||||||
|
|
||||||
= form_for @current_user, url: update_email_path, method: :patch, html: { class: 'form' } do |f|
|
= 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.email_field :email, value: nil, placeholder: 'Nouvelle adresse email', required: true
|
||||||
|
|
|
@ -42,7 +42,7 @@ fr:
|
||||||
signed_up_but_inactive: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte n'est pas encore activé."
|
signed_up_but_inactive: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte n'est pas encore activé."
|
||||||
signed_up_but_locked: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte est verrouillé."
|
signed_up_but_locked: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte est verrouillé."
|
||||||
signed_up_but_unconfirmed: "Nous vous avons envoyé un email contenant un lien d'activation. Ouvrez ce lien pour activer votre compte."
|
signed_up_but_unconfirmed: "Nous vous avons envoyé un email contenant un lien d'activation. Ouvrez ce lien pour activer votre compte."
|
||||||
update_needs_confirmation: "Votre compte a bien été mis à jour mais nous devons vérifier votre nouvelle adresse email. Merci de vérifier vos emails et de cliquer sur le lien d’activation pour finaliser la validation de votre nouvelle adresse."
|
update_needs_confirmation: "Vous devez confirmer votre nouvelle adresse email. Vérifiez vos emails, et cliquez sur le lien de confirmation pour confirmer votre changement d’adresse."
|
||||||
updated: "Votre compte a été modifié avec succès."
|
updated: "Votre compte a été modifié avec succès."
|
||||||
sessions:
|
sessions:
|
||||||
signed_in: "Connecté."
|
signed_in: "Connecté."
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Users::ProfilController, type: :controller do
|
describe Users::ProfilController, type: :controller do
|
||||||
|
include ActiveJob::TestHelper
|
||||||
|
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
before { sign_in(user) }
|
before { sign_in(user) }
|
||||||
|
@ -34,13 +36,17 @@ describe Users::ProfilController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the mail is already taken' do
|
context 'when the mail is already taken' do
|
||||||
let!(:user2) { create(:user) }
|
let(:existing_user) { create(:user) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
patch :update_email, params: { user: { email: user2.email } }
|
perform_enqueued_jobs do
|
||||||
|
patch :update_email, params: { user: { email: existing_user.email } }
|
||||||
|
end
|
||||||
user.reload
|
user.reload
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it { expect(user.unconfirmed_email).to be_nil }
|
||||||
|
it { expect(ActionMailer::Base.deliveries.last.to).to eq([existing_user.email]) }
|
||||||
it { expect(response).to redirect_to(profil_path) }
|
it { expect(response).to redirect_to(profil_path) }
|
||||||
it { expect(flash.notice).to eq(I18n.t('devise.registrations.update_needs_confirmation')) }
|
it { expect(flash.notice).to eq(I18n.t('devise.registrations.update_needs_confirmation')) }
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,14 +19,15 @@ feature 'Changing an email' do
|
||||||
click_button 'Changer mon adresse'
|
click_button 'Changer mon adresse'
|
||||||
end
|
end
|
||||||
|
|
||||||
user.reload
|
expect(page).to have_content(I18n.t('devise.registrations.update_needs_confirmation'))
|
||||||
expect(user.email).to eq(old_email)
|
expect(page).to have_content(old_email)
|
||||||
expect(user.unconfirmed_email).to eq(new_email)
|
expect(page).to have_content(new_email)
|
||||||
|
|
||||||
click_confirmation_link_for(new_email)
|
click_confirmation_link_for(new_email)
|
||||||
|
|
||||||
user.reload
|
expect(page).to have_content(I18n.t('devise.confirmations.confirmed'))
|
||||||
expect(user.email).to eq(new_email)
|
expect(page).not_to have_content(old_email)
|
||||||
expect(user.unconfirmed_email).to be_nil
|
expect(page).to have_content(new_email)
|
||||||
|
expect(user.reload.email).to eq(new_email)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,6 +3,10 @@ class UserMailerPreview < ActionMailer::Preview
|
||||||
UserMailer.new_account_warning(user)
|
UserMailer.new_account_warning(user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account_already_taken
|
||||||
|
UserMailer.account_already_taken(user, 'dircab@territoires.gouv.fr')
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def user
|
def user
|
||||||
|
|
21
spec/mailers/user_mailer_spec.rb
Normal file
21
spec/mailers/user_mailer_spec.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
require "rails_helper"
|
||||||
|
|
||||||
|
RSpec.describe UserMailer, type: :mailer do
|
||||||
|
let(:user) { build(:user) }
|
||||||
|
|
||||||
|
describe '.new_account_warning' do
|
||||||
|
subject { described_class.new_account_warning(user) }
|
||||||
|
|
||||||
|
it { expect(subject.to).to eq([user.email]) }
|
||||||
|
it { expect(subject.body).to include(user.email) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.account_already_taken' do
|
||||||
|
let(:requested_email) { 'new@exemple.fr' }
|
||||||
|
|
||||||
|
subject { described_class.account_already_taken(user, requested_email) }
|
||||||
|
|
||||||
|
it { expect(subject.to).to eq([requested_email]) }
|
||||||
|
it { expect(subject.body).to include(requested_email) }
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,4 +1,4 @@
|
||||||
require 'spec_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Dossier do
|
describe Dossier do
|
||||||
include ActiveJob::TestHelper
|
include ActiveJob::TestHelper
|
||||||
|
@ -420,7 +420,6 @@ describe Dossier do
|
||||||
|
|
||||||
it "send an email when the dossier is created for the very first time" do
|
it "send an email when the dossier is created for the very first time" do
|
||||||
dossier = nil
|
dossier = nil
|
||||||
ActiveJob::Base.queue_adapter = :test
|
|
||||||
expect do
|
expect do
|
||||||
perform_enqueued_jobs do
|
perform_enqueued_jobs do
|
||||||
dossier = Dossier.create(procedure: procedure, state: Dossier.states.fetch(:brouillon), user: user)
|
dossier = Dossier.create(procedure: procedure, state: Dossier.states.fetch(:brouillon), user: user)
|
||||||
|
|
Loading…
Add table
Reference in a new issue