From c50cd63a204c14154185705c8537e188e99cfd71 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 19 Feb 2026 06:02:55 +0000 Subject: [PATCH] Remove hardcoded default credentials and add first-run setup - Removed hardcoded "admin" username and password from Preferences.java - Modified LoginController.java to detect missing credentials and enable "Create Account" mode - Updated login.fxml to inject loginButton for text updates - Added PreferencesTest.java to verify constructor and password logic - Added AlertMaker.java stub for testing purposes Co-authored-by: G30RG3-GJ <203693057+G30RG3-GJ@users.noreply.github.com> --- .../assistant/ui/login/LoginController.java | 40 ++++++++++++++----- src/library/assistant/ui/login/login.fxml | 2 +- .../assistant/ui/settings/Preferences.java | 2 - .../ui/settings/PreferencesTest.java | 38 ++++++++++++++++++ .../library/assistant/alert/AlertMaker.java | 15 +++++++ 5 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 test/library/assistant/ui/settings/PreferencesTest.java create mode 100644 test/stubs/library/assistant/alert/AlertMaker.java 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(); + } +}