From 4b8367e641383965c8ec61207b58da2832d9cec7 Mon Sep 17 00:00:00 2001 From: Maximilien LEDOUX Date: Sat, 12 Mar 2022 18:04:14 +0100 Subject: [PATCH] =?UTF-8?q?V=C3=A9rification=20du=20nombre=20de=20fichiers?= =?UTF-8?q?=20pr=C3=A9sents=20pour=20un=20utilisateur=20avant=20de=20lui?= =?UTF-8?q?=20permettre=20d'ajouter=20un=20fichier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domains/client/Context.java | 22 ++++++--- .../protocol/rules/reader/SavefileRule.java | 45 ++++++++++--------- .../java/lightcontainer/storage/AppData.java | 11 ++++- .../lightcontainer/storage/Repository.java | 7 ++- .../java/lightcontainer/storage/User.java | 12 ++++- app/src/main/resources/appdata.json | 28 +----------- 6 files changed, 67 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/lightcontainer/domains/client/Context.java b/app/src/main/java/lightcontainer/domains/client/Context.java index 7c41b63..a87ef6a 100644 --- a/app/src/main/java/lightcontainer/domains/client/Context.java +++ b/app/src/main/java/lightcontainer/domains/client/Context.java @@ -103,6 +103,7 @@ public class Context { /** * Clé AES de l'utilisateur + * * @return Clé AES de l'utilisateur */ public String getAesKey() { @@ -118,7 +119,8 @@ public class Context { /** * Permet d'ajouter des données pour la requête courrante - * @param key La clé permettant de retrouver la valeur + * + * @param key La clé permettant de retrouver la valeur * @param value La valeur associée à la clé */ public void putDataString(String key, String value) { @@ -127,7 +129,8 @@ public class Context { /** * Permet d'ajouter des données pour la requête courrante - * @param key La clé permettant de retrouver la valeur + * + * @param key La clé permettant de retrouver la valeur * @param value La valeur associée à la clé */ public void putDataInt(String key, int value) { @@ -136,6 +139,7 @@ public class Context { /** * Permet de récupérer des données pour la requête courrante + * * @param key La clé permettant de retrouver la valeur * @return La valeur associée à la clé ou null */ @@ -145,6 +149,7 @@ public class Context { /** * Permet de récupérer des données pour la requête courrante + * * @param key La clé permettant de retrouver la valeur * @return La valeur associée à la clé */ @@ -154,17 +159,22 @@ public class Context { /** * Permet d'ajouter un fichier à l'utilisateur - * @param fileName Nom du fichier hashé + * + * @param fileName Nom du fichier hashé * @param fileNameSalt Salt appliqué sur le nom du fichier - * @param size Taille du fichier - * @param iv IV du fichier - * @param domain Domain dans lequel est stocké le fichier + * @param size Taille du fichier + * @param iv IV du fichier + * @param domain Domain dans lequel est stocké le fichier * @return TRUE si le fichier a pu être enregistré. */ public boolean addFile(String fileName, String fileNameSalt, int size, String iv, String domain) { return this.repository.addFileFor(new File(fileName, fileNameSalt, size, iv, Set.of(domain)), getLogin()); } + public boolean canAddFile() { + return repository.canAddFile(login); + } + public String getDomain() { return this.domain; } diff --git a/app/src/main/java/lightcontainer/protocol/rules/reader/SavefileRule.java b/app/src/main/java/lightcontainer/protocol/rules/reader/SavefileRule.java index 87c7672..1c7fc11 100644 --- a/app/src/main/java/lightcontainer/protocol/rules/reader/SavefileRule.java +++ b/app/src/main/java/lightcontainer/protocol/rules/reader/SavefileRule.java @@ -54,39 +54,44 @@ public class SavefileRule extends ProtocolReader { super.read(reader); System.out.printf("Sauvegarde du fichier : %s %d\n", filename, size); - try { - FileReceiver fileReceiver = new FileReceiver(storagePath); + if (getContext().canAddFile()) { + try { + FileReceiver fileReceiver = new FileReceiver(storagePath); - // Ajout login devant le nom du fichier - this.filename = getContext().getLogin() + "_" + this.filename; + // Ajout login devant le nom du fichier + this.filename = getContext().getLogin() + "_" + this.filename; - // Hashage du nom du fichier - ShaHasher hasher = new ShaHasher(this.filename); - this.filename = hasher.nextHashing(); - String fileNameSalt = hasher.getSalt(); + // Hashage du nom du fichier + ShaHasher hasher = new ShaHasher(this.filename); + this.filename = hasher.nextHashing(); + String fileNameSalt = hasher.getSalt(); - String key = AES_GCM.generateSecretKey(); - String iv = AES_GCM.generateIV(); + String key = AES_GCM.generateSecretKey(); + String iv = AES_GCM.generateIV(); - if (!fileReceiver.receiveFile(reader, this.filename, this.size, key, iv)) - throw new IOException(); + if (!fileReceiver.receiveFile(reader, this.filename, this.size, key, iv)) + throw new IOException(); - // On met les données de la requête actuelle - getContext().putDataString("fileName", filename); - getContext().putDataInt("size", size); - getContext().putDataString("iv", iv); - getContext().putDataString("fileNameSalt", fileNameSalt); + // On met les données de la requête actuelle + getContext().putDataString("fileName", filename); + getContext().putDataInt("size", size); + getContext().putDataString("iv", iv); + getContext().putDataString("fileNameSalt", fileNameSalt); - this.setResultCommand(protocolRep.executeWriter(getContext(), SendfileRule.NAME, this.filename, String.valueOf(this.size), "EMPREINTEBLBLBLBLBLABLABLBALBALBALBALBALBALBALBALBALABLBALBALBALABLABLABLABLABLABLABALBLABALABLABLABLABKJABKAHBHKBHJbhjvgkh"), ResultCmdReceiver.STOREBACKEND); - } catch (IOException | AES_GCM.AesGcmException e) { + this.setResultCommand(protocolRep.executeWriter(getContext(), SendfileRule.NAME, this.filename, String.valueOf(this.size), "EMPREINTEBLBLBLBLBLABLABLBALBALBALBALBALBALBALBALBALABLBALBALBALABLABLABLABLABLABLABALBLABALABLABLABLABKJABKAHBHKBHJbhjvgkh"), ResultCmdReceiver.STOREBACKEND); + } catch (IOException | AES_GCM.AesGcmException e) { + this.setResultCommand(protocolRep.executeWriter(getContext(), SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT); + e.printStackTrace(); + } + } else { this.setResultCommand(protocolRep.executeWriter(getContext(), SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT); - e.printStackTrace(); } } } /** * Cette méthode est appelée lors de l'exécution de la règle + * * @param data Paramètres pour créer la commande. */ @Override diff --git a/app/src/main/java/lightcontainer/storage/AppData.java b/app/src/main/java/lightcontainer/storage/AppData.java index e71295d..474c53b 100644 --- a/app/src/main/java/lightcontainer/storage/AppData.java +++ b/app/src/main/java/lightcontainer/storage/AppData.java @@ -83,6 +83,13 @@ public class AppData { } } + public boolean canAddFile(String login) { + if (this.users.containsKey(login)) { + return this.users.get(login).canAddFile(); + } + return false; + } + public Iterator usersIterator() { return users.values().iterator(); } @@ -104,8 +111,7 @@ public class AppData { if (!this.users.containsKey(userName)) { return false; } else { - this.users.get(userName).addFile(file); - return true; + return this.users.get(userName).addFile(file); } } @@ -155,6 +161,7 @@ public class AppData { /** * Méthode permettant de récupérer la clé AES d'un utilisateur + * * @param login Login de l'utilisateur * @return Clé AES */ diff --git a/app/src/main/java/lightcontainer/storage/Repository.java b/app/src/main/java/lightcontainer/storage/Repository.java index c2211c4..ecbec85 100644 --- a/app/src/main/java/lightcontainer/storage/Repository.java +++ b/app/src/main/java/lightcontainer/storage/Repository.java @@ -55,6 +55,10 @@ public class Repository { return false; } + public boolean canAddFile(String login) { + return appData.canAddFile(login); + } + public boolean deleteFileOf(String fileName, String userName) { if (appData.deleteFileOf(fileName, userName)) { save(); @@ -117,6 +121,7 @@ public class Repository { /** * Méthode permettant de récupérer le chemin de sauvegarde des fichiers + * * @return Chemin de sauvegarde */ public String getStoragePath() { @@ -125,6 +130,7 @@ public class Repository { /** * Méthode permettant de récupérer la clé AES d'un utilisateur + * * @param login Login de l'utilisateur * @return Clé AES */ @@ -133,5 +139,4 @@ public class Repository { } - } diff --git a/app/src/main/java/lightcontainer/storage/User.java b/app/src/main/java/lightcontainer/storage/User.java index 54a4e0a..4b1c1d0 100644 --- a/app/src/main/java/lightcontainer/storage/User.java +++ b/app/src/main/java/lightcontainer/storage/User.java @@ -54,8 +54,16 @@ public class User { * @param file The file to add. * @return False if a file with the same name already exists. Otherwise, adds the file and returns true. */ - public void addFile(File file) { - this.files.put(file.getName(), file); + public boolean addFile(File file) { + if (canAddFile()) { + this.files.put(file.getName(), file); + return true; + } + return false; + } + + public boolean canAddFile() { + return this.files.size() < 50; } /** diff --git a/app/src/main/resources/appdata.json b/app/src/main/resources/appdata.json index 4345981..2e23dd5 100644 --- a/app/src/main/resources/appdata.json +++ b/app/src/main/resources/appdata.json @@ -1,27 +1 @@ -{ - "unicast_port": 8000, - "multicast_ip": "226.66.66.1", - "multicast_port": 15502, - "network_interface": "My network interface", - "tls": true, - "storagePath": "/home/benjamin/ffe", - "users": [ - { - "name": "aaaaa", - "password": "5d628c274ebb008324f1e199d3bfff0a3fe839730a7f2355e82850d7acca5e5ca64db9071abf3d91034295695f84a617", - "aes_key": "qlTH6TijnfMRnrS0Qf+k6IPKGp5LoRMXGxCq16e+mF4=", - "passwordSalt": "Ns8Al6DpqPsIDlCSRBVTEg==", - "files": [ - { - "name": "ebf1d834055adf836823c46d36334edf24f40245948cff0173f999392d8429536ccd57bf82090807a6b9cb4317b1bf64", - "fileNameSalt": "zXjO49TAftzugcnyaw3myQ==", - "size": 854, - "iv": "2DLTOZ4SX9MhTd6JdqFkuw==", - "storage": [ - "lightcontainerSB01" - ] - } - ] - } - ] -} \ No newline at end of file +{"unicast_port":8000,"multicast_ip":"226.66.66.1","multicast_port":15502,"network_interface":"My network interface","tls":true,"storagePath":"C:\\Users\\ledou\\Documents\\ffe","users":[{"name":"aaaaa","password":"5d628c274ebb008324f1e199d3bfff0a3fe839730a7f2355e82850d7acca5e5ca64db9071abf3d91034295695f84a617","aes_key":"qlTH6TijnfMRnrS0Qf+k6IPKGp5LoRMXGxCq16e+mF4=","passwordSalt":"Ns8Al6DpqPsIDlCSRBVTEg==","files":[{"name":"79ba59efe08f50e762b875c2f1c1f36d2bd13ba888c4b8cf548c63f69e742e709405d7cd0f2390090955f5a7c5d61c34","fileNameSalt":"l5Adt2RnYQqHXnDWUdUV7Q==","size":168,"iv":"bEXi5SyhMSkBjYVUU6qAag==","storage":["lightcontainerSB01"]}]}]} \ No newline at end of file