#ifndef ADAPTIXCLIENT_ADAPTIXWIDGET_H #define ADAPTIXCLIENT_ADAPTIXWIDGET_H #include #include #include #include #include #include #include #include #include #include #include class Task; class Agent; class LastTickWorker; class WebSocketWorker; class SessionsTableWidget; class SessionsGraph; class AxConsoleWidget; class LogsWidget; class ChatWidget; class ListenersWidget; class DownloadsWidget; class ScreenshotsWidget; class CredentialsWidget; class TargetsWidget; class TasksWidget; class TunnelsWidget; class TunnelEndpoint; class DialogSyncPacket; class AuthProfile; class AxScriptManager; struct ServerScriptGroup; typedef struct RegListenerConfig { QString name; QString protocol; QString type; } RegListenerConfig; typedef struct RegAgentConfig { QString name; QString listenerType; int os; Commander* commander; bool valid; } RegAgentConfig; typedef struct AgentTypeInfo { bool multiListeners; QStringList listenerTypes; } AgentTypeInfo; struct ServerScriptInfo { QString name; QString description; bool enabled; }; class AdaptixWidget : public QWidget { Q_OBJECT QGridLayout* mainGridLayout = nullptr; QHBoxLayout* topHLayout = nullptr; QPushButton* listenersButton = nullptr; QPushButton* logsButton = nullptr; QPushButton* chatButton = nullptr; QPushButton* sessionsButton = nullptr; QPushButton* graphButton = nullptr; QPushButton* tasksButton = nullptr; QPushButton* targetsButton = nullptr; QPushButton* tunnelButton = nullptr; QPushButton* downloadsButton = nullptr; QPushButton* credsButton = nullptr; QPushButton* screensButton = nullptr; QPushButton* keysButton = nullptr; QPushButton* reconnectButton = nullptr; QPushButton* extDocksButton = nullptr; QSpacerItem* horizontalSpacer1 = nullptr; QFrame* line_1 = nullptr; QFrame* line_2 = nullptr; QFrame* line_3 = nullptr; QFrame* line_4 = nullptr; QDialog* extDocksPopup = nullptr; QListWidget* extDocksListWidget = nullptr; QLabel* extDocksEmptyLabel = nullptr; KDDockWidgets::QtWidgets::MainWindow* mainDockWidget; KDDockWidgets::QtWidgets::DockWidget* dockTop; KDDockWidgets::QtWidgets::DockWidget* dockBottom; bool synchronized = false; bool sync = false; bool syncFinishReceived = false; int syncTotalBatches = 0; int syncProcessingBatchIndex = 0; int syncProcessingBatchTotal = 0; int syncProcessingBatchProcessed = 0; QElapsedTimer syncProcessingUiTimer; AuthProfile* profile = nullptr; DialogSyncPacket* dialogSyncPacket = nullptr; QQueue pendingPackets; QTimer* pendingPacketsTimer = nullptr; void createUI(); static bool isValidSyncPacket(QJsonObject jsonObj); void enqueueSyncPacket(const QJsonObject &jsonObj); void processPendingSyncPackets(); void processSyncPacket(QJsonObject jsonObj); void finalizeSyncIfReady(); void setSyncUpdateUI(bool enabled); public: QThread* ChannelThread = nullptr; WebSocketWorker* ChannelWsWorker = nullptr; QThread* TickThread = nullptr; LastTickWorker* TickWorker = nullptr; AxScriptManager* ScriptManager = nullptr; AxConsoleWidget* AxConsoleDock = nullptr; LogsWidget* LogsDock = nullptr; ChatWidget* ChatDock = nullptr; ListenersWidget* ListenersDock = nullptr; SessionsTableWidget* SessionsTableDock = nullptr; SessionsGraph* SessionsGraphDock = nullptr; TunnelsWidget* TunnelsDock = nullptr; DownloadsWidget* DownloadsDock = nullptr; ScreenshotsWidget* ScreenshotsDock = nullptr; CredentialsWidget* CredentialsDock = nullptr; TasksWidget* TasksDock = nullptr; TargetsWidget* TargetsDock = nullptr; QVector RegisterListeners; QVector RegisterAgents; QMap AgentTypes; QVector Listeners; QVector Tunnels; QMap Downloads; QMap Screenshots; QVector Credentials; QVector Targets; QMap Pivots; QMap TasksMap; QMap AgentsMap; mutable QReadWriteLock AgentsMapLock; mutable QReadWriteLock TasksMapLock; mutable QReadWriteLock CredentialsLock; mutable QReadWriteLock DownloadsLock; mutable QReadWriteLock ScreenshotsLock; mutable QReadWriteLock TargetsLock; mutable QReadWriteLock TunnelsLock; QMap PostHooksJS; QMap PostHandlersJS; QMap ClientTunnels; QStringList addresses; struct ExtDockEntry { QString id; QString title; std::function showCallback; }; QMap extDocksMap; explicit AdaptixWidget(AuthProfile* authProfile, QThread* channelThread, WebSocketWorker* channelWsWorker); ~AdaptixWidget() override; AuthProfile* GetProfile() const; void PlaceDock(KDDockWidgets::QtWidgets::DockWidget* parentDock, KDDockWidgets::QtWidgets::DockWidget* dock) const; KDDockWidgets::QtWidgets::DockWidget* get_dockTop() {return dockTop;} KDDockWidgets::QtWidgets::DockWidget* get_dockBottom() {return dockBottom;} bool AddExtension(ExtensionFile* ext); void RemoveExtension(const ExtensionFile &ext); bool IsSynchronized(); void Close(); void ClearAdaptix(); void ClearChatStream(); void ClearConsoleStreams(); void ClearNotificationsStream(); void RegisterListenerConfig(const QString &name, const QString &protocol, const QString &type, const QString &ax_script); void RegisterAgentConfig(const QString &agentName, const QString &ax_script, const QStringList &listenersconst, const bool &multiListeners, const QJsonArray &groups); void RegisterServiceConfig(const QString &serviceName, const QString &ax_script); void ProcessAxScriptPacket(const QString &name, const QString &content, const QJsonArray &groups); void registerServerCommandGroups(const QString &scriptName, const QList &groups, QJSEngine* engine); void EnableServerScript(const QString &name); void DisableServerScript(const QString &name); QList GetServerScripts() const; RegListenerConfig GetRegListener(const QString &listenerName); QList GetAgentNames(const QString &listenerType) const; RegAgentConfig GetRegAgent(const QString &agentName, const QString &listenerName, int os); AgentTypeInfo GetAgentTypeInfo(const QString &agentName) const; QList GetCommanders(const QStringList &listeners, const QStringList &agents, const QList &os) const; QList GetCommandersAll() const; void AddCommandsToCommanders(const CommandsGroup &group, const QStringList &listeners, const QStringList &agents, const QList &os); void PostHookProcess(QJsonObject jsonHookObj); void PostHandlerProcess(const QString &handlerId, const TaskData &taskData); void AddExtDock(const QString &id, const QString &title, const std::function &showCallback); void RemoveExtDock(const QString &id); void ShowExtDocksPopup(); void LoadConsoleUI(const QString &AgentId); void LoadTasksOutput() const; void LoadFileBrowserUI(const QString &AgentId); void LoadProcessBrowserUI(const QString &AgentId); void LoadTerminalUI(const QString &AgentId); void LoadShellUI(const QString &AgentId); void ShowTunnelCreator(const QString &AgentId, bool socks4, bool socks5, bool lportfwd, bool rportfwd); Q_SIGNALS: void SyncedSignal(); void SyncedOnReloadSignal(QString project); void LoadGlobalScriptSignal(QString path); void UnloadGlobalScriptSignal(QString path); void eventNewAgent(QString agentId); void eventFileBrowserDisks(QString agentId); void eventFileBrowserList(QString agentId, QString path); void eventFileBrowserUpload(QString agentId, QString path, QString localFilename); void eventProcessBrowserList(QString agentId); public Q_SLOTS: void ChannelClose() const; void DataHandler(const QByteArray& data); void DataHandlerJson(const QJsonObject& jsonObj); void OnWebSocketConnected(); void OnSynced(); void SetSessionsTableUI() const; void SetGraphUI() const; void SetTasksUI() const; void LoadAxConsoleUI() const; void LoadLogsUI() const; void LoadChatUI() const; void LoadListenersUI() const; void LoadTunnelsUI() const; void LoadDownloadsUI() const; void LoadScreenshotsUI() const; void LoadCredentialsUI() const; void LoadTargetsUI() const; void OnReconnect(); }; #endif