Merge branch 'dev' into benjamin
This commit is contained in:
commit
6823c41825
@ -87,9 +87,9 @@ public class App {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void setupVM() {
|
private static void setupVM() {
|
||||||
System.setProperty("javax.net.ssl.keyStore","../ffe.labo.swilabus.com.p12");
|
System.setProperty("javax.net.ssl.keyStore", "../ffe.labo.swilabus.com.p12");
|
||||||
System.setProperty("javax.net.ssl.keyStorePassword","labo2022");
|
System.setProperty("javax.net.ssl.keyStorePassword", "labo2022");
|
||||||
System.setProperty("https.protocols","TLSv1.3");
|
System.setProperty("https.protocols", "TLSv1.3");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,13 +10,13 @@ import lightcontainer.protocol.ProtocolWriter;
|
|||||||
public class Task {
|
public class Task {
|
||||||
// Variables
|
// Variables
|
||||||
private TaskStatus status;
|
private TaskStatus status;
|
||||||
private ProtocolWriter.ProtocolResult command;
|
private final ProtocolWriter.ProtocolResult command;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Défini le context courrant dans laquelle la tâche opère
|
* Défini le context courant dans laquelle la tâche opère
|
||||||
*/
|
*/
|
||||||
private Context context;
|
private final Context context;
|
||||||
|
|
||||||
public Task(Context context, TaskStatus status, ProtocolWriter.ProtocolResult command) {
|
public Task(Context context, TaskStatus status, ProtocolWriter.ProtocolResult command) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
@ -26,17 +26,18 @@ public class Task {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de créer une instance de la class {@link Task}
|
* Permet de créer une instance de la class {@link Task}
|
||||||
|
*
|
||||||
* @param context Context à utiliser pour cette tâche
|
* @param context Context à utiliser pour cette tâche
|
||||||
* @param command Commande à exécuter
|
* @param command Commande à exécuter
|
||||||
* @return L'instance de la tâche créée
|
* @return L'instance de la tâche créée
|
||||||
*/
|
*/
|
||||||
public static Task newInstance(Context context, ProtocolWriter.ProtocolResult command) {
|
public static Task newInstance(Context context, ProtocolWriter.ProtocolResult command) {
|
||||||
Task task = new Task(context, TaskStatus.PENDING, command);
|
return new Task(context, TaskStatus.PENDING, command);
|
||||||
return task;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de savoir si la réponse est destinée au client
|
* Permet de savoir si la réponse est destinée au client
|
||||||
|
*
|
||||||
* @param storeDomain Nom du store back end fournissant la réponse.
|
* @param storeDomain Nom du store back end fournissant la réponse.
|
||||||
* @return TRUE si le client doit recevoir cette réponse.
|
* @return TRUE si le client doit recevoir cette réponse.
|
||||||
*/
|
*/
|
||||||
@ -46,6 +47,7 @@ public class Task {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de récupérer le login du client associé à la tâche
|
* Permet de récupérer le login du client associé à la tâche
|
||||||
|
*
|
||||||
* @return Login du client
|
* @return Login du client
|
||||||
*/
|
*/
|
||||||
public String getClient() {
|
public String getClient() {
|
||||||
@ -54,6 +56,7 @@ public class Task {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de récupérer la commande à executer
|
* Permet de récupérer la commande à executer
|
||||||
|
*
|
||||||
* @return Commande à exécuter
|
* @return Commande à exécuter
|
||||||
*/
|
*/
|
||||||
public ProtocolWriter.ProtocolResult getCommand() {
|
public ProtocolWriter.ProtocolResult getCommand() {
|
||||||
@ -62,6 +65,7 @@ public class Task {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de définir le StorBackEnd à utiliser pour cette tâche
|
* Permet de définir le StorBackEnd à utiliser pour cette tâche
|
||||||
|
*
|
||||||
* @param storeDomain Le StorBackEnd à utiliser
|
* @param storeDomain Le StorBackEnd à utiliser
|
||||||
*/
|
*/
|
||||||
public void setDomain(String storeDomain) {
|
public void setDomain(String storeDomain) {
|
||||||
|
@ -29,12 +29,12 @@ import java.nio.charset.StandardCharsets;
|
|||||||
*/
|
*/
|
||||||
public class ClientHandler implements Runnable, AutoCloseable {
|
public class ClientHandler implements Runnable, AutoCloseable {
|
||||||
// Variables
|
// Variables
|
||||||
private ClientHandlerFFE fileFrontEnd;
|
private final ClientHandlerFFE fileFrontEnd;
|
||||||
private final Socket client;
|
private final Socket client;
|
||||||
private ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
private Context context;
|
private final Context context;
|
||||||
private boolean client_run;
|
private boolean client_run;
|
||||||
private UnicastCHR repository;
|
private final UnicastCHR repository;
|
||||||
|
|
||||||
|
|
||||||
private BufferedReader reader;
|
private BufferedReader reader;
|
||||||
|
@ -107,7 +107,7 @@ public class Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet d'ajouter des données pour la requête courrante
|
* Permet d'ajouter des données pour la requête courante
|
||||||
*
|
*
|
||||||
* @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é
|
* @param value La valeur associée à la clé
|
||||||
@ -117,7 +117,7 @@ public class Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet d'ajouter des données pour la requête courrante
|
* Permet d'ajouter des données pour la requête courante
|
||||||
*
|
*
|
||||||
* @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é
|
* @param value La valeur associée à la clé
|
||||||
@ -127,7 +127,7 @@ public class Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de récupérer des données pour la requête courrante
|
* Permet de récupérer des données pour la requête courante
|
||||||
*
|
*
|
||||||
* @param key La clé permettant de retrouver la valeur
|
* @param key La clé permettant de retrouver la valeur
|
||||||
* @return La valeur associée à la clé ou null
|
* @return La valeur associée à la clé ou null
|
||||||
@ -137,7 +137,7 @@ public class Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de récupérer des données pour la requête courrante
|
* Permet de récupérer des données pour la requête courante
|
||||||
*
|
*
|
||||||
* @param key La clé permettant de retrouver la valeur
|
* @param key La clé permettant de retrouver la valeur
|
||||||
* @return La valeur associée à la clé
|
* @return La valeur associée à la clé
|
||||||
|
@ -5,13 +5,14 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class RequestBundle {
|
public class RequestBundle {
|
||||||
|
|
||||||
private Map<String, String> stringData = new HashMap<>();
|
private final Map<String, String> stringData = new HashMap<>();
|
||||||
|
|
||||||
private Map<String, Integer> intData = new HashMap<>();
|
private final Map<String, Integer> intData = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet d'ajouter des String
|
* Permet d'ajouter des String
|
||||||
* @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é
|
* @param value La valeur associée à la clé
|
||||||
*/
|
*/
|
||||||
public void putString(String key, String value) {
|
public void putString(String key, String value) {
|
||||||
@ -20,7 +21,8 @@ public class RequestBundle {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet d'ajouter des int
|
* Permet d'ajouter des int
|
||||||
* @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é
|
* @param value La valeur associée à la clé
|
||||||
*/
|
*/
|
||||||
public void putInt(String key, int value) {
|
public void putInt(String key, int value) {
|
||||||
@ -29,6 +31,7 @@ public class RequestBundle {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de récupérer des données string
|
* Permet de récupérer des données string
|
||||||
|
*
|
||||||
* @param key La clé permettant de retrouver la valeur
|
* @param key La clé permettant de retrouver la valeur
|
||||||
* @return La valeur associée à la clé ou null
|
* @return La valeur associée à la clé ou null
|
||||||
*/
|
*/
|
||||||
@ -38,6 +41,7 @@ public class RequestBundle {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de récupérer des données int
|
* Permet de récupérer des données int
|
||||||
|
*
|
||||||
* @param key La clé permettant de retrouver la valeur
|
* @param key La clé permettant de retrouver la valeur
|
||||||
* @return La valeur associée à la clé
|
* @return La valeur associée à la clé
|
||||||
*/
|
*/
|
||||||
|
@ -8,23 +8,21 @@ import lightcontainer.protocol.ProtocolWriter;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.SocketException;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* StoreProcessor
|
* StoreProcessor
|
||||||
*
|
* <p>
|
||||||
* <!> MULTICAST CLIENT <!>
|
* <!> MULTICAST CLIENT <!>
|
||||||
* Class communicating with the storebackend and
|
* Class communicating with the storebackend and
|
||||||
* processing the tasks in the FileFrontEnd
|
* processing the tasks in the FileFrontEnd
|
||||||
*
|
*
|
||||||
* @version 1.1
|
* @author Jérémi NIHART <j.nihart@student.helmo.be>
|
||||||
* @since 1.0
|
* @version 1.1
|
||||||
*
|
* @see Runnable
|
||||||
* @see Runnable
|
* @see AutoCloseable
|
||||||
* @see AutoCloseable
|
* @since 1.0
|
||||||
* @author Jérémi NIHART <j.nihart@student.helmo.be>
|
|
||||||
*/
|
*/
|
||||||
public class StoreProcessor extends Thread implements AutoCloseable {
|
public class StoreProcessor extends Thread implements AutoCloseable {
|
||||||
// Variables
|
// Variables
|
||||||
@ -37,7 +35,7 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
private Context context;
|
private Context context;
|
||||||
private PrintWriter writer;
|
private PrintWriter writer;
|
||||||
private ProtocolWriter.ProtocolResult protocolResult;
|
private ProtocolWriter.ProtocolResult protocolResult;
|
||||||
private ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public StoreProcessor(Socket socket, String domain, StoreProcessorFFE ffe, ProtocolRepository protocolRep) {
|
public StoreProcessor(Socket socket, String domain, StoreProcessorFFE ffe, ProtocolRepository protocolRep) {
|
||||||
@ -95,7 +93,7 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
} catch (IOException writeException) { // Si SBE fermé
|
} catch (IOException writeException) { // Si SBE fermé
|
||||||
System.out.println("STOPPER");
|
System.out.println("STOPPER");
|
||||||
// Envoie au client que la requête n'a pu être traitée
|
// Envoie au client que la requête n'a pu être traitée
|
||||||
alertAvalaible(null);
|
alertAvailable(null);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,14 +108,14 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
this.store.getInputStream()
|
this.store.getInputStream()
|
||||||
);
|
);
|
||||||
|
|
||||||
alertAvalaible(responseResult.getResultCommand());
|
alertAvailable(responseResult.getResultCommand());
|
||||||
} else {
|
} else {
|
||||||
System.out.println("StoreBackEnd result: Commande null");
|
System.out.println("StoreBackEnd result: Commande null");
|
||||||
alertAvalaible(null);
|
alertAvailable(null);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
System.out.println("StoreBackEnd: Commande null");
|
System.out.println("StoreBackEnd: Commande null");
|
||||||
alertAvalaible(null);
|
alertAvailable(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (IOException exception) {
|
} catch (IOException exception) {
|
||||||
@ -139,6 +137,7 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de demander au StoreBackEnd d'effectuer une commande
|
* Permet de demander au StoreBackEnd d'effectuer une commande
|
||||||
|
*
|
||||||
* @param protocolResult La commande à effectuer
|
* @param protocolResult La commande à effectuer
|
||||||
*/
|
*/
|
||||||
public void executeCommand(Context context, ProtocolWriter.ProtocolResult protocolResult) {
|
public void executeCommand(Context context, ProtocolWriter.ProtocolResult protocolResult) {
|
||||||
@ -152,7 +151,7 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
/**
|
/**
|
||||||
* Permet de déclarer le StoreBackEnd disponible
|
* Permet de déclarer le StoreBackEnd disponible
|
||||||
*/
|
*/
|
||||||
private void alertAvalaible(ProtocolWriter.ProtocolResult responseCommand) {
|
private void alertAvailable(ProtocolWriter.ProtocolResult responseCommand) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
this.protocolResult = null;
|
this.protocolResult = null;
|
||||||
if (responseCommand == null) {
|
if (responseCommand == null) {
|
||||||
@ -169,7 +168,9 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
try {
|
try {
|
||||||
this.wait();
|
this.wait();
|
||||||
} catch (InterruptedException e) { e.printStackTrace(); }
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package lightcontainer.enumerations;
|
|||||||
import lightcontainer.domains.Task;
|
import lightcontainer.domains.Task;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enumeration to define the type of a {@link Task}.
|
* enumeration to define the type of {@link Task}.
|
||||||
*/
|
*/
|
||||||
public enum TaskType {
|
public enum TaskType {
|
||||||
SEND,
|
SEND,
|
||||||
|
@ -13,6 +13,7 @@ public interface ClientHandlerFFE {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Demande le traitement d'une commande
|
* Demande le traitement d'une commande
|
||||||
|
*
|
||||||
* @param context Context de la requête
|
* @param context Context de la requête
|
||||||
* @param command Commande à traiter
|
* @param command Commande à traiter
|
||||||
*/
|
*/
|
||||||
|
@ -11,12 +11,14 @@ import lightcontainer.repository.StoreProcessorRepository;
|
|||||||
public interface MulticastSPR {
|
public interface MulticastSPR {
|
||||||
/**
|
/**
|
||||||
* Setter, allow to define the ServerListener of a repository.
|
* Setter, allow to define the ServerListener of a repository.
|
||||||
|
*
|
||||||
* @param server ServerListener to set as default.
|
* @param server ServerListener to set as default.
|
||||||
*/
|
*/
|
||||||
void setServerListener(MulticastServerListener server);
|
void setServerListener(MulticastServerListener server);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a StorePorcessor.
|
* Add a StorePorcessor.
|
||||||
|
*
|
||||||
* @param store Store processor to add.
|
* @param store Store processor to add.
|
||||||
*/
|
*/
|
||||||
boolean addStore(StoreProcessor store);
|
boolean addStore(StoreProcessor store);
|
||||||
@ -36,6 +38,7 @@ public interface MulticastSPR {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de déconnecter un SBE
|
* Permet de déconnecter un SBE
|
||||||
|
*
|
||||||
* @param domain Le domaine du SBE à déconnecter
|
* @param domain Le domaine du SBE à déconnecter
|
||||||
*/
|
*/
|
||||||
void closeStore(String domain);
|
void closeStore(String domain);
|
||||||
|
@ -8,7 +8,7 @@ public interface ProtocolRepository {
|
|||||||
|
|
||||||
<T extends ProtocolReader.ProtocolResult> T executeReader(Context context, String data);
|
<T extends ProtocolReader.ProtocolResult> T executeReader(Context context, String data);
|
||||||
|
|
||||||
<T extends ProtocolWriter.ProtocolResult> T executeWriter(Context context, String cmdName, String... data);
|
<T extends ProtocolWriter.ProtocolResult> T executeWriter(Context context, String cmdName, String... data);
|
||||||
|
|
||||||
void addReader(ProtocolReader reader);
|
void addReader(ProtocolReader reader);
|
||||||
|
|
||||||
|
@ -10,13 +10,15 @@ import lightcontainer.repository.FileFrontEnd;
|
|||||||
public interface StoreProcessorFFE {
|
public interface StoreProcessorFFE {
|
||||||
/**
|
/**
|
||||||
* Allows a {@link StoreProcessor} to notify the FFE that it's available.
|
* Allows a {@link StoreProcessor} to notify the FFE that it's available.
|
||||||
* @param store The store processor that is now available.
|
*
|
||||||
* @param responseCommand
|
* @param store The store processor that is now available.
|
||||||
|
* @param response
|
||||||
*/
|
*/
|
||||||
void onStoreAvailable(StoreProcessor store, ProtocolWriter.ProtocolResult response);
|
void onStoreAvailable(StoreProcessor store, ProtocolWriter.ProtocolResult response);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de déconnecter un SBE
|
* Permet de déconnecter un SBE
|
||||||
|
*
|
||||||
* @param domain Le domaine du SBE à déconnecter
|
* @param domain Le domaine du SBE à déconnecter
|
||||||
*/
|
*/
|
||||||
void onStoreDisconnect(String domain);
|
void onStoreDisconnect(String domain);
|
||||||
|
@ -12,18 +12,21 @@ import lightcontainer.repository.ClientHandlerRepository;
|
|||||||
public interface UnicastCHR {
|
public interface UnicastCHR {
|
||||||
/**
|
/**
|
||||||
* Setter, allow to define the ServerListener of a repository.
|
* Setter, allow to define the ServerListener of a repository.
|
||||||
|
*
|
||||||
* @param server ServerListener to set as default.
|
* @param server ServerListener to set as default.
|
||||||
*/
|
*/
|
||||||
void setServerListener(UnicastServerListener server);
|
void setServerListener(UnicastServerListener server);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a ClientHandler.
|
* Add a ClientHandler.
|
||||||
|
*
|
||||||
* @param client Client Handler to add.
|
* @param client Client Handler to add.
|
||||||
*/
|
*/
|
||||||
void addClient(ClientHandler client);
|
void addClient(ClientHandler client);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de demander la déconnection d'un client
|
* Permet de demander la déconnection d'un client
|
||||||
|
*
|
||||||
* @param client Le client à déconnecter
|
* @param client Le client à déconnecter
|
||||||
*/
|
*/
|
||||||
void disconnect(ClientHandler client);
|
void disconnect(ClientHandler client);
|
||||||
|
@ -95,7 +95,8 @@ public abstract class ProtocolReader {
|
|||||||
*
|
*
|
||||||
* @param reader Buffer rempli du fichier
|
* @param reader Buffer rempli du fichier
|
||||||
*/
|
*/
|
||||||
public void read(InputStream reader) { }
|
public void read(InputStream reader) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de récupérer le context courant
|
* Permet de récupérer le context courant
|
||||||
|
@ -23,6 +23,7 @@ public abstract class ProtocolWriter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de récupérer le nom de la commande.
|
* Permet de récupérer le nom de la commande.
|
||||||
|
*
|
||||||
* @return Nom de la commande.
|
* @return Nom de la commande.
|
||||||
*/
|
*/
|
||||||
public final String getCmdName() {
|
public final String getCmdName() {
|
||||||
@ -50,12 +51,15 @@ public abstract class ProtocolWriter {
|
|||||||
/**
|
/**
|
||||||
* Permet d'écrire un fichier sur le réseau. Cad envoyer le contenu d'un fichier sur le réseau.
|
* Permet d'écrire un fichier sur le réseau. Cad envoyer le contenu d'un fichier sur le réseau.
|
||||||
* Redéfinissez cette méthode pour l'utiliser.
|
* Redéfinissez cette méthode pour l'utiliser.
|
||||||
|
*
|
||||||
* @param writer Buffer à remplir qui sera envoyer via le réseau
|
* @param writer Buffer à remplir qui sera envoyer via le réseau
|
||||||
*/
|
*/
|
||||||
public void write(OutputStream writer) throws IOException {}
|
public void write(OutputStream writer) throws IOException {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accesseur au contexte courant sur lequel opère la commande
|
* Accesseur au contexte courant sur lequel opère la commande
|
||||||
|
*
|
||||||
* @return Context
|
* @return Context
|
||||||
*/
|
*/
|
||||||
public Context getContext() {
|
public Context getContext() {
|
||||||
@ -66,6 +70,7 @@ public abstract class ProtocolWriter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de contruire une commande selon une règle établie.
|
* Permet de contruire une commande selon une règle établie.
|
||||||
|
*
|
||||||
* @param data Les données à ajouter dans la commande; L'ordre défini leur position dans la commande
|
* @param data Les données à ajouter dans la commande; L'ordre défini leur position dans la commande
|
||||||
* @return La commande construites
|
* @return La commande construites
|
||||||
*/
|
*/
|
||||||
@ -74,7 +79,7 @@ public abstract class ProtocolWriter {
|
|||||||
StringBuilder builder = new StringBuilder(this.cmdName);
|
StringBuilder builder = new StringBuilder(this.cmdName);
|
||||||
|
|
||||||
for (String param : data)
|
for (String param : data)
|
||||||
builder.append(" " + param);
|
builder.append(" ").append(param);
|
||||||
|
|
||||||
String command = builder + "\r\n";
|
String command = builder + "\r\n";
|
||||||
Matcher ruleMatcher = this.rulePattern.matcher(command); // Vérifie que tout match (cf. Matcher). Si match alors on retourne la commande build, sinon on retourne NULL
|
Matcher ruleMatcher = this.rulePattern.matcher(command); // Vérifie que tout match (cf. Matcher). Si match alors on retourne la commande build, sinon on retourne NULL
|
||||||
|
@ -69,6 +69,7 @@ public class RemoveFileRule extends ProtocolReader {
|
|||||||
/**
|
/**
|
||||||
* TODO : But futur est de pouvoir en avoir plusieurs
|
* TODO : But futur est de pouvoir en avoir plusieurs
|
||||||
* Cette méthode permet de choisir le domaine voulu.
|
* Cette méthode permet de choisir le domaine voulu.
|
||||||
|
*
|
||||||
* @param storageIterator Les domaines
|
* @param storageIterator Les domaines
|
||||||
* @return Le domain choisi
|
* @return Le domain choisi
|
||||||
*/
|
*/
|
||||||
|
@ -20,8 +20,8 @@ public class RetrieveOkRule extends ProtocolReader {
|
|||||||
private static final int HASHED_FILE_CONTENT = 2; // Index hashed file content
|
private static final int HASHED_FILE_CONTENT = 2; // Index hashed file content
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
private ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
private String storagePath;
|
private final String storagePath;
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
public RetrieveOkRule(ProtocolRepository protocolRep, String storagePath) {
|
public RetrieveOkRule(ProtocolRepository protocolRep, String storagePath) {
|
||||||
@ -32,8 +32,8 @@ public class RetrieveOkRule extends ProtocolReader {
|
|||||||
|
|
||||||
public class Result extends ProtocolResult {
|
public class Result extends ProtocolResult {
|
||||||
// Variables
|
// Variables
|
||||||
private String filename;
|
private final String filename;
|
||||||
private int filesize;
|
private final int filesize;
|
||||||
private String hashedFileContent;
|
private String hashedFileContent;
|
||||||
|
|
||||||
public Result(Context context, String filename, int filesize, String hashedFileContent) {
|
public Result(Context context, String filename, int filesize, String hashedFileContent) {
|
||||||
@ -52,7 +52,6 @@ public class RetrieveOkRule extends ProtocolReader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bitch has bettern than my money
|
|
||||||
* @param reader Buffer rempli du fichier
|
* @param reader Buffer rempli du fichier
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@ -26,8 +26,8 @@ public class SavefileRule extends ProtocolReader {
|
|||||||
private static final int FILE_NAME = 0; // Index file name.
|
private static final int FILE_NAME = 0; // Index file name.
|
||||||
private static final int FILE_SIZE = 1; // Index file size.
|
private static final int FILE_SIZE = 1; // Index file size.
|
||||||
|
|
||||||
private ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
private String storagePath;
|
private final String storagePath;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public SavefileRule(ProtocolRepository protocolRep, String storagePath) {
|
public SavefileRule(ProtocolRepository protocolRep, String storagePath) {
|
||||||
@ -39,7 +39,7 @@ public class SavefileRule extends ProtocolReader {
|
|||||||
public class Result extends ProtocolResult {
|
public class Result extends ProtocolResult {
|
||||||
// Variables
|
// Variables
|
||||||
private String filename;
|
private String filename;
|
||||||
private int size;
|
private final int size;
|
||||||
|
|
||||||
// Construct
|
// Construct
|
||||||
public Result(Context context, String filename, int size) {
|
public Result(Context context, String filename, int size) {
|
||||||
|
@ -14,7 +14,7 @@ public class SendErrorRule extends ProtocolReader {
|
|||||||
|
|
||||||
private static final String NAME = "SEND_ERROR";
|
private static final String NAME = "SEND_ERROR";
|
||||||
|
|
||||||
private ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public SendErrorRule(ProtocolRepository protocolRep) {
|
public SendErrorRule(ProtocolRepository protocolRep) {
|
||||||
|
@ -18,7 +18,7 @@ public class SigninRule extends ProtocolReader {
|
|||||||
private static final int LOGIN = 0; // Index du domain dans le tableau de données
|
private static final int LOGIN = 0; // Index du domain dans le tableau de données
|
||||||
private static final int PASSWORD = 1; // Index du port dans le tableau de données
|
private static final int PASSWORD = 1; // Index du port dans le tableau de données
|
||||||
|
|
||||||
private ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public SigninRule(ProtocolRepository protocolRep) {
|
public SigninRule(ProtocolRepository protocolRep) {
|
||||||
|
@ -16,7 +16,7 @@ public class SignupRule extends ProtocolReader {
|
|||||||
private static final int LOGIN = 0;
|
private static final int LOGIN = 0;
|
||||||
private static final int PASSWORD = 1;
|
private static final int PASSWORD = 1;
|
||||||
|
|
||||||
private ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
|
|
||||||
public SignupRule(ProtocolRepository protocolRep) {
|
public SignupRule(ProtocolRepository protocolRep) {
|
||||||
super(NAME, PATTERN);
|
super(NAME, PATTERN);
|
||||||
|
@ -18,7 +18,7 @@ public class GetFileOkRule extends ProtocolWriter {
|
|||||||
private static final int FILE_SIZE = 1; // Index file size
|
private static final int FILE_SIZE = 1; // Index file size
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
private String storagePath;
|
private final String storagePath;
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
public GetFileOkRule(String storagePath) {
|
public GetFileOkRule(String storagePath) {
|
||||||
@ -28,8 +28,8 @@ public class GetFileOkRule extends ProtocolWriter {
|
|||||||
|
|
||||||
public class Result extends ProtocolWriter.ProtocolResult {
|
public class Result extends ProtocolWriter.ProtocolResult {
|
||||||
// Variables
|
// Variables
|
||||||
private String filename;
|
private final String filename;
|
||||||
private int filesize;
|
private final int filesize;
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
public Result(Context context, String filename, int filesize) {
|
public Result(Context context, String filename, int filesize) {
|
||||||
@ -40,13 +40,14 @@ public class GetFileOkRule extends ProtocolWriter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Oh yeahh baby by tonton EndMove ;-)
|
* Oh yeahh baby by tonton EndMove ;-)
|
||||||
|
*
|
||||||
* @param writer Buffer à remplir qui sera envoyer via le réseau
|
* @param writer Buffer à remplir qui sera envoyer via le réseau
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void write(OutputStream writer) throws IOException {
|
public void write(OutputStream writer) throws IOException {
|
||||||
System.out.printf("Sauvegarde du fichier : %s %d\n", this.filename, this.filesize);
|
System.out.printf("Sauvegarde du fichier : %s %d\n", this.filename, this.filesize);
|
||||||
|
|
||||||
System.out.println("Encrypted size for parsing: " + getContext().getDataInt("encryptedFileSize")+" normal: "+getContext().getDataInt("fileSize"));
|
System.out.println("Encrypted size for parsing: " + getContext().getDataInt("encryptedFileSize") + " normal: " + getContext().getDataInt("fileSize"));
|
||||||
FileSender fileSender = new FileSender(storagePath);
|
FileSender fileSender = new FileSender(storagePath);
|
||||||
fileSender.sendFile(
|
fileSender.sendFile(
|
||||||
getContext().getDataString("hashedFileName"),
|
getContext().getDataString("hashedFileName"),
|
||||||
@ -58,7 +59,8 @@ public class GetFileOkRule extends ProtocolWriter {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
Files.deleteIfExists(Path.of(String.format("%s/%s", storagePath, getContext().getDataString("hashedFileName"))));
|
Files.deleteIfExists(Path.of(String.format("%s/%s", storagePath, getContext().getDataString("hashedFileName"))));
|
||||||
} catch (IOException ignore) { }
|
} catch (IOException ignore) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,8 @@ public class SaveFileOkRule extends ProtocolWriter {
|
|||||||
String hashedFileName = context.getHashedFileName(context.getDataString("fileName"));
|
String hashedFileName = context.getHashedFileName(context.getDataString("fileName"));
|
||||||
try {
|
try {
|
||||||
Files.deleteIfExists(Path.of(String.format("%s/%s", storagePath, hashedFileName)));
|
Files.deleteIfExists(Path.of(String.format("%s/%s", storagePath, hashedFileName)));
|
||||||
} catch (IOException ignore) {}
|
} catch (IOException ignore) {
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ public class SendfileRule extends ProtocolWriter {
|
|||||||
private static final int FILE_SIZE = 1; // Index file size.
|
private static final int FILE_SIZE = 1; // Index file size.
|
||||||
private static final int HASHED_FILE_CONTENT = 2; // Index file content hashed.
|
private static final int HASHED_FILE_CONTENT = 2; // Index file content hashed.
|
||||||
|
|
||||||
private String storagePath;
|
private final String storagePath;
|
||||||
|
|
||||||
public SendfileRule(String storagePath) {
|
public SendfileRule(String storagePath) {
|
||||||
super(NAME, PATTERN);
|
super(NAME, PATTERN);
|
||||||
|
@ -8,18 +8,18 @@ import lightcontainer.protocol.ProtocolWriter;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
// TODO : C'est genre un ClientHandlerManager quoi hein, normal qu'il fasse blinder de chose ;)
|
// TODO : C'est genre un ClientHandlerManager quoi hein, normal qu'il fasse blinder de chose ;)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ClientHandlerRepository
|
* ClientHandlerRepository
|
||||||
*
|
* <p>
|
||||||
* Repository storing ClientHandler class.
|
* Repository storing ClientHandler class.
|
||||||
* Contains some utility functions.
|
* Contains some utility functions.
|
||||||
*
|
*
|
||||||
* @version 1.0
|
* @author Jérémi NIHART <j.nihart@student.helmo.be>
|
||||||
* @since 1.0
|
* @version 1.0
|
||||||
*
|
* @see ClientHandler
|
||||||
* @see ClientHandler
|
* @see AutoCloseable
|
||||||
* @see AutoCloseable
|
* @since 1.0
|
||||||
* @author Jérémi NIHART <j.nihart@student.helmo.be>
|
|
||||||
*/
|
*/
|
||||||
public class ClientHandlerRepository implements AutoCloseable, UnicastCHR {
|
public class ClientHandlerRepository implements AutoCloseable, UnicastCHR {
|
||||||
// Variable
|
// Variable
|
||||||
@ -34,9 +34,9 @@ public class ClientHandlerRepository implements AutoCloseable, UnicastCHR {
|
|||||||
/**
|
/**
|
||||||
* Setter, allow to define the ServerListener of a repository.
|
* Setter, allow to define the ServerListener of a repository.
|
||||||
* & Start the server.
|
* & Start the server.
|
||||||
* @param server ServerListener to set as default.
|
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @param server ServerListener to set as default.
|
||||||
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setServerListener(UnicastServerListener server) {
|
public void setServerListener(UnicastServerListener server) {
|
||||||
@ -46,9 +46,9 @@ public class ClientHandlerRepository implements AutoCloseable, UnicastCHR {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a ClientHandler.
|
* Add a ClientHandler.
|
||||||
* @param client Client Handler to add.
|
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @param client Client Handler to add.
|
||||||
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addClient(ClientHandler client) {
|
public void addClient(ClientHandler client) {
|
||||||
@ -75,7 +75,7 @@ public class ClientHandlerRepository implements AutoCloseable, UnicastCHR {
|
|||||||
* AutoClosable Function
|
* AutoClosable Function
|
||||||
* Closes all ClientHandlers stored in this repository and deallocates all resources.
|
* Closes all ClientHandlers stored in this repository and deallocates all resources.
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
|
@ -16,8 +16,8 @@ import java.util.concurrent.ConcurrentLinkedDeque;
|
|||||||
public class FileFrontEnd implements ClientHandlerFFE, StoreProcessorFFE {
|
public class FileFrontEnd implements ClientHandlerFFE, StoreProcessorFFE {
|
||||||
// Variables
|
// Variables
|
||||||
private Deque<Task> tasks = new ConcurrentLinkedDeque<>();
|
private Deque<Task> tasks = new ConcurrentLinkedDeque<>();
|
||||||
private ClientHandlerRepository clientRepository; // TODO -> pourquoi pas une interface ? end
|
private final ClientHandlerRepository clientRepository; // TODO -> pourquoi pas une interface ? end
|
||||||
private StoreProcessorRepository storeRepository; // TODO -> pourquoi pas une interface ? end
|
private final StoreProcessorRepository storeRepository; // TODO -> pourquoi pas une interface ? end
|
||||||
private ProtocolRepository protocolRepository;
|
private ProtocolRepository protocolRepository;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
|
@ -9,17 +9,17 @@ import java.util.HashSet;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
// TODO : C'est genre un ClientHandlerManager quoi hein, normal qu'il fasse blinder de chose ;)
|
// TODO : C'est genre un ClientHandlerManager quoi hein, normal qu'il fasse blinder de chose ;)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* StoreProcessorRepository
|
* StoreProcessorRepository
|
||||||
*
|
* <p>
|
||||||
* Repository storing StorePorcessor class.
|
* Repository storing StorePorcessor class.
|
||||||
* Contains some utility functions.
|
* Contains some utility functions.
|
||||||
*
|
*
|
||||||
* @version 1.0
|
* @author Jérémi NIHART <j.nihart@student.helmo.be>
|
||||||
* @since 1.0
|
* @version 1.0
|
||||||
*
|
* @see StoreProcessor
|
||||||
* @see StoreProcessor
|
* @since 1.0
|
||||||
* @author Jérémi NIHART <j.nihart@student.helmo.be>
|
|
||||||
*/
|
*/
|
||||||
public class StoreProcessorRepository implements AutoCloseable, MulticastSPR {
|
public class StoreProcessorRepository implements AutoCloseable, MulticastSPR {
|
||||||
// Variables
|
// Variables
|
||||||
@ -34,9 +34,9 @@ public class StoreProcessorRepository implements AutoCloseable, MulticastSPR {
|
|||||||
/**
|
/**
|
||||||
* Setter, allow to define the ServerListener of a repository.
|
* Setter, allow to define the ServerListener of a repository.
|
||||||
* & start the server.
|
* & start the server.
|
||||||
* @param server ServerListener to set as default.
|
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @param server ServerListener to set as default.
|
||||||
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setServerListener(MulticastServerListener server) {
|
public void setServerListener(MulticastServerListener server) {
|
||||||
@ -46,9 +46,9 @@ public class StoreProcessorRepository implements AutoCloseable, MulticastSPR {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a StorePorcessor.
|
* Add a StorePorcessor.
|
||||||
* @param store Store processor to add.
|
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @param store Store processor to add.
|
||||||
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean addStore(StoreProcessor store) {
|
public boolean addStore(StoreProcessor store) {
|
||||||
@ -129,7 +129,7 @@ public class StoreProcessorRepository implements AutoCloseable, MulticastSPR {
|
|||||||
* AutoClosable Function
|
* AutoClosable Function
|
||||||
* Closes all StoreProcessor stored in this repository and deallocates all resources.
|
* Closes all StoreProcessor stored in this repository and deallocates all resources.
|
||||||
*
|
*
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
|
@ -90,6 +90,7 @@ public class AppConfig {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Méthode permettant de récupérer le chemin de sauvegarde des fichiers
|
* Méthode permettant de récupérer le chemin de sauvegarde des fichiers
|
||||||
|
*
|
||||||
* @return Chemin de sauvegarde
|
* @return Chemin de sauvegarde
|
||||||
*/
|
*/
|
||||||
public String getStoragePath() {
|
public String getStoragePath() {
|
||||||
|
@ -11,10 +11,9 @@ import java.util.Base64;
|
|||||||
/**
|
/**
|
||||||
* AES GCM 256 Encryption Class [DO NOT EDIT]
|
* AES GCM 256 Encryption Class [DO NOT EDIT]
|
||||||
*
|
*
|
||||||
* @since 1.0
|
|
||||||
* @version 1.0
|
|
||||||
*
|
|
||||||
* @author Jérémi Nihart <contact@endmove.eu>
|
* @author Jérémi Nihart <contact@endmove.eu>
|
||||||
|
* @version 1.0
|
||||||
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
public class AES_GCM {
|
public class AES_GCM {
|
||||||
// Constants
|
// Constants
|
||||||
@ -23,8 +22,7 @@ public class AES_GCM {
|
|||||||
public static final int GCM_TAG_LENGTH = 16;
|
public static final int GCM_TAG_LENGTH = 16;
|
||||||
|
|
||||||
// Main method for testing
|
// Main method for testing
|
||||||
public static void main(String[] args) throws Exception
|
public static void main(String[] args) throws Exception {
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
* FILE ENCRYPTION DEMO
|
* FILE ENCRYPTION DEMO
|
||||||
*/
|
*/
|
||||||
@ -38,20 +36,20 @@ public class AES_GCM {
|
|||||||
String IVFile = generateIV();
|
String IVFile = generateIV();
|
||||||
String keyFile = generateSecretKey();
|
String keyFile = generateSecretKey();
|
||||||
// Show options
|
// Show options
|
||||||
System.out.println("IV : "+IVFile);
|
System.out.println("IV : " + IVFile);
|
||||||
System.out.println("Key : "+keyFile);
|
System.out.println("Key : " + keyFile);
|
||||||
// Encrypt
|
// Encrypt
|
||||||
encryptStream(
|
encryptStream(
|
||||||
new FileInputStream(inFile),
|
new FileInputStream(inFile),
|
||||||
new FileOutputStream(outFile),
|
new FileOutputStream(outFile),
|
||||||
inFile.length(),
|
inFile.length(),
|
||||||
IVFile,
|
IVFile,
|
||||||
keyFile
|
keyFile
|
||||||
);
|
);
|
||||||
// Decrypt
|
// Decrypt
|
||||||
decryptStream(
|
decryptStream(
|
||||||
new FileInputStream(outFile),
|
new FileInputStream(outFile),
|
||||||
new FileOutputStream(clearFile),
|
new FileOutputStream(clearFile),
|
||||||
outFile.length(),
|
outFile.length(),
|
||||||
IVFile,
|
IVFile,
|
||||||
keyFile
|
keyFile
|
||||||
@ -65,8 +63,8 @@ public class AES_GCM {
|
|||||||
String IV = generateIV();
|
String IV = generateIV();
|
||||||
String key = generateSecretKey();
|
String key = generateSecretKey();
|
||||||
// Show options
|
// Show options
|
||||||
System.out.println("IV : "+IV);
|
System.out.println("IV : " + IV);
|
||||||
System.out.println("Key : "+key);
|
System.out.println("Key : " + key);
|
||||||
System.out.println("Original text : " + plainText);
|
System.out.println("Original text : " + plainText);
|
||||||
// Crypt
|
// Crypt
|
||||||
String cryptText = encrypt(plainText, key, IV);
|
String cryptText = encrypt(plainText, key, IV);
|
||||||
@ -79,8 +77,8 @@ public class AES_GCM {
|
|||||||
/**
|
/**
|
||||||
* Decoder to decode base64 vector to byte vector.
|
* Decoder to decode base64 vector to byte vector.
|
||||||
*
|
*
|
||||||
* @param base64Vector A base64 encoded vector.
|
* @param base64Vector A base64 encoded vector.
|
||||||
* @return Byte vector.
|
* @return Byte vector.
|
||||||
*/
|
*/
|
||||||
private static byte[] decodeBase64Vector(String base64Vector) {
|
private static byte[] decodeBase64Vector(String base64Vector) {
|
||||||
Base64.Decoder b64Decoder = Base64.getDecoder();
|
Base64.Decoder b64Decoder = Base64.getDecoder();
|
||||||
@ -90,10 +88,9 @@ public class AES_GCM {
|
|||||||
/**
|
/**
|
||||||
* Decoder to decode base64 string to plain string.
|
* Decoder to decode base64 string to plain string.
|
||||||
*
|
*
|
||||||
* @param base64String A base64 encoded string.
|
* @param base64String A base64 encoded string.
|
||||||
* @return Plain string.
|
* @return Plain string.
|
||||||
*
|
* @see AES_GCM#decodeBase64Vector(String)
|
||||||
* @see AES_GCM#decodeBase64Vector(String)
|
|
||||||
*/
|
*/
|
||||||
private static String decodeBase64String(String base64String) {
|
private static String decodeBase64String(String base64String) {
|
||||||
return new String(decodeBase64Vector(base64String));
|
return new String(decodeBase64Vector(base64String));
|
||||||
@ -101,8 +98,9 @@ public class AES_GCM {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Encoder to encode vector to base64 string.
|
* Encoder to encode vector to base64 string.
|
||||||
* @param rawVector A raw vector.
|
*
|
||||||
* @return A base64 encoded vector.
|
* @param rawVector A raw vector.
|
||||||
|
* @return A base64 encoded vector.
|
||||||
*/
|
*/
|
||||||
private static String encodeBase64(byte[] rawVector) {
|
private static String encodeBase64(byte[] rawVector) {
|
||||||
Base64.Encoder b64Encoder = Base64.getEncoder();
|
Base64.Encoder b64Encoder = Base64.getEncoder();
|
||||||
@ -111,10 +109,10 @@ public class AES_GCM {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Encoder to encode string to base64 string.
|
* Encoder to encode string to base64 string.
|
||||||
* @param rawString A raw string.
|
|
||||||
* @return A base64 encoded string.
|
|
||||||
*
|
*
|
||||||
* @see AES_GCM#encodeBase64(byte[]))
|
* @param rawString A raw string.
|
||||||
|
* @return A base64 encoded string.
|
||||||
|
* @see AES_GCM#encodeBase64(byte[]))
|
||||||
*/
|
*/
|
||||||
private static String encodeBase64(String rawString) {
|
private static String encodeBase64(String rawString) {
|
||||||
return encodeBase64(rawString.getBytes(StandardCharsets.UTF_8));
|
return encodeBase64(rawString.getBytes(StandardCharsets.UTF_8));
|
||||||
@ -123,14 +121,12 @@ public class AES_GCM {
|
|||||||
/**
|
/**
|
||||||
* FACTORY, to setting up a Java cryptographic cypher.
|
* FACTORY, to setting up a Java cryptographic cypher.
|
||||||
*
|
*
|
||||||
* @param op_mode the operation mode of this cipher (this is one of the
|
* @param op_mode the operation mode of this cipher (this is one of the
|
||||||
* following: ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE or UNWRAP_MODE)
|
* following: ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE or UNWRAP_MODE)
|
||||||
* @param key Base64 encoded secret key.
|
* @param key Base64 encoded secret key.
|
||||||
* @param IV Base64 encoded vector.
|
* @param IV Base64 encoded vector.
|
||||||
*
|
* @return A Cryptography cypher.
|
||||||
* @return A Cryptography cypher.
|
* @throws AesGcmException Throw an exception in case of an error occur while setting up the the cypher.
|
||||||
*
|
|
||||||
* @throws AesGcmException Throw an exception in case of an error occur while setting up the the cypher.
|
|
||||||
*/
|
*/
|
||||||
private static Cipher createCipher(int op_mode, String key, String IV) throws AesGcmException {
|
private static Cipher createCipher(int op_mode, String key, String IV) throws AesGcmException {
|
||||||
try {
|
try {
|
||||||
@ -151,9 +147,8 @@ public class AES_GCM {
|
|||||||
/**
|
/**
|
||||||
* Generate a secret key base64 encoded.
|
* Generate a secret key base64 encoded.
|
||||||
*
|
*
|
||||||
* @return New Secret key b64 encoded.
|
* @return New Secret key b64 encoded.
|
||||||
*
|
* @throws AesGcmException Exception if an error occur.
|
||||||
* @throws AesGcmException Exception if an error occur.
|
|
||||||
*/
|
*/
|
||||||
public static String generateSecretKey() throws AesGcmException {
|
public static String generateSecretKey() throws AesGcmException {
|
||||||
try {
|
try {
|
||||||
@ -169,7 +164,7 @@ public class AES_GCM {
|
|||||||
/**
|
/**
|
||||||
* Generate an IV (initialisation vector) base64 encoded.
|
* Generate an IV (initialisation vector) base64 encoded.
|
||||||
*
|
*
|
||||||
* @return New generated IV b64 encoded.
|
* @return New generated IV b64 encoded.
|
||||||
*/
|
*/
|
||||||
public static String generateIV() {
|
public static String generateIV() {
|
||||||
byte[] IV = new byte[GCM_IV_LENGTH];
|
byte[] IV = new byte[GCM_IV_LENGTH];
|
||||||
@ -181,13 +176,11 @@ public class AES_GCM {
|
|||||||
/**
|
/**
|
||||||
* Encrypt text, with AES GCM.
|
* Encrypt text, with AES GCM.
|
||||||
*
|
*
|
||||||
* @param plainText Plain text to encrypt.
|
* @param plainText Plain text to encrypt.
|
||||||
* @param key Base64 encoded secret key.
|
* @param key Base64 encoded secret key.
|
||||||
* @param IV Base64 encoded vector.
|
* @param IV Base64 encoded vector.
|
||||||
*
|
* @return The encrypted plain text Base64 encoded.
|
||||||
* @return The encrypted plain text Base64 encoded.
|
* @throws AesGcmException Exception if an error occur.
|
||||||
*
|
|
||||||
* @throws AesGcmException Exception if an error occur.
|
|
||||||
*/
|
*/
|
||||||
public static String encrypt(String plainText, String key, String IV) throws AesGcmException {
|
public static String encrypt(String plainText, String key, String IV) throws AesGcmException {
|
||||||
try {
|
try {
|
||||||
@ -204,13 +197,12 @@ public class AES_GCM {
|
|||||||
* Encrypt stream, with AES GCM.
|
* Encrypt stream, with AES GCM.
|
||||||
* The output stream is automatically closed after processing.
|
* The output stream is automatically closed after processing.
|
||||||
*
|
*
|
||||||
* @param in InputStream to the input, flux to encrypt.
|
* @param in InputStream to the input, flux to encrypt.
|
||||||
* @param out OutputStream to the output, encrypted flux.
|
* @param out OutputStream to the output, encrypted flux.
|
||||||
* @param fileSize Stream/file size (! unencrypted size !).
|
* @param fileSize Stream/file size (! unencrypted size !).
|
||||||
* @param key Base64 encoded secret key.
|
* @param key Base64 encoded secret key.
|
||||||
* @param IV Base64 encoded vector.
|
* @param IV Base64 encoded vector.
|
||||||
*
|
* @throws AesGcmException Exception if an error occur.
|
||||||
* @throws AesGcmException Exception if an error occur.
|
|
||||||
*/
|
*/
|
||||||
public static void encryptStream(InputStream in, OutputStream out, long fileSize, String key, String IV) throws AesGcmException {
|
public static void encryptStream(InputStream in, OutputStream out, long fileSize, String key, String IV) throws AesGcmException {
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
@ -222,7 +214,7 @@ public class AES_GCM {
|
|||||||
// Initialize a CipherOutputStream
|
// Initialize a CipherOutputStream
|
||||||
CipherOutputStream cipherOut = new CipherOutputStream(out, cipher);
|
CipherOutputStream cipherOut = new CipherOutputStream(out, cipher);
|
||||||
// Encryption Process
|
// Encryption Process
|
||||||
while((currentSize < fileSize) && (bytes = in.read(buffer)) > 0) {
|
while ((currentSize < fileSize) && (bytes = in.read(buffer)) > 0) {
|
||||||
cipherOut.write(buffer, 0, bytes);
|
cipherOut.write(buffer, 0, bytes);
|
||||||
cipherOut.flush();
|
cipherOut.flush();
|
||||||
currentSize += bytes;
|
currentSize += bytes;
|
||||||
@ -237,13 +229,11 @@ public class AES_GCM {
|
|||||||
/**
|
/**
|
||||||
* Decrypt, with AES GCM.
|
* Decrypt, with AES GCM.
|
||||||
*
|
*
|
||||||
* @param cryptText The encrypted text.
|
* @param cryptText The encrypted text.
|
||||||
* @param key Base64 encoded secret key.
|
* @param key Base64 encoded secret key.
|
||||||
* @param IV Base64 encoded vector.
|
* @param IV Base64 encoded vector.
|
||||||
*
|
* @return The decrypted plain text.
|
||||||
* @return The decrypted plain text.
|
* @throws AesGcmException Exception if an error occur.
|
||||||
*
|
|
||||||
* @throws AesGcmException Exception if an error occur.
|
|
||||||
*/
|
*/
|
||||||
public static String decrypt(String cryptText, String key, String IV) throws AesGcmException {
|
public static String decrypt(String cryptText, String key, String IV) throws AesGcmException {
|
||||||
try {
|
try {
|
||||||
@ -260,13 +250,12 @@ public class AES_GCM {
|
|||||||
* Decrypt stream, with AES GCM.
|
* Decrypt stream, with AES GCM.
|
||||||
* The input stream is automatically closed after processing.
|
* The input stream is automatically closed after processing.
|
||||||
*
|
*
|
||||||
* @param in InputStream to the input, flux to decrypt.
|
* @param in InputStream to the input, flux to decrypt.
|
||||||
* @param out OutputStream to the output, decrypted flux.
|
* @param out OutputStream to the output, decrypted flux.
|
||||||
* @param fileSize Stream/file size (! encrypted size !).
|
* @param fileSize Stream/file size (! encrypted size !).
|
||||||
* @param key Base64 encoded secret key.
|
* @param key Base64 encoded secret key.
|
||||||
* @param IV Base64 encoded vector.
|
* @param IV Base64 encoded vector.
|
||||||
*
|
* @throws AesGcmException Exception if an error occur.
|
||||||
* @throws AesGcmException Exception if an error occur.
|
|
||||||
*/
|
*/
|
||||||
public static void decryptStream(InputStream in, OutputStream out, long fileSize, String key, String IV) throws AesGcmException {
|
public static void decryptStream(InputStream in, OutputStream out, long fileSize, String key, String IV) throws AesGcmException {
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
@ -278,7 +267,7 @@ public class AES_GCM {
|
|||||||
// Initialize a CipherOutputStream
|
// Initialize a CipherOutputStream
|
||||||
CipherInputStream cipherIn = new CipherInputStream(in, cipher);
|
CipherInputStream cipherIn = new CipherInputStream(in, cipher);
|
||||||
// Encryption Process
|
// Encryption Process
|
||||||
while((currentSize < fileSize) && (bytes = cipherIn.read(buffer)) > 0) {
|
while ((currentSize < fileSize) && (bytes = cipherIn.read(buffer)) > 0) {
|
||||||
out.write(buffer, 0, bytes);
|
out.write(buffer, 0, bytes);
|
||||||
out.flush();
|
out.flush();
|
||||||
currentSize += bytes;
|
currentSize += bytes;
|
||||||
@ -301,7 +290,7 @@ public class AES_GCM {
|
|||||||
* Constructor of AesGcmException,
|
* Constructor of AesGcmException,
|
||||||
* which define it's own detail message.
|
* which define it's own detail message.
|
||||||
*
|
*
|
||||||
* @param msg The detail message.
|
* @param msg The detail message.
|
||||||
*/
|
*/
|
||||||
public AesGcmException(String msg) {
|
public AesGcmException(String msg) {
|
||||||
super(msg);
|
super(msg);
|
||||||
@ -312,7 +301,7 @@ public class AES_GCM {
|
|||||||
* which propagates the error triggering
|
* which propagates the error triggering
|
||||||
* a crash of the encryption system.
|
* a crash of the encryption system.
|
||||||
*
|
*
|
||||||
* @param e Previous exception throwable.
|
* @param e Previous exception throwable.
|
||||||
*/
|
*/
|
||||||
public AesGcmException(Throwable e) {
|
public AesGcmException(Throwable e) {
|
||||||
super(e);
|
super(e);
|
||||||
@ -324,8 +313,8 @@ public class AES_GCM {
|
|||||||
* a crash of the encryption system with
|
* a crash of the encryption system with
|
||||||
* a chosen detail message.
|
* a chosen detail message.
|
||||||
*
|
*
|
||||||
* @param e Previous exception throwable.
|
* @param e Previous exception throwable.
|
||||||
* @param msg The detail message.
|
* @param msg The detail message.
|
||||||
*/
|
*/
|
||||||
public AesGcmException(GeneralSecurityException e, String msg) {
|
public AesGcmException(GeneralSecurityException e, String msg) {
|
||||||
super(msg, e);
|
super(msg, e);
|
||||||
|
@ -3,9 +3,11 @@ package lightcontainer.utils;
|
|||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
public class FileReceiver {
|
public class FileReceiver {
|
||||||
private String path;
|
private final String path;
|
||||||
|
|
||||||
public FileReceiver(String path) { this.path = path; }
|
public FileReceiver(String path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
public int receiveFile(InputStream input, String fileName, int fileSize, String key, String iv) {
|
public int receiveFile(InputStream input, String fileName, int fileSize, String key, String iv) {
|
||||||
try {
|
try {
|
||||||
@ -16,8 +18,8 @@ public class FileReceiver {
|
|||||||
AES_GCM.encryptStream(input, bufferedStream, fileSize, key, iv);
|
AES_GCM.encryptStream(input, bufferedStream, fileSize, key, iv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (int)file.length(); // TODO change the size to LONG
|
return (int) file.length(); // TODO change the size to LONG
|
||||||
} catch(IOException | AES_GCM.AesGcmException ex) {
|
} catch (IOException | AES_GCM.AesGcmException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -32,7 +34,7 @@ public class FileReceiver {
|
|||||||
bosFile = new BufferedOutputStream(new FileOutputStream(String.format("%s/%s", path, fileName)));
|
bosFile = new BufferedOutputStream(new FileOutputStream(String.format("%s/%s", path, fileName)));
|
||||||
long currentOffset = 0;
|
long currentOffset = 0;
|
||||||
|
|
||||||
while((currentOffset < fileSize) && ((bytesReceived = input.read(buffer)) > 0)) {
|
while ((currentOffset < fileSize) && ((bytesReceived = input.read(buffer)) > 0)) {
|
||||||
bosFile.write(buffer, 0, bytesReceived);
|
bosFile.write(buffer, 0, bytesReceived);
|
||||||
currentOffset += bytesReceived;
|
currentOffset += bytesReceived;
|
||||||
}
|
}
|
||||||
@ -40,9 +42,14 @@ public class FileReceiver {
|
|||||||
bosFile.close();
|
bosFile.close();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} catch(Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
if(bosFile != null) { try { bosFile.close(); } catch(Exception e) {} }
|
if (bosFile != null) {
|
||||||
|
try {
|
||||||
|
bosFile.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,23 +3,25 @@ package lightcontainer.utils;
|
|||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
public class FileSender {
|
public class FileSender {
|
||||||
private static final int DEFAULT_BUFFER=8000;
|
private static final int DEFAULT_BUFFER = 8000;
|
||||||
private final String path;
|
private final String path;
|
||||||
|
|
||||||
public FileSender(String path) { this.path = path; }
|
public FileSender(String path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean sendFile(String filename, OutputStream out, int fileSize, String aesKey, String iv) throws IOException {
|
public boolean sendFile(String filename, OutputStream out, int fileSize, String aesKey, String iv) throws IOException {
|
||||||
BufferedInputStream bisFile;
|
BufferedInputStream bisFile;
|
||||||
System.out.printf("Envoie fichier : %s - %s - %s \n", filename, aesKey, iv);
|
System.out.printf("Envoie fichier : %s - %s - %s \n", filename, aesKey, iv);
|
||||||
try {
|
try {
|
||||||
File f = new File(String.format("%s/%s", path, filename));
|
File f = new File(String.format("%s/%s", path, filename));
|
||||||
if(f.exists()) {
|
if (f.exists()) {
|
||||||
bisFile = new BufferedInputStream(new FileInputStream(f));
|
bisFile = new BufferedInputStream(new FileInputStream(f));
|
||||||
AES_GCM.decryptStream(bisFile, out, fileSize, aesKey, iv);
|
AES_GCM.decryptStream(bisFile, out, fileSize, aesKey, iv);
|
||||||
return true;
|
return true;
|
||||||
} else
|
} else
|
||||||
return false;
|
return false;
|
||||||
} catch(IOException | AES_GCM.AesGcmException ex) {
|
} catch (IOException | AES_GCM.AesGcmException ex) {
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -30,19 +32,20 @@ public class FileSender {
|
|||||||
try {
|
try {
|
||||||
File file = new File(String.format("%s/%s", path, filename));
|
File file = new File(String.format("%s/%s", path, filename));
|
||||||
long fileSize = file.length();
|
long fileSize = file.length();
|
||||||
if(file.exists()) {
|
if (file.exists()) {
|
||||||
byte[] buffer = new byte[DEFAULT_BUFFER];
|
byte[] buffer = new byte[DEFAULT_BUFFER];
|
||||||
bisFile = new BufferedInputStream(new FileInputStream(file));
|
bisFile = new BufferedInputStream(new FileInputStream(file));
|
||||||
long currentOffset = 0;
|
long currentOffset = 0;
|
||||||
while((currentOffset < fileSize) && (bytesReaded = bisFile.read(buffer)) > 0) {
|
while ((currentOffset < fileSize) && (bytesReaded = bisFile.read(buffer)) > 0) {
|
||||||
out.write(buffer, 0, bytesReaded); out.flush();
|
out.write(buffer, 0, bytesReaded);
|
||||||
currentOffset+= bytesReaded;
|
out.flush();
|
||||||
|
currentOffset += bytesReaded;
|
||||||
}
|
}
|
||||||
bisFile.close();
|
bisFile.close();
|
||||||
return true;
|
return true;
|
||||||
} else
|
} else
|
||||||
return false;
|
return false;
|
||||||
} catch(IOException ex) {// todo change
|
} catch (IOException ex) {// todo change
|
||||||
throw ex;
|
throw ex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ public class NetChooser {
|
|||||||
public NetworkInterface requestInterface() {
|
public NetworkInterface requestInterface() {
|
||||||
Scanner console = new Scanner(System.in);
|
Scanner console = new Scanner(System.in);
|
||||||
String[] allInterfaceNames = getInterfaces();
|
String[] allInterfaceNames = getInterfaces();
|
||||||
for(int index=0; index < allInterfaceNames.length; ++index) {
|
for (int index = 0; index < allInterfaceNames.length; ++index) {
|
||||||
System.out.printf("%d. %s\n", index, allInterfaceNames[index]);
|
System.out.printf("%d. %s\n", index, allInterfaceNames[index]);
|
||||||
}
|
}
|
||||||
System.out.printf("Select your interface :");
|
System.out.printf("Select your interface :");
|
||||||
@ -35,28 +35,28 @@ public class NetChooser {
|
|||||||
NetworkInterface currentInterface = discoveredInterfaces.nextElement();
|
NetworkInterface currentInterface = discoveredInterfaces.nextElement();
|
||||||
Enumeration<InetAddress> inetAddresses = currentInterface.getInetAddresses();
|
Enumeration<InetAddress> inetAddresses = currentInterface.getInetAddresses();
|
||||||
int ipCount = 0;
|
int ipCount = 0;
|
||||||
while(inetAddresses.hasMoreElements()) {
|
while (inetAddresses.hasMoreElements()) {
|
||||||
InetAddress currentAddress = inetAddresses.nextElement();
|
InetAddress currentAddress = inetAddresses.nextElement();
|
||||||
ipCount++;
|
ipCount++;
|
||||||
}
|
}
|
||||||
if(ipCount > 0)
|
if (ipCount > 0)
|
||||||
interfaces.add(currentInterface);
|
interfaces.add(currentInterface);
|
||||||
}
|
}
|
||||||
} catch(SocketException ex) {
|
} catch (SocketException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public NetworkInterface getInterfacesByIndex(int i) {
|
public NetworkInterface getInterfacesByIndex(int i) {
|
||||||
if(i >= 0)
|
if (i >= 0)
|
||||||
return interfaces.get(i);
|
return interfaces.get(i);
|
||||||
else
|
else
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] getInterfaces() {
|
public String[] getInterfaces() {
|
||||||
if(interfaces.size() > 0) {
|
if (interfaces.size() > 0) {
|
||||||
String[] result = new String[interfaces.size()];
|
String[] result = new String[interfaces.size()];
|
||||||
for (int i = 0; i < interfaces.size(); ++i) {
|
for (int i = 0; i < interfaces.size(); ++i) {
|
||||||
result[i] = interfaces.get(i).getDisplayName() + " --> " + interfaces.get(i).getName();
|
result[i] = interfaces.get(i).getDisplayName() + " --> " + interfaces.get(i).getName();
|
||||||
|
@ -13,10 +13,9 @@ import java.util.Base64;
|
|||||||
/**
|
/**
|
||||||
* SHA 256 Hashing and borrowing Class [DO NOT EDIT]
|
* SHA 256 Hashing and borrowing Class [DO NOT EDIT]
|
||||||
*
|
*
|
||||||
* @since 1.0
|
|
||||||
* @version 1.0
|
|
||||||
*
|
|
||||||
* @author Jérémi Nihart <contact@endmove.eu>
|
* @author Jérémi Nihart <contact@endmove.eu>
|
||||||
|
* @version 1.0
|
||||||
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
public class SHA {
|
public class SHA {
|
||||||
// Constants
|
// Constants
|
||||||
@ -42,12 +41,10 @@ public class SHA {
|
|||||||
/**
|
/**
|
||||||
* Make a borrowing of the stream.
|
* Make a borrowing of the stream.
|
||||||
*
|
*
|
||||||
* @param in InputStream to the input, flux to hash.
|
* @param in InputStream to the input, flux to hash.
|
||||||
* @param fileSize Stream/file size.
|
* @param fileSize Stream/file size.
|
||||||
*
|
* @return Borrowing of the full current flux.
|
||||||
* @return Borrowing of the full current flux.
|
* @throws ShaException if an error occur.
|
||||||
*
|
|
||||||
* @throws ShaException if an error occur.
|
|
||||||
*/
|
*/
|
||||||
public static String hashStream(InputStream in, long fileSize) throws ShaException {
|
public static String hashStream(InputStream in, long fileSize) throws ShaException {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
@ -58,7 +55,7 @@ public class SHA {
|
|||||||
// Init Digest algo
|
// Init Digest algo
|
||||||
MessageDigest digest = MessageDigest.getInstance(SHA_VERSION);
|
MessageDigest digest = MessageDigest.getInstance(SHA_VERSION);
|
||||||
// Process flux
|
// Process flux
|
||||||
while ((currentSize < fileSize) && (bytes=in.read(buffer)) > 0) {
|
while ((currentSize < fileSize) && (bytes = in.read(buffer)) > 0) {
|
||||||
digest.update(buffer, 0, bytes);
|
digest.update(buffer, 0, bytes);
|
||||||
currentSize += bytes;
|
currentSize += bytes;
|
||||||
}
|
}
|
||||||
@ -77,12 +74,10 @@ public class SHA {
|
|||||||
/**
|
/**
|
||||||
* Make a borrowing of the file.
|
* Make a borrowing of the file.
|
||||||
*
|
*
|
||||||
* @param rootPath Root path of the file.
|
* @param rootPath Root path of the file.
|
||||||
* @param fileName File Name.
|
* @param fileName File Name.
|
||||||
*
|
* @return Borrowing of the file.
|
||||||
* @return Borrowing of the file.
|
* @throws ShaException if an error occur.
|
||||||
*
|
|
||||||
* @throws ShaException if an error occur.
|
|
||||||
*/
|
*/
|
||||||
public static String hashFile(String rootPath, String fileName) throws ShaException {
|
public static String hashFile(String rootPath, String fileName) throws ShaException {
|
||||||
try {
|
try {
|
||||||
@ -109,7 +104,7 @@ public class SHA {
|
|||||||
* which propagates the error triggering
|
* which propagates the error triggering
|
||||||
* a crash of the hash system.
|
* a crash of the hash system.
|
||||||
*
|
*
|
||||||
* @param e Previous exception throwable.
|
* @param e Previous exception throwable.
|
||||||
*/
|
*/
|
||||||
public ShaException(Throwable e) {
|
public ShaException(Throwable e) {
|
||||||
super(e);
|
super(e);
|
||||||
|
Loading…
Reference in New Issue
Block a user