From 117de6cc60b6d1a31de7c6fde4bd48f9f37b122b Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:37:15 +0100 Subject: [PATCH] Refacto sitemanager and databasesmanager add comments and refacto for better lisibility --- src/Classes/DatabasesManager.java | 20 +++++++------ src/Classes/Menu.java | 12 ++++---- src/Classes/PasswordUtils.java | 2 +- src/Classes/SiteManager.java | 49 +++++++++++++++++++------------ 4 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/Classes/DatabasesManager.java b/src/Classes/DatabasesManager.java index 35e22c0..d89b01b 100644 --- a/src/Classes/DatabasesManager.java +++ b/src/Classes/DatabasesManager.java @@ -21,22 +21,23 @@ public DatabasesManager(File databasesFile) { this.databasesFile = databasesFile; this.databases = loadDatabases() != null ? loadDatabases() : new HashMap<>(); } - + //Verify the hashed password with the password entered by the user public boolean verifyDatabase(String dbName, String password) { if (!databases.containsKey(dbName)) return false; Database database = databases.get(dbName); String hashedPassword = sha256.calculateHash(password); return database.getHashPassword().equals(hashedPassword); } - + //create database object with user inputs public void createDatabase(String dbName, String password, Map encryptionMap) { if (databases.containsKey(dbName)) { throw new IllegalArgumentException("Database already exists."); } String hashedPassword = sha256.calculateHash(password); Database newDatabase = new Database(dbName, hashedPassword, encryptionMap); - databases.put(dbName, newDatabase); - saveDatabases(); + databases.put(dbName, newDatabase); //add the dbname and the db object to a map + + saveDatabases();//save the map } private Map loadDatabases() { @@ -61,7 +62,7 @@ private void saveDatabases() { } } - // Classe interne représentant une base de données + // class database to make the database manager easy to use public static class Database { private final String name; private final String hashPassword; @@ -85,15 +86,16 @@ public Map getEncryptionMap() { return encryptionMap; } } + //method to get the encryption map for the encryption and decryption during the database user selection public Map getEncryptionMap(String dbName) { - if (!databases.containsKey(dbName)) { + if (!databases.containsKey(dbName)) { // if the database name doesn't exist throw new IllegalArgumentException("Database does not exist: " + dbName); } try (FileReader reader = new FileReader(databasesFile)) { Gson gson = new Gson(); - Map> allDatabases = gson.fromJson(reader, Map.class); - Map dbData = allDatabases.get(dbName); - return (Map) dbData.get("encryptionMap"); + Map> allDatabases = gson.fromJson(reader, Map.class); //get all the databases info from databases.json + Map dbData = allDatabases.get(dbName); //get the wanted database + return (Map) dbData.get("encryptionMap"); // get all the encryption methods from the current database } catch (IOException e) { throw new RuntimeException("Failed to read databases file.", e); } diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index 4be04d6..32c736b 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -68,7 +68,7 @@ else if (dbChoice == 2) { Map encryptionMap = new HashMap<>(); boolean addMoreEncryptions = true; - while (addMoreEncryptions) { + while (addMoreEncryptions) { //ask user what encryption method he wants to use System.out.println("Choose an encryption method:"); System.out.println("1. RotX"); System.out.println("2. RC4"); @@ -80,25 +80,25 @@ else if (dbChoice == 2) { scanner.nextLine(); // Consume newline character switch (encryptionChoice) { - case 1 -> { + case 1 -> { //case rotX ask value for future executions System.out.println("Enter the shift value for RotX:"); String shiftValue = scanner.nextLine(); encryptionMap.put("RotX", shiftValue); } - case 2 -> { + case 2 -> {//case rc4 ask value for future executions System.out.println("Enter the key for RC4:"); String rc4Key = scanner.nextLine(); encryptionMap.put("RC4", rc4Key); } - case 3 -> { + case 3 -> {//case vigenere ask value for future execution System.out.println("Enter the key for Vigenere:"); String vigenereKey = scanner.nextLine(); encryptionMap.put("Vigenere", vigenereKey); } - case 4 -> { + case 4 -> {//case vigenere ask value for future execution encryptionMap.put("Polybios", "default"); } - case 5 -> addMoreEncryptions = false; + case 5 -> addMoreEncryptions = false;//leave the encryptions chain default -> System.out.println("Invalid choice. Please choose a valid encryption method."); } } diff --git a/src/Classes/PasswordUtils.java b/src/Classes/PasswordUtils.java index d410d1c..71a5283 100644 --- a/src/Classes/PasswordUtils.java +++ b/src/Classes/PasswordUtils.java @@ -11,7 +11,7 @@ public static String generateRandomPassword(int length) { Random random = new Random(); StringBuilder password = new StringBuilder(); for (int i = 0; i < length; i++) { - password.append(chars.charAt(random.nextInt(chars.length()))); + password.append(chars.charAt(random.nextInt(chars.length()))); // generate random password in range chars, from random int } return password.toString(); } diff --git a/src/Classes/SiteManager.java b/src/Classes/SiteManager.java index 718c67a..46061dd 100644 --- a/src/Classes/SiteManager.java +++ b/src/Classes/SiteManager.java @@ -15,12 +15,12 @@ public class SiteManager { private final Map encryptionMap; // Méthodes de chiffrement associées public SiteManager(File dbFile, Map encryptionMap) { - this.dbFile = dbFile; - this.encryptionMap = encryptionMap; + this.dbFile = dbFile; //file name + this.encryptionMap = encryptionMap;// encryption method with parameter needed this.sites = loadSites(); } - public void manageSites(Scanner scanner) { + public void manageSites(Scanner scanner) { //methods to ask user what method he will call while (true) { System.out.println("Choose an action:"); System.out.println("1. Add a site"); @@ -31,7 +31,7 @@ public void manageSites(Scanner scanner) { int choice = scanner.nextInt(); scanner.nextLine(); - switch (choice) { + switch (choice) { //calls method based on the user input case 1 -> addSite(scanner); case 2 -> modifySite(scanner); case 3 -> deleteSite(scanner); @@ -42,7 +42,7 @@ public void manageSites(Scanner scanner) { } } - public void addSite(String siteName, String username, String password) { + public void addSite(String siteName, String username, String password) {//add method use for applying value from scanner method and for the test file Map site = new HashMap<>(); site.put("siteName", siteName); site.put("username", username); @@ -51,7 +51,7 @@ public void addSite(String siteName, String username, String password) { saveSites(); } - public void addSite(Scanner scanner) { + public void addSite(Scanner scanner) { //add site in the selected json System.out.println("Enter site name:"); String siteName = scanner.nextLine(); System.out.println("Enter username:"); @@ -61,7 +61,7 @@ public void addSite(Scanner scanner) { addSite(siteName, username, password); } - public void modifySite(String siteName, String newUsername, String newPassword) { + public void modifySite(String siteName, String newUsername, String newPassword) { //modify method use for applying value from scanner method and for the test file for (Map site : sites) { if (site.get("siteName").equals(siteName)) { if (newUsername != null && !newUsername.isEmpty()) { @@ -77,7 +77,7 @@ public void modifySite(String siteName, String newUsername, String newPassword) throw new IllegalArgumentException("Site not found: " + siteName); } - public void modifySite(Scanner scanner) { + public void modifySite(Scanner scanner) { //modify the selected site from the selected json System.out.println("Enter the site name to modify:"); String siteName = scanner.nextLine(); System.out.println("Enter the new username (leave empty to keep current):"); @@ -87,18 +87,18 @@ public void modifySite(Scanner scanner) { modifySite(siteName, newUsername, newPassword); } - public void deleteSite(String siteName) { + public void deleteSite(String siteName) { //delete method use for the test file sites.removeIf(site -> site.get("siteName").equals(siteName)); saveSites(); } - public void deleteSite(Scanner scanner) { + public void deleteSite(Scanner scanner) { //delete the selected site from the selected json System.out.println("Enter the site name to delete:"); String siteName = scanner.nextLine(); deleteSite(siteName); } - public void displaySites() { + public void displaySites() { // displays all sites from selected json if (sites.isEmpty()) { System.out.println("No sites available."); } else { @@ -117,14 +117,14 @@ public void displaySites() { public List> loadSites() { if (!dbFile.exists()) return new ArrayList<>(); try (FileReader reader = new FileReader(dbFile)) { - // Lire le fichier et déchiffrer son contenu + // read file and decrypt StringBuilder encryptedContent = new StringBuilder(); int c; while ((c = reader.read()) != -1) { encryptedContent.append((char) c); } - // Déchiffrement du contenu entier + // decrypt the file content String decryptedContent = decrypt(encryptedContent.toString()); Gson gson = new Gson(); @@ -138,12 +138,12 @@ public List> loadSites() { public void saveSites() { try (FileWriter writer = new FileWriter(dbFile)) { - // Conversion des sites en JSON + // convert sites into java json file Gson gson = new GsonBuilder().setPrettyPrinting().create(); Map data = Map.of("sites", sites); String jsonContent = gson.toJson(data); - // Chiffrer le contenu JSON + // crypt json content String encryptedContent = encrypt(jsonContent); writer.write(encryptedContent); @@ -154,20 +154,26 @@ public void saveSites() { private String encrypt(String input) { String result = input; + //all case for all encryption methods for (String method : encryptionMap.keySet()) { switch (method) { case "RotX" -> { - int shift = Integer.parseInt(encryptionMap.get("RotX")); + //rotx encryption + int shift = Integer.parseInt(encryptionMap.get("RotX")); //get encryption value from the encryption map from databases.json result = ROTX.encryptROT(result, shift); } case "RC4" -> { + //rc4 encryption + RC4 rc4 = new RC4(); - String key = encryptionMap.get("RC4"); + String key = encryptionMap.get("RC4");//get encryption value from the encryption map from databases.json rc4.init(key); result = rc4.encrypt(result); } case "Vigenere" -> { - String key = encryptionMap.get("Vigenere"); + //vigenere encryption + + String key = encryptionMap.get("Vigenere");//get encryption value from the encryption map from databases.json result = VigenereAlgo.encrypt(result, key); } case "Polybios" -> { @@ -181,23 +187,28 @@ private String encrypt(String input) { private String decrypt(String input) { String result = input; - // Inverser l'ordre des méthodes pour le déchiffrement + // invert encryption order to handle the multiple encryption List methods = new ArrayList<>(encryptionMap.keySet()); Collections.reverse(methods); for (String method : methods) { switch (method) { case "RotX" -> { + //decrypt json content from databases RotX encryptionmethod int shift = Integer.parseInt(encryptionMap.get("RotX")); result = ROTX.decryptROT(result, shift); } case "RC4" -> { + //decrypt json content from databases RC4 encryptionmethod + RC4 rc4 = new RC4(); String key = encryptionMap.get("RC4"); rc4.init(key); result = rc4.decrypt(result); } case "Vigenere" -> { + //decrypt json content from databases Vigenere encryptionmethod + String key = encryptionMap.get("Vigenere"); result = VigenereAlgo.decrypt(result, key); }