- Ajout système de Context dans les ProtocolWriter.java
- Ajout récupération Clé AES via Context.java - Ajout cryptage lors de l'envoie du fichier
This commit is contained in:
parent
02d9d30985
commit
5fe63fa3ea
@ -45,7 +45,7 @@ public class App {
|
|||||||
protocolRep.addWriter(new FilesRule());
|
protocolRep.addWriter(new FilesRule());
|
||||||
protocolRep.addWriter(new SaveFileOkRule());
|
protocolRep.addWriter(new SaveFileOkRule());
|
||||||
protocolRep.addWriter(new SaveFileErrorRule());
|
protocolRep.addWriter(new SaveFileErrorRule());
|
||||||
protocolRep.addWriter(new SendfileRule());
|
protocolRep.addWriter(new SendfileRule(repositoryStorage.getStoragePath()));
|
||||||
|
|
||||||
FileFrontEnd ffe = new FileFrontEnd(clientRep, storeRep, protocolRep);
|
FileFrontEnd ffe = new FileFrontEnd(clientRep, storeRep, protocolRep);
|
||||||
new UnicastServerListener(ffe, clientRep, protocolRep, repositoryStorage, repositoryStorage.getUnicastPort());
|
new UnicastServerListener(ffe, clientRep, protocolRep, repositoryStorage, repositoryStorage.getUnicastPort());
|
||||||
|
@ -174,7 +174,7 @@ public class ClientHandler implements Runnable, AutoCloseable {
|
|||||||
* Lorsque l'accès à été refusé.
|
* Lorsque l'accès à été refusé.
|
||||||
*/
|
*/
|
||||||
private void accessDenied() {
|
private void accessDenied() {
|
||||||
ProtocolWriter.ProtocolResult signErrorResult = protocolRep.executeWriter(SignErrorRule.NAME);
|
ProtocolWriter.ProtocolResult signErrorResult = protocolRep.executeWriter(context, SignErrorRule.NAME);
|
||||||
writer.write(signErrorResult.getCommand()); // Envoie SignError car echec de la connection
|
writer.write(signErrorResult.getCommand()); // Envoie SignError car echec de la connection
|
||||||
writer.flush();
|
writer.flush();
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,8 @@ public class Context {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de créer un utilisateur.
|
* Permet de créer un utilisateur.
|
||||||
* @param login Login de l'utilisateur
|
*
|
||||||
|
* @param login Login de l'utilisateur
|
||||||
* @param password Mot de passe de l'utilisateur
|
* @param password Mot de passe de l'utilisateur
|
||||||
* @return TRUE si l'utilisateur a pu être créé
|
* @return TRUE si l'utilisateur a pu être créé
|
||||||
*/
|
*/
|
||||||
@ -47,12 +48,14 @@ public class Context {
|
|||||||
this.login = login;
|
this.login = login;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (AES_GCM.AesGcmException e) {}
|
} catch (AES_GCM.AesGcmException e) {
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Login de l'utilisateur
|
* Login de l'utilisateur
|
||||||
|
*
|
||||||
* @return Login de l'utilisateur
|
* @return Login de l'utilisateur
|
||||||
*/
|
*/
|
||||||
public String getLogin() {
|
public String getLogin() {
|
||||||
@ -62,7 +65,8 @@ public class Context {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de demander la connection de l'utilisateur
|
* Permet de demander la connection de l'utilisateur
|
||||||
* @param login Login
|
*
|
||||||
|
* @param login Login
|
||||||
* @param password Mot de passe
|
* @param password Mot de passe
|
||||||
* @return TRUE si l'utilisateur a été authentifié
|
* @return TRUE si l'utilisateur a été authentifié
|
||||||
*/
|
*/
|
||||||
@ -70,8 +74,8 @@ public class Context {
|
|||||||
String passwordSalt = this.repository.getUserPasswordSalt(login);
|
String passwordSalt = this.repository.getUserPasswordSalt(login);
|
||||||
if (passwordSalt != null) {
|
if (passwordSalt != null) {
|
||||||
ShaHasher hasher = new ShaHasher(password);
|
ShaHasher hasher = new ShaHasher(password);
|
||||||
System.out.println(hasher.fromSalt(passwordSalt));
|
|
||||||
if (this.repository.verifyUser(login, hasher.fromSalt(passwordSalt))) {
|
if (this.repository.verifyUser(login, hasher.fromSalt(hasher.saltToByte(passwordSalt)))) {
|
||||||
this.login = login;
|
this.login = login;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -81,9 +85,19 @@ public class Context {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de savoir si l'utilisateur s'est connecté (Avec login et mdp)
|
* Permet de savoir si l'utilisateur s'est connecté (Avec login et mdp)
|
||||||
|
*
|
||||||
* @return TRUE si l'utilisateur est connecté
|
* @return TRUE si l'utilisateur est connecté
|
||||||
*/
|
*/
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
return this.getLogin() != null;
|
return this.getLogin() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clé AES de l'utilisateur
|
||||||
|
* @return Clé AES de l'utilisateur
|
||||||
|
*/
|
||||||
|
public String getAesKey() {
|
||||||
|
return this.repository.getUserAesKey(getLogin());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(String cmdName, String... data);
|
<T extends ProtocolWriter.ProtocolResult> T executeWriter(Context context, String cmdName, String... data);
|
||||||
|
|
||||||
void addReader(ProtocolReader reader);
|
void addReader(ProtocolReader reader);
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package lightcontainer.protocol;
|
package lightcontainer.protocol;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import lightcontainer.domains.client.Context;
|
||||||
|
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.StringJoiner;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@ -30,8 +30,14 @@ public abstract class ProtocolWriter {
|
|||||||
|
|
||||||
public static class ProtocolResult {
|
public static class ProtocolResult {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
|
||||||
private String command;
|
private String command;
|
||||||
|
|
||||||
|
public ProtocolResult(Context context) {
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
public String getCommand() {
|
public String getCommand() {
|
||||||
return command;
|
return command;
|
||||||
}
|
}
|
||||||
@ -46,14 +52,22 @@ public abstract class ProtocolWriter {
|
|||||||
* @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) {}
|
public void write(OutputStream writer) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accesseur au contexte courant sur lequel opère la commande
|
||||||
|
* @return Context
|
||||||
|
*/
|
||||||
|
public Context getContext() {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 construite
|
* @return La commande construites
|
||||||
*/
|
*/
|
||||||
public final <T extends ProtocolResult> T execute(String... data) {
|
public final <T extends ProtocolResult> T execute(Context context, String... data) {
|
||||||
// Concatatène le nom de la commande avec les données (trim), avec un espace entre chaque
|
// Concatatène le nom de la commande avec les données (trim), avec un espace entre chaque
|
||||||
StringBuilder builder = new StringBuilder(this.cmdName);
|
StringBuilder builder = new StringBuilder(this.cmdName);
|
||||||
|
|
||||||
@ -64,7 +78,7 @@ public abstract class ProtocolWriter {
|
|||||||
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
|
||||||
|
|
||||||
if (ruleMatcher.matches()) {
|
if (ruleMatcher.matches()) {
|
||||||
ProtocolResult result = onExecuted(data);
|
ProtocolResult result = onExecuted(context, data);
|
||||||
result.setCommand(command);
|
result.setCommand(command);
|
||||||
return (T) result;
|
return (T) result;
|
||||||
}
|
}
|
||||||
@ -75,8 +89,8 @@ public abstract class ProtocolWriter {
|
|||||||
/**
|
/**
|
||||||
* Cette méthode est appelée lors de l'exécution de la règle
|
* Cette méthode est appelée lors de l'exécution de la règle
|
||||||
*/
|
*/
|
||||||
protected <T extends ProtocolResult> T onExecuted(String... data) {
|
protected <T extends ProtocolResult> T onExecuted(Context context, String... data) {
|
||||||
return (T) new ProtocolResult();
|
return (T) new ProtocolResult(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ public class FilelistRule extends ProtocolReader {
|
|||||||
@Override
|
@Override
|
||||||
protected FilelistRule.Result onExecuted(Context context, String... data) {
|
protected FilelistRule.Result onExecuted(Context context, String... data) {
|
||||||
FilelistRule.Result result = new Result(context);
|
FilelistRule.Result result = new Result(context);
|
||||||
result.setResultCommand(this.protocolRep.executeWriter(FilesRule.NAME, "endbenja.txt!500"), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(this.protocolRep.executeWriter(context, FilesRule.NAME, "endbenja.txt!500"), ResultCmdReceiver.CLIENT);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,19 +54,18 @@ public class SavefileRule extends ProtocolReader {
|
|||||||
System.out.printf("Sauvegarde du fichier : %s %d\n", filename, size);
|
System.out.printf("Sauvegarde du fichier : %s %d\n", filename, size);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
FileReceiver fileReceiver = new FileReceiver(storagePath); // "D:\\"); //"/home/benjamin/ffe");
|
FileReceiver fileReceiver = new FileReceiver(storagePath);
|
||||||
|
|
||||||
String key = AES_GCM.generateSecretKey();
|
String key = AES_GCM.generateSecretKey();
|
||||||
String iv = AES_GCM.generateIV();
|
String iv = AES_GCM.generateIV();
|
||||||
System.out.println("Clé " + key);
|
|
||||||
System.out.println("IV " + iv);
|
|
||||||
|
|
||||||
if (!fileReceiver.receiveFile(reader, this.filename, this.size, key, iv))
|
if (!fileReceiver.receiveFile(reader, this.filename, this.size, key, iv))
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
|
|
||||||
this.setResultCommand(protocolRep.executeWriter(SendfileRule.NAME, this.filename, String.valueOf(this.size), "EMPREINTEBLBLBLBLBLABLABLBALBALBALBALBALBALBALBALBALABLBALBALBALABLABLABLABLABLABLABALBLABALABLABLABLABKJABKAHBHKBHJbhjvgkh"), ResultCmdReceiver.STOREBACKEND);
|
System.out.println("AHAHAHAH");
|
||||||
|
this.setResultCommand(protocolRep.executeWriter(getContext(), SendfileRule.NAME, this.filename, String.valueOf(this.size), "EMPREINTEBLBLBLBLBLABLABLBALBALBALBALBALBALBALBALBALABLBALBALBALABLABLABLABLABLABLABALBLABALABLABLABLABKJABKAHBHKBHJbhjvgkh"), ResultCmdReceiver.STOREBACKEND);
|
||||||
} catch (IOException | AES_GCM.AesGcmException e) {
|
} catch (IOException | AES_GCM.AesGcmException e) {
|
||||||
this.setResultCommand(protocolRep.executeWriter(SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
this.setResultCommand(protocolRep.executeWriter(getContext(), SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,7 +86,7 @@ public class SavefileRule extends ProtocolReader {
|
|||||||
protected ProtocolReader.ProtocolResult onError(Context context) {
|
protected ProtocolReader.ProtocolResult onError(Context context) {
|
||||||
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
||||||
// Commande renvoyée en cas d'erreur
|
// Commande renvoyée en cas d'erreur
|
||||||
result.setResultCommand(protocolRep.executeWriter(SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(protocolRep.executeWriter(context, SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ public class SendOkRule extends ProtocolReader {
|
|||||||
@Override
|
@Override
|
||||||
protected ProtocolReader.ProtocolResult onExecuted(Context context, String... data) {
|
protected ProtocolReader.ProtocolResult onExecuted(Context context, String... data) {
|
||||||
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
||||||
result.setResultCommand(protocolRep.executeWriter(SaveFileOkRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(protocolRep.executeWriter(context, SaveFileOkRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,9 +57,9 @@ public class SigninRule extends ProtocolReader {
|
|||||||
SigninRule.Result result = new SigninRule.Result(context, data[LOGIN], data[PASSWORD]);
|
SigninRule.Result result = new SigninRule.Result(context, data[LOGIN], data[PASSWORD]);
|
||||||
|
|
||||||
if (context.signIn(result.getLogin(), result.getPassword())) {
|
if (context.signIn(result.getLogin(), result.getPassword())) {
|
||||||
result.setResultCommand(this.protocolRep.executeWriter(SignOkRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(this.protocolRep.executeWriter(context, SignOkRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
} else {
|
} else {
|
||||||
result.setResultCommand(this.protocolRep.executeWriter(SignErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(this.protocolRep.executeWriter(context, SignErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -69,7 +69,7 @@ public class SigninRule extends ProtocolReader {
|
|||||||
protected ProtocolReader.ProtocolResult onError(Context context) {
|
protected ProtocolReader.ProtocolResult onError(Context context) {
|
||||||
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
||||||
|
|
||||||
result.setResultCommand(protocolRep.executeWriter(SignErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(protocolRep.executeWriter(context, SignErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,9 +50,9 @@ public class SignupRule extends ProtocolReader {
|
|||||||
SignupRule.Result result = new SignupRule.Result(context, data[LOGIN], data[PASSWORD]);
|
SignupRule.Result result = new SignupRule.Result(context, data[LOGIN], data[PASSWORD]);
|
||||||
|
|
||||||
if (context.createUser(result.getLogin(), result.getPassword())) {
|
if (context.createUser(result.getLogin(), result.getPassword())) {
|
||||||
result.setResultCommand(this.protocolRep.executeWriter(SignOkRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(this.protocolRep.executeWriter(context, SignOkRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
} else {
|
} else {
|
||||||
result.setResultCommand(this.protocolRep.executeWriter(SignErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(this.protocolRep.executeWriter(context, SignErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -62,7 +62,7 @@ public class SignupRule extends ProtocolReader {
|
|||||||
protected ProtocolReader.ProtocolResult onError(Context context) {
|
protected ProtocolReader.ProtocolResult onError(Context context) {
|
||||||
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
||||||
|
|
||||||
result.setResultCommand(protocolRep.executeWriter(SignErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(protocolRep.executeWriter(context, SignErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
package lightcontainer.protocol.rules.writer;
|
package lightcontainer.protocol.rules.writer;
|
||||||
|
|
||||||
|
import lightcontainer.domains.client.Context;
|
||||||
import lightcontainer.protocol.ProtocolWriter;
|
import lightcontainer.protocol.ProtocolWriter;
|
||||||
import lightcontainer.utils.FileReceiver;
|
import lightcontainer.utils.AES_GCM;
|
||||||
import lightcontainer.utils.FileSender;
|
import lightcontainer.utils.FileSender;
|
||||||
|
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
@ -18,9 +19,12 @@ public class SendfileRule extends ProtocolWriter {
|
|||||||
private static final int HASHED_FILE_NAME = 0; // Index file name hashed.
|
private static final int HASHED_FILE_NAME = 0; // Index file name hashed.
|
||||||
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;
|
||||||
|
|
||||||
public SendfileRule() {
|
public SendfileRule(String storagePath) {
|
||||||
super(NAME, PATTERN);
|
super(NAME, PATTERN);
|
||||||
|
this.storagePath = storagePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Result extends ProtocolWriter.ProtocolResult {
|
public class Result extends ProtocolWriter.ProtocolResult {
|
||||||
@ -29,7 +33,8 @@ public class SendfileRule extends ProtocolWriter {
|
|||||||
private final int fileSize;
|
private final int fileSize;
|
||||||
private final String hashedFileContent;
|
private final String hashedFileContent;
|
||||||
|
|
||||||
public Result(String hashedFileName, int fileSize, String hashedFileContent) {
|
public Result(Context context, String hashedFileName, int fileSize, String hashedFileContent) {
|
||||||
|
super(context);
|
||||||
this.hashedFileName = hashedFileName;
|
this.hashedFileName = hashedFileName;
|
||||||
this.fileSize = fileSize;
|
this.fileSize = fileSize;
|
||||||
this.hashedFileContent = hashedFileContent;
|
this.hashedFileContent = hashedFileContent;
|
||||||
@ -39,14 +44,18 @@ public class SendfileRule extends ProtocolWriter {
|
|||||||
public void write(OutputStream writer) {
|
public void write(OutputStream writer) {
|
||||||
super.write(writer);
|
super.write(writer);
|
||||||
System.out.println("Envoie du fichier au SBE");
|
System.out.println("Envoie du fichier au SBE");
|
||||||
FileSender fileSender = new FileSender("D:\\"); //"/home/benjamin/ffe");
|
|
||||||
|
|
||||||
|
FileSender fileSender = new FileSender(storagePath);
|
||||||
fileSender.sendFile(hashedFileName, writer);
|
fileSender.sendFile(hashedFileName, writer);
|
||||||
|
|
||||||
|
// TODO : Supprimer le fichier du FFE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected SendfileRule.Result onExecuted(String... data) {
|
protected SendfileRule.Result onExecuted(Context context, String... data) {
|
||||||
return new SendfileRule.Result(data[HASHED_FILE_NAME], Integer.parseInt(data[FILE_SIZE]), data[HASHED_FILE_CONTENT]);
|
return new SendfileRule.Result(context, data[HASHED_FILE_NAME], Integer.parseInt(data[FILE_SIZE]), data[HASHED_FILE_CONTENT]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,10 @@ public class ProtocolRepositoryImpl implements ProtocolRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T extends ProtocolWriter.ProtocolResult> T executeWriter(String cmdName, String... data) {
|
public <T extends ProtocolWriter.ProtocolResult> T executeWriter(Context context, String cmdName, String... data) {
|
||||||
for (ProtocolWriter writer : writers) {
|
for (ProtocolWriter writer : writers) {
|
||||||
T command;
|
T command;
|
||||||
if (cmdName.equals(writer.getCmdName()) && (command = writer.execute(data)) != null) {
|
if (cmdName.equals(writer.getCmdName()) && (command = writer.execute(context, data)) != null) {
|
||||||
return command;
|
return command;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ public class AppConfig {
|
|||||||
private int multicastPort;
|
private int multicastPort;
|
||||||
private String networkInterface;
|
private String networkInterface;
|
||||||
private boolean isTls;
|
private boolean isTls;
|
||||||
|
private String storagePath;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new instance of AppConfig.
|
* Constructs a new instance of AppConfig.
|
||||||
@ -26,6 +27,7 @@ public class AppConfig {
|
|||||||
this.multicastPort = -1;
|
this.multicastPort = -1;
|
||||||
this.networkInterface = "NONE";
|
this.networkInterface = "NONE";
|
||||||
this.isTls = false;
|
this.isTls = false;
|
||||||
|
storagePath = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -85,4 +87,20 @@ public class AppConfig {
|
|||||||
public void setTls(boolean tls) {
|
public void setTls(boolean tls) {
|
||||||
this.isTls = tls;
|
this.isTls = tls;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Méthode permettant de récupérer le chemin de sauvegarde des fichiers
|
||||||
|
* @return Chemin de sauvegarde
|
||||||
|
*/
|
||||||
|
public String getStoragePath() {
|
||||||
|
return this.storagePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Méthode permettant d'assigner le chemin de sauvegarde des fichiers
|
||||||
|
* @return Chemin de sauvegarde
|
||||||
|
*/
|
||||||
|
public void setStoragePath(String storagePath) {
|
||||||
|
this.storagePath = storagePath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,4 +151,15 @@ public class AppData {
|
|||||||
User user = getUser(login);
|
User user = getUser(login);
|
||||||
return user == null ? null : user.getPasswordSalt();
|
return user == null ? null : user.getPasswordSalt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Méthode permettant de récupérer la clé AES d'un utilisateur
|
||||||
|
* @param login Login de l'utilisateur
|
||||||
|
* @return Clé AES
|
||||||
|
*/
|
||||||
|
public String getUserAesKey(String login) {
|
||||||
|
User user = getUser(login);
|
||||||
|
return user == null ? null : user.getAesKey();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ public class JsonAdapter implements Adapter {
|
|||||||
config.addProperty("multicast_port", appConfig.getMulticastPort());
|
config.addProperty("multicast_port", appConfig.getMulticastPort());
|
||||||
config.addProperty("network_interface", appConfig.getNetworkInterface());
|
config.addProperty("network_interface", appConfig.getNetworkInterface());
|
||||||
config.addProperty("tls", appConfig.isTls());
|
config.addProperty("tls", appConfig.isTls());
|
||||||
|
config.addProperty("storagePath", appConfig.getStoragePath());
|
||||||
JsonArray users = new JsonArray();
|
JsonArray users = new JsonArray();
|
||||||
Iterator<User> userIterator = appData.usersIterator();
|
Iterator<User> userIterator = appData.usersIterator();
|
||||||
addUsers(users, userIterator);
|
addUsers(users, userIterator);
|
||||||
@ -85,13 +86,14 @@ public class JsonAdapter implements Adapter {
|
|||||||
appConfig.setMulticastPort(jsonAppData.get("multicast_port").getAsInt());
|
appConfig.setMulticastPort(jsonAppData.get("multicast_port").getAsInt());
|
||||||
appConfig.setNetworkInterface(jsonAppData.get("network_interface").getAsString());
|
appConfig.setNetworkInterface(jsonAppData.get("network_interface").getAsString());
|
||||||
appConfig.setTls(jsonAppData.get("tls").getAsBoolean());
|
appConfig.setTls(jsonAppData.get("tls").getAsBoolean());
|
||||||
|
appConfig.setStoragePath(jsonAppData.get("storagePath").getAsString());
|
||||||
JsonArray jsonUsers = jsonAppData.getAsJsonArray("users");
|
JsonArray jsonUsers = jsonAppData.getAsJsonArray("users");
|
||||||
List<User> users = new ArrayList<>();
|
List<User> users = new ArrayList<>();
|
||||||
getUsers(jsonUsers, users);
|
getUsers(jsonUsers, users);
|
||||||
AppData appData = AppData.getInstance();
|
AppData appData = AppData.getInstance();
|
||||||
appData.setAppConfig(appConfig);
|
appData.setAppConfig(appConfig);
|
||||||
for (User user : users) {
|
for (User user : users) {
|
||||||
appData.addUser(user.getName(), user.getPassword(), user.getAesKey(), "");
|
appData.addUser(user.getName(), user.getPassword(), user.getAesKey(), user.getPasswordSalt());
|
||||||
}
|
}
|
||||||
return appData;
|
return appData;
|
||||||
} catch (JsonParseException parseException) {
|
} catch (JsonParseException parseException) {
|
||||||
|
@ -117,9 +117,18 @@ public class Repository {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
* @return Chemin de sauvegarde
|
||||||
*/
|
*/
|
||||||
public String getStoragePath() {
|
public String getStoragePath() {
|
||||||
return null;
|
return appData.getAppConfig().getStoragePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Méthode permettant de récupérer la clé AES d'un utilisateur
|
||||||
|
* @param login Login de l'utilisateur
|
||||||
|
* @return Clé AES
|
||||||
|
*/
|
||||||
|
public String getUserAesKey(String login) {
|
||||||
|
return appData.getUserAesKey(login);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,14 +12,14 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class User {
|
public class User {
|
||||||
|
|
||||||
private final String Name;
|
private final String name;
|
||||||
private final String password;
|
private final String password;
|
||||||
private final String aesKey;
|
private final String aesKey;
|
||||||
private final String passwordSalt;
|
private final String passwordSalt;
|
||||||
private final Map<String, File> files;
|
private final Map<String, File> files;
|
||||||
|
|
||||||
public User(String Name, String password, String aesKey, String passwordSalt, Map<String, File> files) {
|
public User(String name, String password, String aesKey, String passwordSalt, Map<String, File> files) {
|
||||||
this.Name = Name;
|
this.name = name;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
this.aesKey = aesKey;
|
this.aesKey = aesKey;
|
||||||
this.passwordSalt = passwordSalt;
|
this.passwordSalt = passwordSalt;
|
||||||
@ -27,7 +27,7 @@ public class User {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return Name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPassword() {
|
public String getPassword() {
|
||||||
|
@ -26,7 +26,6 @@ public class AES_GCM {
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* FILE ENCRYPTION DEMO
|
* FILE ENCRYPTION DEMO
|
||||||
*/
|
|
||||||
// Init files
|
// Init files
|
||||||
File inFile = new File("D:\\HELMo.png");
|
File inFile = new File("D:\\HELMo.png");
|
||||||
File outFile = new File("D:\\HELMoCrypted.png");
|
File outFile = new File("D:\\HELMoCrypted.png");
|
||||||
@ -53,6 +52,7 @@ public class AES_GCM {
|
|||||||
IVFile,
|
IVFile,
|
||||||
keyFile
|
keyFile
|
||||||
);
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TEXT ENCRYPTION DEMO
|
* TEXT ENCRYPTION DEMO
|
||||||
@ -207,16 +207,18 @@ public class AES_GCM {
|
|||||||
*
|
*
|
||||||
* @throws AesGcmException Exception if an error occur.
|
* @throws AesGcmException Exception if an error occur.
|
||||||
*/
|
*/
|
||||||
private static void encryptStream(InputStream in, OutputStream out, String key, String IV) throws AesGcmException {
|
public static void encryptStream(InputStream in, OutputStream out, int fileSize, String key, String IV) throws AesGcmException {
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
int bytes;
|
int bytes;
|
||||||
|
int currSize = 0;
|
||||||
try {
|
try {
|
||||||
// Make the cipher for encryption
|
// Make the cipher for encryption
|
||||||
Cipher cipher = createCipher(Cipher.ENCRYPT_MODE, key, IV);
|
Cipher cipher = createCipher(Cipher.ENCRYPT_MODE, key, IV);
|
||||||
// Initialize a CipherOutputStream
|
// Initialize a CipherOutputStream
|
||||||
CipherOutputStream cipherOut = new CipherOutputStream(out, cipher);
|
CipherOutputStream cipherOut = new CipherOutputStream(out, cipher);
|
||||||
// Encryption Process
|
// Encryption Process
|
||||||
while((bytes = in.read(buffer)) > 0) {
|
while(currSize < fileSize && (bytes = in.read(buffer)) > 0) {
|
||||||
|
currSize += bytes;
|
||||||
cipherOut.write(buffer, 0, bytes);
|
cipherOut.write(buffer, 0, bytes);
|
||||||
cipherOut.flush();
|
cipherOut.flush();
|
||||||
}
|
}
|
||||||
@ -259,7 +261,7 @@ public class AES_GCM {
|
|||||||
*
|
*
|
||||||
* @throws AesGcmException Exception if an error occur.
|
* @throws AesGcmException Exception if an error occur.
|
||||||
*/
|
*/
|
||||||
private static void decryptStream(InputStream in, OutputStream out, String key, String IV) throws AesGcmException {
|
public static void decryptStream(InputStream in, OutputStream out, String key, String IV) throws AesGcmException {
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
int bytes;
|
int bytes;
|
||||||
try {
|
try {
|
||||||
|
@ -8,17 +8,41 @@ public class FileSender {
|
|||||||
|
|
||||||
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) {
|
||||||
|
BufferedInputStream bisFile = null;
|
||||||
|
System.out.printf("Envoie fichier : %s - %s - %s \n", filename, aesKey, iv);
|
||||||
|
try {
|
||||||
|
File f = new File(String.format("%s/%s", path, filename));
|
||||||
|
if(f.exists()) {
|
||||||
|
bisFile = new BufferedInputStream(new FileInputStream(f));
|
||||||
|
|
||||||
|
AES_GCM.decryptStream(bisFile, out, aesKey, iv);
|
||||||
|
|
||||||
|
bisFile.close();
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
} catch(IOException | AES_GCM.AesGcmException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean sendFile(String filename, OutputStream out) {
|
public boolean sendFile(String filename, OutputStream out) {
|
||||||
BufferedInputStream bisFile = null;
|
BufferedInputStream bisFile = null;
|
||||||
|
int bytesReaded = 0;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
File f = new File(String.format("%s/%s", path, filename));
|
File f = new File(String.format("%s/%s", path, filename));
|
||||||
long fileSize = f.length();
|
long fileSize = f.length();
|
||||||
if(f.exists()) {
|
if(f.exists()) {
|
||||||
|
byte[] buffer = new byte[DEFAULT_BUFFER];
|
||||||
bisFile = new BufferedInputStream(new FileInputStream(f));
|
bisFile = new BufferedInputStream(new FileInputStream(f));
|
||||||
|
long currentOffset = 0;
|
||||||
//AES_GCM.encryptStream(bisFile, out, fileSize, "hyjFrdMJW6Pur8fiFueVrWKqwtnqAZmXEZPBAyBXp+o=", "e6H7xuw+PNrDppJCPLTKhg==");
|
while((currentOffset < fileSize) && (bytesReaded = bisFile.read(buffer)) > 0) {
|
||||||
|
out.write(buffer, 0, bytesReaded); out.flush();
|
||||||
|
currentOffset+= bytesReaded;
|
||||||
|
}
|
||||||
bisFile.close();
|
bisFile.close();
|
||||||
return true;
|
return true;
|
||||||
} else
|
} else
|
||||||
@ -28,4 +52,5 @@ public class FileSender {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -35,14 +35,14 @@ public class ShaHasher {
|
|||||||
public String nextHashing() {
|
public String nextHashing() {
|
||||||
this.salt = generateSalt();
|
this.salt = generateSalt();
|
||||||
|
|
||||||
return fromSalt(getSalt());
|
return fromSalt(this.salt);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String fromSalt(String passwordSalt) {
|
public String fromSalt(byte[] passwordSalt) {
|
||||||
String generatedPassword = null;
|
String generatedPassword = null;
|
||||||
try {
|
try {
|
||||||
MessageDigest md = MessageDigest.getInstance("SHA-384");
|
MessageDigest md = MessageDigest.getInstance("SHA-384");
|
||||||
md.update(saltToByte(passwordSalt));
|
md.update(passwordSalt);
|
||||||
byte[] bytes = md.digest(password.getBytes(StandardCharsets.UTF_8));
|
byte[] bytes = md.digest(password.getBytes(StandardCharsets.UTF_8));
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (int i = 0; i < bytes.length; i++) {
|
for (int i = 0; i < bytes.length; i++) {
|
||||||
@ -70,7 +70,7 @@ public class ShaHasher {
|
|||||||
return b64Encoder.encodeToString(this.salt);
|
return b64Encoder.encodeToString(this.salt);
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] saltToByte(String salt) {
|
public byte[] saltToByte(String salt) {
|
||||||
Base64.Decoder b64Decoder = Base64.getDecoder();
|
Base64.Decoder b64Decoder = Base64.getDecoder();
|
||||||
return b64Decoder.decode(salt);
|
return b64Decoder.decode(salt);
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
"storagePath": "/home/benjamin/ffe",
|
"storagePath": "/home/benjamin/ffe",
|
||||||
"users": [
|
"users": [
|
||||||
{
|
{
|
||||||
"name": "benjamin",
|
"name": "aaaaa",
|
||||||
"password": "08ffabe5c9577b4c809aa4eeee61c1859d4b5c44b0acfe9534a81ae48c3ba1a1d372f4a6bdaad2bb46483e0899cd765b",
|
"password": "5d628c274ebb008324f1e199d3bfff0a3fe839730a7f2355e82850d7acca5e5ca64db9071abf3d91034295695f84a617",
|
||||||
"aes_key": "FaiZVQaeJF1qrbcOsM0yaUdzcmeIZ3p9R3NZwA5zPcs=",
|
"aes_key": "qlTH6TijnfMRnrS0Qf+k6IPKGp5LoRMXGxCq16e+mF4=",
|
||||||
"passwordSalt": "azA4e8Dtw+svxQWWnJ+rlA==",
|
"passwordSalt": "Ns8Al6DpqPsIDlCSRBVTEg==",
|
||||||
"files": []
|
"files": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user