[Mineur] Codes HTTP incohérents : 401 au lieu de 403, « Message too long » en 404, PUT en 201 #115

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

Gravité : Mineur
Rapports QA d'origine : ADMIN-03, EVENTS-06, FRIENDS-04, SECURITY_UX-05, SECURITY_UX-14, CHAT-05, CHAT-12

Middlewares/Roles.cs:19 renvoie 401 avec un corps vide pour un user authentifié sans permission ; MessageProblems.TooLong est en 404 ; PUT /channels et /categories renvoient 201.

Détails des rapports

[ADMIN-03] RolesMiddleware renvoie 401 au lieu de 403 pour un utilisateur authentifié sans permission — Gravité : Mineur
  • Où : tout endpoint [Roles(...)] (events, users, roles, channels, invitations...) ; aussi DELETE /channels/{id}/messages/{msgId} (MESSAGE_NOT_SENDER)
  • Étapes : 1. Se connecter en Member 2. DELETE /api/users/nope (ou n'importe quel endpoint protégé)
  • Attendu : 403 Forbidden. Obtenu : 401 Unauthorized (corps vide) alors que l'utilisateur est authentifié.
  • Preuve : matrice complète lancée (9 acteurs x 22 appels) : tous les refus sont des 401, jamais des 403.
  • Cause probable : backend/API/Middlewares/Roles.cs:21-25 (StatusCodes.Status401Unauthorized) ; backend/API/Problems/MessageProblems.cs:23-36.
[EVENTS-06] Member sans permission HandleEvent reçoit 401 au lieu de 403 sur POST /events — Gravité : Mineur
  • Où : POST /api/events en tant que Member (permission 0, connecté)
  • Obtenu : 401 Unauthorized (corps Unauthorized) ; 403 attendu pour un user authentifié sans droit.
  • Idem pour PUT/DELETE /events/{id}, POST /events/roles/, PATCH et DELETE /events/{id}/registration[/{userId}] : tous 401 pour un Member connecté.
  • Cause probable : backend/API/Middlewares/Roles.cs:19 (StatusCodes.Status401Unauthorized au lieu de 403, et sans corps ProblemDetails métier ; les endpoints déclarent même 403 dans l'OpenAPI, ex. DeleteUserRegistrationEndpoint.cs:26).
  • Statut : re-vérifié.
[FRIENDS-04] `DELETE` d'un message d'autrui renvoie 401 au lieu de 403 — Gravité : Cosmétique
  • Où : DELETE /api/channels/{id}/messages/{msgId} par un non-auteur -> 401 MESSAGE_NOT_SENDER (un 401 peut déclencher une logique de refresh/déconnexion côté client ; 403 attendu).
  • Cause probable : backend/API/Problems/MessageProblems.cs (NotSender/NotAuthorized).
[SECURITY_UX-05] Refus d'autorisation renvoyés en 401 au lieu de 403 ; message trop long renvoyé en 404 — Gravité : Mineur
  • Où : tous les endpoints [Roles(...)] (réponse 401 vide, sans corps problem+json) ; MessageProblems.AccessNotAuthorized/NotSender/NotAuthorized (401) ; MessageProblems.TooLong (404)
  • Obtenu : un Member sans permission reçoit 401 (« non authentifié ») alors qu'il est authentifié -> le client peut croire que la session a expiré (cf. test UI plus bas si confirmé).
  • Cause probable : backend/API/Middlewares/Roles.cs:23 (StatusCodes.Status401Unauthorized), backend/API/Problems/MessageProblems.cs
[SECURITY_UX-14] `MessageProblems.TooLong` renvoie 404 « Message too long » — Gravité : Mineur
  • Obtenu : POST d'un message de 8193 caractères -> 404 (devrait être 400/413/422). Cf. SECURITY_UX-05. PUT /channels/{id}/messages/{msgId} n'a pas la limite de 8192 (voir suspicions).
  • Cause probable : backend/API/Problems/MessageProblems.cs (TooLong -> Status404NotFound)
[CHAT-05] Statuts HTTP incohérents sur les erreurs de messages — Gravité : Mineur
  • MESSAGE_TOO_LONG (message > 8192) renvoie 404 (Problems/MessageProblems.cs, TooLong) au lieu de 413/422 (vérifié sur POST de 8193 caractères).
  • Interdit (pas l'expéditeur / pas whitelisté / sans ManageMessages) renvoie 401 au lieu de 403 (NotSender, AccessNotAuthorized, NotAuthorized). Le front traite 401 comme "non connecté" dans certains flux (voir tests UI).
  • NotAuthorized() réutilise le code MESSAGE_NOT_SENDER (même errorCode que NotSender).
  • Création de catégorie avec rôle inconnu : errorCode CHANNEL_ROLE_NOT_FOUND (copié-collé du channel).
[CHAT-12] `PUT /channels/{id}` et `PUT /categories/{id}` renvoient 201 Created (doc : 204) — Gravité : Cosmétique
  • Réponse 201 + Location au lieu de 200/204 ; WithDescription/Produces(204) ne correspond pas (Update/UpdateChannelEndpoint.cs, Categories/Update/UpdateCategoryEndpoint.cs).

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é :** Mineur **Rapports QA d'origine :** ADMIN-03, EVENTS-06, FRIENDS-04, SECURITY_UX-05, SECURITY_UX-14, CHAT-05, CHAT-12 `Middlewares/Roles.cs:19` renvoie 401 avec un corps vide pour un user authentifié sans permission ; `MessageProblems.TooLong` est en 404 ; `PUT /channels` et `/categories` renvoient 201. ## Détails des rapports <details><summary>[ADMIN-03] RolesMiddleware renvoie 401 au lieu de 403 pour un utilisateur authentifié sans permission — Gravité : Mineur</summary> - Où : tout endpoint `[Roles(...)]` (events, users, roles, channels, invitations...) ; aussi `DELETE /channels/{id}/messages/{msgId}` (`MESSAGE_NOT_SENDER`) - Étapes : 1. Se connecter en Member 2. `DELETE /api/users/nope` (ou n'importe quel endpoint protégé) - Attendu : 403 Forbidden. Obtenu : 401 Unauthorized (corps vide) alors que l'utilisateur est authentifié. - Preuve : matrice complète lancée (9 acteurs x 22 appels) : tous les refus sont des 401, jamais des 403. - Cause probable : `backend/API/Middlewares/Roles.cs:21-25` (`StatusCodes.Status401Unauthorized`) ; `backend/API/Problems/MessageProblems.cs:23-36`. </details> <details><summary>[EVENTS-06] Member sans permission HandleEvent reçoit 401 au lieu de 403 sur POST /events — Gravité : Mineur</summary> - Où : `POST /api/events` en tant que Member (permission 0, connecté) - Obtenu : 401 Unauthorized (corps `Unauthorized`) ; 403 attendu pour un user authentifié sans droit. - Idem pour PUT/DELETE /events/{id}, POST /events/roles/, PATCH et DELETE /events/{id}/registration[/{userId}] : tous 401 pour un Member connecté. - Cause probable : `backend/API/Middlewares/Roles.cs:19` (`StatusCodes.Status401Unauthorized` au lieu de 403, et sans corps ProblemDetails métier ; les endpoints déclarent même 403 dans l'OpenAPI, ex. `DeleteUserRegistrationEndpoint.cs:26`). - Statut : re-vérifié. </details> <details><summary>[FRIENDS-04] `DELETE` d'un message d'autrui renvoie 401 au lieu de 403 — Gravité : Cosmétique</summary> - Où : `DELETE /api/channels/{id}/messages/{msgId}` par un non-auteur -> 401 `MESSAGE_NOT_SENDER` (un 401 peut déclencher une logique de refresh/déconnexion côté client ; 403 attendu). - Cause probable : `backend/API/Problems/MessageProblems.cs` (NotSender/NotAuthorized). </details> <details><summary>[SECURITY_UX-05] Refus d'autorisation renvoyés en 401 au lieu de 403 ; message trop long renvoyé en 404 — Gravité : Mineur</summary> - Où : tous les endpoints `[Roles(...)]` (réponse 401 vide, sans corps problem+json) ; `MessageProblems.AccessNotAuthorized/NotSender/NotAuthorized` (401) ; `MessageProblems.TooLong` (404) - Obtenu : un Member sans permission reçoit 401 (« non authentifié ») alors qu'il est authentifié -> le client peut croire que la session a expiré (cf. test UI plus bas si confirmé). - Cause probable : `backend/API/Middlewares/Roles.cs:23` (`StatusCodes.Status401Unauthorized`), `backend/API/Problems/MessageProblems.cs` </details> <details><summary>[SECURITY_UX-14] `MessageProblems.TooLong` renvoie 404 « Message too long » — Gravité : Mineur</summary> - Obtenu : `POST` d'un message de 8193 caractères -> 404 (devrait être 400/413/422). Cf. SECURITY_UX-05. `PUT /channels/{id}/messages/{msgId}` n'a pas la limite de 8192 (voir suspicions). - Cause probable : `backend/API/Problems/MessageProblems.cs` (TooLong -> `Status404NotFound`) </details> <details><summary>[CHAT-05] Statuts HTTP incohérents sur les erreurs de messages — Gravité : Mineur</summary> - `MESSAGE_TOO_LONG` (message > 8192) renvoie **404** (`Problems/MessageProblems.cs`, TooLong) au lieu de 413/422 (vérifié sur POST de 8193 caractères). - Interdit (pas l'expéditeur / pas whitelisté / sans ManageMessages) renvoie **401** au lieu de 403 (NotSender, AccessNotAuthorized, NotAuthorized). Le front traite 401 comme "non connecté" dans certains flux (voir tests UI). - `NotAuthorized()` réutilise le code `MESSAGE_NOT_SENDER` (même errorCode que NotSender). - Création de catégorie avec rôle inconnu : errorCode `CHANNEL_ROLE_NOT_FOUND` (copié-collé du channel). </details> <details><summary>[CHAT-12] `PUT /channels/{id}` et `PUT /categories/{id}` renvoient 201 Created (doc : 204) — Gravité : Cosmétique</summary> - Réponse 201 + Location au lieu de 200/204 ; `WithDescription/Produces(204)` ne correspond pas (`Update/UpdateChannelEndpoint.cs`, `Categories/Update/UpdateCategoryEndpoint.cs`). </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._
dernst self-assigned this 2026-10-28 10:49:40 +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#115
No description provided.