diff --git a/app/controllers/users/sessions_controller.rb b/app/controllers/users/sessions_controller.rb index 747646cdf..8e88cd671 100644 --- a/app/controllers/users/sessions_controller.rb +++ b/app/controllers/users/sessions_controller.rb @@ -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] diff --git a/app/models/concerns/trusted_device_concern.rb b/app/models/concerns/trusted_device_concern.rb index 07493f85b..b1c6af4e9 100644 --- a/app/models/concerns/trusted_device_concern.rb +++ b/app/models/concerns/trusted_device_concern.rb @@ -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 diff --git a/app/views/instructeur_mailer/send_login_token.html.haml b/app/views/instructeur_mailer/send_login_token.html.haml index 2bb0cd142..135401c5f 100644 --- a/app/views/instructeur_mailer/send_login_token.html.haml +++ b/app/views/instructeur_mailer/send_login_token.html.haml @@ -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 diff --git a/app/views/user_mailer/invite_instructeur.html.haml b/app/views/user_mailer/invite_instructeur.html.haml index 996d00505..e6cee2f49 100644 --- a/app/views/user_mailer/invite_instructeur.html.haml +++ b/app/views/user_mailer/invite_instructeur.html.haml @@ -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 l’activer, nous vous invitons à cliquer sur le lien suivant :  + Votre compte a été créé pour l'adresse email + %strong #{@user.email}. + +%p + Pour l’activer, 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" diff --git a/app/views/users/sessions/link_sent.html.haml b/app/views/users/sessions/link_sent.html.haml index cc4b44efe..9eb444c23 100644 --- a/app/views/users/sessions/link_sent.html.haml +++ b/app/views/users/sessions/link_sent.html.haml @@ -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 #{@email} puis cliquez sur le lien d’activation du message Connexion sécurisée à #{APPLICATION_NAME}. - %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 #{@email}. + Veuillez l’ouvrir et cliquer sur le lien de connexion sécurisée à #{APPLICATION_NAME}. - %section.link-sent-help - %p - 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 - = t('views.users.shared.contact_us_if_any_trouble_html', href: contact_admin_url) + %p.fr-text--lead + Ce lien est valide une semaine et peut-être réutilisé plusieurs fois. + + %p.fr-text--sm.fr-text-mention--grey + Ce courriel peut mettre jusqu’à 15 minutes pour arriver. Si vous n’avez pas reçu de courriel (n’hé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.fr-mt-3w + = t('views.users.shared.contact_us_if_any_trouble_html', href: contact_admin_url) diff --git a/config/locales/en.yml b/config/locales/en.yml index 5d16edd13..616cc3df1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -515,7 +515,7 @@ en: check_france_connect_html: Have you once logged in with France Connect? If yes, try again with France Connect. 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: Please note that this message can take up to 15 minutes to arrive. + email_can_take_a_while_html: Please note that this email can take up to 15 minutes to arrive. contact_us_if_any_trouble_html: 'You can contact us through this form if a problem still exists.' modal: publish: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 99c2f7102..58abcf5df 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -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: "Attention, ce message peut mettre jusqu’à 15 minutes pour arriver." + email_can_take_a_while_html: "Attention, ce courriel peut mettre jusqu’à 15 minutes pour arriver." contact_us_if_any_trouble_html: 'En cas de difficultés, nous restons joignables via ce formulaire.' modal: publish: diff --git a/config/routes.rb b/config/routes.rb index 4f7a5789b..dbe210a06 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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 diff --git a/spec/controllers/users/sessions_controller_spec.rb b/spec/controllers/users/sessions_controller_spec.rb index 43212984d..9ccf0ced1 100644 --- a/spec/controllers/users/sessions_controller_spec.rb +++ b/spec/controllers/users/sessions_controller_spec.rb @@ -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