Skip to content
Snippets Groups Projects
Commit db09246c authored by fabiovandewaeter's avatar fabiovandewaeter
Browse files

readme + suppression ressources + création fichiers

parent cbfa493a
No related branches found
No related tags found
No related merge requests found
...@@ -19,17 +19,17 @@ La vidéo `video.mp4` montre pas à pas comment utiliser ce projet (voir la [sec ...@@ -19,17 +19,17 @@ La vidéo `video.mp4` montre pas à pas comment utiliser ce projet (voir la [sec
Pour créer l'archive `FlopBox.jar`, il faut avoir Java 17 et Maven d'installés, et exécuter la commande suivante à la racine du projet : Pour créer l'archive `FlopBox.jar`, il faut avoir Java 17 et Maven d'installés, et exécuter la commande suivante à la racine du projet :
``` ```shell
mvn clean package mvn clean package
``` ```
### Utiliser le programme ### Utiliser le programme
``` ```shell
java -jar target/FlopBox.jar java -jar target/FlopBox.jar
``` ```
``` ```shell
pip install --user pyftpdlib pip install --user pyftpdlib
python3 serveur_ftp.py python3 serveur_ftp.py
``` ```
...@@ -44,11 +44,11 @@ ou ftp.ubuntu.com ...@@ -44,11 +44,11 @@ ou ftp.ubuntu.com
Pour exécuter uniquement les tests il faut lancer la commande suivante : Pour exécuter uniquement les tests il faut lancer la commande suivante :
``` ```shell
mvn test mvn test
``` ```
``` ```shell
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" -d '{"alias":"mon-ftp","host":"localhost","port":2121}' http://localhost:8080/ftps curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" -d '{"alias":"mon-ftp","host":"localhost","port":2121}' http://localhost:8080/ftps
curl -H "Authorization: Bearer valid-token-1" http://localhost:8080/ftps -v curl -H "Authorization: Bearer valid-token-1" http://localhost:8080/ftps -v
...@@ -60,7 +60,7 @@ curl -H "Authorization: Bearer valid-token-1" -o fichier.html http://localhost:8 ...@@ -60,7 +60,7 @@ curl -H "Authorization: Bearer valid-token-1" -o fichier.html http://localhost:8
### Générer la javadoc ### Générer la javadoc
Lancer la commande suivante : Lancer la commande suivante :
``` ```shell
mvn javadoc:javadoc mvn javadoc:javadoc
``` ```
...@@ -79,7 +79,7 @@ Puis ouvrir le fichier `target/site/apidocs/index.html` ...@@ -79,7 +79,7 @@ Puis ouvrir le fichier `target/site/apidocs/index.html`
**Note comprise entre 10 et 11 si le code compile et peut être lancé pour afficher l'arborescence d'un serveur FTP via le proxy FlopBox:** **Note comprise entre 10 et 11 si le code compile et peut être lancé pour afficher l'arborescence d'un serveur FTP via le proxy FlopBox:**
```shell ```shell
> curl -X GET -v -H "Authorization: Bearer valid-token-1" -H "X-FTP-User: anonymous" -H "X-FTP-Pass: anonymous" localhost:8080/ftps/mon-ftp/folder curl -X GET -v -H "Authorization: Bearer valid-token-1" -H "X-FTP-User: anonymous" -H "X-FTP-Pass: anonymous" localhost:8080/ftps/mon-ftp/folder
Note: Unnecessary use of -X or --request, GET is already inferred. Note: Unnecessary use of -X or --request, GET is already inferred.
* Trying 127.0.0.1:8080... * Trying 127.0.0.1:8080...
...@@ -107,36 +107,48 @@ Note: Unnecessary use of -X or --request, GET is already inferred. ...@@ -107,36 +107,48 @@ Note: Unnecessary use of -X or --request, GET is already inferred.
**Note comprise entre 13 et 14 si—en plus—le proxy FlopBox permet de gérer plusieurs serveurs FTP différents (ajout, suppression, modification des serveurs):** **Note comprise entre 13 et 14 si—en plus—le proxy FlopBox permet de gérer plusieurs serveurs FTP différents (ajout, suppression, modification des serveurs):**
- ajout :
```shell ```shell
> curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" -d '{"alias":"mon-ftp","host":"localhost","port":2121}' http://localhost:8080/ftps curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" -d '{"alias":"mon-ftp","host":"localhost","port":2121}' http://localhost:8080/ftps
``` ```
- suppression :
```shell ```shell
> curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" http://localhost:8080/ftps curl -X DELETE -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" http://localhost:8080/ftps/mon-ftp
``` ```
- modification :
```shell ```shell
curl -X PUT http://localhost:8080/ftps/mon-ftp \ curl -X PUT http://localhost:8080/ftps/mon-ftp -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" -d '{"alias":"mon-ftp","host":"nouvelle-adresse","port":2221}'
-H "Content-Type: application/json" \
-H "Authorization: Bearer valid-token-1" \
-d '{"alias":"mon-ftp","host":"nouvelle-adresse","port":2221}'
``` ```
- lister les serveurs :
```shell ```shell
fabio.vandewaeter.etu@b10p21:~/M1/SR2/TEMPO$ curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" http://localhost:8080/ftps curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer valid-token-1" http://localhost:8080/ftps
[{"alias":"mon-ftp","host":"nouvelle-adresse","port":2221}] [{"alias":"mon-ftp","host":"nouvelle-adresse","port":2221}]
``` ```
**Note comprise entre 14 et 15 si—en plus—le proxy FlopBox, permet de créer, supprimer, renommer une ressource directement sur l'un des serveurs FTP gérés (fichier ou répertoire):** **Note comprise entre 14 et 15 si—en plus—le proxy FlopBox, permet de créer, supprimer, renommer une ressource directement sur l'un des serveurs FTP gérés (fichier ou répertoire):**
- créer dossier :
```shell
curl -X POST -H "X-Resource-Type: file" -H "Authorization: Bearer valid-token-1" -H "X-FTP-User: user" -H "X-FTP-Pass: password" http://localhost:8080/ftps/mon-ftp/dossier
```
- créer fichier :
```shell
curl -X POST -H "X-Resource-Type: file" -H "Authorization: Bearer valid-token-1" -H "X-FTP-User: user" -H "X-FTP-Pass: password" http://localhost:8080/ftps/mon-ftp/dossier/fichier
```
- renommer :
```shell ```shell
> curl -X DELETE -H "Authorization: Bearer valid-token-1" -H "X-FTP-User: user" -H "X-FTP-Pass: password" http://localhost:8080/ftps/mon-ftp/dir curl -X POST -H "Authorization: Bearer valid-token-1" -H "X-FTP-User: user" -H "X-FTP-Pass: password" -H "Content-Type: text/plain" -d "nouveau_nom" http://localhost:8080/ftps/mon-ftp/dossier/rename
``` ```
- supprimer dossier/fichier :
```shell ```shell
> curl -X POST -H "Authorization: Bearer valid-token-1" -H "X-FTP-User: user" -H "X-FTP-Pass: password" -H "Content-Type: text/plain" -d "nouveau_chemin" http://localhost:8080/ftps/mon-ftp/test/rename curl -X DELETE -H "Authorization: Bearer valid-token-1" -H "X-FTP-User: user" -H "X-FTP-Pass: password" http://localhost:8080/ftps/mon-ftp/nouveau_nom
``` ```
**Note comprise entre 15 et 16 si—en plus—le proxy FlopBox, permet de chercher des fichiers/répertoires stockés dans plusieurs serveurs FTP (le proxy retourne la liste des URLs pour chaque fichier trouvé):** **Note comprise entre 15 et 16 si—en plus—le proxy FlopBox, permet de chercher des fichiers/répertoires stockés dans plusieurs serveurs FTP (le proxy retourne la liste des URLs pour chaque fichier trouvé):**
...@@ -174,65 +174,32 @@ public class FTPResource { ...@@ -174,65 +174,32 @@ public class FTPResource {
} }
} }
/*
* @POST
*
* @Path("/{alias}/{path: .+}")
* public Response createDirectory(
*
* @PathParam("alias") String alias,
*
* @PathParam("path") String path,
*
* @HeaderParam("X-FTP-User") String user,
*
* @HeaderParam("X-FTP-Pass") String pass) throws SocketException, IOException {
*
* System.out.println("createFirectory()");
* FTPClient ftp = new FTPClient();
* try {
* FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias);
* ftp.connect(config.getHost(), config.getPort());
* ftp.login(user, pass);
* return ftp.makeDirectory(path) ? Response.created(URI.create(path)).build()
* : Response.status(Response.Status.BAD_REQUEST).build();
* } finally {
* try {
* if (ftp.isConnected()) {
* ftp.logout();
* ftp.disconnect();
* }
* } catch (IOException e) {
* e.printStackTrace();
* }
* }
* }
*/
@POST @POST
@Path("/{alias}/{path: .+}") @Path("/{alias}/{path: .+}")
@Consumes({ MediaType.APPLICATION_OCTET_STREAM, MediaType.TEXT_PLAIN }) // Accepter les fichiers @Consumes({ MediaType.APPLICATION_OCTET_STREAM, MediaType.TEXT_PLAIN })
public Response createResource( public Response createResource(
@PathParam("alias") String alias, @PathParam("alias") String alias,
@PathParam("path") String path, @PathParam("path") String path,
@HeaderParam("X-FTP-User") String user, @HeaderParam("X-FTP-User") String user,
@HeaderParam("X-FTP-Pass") String pass, @HeaderParam("X-FTP-Pass") String pass,
InputStream inputStream) { // Contenu optionnel @HeaderParam("X-Resource-Type") String resourceType, // Nouveau header
InputStream inputStream) {
System.out.println("createResource()");
FTPClient ftp = new FTPClient(); FTPClient ftp = new FTPClient();
try { try {
FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias); FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias);
ftp.connect(config.getHost(), config.getPort()); ftp.connect(config.getHost(), config.getPort());
ftp.login(user, pass); ftp.login(user, pass);
// Si le flux est vide (0 octet), créer un répertoire // Déterminer le type de ressource via le header
if (inputStream.available() == 0) { if ("directory".equalsIgnoreCase(resourceType)) {
boolean dirCreated = ftp.makeDirectory(path); boolean dirCreated = ftp.makeDirectory(path);
return dirCreated return dirCreated
? Response.created(URI.create(path)).build() ? Response.created(URI.create(path)).build()
: Response.status(400).entity("Erreur création répertoire").build(); : Response.status(400).entity("Erreur création répertoire").build();
} } else {
// Sinon, créer un fichier // Créer un fichier (même avec un flux vide)
else {
boolean fileCreated = ftp.storeFile(path, inputStream); boolean fileCreated = ftp.storeFile(path, inputStream);
return fileCreated return fileCreated
? Response.created(URI.create(path)).build() ? Response.created(URI.create(path)).build()
...@@ -262,6 +229,7 @@ public class FTPResource { ...@@ -262,6 +229,7 @@ public class FTPResource {
@HeaderParam("X-FTP-User") String user, @HeaderParam("X-FTP-User") String user,
@HeaderParam("X-FTP-Pass") String pass) { @HeaderParam("X-FTP-Pass") String pass) {
System.out.println("deleteResource()");
FTPClient ftp = new FTPClient(); FTPClient ftp = new FTPClient();
try { try {
FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias); FTPServerConfig config = FTPServerRepository.getInstance().getServer(alias);
...@@ -289,31 +257,34 @@ public class FTPResource { ...@@ -289,31 +257,34 @@ public class FTPResource {
} }
} }
/**
* Méthode récursive pour supprimer un répertoire et son contenu.
*/
private boolean deleteRecursive(FTPClient ftp, String path) throws IOException { private boolean deleteRecursive(FTPClient ftp, String path) throws IOException {
// Vérifie si le chemin est un répertoire // Tente de supprimer le chemin en tant que fichier
if (ftp.deleteFile(path)) {
return true;
}
// Si ce n'est pas un fichier, vérifie si c'est un répertoire
FTPFile[] files = ftp.listFiles(path); FTPFile[] files = ftp.listFiles(path);
if (files != null && files.length > 0) { if (files == null) {
// Parcours des fichiers et sous-répertoires // Le chemin n'existe pas
for (FTPFile file : files) { return false;
String fullPath = path + "/" + file.getName(); }
if (file.isDirectory()) {
// Suppression récursive des sous-répertoires // Supprime récursivement le contenu du répertoire
if (!deleteRecursive(ftp, fullPath)) { for (FTPFile file : files) {
return false; String fullPath = path + "/" + file.getName();
} if (file.isDirectory()) {
} else { if (!deleteRecursive(ftp, fullPath)) {
// Suppression des fichiers return false;
if (!ftp.deleteFile(fullPath)) { }
return false; } else {
} if (!ftp.deleteFile(fullPath)) {
return false;
} }
} }
} }
// Suppression du répertoire lui-même // Supprime le répertoire lui-même
return ftp.removeDirectory(path); return ftp.removeDirectory(path);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment