Aller au contenu

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 blur de 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.ts lignes 65-86 montre que handleSubmit appelle bien resolveRef.current(true) après authentification réussie.
  • R-02 : ✅ Résolu - Le code complet montre que reauthTimestampRef.current = Date.now() et setIsAuthenticated(true) sont appelés dans handleSubmit ligne 74-75.
  • R-03 : ⚠️ Partiel - La fonction settingsRequest dans settingsApi.ts a un try/catch global, mais les erreurs réseau non-JSON pourraient améliorer leur gestion.
  • R-04 : ✅ Résolu - loadMfaStatus() appelle setStatusError(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.