[Majeur] Suppression d'un utilisateur : effets de bord silencieux (messages, events, DM et channels orphelins) #110

Closed
opened 2026-10-28 10:32:05 +00:00 by asventi · 0 comments
Owner

Gravité : Majeur
Rapports QA d'origine : ADMIN-13, PROFILE-19

Les messages et events du user sont supprimés en cascade, le channel de l'event reste orphelin et le DM reste chez l'autre user sans destinataire.

Détails des rapports

[ADMIN-13] Suppression d'un user : effets de bord silencieux (messages supprimés, events supprimés, canal d'event orphelin, DM fantôme) — Gravité : Mineur
  • Où : DELETE /api/users/{id} (user sans fichier)
  • Obtenu (test avec A organisateur d'un event, auteur de messages, en DM avec B, inscrit à l'event de O) :
    1. Tous les messages de A sont supprimés en cascade (GET /channels/{id}/messages : seule la réponse de B reste, messageRef remis à null) — la discussion perd son contexte.
    2. L'event organisé par A est supprimé (404), ainsi que l'inscription de B à cet event ; mais son canal d'event reste dans GET /channels (canal orphelin visible de tous : qa_admin_eva_0lpz).
    3. La conversation DM A/B reste chez B avec recipients: [], name: "" et lastMessage: null (conversation fantôme sans nom/participant).
    4. La relation d'amitié disparaît correctement chez B ; l'inscription de A à l'event de O disparaît correctement.
      Le dialogue de confirmation dit seulement "The user will be remove from the database. This cannot be cancelled." sans mentionner la perte des messages/events.
  • Cause probable : Database.cs (cascades sur Message.Sender, Event.Organizer), DeleteEventCommand supprime l'event sans le Channel ; ConversationMember/recipients non nettoyés.
[PROFILE-19] Suppression de compte : effets de bord incohérents (messages, DM orphelins, token encore accepté) — Gravité : Majeur
  • Où : DELETE /api/me, UI Paramètres > Delete Account
  • Constats (reproduits avec 2 users qa A/B, A supprimé via l'UI) :
    • Dialogue de confirmation : "Delete your account ? / This cannot be cancelled." + Cancel/Delete (espace avant le "?" ; texte peu explicite : ne dit pas que les messages disparaissent). Après confirmation : redirection /login, login du compte supprimé -> 406, A disparaît de GET /users (404 sur /users/{id}), la relation d'amitié disparaît chez B.
    • TOUS les messages de A dans les channels sont supprimés (historique du channel altéré) ; la réponse de B qui citait le message de A a désormais messageRef: null.
    • Le DM A<->B reste chez B comme conversation fantôme : recipients: [], lastMessage: null, name: "" ; B peut encore y poster (201) : conversation sans destinataire.
    • Les cookies de la session supprimée restent acceptés par l'API jusqu'à expiration du JWT (10 min) : GET /api/me -> 500 (NullReferenceException) au lieu de 401 (le middleware laisse tcontext.User nul sans rejeter).
    • Avatar/fichiers : voir PROFILE-18.
  • Cause probable : backend/API/Middlewares/TokenContext.cs (utilisateur introuvable -> _next sans 401) ; DeleteMeCommand.cs (cascade non maîtrisée pour messages/conversations/fichiers).

Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes.

**Gravité :** Majeur **Rapports QA d'origine :** ADMIN-13, PROFILE-19 Les messages et events du user sont supprimés en cascade, le channel de l'event reste orphelin et le DM reste chez l'autre user sans destinataire. ## Détails des rapports <details><summary>[ADMIN-13] Suppression d'un user : effets de bord silencieux (messages supprimés, events supprimés, canal d'event orphelin, DM fantôme) — Gravité : Mineur</summary> - Où : `DELETE /api/users/{id}` (user sans fichier) - Obtenu (test avec A organisateur d'un event, auteur de messages, en DM avec B, inscrit à l'event de O) : 1. Tous les messages de A sont supprimés en cascade (`GET /channels/{id}/messages` : seule la réponse de B reste, `messageRef` remis à null) — la discussion perd son contexte. 2. L'event organisé par A est supprimé (404), ainsi que l'inscription de B à cet event ; mais son canal d'event reste dans `GET /channels` (canal orphelin visible de tous : `qa_admin_eva_0lpz`). 3. La conversation DM A/B reste chez B avec `recipients: []`, `name: ""` et `lastMessage: null` (conversation fantôme sans nom/participant). 4. La relation d'amitié disparaît correctement chez B ; l'inscription de A à l'event de O disparaît correctement. Le dialogue de confirmation dit seulement "The user will be remove from the database. This cannot be cancelled." sans mentionner la perte des messages/events. - Cause probable : `Database.cs` (cascades sur `Message.Sender`, `Event.Organizer`), `DeleteEventCommand` supprime l'event sans le `Channel` ; `ConversationMember`/recipients non nettoyés. </details> <details><summary>[PROFILE-19] Suppression de compte : effets de bord incohérents (messages, DM orphelins, token encore accepté) — Gravité : Majeur</summary> - Où : `DELETE /api/me`, UI Paramètres > Delete Account - Constats (reproduits avec 2 users qa A/B, A supprimé via l'UI) : - Dialogue de confirmation : "Delete your account ? / This cannot be cancelled." + Cancel/Delete (espace avant le "?" ; texte peu explicite : ne dit pas que les messages disparaissent). Après confirmation : redirection `/login`, login du compte supprimé -> 406, A disparaît de `GET /users` (404 sur `/users/{id}`), la relation d'amitié disparaît chez B. - TOUS les messages de A dans les channels sont supprimés (historique du channel altéré) ; la réponse de B qui citait le message de A a désormais `messageRef: null`. - Le DM A<->B reste chez B comme conversation fantôme : `recipients: []`, `lastMessage: null`, `name: ""` ; B peut encore y poster (201) : conversation sans destinataire. - Les cookies de la session supprimée restent acceptés par l'API jusqu'à expiration du JWT (10 min) : `GET /api/me` -> 500 (NullReferenceException) au lieu de 401 (le middleware laisse `tcontext.User` nul sans rejeter). - Avatar/fichiers : voir PROFILE-18. - Cause probable : `backend/API/Middlewares/TokenContext.cs` (utilisateur introuvable -> `_next` sans 401) ; `DeleteMeCommand.cs` (cascade non maîtrisée pour messages/conversations/fichiers). </details> --- _Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes._
asventi self-assigned this 2026-10-29 13:19:12 +00:00
Sign in to join this conversation.
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
Transcendence/backend#110
No description provided.