Aller au contenu

PD-174 — Plan d'implémentation


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 [Spécification](PD-174-specification.md) | | | 🛠️ **Plan d'implémentation** | *(ce document)* | | ✅ [Critères d'acceptation](PD-174-acceptability.md) | | | 📝 [Retour d'expérience](PD-174-rex.md) | | [← Retour à mobile-ios](../PD-195-epic.md) · [↑ Index User Story](index.md)

Objectif

Implémenter le verrouillage automatique de l'application après une période d'inactivité configurable.

Choix techniques retenus

  • State management : Zustand (useSecurityStore)
  • Détection activité : PanResponder + AppState
  • Délais : 1min, 5min, 15min, 30min, jamais
  • Stockage préférence : AsyncStorage

Architecture ciblée

src/hooks/
├── useAutoLock.ts          # Logique verrouillage auto
└── useUserActivity.ts      # Détection activité utilisateur

src/store/
└── useSecurityStore.ts     # État sécurité (locked, timeout)

src/screens/security/
└── LockScreen.tsx          # Écran de verrouillage

src/components/security/
└── AutoLockPicker.tsx      # Sélecteur délai

Découpage technique

Phase 1 : Store sécurité

  1. Créer useSecurityStore avec Zustand :
  2. isLocked: boolean
  3. autoLockTimeout: number (ms)
  4. lastActivityAt: number (timestamp)
  5. Actions : lock(), unlock(), setAutoLockTimeout()

  6. Persister autoLockTimeout dans AsyncStorage

Phase 2 : Détection activité

  1. Implémenter useUserActivity() :
  2. Créer PanResponder global
  3. Écouter touches, scrolls, etc.
  4. Mettre à jour lastActivityAt

  5. Wrapper l'app avec le PanResponder

Phase 3 : Logique verrouillage

  1. Implémenter useAutoLock() :
  2. Timer vérifiant inactivité toutes les 10s
  3. Comparer now - lastActivityAt > timeout
  4. Appeler lock() si dépassé

  5. Gérer AppState :

  6. background : Démarrer countdown
  7. active : Reset si dans délai, sinon lock

Phase 4 : Écran de verrouillage

  1. Créer LockScreen :
  2. Input PIN ou biométrie
  3. Validation contre hash stocké
  4. Appeler unlock() si valide

  5. Intégrer dans navigation :

  6. Modal overlay si isLocked
  7. Bloquer navigation sous-jacente

Phase 5 : Configuration

  1. Créer AutoLockPicker :
  2. Options : 1min, 5min, 15min, 30min, jamais
  3. Sauvegarder choix via store

  4. Intégrer dans SecuritySettingsScreen

Phase 6 : Tests

  1. Tests store (transitions état)
  2. Tests détection activité
  3. Tests timer verrouillage
  4. Tests AppState transitions

Points de vigilance

  • Effacement K_master : Appeler deleteMasterKey() au lock ? → Décision : NON, garder en Keychain, juste bloquer UI
  • Background : iOS limite les timers en background
  • Biométrie : Optionnelle pour déverrouillage rapide
  • Race conditions : Éviter lock pendant opération crypto

Hors périmètre

  • Configuration PIN (→ autre US)
  • Biométrie Face ID/Touch ID (→ future US)
  • Wipe après X tentatives (→ future US)