Skip to main content

Mot de passe (primaire) — détails techniques

Fiche fonctionnelle

Description et fonctionnalités de ce module : Mot de passe (primaire).

Fonctionnalité portée par les modules auth et directory d'entcore (fork open-ent, versions -patched). Premier degré uniquement.

Architecture

Feature 1 — Demande de l'élève depuis la page de connexion

  • Endpoint public POST /auth/forgot/teacher-request (AuthController.teacherForgotPasswordRequest). Sans session. Garde le flag de config primary-assisted-password-reset. Répond toujours 200 générique (anti-énumération) ; ne notifie que sur la branche succès.
  • Service UserAuthAccount.requestTeacherPasswordReset (DefaultUserAuthAccount) : valide que le login est un élève activé non fédéré d'une classe ayant un enseignant, pose les flags Neo4j passwordResetRequested / passwordResetRequestDate sur le nœud User, et retourne les enseignant·e·s de la classe ({id, email}).
  • Notification : TimelineHelper.notifyTimeline avec le type password-reset-request.password-reset-request (template enregistré côté directory : view/notify/password-reset-request/, i18n i18n/timeline/). Anti-spam : pas de re-notification dans la fenêtre password-reset-request-debounce-ms (défaut 1 h).
  • E-mail : DefaultUserAuthAccount.sendPasswordResetRequestMail (template view/email/passwordResetRequestTeacher.html).
  • Page de connexion (AngularJS) : détection 1er degré (is1D, thème parent panda / openent1d) dans login.ts ; lien adapté à l'âge dans login-form.html ; route #/teacher-request + écran convivial forgot-teacher-request-form.html (forgot.ts).

Feature 2 — Réinitialisation par l'enseignant (paramétrage de la classe)

  • Endpoint POST /auth/reset/student-temp-password (AuthController.resetStudentTempPassword), sécurisé comme sendResetPassword : AuthResourcesProvider.isClassTeacherByUserLogin vérifie que l'appelant est enseignant de la classe de l'élève (form attribute login).
  • Service UserAuthAccount.resetPasswordToTempValue : génère un mot de passe provisoire lisible (StringValidation.generateRandomCode, alphabet sans caractères ambigus, longueur primary-temp-password-length, validé contre passwordRegex), l'applique (BCrypt via updatePassword), force le changement (changePw = true) et efface les flags de demande. Retourne le mot de passe en clair au seul enseignant autorisé.
  • Roster : DefaultClassService.findUsers expose passwordResetRequested / passwordResetRequestDate (route GET /directory/class/:classId/users).
  • Class-admin (AngularJS) : badge « Mot de passe oublié » (user-list.html), bouton 1er degré « Créer un nouveau mot de passe » (user-infos.html) → service.resetStudentPasswordOnScreen → lightbox affichant le mot de passe provisoire (actions/temp-password.html). Le second degré conserve le flux code-par-e-mail existant.

Paramètres (bloc auth de ent-core.yaml)

ParamètreDéfautRôle
primary-assisted-password-resetfalseActive les deux endpoints 1er degré
primary-temp-password-length6Longueur du mot de passe provisoire
password-reset-request-debounce-ms3600000Anti-spam des notifications

Couverture de tests

Scénarios e2e — dossier apps/open-ent-e2e/src/modules/47_mot_de_passe_1d (enseignant) et apps/open-ent-e2e/src/public/02_mot_de_passe_1d_demande.spec.ts (élève, anonyme).

Tests e2e — voir le détail

Élève — demande (anonyme) public/02_mot_de_passe_1d_demande.spec.ts

  • lien adapté à l'âge sur la page de connexion 1er degré
  • soumission de la demande + écran de confirmation

Enseignant — réinitialisation modules/47_mot_de_passe_1d/01_enseignant_reinitialise.spec.ts

  • liste des élèves + demandes en attente
  • création d'un mot de passe provisoire affiché à l'écran

Les scénarios s'exécutent sur une instance 1er degré (thème openent1d, ex. cd16-primaire) : le lien de connexion, le badge et le bouton « à l'écran » ne s'affichent que sur ce thème. Les captures de la fiche fonctionnelle en sont issues.

Conformité

Maillon de la chaîne qualitéRéférence
🎯 Fonctionnalités attenduesfiche fonctionnelle
🧪 Tests réalisésdossiers e2e 47_mot_de_passe_1d + public/02_mot_de_passe_1d_demande