[Mineur] Fichiers : validation des noms et du contenu (../, //, vide, Content-Type invalide) #122
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#122
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é : Mineur
Rapports QA d'origine : FILES-03, FILES-04, FILES-05, FILES-09
Content-Type invalide ou NUL dans le nom donnent 500 avec un objet S3 orphelin ; fichier de 0 octet accepté alors que
StorageProblems.EmptyFileexiste ; noms../xou//xacceptés ; aucune unicité de nom.Détails des rapports
[FILES-03] 500 (avec détails d'exception) sur Content-Type invalide/vide et sur NUL (\x00) dans le nom — Gravité : Mineur
POST /api/filesContent-Typede la partie file =not/a valid; typeou vide. 2. Uploader avec name contenant\x00.System.FormatException: The format of value '...' is invalid(content-type), 500DbUpdateException(NUL, rejeté par PostgreSQL) ; le corps JSON contient la stack trace (env. Development). Dans le cas content-type, l'objet n'est pas stocké mais l'erreur n'est pas gérée ; dans le cas NUL, l'objet S3 est déjà uploadé (orphelin) avant l'échec de la DB.backend/API/Storage/Garage.cs:17-25(ContentType passé tel quel à PutObjectRequest),Upload/UploadFileCommand.cs:12-34(S3 d'abord, DB ensuite, pas de rollback).[FILES-04] Fichier vide (0 octet) accepté alors qu'un problème `EmptyFile` existe — Gravité : Mineur
POST /api/filesavec 0 octet -> 201 (length 0).StorageProblems.EmptyFile()(422 FILE_EMPTY) existe mais n'est jamais appelé. (Remarque : la création de dossier côté front utilise volontairement un fichier videFile([], name)nommé/dossier/, donc l'interdire casserait les dossiers.)backend/API/Problems/StorageProblems.cs:12,Upload/UploadFileCommand.cs.[FILES-05] L'API accepte n'importe quel nom (`../x`, `//x`, sans `/` initial, `/dir/`) : dossiers « .. » et sans nom dans l'UI, fichiers invisibles — Gravité : Mineur
POST /api/files/PATCH /api/files/{key}/name: seule validation = longueur 1..255. Le front attend des noms de la forme/dossier/fichier. Un fichier nomménoslash.txtou../x.txtne commence pas par/donc n'apparaît dans aucun dossier (useFileBrowser.tsfiltrestartsWith(currFolder)), etgetRecentFiles(files.api.ts) ne retient que les noms commençant par/.//qa_files_double.txtcrée une ligne de dossier SANS nom,/../../etc/passwdcrée un dossier nommé..(confondable avec le bouton « remonter ») ;noslash.txt/../qa_files_dotdot.txtn'apparaissent nulle part (invisibles, non supprimables par l'UI). Preuve :screens/qa_files_12_root_weird_and_long.png.[Length(1,255)](Storage/Upload/UploadFileEndpoint.cs:14,Update/UpdateFileNameEndpoint.cs:10) ; la convention « /dossier/nom » n'est vérifiée que côté front (FileUpload.tsx).[FILES-09] Aucune unicité de nom : deux fichiers (ou plus) identiques dans le même dossier — Gravité : Mineur
qa_files_dup.txtdans le même dossier (UI) -> deux lignes identiques, indiscernables (même taille, même icône, sans date ni auteur affichés) ; idem après un « Move » vers un dossier contenant déjà le même nom. Aucun avertissement. Un renommage vers un nom existant est aussi accepté. (Comportement probablement voulu côté API, mais l'UI ne permet pas de distinguer les doublons.)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.