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();
+ }
+}