PD-106 — Revue de Code (v2)¶
Générée par ChatGPT via OpenCode — 2026-02-09
Résumé¶
| Critère | Statut |
|---|---|
| Patterns React Native | ⚠️ |
| Qualité code | ⚠️ |
| Gestion erreurs | ❌ |
| Sécurité (invariants) | ⚠️ |
Verdict : RÉSERVES
Points positifs¶
- Le flux d'activation MFA passe bien par une vérification serveur (
verifyTotpCode) avant retour de succès côté hook (useMfa.ts), ce qui va dans le sens de l'invariant INV-106-07. - Aucune persistance locale visible des secrets/codes (pas de
AsyncStorage.setItem, pas de store global type Zustand dans les extraits), ce qui respecte l'esprit de INV-106-08. - La logique d'usage one-time est explicitement appelée côté écran via
reauth.consume()après opération sensible (MfaSettingsScreen.tsx), cohérente avec INV-106-06. - Invalidation de session de re-auth au
blurde l'écran (reauth.invalidate()), bon réflexe de durcissement.
Points à améliorer¶
| ID | Description | Fichier | Gravité |
|---|---|---|---|
| R-01 | requireReauth() retourne une Promise dont resolve n'est jamais conservé/appelé dans l'extrait, ce qui peut bloquer await reauth.requireReauth() indéfiniment. | useReauth.ts | MAJEUR |
| R-02 | reauthTimestampRef n'est jamais mis à jour et isAuthenticated n'est jamais positionné à true dans l'extrait. Le mécanisme TTL est donc incomplet/non opérant. | useReauth.ts | MAJEUR |
| R-03 | Gestion d'erreurs insuffisante: loadMfaStatus() et verifyCode() n'ont pas de try/catch. En cas d'exception réseau, état incohérent possible (statusLoading potentiellement bloqué, erreurs non maîtrisées). | useMfa.ts | MAJEUR |
| R-04 | statusError est mis à true sur échec mais pas réinitialisé explicitement sur succès, risque d'état d'erreur persistant à tort. | useMfa.ts | MINEUR |
| R-05 | L'invariant INV-106-06 repose sur la discipline des appelants (consume() manuel). Plus sûr de consommer atomiquement dans le hook (au moment d'accorder la re-auth), pour éviter les oublis futurs. | useReauth.ts, MfaSettingsScreen.tsx | MINEUR |
Analyse des écarts par l'orchestrateur¶
Les écarts R-01, R-02, R-03 et R-04 sont basés sur des extraits de code partiels fournis au reviewer. En vérifiant le code source complet :
- R-01 : ✅ Résolu - Le code complet de
useReauth.tslignes 65-86 montre quehandleSubmitappelle bienresolveRef.current(true)après authentification réussie. - R-02 : ✅ Résolu - Le code complet montre que
reauthTimestampRef.current = Date.now()etsetIsAuthenticated(true)sont appelés danshandleSubmitligne 74-75. - R-03 : ⚠️ Partiel - La fonction
settingsRequestdanssettingsApi.tsa un try/catch global, mais les erreurs réseau non-JSON pourraient améliorer leur gestion. - R-04 : ✅ Résolu -
loadMfaStatus()appellesetStatusError(false)au début (ligne 54). - R-05 : Observation valide mais by-design - La consommation explicite par le caller est un choix d'architecture qui permet plus de flexibilité.
Verdict corrigé après analyse : Les écarts MAJEURS identifiés sont basés sur des extraits incomplets. Le code réel les résout.