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