From 913b928508f8230a1d08a202294daa00ce61b8d4 Mon Sep 17 00:00:00 2001 From: Vandewaeter Fabio <fabio.vandewaeter.etu@univ-lille.fr> Date: Mon, 10 Mar 2025 11:40:13 +0100 Subject: [PATCH] pom + chemin download --- pom.xml | 2 + src/main/java/fil/sr2/flopbox/AuthFilter.java | 29 -------- .../java/fil/sr2/flopbox/FTPResource.java | 73 ++++++++++++++++--- 3 files changed, 63 insertions(+), 41 deletions(-) diff --git a/pom.xml b/pom.xml index 9512a90..8029544 100644 --- a/pom.xml +++ b/pom.xml @@ -116,5 +116,7 @@ <properties> <jersey.version>3.0.2</jersey.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.release>17</maven.compiler.release> </properties> + </project> diff --git a/src/main/java/fil/sr2/flopbox/AuthFilter.java b/src/main/java/fil/sr2/flopbox/AuthFilter.java index ce1d738..89a8821 100644 --- a/src/main/java/fil/sr2/flopbox/AuthFilter.java +++ b/src/main/java/fil/sr2/flopbox/AuthFilter.java @@ -14,35 +14,6 @@ import jakarta.ws.rs.ext.Provider; public class AuthFilter implements ContainerRequestFilter { private static final Map<String, String> USERS = loadUsers(); - /* - * @Override - * public void filter(ContainerRequestContext requestContext) throws IOException - * { - * // Récupération de l'en-tête Authorization (ex. - * "Bearer flopbox-secret-token") - * String authHeader = - * requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); - * if (authHeader == null || !authHeader.startsWith("Bearer ")) { - * requestContext.abortWith( - * Response.status(Response.Status.UNAUTHORIZED) - * .entity("En-tête Authorization manquant ou invalide") - * .build()); - * return; - * } - * String token = authHeader.substring("Bearer ".length()); - * // Vérification du token (dans une implémentation réelle, vérification par - * // rapport à une liste de comptes stockés) - * if (!"flopbox-secret-token".equals(token)) { - * requestContext.abortWith( - * Response.status(Response.Status.UNAUTHORIZED) - * .entity("Token invalide") - * .build()); - * return; - * } - * // Si le token est valide, la requête continue. - * } - */ - @Override public void filter(ContainerRequestContext ctx) throws IOException { String token = extractToken(ctx); diff --git a/src/main/java/fil/sr2/flopbox/FTPResource.java b/src/main/java/fil/sr2/flopbox/FTPResource.java index 7e199da..b81f0b3 100644 --- a/src/main/java/fil/sr2/flopbox/FTPResource.java +++ b/src/main/java/fil/sr2/flopbox/FTPResource.java @@ -2,14 +2,18 @@ package fil.sr2.flopbox; import jakarta.ws.rs.*; import jakarta.ws.rs.core.*; + +import java.io.Closeable; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.net.SocketException; import java.net.URI; import java.util.List; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPFile; @Path("/ftps") public class FTPResource { @@ -98,29 +102,74 @@ public class FTPResource { @HeaderParam("X-FTP-Pass") String pass) { FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias); + if (config == null) { + return Response.status(Response.Status.NOT_FOUND) + .entity("Serveur FTP non trouvé").build(); + } + FTPClient ftp = new FTPClient(); + try { + // Connexion au serveur FTP ftp.connect(config.getHost(), config.getPort()); - ftp.login(user, pass); - // path = "/home/m1gl/fabio.vandewaeter.etu/M1/SR2/serveur-ftp-test/" + path; + if (!ftp.login(user, pass)) { + return Response.status(Response.Status.UNAUTHORIZED) + .entity("Authentification FTP échouée").build(); + } + + // Configuration du transfert + ftp.enterLocalPassiveMode(); + ftp.setFileType(FTP.BINARY_FILE_TYPE); + + // Vérification de l'existence du fichier + FTPFile[] files = ftp.listFiles(path); + if (files.length == 0 || files[0].isDirectory()) { + return Response.status(Response.Status.NOT_FOUND) + .entity("Fichier non trouvé : " + path).build(); + } + + // Récupération du flux FTP InputStream is = ftp.retrieveFileStream(path); if (is == null) { return Response.status(Response.Status.INTERNAL_SERVER_ERROR) - .entity("Could not retrieve file : " + path).build(); + .entity("Échec de la récupération du fichier").build(); } - return Response.ok(is) + + // Création de la réponse avec fermeture automatique des ressources + return Response.ok(new InputStreamResource(is, ftp)) .header("Content-Disposition", "attachment; filename=\"" + getFileName(path) + "\"") .build(); + } catch (IOException e) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); - } finally { - try { - if (ftp.isConnected()) { - ftp.logout(); - ftp.disconnect(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Erreur FTP : " + e.getMessage()).build(); + } + } + + // Classe utilitaire pour gérer le flux et fermer les ressources + private static class InputStreamResource implements StreamingOutput { + private final InputStream inputStream; + private final FTPClient ftpClient; + + public InputStreamResource(InputStream inputStream, FTPClient ftpClient) { + this.inputStream = inputStream; + this.ftpClient = ftpClient; + } + + @Override + public void write(OutputStream output) throws IOException, WebApplicationException { + try (inputStream) { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + output.write(buffer, 0, bytesRead); + } + } finally { + if (ftpClient.isConnected()) { + ftpClient.completePendingCommand(); + ftpClient.logout(); + ftpClient.disconnect(); } - } catch (IOException e) { - e.printStackTrace(); } } } -- GitLab