Skip to content
Snippets Groups Projects
Commit 913b9285 authored by Fabio Vandewaeter's avatar Fabio Vandewaeter
Browse files

pom + chemin download

parent 482bbe71
No related branches found
No related tags found
No related merge requests found
...@@ -116,5 +116,7 @@ ...@@ -116,5 +116,7 @@
<properties> <properties>
<jersey.version>3.0.2</jersey.version> <jersey.version>3.0.2</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties> </properties>
</project> </project>
...@@ -14,35 +14,6 @@ import jakarta.ws.rs.ext.Provider; ...@@ -14,35 +14,6 @@ import jakarta.ws.rs.ext.Provider;
public class AuthFilter implements ContainerRequestFilter { public class AuthFilter implements ContainerRequestFilter {
private static final Map<String, String> USERS = loadUsers(); 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 @Override
public void filter(ContainerRequestContext ctx) throws IOException { public void filter(ContainerRequestContext ctx) throws IOException {
String token = extractToken(ctx); String token = extractToken(ctx);
......
...@@ -2,14 +2,18 @@ package fil.sr2.flopbox; ...@@ -2,14 +2,18 @@ package fil.sr2.flopbox;
import jakarta.ws.rs.*; import jakarta.ws.rs.*;
import jakarta.ws.rs.core.*; import jakarta.ws.rs.core.*;
import java.io.Closeable;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException; import java.net.SocketException;
import java.net.URI; import java.net.URI;
import java.util.List; import java.util.List;
import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
@Path("/ftps") @Path("/ftps")
public class FTPResource { public class FTPResource {
...@@ -98,29 +102,74 @@ public class FTPResource { ...@@ -98,29 +102,74 @@ public class FTPResource {
@HeaderParam("X-FTP-Pass") String pass) { @HeaderParam("X-FTP-Pass") String pass) {
FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias); 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(); FTPClient ftp = new FTPClient();
try { try {
// Connexion au serveur FTP
ftp.connect(config.getHost(), config.getPort()); ftp.connect(config.getHost(), config.getPort());
ftp.login(user, pass); if (!ftp.login(user, pass)) {
// path = "/home/m1gl/fabio.vandewaeter.etu/M1/SR2/serveur-ftp-test/" + path; 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); InputStream is = ftp.retrieveFileStream(path);
if (is == null) { if (is == null) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR) 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) + "\"") .header("Content-Disposition", "attachment; filename=\"" + getFileName(path) + "\"")
.build(); .build();
} catch (IOException e) { } catch (IOException e) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
} finally { .entity("Erreur FTP : " + e.getMessage()).build();
try { }
if (ftp.isConnected()) { }
ftp.logout();
ftp.disconnect(); // 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();
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment