Aller au contenu

PD-106 - Ecran Settings iOS (Profil, MFA TOTP, securite et compte)

1. Objectif

Definir le contrat fonctionnel de l'ecran Settings iOS pour : - consulter le profil en lecture seule ; - gerer le MFA TOTP (etat, activation, desactivation, codes de recuperation) ; - changer le mot de passe ; - se deconnecter ; - supprimer son compte.

Le contrat privilegie securite, robustesse, conformite et observabilite des comportements.

2. Perimetre / Hors perimetre

Inclus

  • Parcours Settings unique permettant d'acceder aux fonctions Profil, MFA, mot de passe, deconnexion, suppression de compte.
  • Affichage du profil en lecture seule (nom, email, avatar ou initiales).
  • Affichage de l'etat MFA depuis le serveur (active/desactive, methode).
  • Activation MFA TOTP avec verification du code utilisateur.
  • Desactivation MFA avec confirmation explicite.
  • Consultation/affichage des codes de recuperation selon les regles de securite de cette spec.
  • Regeneration des codes de recuperation avec invalidation des anciens.
  • Changement de mot de passe (ancien, nouveau, confirmation).
  • Deconnexion avec invalidation de session serveur.
  • Suppression de compte avec confirmation renforcee et re-authentification.

Exclu

  • Modification des endpoints backend existants.
  • Ajout de nouvelles methodes MFA (SMS, email, WebAuthn).
  • Flux de login MFA (saisie TOTP a la connexion).
  • Edition du profil (nom, email, avatar).
  • Parametres biometrie/auto-lock existants hors parcours PD-106.
  • Android.
  • Preuve exhaustive de purge RGPD backend (voir section 4, hors perimetre PD-106).

3. Definitions

  • MFA : authentification multi-facteur.
  • TOTP : mot de passe a usage unique base sur le temps.
  • Etat MFA : etat courant du compte (active ou desactive) et methode configuree.
  • Operation critique : activation/desactivation MFA, regeneration des codes de recuperation, changement de mot de passe, suppression de compte.
  • Re-authentification : preuve recente d'identite acceptee par la politique serveur pour autoriser une operation critique ; elle DOIT etre validee dans les 5 minutes precedant l'execution de l'operation critique, dans le meme flux de navigation, sans sortie vers un autre parcours ; la re-authentification est invalidee si l'utilisateur navigue vers un ecran hors du parcours Settings en cours (pile de navigation active interrompue ou quittee) ; cette borne temporelle est evaluee par le serveur.
  • Codes de recuperation : codes de secours permettant l'acces en cas d'indisponibilite du facteur TOTP.
  • Affichage unique : affichage en clair autorise uniquement pour la reponse serveur de generation/regeneration qui vient d'etre recue sur le device courant ; si l'utilisateur ferme puis rouvre l'ecran sans nouvelle generation/regeneration, aucun code en clair NE DOIT etre reaffiche.
  • Confirmation renforcee : double validation explicite obligatoire dans le meme flux (validation initiale puis confirmation finale).
  • Message/erreur exploitable : message affiche dans la langue active contenant au minimum soit un identifiant d'erreur stable, soit un motif textuel actionnable par l'utilisateur.
  • Stockage local durable : toute surface de persistance locale surviveant a la fermeture ou au redemarrage de l'application, incluant Keychain, AsyncStorage, SQLite, UserDefaults et fichiers applicatifs/cache persistants.
  • Logs applicatifs : toute emission de journal cote client ; en environnement de test, les surfaces auditables sont console, journaux systeme et logs de debug exportables ; les services tiers de crash reporting/telemetrie sont hors surface d'audit quand l'acces n'est pas garanti.
  • Hors perimetre : exigence non verifiable dans le cadre de PD-106 mobile seul, devant etre prouvee par un autre artefact.

4. Invariants (non negociables)

ID Regle Justification
INV-106-01 Le parcours Settings DOIT etre accessible via un point d'entree unique lie au compte connecte. Garantit une navigation coherente.
INV-106-02 Le profil DOIT afficher au minimum nom, email, avatar ou initiales, en lecture seule. Couvre l'objectif d'identification du compte sans edition.
INV-106-03 Le compte connecte DOIT etre identifiable visuellement de maniere non ambigue. Reduit le risque d'action sur le mauvais compte.
INV-106-04 L'etat MFA affiche DOIT provenir d'une lecture serveur a l'ouverture du parcours et apres chaque mutation MFA ; en cas d'echec, l'etat DOIT etre inconnu. Evite l'affichage stale/non fiable.
INV-106-05 Chaque operation critique DOIT exiger une re-authentification reussie immediatement avant execution. Reduit le risque d'usurpation de session.
INV-106-06 Une re-authentification validee pour une operation critique NE DOIT PAS etre reutilisable implicitement pour une autre operation critique. Limite l'escalade de privilege par reutilisation de preuve.
INV-106-07 L'activation MFA TOTP DOIT etre consideree reussie uniquement apres confirmation serveur explicite. Evite les activations partielles/silencieuses.
INV-106-08 Le secret TOTP et les codes de recuperation en clair NE DOIVENT PAS etre persistes en stockage local durable ni journalises en logs applicatifs. Protege les secrets critiques.
INV-106-09 Les codes de recuperation DOIVENT etre affiches en clair uniquement apres generation/regeneration, avec avertissement de criticite. Reduit l'exposition des codes de secours.
INV-106-10 La regeneration des codes de recuperation DOIT invalider l'ensemble des codes precedents. La garantie d'invalidation atomique depend de H-106-04 ; le mobile verifie le comportement observable mais ne peut pas garantir l'atomicite serveur. Evite la coexistence de jeux de codes valides.
INV-106-11 La desactivation MFA DOIT exiger confirmation explicite et re-authentification reussie. Evite la baisse accidentelle/non autorisee du niveau de securite.
INV-106-12 Le changement de mot de passe DOIT exiger ancien mot de passe, nouveau mot de passe et confirmation identique ; tout refus serveur DOIT etre restitue avec motif exploitable. Garantit controle d'identite et feedback actionnable.
INV-106-13 La deconnexion DOIT invalider la session serveur et effacer les donnees sensibles locales de session ; en cas d'echec d'invalidation serveur, le fallback ERR-106-LOGOUT-FAILED s'applique. Evite les sessions zombies et fuites locales.
INV-106-14 La suppression de compte DOIT afficher le caractere irreversible, exiger confirmation renforcee et re-authentification reussie avant execution. Reduit le risque d'effacement involontaire.
INV-106-15 Apres suppression de compte confirmee, l'utilisateur DOIT etre deconnecte et toute tentative de reutilisation du compte DOIT echouer. Verifie l'effectivite fonctionnelle de la suppression cote utilisateur.
INV-106-16 Aucun echec critique NE DOIT etre silencieux ; un message explicite et exploitable DOIT etre presente. Garantit diagnosabilite et UX robuste.
INV-106-17 Les textes affiches a l'utilisateur DOIVENT etre localises selon la langue active de l'application. Respecte la contrainte i18n.
INV-106-18 HORS PERIMETRE PD-106 : l'effacement RGPD complet (article 17) et la politique de retention/purge serveur DOIVENT etre prouves par artefacts backend/conformite. Non verifiable exhaustivement depuis le mobile seul.

5. Flux nominaux

F-106-01 - Acces Settings et consultation profil

  1. L'utilisateur ouvre le parcours Settings.
  2. Le systeme charge les informations de profil et l'etat MFA depuis le serveur.
  3. Le systeme affiche le profil en lecture seule et identifie le compte connecte.
  4. Si l'etat MFA est indisponible, le systeme affiche etat inconnu (pas de valeur stale).

F-106-02 - Activation MFA TOTP

  1. L'utilisateur demande l'activation MFA.
  2. Le systeme exige une re-authentification.
  3. Si re-authentification validee, le systeme initie l'enrolement TOTP et affiche les informations d'enrolement sensibles avec avertissement.
  4. L'utilisateur saisit un code TOTP de verification.
  5. Le systeme soumet la verification au serveur.
  6. En cas de succes, le systeme marque MFA active, affiche les codes de recuperation en affichage unique, puis recharge l'etat MFA serveur.

F-106-03 - Consultation et regeneration des codes de recuperation

  1. L'utilisateur accede a la section codes de recuperation.
  2. Si aucun affichage unique n'est disponible dans le contexte courant, le systeme n'affiche aucun code en clair et propose la regeneration.
  3. La regeneration exige confirmation explicite et re-authentification.
  4. En cas de succes serveur, le systeme invalide les anciens codes, affiche le nouveau jeu en affichage unique avec avertissement.

F-106-04 - Desactivation MFA

  1. L'utilisateur demande la desactivation MFA.
  2. Le systeme affiche une confirmation explicite.
  3. Le systeme exige une re-authentification.
  4. En cas de succes serveur, le systeme passe l'etat MFA a desactive et recharge l'etat serveur.

F-106-05 - Changement de mot de passe

  1. L'utilisateur renseigne ancien mot de passe, nouveau mot de passe, confirmation.
  2. Le systeme refuse localement si confirmation differente.
  3. Le systeme exige une re-authentification.
  4. Le systeme soumet la demande au serveur.
  5. En cas de refus (complexite, ancien mot de passe invalide, etc.), le motif exploitable est affiche.
  6. En cas de succes, le systeme invalide la session courante cote serveur, efface les donnees sensibles locales de session et redirige l'utilisateur vers un etat non authentifie.

F-106-06 - Deconnexion

  1. L'utilisateur demande la deconnexion.
  2. Le systeme affiche une confirmation explicite.
  3. Le systeme appelle l'invalidation de session serveur.
  4. Le systeme efface les donnees sensibles locales de session.
  5. L'utilisateur est redirige vers un etat non authentifie.

F-106-07 - Suppression de compte

  1. L'utilisateur ouvre l'action de suppression de compte.
  2. Le systeme affiche un avertissement d'irreversibilite.
  3. Le systeme exige une confirmation renforcee.
  4. Le systeme exige une re-authentification.
  5. Le systeme soumet la suppression au serveur.
  6. En cas de succes, l'utilisateur est deconnecte ; le compte n'est plus reutilisable.

5bis. Diagrammes

Diagramme d'etats -- Etat MFA du compte

L'etat MFA observable cote application suit trois etats derives de la reponse serveur (INV-106-04). Toute mutation MFA declenche une relecture serveur.

stateDiagram-v2
    [*] --> inconnu : Ouverture Settings\n(lecture serveur en cours)

    inconnu --> active : Reponse serveur\nmfa_enabled=true
    inconnu --> desactive : Reponse serveur\nmfa_enabled=false
    inconnu --> inconnu : Echec lecture serveur\n[ERR-106-MFA-STATE-UNAVAILABLE]

    desactive --> active : Activation TOTP confirmee\npar le serveur (INV-106-07)
    active --> desactive : Desactivation confirmee\npar le serveur (INV-106-11)

    active --> inconnu : Relecture serveur\napres mutation
    desactive --> inconnu : Relecture serveur\napres mutation

    note right of inconnu
        INV-106-04 : etat inconnu si lecture echoue.
        Operations MFA bloquees dans cet etat
        [ERR-106-MFA-STATE-UNAVAILABLE].
    end note

Diagramme de sequence -- Activation MFA TOTP (F-106-02)

Flux multi-service impliquant re-authentification (INV-106-05), enrolement TOTP, verification du code et affichage unique des codes de recuperation (INV-106-08, INV-106-09).

sequenceDiagram
    actor U as Utilisateur
    participant App as App iOS
    participant Srv as Backend API

    U->>App: Demande activation MFA
    App->>U: Exige re-authentification (INV-106-05)
    U->>App: Saisie credentials
    App->>Srv: POST /auth/reauth
    Srv-->>App: 200 OK (token reauth)

    App->>Srv: POST /mfa/totp/init (token reauth)
    Srv-->>App: 200 {secret, otpauth_uri, recovery_codes_pending}
    App->>U: Affiche QR code / secret TOTP\n+ avertissement (INV-106-08)

    U->>App: Saisie code TOTP de verification
    App->>Srv: POST /mfa/totp/verify {code}

    alt Code valide
        Srv-->>App: 200 {recovery_codes}
        App->>U: MFA active + codes de recuperation\nen affichage unique (INV-106-09)
        Note over App: Secret TOTP et codes NON persistes\nen stockage local durable (INV-106-08)
        App->>Srv: GET /mfa/status (relecture INV-106-04)
        Srv-->>App: 200 {enabled: true, method: TOTP}
    else Code invalide
        Srv-->>App: 401 ERR-106-MFA-CODE-INVALID
        App->>U: Message erreur explicite (INV-106-16)
    end

Diagramme de sequence -- Suppression de compte (F-106-07)

Flux a confirmation renforcee (INV-106-14) avec re-authentification non reutilisable (INV-106-06).

sequenceDiagram
    actor U as Utilisateur
    participant App as App iOS
    participant Srv as Backend API

    U->>App: Ouvre action suppression
    App->>U: Avertissement irreversibilite (INV-106-14)

    U->>App: Confirmation renforcee etape 1
    App->>U: Confirmation renforcee etape 2
    U->>App: Validation finale

    App->>U: Exige re-authentification (INV-106-05)
    U->>App: Saisie credentials
    App->>Srv: POST /auth/reauth
    Srv-->>App: 200 OK (token reauth)

    App->>Srv: DELETE /account (token reauth)

    alt Succes
        Srv-->>App: 200 OK
        App->>App: Efface donnees sensibles locales (INV-106-13)
        App->>U: Redirige etat non authentifie (INV-106-15)
    else Echec serveur
        Srv-->>App: 5xx ERR-106-DELETE-FAILED
        App->>U: Message erreur explicite (INV-106-16)\nCompte reste actif
    end

6. Cas d'erreur

Code erreur Condition Comportement attendu
ERR-106-SESSION-EXPIRED Session invalide/expiree pendant une action Forcer etat non authentifie, afficher message explicite, aucune action critique executee.
ERR-106-NETWORK Indisponibilite reseau/time-out Message explicite, aucun changement d'etat local suppose comme reussi.
ERR-106-MFA-STATE-UNAVAILABLE Lecture etat MFA impossible Afficher etat inconnu, bloquer l'activation MFA, la desactivation MFA et la consultation/regeneration des codes de recuperation.
ERR-106-MFA-ENROLL-FAILED Echec initialisation enrolement TOTP Message explicite, aucun secret conserve localement, MFA reste desactive.
ERR-106-MFA-CODE-INVALID Code TOTP de verification invalide Message explicite, permettre nouvelle tentative selon politique serveur.
ERR-106-MFA-DISABLE-DENIED Refus desactivation (reauth absente/invalide) Message explicite, MFA reste active.
ERR-106-RECOVERY-NOT-AVAILABLE Demande de consultation hors affichage unique Aucun code en clair affiche, message expliquant la regeneration necessaire.
ERR-106-RECOVERY-REGEN-FAILED Echec regeneration codes Message explicite, anciens codes conservent leur validite tant que regeneration non confirmee serveur.
ERR-106-PWD-CONFIRM-MISMATCH Nouveau mot de passe et confirmation differents Refus immediat, aucun appel critique execute.
ERR-106-PWD-POLICY Refus serveur (complexite insuffisante, ancien mot de passe invalide, etc.) Message explicite exploitable, mot de passe inchange.
ERR-106-LOGOUT-FAILED Echec invalidation session serveur Message explicite ; le systeme efface les donnees sensibles locales de session et force l'etat non authentifie. Ce comportement constitue le fallback de degradation gracieuse du cas nominal INV-106-13. Risque residuel : la session serveur peut rester active ; ce risque est mitigue par H-106-06 (le backend invalide effectivement la session lors du logout).
ERR-106-DELETE-CONFIRMATION Confirmation renforcee invalide Suppression non executee, message explicite.
ERR-106-DELETE-REAUTH Re-authentification suppression echouee Suppression non executee, message explicite.
ERR-106-DELETE-FAILED Echec serveur suppression de compte Compte non supprime, message explicite, aucun etat de succes affiche.
ERR-106-RATE-LIMIT Trop de tentatives (reauth/TOTP) Message explicite incluant contrainte temporelle si fournie par le serveur ; le seuil et la fenetre de rate-limit sont definis par la politique serveur et ne sont pas contractualises cote mobile.

7. Criteres d'acceptation (testables)

ID Critere Observable
CA-106-01 Le parcours Settings expose un point d'entree unique pour Profil, MFA, mot de passe, deconnexion, suppression. Verification fonctionnelle de navigation.
CA-106-02 Le profil affiche nom, email, avatar ou initiales en lecture seule. Inspection UI + tentative d'edition impossible.
CA-106-03 Le compte connecte est identifiable sans ambiguite. Presence d'un identifiant lisible (ex. email).
CA-106-04 L'etat MFA est relu au chargement et apres chaque mutation MFA ; en echec, etat inconnu est affiche. Traces d'appels + observation UI sans valeur stale.
CA-106-05 Chaque operation critique est bloquee sans re-authentification reussie immediate. Tentative operation critique sans reauth -> refus explicite.
CA-106-06 L'activation MFA n'est consideree reussie qu'apres confirmation serveur. Simulation succes/echec verification TOTP.
CA-106-07 Un echec d'activation MFA affiche une erreur exploitable (pas d'echec silencieux). Observation du message d'erreur et etat MFA inchange.
CA-106-08 Les codes de recuperation sont affiches uniquement apres generation/regeneration, avec avertissement. Test parcours consultation hors contexte -> aucun code en clair.
CA-106-09 La regeneration invalide les anciens codes. Ancien code refuse, nouveau code accepte, apres regeneration.
CA-106-10 La desactivation MFA exige confirmation explicite + re-authentification. Tentatives partielles refusees tant que les deux conditions ne sont pas satisfaites.
CA-106-11 Le changement de mot de passe refuse localement la confirmation incoherente. Saisie mismatch -> refus sans execution serveur critique.
CA-106-12 Les refus serveur sur mot de passe (complexite/ancien invalide) sont restitues clairement. Message exploitable visible, mot de passe non modifie.
CA-106-13 La deconnexion invalide la session serveur. Reutilisation d'un jeton/session precedente refusee cote serveur.
CA-106-14 La deconnexion supprime les donnees sensibles locales de session. Verification stockage local apres logout.
CA-106-15 La suppression de compte exige avertissement d'irreversibilite, confirmation renforcee et re-authentification. Tentatives incompletes refusees ; parcours complet requis.
CA-106-16 Apres suppression confirmee, le compte n'est plus utilisable et l'utilisateur est deconnecte. Tentative de connexion ulterieure echoue pour ce compte.
CA-106-17 Le secret TOTP et les codes de recuperation ne figurent ni en stockage durable local ni en logs applicatifs. Audit instrumentation locale post-flux.
CA-106-18 Les messages utilisateur du parcours PD-106 sont localises selon la langue active. Changement de langue -> textes PD-106 traduits.
CA-106-19 HORS PERIMETRE PD-106 : la purge RGPD complete est verifiee via artefacts backend/conformite. Presence d'une preuve externe (audit, dossier de conformite).

8. Scenarios de test (Given / When / Then)

Scenario 1 - Consultation initiale Settings

GIVEN - utilisateur authentifie ; - backend profil et etat MFA disponibles.

WHEN - l'utilisateur ouvre Settings.

THEN - le profil est visible en lecture seule ; - le compte est clairement identifie ; - l'etat MFA reflete la reponse serveur courante.

Scenario 2 - Activation MFA TOTP nominale

GIVEN - utilisateur authentifie ; - MFA desactive ; - re-authentification valide.

WHEN - l'utilisateur active MFA puis soumet un code TOTP valide.

THEN - MFA devient active ; - les codes de recuperation sont affiches une seule fois avec avertissement ; - l'etat MFA est recharge depuis le serveur.

Scenario 3 - Activation MFA avec code invalide

GIVEN - utilisateur dans le flux d'activation MFA ; - re-authentification valide.

WHEN - l'utilisateur soumet un code TOTP invalide.

THEN - MFA reste desactive ; - un message d'erreur explicite est affiche ; - aucun etat de succes n'est affiche.

Scenario 4 - Operation critique sans re-authentification

GIVEN - utilisateur authentifie ; - operation critique choisie (ex. desactivation MFA).

WHEN - l'utilisateur tente d'executer l'operation sans re-authentification valide.

THEN - l'operation est refusee ; - l'etat metier reste inchange ; - un message explicite est affiche.

Scenario 5 - Consultation codes hors affichage unique

GIVEN - utilisateur authentifie ; - aucun evenement recent de generation/regeneration de codes.

WHEN - l'utilisateur ouvre la section codes de recuperation.

THEN - aucun code en clair n'est affiche ; - le systeme indique que la regeneration est necessaire.

Scenario 6 - Regeneration codes de recuperation

GIVEN - utilisateur authentifie ; - re-authentification validee ; - confirmation explicite validee.

WHEN - l'utilisateur regenere les codes.

THEN - un nouveau jeu de codes est affiche en affichage unique ; - les anciens codes deviennent invalides.

Scenario 7 - Changement mot de passe refuse (politique serveur)

GIVEN - utilisateur authentifie ; - ancien mot de passe saisi ; - nouveau mot de passe ne respectant pas la politique serveur.

WHEN - l'utilisateur soumet la demande.

THEN - la modification est refusee ; - un message exploitable indique la raison ; - le mot de passe reste inchange.

Scenario 8 - Deconnexion nominale

GIVEN - utilisateur authentifie avec session active.

WHEN - l'utilisateur confirme la deconnexion.

THEN - la session serveur est invalidee ; - les donnees sensibles locales de session sont effacees ; - l'application revient en etat non authentifie.

Scenario 9 - Suppression de compte nominale

GIVEN - utilisateur authentifie ; - confirmation renforcee valide ; - re-authentification valide.

WHEN - l'utilisateur confirme la suppression de compte.

THEN - le compte est supprime cote serveur ; - l'utilisateur est deconnecte ; - une tentative ulterieure d'utilisation du compte echoue.

Scenario 10 - Suppression de compte annulee (confirmation invalide)

GIVEN - utilisateur sur le flux suppression.

WHEN - la confirmation renforcee est incorrecte ou incomplete.

THEN - la suppression n'est pas executee ; - un message explicite est affiche ; - le compte reste actif.

9. Hypotheses explicites

ID Hypothese Impact si faux
H-106-01 Le backend expose des endpoints operationnels pour: etat MFA, activation TOTP (init + verify), desactivation MFA, regeneration codes, changement mot de passe, logout, suppression compte. Blocage partiel ou total du perimetre PD-106.
H-106-02 Le backend fournit une reponse exploitable pour l'etat MFA (au moins active/desactive + methode). Impossible d'afficher un etat fiable cote app.
H-106-03 Le backend applique et expose une mecanique de re-authentification utilisable avant operations critiques. Impossibilite de respecter INV-106-05/06/11/14.
H-106-04 Le backend supporte la regeneration des codes de recuperation avec invalidation atomique des anciens. Invariant de securite sur les codes non garanti.
H-106-05 Le backend retourne des erreurs de changement mot de passe suffisamment qualifiees (ancien invalide, politique). Messages non exploitables, UX degradee, criteria CA-106-12 non atteignable.
H-106-06 Le backend invalide effectivement la session lors du logout. CA-106-13 non atteignable, risque session zombie.
H-106-07 Le backend applique une suppression de compte definitive du point de vue authentification. CA-106-16 non atteignable.
H-106-08 Les champs profil minimaux (nom, email, avatar ou initiales) sont disponibles via l'API. Profil incomplet ; necessite arbitrage produit.
H-106-09 Les obligations RGPD/eIDAS detaillees de retention/purge sont documentees dans un artefact externe de conformite. Non conformite potentielle non auditable depuis PD-106.

10. Points a clarifier

  1. Contrat exact des endpoints backend (requete/reponse, codes HTTP, erreurs) pour MFA, mot de passe, logout, suppression compte.
  2. Format exact de la donnee d'enrolement TOTP renvoyee (URI otpauth:// complete, secret brut, autres metadonnees).
  3. Politique de re-authentification par operation critique (facteurs autorises).
  4. RESOLU - la consultation des codes hors phase de generation/regeneration est interdite (voir F-106-03 etape 2).
  5. Arbitrage UX global : ecran unique vs sous-ecrans, et articulation avec ProfileScreen et SecuritySettingsScreen.
  6. Regles serveur de complexite mot de passe a rendre visibles a l'utilisateur.
  7. Politique de retention/purge post-suppression (delais, anonymisation, journaux), requise pour preuve RGPD article 17.

References

  • Epic : PD-195 - Application mobile iOS zero-knowledge
  • JIRA : PD-106
  • Repos concernes : ProbatioVault-app
  • Documents associes : PD-106-besoin.md