Chore/conform ui to checkstyle #184

Merged
jona.walpert merged 5 commits from chore/conform-ui-to-checkstyle into main 2026-03-14 18:21:28 +01:00
9 changed files with 224 additions and 250 deletions
Showing only changes of commit a15a0a0044 - Show all commits
@@ -2,24 +2,14 @@ package ch.unibas.dmi.dbis.cs108.casono;
import ch.unibas.dmi.dbis.cs108.casono.client.ClientApp; import ch.unibas.dmi.dbis.cs108.casono.client.ClientApp;
import ch.unibas.dmi.dbis.cs108.casono.server.ServerApp; import ch.unibas.dmi.dbis.cs108.casono.server.ServerApp;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/** /** Main entry point for Casono application. Handles client and server startup. */
* Main entry point for Casono application.
* Handles client and server startup.
* <p>
* Standardkonstruktor für die Anwendung.
*/
public final class Main { public final class Main {
/**
* Standardkonstruktor.
*/
public Main() {
// Standardkonstruktor
}
/** /**
* Main entry point for Casono. * Main entry point for Casono.
*
* @param args Command line arguments * @param args Command line arguments
*/ */
public static void main(String[] args) { public static void main(String[] args) {
@@ -50,10 +40,12 @@ public final class Main {
} }
private static void printUsage() { private static void printUsage() {
System.err.println(""" Logger logger = LogManager.getLogger(Main.class);
Usage: logger.fatal(
java -jar xyz.jar server <listenPort> """
java -jar xyz.jar client <serverIp>:<serverPort> Usage:
"""); java -jar xyz.jar server <listenPort>
java -jar xyz.jar client <serverIp>:<serverPort>
""");
} }
} }
@@ -8,11 +8,9 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
/** /**
* Entry point for the Casono client application. Handles client startup and * Entry point for the Casono client application. Handles client startup and connection parameters.
* connection parameters.
* *
* <p> * <p>Standardkonstruktor für die Anwendung.
* Standardkonstruktor für die Anwendung.
*/ */
public class ClientApp { public class ClientApp {
@@ -12,46 +12,38 @@ import javafx.scene.layout.VBox;
/** /**
* Controller-Klasse für das Chat-System innerhalb der Spieloberfläche. * Controller-Klasse für das Chat-System innerhalb der Spieloberfläche.
* *
* Verwaltet das Anzeigen von Chatnachrichten, das Eingabefeld für eigene Nachrichten * <p>Verwaltet das Anzeigen von Chatnachrichten, das Eingabefeld für eigene Nachrichten sowie den
* sowie den Senden-Button. Unterstützt drei Arten von Nachrichten: * Senden-Button. Unterstützt drei Arten von Nachrichten: - Player-to-Player (Privat) - Lobby-Chat
* - Player-to-Player (Privat) * (Raum) - Globaler Chat (Serverweit)
* - Lobby-Chat (Raum)
* - Globaler Chat (Serverweit)
* *
* Nachrichten werden in einem {@link VBox}-Container als {@link Label} angezeigt. * <p>Nachrichten werden in einem {@link VBox}-Container als {@link Label} angezeigt. Eigene
* Eigene Nachrichten werden über {@link #onSendToNetwork(String)} an das * Nachrichten werden über {@link #onSendToNetwork(String)} an das Netzwerkprotokoll weitergeleitet,
* Netzwerkprotokoll weitergeleitet, während eingehende Nachrichten über * während eingehende Nachrichten über {@link #receiveMessage(String, String)} verarbeitet und
* {@link #receiveMessage(String, String)} verarbeitet und angezeigt werden. * angezeigt werden.
* *
* Hinweis: Einige TODOs stehen in der zugehörigen FXML-Datei * <p>Hinweis: Einige TODOs stehen in der zugehörigen FXML-Datei
*/ */
public class ChatController { public class ChatController {
@FXML @FXML private VBox chatVBox;
private VBox chatVBox;
@FXML @FXML private TextField inputField;
private TextField inputField;
@FXML @FXML private Button sendButton;
private Button sendButton;
@FXML @FXML private ScrollPane chatScrollPane;
private ScrollPane chatScrollPane;
private static final int CHAT_PADDING = 20; private static final int CHAT_PADDING = 20;
/** /** Initialisiert den ChatController nach dem Laden der FXML. */
* Initialisiert den ChatController nach dem Laden der FXML.
*/
public void initialize() { public void initialize() {
inputField.setOnAction(event -> sendMessage()); inputField.setOnAction(event -> sendMessage());
chatScrollPane.vvalueProperty().bind(chatVBox.heightProperty()); chatScrollPane.vvalueProperty().bind(chatVBox.heightProperty());
} }
/** /**
* Diese Methode wird vom Senden-Button oder Enter ausgelöst. * Diese Methode wird vom Senden-Button oder Enter ausgelöst. Sie gibt die eigene Nachricht an
* Sie gibt die eigene Nachricht an das Netzwerkprotokoll weiter. * das Netzwerkprotokoll weiter.
*/ */
@FXML @FXML
private void sendMessage() { private void sendMessage() {
@@ -65,8 +57,9 @@ public class ChatController {
} }
/** /**
* Diese Funktion muss vom Netzwerkprotokoll aufgerufen werden, * Diese Funktion muss vom Netzwerkprotokoll aufgerufen werden, wenn eine neue Nachricht von
* wenn eine neue Nachricht von einem anderen Spieler kommt. * einem anderen Spieler kommt.
*
* @param player Name des Spielers * @param player Name des Spielers
* @param message Nachricht des Spielers * @param message Nachricht des Spielers
*/ */
@@ -80,8 +73,9 @@ public class ChatController {
} }
/** /**
* Schnittstelle zum Netzwerkprotokoll. * Schnittstelle zum Netzwerkprotokoll. Diese Funktion wird automatisch aufgerufen, wenn der
* Diese Funktion wird automatisch aufgerufen, wenn der Benutzer eine eigene Nachricht sendet. * Benutzer eine eigene Nachricht sendet.
*
* @param message Nachricht, die der Benutzer abgeschickt hat * @param message Nachricht, die der Benutzer abgeschickt hat
*/ */
public void onSendToNetwork(String message) { public void onSendToNetwork(String message) {
@@ -7,15 +7,11 @@ import javafx.scene.layout.VBox;
/** /**
* Controller für die Casino-Spielfläche. * Controller für die Casino-Spielfläche.
* *
* Verantwortlich für: * <p>Verantwortlich für: - die Darstellung des Pokertisches und der Spieleroberfläche, - die
* - die Darstellung des Pokertisches und der Spieleroberfläche, * Verarbeitung von Benutzereingaben, - die Schnittstelle zur GameEngine und zum Netzwerkprotokoll.
* - die Verarbeitung von Benutzereingaben,
* - die Schnittstelle zur GameEngine und zum Netzwerkprotokoll.
* *
* Hinweise: * <p>Hinweise: - Die Methode `onTableClick()` dient aktuell nur als Test-Logik. Sie ist ggf. nicht
* - Die Methode `onTableClick()` dient aktuell nur als Test-Logik. * mehr funktionsfähig und wird zukünftig durch die finale Spielinteraktion ersetzt.
* Sie ist ggf. nicht mehr funktionsfähig und wird zukünftig
* durch die finale Spielinteraktion ersetzt.
*/ */
public class CasinoGameController { public class CasinoGameController {
@@ -9,13 +9,11 @@ import javafx.stage.Stage;
/** /**
* Hauptklasse für das Casino-Spiel-UI. * Hauptklasse für das Casino-Spiel-UI.
* *
* Startet die JavaFX-Anwendung, lädt die grafische Oberfläche aus der FXML-Datei * <p>Startet die JavaFX-Anwendung, lädt die grafische Oberfläche aus der FXML-Datei und
* und initialisiert die Haupt-Stage für das Spiel. * initialisiert die Haupt-Stage für das Spiel.
* *
* Aufgaben: * <p>Aufgaben: - Lädt die FXML-Oberfläche "/ui-structure/Casinogameui.fxml". - Lädt das
* - Lädt die FXML-Oberfläche "/ui-structure/Casinogameui.fxml". * Anwendungs-Icon aus "/images/logoinverted.png". - Startet die Anwendung im Vollbildmodus.
* - Lädt das Anwendungs-Icon aus "/images/logoinverted.png".
* - Startet die Anwendung im Vollbildmodus.
*/ */
public class CasinoGameUI extends Application { public class CasinoGameUI extends Application {
@@ -44,6 +42,7 @@ public class CasinoGameUI extends Application {
/** /**
* Startpunkt der Anwendung. * Startpunkt der Anwendung.
*
* @param args Befehlszeilenargumente. * @param args Befehlszeilenargumente.
*/ */
public static void main(String[] args) { public static void main(String[] args) {
@@ -31,32 +31,22 @@ import javafx.stage.Stage;
/** /**
* Experimenteller integrierter Browser für Casono. * Experimenteller integrierter Browser für Casono.
* *
* Diese Klasse implementiert einen einfachen eingebetteten Webbrowser * <p>Diese Klasse implementiert einen einfachen eingebetteten Webbrowser auf Basis von {@link
* auf Basis von {@link javafx.scene.web.WebView}. Der Browser dient * javafx.scene.web.WebView}. Der Browser dient primär als Hilfswerkzeug innerhalb des Spiels, um
* primär als Hilfswerkzeug innerhalb des Spiels, um externe Inhalte * externe Inhalte wie Webseiten oder Videos anzuzeigen.
* wie Webseiten oder Videos anzuzeigen.
* *
* Status * <p>Status Der Browser befindet sich derzeit in einer experimentellen Phase. Einige
* Der Browser befindet sich derzeit in einer experimentellen Phase. * Sicherheitsmechanismen basieren auf experimentellen KI-gestützten Empfehlungen und können sich in
* Einige Sicherheitsmechanismen basieren auf experimentellen * zukünftigen Versionen noch ändern.
* KI-gestützten Empfehlungen und können sich in zukünftigen
* Versionen noch ändern.
* *
* Zweck * <p>Zweck Der Browser wird aktuell experimentell genutzt, um: Pokerregeln direkt im Spiel zu
* Der Browser wird aktuell experimentell genutzt, um: * erklären Hilfeseiten oder Dokumentationen anzuzeigen Videos (z.B. Tutorials oder Erklärungen)
* Pokerregeln direkt im Spiel zu erklären * über Plattformen wie YouTube abzuspielen
* Hilfeseiten oder Dokumentationen anzuzeigen
* Videos (z.B. Tutorials oder Erklärungen) über Plattformen wie YouTube abzuspielen
* *
* Sicherheitsmechanismen * <p>Sicherheitsmechanismen Da externe Webseiten geladen werden können, wurden einige grundlegende
* Da externe Webseiten geladen werden können, wurden einige * Schutzmaßnahmen integriert: - HTTPS-Zwang für Webseiten - Whitelist für bekannte Domains -
* grundlegende Schutzmaßnahmen integriert: * Warnung bei unbekannten Webseiten - JavaScript standardmäßig deaktiviert (man kann es jedoch für
* - HTTPS-Zwang für Webseiten * Google etc. einschalten) - Popup-Blocker - Automatische Cookie-Löschung beim Schließen
* - Whitelist für bekannte Domains
* - Warnung bei unbekannten Webseiten
* - JavaScript standardmäßig deaktiviert (man kann es jedoch für Google etc. einschalten)
* - Popup-Blocker
* - Automatische Cookie-Löschung beim Schließen
*/ */
public class CasinoBrowserController { public class CasinoBrowserController {
@@ -105,76 +95,84 @@ public class CasinoBrowserController {
private static boolean javascriptEnabled = false; private static boolean javascriptEnabled = false;
/** /** Löscht alle gespeicherten Cookies der aktuellen Browser-Sitzung. */
* Löscht alle gespeicherten Cookies der aktuellen Browser-Sitzung.
*/
private static void clearCookies() { private static void clearCookies() {
try { try {
COOKIE_MANAGER.getCookieStore().removeAll(); COOKIE_MANAGER.getCookieStore().removeAll();
} catch (Exception ignored) {} } catch (Exception ignored) {
}
} }
/** /**
* Öffnet ein neues Browserfenster und lädt eine angegebene Webseite. * Öffnet ein neues Browserfenster und lädt eine angegebene Webseite.
* *
* Falls die Webseite nicht zur Liste vertrauenswürdiger Domains gehört, * <p>Falls die Webseite nicht zur Liste vertrauenswürdiger Domains gehört, wird der Benutzer
* wird der Benutzer gefragt, ob die Seite dennoch geladen werden soll. * gefragt, ob die Seite dennoch geladen werden soll.
* *
* @param url die Startadresse der Webseite, die geladen werden soll * @param url die Startadresse der Webseite, die geladen werden soll
*/ */
public static void open(String url) { public static void open(String url) {
Platform.runLater(() -> { Platform.runLater(
Stage stage = new Stage(); () -> {
Stage stage = new Stage();
WebView webView = new WebView(); WebView webView = new WebView();
WebEngine engine = webView.getEngine(); WebEngine engine = webView.getEngine();
engine.setJavaScriptEnabled(false); engine.setJavaScriptEnabled(false);
configurePopupBlocker(engine); configurePopupBlocker(engine);
webView.getStyleClass().add("web-view"); webView.getStyleClass().add("web-view");
StackPane webContainer = createWebContainer(webView); StackPane webContainer = createWebContainer(webView);
Rectangle clip = new Rectangle(); Rectangle clip = new Rectangle();
clip.setArcWidth(CORNER_RADIUS); clip.setArcWidth(CORNER_RADIUS);
clip.setArcHeight(CORNER_RADIUS); clip.setArcHeight(CORNER_RADIUS);
webView.setClip(clip); webView.setClip(clip);
webView.widthProperty().addListener((o, a, b) -> webView.widthProperty()
clip.setWidth(b.doubleValue())); .addListener((o, a, b) -> clip.setWidth(b.doubleValue()));
webView.heightProperty().addListener((o, a, b) -> webView.heightProperty()
clip.setHeight(b.doubleValue())); .addListener((o, a, b) -> clip.setHeight(b.doubleValue()));
ImageView browserLogo = loadLogos(stage); ImageView browserLogo = loadLogos(stage);
TextField urlField = createUrlField(url); TextField urlField = createUrlField(url);
Label securityLabel = createSecurityLabel(); Label securityLabel = createSecurityLabel();
Button jsToggle = createJsToggle(engine); Button jsToggle = createJsToggle(engine);
Button backBtn = createBackButton(engine); Button backBtn = createBackButton(engine);
Button fwdBtn = createForwardButton(engine); Button fwdBtn = createForwardButton(engine);
Button reloadBtn = createReloadButton(engine); Button reloadBtn = createReloadButton(engine);
Button closeBtn = createCloseButton(stage, webView); Button closeBtn = createCloseButton(stage, webView);
configureUrlEvents(engine, urlField, securityLabel); configureUrlEvents(engine, urlField, securityLabel);
HBox taskbar = new HBox(HBOX_SPACIN, browserLogo, backBtn, fwdBtn, HBox taskbar =
reloadBtn, urlField, jsToggle, securityLabel, closeBtn new HBox(
); HBOX_SPACIN,
browserLogo,
backBtn,
fwdBtn,
reloadBtn,
urlField,
jsToggle,
securityLabel,
closeBtn);
taskbar.getStyleClass().add("taskbar-browser"); taskbar.getStyleClass().add("taskbar-browser");
taskbar.setAlignment(Pos.CENTER_LEFT); taskbar.setAlignment(Pos.CENTER_LEFT);
Scene scene = createScene(taskbar, webContainer); Scene scene = createScene(taskbar, webContainer);
configureKeyEvents(scene, engine); configureKeyEvents(scene, engine);
stage.setScene(scene); stage.setScene(scene);
stage.setTitle("Casono Browser"); stage.setTitle("Casono Browser");
loadUrlSafely(engine, url, securityLabel); loadUrlSafely(engine, url, securityLabel);
stage.show(); stage.show();
}); });
} }
/** /**
@@ -197,41 +195,43 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen * @param engine WebEngine nutzen
*/ */
public static void configurePopupBlocker(WebEngine engine) { public static void configurePopupBlocker(WebEngine engine) {
engine.setCreatePopupHandler(config -> { engine.setCreatePopupHandler(
Alert alert = new Alert(Alert.AlertType.WARNING); config -> {
alert.setTitle("Popup blockiert"); Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText(null); alert.setTitle("Popup blockiert");
alert.setContentText("Popup wurde aus Sicherheitsgründen blockiert."); alert.setHeaderText(null);
alert.setContentText("Popup wurde aus Sicherheitsgründen blockiert.");
try { try {
var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH); var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH);
Image logo = new Image(stream); Image logo = new Image(stream);
// Variable 'streamM' abgekürzt, um das 100-Zeichen-Limit (LineLength) // Variable 'streamM' abgekürzt, um das 100-Zeichen-Limit (LineLength)
// einzuhalten // einzuhalten
var streamM = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH_MAIN); var streamM =
Image logomain = new Image(streamM); CasinoBrowserController.class.getResourceAsStream(LOGO_PATH_MAIN);
Image logomain = new Image(streamM);
if (logo != null) { if (logo != null) {
Stage alertStage = (Stage) alert.getDialogPane().getScene().getWindow(); Stage alertStage = (Stage) alert.getDialogPane().getScene().getWindow();
if (alertStage != null) { if (alertStage != null) {
alertStage.getIcons().add(logo); alertStage.getIcons().add(logo);
}
}
if (logomain != null) {
ImageView logoView = new ImageView(logomain);
logoView.setFitHeight(LOGO_HEIGHT);
logoView.setPreserveRatio(true);
alert.setGraphic(logoView);
}
} catch (Exception e) {
LOGGER.error("Logo konnte nicht geladen werden");
} }
}
if (logomain != null) { alert.showAndWait();
ImageView logoView = new ImageView(logomain); return null;
logoView.setFitHeight(LOGO_HEIGHT); });
logoView.setPreserveRatio(true);
alert.setGraphic(logoView);
}
} catch (Exception e) {
LOGGER.error("Logo konnte nicht geladen werden");
}
alert.showAndWait();
return null;
});
} }
/** /**
@@ -300,25 +300,26 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen * @param engine WebEngine nutzen
* @return Button Umschalten * @return Button Umschalten
*/ */
public static Button createJsToggle(WebEngine engine){ public static Button createJsToggle(WebEngine engine) {
Button jsToggle = new Button("JS EINSCHALTEN"); Button jsToggle = new Button("JS EINSCHALTEN");
jsToggle.getStyleClass().add("red-button"); jsToggle.getStyleClass().add("red-button");
jsToggle.setOnAction(e -> { jsToggle.setOnAction(
javascriptEnabled = !javascriptEnabled; e -> {
engine.setJavaScriptEnabled(javascriptEnabled); javascriptEnabled = !javascriptEnabled;
engine.setJavaScriptEnabled(javascriptEnabled);
if (javascriptEnabled) { if (javascriptEnabled) {
jsToggle.setText("JS AUSSCHALTEN"); jsToggle.setText("JS AUSSCHALTEN");
jsToggle.getStyleClass().removeAll("red-button"); jsToggle.getStyleClass().removeAll("red-button");
jsToggle.getStyleClass().add("yellow-button"); jsToggle.getStyleClass().add("yellow-button");
} else { } else {
jsToggle.setText("JS EINSCHALTEN"); jsToggle.setText("JS EINSCHALTEN");
jsToggle.getStyleClass().removeAll("yellow-button"); jsToggle.getStyleClass().removeAll("yellow-button");
jsToggle.getStyleClass().add("red-button"); jsToggle.getStyleClass().add("red-button");
} }
}); });
return jsToggle; return jsToggle;
} }
@@ -332,11 +333,12 @@ public class CasinoBrowserController {
public static Button createBackButton(WebEngine engine) { public static Button createBackButton(WebEngine engine) {
Button backBtn = new Button("<"); Button backBtn = new Button("<");
backBtn.getStyleClass().add("gray-button"); backBtn.getStyleClass().add("gray-button");
backBtn.setOnAction(e -> { backBtn.setOnAction(
if (engine.getHistory().getCurrentIndex() > 0) { e -> {
engine.getHistory().go(-1); if (engine.getHistory().getCurrentIndex() > 0) {
} engine.getHistory().go(-1);
}); }
});
return backBtn; return backBtn;
} }
@@ -350,12 +352,13 @@ public class CasinoBrowserController {
public static Button createForwardButton(WebEngine engine) { public static Button createForwardButton(WebEngine engine) {
Button fwdBtn = new Button(">"); Button fwdBtn = new Button(">");
fwdBtn.getStyleClass().add("gray-button"); fwdBtn.getStyleClass().add("gray-button");
fwdBtn.setOnAction(e -> { fwdBtn.setOnAction(
if (engine.getHistory().getCurrentIndex() < e -> {
engine.getHistory().getEntries().size() - 1) { if (engine.getHistory().getCurrentIndex()
engine.getHistory().go(1); < engine.getHistory().getEntries().size() - 1) {
} engine.getHistory().go(1);
}); }
});
return fwdBtn; return fwdBtn;
} }
@@ -383,12 +386,12 @@ public class CasinoBrowserController {
public static Button createCloseButton(Stage stage, WebView webView) { public static Button createCloseButton(Stage stage, WebView webView) {
Button closeBtn = new Button("X"); Button closeBtn = new Button("X");
closeBtn.getStyleClass().add("red-button"); closeBtn.getStyleClass().add("red-button");
closeBtn.setOnAction(e -> { closeBtn.setOnAction(
webView.getEngine().load("about:blank"); e -> {
clearCookies(); webView.getEngine().load("about:blank");
stage.close(); clearCookies();
stage.close();
}); });
return closeBtn; return closeBtn;
} }
@@ -400,13 +403,10 @@ public class CasinoBrowserController {
* @param urlField URL Textfeld * @param urlField URL Textfeld
* @param securityLabel Sicherheits Label * @param securityLabel Sicherheits Label
*/ */
public static void configureUrlEvents(WebEngine engine, public static void configureUrlEvents(
TextField urlField, WebEngine engine, TextField urlField, Label securityLabel) {
Label securityLabel) { urlField.setOnAction(e -> loadUrlSafely(engine, urlField.getText(), securityLabel));
urlField.setOnAction(e -> engine.locationProperty().addListener((obs, o, n) -> urlField.setText(n));
loadUrlSafely(engine, urlField.getText(), securityLabel));
engine.locationProperty().addListener((obs, o, n) ->
urlField.setText(n));
} }
/** /**
@@ -423,8 +423,7 @@ public class CasinoBrowserController {
Scene scene = new Scene(root, WINDOW_WIDTH, WINDOW_HEIGHT); Scene scene = new Scene(root, WINDOW_WIDTH, WINDOW_HEIGHT);
var css = CasinoBrowserController.class var css = CasinoBrowserController.class.getResource("/ui-structure/casinogameui.css");
.getResource("/ui-structure/casinogameui.css");
if (css != null) { if (css != null) {
scene.getStylesheets().add(css.toExternalForm()); scene.getStylesheets().add(css.toExternalForm());
@@ -440,25 +439,23 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen * @param engine WebEngine nutzen
*/ */
public static void configureKeyEvents(Scene scene, WebEngine engine) { public static void configureKeyEvents(Scene scene, WebEngine engine) {
scene.setOnKeyPressed(event -> { scene.setOnKeyPressed(
if (event.getCode() == KeyCode.F5) { event -> {
engine.reload(); if (event.getCode() == KeyCode.F5) {
} engine.reload();
}); }
});
} }
/** /**
* Lädt eine URL in den Browser, nachdem grundlegende Sicherheitsprüfungen * Lädt eine URL in den Browser, nachdem grundlegende Sicherheitsprüfungen durchgeführt wurden.
* durchgeführt wurden.
* *
* Vor dem Laden einer Seite werden folgende Prüfungen durchgeführt: * <p>Vor dem Laden einer Seite werden folgende Prüfungen durchgeführt: - Überprüfung des
* - Überprüfung des Protokolls (nur HTTPS erlaubt) * Protokolls (nur HTTPS erlaubt) - Überprüfung der Domain gegen eine Whitelist - Schutz vor
* - Überprüfung der Domain gegen eine Whitelist * Domain-Spoofing (Domain-Vortäuschung)
* - Schutz vor Domain-Spoofing (Domain-Vortäuschung)
* *
* Falls eine Domain nicht als vertrauenswürdig eingestuft wird, * <p>Falls eine Domain nicht als vertrauenswürdig eingestuft wird, muss der Benutzer
* muss der Benutzer bestätigen, dass die Seite dennoch geöffnet * bestätigen, dass die Seite dennoch geöffnet werden darf.
* werden darf.
* *
* @param engine der WebEngine-Renderer des Browsers * @param engine der WebEngine-Renderer des Browsers
* @param url die zu ladende Webadresse * @param url die zu ladende Webadresse
@@ -485,8 +482,9 @@ public class CasinoBrowserController {
} }
// Sicherer Domain Check // Sicherer Domain Check
boolean trusted = TRUSTED_DOMAINS.stream().anyMatch(domain -> boolean trusted =
host.equals(domain) || host.endsWith("." + domain)); TRUSTED_DOMAINS.stream()
.anyMatch(domain -> host.equals(domain) || host.endsWith("." + domain));
if (!trusted) { if (!trusted) {
if (!showUnknownWebsiteAlert(host)) { if (!showUnknownWebsiteAlert(host)) {
@@ -515,9 +513,9 @@ public class CasinoBrowserController {
alert.setTitle("Unbekannte Website"); alert.setTitle("Unbekannte Website");
alert.setHeaderText("Diese Website ist nicht bekannt"); alert.setHeaderText("Diese Website ist nicht bekannt");
alert.setContentText( alert.setContentText(
host + "\n\nDiese Seite ist nicht vom " + host
"Casono Browser verifiziert.\nMöchten Sie sie trotzdem öffnen?" + "\n\nDiese Seite ist nicht vom "
); + "Casono Browser verifiziert.\nMöchten Sie sie trotzdem öffnen?");
var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH); var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH);
Image logo = new Image(stream); Image logo = new Image(stream);
@@ -11,10 +11,8 @@ import javafx.scene.layout.HBox;
/** /**
* Controller für die interaktive Taskleiste innerhalb der Poker-UI. * Controller für die interaktive Taskleiste innerhalb der Poker-UI.
* *
* Verantwortlich für: * <p>Verantwortlich für: - Drag-and-Drop-Verschieben der Taskleiste, - Eingabe und Verwaltung von
* - Drag-and-Drop-Verschieben der Taskleiste, * Spieleinsätzen, - Steuerung allgemeiner Menüfunktionen wie Exit.
* - Eingabe und Verwaltung von Spieleinsätzen,
* - Steuerung allgemeiner Menüfunktionen wie Exit.
*/ */
public class TaskbarController { public class TaskbarController {
@@ -32,8 +30,8 @@ public class TaskbarController {
private static final int CREDIT_STEP = 5; private static final int CREDIT_STEP = 5;
/** /**
* Wird aufgerufen, wenn die Taskleiste mit der Maus gedrückt wird. * Wird aufgerufen, wenn die Taskleiste mit der Maus gedrückt wird. Speichert die relative
* Speichert die relative Position, um später korrekt zu verschieben. * Position, um später korrekt zu verschieben.
* *
* @param event Das Mausereignis * @param event Das Mausereignis
*/ */
@@ -44,11 +42,11 @@ public class TaskbarController {
} }
/** /**
* Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird. * Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird. Aktualisiert die Position
* Aktualisiert die Position und skaliert die Taskleiste leicht zur visuellen Rückmeldung. * und skaliert die Taskleiste leicht zur visuellen Rückmeldung.
* *
* TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem * <p>TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem Fenster verschwinden
* Fenster verschwinden kann. * kann.
* *
* @param event Das Mausereignis * @param event Das Mausereignis
*/ */
@@ -62,8 +60,8 @@ public class TaskbarController {
} }
/** /**
* Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird. * Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird. Setzt die Skalierung der
* Setzt die Skalierung der Taskleiste wieder auf Normalgröße. * Taskleiste wieder auf Normalgröße.
* *
* @param event Das Mausereignis * @param event Das Mausereignis
*/ */
@@ -86,8 +84,8 @@ public class TaskbarController {
} }
/** /**
* Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird. * Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird. Löst die
* Löst die Verarbeitung des Einsatzes aus. * Verarbeitung des Einsatzes aus.
*/ */
@FXML @FXML
private void onInputSubmittedAction() { private void onInputSubmittedAction() {
@@ -97,8 +95,8 @@ public class TaskbarController {
/** /**
* Wird aufgerufen, wenn der Exit-Button in der Taskleiste gedrückt wird. * Wird aufgerufen, wenn der Exit-Button in der Taskleiste gedrückt wird.
* *
* TODO: Logik implementieren, um zur Lobby zurückzukehren, * <p>TODO: Logik implementieren, um zur Lobby zurückzukehren, ohne die gesamte Anwendung zu
* ohne die gesamte Anwendung zu schließen (kein System.exit/Platform.exit). * schließen (kein System.exit/Platform.exit).
*/ */
@FXML @FXML
private void onExitButtonClick() { private void onExitButtonClick() {
@@ -106,10 +104,9 @@ public class TaskbarController {
} }
/** /**
* Verarbeitet den im Textfeld eingegebenen Einsatz. * Verarbeitet den im Textfeld eingegebenen Einsatz. Es werden ausschließlich ganzzahlige Werte
* Es werden ausschließlich ganzzahlige Werte im Bereich von 5 bis 100.000 * im Bereich von 5 bis 100.000 Credits akzeptiert, die einem Vielfachen von 5 entsprechen
* Credits akzeptiert, die einem Vielfachen von 5 entsprechen (5er-Schritte). * (5er-Schritte). Der Einsatz wird aktuell nur auf der Konsole ausgegeben.
* Der Einsatz wird aktuell nur auf der Konsole ausgegeben.
*/ */
private void processBet() { private void processBet() {
String input = taskbarInput.getText(); String input = taskbarInput.getText();
@@ -131,8 +128,8 @@ public class TaskbarController {
/** /**
* Öffnet den integrierten Casono Webbrowser. * Öffnet den integrierten Casono Webbrowser.
* *
* TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps & Tricks Seite), * <p>TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps & Tricks
* sobald die Inhalte für Strategien und Support bereitstehen. * Seite), sobald die Inhalte für Strategien und Support bereitstehen.
*/ */
@FXML @FXML
private void onBrowserButtonClick() { private void onBrowserButtonClick() {
@@ -1,9 +1,9 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import static org.junit.jupiter.api.Assertions.*; package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class LobbyButtonGridManagerTest { class LobbyButtonGridManagerTest {
LobbyButtonGridManager gridManager; LobbyButtonGridManager gridManager;
@@ -1,9 +1,9 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import static org.junit.jupiter.api.Assertions.*; package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import java.util.Map; import java.util.Map;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class LobbyButtonTranslationManagerTest { class LobbyButtonTranslationManagerTest {
LobbyButtonTranslationManager manager; LobbyButtonTranslationManager manager;