From bbc752500a0815ed4b793dde83b90346f01eed0e Mon Sep 17 00:00:00 2001 From: TheNagaki Date: Tue, 14 Feb 2023 23:16:22 +0100 Subject: [PATCH 1/3] Added the /login and /register routes --- password4j-1.6.3.jar | Bin 0 -> 79878 bytes .../peeratcode/repository/DatabaseRepo.java | 8 ++- .../peeratcode/routes/Login.java | 39 ++++++++++++ .../peeratcode/routes/Register.java | 60 ++++++++++++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 password4j-1.6.3.jar create mode 100644 src/be/jeffcheasey88/peeratcode/routes/Login.java create mode 100644 src/be/jeffcheasey88/peeratcode/routes/Register.java diff --git a/password4j-1.6.3.jar b/password4j-1.6.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..42545637f1ac7f546b0412168a5338edfa70e0c3 GIT binary patch literal 79878 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

^&AfaG9%| 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 b_d641xjVr68Ug|x@WTa+2Xz1n0pb4v45Tl% literal 0 HcmV?d00001 diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java index 5465732..c539641 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java @@ -2,6 +2,8 @@ package be.jeffcheasey88.peeratcode.repository; import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Puzzle; +import com.password4j.Hash; +import com.password4j.Password; import java.sql.Connection; import java.sql.PreparedStatement; @@ -14,7 +16,11 @@ public class DatabaseRepo { private static final String SPECIFIC_PUZZLE_QUERY = "SELECT * FROM puzzle WHERE id_puzzle = ?"; private static final String SPECIFIC_CHAPTER_QUERY = "SELECT * FROM chapter WHERE id_chapter = ?"; private static final String PUZZLES_IN_CHAPTER_QUERY = "SELECT * FROM puzzle WHERE fk_chapter = ?"; - public static final String ALL_CHAPTERS_QUERY = "SELECT * FROM chapter"; + private static final String ALL_CHAPTERS_QUERY = "SELECT * FROM chapter"; + private static final String CHECK_PSEUDO_AVAILABLE_QUERY = "SELECT * FROM user WHERE pseudo = ?"; + private static final String CHECK_EMAIL_AVAILABLE_QUERY = "SELECT * FROM user WHERE email = ?"; + private static final String REGISTER_QUERY = "INSERT INTO user (pseudo, email, passwd, firstname, lastname, description, `group`, avatar) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + private static final String PASSWORD_FOR_EMAIL_QUERY = "SELECT passwd FROM user WHERE pseudo = ?"; private final Connection con; public DatabaseRepo(Connection con) { diff --git a/src/be/jeffcheasey88/peeratcode/routes/Login.java b/src/be/jeffcheasey88/peeratcode/routes/Login.java new file mode 100644 index 0000000..bd4babd --- /dev/null +++ b/src/be/jeffcheasey88/peeratcode/routes/Login.java @@ -0,0 +1,39 @@ +package be.jeffcheasey88.peeratcode.routes; + +import be.jeffcheasey88.peeratcode.repository.DatabaseRepo; +import be.jeffcheasey88.peeratcode.webserver.HttpReader; +import be.jeffcheasey88.peeratcode.webserver.HttpUtil; +import be.jeffcheasey88.peeratcode.webserver.HttpWriter; +import be.jeffcheasey88.peeratcode.webserver.Response; +import org.json.simple.JSONObject; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Login implements Response { + private final DatabaseRepo databaseRepo; + + public Login(DatabaseRepo databaseRepo) { + this.databaseRepo = databaseRepo; + } + @Override + public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception { + HttpUtil.skipHeaders(reader); + JSONObject informations = (JSONObject) HttpUtil.readJson(reader); + if (informations != null) { + String pseudo = (String) informations.get("pseudo"); + String password = (String) informations.get("passwd"); + boolean wellLogged = databaseRepo.login(pseudo, password); + if (!wellLogged) { + HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); + } else { + HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); + } + } + } + + @Override + public Pattern getPattern() { + return Pattern.compile("^\\/login$"); + } +} diff --git a/src/be/jeffcheasey88/peeratcode/routes/Register.java b/src/be/jeffcheasey88/peeratcode/routes/Register.java new file mode 100644 index 0000000..1341a2c --- /dev/null +++ b/src/be/jeffcheasey88/peeratcode/routes/Register.java @@ -0,0 +1,60 @@ +package be.jeffcheasey88.peeratcode.routes; + +import be.jeffcheasey88.peeratcode.repository.DatabaseRepo; +import be.jeffcheasey88.peeratcode.webserver.HttpReader; +import be.jeffcheasey88.peeratcode.webserver.HttpUtil; +import be.jeffcheasey88.peeratcode.webserver.HttpWriter; +import be.jeffcheasey88.peeratcode.webserver.Response; +import org.json.simple.JSONObject; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Register implements Response { + + private final DatabaseRepo databaseRepo; + + public Register(DatabaseRepo databaseRepo) { + this.databaseRepo = databaseRepo; + } + + @Override + public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception { + HttpUtil.skipHeaders(reader); + JSONObject informations = (JSONObject) HttpUtil.readJson(reader); + if (informations != null) { + String pseudo = (String) informations.get("pseudo"); + String email = (String) informations.get("email"); + String password = (String) informations.get("passwd"); + String firstname = (String) informations.get("firstname"); + String lastname = (String) informations.get("lastname"); + String description = (String) informations.get("description"); + String group = (String) informations.get("group"); + String avatar = (String) informations.get("avatar"); + + boolean pseudoAvailable = databaseRepo.checkPseudoAvailability(pseudo); + boolean emailAvailable = databaseRepo.checkEmailAvailability(email); + if (pseudoAvailable && emailAvailable) { + boolean wellRegistered = databaseRepo.register(pseudo, email, password, firstname, lastname, description, group, avatar); + if (!wellRegistered) { + HttpUtil.responseHeaders(writer, 400, "Access-Control-Allow-Origin: *"); + writer.write("Error while registering"); + } else { + HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); + writer.write("OK"); + } + } else { + HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); + JSONObject error = new JSONObject(); + error.put("username_valid", pseudoAvailable); + error.put("email_valid", emailAvailable); + writer.write(error.toJSONString()); + } + } + } + + @Override + public Pattern getPattern() { + return Pattern.compile("^\\/register$"); + } +} From 209b0eeeb49041ebd680f901db686c42f29f8c01 Mon Sep 17 00:00:00 2001 From: TheNagaki Date: Tue, 14 Feb 2023 23:21:26 +0100 Subject: [PATCH 2/3] Added the /login and /register routes (part where I actually submit the database requests) --- .../peeratcode/repository/DatabaseRepo.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java index c539641..cf2a2a0 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java @@ -110,4 +110,91 @@ public class DatabaseRepo { } return null; } + + /** + * Check if a pseudo is available + * + * @param pseudo The pseudo to check + * @return True if the pseudo is available, false if it's already taken + */ + public boolean checkPseudoAvailability(String pseudo) { + return checkAvailability(pseudo, CHECK_PSEUDO_AVAILABLE_QUERY); + } + + /** + * Check if an email is available + * + * @param email The email to check + * @return True if the email is available, false if it's already taken + */ + public boolean checkEmailAvailability(String email) { + return checkAvailability(email, CHECK_EMAIL_AVAILABLE_QUERY); + } + + private boolean checkAvailability(String queriedString, String correspondingQuery) { + try { + PreparedStatement statement = con.prepareStatement(correspondingQuery); + statement.setString(1, queriedString); + ResultSet result = statement.executeQuery(); + return !result.next(); + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + + /** + * Register a new user + * + * @param pseudo The pseudo of the user + * @param email The email of the user + * @param password The password of the user + * @param firstname The firstname of the user + * @param lastname The lastname of the user + * @param description The description of the user + * @param group The group of the user + * @param avatar The avatar of the user + * @return True if the user was registered, false if an error occurred + */ + public boolean register(String pseudo, String email, String password, String firstname, String lastname, String description, String group, String avatar) { + Hash hash = Password.hash(password).withArgon2(); + try { + PreparedStatement statement = con.prepareStatement(REGISTER_QUERY); + statement.setString(1, pseudo); + statement.setString(2, email); + statement.setString(3, hash.toString()); + statement.setString(4, firstname); + statement.setString(5, lastname); + statement.setString(6, description); + statement.setString(7, group); + statement.setString(8, avatar); + return statement.executeUpdate() == 1; + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + + /** + * Login a user + * + * @param email The email of the user + * @param password The password of the user + * @return True if the user's information are correct, false otherwise (or if an error occurred) + */ + public boolean login(String email, String password) { + try { + PreparedStatement statement = con.prepareStatement(PASSWORD_FOR_EMAIL_QUERY); + statement.setString(1, email); + statement.setString(2, password); + ResultSet result = statement.executeQuery(); + if (result.next()) { + String hashedPassword = result.getString("passwd"); + return Password.check(password, hashedPassword).withArgon2(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } } \ No newline at end of file From 1907173db527bf383a8d6965e7e069c68c91d0d8 Mon Sep 17 00:00:00 2001 From: TheNagaki Date: Tue, 14 Feb 2023 23:34:13 +0100 Subject: [PATCH 3/3] Updated /register route with the new field in the database, updated DatabaseRepo for the same reason --- .../peeratcode/repository/DatabaseRepo.java | 8 ++++---- src/be/jeffcheasey88/peeratcode/routes/Register.java | 10 +++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java index cf2a2a0..c0b01a9 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepo.java @@ -19,7 +19,7 @@ public class DatabaseRepo { private static final String ALL_CHAPTERS_QUERY = "SELECT * FROM chapter"; private static final String CHECK_PSEUDO_AVAILABLE_QUERY = "SELECT * FROM user WHERE pseudo = ?"; private static final String CHECK_EMAIL_AVAILABLE_QUERY = "SELECT * FROM user WHERE email = ?"; - private static final String REGISTER_QUERY = "INSERT INTO user (pseudo, email, passwd, firstname, lastname, description, `group`, avatar) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + private static final String REGISTER_QUERY = "INSERT INTO user (pseudo, email, passwd, firstname, lastname, description, sgroup, avatar) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; private static final String PASSWORD_FOR_EMAIL_QUERY = "SELECT passwd FROM user WHERE pseudo = ?"; private final Connection con; @@ -152,11 +152,11 @@ public class DatabaseRepo { * @param firstname The firstname of the user * @param lastname The lastname of the user * @param description The description of the user - * @param group The group of the user + * @param sgroup The group of the user * @param avatar The avatar of the user * @return True if the user was registered, false if an error occurred */ - public boolean register(String pseudo, String email, String password, String firstname, String lastname, String description, String group, String avatar) { + public boolean register(String pseudo, String email, String password, String firstname, String lastname, String description, String sgroup, String avatar) { Hash hash = Password.hash(password).withArgon2(); try { PreparedStatement statement = con.prepareStatement(REGISTER_QUERY); @@ -166,7 +166,7 @@ public class DatabaseRepo { statement.setString(4, firstname); statement.setString(5, lastname); statement.setString(6, description); - statement.setString(7, group); + statement.setString(7, sgroup); statement.setString(8, avatar); return statement.executeUpdate() == 1; } catch (SQLException e) { diff --git a/src/be/jeffcheasey88/peeratcode/routes/Register.java b/src/be/jeffcheasey88/peeratcode/routes/Register.java index 1341a2c..a6a575e 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Register.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Register.java @@ -23,13 +23,21 @@ public class Register implements Response { HttpUtil.skipHeaders(reader); JSONObject informations = (JSONObject) HttpUtil.readJson(reader); if (informations != null) { + boolean allFieldsFilled = informations.containsKey("pseudo") && informations.containsKey("email") + && informations.containsKey("passwd") && informations.containsKey("firstname") + && informations.containsKey("lastname") && informations.containsKey("description") + && informations.containsKey("sgroup") && informations.containsKey("avatar"); + if (!allFieldsFilled) { + HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); + return; + } String pseudo = (String) informations.get("pseudo"); String email = (String) informations.get("email"); String password = (String) informations.get("passwd"); String firstname = (String) informations.get("firstname"); String lastname = (String) informations.get("lastname"); String description = (String) informations.get("description"); - String group = (String) informations.get("group"); + String group = (String) informations.get("sgroup"); String avatar = (String) informations.get("avatar"); boolean pseudoAvailable = databaseRepo.checkPseudoAvailability(pseudo);