From fc2d4e2aab312c7a9b216cac0c30a05b93e90d3d Mon Sep 17 00:00:00 2001 From: MatrixTM26 Date: Sun, 19 Jul 2026 20:22:19 +0700 Subject: [PATCH 1/6] change project structure and update server configuration --- build.ps1 => build/build.ps1 | 0 build.sh => build/build.sh | 4 +- pom.xml => build/maven/pom.xml | 0 .../{ => interfaces}/app/static/css/style.css | 0 .../{ => interfaces}/app/static/js/script.js | 0 .../app/static/js/sidebar/sidebar.js | 0 .../app/static/js/themes/theme.js | 0 .../{ => interfaces}/app/static/svg/core.svg | 0 .../{ => interfaces}/app/templates/index.html | 0 .../server/server.properties | 10 +- src/main/java/com/raven/Start.java | 6 +- .../CertificateManager.java | 2 +- .../KeystoreLoader.java | 2 +- .../SymmetricCrypto.java | 2 +- .../core/{db => database}/MemoryDatabase.java | 2 +- .../core/{db => database}/MongoDatabase.java | 2 +- .../{db => database}/PostgresDatabase.java | 2 +- .../core/{db => database}/SqliteDatabase.java | 2 +- .../core/{db => database}/TeamDatabase.java | 2 +- .../com/raven/core/server/RavenServer.java | 4 +- .../java/com/raven/interface/GUI/GUI.java | 739 -------------- .../GUI/module/UI/button/ButtonFactory.java | 26 - .../GUI/module/UI/color/Palette.java | 19 - .../GUI/module/UI/frame/CardBuilder.java | 54 - .../GUI/module/UI/frame/StyleHelper.java | 58 -- .../GUI/module/UI/label/LabelFactory.java | 31 - .../GUI/module/core/database/AuthService.java | 30 - .../module/core/server/CommandDispatcher.java | 216 ---- .../module/core/server/ServerController.java | 105 -- .../module/core/session/SessionManager.java | 60 -- .../GUI/module/core/session/SessionRow.java | 38 - .../raven/interface/GUI/styles/css/raven.css | 403 -------- .../interface/GUI/styles/xml/Commands.fxml | 39 - .../interface/GUI/styles/xml/Dashboard.fxml | 34 - .../raven/interface/GUI/styles/xml/Login.fxml | 38 - .../interface/GUI/styles/xml/Sessions.fxml | 42 - .../interface/GUI/styles/xml/Settings.fxml | 48 - .../interface/GUI/styles/xml/Sidebar.fxml | 30 - .../interface/GUI/styles/xml/TopBar.fxml | 29 - .../{interface => interfaces}/APP/WebApp.java | 2 +- .../{interface => interfaces}/CLI/CLI.java | 52 +- .../java/com/raven/interfaces/GUI/GUI.java | 933 ++++++++++++++++++ .../GUI/module/UI/button/ButtonFactory.java | 80 ++ .../GUI/module/UI/color/Palette.java | 29 + .../GUI/module/UI/frame/CardBuilder.java | 58 ++ .../GUI/module/UI/frame/StyleHelper.java | 76 ++ .../GUI/module/UI/label/LabelFactory.java | 45 + .../GUI/module/core/database/AuthService.java | 30 + .../module/core/server/CommandDispatcher.java | 190 ++++ .../module/core/server/ServerController.java | 98 ++ .../module/core/session/SessionManager.java | 58 ++ .../GUI/module/core/session/SessionRow.java | 38 + .../raven/interfaces/GUI/styles/css/raven.css | 511 ++++++++++ .../interfaces/GUI/styles/fxml/Commands.fxml | 41 + .../interfaces/GUI/styles/fxml/Dashboard.fxml | 37 + .../interfaces/GUI/styles/fxml/Login.fxml | 31 + .../GUI/styles/fxml}/Logs.fxml | 14 +- .../interfaces/GUI/styles/fxml/Sessions.fxml | 40 + .../interfaces/GUI/styles/fxml/Settings.fxml | 64 ++ .../interfaces/GUI/styles/fxml/Sidebar.fxml | 33 + .../GUI/styles/fxml}/Terminal.fxml | 28 +- .../interfaces/GUI/styles/fxml/TopBar.fxml | 28 + .../{interface => interfaces}/TeamClient.java | 0 .../{interface => interfaces}/TeamServer.java | 4 +- .../banner/CLIBanner.java | 2 +- .../banner/TBanner.java | 2 +- src/main/java/com/raven/utils/Helper.java | 2 +- .../java/com/raven/utils/ServerConfig.java | 23 +- 68 files changed, 2507 insertions(+), 2121 deletions(-) rename build.ps1 => build/build.ps1 (100%) rename build.sh => build/build.sh (98%) mode change 100755 => 100644 rename pom.xml => build/maven/pom.xml (100%) rename config/{ => interfaces}/app/static/css/style.css (100%) rename config/{ => interfaces}/app/static/js/script.js (100%) rename config/{ => interfaces}/app/static/js/sidebar/sidebar.js (100%) rename config/{ => interfaces}/app/static/js/themes/theme.js (100%) rename config/{ => interfaces}/app/static/svg/core.svg (100%) rename config/{ => interfaces}/app/templates/index.html (100%) rename server.properties => config/server/server.properties (91%) rename src/main/java/com/raven/core/{crypto => cryptography}/CertificateManager.java (99%) rename src/main/java/com/raven/core/{crypto => cryptography}/KeystoreLoader.java (99%) rename src/main/java/com/raven/core/{crypto => cryptography}/SymmetricCrypto.java (98%) rename src/main/java/com/raven/core/{db => database}/MemoryDatabase.java (99%) rename src/main/java/com/raven/core/{db => database}/MongoDatabase.java (99%) rename src/main/java/com/raven/core/{db => database}/PostgresDatabase.java (99%) rename src/main/java/com/raven/core/{db => database}/SqliteDatabase.java (99%) rename src/main/java/com/raven/core/{db => database}/TeamDatabase.java (99%) delete mode 100644 src/main/java/com/raven/interface/GUI/GUI.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/UI/button/ButtonFactory.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/UI/color/Palette.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/UI/frame/CardBuilder.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/UI/frame/StyleHelper.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/UI/label/LabelFactory.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/core/database/AuthService.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/core/server/CommandDispatcher.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/core/server/ServerController.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/core/session/SessionManager.java delete mode 100644 src/main/java/com/raven/interface/GUI/module/core/session/SessionRow.java delete mode 100644 src/main/java/com/raven/interface/GUI/styles/css/raven.css delete mode 100644 src/main/java/com/raven/interface/GUI/styles/xml/Commands.fxml delete mode 100644 src/main/java/com/raven/interface/GUI/styles/xml/Dashboard.fxml delete mode 100644 src/main/java/com/raven/interface/GUI/styles/xml/Login.fxml delete mode 100644 src/main/java/com/raven/interface/GUI/styles/xml/Sessions.fxml delete mode 100644 src/main/java/com/raven/interface/GUI/styles/xml/Settings.fxml delete mode 100644 src/main/java/com/raven/interface/GUI/styles/xml/Sidebar.fxml delete mode 100644 src/main/java/com/raven/interface/GUI/styles/xml/TopBar.fxml rename src/main/java/com/raven/{interface => interfaces}/APP/WebApp.java (99%) rename src/main/java/com/raven/{interface => interfaces}/CLI/CLI.java (96%) create mode 100644 src/main/java/com/raven/interfaces/GUI/GUI.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/UI/button/ButtonFactory.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/UI/color/Palette.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/UI/frame/CardBuilder.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/UI/frame/StyleHelper.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/UI/label/LabelFactory.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/core/database/AuthService.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/core/server/CommandDispatcher.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/core/server/ServerController.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/core/session/SessionManager.java create mode 100644 src/main/java/com/raven/interfaces/GUI/module/core/session/SessionRow.java create mode 100644 src/main/java/com/raven/interfaces/GUI/styles/css/raven.css create mode 100644 src/main/java/com/raven/interfaces/GUI/styles/fxml/Commands.fxml create mode 100644 src/main/java/com/raven/interfaces/GUI/styles/fxml/Dashboard.fxml create mode 100644 src/main/java/com/raven/interfaces/GUI/styles/fxml/Login.fxml rename src/main/java/com/raven/{interface/GUI/styles/xml => interfaces/GUI/styles/fxml}/Logs.fxml (62%) create mode 100644 src/main/java/com/raven/interfaces/GUI/styles/fxml/Sessions.fxml create mode 100644 src/main/java/com/raven/interfaces/GUI/styles/fxml/Settings.fxml create mode 100644 src/main/java/com/raven/interfaces/GUI/styles/fxml/Sidebar.fxml rename src/main/java/com/raven/{interface/GUI/styles/xml => interfaces/GUI/styles/fxml}/Terminal.fxml (56%) create mode 100644 src/main/java/com/raven/interfaces/GUI/styles/fxml/TopBar.fxml rename src/main/java/com/raven/{interface => interfaces}/TeamClient.java (100%) rename src/main/java/com/raven/{interface => interfaces}/TeamServer.java (99%) rename src/main/java/com/raven/{interface => interfaces}/banner/CLIBanner.java (99%) rename src/main/java/com/raven/{interface => interfaces}/banner/TBanner.java (96%) diff --git a/build.ps1 b/build/build.ps1 similarity index 100% rename from build.ps1 rename to build/build.ps1 diff --git a/build.sh b/build/build.sh old mode 100755 new mode 100644 similarity index 98% rename from build.sh rename to build/build.sh index 129fbaf..dfafc85 --- a/build.sh +++ b/build/build.sh @@ -11,6 +11,8 @@ readonly Reset='\033[0m' TotalSteps=4 CurrentStep=0 +ConfigFile="maven/pom.xml" + PrintInfo() { local Message="$1" CurrentStep=$((CurrentStep + 1)) @@ -127,7 +129,7 @@ CheckAndInstallMaven() { RunBuild() { PrintInfo "Running Maven build" - if ! mvn clean package -q -X; then + if ! mvn clean package -q -X -f $ConfigFile; then PrintError "Maven build failed" exit 1 fi diff --git a/pom.xml b/build/maven/pom.xml similarity index 100% rename from pom.xml rename to build/maven/pom.xml diff --git a/config/app/static/css/style.css b/config/interfaces/app/static/css/style.css similarity index 100% rename from config/app/static/css/style.css rename to config/interfaces/app/static/css/style.css diff --git a/config/app/static/js/script.js b/config/interfaces/app/static/js/script.js similarity index 100% rename from config/app/static/js/script.js rename to config/interfaces/app/static/js/script.js diff --git a/config/app/static/js/sidebar/sidebar.js b/config/interfaces/app/static/js/sidebar/sidebar.js similarity index 100% rename from config/app/static/js/sidebar/sidebar.js rename to config/interfaces/app/static/js/sidebar/sidebar.js diff --git a/config/app/static/js/themes/theme.js b/config/interfaces/app/static/js/themes/theme.js similarity index 100% rename from config/app/static/js/themes/theme.js rename to config/interfaces/app/static/js/themes/theme.js diff --git a/config/app/static/svg/core.svg b/config/interfaces/app/static/svg/core.svg similarity index 100% rename from config/app/static/svg/core.svg rename to config/interfaces/app/static/svg/core.svg diff --git a/config/app/templates/index.html b/config/interfaces/app/templates/index.html similarity index 100% rename from config/app/templates/index.html rename to config/interfaces/app/templates/index.html diff --git a/server.properties b/config/server/server.properties similarity index 91% rename from server.properties rename to config/server/server.properties index b0995e8..f011b7c 100644 --- a/server.properties +++ b/config/server/server.properties @@ -1,4 +1,10 @@ # RAVEN C2 default configurations +# AUTHOR: MatrixTM26 +# RAVEN V1.0 + +# NOTE: +# This tool is currently under development, in some release versions, you may encounter functional errors or logic flaws. + # server general configuration server.host = 0.0.0.0 @@ -17,8 +23,8 @@ server.mode = multi # default web mode configuration web.host = 127.0.0.1 web.port = 5000 -web.template.dir = config/app/templates -web.static.dir = config/app/static +web.template.dir = config/interfaces/app/templates +web.static.dir = config/interfaces/app/static # HTTP/HTTPS beacon port (-1 to disable) web.beacon.port = -1 diff --git a/src/main/java/com/raven/Start.java b/src/main/java/com/raven/Start.java index fae17eb..b2bd63e 100644 --- a/src/main/java/com/raven/Start.java +++ b/src/main/java/com/raven/Start.java @@ -1,8 +1,8 @@ package com.raven; -import com.raven.core.crypto.CertificateManager; -import com.raven.core.db.TeamDatabase; -import com.raven.core.db.TeamDatabase.OperatorRole; +import com.raven.core.cryptography.CertificateManager; +import com.raven.core.database.TeamDatabase; +import com.raven.core.database.TeamDatabase.OperatorRole; import com.raven.core.output.Logger; import com.raven.core.server.ListenerMode; import com.raven.interfaces.CLI.CLI; diff --git a/src/main/java/com/raven/core/crypto/CertificateManager.java b/src/main/java/com/raven/core/cryptography/CertificateManager.java similarity index 99% rename from src/main/java/com/raven/core/crypto/CertificateManager.java rename to src/main/java/com/raven/core/cryptography/CertificateManager.java index 942c29e..1072459 100644 --- a/src/main/java/com/raven/core/crypto/CertificateManager.java +++ b/src/main/java/com/raven/core/cryptography/CertificateManager.java @@ -1,4 +1,4 @@ -package com.raven.core.crypto; +package com.raven.core.cryptography; import com.raven.core.output.Logger; import com.raven.utils.ServerConfig; diff --git a/src/main/java/com/raven/core/crypto/KeystoreLoader.java b/src/main/java/com/raven/core/cryptography/KeystoreLoader.java similarity index 99% rename from src/main/java/com/raven/core/crypto/KeystoreLoader.java rename to src/main/java/com/raven/core/cryptography/KeystoreLoader.java index e8c140e..704eb1a 100644 --- a/src/main/java/com/raven/core/crypto/KeystoreLoader.java +++ b/src/main/java/com/raven/core/cryptography/KeystoreLoader.java @@ -1,4 +1,4 @@ -package com.raven.core.crypto; +package com.raven.core.cryptography; import com.raven.core.output.Logger; import java.io.*; diff --git a/src/main/java/com/raven/core/crypto/SymmetricCrypto.java b/src/main/java/com/raven/core/cryptography/SymmetricCrypto.java similarity index 98% rename from src/main/java/com/raven/core/crypto/SymmetricCrypto.java rename to src/main/java/com/raven/core/cryptography/SymmetricCrypto.java index f09c7cd..b79f25f 100644 --- a/src/main/java/com/raven/core/crypto/SymmetricCrypto.java +++ b/src/main/java/com/raven/core/cryptography/SymmetricCrypto.java @@ -1,4 +1,4 @@ -package com.raven.core.crypto; +package com.raven.core.cryptography; import java.security.SecureRandom; import java.util.Base64; diff --git a/src/main/java/com/raven/core/db/MemoryDatabase.java b/src/main/java/com/raven/core/database/MemoryDatabase.java similarity index 99% rename from src/main/java/com/raven/core/db/MemoryDatabase.java rename to src/main/java/com/raven/core/database/MemoryDatabase.java index 458244c..fada434 100644 --- a/src/main/java/com/raven/core/db/MemoryDatabase.java +++ b/src/main/java/com/raven/core/database/MemoryDatabase.java @@ -1,4 +1,4 @@ -package com.raven.core.db; +package com.raven.core.database; import com.raven.utils.ServerConfig; import java.time.LocalDateTime; diff --git a/src/main/java/com/raven/core/db/MongoDatabase.java b/src/main/java/com/raven/core/database/MongoDatabase.java similarity index 99% rename from src/main/java/com/raven/core/db/MongoDatabase.java rename to src/main/java/com/raven/core/database/MongoDatabase.java index 5db81a9..0f281a0 100644 --- a/src/main/java/com/raven/core/db/MongoDatabase.java +++ b/src/main/java/com/raven/core/database/MongoDatabase.java @@ -1,4 +1,4 @@ -package com.raven.core.db; +package com.raven.core.database; import com.mongodb.client.*; import com.mongodb.client.model.*; diff --git a/src/main/java/com/raven/core/db/PostgresDatabase.java b/src/main/java/com/raven/core/database/PostgresDatabase.java similarity index 99% rename from src/main/java/com/raven/core/db/PostgresDatabase.java rename to src/main/java/com/raven/core/database/PostgresDatabase.java index 26a12c3..f5568b2 100644 --- a/src/main/java/com/raven/core/db/PostgresDatabase.java +++ b/src/main/java/com/raven/core/database/PostgresDatabase.java @@ -1,4 +1,4 @@ -package com.raven.core.db; +package com.raven.core.database; import com.google.gson.Gson; import com.raven.core.output.Logger; diff --git a/src/main/java/com/raven/core/db/SqliteDatabase.java b/src/main/java/com/raven/core/database/SqliteDatabase.java similarity index 99% rename from src/main/java/com/raven/core/db/SqliteDatabase.java rename to src/main/java/com/raven/core/database/SqliteDatabase.java index e6b1c37..b54f990 100644 --- a/src/main/java/com/raven/core/db/SqliteDatabase.java +++ b/src/main/java/com/raven/core/database/SqliteDatabase.java @@ -1,4 +1,4 @@ -package com.raven.core.db; +package com.raven.core.database; import com.raven.core.output.Logger; import com.raven.utils.ServerConfig; diff --git a/src/main/java/com/raven/core/db/TeamDatabase.java b/src/main/java/com/raven/core/database/TeamDatabase.java similarity index 99% rename from src/main/java/com/raven/core/db/TeamDatabase.java rename to src/main/java/com/raven/core/database/TeamDatabase.java index c95c413..59a9902 100644 --- a/src/main/java/com/raven/core/db/TeamDatabase.java +++ b/src/main/java/com/raven/core/database/TeamDatabase.java @@ -1,4 +1,4 @@ -package com.raven.core.db; +package com.raven.core.database; import com.raven.core.output.Logger; import com.raven.utils.ServerConfig; diff --git a/src/main/java/com/raven/core/server/RavenServer.java b/src/main/java/com/raven/core/server/RavenServer.java index a7fa5ce..63f4357 100644 --- a/src/main/java/com/raven/core/server/RavenServer.java +++ b/src/main/java/com/raven/core/server/RavenServer.java @@ -1,7 +1,7 @@ package com.raven.core.server; -import com.raven.core.crypto.CertificateManager; -import com.raven.core.crypto.SymmetricCrypto; +import com.raven.core.cryptography.CertificateManager; +import com.raven.core.cryptography.SymmetricCrypto; import com.raven.core.event.EventManager; import com.raven.core.event.EventManager.EventType; import com.raven.core.output.Logger; diff --git a/src/main/java/com/raven/interface/GUI/GUI.java b/src/main/java/com/raven/interface/GUI/GUI.java deleted file mode 100644 index c7ee6fb..0000000 --- a/src/main/java/com/raven/interface/GUI/GUI.java +++ /dev/null @@ -1,739 +0,0 @@ -package com.raven.interfaces.GUI; - -import com.raven.core.db.TeamDatabase; -import com.raven.core.event.EventManager.EventType; -import com.raven.core.output.Logger; -import com.raven.interfaces.GUI.module.core.database.AuthService; -import com.raven.interfaces.GUI.module.core.server.CommandDispatcher; -import com.raven.interfaces.GUI.module.core.server.ServerController; -import com.raven.interfaces.GUI.module.core.session.SessionManager; -import com.raven.interfaces.GUI.module.core.session.SessionRow; -import com.raven.interfaces.GUI.module.UI.button.ButtonFactory; -import com.raven.interfaces.GUI.module.UI.color.Palette; -import com.raven.interfaces.GUI.module.UI.frame.CardBuilder; -import com.raven.interfaces.GUI.module.UI.frame.StyleHelper; -import com.raven.interfaces.GUI.module.UI.label.LabelFactory; -import com.raven.utils.ServerConfig; -import com.raven.utils.SystemHelper; -import javafx.application.Application; -import javafx.application.Platform; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.geometry.Insets; -import javafx.geometry.Pos; -import javafx.scene.Scene; -import javafx.scene.control.*; -import javafx.scene.control.cell.PropertyValueFactory; -import javafx.scene.layout.*; -import javafx.scene.paint.Color; -import javafx.stage.Stage; - -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Map; -import java.util.concurrent.Executors; - -public class RavenGUI extends Application { - - private static ServerConfig Config; - private static boolean TeamMode = false; - - private AuthService Auth; - private SessionManager SessionMgr; - private ServerController ServerCtrl; - private CommandDispatcher Dispatcher; - - private final ObservableList SessionRows = FXCollections.observableArrayList(); - private final ObservableList LogEntries = FXCollections.observableArrayList(); - - private int SelectedSessionId = -1; - - private Label StatusLabel; - private Label UptimeLabel; - private Label SessionCountLabel; - private TableView SessionTable; - private TextArea TerminalOutput; - private TextArea LogOutput; - private TextField TermInputField; - private TextField CmdInputField; - private Label SelectedAgentLabel; - private Label ServerStatusLabel; - private Label ServerInfoLabel; - private TextField HostField; - private TextField PortField; - private Button StartBtn; - private Button StopBtn; - - public static void Launch(ServerConfig Cfg) { - Config = Cfg; - TeamMode = false; - Application.launch(RavenGUI.class); - } - - public static void LaunchTeamServer(ServerConfig Cfg) { - Config = Cfg; - TeamMode = true; - Application.launch(RavenGUI.class); - } - - @Override - public void start(Stage PrimaryStage) { - Auth = new AuthService(Config); - if (TeamMode && !ShowLoginDialog(PrimaryStage)) { - Platform.exit(); - return; - } - - PrimaryStage.setTitle("RAVEN"); - PrimaryStage.setWidth(1440); - PrimaryStage.setHeight(900); - PrimaryStage.setMinWidth(1100); - PrimaryStage.setMinHeight(720); - - BorderPane Root = new BorderPane(); - Root.setStyle("-fx-background-color: " + Palette.BG + ";"); - Root.setLeft(BuildSidebar(PrimaryStage)); - Root.setCenter(BuildMainContent()); - - Scene MainScene = new Scene(Root); - MainScene.getStylesheets().add( - getClass().getResource("/com/raven/interfaces/GUI/styles/css/raven.css").toExternalForm() - ); - - PrimaryStage.setScene(MainScene); - PrimaryStage.setOnCloseRequest(E -> { - if (ServerCtrl != null) ServerCtrl.Stop(); - Platform.exit(); - }); - PrimaryStage.show(); - StartUptimeTimer(); - } - - private VBox BuildSidebar(Stage Stage) { - VBox Sidebar = new VBox(); - Sidebar.setPrefWidth(240); - Sidebar.setStyle( - "-fx-background-color: linear-gradient(to bottom, #120006, #050505);" + - "-fx-border-color: transparent " + Palette.RED + " transparent transparent;" + - "-fx-border-width: 0 1.5 0 0;" - ); - - VBox Logo = new VBox(8); - Logo.setPadding(new Insets(28, 22, 18, 22)); - Logo.getChildren().addAll( - LabelFactory.Danger("◆", 38, true), - LabelFactory.Primary("RAVEN", 28, true), - LabelFactory.Muted("Black Ops Console", 10) - ); - Sidebar.getChildren().add(Logo); - Sidebar.getChildren().add(StyleHelper.HDivider()); - - VBox Meta = new VBox(12); - Meta.setPadding(new Insets(18, 22, 18, 22)); - Meta.getChildren().addAll( - BuildMiniInfo("VERSION", "3.0.0"), - BuildMiniInfo("MODE", Config.GetServerMode().toUpperCase()), - BuildMiniInfo("INTERFACE", TeamMode ? "TEAM GUI" : "SOLO GUI") - ); - VBox.setVgrow(Meta, Priority.ALWAYS); - Sidebar.getChildren().add(Meta); - - VBox Footer = new VBox(8); - Footer.setPadding(new Insets(14, 22, 18, 22)); - Footer.setStyle("-fx-border-color: " + Palette.BORDER + " transparent transparent transparent; -fx-border-width: 1;"); - StatusLabel = LabelFactory.Danger("● Offline", 11, true); - Footer.getChildren().addAll(StatusLabel, LabelFactory.Muted("MatrixTM26", 9)); - Sidebar.getChildren().add(Footer); - return Sidebar; - } - - private VBox BuildMiniInfo(String Key, String Value) { - VBox Box = new VBox(3); - Box.setPadding(new Insets(10, 12, 10, 12)); - Box.setStyle( - "-fx-background-color: rgba(255,31,61,0.08);" + - "-fx-background-radius: 12;" + - "-fx-border-color: rgba(255,31,61,0.45);" + - "-fx-border-radius: 12;" - ); - Box.getChildren().addAll(LabelFactory.Muted(Key, 8), LabelFactory.Primary(Value, 11, true)); - return Box; - } - - private BorderPane BuildMainContent() { - BorderPane Main = new BorderPane(); - Main.setStyle("-fx-background-color: " + Palette.BG + ";"); - - HBox TopBar = new HBox(); - TopBar.setPrefHeight(72); - TopBar.setAlignment(Pos.CENTER_LEFT); - TopBar.setStyle( - "-fx-background-color: linear-gradient(to right, #050505, #120006);" + - "-fx-border-color: transparent transparent " + Palette.RED + " transparent;" + - "-fx-border-width: 0 0 1.5 0;" - ); - TopBar.setPadding(new Insets(0, 24, 0, 24)); - - UptimeLabel = LabelFactory.Muted("00:00:00", 9); - SessionCountLabel = LabelFactory.Primary("⊟ 0 Sessions", 9, false); - - HBox Right = new HBox(16); - Right.setAlignment(Pos.CENTER_RIGHT); - HBox.setHgrow(Right, Priority.ALWAYS); - Right.getChildren().addAll(UptimeLabel, StyleHelper.VDivider(), SessionCountLabel); - - VBox Heading = new VBox(2); - Heading.getChildren().addAll( - LabelFactory.Primary("RAVEN Operations Console", 20, true), - LabelFactory.Muted("Listener control • Session ops • CLI-aligned command center", 10) - ); - - if (Auth.GetOperatorName() != null) { - Label OpLabel = LabelFactory.Primary( - "Op: " + Auth.GetOperatorName() + " [" + (Auth.GetOperatorRole() != null ? Auth.GetOperatorRole().name() : "?") + "]", 8, false - ); - TopBar.getChildren().addAll(Heading, OpLabel, Right); - } else { - TopBar.getChildren().addAll(Heading, Right); - } - Main.setTop(TopBar); - - TabPane Tabs = new TabPane(); - Tabs.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); - Tabs.setStyle("-fx-background-color: " + Palette.BG + "; -fx-tab-min-height: 42px; -fx-tab-max-height: 42px;"); - Tabs.getTabs().addAll( - Tab("Dashboard", BuildDashboardTab()), - Tab("Sessions", BuildSessionsTab()), - Tab("Terminal", BuildTerminalTab()), - Tab("Commands", BuildCommandCenterTab()), - Tab("Logs", BuildLogsTab()), - Tab("Settings", BuildSettingsTab()) - ); - Main.setCenter(Tabs); - return Main; - } - - private Tab Tab(String Name, javafx.scene.Node Content) { - Tab T = new Tab(Name); - T.setContent(Content); - return T; - } - - private ScrollPane BuildDashboardTab() { - VBox Content = new VBox(12); - Content.setPadding(new Insets(24)); - Content.setStyle("-fx-background-color: " + Palette.BG + ";"); - - GridPane Cards = new GridPane(); - Cards.setHgap(8); - Cards.setVgap(8); - Cards.add(CardBuilder.StatCard("⊟", "Total Sessions", "0", Palette.TEXT), 0, 0); - Cards.add(CardBuilder.StatCard("◉", "RAVEN", "0", Palette.RED), 1, 0); - Cards.add(CardBuilder.StatCard("◎", "Meterpreter", "0", Palette.TEXT), 2, 0); - Cards.add(CardBuilder.StatCard("◈", "Reverse Shell", "0", Palette.RED), 3, 0); - for (int I = 0; I < 4; I++) { - ColumnConstraints Col = new ColumnConstraints(); - Col.setPercentWidth(25); - Cards.getColumnConstraints().add(Col); - } - Content.getChildren().add(Cards); - - VBox Info = CardBuilder.Panel("TOOL INFORMATION"); - TextArea InfoText = new TextArea( - " Author : MatrixTM26\n" + - " Github : MatrixTM26\n" + - " Version : 3.0\n\n" + - " Use Sessions for fast actions and Commands for CLI-aligned workflows.\n" + - " Terminal executes agent commands; Command Center executes server/session utilities.\n\n" + - " GUI Commands:\n" + - " • sessions | status | stats | tasks\n" + - " • kill | sysinfo | note | getnote \n" + - " • history [id] [limit] | broadcast \n" + - " • exec | whoami | sleep \n" + - " • screenshot | download | upload " - ); - InfoText.setEditable(false); - InfoText.setPrefHeight(200); - StyleHelper.ApplyTermStyle(InfoText); - Info.getChildren().add(InfoText); - Content.getChildren().add(Info); - - ScrollPane Scroll = new ScrollPane(Content); - Scroll.setFitToWidth(true); - Scroll.setStyle("-fx-background-color: " + Palette.BG + ";"); - return Scroll; - } - - private VBox BuildSessionsTab() { - VBox Content = new VBox(8); - Content.setPadding(new Insets(12)); - Content.setStyle("-fx-background-color: " + Palette.BG + ";"); - - HBox Toolbar = new HBox(8); - Toolbar.setAlignment(Pos.CENTER_LEFT); - TextField Search = new TextField(); - Search.setPromptText("🔍 Search sessions..."); - StyleHelper.ApplyInputStyle(Search); - Search.setPrefWidth(220); - HBox.setHgrow(Search, Priority.ALWAYS); - - Button Refresh = ButtonFactory.Styled("⟳ Refresh", Palette.TEXT, true); - Button Execute = ButtonFactory.Styled("▶ Execute", Palette.RED, false); - Button Broadcast = ButtonFactory.Styled("⇶ Broadcast", Palette.TEXT, true); - Button Kill = ButtonFactory.Styled("⊘ Kill", Palette.RED, false); - Refresh.setOnAction(E -> SessionMgr.Refresh()); - Execute.setOnAction(E -> OpenExecuteWindow()); - Broadcast.setOnAction(E -> OpenBroadcastWindow()); - Kill.setOnAction(E -> KillSelected()); - Toolbar.getChildren().addAll(Search, Refresh, Execute, Broadcast, Kill); - Content.getChildren().add(Toolbar); - - HBox CmdRow = new HBox(8); - CmdRow.setAlignment(Pos.CENTER_LEFT); - CmdRow.setPadding(new Insets(4, 0, 4, 0)); - Label CmdLbl = LabelFactory.Danger("COMMAND:", 9); - CmdLbl.setStyle("-fx-font-weight: bold;"); - TextField SrvInput = new TextField(); - SrvInput.setPromptText("sessions | status | stats | tasks | kill | sysinfo | history [id] [limit] | note | exec "); - StyleHelper.ApplyInputStyle(SrvInput); - HBox.setHgrow(SrvInput, Priority.ALWAYS); - Button SrvExec = ButtonFactory.Styled("RUN", Palette.RED, false); - SrvExec.setOnAction(E -> Dispatcher.Dispatch(SrvInput.getText().trim(), SrvInput)); - SrvInput.setOnAction(E -> Dispatcher.Dispatch(SrvInput.getText().trim(), SrvInput)); - CmdRow.getChildren().addAll(CmdLbl, SrvInput, SrvExec); - Content.getChildren().add(CmdRow); - - SessionTable = new TableView<>(SessionRows); - SessionTable.setStyle( - "-fx-background-color: " + Palette.CARD + ";" + - "-fx-control-inner-background: " + Palette.CARD + ";" + - "-fx-table-cell-border-color: " + Palette.BORDER + ";" + - "-fx-table-header-border-color: " + Palette.BORDER + ";" + - "-fx-text-fill: " + Palette.TEXT + ";" + - "-fx-background-radius: 12;" - ); - String[] ColNames = {"ID", "Type", "Name/Cert", "IP", "OS", "User", "Host", "Session Key"}; - String[] Props = {"id", "type", "name", "ip", "os", "user", "host", "joined"}; - for (int I = 0; I < ColNames.length; I++) { - TableColumn Col = new TableColumn<>(ColNames[I]); - Col.setCellValueFactory(new PropertyValueFactory<>(Props[I])); - Col.setStyle("-fx-alignment: CENTER_LEFT; -fx-text-fill: " + Palette.TEXT + ";"); - SessionTable.getColumns().add(Col); - } - SessionTable.getSelectionModel().selectedItemProperty().addListener((Obs, Old, New) -> { - if (New != null) { - SelectedSessionId = Integer.parseInt(New.getId()); - if (SelectedAgentLabel != null) - SelectedAgentLabel.setText("● " + New.getName() + " #" + SelectedSessionId); - } - }); - VBox.setVgrow(SessionTable, Priority.ALWAYS); - Content.getChildren().add(SessionTable); - return Content; - } - - private VBox BuildTerminalTab() { - VBox Content = new VBox(8); - Content.setPadding(new Insets(12)); - Content.setStyle("-fx-background-color: " + Palette.BG + ";"); - - HBox Header = new HBox(8); - Header.setAlignment(Pos.CENTER_LEFT); - TermInputField = new TextField(); - TermInputField.setPrefWidth(80); - StyleHelper.ApplyInputStyle(TermInputField); - SelectedAgentLabel = LabelFactory.Muted("○ No agent selected", 9); - Button ClearBtn = ButtonFactory.Styled("Clear", Palette.CARD, false); - ClearBtn.setOnAction(E -> { if (TerminalOutput != null) TerminalOutput.clear(); }); - HBox.setHgrow(SelectedAgentLabel, Priority.ALWAYS); - Header.getChildren().addAll(LabelFactory.Muted("Session ID:", 9), TermInputField, SelectedAgentLabel, ClearBtn); - Content.getChildren().add(Header); - - TerminalOutput = new TextArea(); - TerminalOutput.setEditable(false); - TerminalOutput.setPrefHeight(400); - StyleHelper.ApplyTermStyle(TerminalOutput); - VBox.setVgrow(TerminalOutput, Priority.ALWAYS); - Content.getChildren().add(TerminalOutput); - - HBox InputRow = new HBox(8); - InputRow.setAlignment(Pos.CENTER_LEFT); - CmdInputField = new TextField(); - CmdInputField.setPromptText("Enter command..."); - StyleHelper.ApplyInputStyle(CmdInputField); - HBox.setHgrow(CmdInputField, Priority.ALWAYS); - Button SendBtn = ButtonFactory.Styled("Send", Palette.ACCENT, false); - SendBtn.setOnAction(E -> SendTerminalCommand()); - CmdInputField.setOnAction(E -> SendTerminalCommand()); - InputRow.getChildren().addAll(LabelFactory.Primary("❯", 11, true), CmdInputField, SendBtn); - Content.getChildren().add(InputRow); - return Content; - } - - private VBox BuildCommandCenterTab() { - VBox Content = new VBox(12); - Content.setPadding(new Insets(18)); - Content.setStyle("-fx-background-color: " + Palette.BG + ";"); - - VBox Help = CardBuilder.Panel("CLI-ALIGNED COMMANDS"); - TextArea HelpText = new TextArea( - "Server: sessions | status | stats | tasks\n" + - "Session: exec | kill | sysinfo \n" + - "Ops: broadcast | whoami | sleep \n" + - "Files: screenshot | download | upload \n" + - "Notes/History: note | getnote | history [id] [limit]" - ); - HelpText.setEditable(false); - HelpText.setPrefHeight(120); - StyleHelper.ApplyTermStyle(HelpText); - Help.getChildren().add(HelpText); - - HBox InputRow = new HBox(10); - InputRow.setAlignment(Pos.CENTER_LEFT); - TextField CommandInput = new TextField(); - CommandInput.setPromptText("Type GUI command matching CLI syntax..."); - StyleHelper.ApplyInputStyle(CommandInput); - HBox.setHgrow(CommandInput, Priority.ALWAYS); - Button Run = ButtonFactory.Styled("EXECUTE", Palette.RED, false); - Button Clear = ButtonFactory.Styled("CLEAR LOGS", Palette.TEXT, true); - Run.setOnAction(E -> Dispatcher.Dispatch(CommandInput.getText().trim(), CommandInput)); - CommandInput.setOnAction(E -> Dispatcher.Dispatch(CommandInput.getText().trim(), CommandInput)); - Clear.setOnAction(E -> { - LogEntries.clear(); - if (LogOutput != null) LogOutput.clear(); - }); - InputRow.getChildren().addAll(LabelFactory.Danger("❯", 16, true), CommandInput, Run, Clear); - - TextArea Mirror = new TextArea(); - Mirror.setEditable(false); - Mirror.setText("Command Center writes output to the Logs tab and mirrors operational events.\nStart the server first from Settings, then use Sessions/Commands."); - StyleHelper.ApplyTermStyle(Mirror); - VBox.setVgrow(Mirror, Priority.ALWAYS); - - Content.getChildren().addAll(Help, InputRow, Mirror); - return Content; - } - - private VBox BuildLogsTab() { - VBox Content = new VBox(8); - Content.setPadding(new Insets(12)); - Content.setStyle("-fx-background-color: " + Palette.BG + ";"); - - HBox Toolbar = new HBox(8); - Toolbar.setAlignment(Pos.CENTER_RIGHT); - Button ExportBtn = ButtonFactory.Styled("Export", Palette.TEXT, true); - Button ClearBtn = ButtonFactory.Styled("Clear", Palette.RED, false); - ClearBtn.setOnAction(E -> { - LogEntries.clear(); - if (LogOutput != null) LogOutput.clear(); - }); - Toolbar.getChildren().addAll(ExportBtn, ClearBtn); - Content.getChildren().add(Toolbar); - - LogOutput = new TextArea(); - LogOutput.setEditable(false); - StyleHelper.ApplyTermStyle(LogOutput); - VBox.setVgrow(LogOutput, Priority.ALWAYS); - Content.getChildren().add(LogOutput); - return Content; - } - - private ScrollPane BuildSettingsTab() { - VBox Content = new VBox(16); - Content.setPadding(new Insets(16)); - Content.setStyle("-fx-background-color: " + Palette.BG + ";"); - - VBox ServerCard = CardBuilder.Panel("Server Configuration"); - GridPane Fields = new GridPane(); - Fields.setHgap(16); - Fields.setVgap(8); - HostField = new TextField(Config.GetServerHost()); - PortField = new TextField(String.valueOf(Config.GetServerPort())); - StyleHelper.ApplyInputStyle(HostField); - StyleHelper.ApplyInputStyle(PortField); - Fields.add(LabelFactory.Muted("Host:", 9), 0, 0); - Fields.add(HostField, 1, 0); - Fields.add(LabelFactory.Muted("Port:", 9), 0, 1); - Fields.add(PortField, 1, 1); - ServerCard.getChildren().add(Fields); - - HBox Btns = new HBox(8); - StartBtn = ButtonFactory.Styled("▶ START SERVER", Palette.RED, false); - StopBtn = ButtonFactory.Styled("◼ STOP SERVER", Palette.RED, false); - StopBtn.setDisable(true); - StartBtn.setOnAction(E -> InitServer()); - StopBtn.setOnAction(E -> ServerCtrl.Stop()); - Btns.getChildren().addAll(StartBtn, StopBtn); - ServerCard.getChildren().add(Btns); - - VBox StatusCard = CardBuilder.Panel("Server Status"); - ServerStatusLabel = LabelFactory.Danger("● OFFLINE", 16, true); - ServerInfoLabel = LabelFactory.Muted("Not running", 10); - StatusCard.getChildren().addAll(ServerStatusLabel, ServerInfoLabel); - - Content.getChildren().addAll(ServerCard, StatusCard); - ScrollPane Scroll = new ScrollPane(Content); - Scroll.setFitToWidth(true); - Scroll.setStyle("-fx-background-color: " + Palette.BG + ";"); - return Scroll; - } - - private void InitServer() { - String Host = HostField.getText().trim(); - int Port; - try { - Port = Integer.parseInt(PortField.getText().trim()); - } catch (NumberFormatException E) { - ShowAlert("Invalid port number"); - return; - } - ServerCtrl = new ServerController( - Config, StatusLabel, ServerStatusLabel, ServerInfoLabel, StartBtn, StopBtn, - this::AddLog, this::EventHandler, - () -> { - SessionMgr = new SessionManager(ServerCtrl.GetServer(), Auth.GetDb(), SessionRows, SessionCountLabel); - Dispatcher = new CommandDispatcher(ServerCtrl.GetServer(), Auth.GetDb(), SessionMgr, this::AddLog, Auth.GetOperatorName()); - }, - () -> Platform.runLater(() -> { - SessionRows.clear(); - SessionCountLabel.setText("⊟ 0 Sessions"); - }) - ); - ServerCtrl.Start(Host, Port); - } - - private boolean ShowLoginDialog(Stage Owner) { - Dialog Dlg = new Dialog<>(); - Dlg.setTitle("TeamServer Login"); - Dlg.setHeaderText("RAVEN — Authentication"); - Dlg.initOwner(Owner); - - GridPane Grid = new GridPane(); - Grid.setHgap(12); - Grid.setVgap(8); - Grid.setPadding(new Insets(20, 20, 10, 20)); - - TextField UserField = new TextField(); - UserField.setPromptText("Username"); - PasswordField PassField = new PasswordField(); - PassField.setPromptText("Password"); - Label ErrLabel = new Label(""); - ErrLabel.setTextFill(Color.web(Palette.RED)); - - Grid.add(new Label("Username:"), 0, 0); - Grid.add(UserField, 1, 0); - Grid.add(new Label("Password:"), 0, 1); - Grid.add(PassField, 1, 1); - Grid.add(ErrLabel, 1, 2); - - ButtonType LoginBtn = new ButtonType("Login", ButtonBar.ButtonData.OK_DONE); - Dlg.getDialogPane().getButtonTypes().addAll(LoginBtn, ButtonType.CANCEL); - Dlg.getDialogPane().setContent(Grid); - Dlg.getDialogPane().setStyle("-fx-background-color: " + Palette.BG + ";"); - - Dlg.setResultConverter(Btn -> { - if (Btn == LoginBtn) { - return Auth.Authenticate(UserField.getText().trim(), PassField.getText()) ? true : null; - } - return false; - }); - - for (int I = 0; I < 3; I++) { - java.util.Optional Result = Dlg.showAndWait(); - if (Result.isEmpty() || Boolean.FALSE.equals(Result.get())) return false; - if (Boolean.TRUE.equals(Result.get())) return true; - ErrLabel.setText("Invalid credentials"); - } - return false; - } - - private void SendTerminalCommand() { - if (CmdInputField == null) return; - String SidStr = TermInputField.getText().trim(); - String Cmd = CmdInputField.getText().trim(); - if (SidStr.isEmpty() || Cmd.isEmpty()) return; - int Sid; - try { - Sid = Integer.parseInt(SidStr); - } catch (NumberFormatException E) { - WriteTerminal("[!] Invalid session ID\n"); - return; - } - if (ServerCtrl == null || !ServerCtrl.IsRunning()) { - WriteTerminal("[!] Server not running\n"); - return; - } - WriteTerminal("❯ " + Cmd + "\n"); - CmdInputField.clear(); - AddLog("[>] #" + Sid + ": " + Cmd); - final int FinalSid = Sid; - Executors.newSingleThreadExecutor().submit(() -> { - String[] Result = ServerCtrl.GetServer().ExecuteCommand(FinalSid, Cmd); - boolean Ok = Boolean.parseBoolean(Result[0]); - Platform.runLater(() -> { - WriteTerminal(Result[1] + "\n\n"); - AddLog((Ok ? "[+]" : "[!]") + " #" + FinalSid + ": " + (Ok ? "OK" : Result[1])); - }); - }); - } - - private void OpenExecuteWindow() { - if (SelectedSessionId < 0) { ShowAlert("Select a session first"); return; } - Stage Win = new Stage(); - Win.setTitle("Execute — SESSION-" + SelectedSessionId); - Win.setWidth(650); - Win.setHeight(450); - VBox Layout = new VBox(8); - Layout.setPadding(new Insets(12)); - Layout.setStyle("-fx-background-color: " + Palette.BG + ";"); - TextArea Out = new TextArea(); - Out.setEditable(false); - StyleHelper.ApplyTermStyle(Out); - VBox.setVgrow(Out, Priority.ALWAYS); - TextField Entry = new TextField(); - Entry.setPromptText("Enter command..."); - StyleHelper.ApplyInputStyle(Entry); - HBox.setHgrow(Entry, Priority.ALWAYS); - Button Run = ButtonFactory.Styled("Run", Palette.RED, false); - final int Sid = SelectedSessionId; - Runnable Exec = () -> { - String Cmd = Entry.getText().trim(); - if (Cmd.isEmpty()) return; - Out.appendText("❯ " + Cmd + "\n"); - Entry.clear(); - Executors.newSingleThreadExecutor().submit(() -> { - String[] Result = ServerCtrl.GetServer().ExecuteCommand(Sid, Cmd); - Platform.runLater(() -> Out.appendText(Result[1] + "\n\n")); - }); - }; - Run.setOnAction(E -> Exec.run()); - Entry.setOnAction(E -> Exec.run()); - HBox Input = new HBox(8); - Input.getChildren().addAll(LabelFactory.Primary("❯", 11, true), Entry, Run); - Layout.getChildren().addAll(Out, Input); - Win.setScene(new Scene(Layout)); - Win.show(); - Entry.requestFocus(); - } - - private void OpenBroadcastWindow() { - if (ServerCtrl == null || !ServerCtrl.IsRunning()) { ShowAlert("Server not running"); return; } - Stage Win = new Stage(); - Win.setTitle("Broadcast Command"); - Win.setWidth(600); - Win.setHeight(500); - VBox Layout = new VBox(8); - Layout.setPadding(new Insets(12)); - Layout.setStyle("-fx-background-color: " + Palette.BG + ";"); - - TextField TargetField = new TextField(); - TargetField.setPromptText("Session IDs: 1,2,3 or all"); - StyleHelper.ApplyInputStyle(TargetField); - HBox.setHgrow(TargetField, Priority.ALWAYS); - HBox TargetRow = new HBox(8); - TargetRow.setAlignment(Pos.CENTER_LEFT); - TargetRow.getChildren().addAll(LabelFactory.Muted("Target:", 9), TargetField); - - TextArea Out = new TextArea(); - Out.setEditable(false); - StyleHelper.ApplyTermStyle(Out); - VBox.setVgrow(Out, Priority.ALWAYS); - - TextField CmdField = new TextField(); - CmdField.setPromptText("Enter command..."); - StyleHelper.ApplyInputStyle(CmdField); - HBox.setHgrow(CmdField, Priority.ALWAYS); - Button RunBtn = ButtonFactory.Styled("⇶ Broadcast", Palette.RED, false); - - Runnable DoBroadcast = () -> { - String Target = TargetField.getText().trim(); - String Cmd = CmdField.getText().trim(); - if (Target.isEmpty() || Cmd.isEmpty()) return; - Out.appendText("⟳ Broadcasting [" + Target + "]: " + Cmd + "\n"); - CmdField.clear(); - Executors.newSingleThreadExecutor().submit(() -> { - Map Results; - if (Target.equalsIgnoreCase("all")) { - Results = ServerCtrl.GetServer().BroadcastAll(Cmd); - } else { - java.util.List Ids = new java.util.ArrayList<>(); - for (String S : Target.split(",")) { - try { Ids.add(Integer.parseInt(S.trim())); } - catch (NumberFormatException Ignored) {} - } - Results = ServerCtrl.GetServer().BroadcastCommand(Ids, Cmd); - } - final Map FinalResults = Results; - Platform.runLater(() -> FinalResults.forEach((Id, Res) -> { - boolean Ok = Boolean.parseBoolean(Res[0]); - Out.appendText("SESSION-" + Id + (Ok ? " ✔" : " ✘") + ":\n" + Res[1] + "\n\n"); - Auth.GetDb().SaveCommandLog(Id, "operator", Cmd, Res[1], Ok); - })); - }); - }; - RunBtn.setOnAction(E -> DoBroadcast.run()); - CmdField.setOnAction(E -> DoBroadcast.run()); - HBox InputRow = new HBox(8); - InputRow.setAlignment(Pos.CENTER_LEFT); - InputRow.getChildren().addAll(LabelFactory.Primary("❯", 11, true), CmdField, RunBtn); - Layout.getChildren().addAll(TargetRow, Out, InputRow); - Win.setScene(new Scene(Layout)); - Win.show(); - CmdField.requestFocus(); - } - - private void KillSelected() { - if (SelectedSessionId < 0) { ShowAlert("Select a session first"); return; } - Alert Confirm = new Alert(Alert.AlertType.CONFIRMATION, "Terminate SESSION-" + SelectedSessionId + "?"); - Confirm.showAndWait().ifPresent(R -> { - if (R == ButtonType.OK) { - SessionMgr.Kill(SelectedSessionId); - SelectedSessionId = -1; - if (SelectedAgentLabel != null) SelectedAgentLabel.setText("○ No agent selected"); - } - }); - } - - private void EventHandler(EventType Type, Map Data) { - switch (Type) { - case AgentConnected -> { AddLog("[+] [" + Data.get("Type") + "] SESSION-" + Data.get("ID") + ": " + Data.get("AgentName") + " (" + Data.get("OS") + ")"); Platform.runLater(() -> SessionMgr.Refresh()); } - case AgentDisconnected -> { AddLog("[-] SESSION-" + Data.get("ID") + " disconnected: " + Data.get("Reason")); Platform.runLater(() -> SessionMgr.Refresh()); } - case Error -> AddLog("[!] " + Data.get("Message")); - } - } - - private void AddLog(String Msg) { - String Ts = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")); - String Entry = "[" + Ts + "] " + Msg; - LogEntries.add(Entry); - if (LogEntries.size() > Config.GetMaxLogEntries()) LogEntries.remove(0); - Platform.runLater(() -> { if (LogOutput != null) LogOutput.appendText(Entry + "\n"); }); - } - - private void WriteTerminal(String Text) { - if (TerminalOutput != null) TerminalOutput.appendText(Text); - } - - private void StartUptimeTimer() { - Thread Timer = new Thread(() -> { - while (true) { - try { Thread.sleep(1000); } catch (InterruptedException Ignored) {} - if (ServerCtrl != null && ServerCtrl.GetStartTime() != null) { - long S = Duration.between(ServerCtrl.GetStartTime(), Instant.now()).getSeconds(); - String Up = SystemHelper.FormatUptime(S); - Platform.runLater(() -> { if (UptimeLabel != null) UptimeLabel.setText("TIME: " + Up); }); - } - } - }); - Timer.setDaemon(true); - Timer.start(); - } - - private void ShowAlert(String Msg) { - Alert A = new Alert(Alert.AlertType.WARNING, Msg); - A.setHeaderText(null); - A.showAndWait(); - } -} diff --git a/src/main/java/com/raven/interface/GUI/module/UI/button/ButtonFactory.java b/src/main/java/com/raven/interface/GUI/module/UI/button/ButtonFactory.java deleted file mode 100644 index 93535b3..0000000 --- a/src/main/java/com/raven/interface/GUI/module/UI/button/ButtonFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.raven.interfaces.GUI.module.UI.button; - -import javafx.scene.control.Button; - -public final class ButtonFactory { - - private ButtonFactory() {} - - public static Button Styled(String Text, String Hex, boolean Outline) { - Button B = new Button(Text); - B.setStyle( - "-fx-background-color: " + (Outline ? "transparent" : Hex) + ";" + - "-fx-text-fill: " + (Outline ? Hex : "#ffffff") + ";" + - "-fx-border-color: " + Hex + ";" + - "-fx-border-width: 1.2;" + - "-fx-border-radius: 10;" + - "-fx-font-family: 'Segoe UI';" + - "-fx-font-size: 10px;" + - "-fx-font-weight: bold;" + - "-fx-padding: 8 16 8 16;" + - "-fx-background-radius: 10;" + - "-fx-cursor: hand;" - ); - return B; - } -} diff --git a/src/main/java/com/raven/interface/GUI/module/UI/color/Palette.java b/src/main/java/com/raven/interface/GUI/module/UI/color/Palette.java deleted file mode 100644 index 0508d22..0000000 --- a/src/main/java/com/raven/interface/GUI/module/UI/color/Palette.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.raven.interfaces.GUI.module.UI.color; - -public final class Palette { - - private Palette() {} - - public static final String BG = "#050505"; - public static final String NAV = "#0b0b0d"; - public static final String CARD = "#101014"; - public static final String CARD2 = "#17171c"; - public static final String ACCENT = "#ffffff"; - public static final String RED = "#ff1f3d"; - public static final String TEXT = "#ffffff"; - public static final String MUTED = "#a7a7ad"; - public static final String BORDER = "#2a2a31"; - public static final String PURPLE = "#ff4d63"; - public static final String ORANGE = "#d6d6db"; - public static final String TERM_BG = "#050812"; -} diff --git a/src/main/java/com/raven/interface/GUI/module/UI/frame/CardBuilder.java b/src/main/java/com/raven/interface/GUI/module/UI/frame/CardBuilder.java deleted file mode 100644 index 837efb3..0000000 --- a/src/main/java/com/raven/interface/GUI/module/UI/frame/CardBuilder.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.raven.interfaces.GUI.module.UI.frame; - -import com.raven.interfaces.GUI.module.UI.color.Palette; -import com.raven.interfaces.GUI.module.UI.label.LabelFactory; -import javafx.geometry.Insets; -import javafx.scene.control.Separator; -import javafx.scene.layout.VBox; - -public final class CardBuilder { - - private CardBuilder() {} - - public static VBox StatCard(String Icon, String Title, String Value, String Hex) { - VBox Card = new VBox(4); - Card.setPadding(new Insets(18)); - Card.setStyle( - "-fx-background-color: linear-gradient(to bottom right, #111114, #070707);" + - "-fx-background-radius: 18;" + - "-fx-border-color: " + Hex + ";" + - "-fx-border-radius: 18;" + - "-fx-effect: dropshadow(gaussian, rgba(255,31,61,0.16), 22, 0.22, 0, 10);" - ); - Card.setMinHeight(104); - javafx.scene.layout.HBox Row = new javafx.scene.layout.HBox(8); - Row.setAlignment(javafx.geometry.Pos.CENTER_LEFT); - Row.getChildren().addAll( - LabelFactory.Styled(Icon, 28, Hex, false), - new VBox(2) {{ - getChildren().addAll( - LabelFactory.Styled(Title, 10, Palette.MUTED, false), - LabelFactory.Styled(Value, 24, Hex, true) - ); - }} - ); - Card.getChildren().add(Row); - return Card; - } - - public static VBox Panel(String Title) { - VBox Card = new VBox(8); - Card.setPadding(new Insets(18)); - Card.setStyle( - "-fx-background-color: linear-gradient(to bottom right, #111114, #090909);" + - "-fx-background-radius: 18;" + - "-fx-border-color: " + Palette.BORDER + ";" + - "-fx-border-radius: 18;" + - "-fx-effect: dropshadow(gaussian, rgba(255,31,61,0.12), 18, 0.16, 0, 8);" - ); - Separator Sep = new Separator(); - Sep.setStyle("-fx-background-color: " + Palette.BORDER + ";"); - Card.getChildren().addAll(LabelFactory.Primary(Title, 12, true), Sep); - return Card; - } -} diff --git a/src/main/java/com/raven/interface/GUI/module/UI/frame/StyleHelper.java b/src/main/java/com/raven/interface/GUI/module/UI/frame/StyleHelper.java deleted file mode 100644 index 0f02439..0000000 --- a/src/main/java/com/raven/interface/GUI/module/UI/frame/StyleHelper.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.raven.interfaces.GUI.module.UI.frame; - -import com.raven.interfaces.GUI.module.UI.color.Palette; -import javafx.geometry.Insets; -import javafx.scene.control.Separator; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; -import javafx.scene.layout.Region; - -public final class StyleHelper { - - private StyleHelper() {} - - public static void ApplyInputStyle(TextField F) { - F.setStyle( - "-fx-background-color: " + Palette.CARD2 + ";" + - "-fx-text-fill: " + Palette.TEXT + ";" + - "-fx-prompt-text-fill: " + Palette.MUTED + ";" + - "-fx-font-family: 'Consolas';" + - "-fx-font-size: 11px;" + - "-fx-padding: 9 12 9 12;" + - "-fx-background-radius: 9;" + - "-fx-border-color: " + Palette.BORDER + ";" + - "-fx-border-radius: 9;" - ); - } - - public static void ApplyTermStyle(TextArea A) { - A.setStyle( - "-fx-background-color: " + Palette.TERM_BG + ";" + - "-fx-control-inner-background: " + Palette.TERM_BG + ";" + - "-fx-text-fill: " + Palette.TEXT + ";" + - "-fx-highlight-fill: " + Palette.RED + ";" + - "-fx-font-family: 'Consolas';" + - "-fx-font-size: 11px;" + - "-fx-padding: 12 14 12 14;" + - "-fx-background-radius: 12;" + - "-fx-border-color: " + Palette.BORDER + ";" + - "-fx-border-radius: 12;" - ); - A.setWrapText(true); - } - - public static Region VDivider() { - Region R = new Region(); - R.setStyle("-fx-background-color: " + Palette.BORDER + ";"); - R.setPrefWidth(1); - R.setPrefHeight(20); - return R; - } - - public static Separator HDivider() { - Separator S = new Separator(); - S.setPadding(new Insets(4, 16, 4, 16)); - S.setStyle("-fx-background-color: " + Palette.BORDER + ";"); - return S; - } -} diff --git a/src/main/java/com/raven/interface/GUI/module/UI/label/LabelFactory.java b/src/main/java/com/raven/interface/GUI/module/UI/label/LabelFactory.java deleted file mode 100644 index fceb4fd..0000000 --- a/src/main/java/com/raven/interface/GUI/module/UI/label/LabelFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.raven.interfaces.GUI.module.UI.label; - -import com.raven.interfaces.GUI.module.UI.color.Palette; -import javafx.scene.control.Label; -import javafx.scene.paint.Color; -import javafx.scene.text.Font; -import javafx.scene.text.FontWeight; - -public final class LabelFactory { - - private LabelFactory() {} - - public static Label Styled(String Text, int Size, String Hex, boolean Bold) { - Label L = new Label(Text); - L.setFont(Font.font("Segoe UI", Bold ? FontWeight.BOLD : FontWeight.NORMAL, Size)); - L.setTextFill(Color.web(Hex)); - return L; - } - - public static Label Muted(String Text, int Size) { - return Styled(Text, Size, Palette.MUTED, false); - } - - public static Label Primary(String Text, int Size, boolean Bold) { - return Styled(Text, Size, Palette.TEXT, Bold); - } - - public static Label Danger(String Text, int Size, boolean Bold) { - return Styled(Text, Size, Palette.RED, Bold); - } -} diff --git a/src/main/java/com/raven/interface/GUI/module/core/database/AuthService.java b/src/main/java/com/raven/interface/GUI/module/core/database/AuthService.java deleted file mode 100644 index 612b454..0000000 --- a/src/main/java/com/raven/interface/GUI/module/core/database/AuthService.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.raven.interfaces.GUI.module.core.database; - -import com.raven.core.db.TeamDatabase; -import com.raven.core.output.Logger; -import com.raven.utils.ServerConfig; - -public class AuthService { - - private final TeamDatabase Db; - private String OperatorName; - private TeamDatabase.OperatorRole OperatorRole; - - public AuthService(ServerConfig Config) { - this.Db = TeamDatabase.Connect(Config); - } - - public boolean Authenticate(String Username, String Password) { - if (Db.ValidateOperator(Username, TeamDatabase.HashPassword(Password))) { - OperatorName = Username; - OperatorRole = Db.GetOperatorRole(Username); - Logger.Info("GUI operator login: " + OperatorName + " [" + OperatorRole + "]"); - return true; - } - return false; - } - - public String GetOperatorName() { return OperatorName; } - public TeamDatabase.OperatorRole GetOperatorRole() { return OperatorRole; } - public TeamDatabase GetDb() { return Db; } -} diff --git a/src/main/java/com/raven/interface/GUI/module/core/server/CommandDispatcher.java b/src/main/java/com/raven/interface/GUI/module/core/server/CommandDispatcher.java deleted file mode 100644 index 9d68255..0000000 --- a/src/main/java/com/raven/interface/GUI/module/core/server/CommandDispatcher.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.raven.interfaces.GUI.module.core.server; - -import com.raven.core.db.TeamDatabase; -import com.raven.core.server.RavenServer; -import com.raven.core.session.Session; -import com.raven.interfaces.GUI.module.core.session.SessionManager; -import javafx.application.Platform; -import javafx.scene.control.TextField; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.Executors; -import java.util.function.Consumer; - -public class CommandDispatcher { - - private final RavenServer Server; - private final TeamDatabase Db; - private final SessionManager SessionMgr; - private final Consumer LogSink; - private final String OperatorName; - - public CommandDispatcher(RavenServer server, TeamDatabase db, - SessionManager sessionMgr, - Consumer logSink, - String operatorName) { - this.Server = server; - this.Db = db; - this.SessionMgr = sessionMgr; - this.LogSink = logSink; - this.OperatorName = operatorName; - } - - public void Dispatch(String Cmd, TextField Input) { - if (Cmd == null || Cmd.isBlank()) return; - if (Server == null || !Server.IsRunning()) { - LogSink.accept("[!] Server not running"); - return; - } - String[] Parts = Cmd.trim().split("\\s+", 2); - switch (Parts[0].toLowerCase()) { - case "sessions", "agents" -> DispatchSessions(); - case "kill" -> DispatchKill(Parts); - case "status" -> DispatchStatus(); - case "stats" -> DispatchStats(); - case "tasks" -> DispatchTasks(); - case "broadcast" -> DispatchBroadcast(Parts); - case "exec" -> DispatchExec(Parts.length > 1 ? Parts[1] : ""); - case "whoami", "screenshot" -> DispatchShortcut(Parts, Parts[0].toLowerCase()); - case "sleep" -> DispatchSleep(Parts); - case "download" -> DispatchDownload(Parts); - case "upload" -> DispatchUpload(Parts); - case "sysinfo", "info" -> DispatchSysInfo(Parts.length > 1 ? Parts[1] : ""); - case "note" -> DispatchNote(Parts.length > 1 ? Parts[1] : ""); - case "getnote" -> DispatchGetNote(Parts.length > 1 ? Parts[1] : ""); - case "history" -> DispatchHistory(Parts.length > 1 ? Parts[1] : ""); - default -> LogSink.accept("[!] Unknown command: " + Parts[0]); - } - if (Input != null) Platform.runLater(Input::clear); - } - - private void DispatchSessions() { - int N = Server.GetSessions().Count(); - LogSink.accept("[*] Sessions (" + N + "):"); - Server.GetSessions().GetAll() - .forEach(S -> LogSink.accept(" #" + S.GetId() + " [" + S.GetDisplayName() + "] " - + S.GetUser() + "@" + S.GetHostname() + " key=" + S.GetSessionKey())); - Platform.runLater(SessionMgr::Refresh); - } - - private void DispatchKill(String[] Parts) { - if (Parts.length < 2) { LogSink.accept("[!] Usage: kill "); return; } - try { - int Id = Integer.parseInt(Parts[1].trim()); - Server.RemoveSession(Id); - LogSink.accept("[+] Session-" + Id + " terminated"); - Platform.runLater(SessionMgr::Refresh); - } catch (NumberFormatException E) { - LogSink.accept("[!] Invalid session ID"); - } - } - - private void DispatchStatus() { - LogSink.accept("[*] Status: " + (Server.IsRunning() ? "ONLINE" : "OFFLINE")); - LogSink.accept("[*] Mode: " + Server.GetMode().name() + " | Host: " + Server.GetHost() + ":" + Server.GetPort()); - LogSink.accept("[*] Sessions: " + Server.GetSessions().Count()); - LogSink.accept("[*] Key: " + Server.GetKeyBase64()); - } - - private void DispatchStats() { - Map Stats = Server.GetSessions().GetStats(); - LogSink.accept("[*] Total: " + Stats.get("Total")); - LogSink.accept("[*] RAVEN: " + Stats.get("RAVEN")); - LogSink.accept("[*] Meterpreter: " + Stats.get("METERPRETER")); - LogSink.accept("[*] Reverse Shell: " + Stats.get("REVERSE_SHELL")); - } - - private void DispatchTasks() { - LogSink.accept("[*] Active sessions: " + Server.GetSessions().Count() + " — use exec/broadcast to run tasks"); - } - - private void DispatchBroadcast(String[] Parts) { - if (Parts.length < 2) { LogSink.accept("[!] Usage: broadcast "); return; } - String BCmd = Parts[1]; - LogSink.accept("[>] Broadcast → " + BCmd); - Map R = Server.BroadcastAll(BCmd); - R.forEach((Id, Res) -> LogSink.accept(" [" + Id + "] " + (Boolean.parseBoolean(Res[0]) ? "✔ " : "✘ ") + Res[1])); - } - - private void DispatchExec(String Body) { - String[] Args = Body.trim().split("\\s+", 2); - if (Args.length < 2) { LogSink.accept("[!] Usage: exec "); return; } - try { - int Sid = Integer.parseInt(Args[0]); - SessionMgr.RunAgentCommand(Sid, Args[1], OperatorName, LogSink); - } catch (NumberFormatException E) { - LogSink.accept("[!] Invalid session ID"); - } - } - - private void DispatchShortcut(String[] Parts, String Command) { - if (Parts.length < 2) { LogSink.accept("[!] Usage: " + Command + " "); return; } - try { - SessionMgr.RunAgentCommand(Integer.parseInt(Parts[1]), Command, OperatorName, LogSink); - } catch (NumberFormatException E) { - LogSink.accept("[!] Invalid session ID"); - } - } - - private void DispatchSleep(String[] Parts) { - if (Parts.length < 2) { LogSink.accept("[!] Usage: sleep "); return; } - String[] Args = Parts[1].split("\\s+", 2); - if (Args.length < 2) { LogSink.accept("[!] Usage: sleep "); return; } - try { - SessionMgr.RunAgentCommand(Integer.parseInt(Args[0]), "sleep " + Args[1], OperatorName, LogSink); - } catch (NumberFormatException E) { - LogSink.accept("[!] Invalid session ID"); - } - } - - private void DispatchDownload(String[] Parts) { - if (Parts.length < 2) { LogSink.accept("[!] Usage: download "); return; } - String[] Args = Parts[1].split("\\s+", 2); - if (Args.length < 2) { LogSink.accept("[!] Usage: download "); return; } - try { - SessionMgr.RunAgentCommand(Integer.parseInt(Args[0]), "download " + Args[1], OperatorName, LogSink); - } catch (NumberFormatException E) { - LogSink.accept("[!] Invalid session ID"); - } - } - - private void DispatchUpload(String[] Parts) { - if (Parts.length < 2) { LogSink.accept("[!] Usage: upload "); return; } - String[] Args = Parts[1].split("\\s+", 3); - if (Args.length < 3) { LogSink.accept("[!] Usage: upload "); return; } - try { - SessionMgr.RunAgentCommand(Integer.parseInt(Args[0]), "upload " + Args[1] + " " + Args[2], OperatorName, LogSink); - } catch (NumberFormatException E) { - LogSink.accept("[!] Invalid session ID"); - } - } - - private void DispatchSysInfo(String SidText) { - try { - int Sid = Integer.parseInt(SidText.trim()); - Optional Opt = SessionMgr.Get(Sid); - if (Opt.isEmpty()) { LogSink.accept("[!] Session not found"); return; } - Session S = Opt.get(); - LogSink.accept("[*] ID=" + S.GetId() + " Name=" + S.GetDisplayName() + " Type=" + S.GetSessionType().name()); - LogSink.accept("[*] Host=" + S.GetHostname() + " User=" + S.GetUser() + " OS=" + S.GetOs() + " Arch=" + S.GetArch()); - LogSink.accept("[*] IP=" + S.GetAgentIp() + " Key=" + S.GetSessionKey() + " mTLS=" + S.IsMtlsEnabled()); - LogSink.accept("[*] Note=" + Db.GetAgentNote(Sid)); - } catch (Exception E) { - LogSink.accept("[!] Usage: sysinfo "); - } - } - - private void DispatchNote(String Body) { - String[] Args = Body.trim().split("\\s+", 2); - if (Args.length < 2) { LogSink.accept("[!] Usage: note "); return; } - try { - int Sid = Integer.parseInt(Args[0]); - Db.SetAgentNote(Sid, Args[1]); - LogSink.accept("[+] Note saved for SESSION-" + Sid); - } catch (NumberFormatException E) { - LogSink.accept("[!] Invalid session ID"); - } - } - - private void DispatchGetNote(String SidText) { - try { - int Sid = Integer.parseInt(SidText.trim()); - String Note = Db.GetAgentNote(Sid); - LogSink.accept("[*] Note SESSION-" + Sid + ": " + (Note.isEmpty() ? "(empty)" : Note)); - } catch (Exception E) { - LogSink.accept("[!] Usage: getnote "); - } - } - - private void DispatchHistory(String Body) { - String[] Args = Body == null || Body.isBlank() ? new String[0] : Body.trim().split("\\s+"); - int Sid = Args.length > 0 ? ParseInt(Args[0], 0) : 0; - int Limit = Args.length > 1 ? ParseInt(Args[1], 25) : 25; - List> Hist = Db.GetCommandHistory(Sid, Limit); - LogSink.accept("[*] History entries: " + Hist.size()); - for (Map R : Hist) - LogSink.accept(" #" + R.getOrDefault("AgentId", "?") + " " + R.getOrDefault("Operator", "?") - + " " + R.getOrDefault("Command", "") + " [" + R.getOrDefault("Timestamp", "") + "]"); - } - - private int ParseInt(String Value, int Def) { - try { return Integer.parseInt(Value.trim()); } - catch (Exception E) { return Def; } - } -} diff --git a/src/main/java/com/raven/interface/GUI/module/core/server/ServerController.java b/src/main/java/com/raven/interface/GUI/module/core/server/ServerController.java deleted file mode 100644 index 8efd9dd..0000000 --- a/src/main/java/com/raven/interface/GUI/module/core/server/ServerController.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.raven.interfaces.GUI.module.core.server; - -import com.raven.core.event.EventManager.EventType; -import com.raven.core.server.ListenerMode; -import com.raven.core.server.RavenServer; -import com.raven.utils.ServerConfig; -import javafx.application.Platform; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.paint.Color; - -import java.time.Instant; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -public class ServerController { - - private RavenServer Server; - private Instant StartTime; - private final ServerConfig Config; - - private final Label StatusLabel; - private final Label ServerStatusLabel; - private final Label ServerInfoLabel; - private final Button StartBtn; - private final Button StopBtn; - - private final Consumer LogSink; - private final BiConsumer> EventHandler; - private final Runnable OnStart; - private final Runnable OnStop; - - private static final String RedColor = "#ff1f3d"; - private static final String TextColor = "#ffffff"; - - public ServerController(ServerConfig config, - Label statusLabel, - Label serverStatusLabel, - Label serverInfoLabel, - Button startBtn, - Button stopBtn, - Consumer logSink, - BiConsumer> eventHandler, - Runnable onStart, - Runnable onStop) { - this.Config = config; - this.StatusLabel = statusLabel; - this.ServerStatusLabel = serverStatusLabel; - this.ServerInfoLabel = serverInfoLabel; - this.StartBtn = startBtn; - this.StopBtn = stopBtn; - this.LogSink = logSink; - this.EventHandler = eventHandler; - this.OnStart = onStart; - this.OnStop = onStop; - } - - public void Start(String Host, int Port) { - Server = new RavenServer(Host, Port, ListenerMode.FromString(Config.GetServerMode()), Config); - Server.AddEventListener(EventHandler); - boolean[] Result = Server.StartServer(); - if (!Result[0]) { - LogSink.accept("[!] Failed to start server"); - return; - } - StartTime = Instant.now(); - Thread T = new Thread(Server::AcceptConnections, "AcceptConnections"); - T.setDaemon(true); - T.start(); - Platform.runLater(() -> { - ServerStatusLabel.setText("● ONLINE"); - ServerStatusLabel.setTextFill(Color.web(TextColor)); - ServerInfoLabel.setText(Host + ":" + Port); - StatusLabel.setText("● Online"); - StatusLabel.setTextFill(Color.web(TextColor)); - StartBtn.setDisable(true); - StopBtn.setDisable(false); - }); - LogSink.accept("[+] Server started on " + Host + ":" + Port); - LogSink.accept("[+] Session Key: " + Server.GetKeyBase64()); - if (OnStart != null) OnStart.run(); - } - - public void Stop() { - if (Server == null) return; - Server.StopServer(); - StartTime = null; - Platform.runLater(() -> { - ServerStatusLabel.setText("● OFFLINE"); - ServerStatusLabel.setTextFill(Color.web(RedColor)); - ServerInfoLabel.setText("Not running"); - StatusLabel.setText("● Offline"); - StatusLabel.setTextFill(Color.web(RedColor)); - StartBtn.setDisable(false); - StopBtn.setDisable(true); - }); - LogSink.accept("[!] Server stopped"); - if (OnStop != null) OnStop.run(); - } - - public RavenServer GetServer() { return Server; } - public Instant GetStartTime() { return StartTime; } - public boolean IsRunning() { return Server != null && Server.IsRunning(); } -} diff --git a/src/main/java/com/raven/interface/GUI/module/core/session/SessionManager.java b/src/main/java/com/raven/interface/GUI/module/core/session/SessionManager.java deleted file mode 100644 index 510e7eb..0000000 --- a/src/main/java/com/raven/interface/GUI/module/core/session/SessionManager.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.raven.interfaces.GUI.module.core.session; - -import com.raven.core.db.TeamDatabase; -import com.raven.core.server.RavenServer; -import com.raven.core.session.Session; -import javafx.application.Platform; -import javafx.collections.ObservableList; -import javafx.scene.control.Label; - -import java.util.Optional; -import java.util.concurrent.Executors; - -public class SessionManager { - - private final RavenServer Server; - private final TeamDatabase Db; - private final ObservableList SessionRows; - private final Label SessionCountLabel; - - public SessionManager(RavenServer server, TeamDatabase db, - ObservableList rows, Label countLabel) { - this.Server = server; - this.Db = db; - this.SessionRows = rows; - this.SessionCountLabel = countLabel; - } - - public void Refresh() { - if (Server == null) return; - Platform.runLater(() -> { - SessionRows.clear(); - for (Session S : Server.GetSessions().GetAll()) SessionRows.add(new SessionRow(S)); - int N = SessionRows.size(); - SessionCountLabel.setText("⊟ " + N + " Session" + (N != 1 ? "s" : "")); - }); - } - - public void Kill(int Sid) { - Server.RemoveSession(Sid); - Refresh(); - } - - public void RunAgentCommand(int Sid, String Cmd, String OperatorName, java.util.function.Consumer LogSink) { - if (Server == null || !Server.IsRunning()) { - LogSink.accept("[!] Server not running"); - return; - } - LogSink.accept("[>] SESSION-" + Sid + " → " + Cmd); - Executors.newSingleThreadExecutor().submit(() -> { - String[] Result = Server.ExecuteCommand(Sid, Cmd); - boolean Ok = Boolean.parseBoolean(Result[0]); - Db.SaveCommandLog(Sid, OperatorName != null ? OperatorName : "gui", Cmd, Result[1], Ok); - Platform.runLater(() -> LogSink.accept((Ok ? "[+]" : "[!]") + " SESSION-" + Sid + ": " + Result[1])); - }); - } - - public Optional Get(int Sid) { - return Server.GetSessions().Get(Sid); - } -} diff --git a/src/main/java/com/raven/interface/GUI/module/core/session/SessionRow.java b/src/main/java/com/raven/interface/GUI/module/core/session/SessionRow.java deleted file mode 100644 index 53d97b6..0000000 --- a/src/main/java/com/raven/interface/GUI/module/core/session/SessionRow.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.raven.interfaces.GUI.module.core.session; - -import com.raven.core.session.Session; -import javafx.beans.property.SimpleStringProperty; - -public class SessionRow { - - private final SimpleStringProperty Id, Type, Name, Ip, Os, User, Host, Joined; - - public SessionRow(Session S) { - Id = new SimpleStringProperty(String.valueOf(S.GetId())); - Type = new SimpleStringProperty(S.GetSessionType().name()); - Name = new SimpleStringProperty(S.GetDisplayName()); - Ip = new SimpleStringProperty(S.GetAgentIp()); - Os = new SimpleStringProperty(S.GetOs()); - User = new SimpleStringProperty(S.GetUser()); - Host = new SimpleStringProperty(S.GetHostname()); - Joined = new SimpleStringProperty(S.GetSessionKey()); - } - - public String getId() { return Id.get(); } - public String getType() { return Type.get(); } - public String getName() { return Name.get(); } - public String getIp() { return Ip.get(); } - public String getOs() { return Os.get(); } - public String getUser() { return User.get(); } - public String getHost() { return Host.get(); } - public String getJoined() { return Joined.get(); } - - public SimpleStringProperty IdProperty() { return Id; } - public SimpleStringProperty TypeProperty() { return Type; } - public SimpleStringProperty NameProperty() { return Name; } - public SimpleStringProperty IpProperty() { return Ip; } - public SimpleStringProperty OsProperty() { return Os; } - public SimpleStringProperty UserProperty() { return User; } - public SimpleStringProperty HostProperty() { return Host; } - public SimpleStringProperty JoinedProperty() { return Joined; } -} diff --git a/src/main/java/com/raven/interface/GUI/styles/css/raven.css b/src/main/java/com/raven/interface/GUI/styles/css/raven.css deleted file mode 100644 index 50581bb..0000000 --- a/src/main/java/com/raven/interface/GUI/styles/css/raven.css +++ /dev/null @@ -1,403 +0,0 @@ -/* ═══════════════════════════════════════════ - RAVEN — Main Stylesheet - ═══════════════════════════════════════════ */ - -/* ── Root ────────────────────────────────── */ -.root { - -fx-background-color: #050505; - -fx-font-family: "Segoe UI"; -} - -/* ── Sidebar ─────────────────────────────── */ -.sidebar { - -fx-background-color: linear-gradient(to bottom, #120006, #050505); - -fx-border-color: transparent #ff1f3d transparent transparent; - -fx-border-width: 0 1.5 0 0; -} - -.sidebar-divider { - -fx-background-color: #2a2a31; - -fx-padding: 4 16 4 16; -} - -.sidebar-footer { - -fx-border-color: #2a2a31 transparent transparent transparent; - -fx-border-width: 1 0 0 0; -} - -.logo-icon { - -fx-text-fill: #ff1f3d; - -fx-font-size: 38px; - -fx-font-weight: bold; -} - -.logo-name { - -fx-text-fill: #ffffff; - -fx-font-size: 28px; - -fx-font-weight: bold; -} - -.logo-tag { - -fx-text-fill: #a7a7ad; - -fx-font-size: 10px; -} - -/* ── Mini Info Cards ─────────────────────── */ -.meta-info-card { - -fx-background-color: rgba(255, 31, 61, 0.08); - -fx-background-radius: 12; - -fx-border-color: rgba(255, 31, 61, 0.45); - -fx-border-radius: 12; - -fx-padding: 10 12 10 12; -} - -/* ── Top Bar ─────────────────────────────── */ -.topbar { - -fx-background-color: linear-gradient(to right, #050505, #120006); - -fx-border-color: transparent transparent #ff1f3d transparent; - -fx-border-width: 0 0 1.5 0; -} - -.topbar-title { - -fx-text-fill: #ffffff; - -fx-font-size: 20px; - -fx-font-weight: bold; -} - -.topbar-sub { - -fx-text-fill: #a7a7ad; - -fx-font-size: 10px; -} - -/* ── Tab Pane ────────────────────────────── */ -.tab-pane { - -fx-background-color: #050505; - -fx-tab-min-height: 42px; - -fx-tab-max-height: 42px; -} - -.tab-pane .tab-header-area .tab-header-background { - -fx-background-color: #0b0b0d; -} - -.tab-pane .tab { - -fx-background-color: transparent; - -fx-text-fill: #a7a7ad; - -fx-font-size: 11px; - -fx-font-weight: bold; - -fx-cursor: hand; -} - -.tab-pane .tab:selected { - -fx-background-color: #ff1f3d; -} - -.tab-pane .tab:selected .tab-label { - -fx-text-fill: #ffffff; -} - -/* ── Tab Content ─────────────────────────── */ -.tab-content { - -fx-background-color: #050505; -} - -.tab-scroll { - -fx-background-color: #050505; -} - -.tab-scroll > .viewport { - -fx-background-color: #050505; -} - -/* ── Panel Card ──────────────────────────── */ -.panel-card { - -fx-background-color: linear-gradient(to bottom right, #111114, #090909); - -fx-background-radius: 18; - -fx-border-color: #2a2a31; - -fx-border-radius: 18; - -fx-effect: dropshadow(gaussian, rgba(255, 31, 61, 0.12), 18, 0.16, 0, 8); -} - -.stat-card { - -fx-background-color: linear-gradient(to bottom right, #111114, #070707); - -fx-background-radius: 18; - -fx-border-radius: 18; - -fx-effect: dropshadow(gaussian, rgba(255, 31, 61, 0.16), 22, 0.22, 0, 10); - -fx-min-height: 104; -} - -/* ── Input Fields ────────────────────────── */ -.input-field { - -fx-background-color: #17171c; - -fx-text-fill: #ffffff; - -fx-prompt-text-fill: #a7a7ad; - -fx-font-family: "Consolas"; - -fx-font-size: 11px; - -fx-padding: 9 12 9 12; - -fx-background-radius: 9; - -fx-border-color: #2a2a31; - -fx-border-radius: 9; -} - -.input-field:focused { - -fx-border-color: #ff1f3d; - -fx-effect: dropshadow(gaussian, rgba(255, 31, 61, 0.25), 8, 0.2, 0, 0); -} - -/* ── Terminal Area ───────────────────────── */ -.terminal-area { - -fx-background-color: #050812; - -fx-control-inner-background: #050812; - -fx-text-fill: #ffffff; - -fx-highlight-fill: #ff1f3d; - -fx-font-family: "Consolas"; - -fx-font-size: 11px; - -fx-padding: 12 14 12 14; - -fx-background-radius: 12; - -fx-border-color: #2a2a31; - -fx-border-radius: 12; -} - -.terminal-area .content { - -fx-background-color: #050812; -} - -.terminal-area .scroll-pane { - -fx-background-color: #050812; -} - -/* ── Buttons ─────────────────────────────── */ -.btn-danger { - -fx-background-color: #ff1f3d; - -fx-text-fill: #ffffff; - -fx-border-color: #ff1f3d; - -fx-border-width: 1.2; - -fx-border-radius: 10; - -fx-font-family: "Segoe UI"; - -fx-font-size: 10px; - -fx-font-weight: bold; - -fx-padding: 8 16 8 16; - -fx-background-radius: 10; - -fx-cursor: hand; -} - -.btn-danger:hover { - -fx-background-color: #cc1830; - -fx-effect: dropshadow(gaussian, rgba(255, 31, 61, 0.4), 10, 0.3, 0, 0); -} - -.btn-danger:disabled { - -fx-opacity: 0.4; -} - -.btn-outline { - -fx-background-color: transparent; - -fx-text-fill: #ffffff; - -fx-border-color: #ffffff; - -fx-border-width: 1.2; - -fx-border-radius: 10; - -fx-font-family: "Segoe UI"; - -fx-font-size: 10px; - -fx-font-weight: bold; - -fx-padding: 8 16 8 16; - -fx-background-radius: 10; - -fx-cursor: hand; -} - -.btn-outline:hover { - -fx-background-color: rgba(255, 255, 255, 0.08); -} - -.btn-accent { - -fx-background-color: #ffffff; - -fx-text-fill: #050505; - -fx-border-color: #ffffff; - -fx-border-width: 1.2; - -fx-border-radius: 10; - -fx-font-family: "Segoe UI"; - -fx-font-size: 10px; - -fx-font-weight: bold; - -fx-padding: 8 16 8 16; - -fx-background-radius: 10; - -fx-cursor: hand; -} - -.btn-accent:hover { - -fx-background-color: #d6d6db; -} - -/* ── Session Table ───────────────────────── */ -.session-table { - -fx-background-color: #101014; - -fx-control-inner-background: #101014; - -fx-table-cell-border-color: #2a2a31; - -fx-table-header-border-color: #2a2a31; - -fx-text-fill: #ffffff; - -fx-background-radius: 12; -} - -.session-table .column-header-background { - -fx-background-color: #17171c; -} - -.session-table .column-header .label { - -fx-text-fill: #a7a7ad; - -fx-font-weight: bold; - -fx-font-size: 10px; -} - -.session-table .table-row-cell { - -fx-background-color: #101014; - -fx-border-color: transparent transparent #2a2a31 transparent; - -fx-border-width: 0 0 1 0; - -fx-text-fill: #ffffff; -} - -.session-table .table-row-cell:selected { - -fx-background-color: rgba(255, 31, 61, 0.15); - -fx-border-color: transparent transparent #ff1f3d transparent; -} - -.session-table .table-row-cell:hover { - -fx-background-color: rgba(255, 255, 255, 0.04); -} - -.session-table .table-cell { - -fx-text-fill: #ffffff; - -fx-alignment: CENTER_LEFT; - -fx-font-size: 11px; -} - -/* ── Labels ──────────────────────────────── */ -.muted-text { - -fx-text-fill: #a7a7ad; - -fx-font-size: 9px; -} - -.accent-text { - -fx-text-fill: #ffffff; - -fx-font-size: 9px; -} - -.label-danger { - -fx-text-fill: #ff1f3d; - -fx-font-size: 9px; -} - -.label-danger-bold { - -fx-text-fill: #ff1f3d; - -fx-font-size: 9px; - -fx-font-weight: bold; -} - -.status-offline { - -fx-text-fill: #ff1f3d; - -fx-font-size: 11px; - -fx-font-weight: bold; -} - -.status-online { - -fx-text-fill: #ffffff; - -fx-font-size: 11px; - -fx-font-weight: bold; -} - -.server-status-offline { - -fx-text-fill: #ff1f3d; - -fx-font-size: 16px; - -fx-font-weight: bold; -} - -.server-status-online { - -fx-text-fill: #ffffff; - -fx-font-size: 16px; - -fx-font-weight: bold; -} - -.prompt-label { - -fx-text-fill: #ffffff; - -fx-font-size: 11px; - -fx-font-weight: bold; -} - -.prompt-danger { - -fx-text-fill: #ff1f3d; - -fx-font-size: 16px; - -fx-font-weight: bold; -} - -/* ── Dividers ────────────────────────────── */ -.v-divider { - -fx-background-color: #2a2a31; - -fx-pref-width: 1; - -fx-pref-height: 20; -} - -.separator { - -fx-background-color: #2a2a31; -} - -/* ── Scrollbars ──────────────────────────── */ -.scroll-bar { - -fx-background-color: #0b0b0d; -} - -.scroll-bar .thumb { - -fx-background-color: #2a2a31; - -fx-background-radius: 4; -} - -.scroll-bar .thumb:hover { - -fx-background-color: #ff1f3d; -} - -.scroll-bar .track { - -fx-background-color: transparent; -} - -.scroll-bar .increment-button, -.scroll-bar .decrement-button { - -fx-background-color: transparent; - -fx-padding: 0; -} - -/* ── Login Grid ──────────────────────────── */ -.login-grid { - -fx-background-color: #050505; -} - -/* ── Alert / Dialog ──────────────────────── */ -.dialog-pane { - -fx-background-color: #050505; - -fx-border-color: #2a2a31; -} - -.dialog-pane .header-panel { - -fx-background-color: #0b0b0d; -} - -.dialog-pane .header-panel .label { - -fx-text-fill: #ffffff; - -fx-font-weight: bold; -} - -.dialog-pane .content.label { - -fx-text-fill: #a7a7ad; -} - -.dialog-pane .button-bar .button { - -fx-background-color: #ff1f3d; - -fx-text-fill: #ffffff; - -fx-border-radius: 8; - -fx-background-radius: 8; - -fx-cursor: hand; -} - -/* ── Toolbar Row ─────────────────────────── */ -.toolbar { - -fx-padding: 0; -} - -.cmd-row { - -fx-padding: 0; -} diff --git a/src/main/java/com/raven/interface/GUI/styles/xml/Commands.fxml b/src/main/java/com/raven/interface/GUI/styles/xml/Commands.fxml deleted file mode 100644 index 272ebf5..0000000 --- a/src/main/java/com/raven/interface/GUI/styles/xml/Commands.fxml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - -