[Critique] La whitelist de rôles d'une catégorie n'est pas appliquée par l'API des messages #85
Labels
No labels
bug
enhancement
feature
groupe/chat-data
groupe/friends-blocking
groupe/input-validation
groupe/realtime-presence
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Transcendence/backend#85
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Gravité : Critique
Rapports QA d'origine : CHAT-18
Include(Category)sansThenInclude(RolesWhitelist): pour un channel synchronisé avec sa catégorie, un Member hors whitelist lit et écrit.Détails des rapports
[CHAT-18] La whitelist de rôles d'une CATÉGORIE n'est pas appliquée par l'API des messages (channel "synchronisé") — Gravité : Critique
GET/POST /api/channels/{id}/messages(+ PUT/DELETE/ack/SignalR) sur un channel aveccategorySync: truedont la catégorie a une whitelist.qa_chat_wlcat2avecwhitelistRoles: ["qa_chat_wl"](la réponse confirme le rôle), puis un channelcategorySync: truededans. 2. carol (rôle qa_chat_wl) y poste "cat-secret". 3. bob (Member, rôle absent de la whitelist) :GET /channels/<id>/messagespuisPOST.POST201 (bob peut lire et écrire). Idem avec un channel non synchronisé (whitelist de channel vide = ouvert, normal). La sidebar de bob masque pourtant le channel (filtre front), donc l'UI donne une fausse impression de protection.Channel.IsWhitelisted(backend/API/Channels/Channel.cs) litCategory.RolesWhitelist, mais les commandes/requêtes de messages font.Include(c => c.Category)sans.ThenInclude(c => c.RolesWhitelist).ThenInclude(r => r.Role)(ex.Messages/List/ListMessagesQuery.cs:22,Create/CreateMessageCommand.cs,Update,Delete,Get,Ack) : la collection est vide =>Count == 0=> accès autorisé. Les diffusions SignalR NewMessage/UpdateMessage/RemoveMessage (même filtre) sont donc envoyées aux non-autorisés.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.