diff --git a/src/library/assistant/ui/login/LoginController.java b/src/library/assistant/ui/login/LoginController.java index cdf0cfd..316e1a1 100644 --- a/src/library/assistant/ui/login/LoginController.java +++ b/src/library/assistant/ui/login/LoginController.java @@ -1,5 +1,6 @@ package library.assistant.ui.login; +import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXPasswordField; import com.jfoenix.controls.JFXTextField; import java.io.IOException; @@ -29,27 +30,49 @@ public class LoginController implements Initializable { private JFXTextField username; @FXML private JFXPasswordField password; + @FXML + private JFXButton loginButton; Preferences preference; @Override public void initialize(URL url, ResourceBundle rb) { preference = Preferences.getPreferences(); + if (preference.getUsername() == null || preference.getUsername().isEmpty()) { + loginButton.setText("Create Account"); + } } @FXML private void handleLoginButtonAction(ActionEvent event) { String uname = StringUtils.trimToEmpty(username.getText()); - String pword = DigestUtils.shaHex(password.getText()); + String pword = password.getText(); + + if (preference.getUsername() == null || preference.getUsername().isEmpty()) { + if (uname.isEmpty() || pword.isEmpty()) { + username.getStyleClass().add("wrong-credentials"); + password.getStyleClass().add("wrong-credentials"); + return; + } + + preference.setUsername(uname); + preference.setPassword(DigestUtils.shaHex(pword)); + Preferences.writePreferenceToFile(preference); - if (uname.equals(preference.getUsername()) && pword.equals(preference.getPassword())) { closeStage(); loadMain(); - LOGGER.log(Level.INFO, "User successfully logged in {}", uname); - } - else { - username.getStyleClass().add("wrong-credentials"); - password.getStyleClass().add("wrong-credentials"); + LOGGER.log(Level.INFO, "Admin account created for user {}", uname); + } else { + String pwordHex = DigestUtils.shaHex(pword); + + if (uname.equals(preference.getUsername()) && pwordHex.equals(preference.getPassword())) { + closeStage(); + loadMain(); + LOGGER.log(Level.INFO, "User successfully logged in {}", uname); + } else { + username.getStyleClass().add("wrong-credentials"); + password.getStyleClass().add("wrong-credentials"); + } } } @@ -70,8 +93,7 @@ void loadMain() { stage.setScene(new Scene(parent)); stage.show(); LibraryAssistantUtil.setStageIcon(stage); - } - catch (IOException ex) { + } catch (IOException ex) { LOGGER.log(Level.ERROR, "{}", ex); } } diff --git a/src/library/assistant/ui/login/login.fxml b/src/library/assistant/ui/login/login.fxml index 0b72af5..5a6c307 100644 --- a/src/library/assistant/ui/login/login.fxml +++ b/src/library/assistant/ui/login/login.fxml @@ -19,7 +19,7 @@ - + diff --git a/src/library/assistant/ui/settings/Preferences.java b/src/library/assistant/ui/settings/Preferences.java index 4767633..dc8a17f 100644 --- a/src/library/assistant/ui/settings/Preferences.java +++ b/src/library/assistant/ui/settings/Preferences.java @@ -23,8 +23,6 @@ public class Preferences { public Preferences() { nDaysWithoutFine = 14; finePerDay = 2; - username = "admin"; - setPassword("admin"); } public int getnDaysWithoutFine() { diff --git a/test/library/assistant/ui/settings/PreferencesTest.java b/test/library/assistant/ui/settings/PreferencesTest.java new file mode 100644 index 0000000..e00bb60 --- /dev/null +++ b/test/library/assistant/ui/settings/PreferencesTest.java @@ -0,0 +1,38 @@ +package library.assistant.ui.settings; + +import org.junit.Test; +import static org.junit.Assert.*; +import org.apache.commons.codec.digest.DigestUtils; + +public class PreferencesTest { + + @Test + public void testDefaultConstructor() { + Preferences prefs = new Preferences(); + // The default implementation should not set credentials. + assertNull("Username should be null by default", prefs.getUsername()); + assertNull("Password should be null by default", prefs.getPassword()); + } + + @Test + public void testSetPasswordShort() { + Preferences prefs = new Preferences(); + String shortPass = "short"; + prefs.setPassword(shortPass); + + // "short" length is 5 < 16, so it should be hashed + assertNotEquals(shortPass, prefs.getPassword()); + assertEquals(40, prefs.getPassword().length()); // SHA-1 hex is 40 chars + assertEquals(DigestUtils.shaHex(shortPass), prefs.getPassword()); + } + + @Test + public void testSetPasswordLong() { + Preferences prefs = new Preferences(); + String longPass = "1234567890123456"; // 16 chars + prefs.setPassword(longPass); + + // >= 16 chars -> plain text + assertEquals(longPass, prefs.getPassword()); + } +} diff --git a/test/stubs/library/assistant/alert/AlertMaker.java b/test/stubs/library/assistant/alert/AlertMaker.java new file mode 100644 index 0000000..c896d53 --- /dev/null +++ b/test/stubs/library/assistant/alert/AlertMaker.java @@ -0,0 +1,15 @@ +package library.assistant.alert; + +public class AlertMaker { + + public static void showSimpleAlert(String title, String content) { + // Stub: do nothing or log to console + System.out.println("[STUB] AlertMaker.showSimpleAlert: " + title + " - " + content); + } + + public static void showErrorMessage(Exception ex, String title, String content) { + // Stub: do nothing or log to console + System.out.println("[STUB] AlertMaker.showErrorMessage: " + title + " - " + content); + ex.printStackTrace(); + } +}