Compare commits

...

2 commits

6 changed files with 51 additions and 59 deletions

View file

@ -47,16 +47,22 @@ public class Configuration {
System.out.println("Config on " + _file.getAbsolutePath()); System.out.println("Config on " + _file.getAbsolutePath());
} }
public <T> Configuration addDefaultValue(String name, T value) throws Exception{
if(value == null) throw new IllegalArgumentException("Value cannot be null");
Field field = getClass().getDeclaredField(name);
field.setAccessible(true);
field.set(this, value);
return this;
}
public void load() throws Exception{ public void load() throws Exception{
if (!this._file.exists()) if(!this._file.exists()) return;
return;
BufferedReader reader = new BufferedReader(new FileReader(this._file)); BufferedReader reader = new BufferedReader(new FileReader(this._file));
String line; String line;
while((line = reader.readLine()) != null){ while((line = reader.readLine()) != null){
String[] split = line.split("="); String[] split = line.split("=");
Field field = getClass().getDeclaredField(split[0]); Field field = getClass().getDeclaredField(split[0]);
if (field == null) if(field == null) continue;
continue;
field.setAccessible(true); field.setAccessible(true);
injectValue(field, split[1]); injectValue(field, split[1]);
} }
@ -112,8 +118,7 @@ public class Configuration {
BufferedWriter writer = new BufferedWriter(new FileWriter(_file)); BufferedWriter writer = new BufferedWriter(new FileWriter(_file));
for(Field field : fields){ for(Field field : fields){
field.setAccessible(true); field.setAccessible(true);
if (field.getName().startsWith("_")) if(field.getName().startsWith("_")) continue;
continue;
Object value = field.get(this); Object value = field.get(this);
writer.write(field.getName() + "=" + value); writer.write(field.getName() + "=" + value);
} }
@ -166,8 +171,6 @@ public class Configuration {
} }
public String getUsersFiles(){ public String getUsersFiles(){
if (users_files == null || users_files.trim().isEmpty())
users_files = "/tmp/users_files";
return users_files; return users_files;
} }

View file

@ -9,7 +9,6 @@ import java.util.regex.Matcher;
import dev.peerat.backend.model.Completion; import dev.peerat.backend.model.Completion;
import dev.peerat.backend.model.Group; import dev.peerat.backend.model.Group;
import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.model.PeerAtUser;
import dev.peerat.backend.model.Player;
import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.backend.repository.DatabaseRepository;
import dev.peerat.backend.routes.BadgeDetails; import dev.peerat.backend.routes.BadgeDetails;
import dev.peerat.backend.routes.ChapterElement; import dev.peerat.backend.routes.ChapterElement;
@ -42,7 +41,8 @@ import dev.peerat.framework.Router;
public class Main{ public class Main{
public static void main(String[] args) throws Exception{ public static void main(String[] args) throws Exception{
Configuration config = new Configuration("config.txt"); Configuration config = new Configuration("config.txt")
.addDefaultValue("users_files", "/tmp/users_files");
config.load(); config.load();
Class.forName("com.mysql.cj.jdbc.Driver"); Class.forName("com.mysql.cj.jdbc.Driver");
@ -87,7 +87,7 @@ public class Main{
} }
private static void initRoutes(Router<PeerAtUser> router, DatabaseRepository repo, Configuration config){ private static void initRoutes(Router<PeerAtUser> router, DatabaseRepository repo, Configuration config){
Map<Player, Integer> playersWaiting = new HashMap<>(); Map<String, Integer> playersWaiting = new HashMap<>();
router.register(new Register(repo, playersWaiting)); router.register(new Register(repo, playersWaiting));
router.register(new MailConfirmation(repo, router, config.getUsersFiles(), config.getGitToken(), playersWaiting)); router.register(new MailConfirmation(repo, router, config.getUsersFiles(), config.getGitToken(), playersWaiting));
router.register(new Login(repo, router)); router.register(new Login(repo, router));

View file

@ -4,6 +4,7 @@ import java.util.regex.Matcher;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import dev.peerat.backend.bonus.extract.RouteDoc;
import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.model.PeerAtUser;
import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.backend.repository.DatabaseRepository;
import dev.peerat.framework.Context; import dev.peerat.framework.Context;
@ -24,7 +25,10 @@ public class DynamicLogs implements Response{
this.locker = locker; this.locker = locker;
} }
@Route(path = "^/admin/logs$", needLogin = true, websocket = true) @RouteDoc(path = "/admin/logs", responseCode = 200, responseDescription = "L'utilisateur peux voir les logs en directe")
@RouteDoc(responseCode = 401, responseDescription = "L'utilisateur n'a pas accès à cette ressource")
@Route(path = "^/admin/logs$", websocket = true)
public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception { public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception {
//check if admin //check if admin
@ -33,6 +37,7 @@ public class DynamicLogs implements Response{
locker.init(key); locker.init(key);
try { try {
while(!reader.isClosed()){ while(!reader.isClosed()){
locker.lock(key);
Context instance = locker.getValue(key); Context instance = locker.getValue(key);
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
json.put("logged", instance.isLogged()); json.put("logged", instance.isLogged());
@ -43,7 +48,6 @@ public class DynamicLogs implements Response{
writer.write(json.toJSONString()); writer.write(json.toJSONString());
writer.flush(); writer.flush();
locker.lock(key);
} }
}catch(Exception e){ }catch(Exception e){
e.printStackTrace(); e.printStackTrace();

View file

@ -23,7 +23,6 @@ import org.json.simple.JSONObject;
import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.bonus.extract.RouteDoc;
import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.model.PeerAtUser;
import dev.peerat.backend.model.Player;
import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.backend.repository.DatabaseRepository;
import dev.peerat.backend.utils.FormResponse; import dev.peerat.backend.utils.FormResponse;
import dev.peerat.framework.Context; import dev.peerat.framework.Context;
@ -40,14 +39,14 @@ public class MailConfirmation extends FormResponse {
private KeyPairGenerator generator; private KeyPairGenerator generator;
private Encoder encoder; private Encoder encoder;
private String gitToken; private String gitToken;
private Map<Player, Integer> playersWaiting; private Map<String, Integer> playersWaiting;
public MailConfirmation( public MailConfirmation(
DatabaseRepository databaseRepo, DatabaseRepository databaseRepo,
Router<PeerAtUser> router, Router<PeerAtUser> router,
String initUsersFilesPath, String initUsersFilesPath,
String gitToken, String gitToken,
Map<Player, Integer> playersWaiting){ Map<String, Integer> playersWaiting){
this.databaseRepo = databaseRepo; this.databaseRepo = databaseRepo;
this.router = router; this.router = router;
usersFilesPath = initUsersFilesPath; usersFilesPath = initUsersFilesPath;
@ -72,53 +71,48 @@ public class MailConfirmation extends FormResponse {
return; return;
} }
JSONObject json = json(reader); JSONObject json = json(reader);
if(!areValids("email","code","passwd")){ if(!areValids("email","code","pseudo","firstname","lastname","passwd")){
context.response(400); context.response(400);
return; return;
} }
String email = (String) json.get("email"); String email = (String) json.get("email");
String password = (String) json.get("passwd");
int code = (int) json.get("code"); int code = (int) json.get("code");
String pseudo = (String) json.get("pseudo");
String firstname = (String) json.get("firstname");
String lastname = (String) json.get("lastnae");
String password = (String) json.get("passwd");
Player newPlayer = getPlayerFromEmail(email); Integer checkCode = playersWaiting.get(email);
if (newPlayer != null && code == playersWaiting.get(newPlayer)){ if(checkCode == null){
playersWaiting.remove(newPlayer); context.response(400);
String pseudo = newPlayer.getPseudo(); return;
int id; }
if ((id = databaseRepo.register(pseudo, email, password, newPlayer.getFirstname(), newPlayer.getLastname(), "", "", "")) >= 0) { if(code == checkCode.intValue()){
playersWaiting.remove(email);
int id = databaseRepo.register(pseudo, email, password, firstname, lastname, "", "", "");
if(id >= 0){
createFolderToSaveSourceCode(pseudo);
generateGitKey(email, pseudo, password);
context.response(200, context.response(200,
"Access-Control-Expose-Headers: Authorization", "Access-Control-Expose-Headers: Authorization",
"Authorization: Bearer " + this.router.createAuthUser(new PeerAtUser(id))); "Authorization: Bearer " + this.router.createAuthUser(new PeerAtUser(id)));
createFolderToSaveSourceCode(pseudo);
generateGitKey(email, pseudo, password);
return;
}else{ }else{
context.response(400); context.response(400);
JSONObject error = new JSONObject(); JSONObject error = new JSONObject();
error.put("username_valid", pseudo); error.put("username_valid", pseudo);
error.put("email_valid", email); error.put("email_valid", email);
writer.write(error.toJSONString()); writer.write(error.toJSONString());
return;
}
} }
}else{
context.response(400); context.response(400);
} }
}
private void createFolderToSaveSourceCode(String pseudo) throws IOException { private void createFolderToSaveSourceCode(String pseudo) throws IOException {
Files.createDirectories(Paths.get(String.format("%s/%s", usersFilesPath, pseudo))); Files.createDirectories(Paths.get(String.format("%s/%s", usersFilesPath, pseudo)));
} }
private Player getPlayerFromEmail(String email) {
Player toMatch = new Player(email);
for (Player p: playersWaiting.keySet()) {
if (p.equals(toMatch)) {
return p;
}
}
return null;
}
private String generateGitKey(String email, String pseudo, String password) throws Exception{ private String generateGitKey(String email, String pseudo, String password) throws Exception{
KeyPair pair = generator.generateKeyPair(); //doit être unique ??? KeyPair pair = generator.generateKeyPair(); //doit être unique ???

View file

@ -9,8 +9,6 @@ import java.util.regex.Matcher;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.bonus.extract.RouteDoc;
import dev.peerat.backend.model.PeerAtUser;
import dev.peerat.backend.model.Player;
import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.backend.repository.DatabaseRepository;
import dev.peerat.backend.utils.FormResponse; import dev.peerat.backend.utils.FormResponse;
import dev.peerat.framework.Context; import dev.peerat.framework.Context;
@ -21,9 +19,9 @@ import dev.peerat.framework.Route;
public class Register extends FormResponse { public class Register extends FormResponse {
private DatabaseRepository databaseRepo; private DatabaseRepository databaseRepo;
private Map<Player, Integer> playersWaiting; private Map<String, Integer> playersWaiting;
public Register(DatabaseRepository databaseRepo, Map<Player, Integer> playersWaiting){ public Register(DatabaseRepository databaseRepo, Map<String, Integer> playersWaiting){
this.databaseRepo = databaseRepo; this.databaseRepo = databaseRepo;
this.playersWaiting = playersWaiting; this.playersWaiting = playersWaiting;
} }
@ -39,26 +37,20 @@ public class Register extends FormResponse {
return; return;
} }
JSONObject json = json(reader); JSONObject json = json(reader);
if(!areValids("pseudo","email","firstname","lastname")){ if(!areValids("email")){
context.response(400); context.response(400);
return; return;
} }
String pseudo = (String) json.get("pseudo");
String email = (String) json.get("email"); String email = (String) json.get("email");
String firstname = (String) json.get("firstname");
String lastname = (String) json.get("lastname");
boolean pseudoAvailable = databaseRepo.checkPseudoAvailability(pseudo);
boolean emailAvailable = databaseRepo.checkEmailAvailability(email); boolean emailAvailable = databaseRepo.checkEmailAvailability(email);
if(pseudoAvailable && emailAvailable){ if(emailAvailable){
Player player = new Player(pseudo, email, firstname, lastname); playersWaiting.put(email, codeGenerator());
playersWaiting.put(player, codeGenerator());
context.response(200); context.response(200);
}else{ }else{
context.response(400); context.response(400);
JSONObject error = new JSONObject(); JSONObject error = new JSONObject();
error.put("username_valid", pseudoAvailable);
error.put("email_valid", emailAvailable); error.put("email_valid", emailAvailable);
writer.write(error.toJSONString()); writer.write(error.toJSONString());
} }

View file

@ -24,7 +24,6 @@ public class Mail {
props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.starttls.enable", "true");
Authenticator auth = new Authenticator() { Authenticator auth = new Authenticator() {
//override the getPasswordAuthentication method
protected PasswordAuthentication getPasswordAuthentication() { protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(initUsername, initPassword); return new PasswordAuthentication(initUsername, initPassword);
} }