Utilisateurs et accès
Création, connexion, lecture, mise à jour et suppression de comptes. Les jetons JWT transportent l'identité et le rôle ; les routes utilisent les contrôles Quarkus pour limiter les accès.
@Path("/api/projects")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ProjectResource {
@GET
@Authenticated
public Response listProject(
@QueryParam("onlyOwned") boolean onlyOwned
) { ... }
}
Plateforme web collaborative associant une interface React à une API REST pour gérer des utilisateurs, des projets, leurs fichiers et leur versionnement.
PING réunit une interface web et un backend pour proposer un espace de travail collaboratif : comptes, projets partagés, fichiers et versionnement.
Le projet complet comportait un frontend React développé dans un dépôt distinct et un backend Java/Quarkus. Le dépôt disponible pour cet audit contient uniquement le backend : une API HTTP qui reçoit des requêtes JSON, applique les droits liés à l'utilisateur connecté et coordonne une base PostgreSQL avec les dossiers stockés sur le serveur.
L'interface communique avec l'API REST. Dans le backend conservé, le code sépare les routes HTTP, la logique applicative et l'accès aux données. Le schéma distingue ainsi le frontend du périmètre effectivement vérifié dans le dépôt Java.
Dépôt distinct - participation personnelle à la conception uniquement
Réception des requêtes, JWT, rôles et réponses JSON
Utilisateurs, projets, fichiers, dossiers et commandes Git
Comptes, projets, propriétaires et membres
Contenu des projets et dépôts gérés avec JGit
Création, connexion, lecture, mise à jour et suppression de comptes. Les jetons JWT transportent l'identité et le rôle ; les routes utilisent les contrôles Quarkus pour limiter les accès.
Création et consultation des projets, changement de propriétaire, ajout ou retrait de membres et suppression avec vérification du propriétaire, de l'administrateur ou de l'appartenance au projet.
Création, lecture, déplacement, téléversement et suppression de fichiers, ainsi que création, liste, déplacement et suppression de dossiers dans l'espace associé à chaque projet.
Une route d'exécution s'appuie sur JGit pour initialiser un dépôt, ajouter des fichiers correspondant à des motifs et créer un commit. Le rendu ne met pas en œuvre l'ensemble des commandes Git.
Avant une opération sur un fichier, le chemin demandé est résolu depuis le dossier du projet puis converti en chemin canonique. Le code refuse la requête si le résultat sort de ce dossier, ce qui limite les tentatives de navigation vers d'autres emplacements du serveur.
Path projectPath = Path.of(projectDefaultPath)
.resolve(projectId.toString())
.toAbsolutePath();
File file = projectPath.resolve(relativePath)
.toFile()
.getCanonicalFile();
if (!file.toPath().startsWith(projectPath)) {
YUCATAN_ATTACK.throwException();
}
La spécification OpenAPI conservée dans le dépôt décrit 27 opérations réparties sur 18 chemins pour les utilisateurs, projets, fichiers et dossiers. Elle documente aussi les réponses attendues selon les droits et les erreurs rencontrées.
Sur le frontend, j'ai contribué à la conception de l'interface, sans participer à son développement. Pour le backend, le travail était collectif : les quatre membres actifs de l'équipe ont participé aux différentes parties du code. Je ne rattache donc pas un module particulier à une seule personne.
Ce travail m'a permis de relier une API REST à un modèle de données relationnel et de mieux comprendre la circulation d'une identité entre connexion, jeton JWT et autorisation des routes. La conception du frontend et le développement collectif du backend m'ont également appris à faire évoluer une même fonctionnalité avec plusieurs membres de l'équipe.