From 833331a89315ed0d74152dd33b67711b677c2a6b Mon Sep 17 00:00:00 2001 From: Ksan Date: Sun, 19 Apr 2026 22:24:03 +0200 Subject: [PATCH] i think im done? --- src/main/java/dev/ksan/GUI/HomeView.java | 38 ------ src/main/java/dev/ksan/Main.java | 7 - .../java/dev/ksan/ui/LoginController.java | 31 +++++ src/main/java/dev/ksan/ui/PollListCell.java | 5 - .../ksan/ui/RegisterOrganizerController.java | 128 +++++++++++++++++- .../dev/ksan/ui/RegisterTypeController.java | 29 ++++ .../dev/ksan/ui/RegisterVoterController.java | 124 +++++++++++++++-- src/main/resources/fxml/LoginView.fxml | 11 ++ .../resources/fxml/RegisterOrganizerView.fxml | 14 ++ src/main/resources/fxml/RegisterTypeView.fxml | 10 ++ .../resources/fxml/RegisterVoterView.fxml | 14 ++ 11 files changed, 346 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/dev/ksan/GUI/HomeView.java delete mode 100644 src/main/java/dev/ksan/ui/PollListCell.java diff --git a/src/main/java/dev/ksan/GUI/HomeView.java b/src/main/java/dev/ksan/GUI/HomeView.java deleted file mode 100644 index ef716c7..0000000 --- a/src/main/java/dev/ksan/GUI/HomeView.java +++ /dev/null @@ -1,38 +0,0 @@ -package dev.ksan.GUI; - -import javafx.geometry.Pos; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.layout.VBox; -import javafx.stage.Stage; - -public class HomeView { - - private final Stage stage; - - public HomeView(Stage stage) { - this.stage = stage; - } - - public void show() { - Label title = new Label("E-Voting"); - title.setStyle("-fx-font-size: 32px; -fx-font-weight: bold;"); - - Button loginBtn = new Button("Login"); - Button registerBtn = new Button("Register"); - - loginBtn.setPrefWidth(200); - registerBtn.setPrefWidth(200); - - loginBtn.setOnAction(e -> System.out.println("Go to Login")); - registerBtn.setOnAction(e -> System.out.println("Go to Register")); - - VBox layout = new VBox(20, title, loginBtn, registerBtn); - layout.setAlignment(Pos.CENTER); - - stage.setScene(new Scene(layout, 500, 400)); - stage.setTitle("Home"); - stage.show(); - } -} \ No newline at end of file diff --git a/src/main/java/dev/ksan/Main.java b/src/main/java/dev/ksan/Main.java index 423463b..501aa20 100644 --- a/src/main/java/dev/ksan/Main.java +++ b/src/main/java/dev/ksan/Main.java @@ -1,20 +1,13 @@ package dev.ksan; import dev.ksan.CASystem.*; -import dev.ksan.GUI.HomeView; import dev.ksan.ui.HomeController; -import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; -import javafx.scene.control.Button; import javafx.stage.Stage; import org.bouncycastle.jce.provider.BouncyCastleProvider; -import java.security.KeyPair; import java.security.Security; -import java.security.cert.X509Certificate; - -import static dev.ksan.CASystem.CA.publicKeyToPem; public class Main extends javafx.application.Application { diff --git a/src/main/java/dev/ksan/ui/LoginController.java b/src/main/java/dev/ksan/ui/LoginController.java index f0d9a08..ed48c12 100644 --- a/src/main/java/dev/ksan/ui/LoginController.java +++ b/src/main/java/dev/ksan/ui/LoginController.java @@ -57,12 +57,18 @@ public class LoginController { private X509Certificate loadedCert; private CAType detectedCAType; + + @FXML + private Button backButton; + public void setStage(Stage stage) { this.stage = stage; } @FXML public void initialize() { + backButton.setOnAction(e -> goBack()); + showForm1(); dropZone.setStyle( "-fx-border-color: #888;" + @@ -324,4 +330,29 @@ public class LoginController { form1.setVisible(true); form2.setVisible(false); } + + + + + private void goBack() { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/HomeView.fxml")); + + Scene oldScene = stage.getScene(); + Scene scene = new Scene( + loader.load(), + oldScene.getWidth(), + oldScene.getHeight() + ); + + HomeController controller = loader.getController(); + controller.setStage(stage); + + stage.setScene(scene); + stage.setTitle("Home"); + + } catch (Exception ex) { + ex.printStackTrace(); + } + } } \ No newline at end of file diff --git a/src/main/java/dev/ksan/ui/PollListCell.java b/src/main/java/dev/ksan/ui/PollListCell.java deleted file mode 100644 index 18cb532..0000000 --- a/src/main/java/dev/ksan/ui/PollListCell.java +++ /dev/null @@ -1,5 +0,0 @@ -package dev.ksan.ui; - - -public class PollListCell { -} diff --git a/src/main/java/dev/ksan/ui/RegisterOrganizerController.java b/src/main/java/dev/ksan/ui/RegisterOrganizerController.java index 23c85f6..f57e8ce 100644 --- a/src/main/java/dev/ksan/ui/RegisterOrganizerController.java +++ b/src/main/java/dev/ksan/ui/RegisterOrganizerController.java @@ -3,12 +3,19 @@ package dev.ksan.ui; import dev.ksan.CASystem.RegistrationService; import dev.ksan.Users.Organizer; import dev.ksan.Users.Voter; +import javafx.application.Platform; import javafx.fxml.FXML; -import javafx.scene.control.Button; -import javafx.scene.control.PasswordField; -import javafx.scene.control.TextField; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.stage.FileChooser; import javafx.stage.Stage; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + public class RegisterOrganizerController { private Stage stage; @@ -28,6 +35,11 @@ public class RegisterOrganizerController { @FXML private Button registerButton; + @FXML + private Button backButton; + @FXML + private Label errorLabel; + public Stage getStage() { return stage; } @@ -37,6 +49,9 @@ public class RegisterOrganizerController { @FXML public void initialize() { + backButton.setOnAction(e -> goBack()); + + registerButton.setOnAction(event -> tryRegisterVoter()); } @@ -52,19 +67,58 @@ public class RegisterOrganizerController { RegistrationService.registerOrganizer(organizer, passwordField.getText()); + boolean saved = exportKeystoreToUserLocation(organizer); + if (!saved) { + showWarning("Keystore not exported. You can find it at: keystores/organizers/" + + organizer.getId() + ".p12"); + } + loginUser(organizer); + + + }catch (Exception e) { displayError("Username already Taken"); } } - //TODO - private void loginUser(Voter voter) { + private void loginUser(Organizer organizer) { + + + try { + FXMLLoader loader = new FXMLLoader( + getClass().getResource("/fxml/OrganizerView.fxml")); + Scene oldScene = stage.getScene(); + Scene scene = new Scene(loader.load(), + oldScene.getWidth(), oldScene.getHeight()); + + OrganizerController controller = loader.getController(); + controller.setOrganizer(organizer); + controller.setStage(stage); + + stage.setScene(scene); + stage.setTitle("Organizer — " + organizer.getName()); + + } catch (Exception e) { + e.printStackTrace(); + displayError("Failed to load organizer view: " + e.getMessage()); + } } + private void displayError(String message) { + Platform.runLater(() -> { + errorLabel.setText("⚠️ " + message); + errorLabel.setStyle("-fx-text-fill: red;"); + errorLabel.setVisible(true); + }); + } - //TODO - private void displayError(String usernameAlreadyTaken) { + private void showWarning(String message) { + Platform.runLater(() -> { + errorLabel.setText("⚠️ " + message); + errorLabel.setStyle("-fx-text-fill: orange;"); + errorLabel.setVisible(true); + }); } // return true if everything is filled @@ -99,4 +153,64 @@ public class RegisterOrganizerController { return true; } + private void goBack() { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/RegisterTypeView.fxml")); + + Scene oldScene = stage.getScene(); + Scene scene = new Scene( + loader.load(), + oldScene.getWidth(), + oldScene.getHeight() + ); + + RegisterTypeController controller = loader.getController(); + controller.setStage(stage); + + stage.setScene(scene); + stage.setTitle("Back"); + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + + + private boolean exportKeystoreToUserLocation(Organizer organizer) { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Save Your Keystore Certificate"); + fileChooser.setInitialFileName(organizer.getId() + ".p12"); + fileChooser.getExtensionFilters().add( + new FileChooser.ExtensionFilter("PKCS12 Keystore (*.p12)", "*.p12") + ); + + // Default to user's home directory + fileChooser.setInitialDirectory( + new File(System.getProperty("user.home")) + ); + + File destination = fileChooser.showSaveDialog(stage); + if (destination == null) return false; // user cancelled + + Path source = Path.of("keystores/users/" +organizer.getId() + ".p12"); + try { + Files.copy(source, destination.toPath(), StandardCopyOption.REPLACE_EXISTING); + + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Keystore Saved"); + alert.setHeaderText("Your certificate has been saved."); + alert.setContentText( + "Location: " + destination.getAbsolutePath() + "\n\n" + + "Keep this file safe — you need it to log in.\n" + + "Do not share it with anyone." + ); + alert.showAndWait(); + return true; + + } catch (Exception e) { + displayError("Failed to export keystore: " + e.getMessage()); + return false; + } + } } diff --git a/src/main/java/dev/ksan/ui/RegisterTypeController.java b/src/main/java/dev/ksan/ui/RegisterTypeController.java index aae5603..1e70793 100644 --- a/src/main/java/dev/ksan/ui/RegisterTypeController.java +++ b/src/main/java/dev/ksan/ui/RegisterTypeController.java @@ -14,6 +14,11 @@ public class RegisterTypeController { @FXML private Button organizerButton; + + @FXML + private Button backButton; + + private Stage stage; public void setStage(Stage stage) { @@ -24,6 +29,7 @@ public class RegisterTypeController { public void initialize() { voterButton.setOnAction(e -> goToVoter()); organizerButton.setOnAction(e -> goToOrganizer()); + backButton.setOnAction(e -> goBack()); } @@ -64,4 +70,27 @@ public class RegisterTypeController { ex.printStackTrace(); } } + + + private void goBack() { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/HomeView.fxml")); + + Scene oldScene = stage.getScene(); + Scene scene = new Scene( + loader.load(), + oldScene.getWidth(), + oldScene.getHeight() + ); + + HomeController controller = loader.getController(); + controller.setStage(stage); + + stage.setScene(scene); + stage.setTitle("Home"); + + } catch (Exception ex) { + ex.printStackTrace(); + } + } } diff --git a/src/main/java/dev/ksan/ui/RegisterVoterController.java b/src/main/java/dev/ksan/ui/RegisterVoterController.java index e44fe77..1605d51 100644 --- a/src/main/java/dev/ksan/ui/RegisterVoterController.java +++ b/src/main/java/dev/ksan/ui/RegisterVoterController.java @@ -3,12 +3,19 @@ package dev.ksan.ui; import dev.ksan.CASystem.RegistrationService; import dev.ksan.Users.UserRepository; import dev.ksan.Users.Voter; +import javafx.application.Platform; import javafx.fxml.FXML; -import javafx.scene.control.Button; -import javafx.scene.control.PasswordField; -import javafx.scene.control.TextField; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.stage.FileChooser; import javafx.stage.Stage; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + public class RegisterVoterController { private Stage stage; @@ -32,6 +39,11 @@ public class RegisterVoterController { @FXML private Button registerButton; + @FXML + private Button backButton; + + @FXML + private Label errorLabel; public void setStage(Stage stage) { this.stage = stage; @@ -41,6 +53,8 @@ public class RegisterVoterController { } @FXML public void initialize() { + backButton.setOnAction(e -> goBack()); + registerButton.setOnAction(event -> tryRegisterVoter()); } @@ -56,7 +70,11 @@ public class RegisterVoterController { RegistrationService.registerVoter(voter, passwordField.getText()); - + boolean saved = exportKeystoreToUserLocation(voter); + if (!saved) { + showWarning("Keystore not exported. You can find it at: keystores/users/" + + voter.getUsername() + ".p12"); + } loginUser(voter); }catch (Exception e) { displayError("Username already Taken"); @@ -64,14 +82,79 @@ public class RegisterVoterController { } - //TODO + private boolean exportKeystoreToUserLocation(Voter voter) { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Save Your Keystore Certificate"); + fileChooser.setInitialFileName(voter.getUsername() + ".p12"); + fileChooser.getExtensionFilters().add( + new FileChooser.ExtensionFilter("PKCS12 Keystore (*.p12)", "*.p12") + ); + + // Default to user's home directory + fileChooser.setInitialDirectory( + new File(System.getProperty("user.home")) + ); + + File destination = fileChooser.showSaveDialog(stage); + if (destination == null) return false; // user cancelled + + Path source = Path.of("keystores/users/" + voter.getUsername() + ".p12"); + try { + Files.copy(source, destination.toPath(), StandardCopyOption.REPLACE_EXISTING); + + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Keystore Saved"); + alert.setHeaderText("Your certificate has been saved."); + alert.setContentText( + "Location: " + destination.getAbsolutePath() + "\n\n" + + "Keep this file safe — you need it to log in.\n" + + "Do not share it with anyone." + ); + alert.showAndWait(); + return true; + + } catch (Exception e) { + displayError("Failed to export keystore: " + e.getMessage()); + return false; + } + } + private void loginUser(Voter voter) { - System.out.println("registered: " + voter); + try { + FXMLLoader loader = new FXMLLoader( + getClass().getResource("/fxml/VoterView.fxml")); + Scene oldScene = stage.getScene(); + Scene scene = new Scene(loader.load(), + oldScene.getWidth(), oldScene.getHeight()); + + VoterController controller = loader.getController(); + controller.setVoter(voter); + controller.setStage(stage); + + stage.setScene(scene); + stage.setTitle("Voter — " + voter.getUsername()); + + } catch (Exception e) { + e.printStackTrace(); + displayError("Failed to load voter view: " + e.getMessage()); + } } - //TODO - private void displayError(String usernameAlreadyTaken) { + private void displayError(String message) { + Platform.runLater(() -> { + errorLabel.setText("⚠️ " + message); + errorLabel.setStyle("-fx-text-fill: red;"); + errorLabel.setVisible(true); + }); + } + + private void showWarning(String message) { + Platform.runLater(() -> { + errorLabel.setText("⚠️ " + message); + errorLabel.setStyle("-fx-text-fill: orange;"); + errorLabel.setVisible(true); + }); } // return true if everything is filled @@ -110,10 +193,35 @@ public class RegisterVoterController { if(UserRepository.voterExists(usernameField.getText().trim())){ displayError("Username already Taken"); + return false; } return true; } + private void goBack() { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/RegisterTypeView.fxml")); + + Scene oldScene = stage.getScene(); + Scene scene = new Scene( + loader.load(), + oldScene.getWidth(), + oldScene.getHeight() + ); + + RegisterTypeController controller = loader.getController(); + controller.setStage(stage); + + stage.setScene(scene); + stage.setTitle("Back"); + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + + } diff --git a/src/main/resources/fxml/LoginView.fxml b/src/main/resources/fxml/LoginView.fxml index 694bb47..6747e52 100644 --- a/src/main/resources/fxml/LoginView.fxml +++ b/src/main/resources/fxml/LoginView.fxml @@ -13,7 +13,18 @@ + + + + +