- Translation de la suppresion du fichier temporaire sur le FFE de Send(OK/ERROR) ) Save(OK/ERROR), pour supprimer le fichier créé par la méthode read de SAVEFILE, et ce même si on ne passe pas par le système de tâche (exemple, pas de SBE disponible)
- Ajout possibilité de choisir un SBE approprié à la requête et donc de renvoyer un message d'erreur convenable si le SBE n'est pas connecté pour le moment (Via son ID)
This commit is contained in:
parent
e5628942a2
commit
b94720a797
@ -59,7 +59,7 @@ public class App {
|
|||||||
protocolRep.addReader(new SignoutRule());
|
protocolRep.addReader(new SignoutRule());
|
||||||
protocolRep.addReader(new FilelistRule(protocolRep));
|
protocolRep.addReader(new FilelistRule(protocolRep));
|
||||||
protocolRep.addReader(new SavefileRule(protocolRep, repositoryStorage.getStoragePath()));
|
protocolRep.addReader(new SavefileRule(protocolRep, repositoryStorage.getStoragePath()));
|
||||||
protocolRep.addReader(new SendOkRule(protocolRep, repositoryStorage.getStoragePath()));
|
protocolRep.addReader(new SendOkRule(protocolRep));
|
||||||
protocolRep.addReader(new SendErrorRule(protocolRep, repositoryStorage.getStoragePath()));
|
protocolRep.addReader(new SendErrorRule(protocolRep, repositoryStorage.getStoragePath()));
|
||||||
protocolRep.addReader(new GetFileRule(protocolRep));
|
protocolRep.addReader(new GetFileRule(protocolRep));
|
||||||
protocolRep.addReader(new EraseErrorRule(protocolRep));
|
protocolRep.addReader(new EraseErrorRule(protocolRep));
|
||||||
@ -73,8 +73,8 @@ public class App {
|
|||||||
protocolRep.addWriter(new SignOkRule());
|
protocolRep.addWriter(new SignOkRule());
|
||||||
protocolRep.addWriter(new SignErrorRule());
|
protocolRep.addWriter(new SignErrorRule());
|
||||||
protocolRep.addWriter(new FilesRule());
|
protocolRep.addWriter(new FilesRule());
|
||||||
protocolRep.addWriter(new SaveFileOkRule());
|
protocolRep.addWriter(new SaveFileOkRule(repositoryStorage.getStoragePath()));
|
||||||
protocolRep.addWriter(new SaveFileErrorRule());
|
protocolRep.addWriter(new SaveFileErrorRule(repositoryStorage.getStoragePath()));
|
||||||
protocolRep.addWriter(new SendfileRule(repositoryStorage.getStoragePath()));
|
protocolRep.addWriter(new SendfileRule(repositoryStorage.getStoragePath()));
|
||||||
protocolRep.addWriter(new GetFileErrorRule());
|
protocolRep.addWriter(new GetFileErrorRule());
|
||||||
protocolRep.addWriter(new EraseFileRule());
|
protocolRep.addWriter(new EraseFileRule());
|
||||||
|
@ -110,16 +110,17 @@ public class ClientHandler implements Runnable, AutoCloseable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (checkAccess(ruleResult)) {
|
if (checkAccess(ruleResult)) {
|
||||||
|
// Lecture du fichier client
|
||||||
ruleResult.read(this.client.getInputStream());
|
ruleResult.read(this.client.getInputStream());
|
||||||
|
|
||||||
ProtocolWriter.ProtocolResult writerCommand = ruleResult.getResultCommand();
|
ProtocolWriter.ProtocolResult writerCommand = ruleResult.getResultCommand();
|
||||||
|
|
||||||
if (ruleResult.getReceiver() == ProtocolReader.ResultCmdReceiver.STOREBACKEND) {
|
|
||||||
// TODO : Vérifier que le StorBackEnd demandé (Pas toujours demandé) est disponible
|
// TODO : Vérifier que le StorBackEnd demandé (Pas toujours demandé) est disponible
|
||||||
if (ruleResult.getRequestDomain() != null && !fileFrontEnd.canExecuteCommand(ruleResult.getRequestDomain())) {
|
if (ruleResult.getReceiver() == ProtocolReader.ResultCmdReceiver.STOREBACKEND && !fileFrontEnd.canExecuteCommand(ruleResult.getRequestDomain())) {
|
||||||
|
System.out.println("ICI");
|
||||||
writer.print(ruleResult.onNotExecutable(context)); // Renvoie au client
|
writer.print(ruleResult.onNotExecutable(context)); // Renvoie au client
|
||||||
writer.flush();
|
writer.flush();
|
||||||
} else {
|
} else if (ruleResult.getReceiver() == ProtocolReader.ResultCmdReceiver.STOREBACKEND) {
|
||||||
|
|
||||||
fileFrontEnd.newCommand(context, writerCommand); // Envoie dans la file de tâche FileFrontEnd en attente d'un traitement d'un StorBackEnd
|
fileFrontEnd.newCommand(context, writerCommand); // Envoie dans la file de tâche FileFrontEnd en attente d'un traitement d'un StorBackEnd
|
||||||
|
|
||||||
// Attend la fin de la réalisation de la tâche
|
// Attend la fin de la réalisation de la tâche
|
||||||
@ -128,8 +129,6 @@ public class ClientHandler implements Runnable, AutoCloseable {
|
|||||||
writer.write(response.getCommand()); // Renvoie au client
|
writer.write(response.getCommand()); // Renvoie au client
|
||||||
writer.flush();
|
writer.flush();
|
||||||
response.write(this.client.getOutputStream()); // Ecrit au client si nécessaire
|
response.write(this.client.getOutputStream()); // Ecrit au client si nécessaire
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
writer.print(writerCommand.getCommand()); // Renvoie au client
|
writer.print(writerCommand.getCommand()); // Renvoie au client
|
||||||
writer.flush();
|
writer.flush();
|
||||||
|
@ -178,8 +178,8 @@ public class Context {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReadOnlyFile getFileOf(String fileName, String userName) {
|
public ReadOnlyFile getFile(String fileName) {
|
||||||
return this.repository.getFileOf(fileName, userName);
|
return this.repository.getFileOf(fileName, login);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getStringifiedFilesOf() {
|
public List<String> getStringifiedFilesOf() {
|
||||||
|
@ -26,4 +26,6 @@ public interface MulticastSPR {
|
|||||||
void assignTask(String stor, Task task);
|
void assignTask(String stor, Task task);
|
||||||
|
|
||||||
boolean hasDomain(String domain);
|
boolean hasDomain(String domain);
|
||||||
|
|
||||||
|
int domainCount();
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ public abstract class ProtocolWriter {
|
|||||||
|
|
||||||
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
|
||||||
System.out.println("Essaye : " + command);
|
System.out.println("Crée la commande : " + command);
|
||||||
if (ruleMatcher.matches()) {
|
if (ruleMatcher.matches()) {
|
||||||
ProtocolResult result = onExecuted(context, data);
|
ProtocolResult result = onExecuted(context, data);
|
||||||
result.setCommand(command);
|
result.setCommand(command);
|
||||||
|
@ -4,8 +4,6 @@ import lightcontainer.domains.client.Context;
|
|||||||
import lightcontainer.interfaces.ProtocolRepository;
|
import lightcontainer.interfaces.ProtocolRepository;
|
||||||
import lightcontainer.protocol.ProtocolReader;
|
import lightcontainer.protocol.ProtocolReader;
|
||||||
import lightcontainer.protocol.rules.writer.GetFileErrorRule;
|
import lightcontainer.protocol.rules.writer.GetFileErrorRule;
|
||||||
import lightcontainer.protocol.rules.writer.GetFileOkRule;
|
|
||||||
import lightcontainer.storage.File;
|
|
||||||
import lightcontainer.storage.ReadOnlyFile;
|
import lightcontainer.storage.ReadOnlyFile;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@ -51,7 +49,7 @@ public class GetFileRule extends ProtocolReader {
|
|||||||
protected GetFileRule.Result onExecuted(Context context, String... data) {
|
protected GetFileRule.Result onExecuted(Context context, String... data) {
|
||||||
GetFileRule.Result result = new GetFileRule.Result(context, data[FILE_NAME]);
|
GetFileRule.Result result = new GetFileRule.Result(context, data[FILE_NAME]);
|
||||||
|
|
||||||
ReadOnlyFile file = context.getFileOf(data[FILE_NAME], context.getLogin());
|
ReadOnlyFile file = context.getFile(data[FILE_NAME]);
|
||||||
|
|
||||||
// Précision du store back end demandé pour traiter cette commande.
|
// Précision du store back end demandé pour traiter cette commande.
|
||||||
String requestDomain = extractRequestDomain(file.getStorageIterator());
|
String requestDomain = extractRequestDomain(file.getStorageIterator());
|
||||||
|
@ -5,6 +5,9 @@ import lightcontainer.interfaces.ProtocolRepository;
|
|||||||
import lightcontainer.protocol.ProtocolReader;
|
import lightcontainer.protocol.ProtocolReader;
|
||||||
import lightcontainer.protocol.rules.writer.EraseFileRule;
|
import lightcontainer.protocol.rules.writer.EraseFileRule;
|
||||||
import lightcontainer.protocol.rules.writer.RemoveFileErrorRule;
|
import lightcontainer.protocol.rules.writer.RemoveFileErrorRule;
|
||||||
|
import lightcontainer.storage.ReadOnlyFile;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
public class RemoveFileRule extends ProtocolReader {
|
public class RemoveFileRule extends ProtocolReader {
|
||||||
|
|
||||||
@ -39,11 +42,16 @@ public class RemoveFileRule extends ProtocolReader {
|
|||||||
@Override
|
@Override
|
||||||
protected RemoveFileRule.Result onExecuted(Context context, String... data) {
|
protected RemoveFileRule.Result onExecuted(Context context, String... data) {
|
||||||
RemoveFileRule.Result result = new RemoveFileRule.Result(context, data[FILENAME]);
|
RemoveFileRule.Result result = new RemoveFileRule.Result(context, data[FILENAME]);
|
||||||
String extendedFileName = context.getHashedFileName(result.getFileName());
|
ReadOnlyFile file = context.getFile(result.getFileName());
|
||||||
|
|
||||||
if (extendedFileName != null) {
|
if (file != null) {
|
||||||
|
String extendedFileName = context.getHashedFileName(result.getFileName());
|
||||||
context.putDataString("fileName", result.getFileName());
|
context.putDataString("fileName", result.getFileName());
|
||||||
result.setResultCommand(protocolRep.executeWriter(context, EraseFileRule.NAME, extendedFileName), ResultCmdReceiver.STOREBACKEND);
|
result.setResultCommand(protocolRep.executeWriter(context, EraseFileRule.NAME, extendedFileName), ResultCmdReceiver.STOREBACKEND);
|
||||||
|
|
||||||
|
// Précision du store back end demandé pour traiter cette commande.
|
||||||
|
String requestDomain = extractRequestDomain(file.getStorageIterator());
|
||||||
|
result.setRequestDomain(requestDomain);
|
||||||
} else {
|
} else {
|
||||||
result.setResultCommand(protocolRep.executeWriter(context, RemoveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(protocolRep.executeWriter(context, RemoveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
}
|
}
|
||||||
@ -57,4 +65,14 @@ public class RemoveFileRule extends ProtocolReader {
|
|||||||
result.setResultCommand(protocolRep.executeWriter(context, RemoveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(protocolRep.executeWriter(context, RemoveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO : But futur est de pouvoir en avoir plusieurs
|
||||||
|
* Cette méthode permet de choisir le domaine voulu.
|
||||||
|
* @param storageIterator Les domaines
|
||||||
|
* @return Le domain choisi
|
||||||
|
*/
|
||||||
|
private String extractRequestDomain(Iterator<String> storageIterator) {
|
||||||
|
return storageIterator.next();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,8 @@ public class SavefileRule extends ProtocolReader {
|
|||||||
|
|
||||||
this.setResultCommand(protocolRep.executeWriter(getContext(), SendfileRule.NAME, this.filename, String.valueOf(encryptedFileSize), fileHash), ResultCmdReceiver.STOREBACKEND);
|
this.setResultCommand(protocolRep.executeWriter(getContext(), SendfileRule.NAME, this.filename, String.valueOf(encryptedFileSize), fileHash), ResultCmdReceiver.STOREBACKEND);
|
||||||
} catch (IOException | SHA.ShaException e) {
|
} catch (IOException | SHA.ShaException e) {
|
||||||
|
// TODO : Supprimer le fichier
|
||||||
|
System.out.println("HEYHEYHEYHEYHEY OHOHOH");
|
||||||
this.setResultCommand(protocolRep.executeWriter(getContext(), SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
this.setResultCommand(protocolRep.executeWriter(getContext(), SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import lightcontainer.domains.client.Context;
|
|||||||
import lightcontainer.interfaces.ProtocolRepository;
|
import lightcontainer.interfaces.ProtocolRepository;
|
||||||
import lightcontainer.protocol.ProtocolReader;
|
import lightcontainer.protocol.ProtocolReader;
|
||||||
import lightcontainer.protocol.rules.writer.SaveFileErrorRule;
|
import lightcontainer.protocol.rules.writer.SaveFileErrorRule;
|
||||||
|
import lightcontainer.utils.ShaHasher;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@ -36,12 +37,6 @@ public class SendErrorRule extends ProtocolReader {
|
|||||||
ProtocolResult result = new ProtocolResult(context);
|
ProtocolResult result = new ProtocolResult(context);
|
||||||
result.setResultCommand(protocolRep.executeWriter(context, SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(protocolRep.executeWriter(context, SaveFileErrorRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
|
|
||||||
// Suppression du fichier temporaire dans le stockage du FFE
|
|
||||||
String hashedFileName = context.getHashedFileName(context.getDataString("fileName"));
|
|
||||||
try {
|
|
||||||
Files.deleteIfExists(Path.of(String.format("%s/%s", this.storagePath, hashedFileName)));
|
|
||||||
} catch (IOException e) {}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,13 +20,11 @@ public class SendOkRule extends ProtocolReader {
|
|||||||
private static final String NAME = "SEND_OK";
|
private static final String NAME = "SEND_OK";
|
||||||
|
|
||||||
private final ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
private final String storagePath;
|
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public SendOkRule(ProtocolRepository protocolRep, String storagePath) {
|
public SendOkRule(ProtocolRepository protocolRep) {
|
||||||
super(NAME, PATTERN);
|
super(NAME, PATTERN);
|
||||||
this.protocolRep = protocolRep;
|
this.protocolRep = protocolRep;
|
||||||
this.storagePath = storagePath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -35,15 +33,6 @@ public class SendOkRule extends ProtocolReader {
|
|||||||
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
ProtocolReader.ProtocolResult result = new ProtocolReader.ProtocolResult(context);
|
||||||
result.setResultCommand(protocolRep.executeWriter(context, SaveFileOkRule.NAME), ResultCmdReceiver.CLIENT);
|
result.setResultCommand(protocolRep.executeWriter(context, SaveFileOkRule.NAME), ResultCmdReceiver.CLIENT);
|
||||||
|
|
||||||
// Sauvegarder dans JSON
|
|
||||||
context.addFile(context.getDataString("fileName"), context.getDataString("fileNameSalt"), context.getDataInt("size"), context.getDataString("iv"), context.getDomain());
|
|
||||||
|
|
||||||
// Suppression du fichier temporaire dans le stockage du FFE
|
|
||||||
String hashedFileName = context.getHashedFileName(context.getDataString("fileName"));
|
|
||||||
try {
|
|
||||||
Files.deleteIfExists(Path.of(String.format("%s/%s", storagePath, hashedFileName)));
|
|
||||||
} catch (IOException e) {}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
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.ShaHasher;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Règle signifiant que la sauvegarde d'un fichier a échoué
|
* Règle signifiant que la sauvegarde d'un fichier a échoué
|
||||||
@ -11,8 +17,28 @@ public class SaveFileErrorRule extends ProtocolWriter {
|
|||||||
|
|
||||||
public static final String NAME = "SAVEFILE_ERROR";
|
public static final String NAME = "SAVEFILE_ERROR";
|
||||||
|
|
||||||
public SaveFileErrorRule() {
|
private final String storagePath;
|
||||||
|
|
||||||
|
public SaveFileErrorRule(String storagePath) {
|
||||||
super(NAME, PATTERN);
|
super(NAME, PATTERN);
|
||||||
|
this.storagePath = storagePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ProtocolResult onExecuted(Context context, String... data) {
|
||||||
|
ProtocolResult result = new ProtocolResult(context);
|
||||||
|
|
||||||
|
// Suppression du fichier temporaire dans le stockage du FFE
|
||||||
|
ShaHasher hasher = new ShaHasher(context.getLogin() + "_" + context.getDataString("fileName"));
|
||||||
|
try {
|
||||||
|
Files.deleteIfExists(Path.of(
|
||||||
|
String.format("%s/%s", this.storagePath,
|
||||||
|
hasher.fromSalt(hasher.saltToByte(context.getDataString("fileNameSalt")))
|
||||||
|
)
|
||||||
|
));
|
||||||
|
} catch (IOException e) {}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
package lightcontainer.protocol.rules.writer;
|
package lightcontainer.protocol.rules.writer;
|
||||||
|
|
||||||
|
import lightcontainer.domains.client.Context;
|
||||||
import lightcontainer.protocol.ProtocolWriter;
|
import lightcontainer.protocol.ProtocolWriter;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Règle signifiant que la sauvegarde d'un fichier fût un succès
|
* Règle signifiant que la sauvegarde d'un fichier fût un succès
|
||||||
*/
|
*/
|
||||||
@ -11,8 +16,26 @@ public class SaveFileOkRule extends ProtocolWriter {
|
|||||||
|
|
||||||
public static final String NAME = "SAVEFILE_OK";
|
public static final String NAME = "SAVEFILE_OK";
|
||||||
|
|
||||||
public SaveFileOkRule() {
|
private final String storagePath;
|
||||||
|
|
||||||
|
public SaveFileOkRule(String storagePath) {
|
||||||
super(NAME, PATTERN);
|
super(NAME, PATTERN);
|
||||||
|
this.storagePath = storagePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ProtocolWriter.ProtocolResult onExecuted(Context context, String... data) {
|
||||||
|
ProtocolWriter.ProtocolResult result = new ProtocolWriter.ProtocolResult(context);
|
||||||
|
|
||||||
|
// Sauvegarder dans JSON
|
||||||
|
context.addFile(context.getDataString("fileName"), context.getDataString("fileNameSalt"), context.getDataInt("size"), context.getDataString("iv"), context.getDomain());
|
||||||
|
|
||||||
|
// Suppression du fichier temporaire dans le stockage du FFE
|
||||||
|
String hashedFileName = context.getHashedFileName(context.getDataString("fileName"));
|
||||||
|
try {
|
||||||
|
Files.deleteIfExists(Path.of(String.format("%s/%s", storagePath, hashedFileName)));
|
||||||
|
} catch (IOException e) {}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,7 @@ public class FileFrontEnd implements ClientHandlerFFE, StoreProcessorFFE {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canExecuteCommand(String domain) {
|
public boolean canExecuteCommand(String domain) {
|
||||||
return storeRepository.hasDomain(domain);
|
System.out.println("Peut on exécuter la commande ? " + domain);
|
||||||
|
return domain == null ? storeRepository.domainCount() > 0 : storeRepository.hasDomain(domain);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,11 @@ public class StoreProcessorRepository implements AutoCloseable, MulticastSPR {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int domainCount() {
|
||||||
|
return handlers.size();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
|
@ -1 +1 @@
|
|||||||
{"unicast_port":8000,"multicast_ip":"224.66.66.1","multicast_port":15502,"network_interface":"My network interface","tls":true,"storagePath":"/home/benjamin/ffe","users":[{"name":"aaaaa","password":"5d628c274ebb008324f1e199d3bfff0a3fe839730a7f2355e82850d7acca5e5ca64db9071abf3d91034295695f84a617","aes_key":"qlTH6TijnfMRnrS0Qf+k6IPKGp5LoRMXGxCq16e+mF4=","passwordSalt":"Ns8Al6DpqPsIDlCSRBVTEg==","files":[{"name":"main.py","fileNameSalt":"IJNYL681pFqbF9OHzRuHIg==","size":854,"iv":"bPCnwYbenKvFfwbhq+HI5A==","storage":["lightcontainerSB01"]},{"name":"README.md","fileNameSalt":"/jo0zYyQs96gWI9OgBXiPQ==","size":17,"iv":"rvOFhgEvgFMISO44jqlSRg==","storage":["lightcontainerSB01"]}]}]}
|
{"unicast_port":8000,"multicast_ip":"224.66.66.1","multicast_port":15502,"network_interface":"My network interface","tls":true,"storagePath":"/home/benjamin/ffe","users":[{"name":"aaaaa","password":"5d628c274ebb008324f1e199d3bfff0a3fe839730a7f2355e82850d7acca5e5ca64db9071abf3d91034295695f84a617","aes_key":"qlTH6TijnfMRnrS0Qf+k6IPKGp5LoRMXGxCq16e+mF4=","passwordSalt":"Ns8Al6DpqPsIDlCSRBVTEg==","files":[{"name":"README.md","fileNameSalt":"cDY6LMq13iqKknRS9OVBPw==","size":17,"iv":"jxc7hkIAoH64M8JF7FvNFw==","storage":["lightcontainerSB01"]}]}]}
|
Loading…
Reference in New Issue
Block a user