@Path("/api/projects")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ProjectResource {
    @GET
    @Authenticated
    public Response listProject(
        @QueryParam("onlyOwned") boolean onlyOwned
    ) { ... }
}
S6 - 2025 12 semaines 4 étudiants

PING

Plateforme web collaborative associant une interface React à une API REST pour gérer des utilisateurs, des projets, leurs fichiers et leur versionnement.

Java 21 Quarkus React PostgreSQL JWT JGit OpenAPI

Le projet en quelques mots

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.

Organisation du backend

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.

Frontend React

Dépôt distinct - participation personnelle à la conception uniquement

Ressources REST

Réception des requêtes, JWT, rôles et réponses JSON

Services métier

Utilisateurs, projets, fichiers, dossiers et commandes Git

PostgreSQL

Comptes, projets, propriétaires et membres

Système de fichiers

Contenu des projets et dépôts gérés avec JGit

Fonctionnalités présentes

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.

Projets collaboratifs

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.

Fichiers et dossiers

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.

Versionnement Git

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.

Un contrôle important : rester dans le projet

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.

Synthèse du projet

Ma participation

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 que le projet m'a apporté

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.

Projet précédent INFO8 - TinyX Tous les projets Projet suivant Tiger