mirror of
https://github.com/Adaptix-Framework/AdaptixC2
synced 2026-06-08 10:20:39 +00:00
644 lines
25 KiB
C++
644 lines
25 KiB
C++
#include <UI/Widgets/SessionsTableWidget.h>
|
|
#include <UI/Widgets/AdaptixWidget.h>
|
|
#include <Client/Requestor.h>
|
|
#include <MainAdaptix.h>
|
|
|
|
SessionsTableWidget::SessionsTableWidget( QWidget* w )
|
|
{
|
|
this->mainWidget = w;
|
|
this->createUI();
|
|
|
|
connect( tableWidget, &QTableWidget::doubleClicked, this, &SessionsTableWidget::handleTableDoubleClicked );
|
|
connect( tableWidget, &QTableWidget::customContextMenuRequested, this, &SessionsTableWidget::handleSessionsTableMenu );
|
|
connect( tableWidget, &QTableWidget::itemSelectionChanged, this, [this](){tableWidget->setFocus();} );
|
|
connect( checkOnlyActive, &QCheckBox::stateChanged, this, &SessionsTableWidget::onFilterUpdate);
|
|
connect( inputFilter1, &QLineEdit::textChanged, this, &SessionsTableWidget::onFilterUpdate);
|
|
connect( inputFilter2, &QLineEdit::textChanged, this, &SessionsTableWidget::onFilterUpdate);
|
|
connect( inputFilter3, &QLineEdit::textChanged, this, &SessionsTableWidget::onFilterUpdate);
|
|
connect( hideButton, &ClickableLabel::clicked, this, &SessionsTableWidget::toggleSearchPanel);
|
|
|
|
shortcutSearch = new QShortcut(QKeySequence("Ctrl+F"), tableWidget);
|
|
shortcutSearch->setContext(Qt::WidgetShortcut);
|
|
connect(shortcutSearch, &QShortcut::activated, this, &SessionsTableWidget::toggleSearchPanel);
|
|
}
|
|
|
|
SessionsTableWidget::~SessionsTableWidget() = default;
|
|
|
|
void SessionsTableWidget::createUI()
|
|
{
|
|
auto horizontalSpacer1 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
|
|
auto horizontalSpacer2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
|
|
|
|
searchWidget = new QWidget(this);
|
|
searchWidget->setVisible(false);
|
|
|
|
checkOnlyActive = new QCheckBox("Only active");
|
|
|
|
inputFilter1 = new QLineEdit(searchWidget);
|
|
inputFilter1->setPlaceholderText("filter1");
|
|
inputFilter1->setMaximumWidth(200);
|
|
|
|
inputFilter2 = new QLineEdit(searchWidget);
|
|
inputFilter2->setPlaceholderText("or filter2");
|
|
inputFilter2->setMaximumWidth(200);
|
|
|
|
inputFilter3 = new QLineEdit(searchWidget);
|
|
inputFilter3->setPlaceholderText("or filter3");
|
|
inputFilter3->setMaximumWidth(200);
|
|
|
|
hideButton = new ClickableLabel("X");
|
|
hideButton->setCursor( Qt::PointingHandCursor );
|
|
|
|
searchLayout = new QHBoxLayout(searchWidget);
|
|
searchLayout->setContentsMargins(0, 0, 0, 0);
|
|
searchLayout->setSpacing(4);
|
|
searchLayout->addSpacerItem(horizontalSpacer1);
|
|
searchLayout->addWidget(checkOnlyActive);
|
|
searchLayout->addWidget(inputFilter1);
|
|
searchLayout->addWidget(inputFilter2);
|
|
searchLayout->addWidget(inputFilter3);
|
|
searchLayout->addWidget(hideButton);
|
|
searchLayout->addSpacerItem(horizontalSpacer2);
|
|
|
|
tableWidget = new QTableWidget( this );
|
|
tableWidget->setColumnCount( ColumnCount );
|
|
tableWidget->setContextMenuPolicy( Qt::CustomContextMenu );
|
|
tableWidget->setAutoFillBackground( false );
|
|
tableWidget->setShowGrid( false );
|
|
tableWidget->setSortingEnabled( true );
|
|
tableWidget->setWordWrap( false );
|
|
tableWidget->setCornerButtonEnabled( false );
|
|
tableWidget->setSelectionBehavior( QAbstractItemView::SelectRows );
|
|
tableWidget->setFocusPolicy( Qt::NoFocus );
|
|
tableWidget->setAlternatingRowColors( true );
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch );
|
|
tableWidget->horizontalHeader()->setCascadingSectionResizes( true );
|
|
tableWidget->horizontalHeader()->setHighlightSections( false );
|
|
tableWidget->verticalHeader()->setVisible( false );
|
|
|
|
tableWidget->setHorizontalHeaderItem( ColumnAgentID, new QTableWidgetItem( "Agent ID" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnAgentType, new QTableWidgetItem( "Agent Type" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnListener, new QTableWidgetItem( "Listener" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnExternal, new QTableWidgetItem( "External" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnInternal, new QTableWidgetItem( "Internal" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnDomain, new QTableWidgetItem( "Domain" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnComputer, new QTableWidgetItem( "Computer" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnUser, new QTableWidgetItem( "User" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnOs, new QTableWidgetItem( "OS" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnProcess, new QTableWidgetItem( "Process" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnProcessId, new QTableWidgetItem( "PID" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnThreadId, new QTableWidgetItem( "TID" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnTags, new QTableWidgetItem( "Tags" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnLast, new QTableWidgetItem( "Last" ) );
|
|
tableWidget->setHorizontalHeaderItem( ColumnSleep, new QTableWidgetItem( "Sleep" ) );
|
|
|
|
for(int i = 0; i < 15; i++) {
|
|
if (GlobalClient->settings->data.SessionsTableColumns[i] == false)
|
|
tableWidget->hideColumn(i);
|
|
}
|
|
|
|
mainGridLayout = new QGridLayout( this );
|
|
mainGridLayout->setContentsMargins( 0, 0, 0, 0);
|
|
mainGridLayout->addWidget( searchWidget, 0, 0, 1, 1);
|
|
mainGridLayout->addWidget( tableWidget, 1, 0, 1, 1);
|
|
}
|
|
|
|
|
|
bool SessionsTableWidget::filterItem(const AgentData &agent) const
|
|
{
|
|
if ( !this->searchWidget->isVisible() )
|
|
return true;
|
|
|
|
if (this->checkOnlyActive->isChecked()) {
|
|
if ( agent.Mark == "Terminated" || agent.Mark == "Inactive" )
|
|
return false;
|
|
}
|
|
|
|
QString username = agent.Username;
|
|
if ( agent.Elevated )
|
|
username = "* " + username;
|
|
|
|
bool found = true;
|
|
|
|
QString filter1 = this->inputFilter1->text();
|
|
if( !filter1.isEmpty() ) {
|
|
if ( agent.Id.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.Name.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.Listener.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.ExternalIP.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.InternalIP.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.Process.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.OsDesc.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.Domain.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.Computer.contains(filter1, Qt::CaseInsensitive) ||
|
|
username.contains(filter1, Qt::CaseInsensitive) ||
|
|
agent.Tags.contains(filter1, Qt::CaseInsensitive)
|
|
)
|
|
return true;
|
|
else
|
|
found = false;
|
|
}
|
|
|
|
QString filter2 = this->inputFilter2->text();
|
|
if( !filter2.isEmpty() ) {
|
|
if ( agent.Id.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.Name.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.Listener.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.ExternalIP.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.InternalIP.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.Process.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.OsDesc.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.Domain.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.Computer.contains(filter2, Qt::CaseInsensitive) ||
|
|
username.contains(filter2, Qt::CaseInsensitive) ||
|
|
agent.Tags.contains(filter2, Qt::CaseInsensitive)
|
|
)
|
|
return true;
|
|
else
|
|
found = false;
|
|
}
|
|
|
|
QString filter3 = this->inputFilter3->text();
|
|
if( !filter3.isEmpty() ) {
|
|
if ( agent.Id.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.Name.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.Listener.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.ExternalIP.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.InternalIP.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.Process.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.OsDesc.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.Domain.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.Computer.contains(filter3, Qt::CaseInsensitive) ||
|
|
username.contains(filter3, Qt::CaseInsensitive) ||
|
|
agent.Tags.contains(filter3, Qt::CaseInsensitive)
|
|
)
|
|
return true;
|
|
else
|
|
found = false;
|
|
}
|
|
|
|
return found;
|
|
}
|
|
|
|
void SessionsTableWidget::addTableItem(const Agent* newAgent) const
|
|
{
|
|
if( tableWidget->rowCount() < 1 )
|
|
tableWidget->setRowCount( 1 );
|
|
else
|
|
tableWidget->setRowCount( tableWidget->rowCount() + 1 );
|
|
|
|
bool isSortingEnabled = tableWidget->isSortingEnabled();
|
|
tableWidget->setSortingEnabled( false );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnAgentID, newAgent->item_Id );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnAgentType, newAgent->item_Type );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnListener, newAgent->item_Listener );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnExternal, newAgent->item_External );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnInternal, newAgent->item_Internal );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnDomain, newAgent->item_Domain );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnComputer, newAgent->item_Computer );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnUser, newAgent->item_Username );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnOs, newAgent->item_Os );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnProcess, newAgent->item_Process );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnProcessId, newAgent->item_Pid );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnThreadId, newAgent->item_Tid );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnTags, newAgent->item_Tags );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnLast, newAgent->item_Last );
|
|
tableWidget->setItem( tableWidget->rowCount() - 1, ColumnSleep, newAgent->item_Sleep );
|
|
tableWidget->setSortingEnabled( isSortingEnabled );
|
|
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( ColumnAgentID, QHeaderView::ResizeToContents );
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( ColumnAgentType, QHeaderView::ResizeToContents );
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( ColumnListener, QHeaderView::ResizeToContents );
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( ColumnExternal, QHeaderView::ResizeToContents );
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( ColumnInternal, QHeaderView::ResizeToContents );
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( ColumnProcessId, QHeaderView::ResizeToContents );
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( ColumnThreadId, QHeaderView::ResizeToContents );
|
|
tableWidget->horizontalHeader()->setSectionResizeMode( ColumnSleep, QHeaderView::ResizeToContents );
|
|
}
|
|
|
|
/// PUBLIC
|
|
|
|
void SessionsTableWidget::AddAgentItem( Agent* newAgent ) const
|
|
{
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
if ( adaptixWidget->AgentsMap.contains(newAgent->data.Id) )
|
|
return;
|
|
|
|
adaptixWidget->AgentsMap[ newAgent->data.Id ] = newAgent;
|
|
adaptixWidget->AgentsVector.push_back(newAgent->data.Id);
|
|
|
|
if( !this->filterItem(newAgent->data) )
|
|
return;
|
|
|
|
this->addTableItem(newAgent);
|
|
}
|
|
|
|
void SessionsTableWidget::RemoveAgentItem(const QString &agentId) const
|
|
{
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
Agent* agent = adaptixWidget->AgentsMap[agentId];
|
|
adaptixWidget->AgentsMap.remove(agentId);
|
|
adaptixWidget->AgentsVector.removeOne(agentId);
|
|
|
|
delete agent->Console;
|
|
delete agent->FileBrowser;
|
|
delete agent;
|
|
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if (agentId == tableWidget->item( rowIndex, ColumnAgentID )->text()) {
|
|
tableWidget->removeRow(rowIndex);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::SetData() const
|
|
{
|
|
this->ClearTableContent();
|
|
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
|
|
for (int i = 0; i < adaptixWidget->AgentsVector.size(); i++ ) {
|
|
QString agentId = adaptixWidget->AgentsVector[i];
|
|
Agent* agent = adaptixWidget->AgentsMap[agentId];
|
|
if ( agent && this->filterItem(agent->data) )
|
|
this->addTableItem(agent);
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::ClearTableContent() const
|
|
{
|
|
for (int row = tableWidget->rowCount() - 1; row >= 0; row--) {
|
|
for (int col = 0; col < tableWidget->columnCount(); ++col)
|
|
tableWidget->takeItem(row, col);
|
|
|
|
tableWidget->removeRow(row);
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::Clear() const
|
|
{
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
adaptixWidget->AgentsVector.clear();
|
|
|
|
for (auto agentId : adaptixWidget->AgentsMap.keys()) {
|
|
Agent* agent = adaptixWidget->AgentsMap[agentId];
|
|
adaptixWidget->AgentsMap.remove(agentId);
|
|
delete agent->Console;
|
|
delete agent->FileBrowser;
|
|
delete agent;
|
|
}
|
|
|
|
this->ClearTableContent();
|
|
|
|
checkOnlyActive->setChecked(false);
|
|
inputFilter1->clear();
|
|
inputFilter2->clear();
|
|
inputFilter3->clear();
|
|
}
|
|
|
|
/// SLOTS
|
|
|
|
void SessionsTableWidget::toggleSearchPanel() const
|
|
{
|
|
if (this->searchWidget->isVisible())
|
|
this->searchWidget->setVisible(false);
|
|
else
|
|
this->searchWidget->setVisible(true);
|
|
|
|
this->SetData();
|
|
}
|
|
|
|
void SessionsTableWidget::handleTableDoubleClicked(const QModelIndex &index) const
|
|
{
|
|
QString AgentId = tableWidget->item(index.row(),0)->text();
|
|
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
adaptixWidget->LoadConsoleUI(AgentId);
|
|
}
|
|
|
|
void SessionsTableWidget::handleSessionsTableMenu(const QPoint &pos)
|
|
{
|
|
if ( ! tableWidget->itemAt(pos) )
|
|
return;
|
|
|
|
auto ctxMenu = QMenu();
|
|
|
|
auto agentSep1 = new QAction();
|
|
agentSep1->setSeparator(true);
|
|
auto agentSep2 = new QAction();
|
|
agentSep2->setSeparator(true);
|
|
|
|
/// AGENT MENU
|
|
|
|
auto agentMenu = new QMenu("Agent", &ctxMenu);
|
|
agentMenu->addAction("Tasks", this, &SessionsTableWidget::actionTasksBrowserOpen);
|
|
agentMenu->addAction(agentSep1);
|
|
agentMenu->addAction("File Browser", this, &SessionsTableWidget::actionFileBrowserOpen);
|
|
agentMenu->addAction("Process Browser", this, &SessionsTableWidget::actionProcessBrowserOpen);
|
|
agentMenu->addAction(agentSep2);
|
|
agentMenu->addAction("Exit", this, &SessionsTableWidget::actionAgentExit);
|
|
|
|
/// ITEM MENU
|
|
|
|
auto itemMenu = new QMenu("Item", &ctxMenu);
|
|
itemMenu->addAction("Mark as Active", this, &SessionsTableWidget::actionMarkActive);
|
|
itemMenu->addAction("Mark as Inactive", this, &SessionsTableWidget::actionMarkInactive);
|
|
itemMenu->addSeparator();
|
|
itemMenu->addAction("Set items color", this, &SessionsTableWidget::actionItemColor);
|
|
itemMenu->addAction("Set text color", this, &SessionsTableWidget::actionTextColor);
|
|
itemMenu->addAction("Reset color", this, &SessionsTableWidget::actionColorReset);
|
|
itemMenu->addSeparator();
|
|
itemMenu->addAction( "Hide on client", this, &SessionsTableWidget::actionItemHide);
|
|
|
|
auto ctxSep1 = new QAction();
|
|
ctxSep1->setSeparator(true);
|
|
auto ctxSep2 = new QAction();
|
|
ctxSep2->setSeparator(true);
|
|
|
|
ctxMenu.addAction( "Console", this, &SessionsTableWidget::actionConsoleOpen);
|
|
ctxMenu.addAction(ctxSep1);
|
|
ctxMenu.addMenu(agentMenu);
|
|
ctxMenu.addMenu(itemMenu);
|
|
ctxMenu.addAction(ctxSep2);
|
|
ctxMenu.addAction( "Set tag", this, &SessionsTableWidget::actionItemTag);
|
|
ctxMenu.addAction( "Remove from server", this, &SessionsTableWidget::actionAgentRemove);
|
|
|
|
ctxMenu.exec(tableWidget->horizontalHeader()->viewport()->mapToGlobal(pos));
|
|
}
|
|
|
|
void SessionsTableWidget::onFilterUpdate() const
|
|
{
|
|
this->SetData();
|
|
}
|
|
|
|
void SessionsTableWidget::actionConsoleOpen() const
|
|
{
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
adaptixWidget->LoadConsoleUI(agentId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionTasksBrowserOpen() const
|
|
{
|
|
QString agentId = tableWidget->item( tableWidget->currentRow(), ColumnAgentID )->text();
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
|
|
adaptixWidget->TasksTab->SetAgentFilter(agentId);
|
|
adaptixWidget->SetTasksUI();
|
|
}
|
|
|
|
void SessionsTableWidget::actionFileBrowserOpen() const
|
|
{
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
adaptixWidget->LoadFileBrowserUI(agentId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionProcessBrowserOpen() const
|
|
{
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
adaptixWidget->LoadProcessBrowserUI(agentId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionAgentExit() const
|
|
{
|
|
QStringList listId;
|
|
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
if(listId.empty())
|
|
return;
|
|
|
|
QString message = QString();
|
|
bool ok = false;
|
|
bool result = HttpReqAgentExit(listId, *(adaptixWidget->GetProfile()), &message, &ok);
|
|
if( !result ) {
|
|
MessageError("JWT error");
|
|
return;
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionMarkActive() const
|
|
{
|
|
QStringList listId;
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
if(listId.empty())
|
|
return;
|
|
|
|
QString message = QString();
|
|
bool ok = false;
|
|
bool result = HttpReqAgentSetMark(listId, "", *(adaptixWidget->GetProfile()), &message, &ok);
|
|
if( !result ) {
|
|
MessageError("JWT error");
|
|
return;
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionMarkInactive() const
|
|
{
|
|
QStringList listId;
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
if(listId.empty())
|
|
return;
|
|
|
|
QString message = QString();
|
|
bool ok = false;
|
|
bool result = HttpReqAgentSetMark(listId, "Inactive", *(adaptixWidget->GetProfile()), &message, &ok);
|
|
if( !result ) {
|
|
MessageError("JWT error");
|
|
return;
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionItemColor() const
|
|
{
|
|
QStringList listId;
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
if(listId.empty())
|
|
return;
|
|
|
|
QColor itemColor = QColorDialog::getColor(Qt::white, nullptr, "Select items color");
|
|
if (itemColor.isValid()) {
|
|
QString itemColorHex = itemColor.name();
|
|
QString message = QString();
|
|
bool ok = false;
|
|
bool result = HttpReqAgentSetColor(listId, itemColorHex, "", false, *(adaptixWidget->GetProfile()), &message, &ok);
|
|
if( !result ) {
|
|
MessageError("JWT error");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionTextColor() const
|
|
{
|
|
QStringList listId;
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
if(listId.empty())
|
|
return;
|
|
|
|
QColor textColor = QColorDialog::getColor(Qt::white, nullptr, "Select text color");
|
|
if (textColor.isValid()) {
|
|
QString textColorHex = textColor.name();
|
|
QString message = QString();
|
|
bool ok = false;
|
|
bool result = HttpReqAgentSetColor(listId, "", textColorHex, false, *(adaptixWidget->GetProfile()), &message, &ok);
|
|
if( !result ) {
|
|
MessageError("JWT error");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionColorReset() const
|
|
{
|
|
QStringList listId;
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
if(listId.empty())
|
|
return;
|
|
|
|
QString message = QString();
|
|
bool ok = false;
|
|
bool result = HttpReqAgentSetColor(listId, "", "", true, *(adaptixWidget->GetProfile()), &message, &ok);
|
|
if( !result ) {
|
|
MessageError("JWT error");
|
|
return;
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionAgentRemove()
|
|
{
|
|
QMessageBox::StandardButton reply = QMessageBox::question(this, "Delete Confirmation",
|
|
"Are you sure you want to delete all information about the selected agents from the server?\n\n"
|
|
"If you want to hide the record, simply choose: 'Item -> Hide on Client'.",
|
|
QMessageBox::Yes | QMessageBox::No,
|
|
QMessageBox::No);
|
|
|
|
if (reply != QMessageBox::Yes)
|
|
return;
|
|
|
|
QStringList listId;
|
|
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
if(listId.empty())
|
|
return;
|
|
|
|
QString message = QString();
|
|
bool ok = false;
|
|
bool result = HttpReqAgentRemove(listId, *(adaptixWidget->GetProfile()), &message, &ok);
|
|
if( !result ) {
|
|
MessageError("JWT error");
|
|
return;
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionItemTag() const
|
|
{
|
|
QStringList listId;
|
|
|
|
auto adaptixWidget = qobject_cast<AdaptixWidget*>( mainWidget );
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
if(listId.empty())
|
|
return;
|
|
|
|
QString tag = "";
|
|
if(listId.size() == 1) {
|
|
tag = tableWidget->item( tableWidget->currentRow(), ColumnTags )->text();
|
|
}
|
|
|
|
bool inputOk;
|
|
QString newTag = QInputDialog::getText(nullptr, "Set tags", "New tag", QLineEdit::Normal,tag, &inputOk);
|
|
if ( inputOk ) {
|
|
QString message = QString();
|
|
bool ok = false;
|
|
bool result = HttpReqAgentSetTag(listId, newTag, *(adaptixWidget->GetProfile()), &message, &ok);
|
|
if( !result ) {
|
|
MessageError("JWT error");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SessionsTableWidget::actionItemHide() const
|
|
{
|
|
QList<QString> listId;
|
|
|
|
for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) {
|
|
if ( tableWidget->item(rowIndex, 0)->isSelected() ) {
|
|
auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text();
|
|
listId.append(agentId);
|
|
}
|
|
}
|
|
|
|
for (auto id : listId)
|
|
this->RemoveAgentItem(id);
|
|
}
|