amelioration(instructeur.connexion): ETQ instructeur, je peux redemander un lien de connexion securisé

This commit is contained in:
Martin 2023-08-29 16:41:45 +02:00 committed by mfo
parent 3c410e48f3
commit 4974962abd
9 changed files with 76 additions and 21 deletions

View file

@ -6,7 +6,7 @@ class Users::SessionsController < Devise::SessionsController
layout 'login', only: [:new, :create]
before_action :restore_procedure_context, only: [:new, :create]
skip_before_action :redirect_if_untrusted
# POST /resource/sign_in
def create
user = User.find_by(email: params[:user][:email])
@ -18,6 +18,12 @@ class Users::SessionsController < Devise::SessionsController
super
end
def reset_link_sent
send_login_token_or_bufferize(current_instructeur)
flash[:notice] = "Nous venons de vous renvoyer un nouveau lien de connexion sécurisée à #{APPLICATION_NAME}"
redirect_to link_sent_path(email: current_instructeur.email)
end
def link_sent
if Devise.email_regexp.match?(params[:email])
@email = params[:email]

View file

@ -19,8 +19,8 @@ module TrustedDeviceConcern
def send_login_token_or_bufferize(instructeur)
if !instructeur.young_login_token?
login_token = instructeur.create_trusted_device_token
InstructeurMailer.send_login_token(instructeur, login_token).deliver_later
token = instructeur.create_trusted_device_token
InstructeurMailer.send_login_token(instructeur, token).deliver_later
end
end

View file

@ -2,7 +2,7 @@
Bonjour,
%p
Veuillez cliquer sur le lien suivant pour vous connecter sur le site #{APPLICATION_NAME} : 
Veuillez cliquer sur le lien sécurisé suivant pour vous connecter à #{APPLICATION_NAME} : 
= link_to(sign_in_by_link_url(@instructeur_id, jeton: @login_token), sign_in_by_link_url(@instructeur_id, jeton: @login_token))
%p

View file

@ -7,11 +7,18 @@
Vous venez dêtre nommé instructeur sur #{APPLICATION_NAME}.
%p
Votre compte a été créé pour l'adresse email #{@user.email}. Pour lactiver, nous vous invitons à cliquer sur le lien suivant : 
Votre compte a été créé pour l'adresse email
%strong #{@user.email}.
%p
Pour lactiver, nous vous invitons à cliquer sur le lien suivant : 
= link_to(users_activate_url(token: @reset_password_token), users_activate_url(token: @reset_password_token))
%p
Par ailleurs, nous vous invitons à prendre quelques minutes pour consulter notre tutoriel à destination des nouveaux instructeurs :
Lors de vos prochaines connexions sur Démarches simplifiées cliquez sur le bouton « Se connecter » positionné sur le haut de page ou bien sur ce lien : 
= link_to new_user_session_url, new_user_session_url
%p
Nous vous invitons aussi à consulter notre tutoriel à destination des nouveaux instructeurs :
= link_to(INSTRUCTEUR_TUTORIAL_URL, INSTRUCTEUR_TUTORIAL_URL)
= render partial: "layouts/mailers/signature"

View file

@ -3,18 +3,27 @@
- content_for :footer do
= render partial: 'root/footer'
#link-sent.container
= image_tag('user/confirmation-email.svg', "aria-hidden": true)
%h1 Encore une petite étape :)
.fr-container.fr-my-5w
.fr-grid-row
.fr-col-12.fr-col-offset-md-1.fr-col-md-7
%h1.fr-mt-6w Encore une petite étape !
%section.link-sent-info
%p
Ouvrez votre boite email <strong>#{@email}</strong> puis cliquez sur le lien dactivation du message <strong>Connexion sécurisée à #{APPLICATION_NAME}</strong>.
%p
= t('views.users.shared.email_can_take_a_while_html')
%section
%p.fr-text--lead
Nous venons de vous envoyer un courriel sur votre boite email <strong>#{@email}</strong>.
Veuillez louvrir et cliquer sur le lien de <strong>connexion sécurisée à #{APPLICATION_NAME}</strong>.
%section.link-sent-help
%p
%p.fr-text--lead
Ce lien est <strong>valide une semaine</strong> et peut-être réutilisé <strong>plusieurs fois</strong>.
%p.fr-text--sm.fr-text-mention--grey
Ce courriel peut mettre jusquà <strong>15 minutes</strong> pour arriver. Si vous navez pas reçu de courriel (nhésitez pas à vérifier dans les indésirables), cliquez sur le bouton ci-dessous.
= button_to instructeurs_reset_link_sent_path, class: 'fr-btn fr-btn--secondary fr-btn--icon-left fr-icon-mail-line', method: 'POST' do
Renvoyer le courriel
%section
%p.fr-mt-3w
Si vous voyez cette page trop souvent, consultez notre aide : #{link_to t("links.common.faq.confirmer_compte_chaque_connexion_url"), **external_link_attributes}
%p
%p.fr-mt-3w
= t('views.users.shared.contact_us_if_any_trouble_html', href: contact_admin_url)

View file

@ -515,7 +515,7 @@ en:
check_france_connect_html: Have you once logged in with France Connect? If yes, <a href=\"%{href}\">try again with France Connect</a>.
check_gpdr: "The account may have been deleted in the event of prolonged inactivity and no current file. In this case you will have to recreate an account from a procedure."
shared:
email_can_take_a_while_html: <strong>Please note</strong> that this message can take up to 15 minutes to arrive.
email_can_take_a_while_html: <strong>Please note</strong> that this email can take up to 15 minutes to arrive.
contact_us_if_any_trouble_html: 'You can contact us <a href="%{href}">through this form</a> if a problem still exists.'
modal:
publish:

View file

@ -519,7 +519,7 @@ fr:
open_your_mailbox: "Maintenant ouvrez votre boite email."
title: "Lien de réinitialisation du mot de passe envoyé"
shared:
email_can_take_a_while_html: "<strong>Attention</strong>, ce message peut mettre jusquà <strong>15 minutes</strong> pour arriver."
email_can_take_a_while_html: "<strong>Attention</strong>, ce courriel peut mettre jusquà <strong>15 minutes</strong> pour arriver."
contact_us_if_any_trouble_html: 'En cas de difficultés, nous restons joignables <a href="%{href}">via ce formulaire</a>.'
modal:
publish:

View file

@ -125,6 +125,7 @@ Rails.application.routes.draw do
get '/users/no_procedure' => 'users/sessions#no_procedure'
get 'connexion-par-jeton/:id' => 'users/sessions#sign_in_by_link', as: 'sign_in_by_link'
get 'lien-envoye' => 'users/sessions#link_sent', as: 'link_sent'
post '/instructeurs/reset-link-sent' => 'users/sessions#reset_link_sent'
get '/users/password/reset-link-sent' => 'users/passwords#reset_link_sent'
end

View file

@ -244,4 +244,36 @@ describe Users::SessionsController, type: :controller do
end
end
end
describe '#reset_link_sent' do
let(:instructeur) { create(:instructeur, user: user) }
before { sign_in(user) }
subject { post :reset_link_sent }
context 'when the instructeur is signed without trust_device_token' do
it 'send InstructeurMailer.send_login_token' do
expect(InstructeurMailer).to receive(:send_login_token).with(instructeur, anything).and_return(double(deliver_later: true))
expect { subject }.to change { instructeur.trusted_device_tokens.count }.by(1)
end
end
context 'when the instructeur is signed with an young trust_device_token' do
before { instructeur.create_trusted_device_token }
it 'doesnot send InstructeurMailer.send_login_token' do
expect(InstructeurMailer).not_to receive(:send_login_token)
expect { subject }.to change { instructeur.trusted_device_tokens.count }.by(0)
end
end
context 'when the instructeur is signed with an old trust_device_token' do
let(:token) { instructeur.create_trusted_device_token }
before do
travel_to 15.minutes.from_now
end
it 'send InstructeurMailer.send_login_token' do
expect(InstructeurMailer).to receive(:send_login_token).with(instructeur, anything).and_return(double(deliver_later: true))
expect { subject }.to change { instructeur.trusted_device_tokens.count }.by(1)
end
end
end
end