feat(desktop): mot de passe oublié par code email (T-130) #127

Merged
ahitosly merged 2 commits from feat/T-130-password-recovery into main 2026-09-23 17:34:30 +02:00
Owner

Tâche

T-xxx — (titre dans docs/STATUS.md)

Changements

Contrat modifié ?

  • Non
  • Oui : packages/contract / supabase/migrations — docs/API.md / docs/DATA.md mis à jour, label contract, approbation humaine requise

Tests

  • scripts/check.sh vert
  • Test manuel (OS, scénario) :

Impacts cross-domaine

Fichiers hors périmètre de l'agent (et pourquoi) :

Suivi

  • docs/STATUS.md mis à jour (ligne de la tâche)
  • docs/CHANGELOG.md : entrée ajoutée sous Unreleased
  • docs/DECISIONS.md / docs/ECARTS.md mis à jour si décision ou écart
## Tâche T-xxx — (titre dans docs/STATUS.md) ## Changements - ## Contrat modifié ? - [ ] Non - [ ] Oui : `packages/contract` / `supabase/migrations` — `docs/API.md` / `docs/DATA.md` mis à jour, label `contract`, approbation humaine requise ## Tests - [ ] `scripts/check.sh` vert - [ ] Test manuel (OS, scénario) : ## Impacts cross-domaine Fichiers hors périmètre de l'agent (et pourquoi) : ## Suivi - [ ] `docs/STATUS.md` mis à jour (ligne de la tâche) - [ ] `docs/CHANGELOG.md` : entrée ajoutée sous Unreleased - [ ] `docs/DECISIONS.md` / `docs/ECARTS.md` mis à jour si décision ou écart
feat(desktop): mot de passe oublié par code email sur l'écran de login (T-130)
Some checks failed
ci / server (pull_request) Successful in 23s
ci / desktop-ts (pull_request) Successful in 50s
ci / desktop-rust (pull_request) Has been cancelled
f6730045ab
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Author
Owner

Verdict QA : REQUEST_CHANGES (code OK, suivi à corriger)

Vérifié : scripts/check.sh --desktop vert (tsc + eslint). Diff limité à apps/desktop/src/settings/{App,LoginScreen}.tsx + docs. Aucun changement de contrat (packages/contract), de migration ni de .env ; aucun secret ni log de mot de passe/code ; pas de nouvelle table donc pas de RLS. Périmètre app-front respecté.

Code (OK) :

  • Flux resetPasswordForEmail -> verifyOtp(type recovery) -> updateUser conforme à ADR-017 (LoginScreen.tsx handleSendRecovery / handleVerifyRecovery / handleSetNewPassword).
  • Drapeau recovering : App.tsx:91 session === null || recovering renvoie le même arbre JSX, donc LoginScreen n'est pas remonté et garde son état (étape, email) quand la session apparaît. onRecoveryChange(true) est posé avant verifyOtp (l'appel réseau laisse le temps au rendu), remis à false si verifyOtp échoue. La garde T-111 ne saute donc pas l'écran.
  • Erreurs : code invalide -> message affiché, drapeau relâché, on reste à l'étape code ; mots de passe différents -> refus local avant tout appel ; échec updateUser -> message, drapeau conservé, on reste à l'étape mot de passe ; annulation à l'étape mot de passe -> signOut puis onRecoveryChange(false) (ordre correct : pas de flash de l'app).
  • Réserves mineures, non bloquantes : (a) cancelRecovery ignore l'erreur de signOut : sur panne réseau supabase-js peut garder la session locale et l'utilisateur atterrit connecté sans avoir changé de mot de passe (cohérent avec la conséquence déjà acceptée dans l'ADR, mais à mentionner) ; (b) à l'étape « code » il n'y a pas de bouton retour direct au login (seulement « Renvoyer un code » puis « Retour ») ; (c) pendant la récupération bindSessionToCore notifie déjà le core Rust d'une session valide (dictée possible avant le choix du mot de passe) : sans conséquence sécurité, la possession de l'email est prouvée.

À corriger avant merge :

  1. docs/STATUS.md:8 : le PR passe « Prochain id libre » à T-131, or T-131 existe déjà (overlay thinking-orbs, STATUS.md:163, PR #124 ; le compteur de main était en retard). Doit être T-132.
  2. docs/STATUS.md (ligne T-130) : statut in_progress alors que la PR livre la tâche -> done (ou review), avec le résultat de check.sh.
  3. Aucune vérification manuelle consignée : le flux n'est ni testé automatiquement (pas d'infra de test TS côté desktop) ni exercé de bout en bout (dépend d'un gabarit email Supabase « Reset Password » contenant {{ .Token }}, hors repo). Ajouter dans STATUS.md -> « Vérifications manuelles en attente » : (i) gabarit Recovery avec {{ .Token }} déployé ; (ii) scénario réel : Mot de passe oublié -> code -> nouveau mot de passe -> connexion avec ce mot de passe ; code invalide ; annulation à l'étape mot de passe (retour login, déconnecté) ; (iii) longueur du code (GOTRUE_MAILER_OTP_LENGTH) : CHANGELOG/ADR disent « 6 chiffres », à vérifier sur l'instance. Idéalement une checklist courte dans apps/desktop/tests/manual/.

Le reste du suivi (CHANGELOG Unreleased, ADR-017, absence d'écart à consigner) est conforme. Une fois 1 à 3 corrigés : APPROVE.

Verdict QA : REQUEST_CHANGES (code OK, suivi à corriger) Vérifié : scripts/check.sh --desktop vert (tsc + eslint). Diff limité à apps/desktop/src/settings/{App,LoginScreen}.tsx + docs. Aucun changement de contrat (packages/contract), de migration ni de .env ; aucun secret ni log de mot de passe/code ; pas de nouvelle table donc pas de RLS. Périmètre app-front respecté. Code (OK) : - Flux resetPasswordForEmail -> verifyOtp(type recovery) -> updateUser conforme à ADR-017 (LoginScreen.tsx handleSendRecovery / handleVerifyRecovery / handleSetNewPassword). - Drapeau recovering : App.tsx:91 `session === null || recovering` renvoie le même arbre JSX, donc LoginScreen n'est pas remonté et garde son état (étape, email) quand la session apparaît. onRecoveryChange(true) est posé avant verifyOtp (l'appel réseau laisse le temps au rendu), remis à false si verifyOtp échoue. La garde T-111 ne saute donc pas l'écran. - Erreurs : code invalide -> message affiché, drapeau relâché, on reste à l'étape code ; mots de passe différents -> refus local avant tout appel ; échec updateUser -> message, drapeau conservé, on reste à l'étape mot de passe ; annulation à l'étape mot de passe -> signOut puis onRecoveryChange(false) (ordre correct : pas de flash de l'app). - Réserves mineures, non bloquantes : (a) cancelRecovery ignore l'erreur de signOut : sur panne réseau supabase-js peut garder la session locale et l'utilisateur atterrit connecté sans avoir changé de mot de passe (cohérent avec la conséquence déjà acceptée dans l'ADR, mais à mentionner) ; (b) à l'étape « code » il n'y a pas de bouton retour direct au login (seulement « Renvoyer un code » puis « Retour ») ; (c) pendant la récupération bindSessionToCore notifie déjà le core Rust d'une session valide (dictée possible avant le choix du mot de passe) : sans conséquence sécurité, la possession de l'email est prouvée. À corriger avant merge : 1. docs/STATUS.md:8 : le PR passe « Prochain id libre » à T-131, or T-131 existe déjà (overlay thinking-orbs, STATUS.md:163, PR #124 ; le compteur de main était en retard). Doit être T-132. 2. docs/STATUS.md (ligne T-130) : statut `in_progress` alors que la PR livre la tâche -> `done` (ou `review`), avec le résultat de check.sh. 3. Aucune vérification manuelle consignée : le flux n'est ni testé automatiquement (pas d'infra de test TS côté desktop) ni exercé de bout en bout (dépend d'un gabarit email Supabase « Reset Password » contenant {{ .Token }}, hors repo). Ajouter dans STATUS.md -> « Vérifications manuelles en attente » : (i) gabarit Recovery avec {{ .Token }} déployé ; (ii) scénario réel : Mot de passe oublié -> code -> nouveau mot de passe -> connexion avec ce mot de passe ; code invalide ; annulation à l'étape mot de passe (retour login, déconnecté) ; (iii) longueur du code (GOTRUE_MAILER_OTP_LENGTH) : CHANGELOG/ADR disent « 6 chiffres », à vérifier sur l'instance. Idéalement une checklist courte dans apps/desktop/tests/manual/. Le reste du suivi (CHANGELOG Unreleased, ADR-017, absence d'écart à consigner) est conforme. Une fois 1 à 3 corrigés : APPROVE.
Author
Owner

Points de suivi de la review corrigés (compteur T-132, T-130 done, vérifications manuelles consignées). Parcours nominal confirmé par l'humain. Merge programmé.

Points de suivi de la review corrigés (compteur T-132, T-130 done, vérifications manuelles consignées). Parcours nominal confirmé par l'humain. Merge programmé.
ahitosly scheduled this pull request to auto merge when all checks succeed 2026-09-23 17:33:59 +02:00
docs(status): T-130 done, compteur T-132, vérifications manuelles (T-130)
All checks were successful
ci / server (pull_request) Successful in 26s
ci / desktop-ts (pull_request) Successful in 55s
ci / desktop-rust (pull_request) Successful in 18m49s
83a75213a9
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ahitosly deleted branch feat/T-130-password-recovery 2026-09-23 17:34:37 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
cloud-rennais/aria!127
No description provided.