diff --git a/src/main/java/sk/kasv/lisivka/bootcamp/ChangingUserPassword.java b/src/main/java/sk/kasv/lisivka/bootcamp/ChangingUserPassword.java new file mode 100644 index 0000000000000000000000000000000000000000..b94455e48d5099523b82c2646ac662f85b44b321 --- /dev/null +++ b/src/main/java/sk/kasv/lisivka/bootcamp/ChangingUserPassword.java @@ -0,0 +1,32 @@ +package sk.kasv.lisivka.bootcamp; + +import java.util.regex.Pattern; + +public class ChangingUserPassword { + public boolean isStrongPassword(String pass) { + if (pass == null || pass.isEmpty()) { + return false; + } + + if (pass.length() < 8) { + return false; + } + + if (!Pattern.compile("[a-z]").matcher(pass).find()) { + return false; + } + + if (!Pattern.compile("[A-Z]").matcher(pass).find()) { + return false; + } + + if (!Pattern.compile("[0-9]").matcher(pass).find()) { + return false; + } + + if (!Pattern.compile("[^a-zA-Z0-9]").matcher(pass).find()) { + return false; + } + return true; + } +} \ No newline at end of file diff --git a/src/main/java/sk/kasv/lisivka/bootcamp/JSON/JsonWriter.java b/src/main/java/sk/kasv/lisivka/bootcamp/JSON/JsonWriter.java index e06012cb175ad5322f8eefe5e8b991e7e7cc9b88..6a9273e967e352a196e88552e7628bf4df1c9007 100644 --- a/src/main/java/sk/kasv/lisivka/bootcamp/JSON/JsonWriter.java +++ b/src/main/java/sk/kasv/lisivka/bootcamp/JSON/JsonWriter.java @@ -74,4 +74,28 @@ public class JsonWriter { object.put("error", "wrong user id or new last name"); return object; } + + public static JSONObject wrongPassword() { + JSONObject object = new JSONObject(); + object.put("error", "wrong old password"); + return object; + } + + public static JSONObject passwordsEqual() { + JSONObject object = new JSONObject(); + object.put("error", "New password is equal as old password"); + return object; + } + + public static JSONObject weakPassword() { + JSONObject object = new JSONObject(); + object.put("error", "weak password (Password has to be at least 8 characters long, contain one capital letter, one small letter, one number and one special character)"); + return object; + } + + public static JSONObject wrongUsername() { + JSONObject object = new JSONObject(); + object.put("error", "wrong username"); + return object; + } } \ No newline at end of file diff --git a/src/main/java/sk/kasv/lisivka/bootcamp/controller/test/MainController.java b/src/main/java/sk/kasv/lisivka/bootcamp/controller/test/MainController.java index b8af6bdb8ff185ff1a2c791b20f6820086f5cf9d..28739c032518d2fa7a43864299d7c01bc0d6e35a 100644 --- a/src/main/java/sk/kasv/lisivka/bootcamp/controller/test/MainController.java +++ b/src/main/java/sk/kasv/lisivka/bootcamp/controller/test/MainController.java @@ -1,17 +1,22 @@ package sk.kasv.lisivka.bootcamp.controller.test; import com.fasterxml.jackson.core.JsonProcessingException; +import jakarta.websocket.server.PathParam; +import net.minidev.json.JSONObject; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import sk.kasv.lisivka.bootcamp.ChangingUserPassword; import sk.kasv.lisivka.bootcamp.JSON.JsonWriter; import sk.kasv.lisivka.bootcamp.Tokens; import sk.kasv.lisivka.bootcamp.database.MariaDB; +import sk.kasv.lisivka.bootcamp.model.ChangePasswordModel; import sk.kasv.lisivka.bootcamp.model.LoginData; import sk.kasv.lisivka.bootcamp.model.NewStudentModel; import java.sql.SQLException; +import java.util.Objects; @RestController public class MainController { @@ -59,7 +64,7 @@ public class MainController { } @PostMapping(value = "/user/new") - public ResponseEntity<?> newUser(@RequestBody NewStudentModel newStudentModel) throws SQLException { + public ResponseEntity<JSONObject> newUser(@RequestBody NewStudentModel newStudentModel) throws SQLException { if (toker.isTokenValid(newStudentModel.getToken())) { boolean createdStudent = mariaDB.InsertStudent(newStudentModel.getFirstName(), newStudentModel.getLastName(), newStudentModel.getDateOfBirth()); if (createdStudent) { @@ -75,7 +80,7 @@ public class MainController { } @DeleteMapping(value = "/user/delete/{id}") - public ResponseEntity<?> deleteUser(@PathVariable int id, @RequestBody LoginData loginData) { + public ResponseEntity<JSONObject> deleteUser(@PathVariable int id, @RequestBody LoginData loginData) { if (toker.isTokenValid(loginData.getToken())) { try { boolean deletedStudent = mariaDB.DeleteStudent(id); @@ -96,7 +101,7 @@ public class MainController { } @PutMapping(value = "/user/update/{id}") - public ResponseEntity<?> updateUser(@PathVariable int id, @RequestBody NewStudentModel newStudentModel) { + public ResponseEntity<JSONObject> updateUser(@PathVariable int id, @RequestBody NewStudentModel newStudentModel) { if (newStudentModel.getToken() == null) { return ResponseEntity.status(400).body(JsonWriter.missingToken()); } @@ -118,4 +123,37 @@ public class MainController { return ResponseEntity.status(401).body(JsonWriter.wrongToken()); } } + + @PutMapping(value = "/admin/password?username") + public ResponseEntity<JSONObject> changeUserPassword(@RequestParam("username") String username, ChangePasswordModel changePasswordModel) throws SQLException { + LoginData loginData = new LoginData(); + ChangingUserPassword changingUserPassword = new ChangingUserPassword(); + AuthenticationAPI authenticationAPI = new AuthenticationAPI(); + if (changePasswordModel.getNew_password() == null || changePasswordModel.getOld_password() == null) { + return ResponseEntity.status(400).body(JsonWriter.wrongInputData()); + } + if (!toker.isTokenValid(changePasswordModel.getToken())) { + return ResponseEntity.status(401).body(JsonWriter.wrongToken()); + } + if (!Objects.equals(changePasswordModel.getOld_password(), loginData.getPassword())) { + return ResponseEntity.status(401).body(JsonWriter.wrongPassword()); + } + if (toker.isTokenValid(changePasswordModel.getToken()) && changePasswordModel.getOld_password().equals(loginData.getPassword()) && username.equals(loginData.getUserName())) { + if (changePasswordModel.getOld_password().equals(changePasswordModel.getNew_password())) { + return ResponseEntity.status(400).body(JsonWriter.passwordsEqual()); + } + if (changingUserPassword.isStrongPassword(changePasswordModel.getNew_password())) { + boolean changePassword = mariaDB.UpdateUser(changePasswordModel.getNew_password(), username); + if (changePassword) { + authenticationAPI.logout(loginData); + return ResponseEntity.ok().body(JsonWriter.emptyJson()); + } else { + return ResponseEntity.status(400).body(JsonWriter.wrongUsername()); + } + } else { + return ResponseEntity.status(400).body(JsonWriter.weakPassword()); + } + } + return null; + } } \ No newline at end of file diff --git a/src/main/java/sk/kasv/lisivka/bootcamp/database/MariaDB.java b/src/main/java/sk/kasv/lisivka/bootcamp/database/MariaDB.java index 701dea3ed83b52ca43965ff80ac6efa639e1f9fc..3e3919efc8c5fd8386d650c7de9882ae8837ef0b 100644 --- a/src/main/java/sk/kasv/lisivka/bootcamp/database/MariaDB.java +++ b/src/main/java/sk/kasv/lisivka/bootcamp/database/MariaDB.java @@ -21,6 +21,7 @@ public class MariaDB { private static final String DELETE_STUDENT = "DELETE FROM students WHERE id = ?"; private static final String INSERT_STUDENT = "INSERT INTO students (first_name, last_name, dob) VALUES (?, ?, ?)"; private static final String UPDATE_STUDENT = "UPDATE students SET last_name = ? WHERE id = ?"; + private static final String UPDATE_USER = "UPDATE users SET password = ? WHERE username = ?"; public static void main(String[] args) { try { @@ -211,4 +212,16 @@ public class MariaDB { } return result != 0; } + + public boolean UpdateUser(String password, String username) throws SQLException { + Connection connection = connection(); + int result = 0; + PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_USER); + preparedStatement.setString(1, password); + preparedStatement.setString(2, username); + result = preparedStatement.executeUpdate(); + System.out.println("Update user result:" + result); + connection.close(); + return result != 0; + } } \ No newline at end of file diff --git a/src/main/java/sk/kasv/lisivka/bootcamp/model/ChangePasswordModel.java b/src/main/java/sk/kasv/lisivka/bootcamp/model/ChangePasswordModel.java new file mode 100644 index 0000000000000000000000000000000000000000..979f9e3fe5fa61f441b1c0d614e6a81db3b2a72b --- /dev/null +++ b/src/main/java/sk/kasv/lisivka/bootcamp/model/ChangePasswordModel.java @@ -0,0 +1,19 @@ +package sk.kasv.lisivka.bootcamp.model; + +public class ChangePasswordModel { + String old_password; + String new_password; + String token; + + public String getOld_password() { + return old_password; + } + + public String getNew_password() { + return new_password; + } + + public String getToken() { + return token; + } +} \ No newline at end of file