#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include SessionsTableWidget::SessionsTableWidget( AdaptixWidget* w ) { this->adaptixWidget = 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();} ); #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) connect( checkOnlyActive, &QCheckBox::checkStateChanged, this, &SessionsTableWidget::onFilterUpdate); #else connect( checkOnlyActive, &QCheckBox::stateChanged, this, &SessionsTableWidget::onFilterUpdate); #endif 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( "ID" ) ); tableWidget->setHorizontalHeaderItem( ColumnAgentType, new QTableWidgetItem( "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" ) ); tableWidget->setItemDelegate(new PaddingDelegate(tableWidget)); this->UpdateColumnsVisible(); 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" || agent.Mark == "Disconnect" ) 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 ); this->UpdateColumnsWidth(); } /// PUBLIC void SessionsTableWidget::AddAgentItem( Agent* newAgent ) const { 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 { if (!adaptixWidget->AgentsMap.contains(agentId)) return; Agent* agent = adaptixWidget->AgentsMap[agentId]; adaptixWidget->AgentsMap.remove(agentId); adaptixWidget->AgentsVector.removeOne(agentId); if (agent->Console) delete agent->Console; if (agent->FileBrowser) delete agent->FileBrowser; if (agent->ProcessBrowser) delete agent->ProcessBrowser; if (agent->Terminal) delete agent->Terminal; 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(); for (int i = 0; i < adaptixWidget->AgentsVector.size(); i++ ) { QString agentId = adaptixWidget->AgentsVector[i]; Agent* agent = adaptixWidget->AgentsMap[agentId]; if ( agent && agent->show && this->filterItem(agent->data) ) this->addTableItem(agent); } } void SessionsTableWidget::UpdateColumnsVisible() const { for (int i = 0; i < 15; i++) { if (GlobalClient->settings->data.SessionsTableColumns[i]) tableWidget->showColumn(i); else tableWidget->hideColumn(i); } } void SessionsTableWidget::UpdateColumnsWidth() const { tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); tableWidget->horizontalHeader()->setSectionResizeMode(ColumnTags, QHeaderView::Stretch); int wDomain = tableWidget->columnWidth(ColumnDomain); int wComputer = tableWidget->columnWidth(ColumnDomain); int wUser = tableWidget->columnWidth(ColumnDomain); tableWidget->horizontalHeader()->setSectionResizeMode(ColumnDomain, QHeaderView::Interactive); tableWidget->horizontalHeader()->setSectionResizeMode(ColumnComputer, QHeaderView::Interactive); tableWidget->horizontalHeader()->setSectionResizeMode(ColumnUser, QHeaderView::Interactive); tableWidget->setColumnWidth(ColumnDomain, wDomain); tableWidget->setColumnWidth(ColumnDomain, wComputer); tableWidget->setColumnWidth(ColumnDomain, wUser); } 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 { 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->ProcessBrowser; delete agent->Terminal; 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(); adaptixWidget->LoadConsoleUI(AgentId); } void SessionsTableWidget::onFilterUpdate() const { this->SetData(); } /// Menu void SessionsTableWidget::handleSessionsTableMenu(const QPoint &pos) { if ( !tableWidget->itemAt(pos) ) return; QStringList agentIds; for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) { if ( tableWidget->item(rowIndex, 0)->isSelected() ) { QString agentId = tableWidget->item( rowIndex, ColumnAgentID )->text(); agentIds.append(agentId); } } /// AGENT MENU auto agentMenu = QMenu("Agent"); agentMenu.addAction("Execute command", this, &SessionsTableWidget::actionExecuteCommand); agentMenu.addAction("Task manager", this, &SessionsTableWidget::actionTasksBrowserOpen); agentMenu.addSeparator(); int agentCount = adaptixWidget->ScriptManager->AddMenuSession(&agentMenu, "SessionAgent", agentIds); if (agentCount > 0) agentMenu.addSeparator(); agentMenu.addAction("Remove console data", this, &SessionsTableWidget::actionConsoleDelete); agentMenu.addAction("Remove from server", this, &SessionsTableWidget::actionAgentRemove); /// SESSION MENU auto sessionMenu = QMenu("Session"); sessionMenu.addAction("Mark as Active", this, &SessionsTableWidget::actionMarkActive); sessionMenu.addAction("Mark as Inactive", this, &SessionsTableWidget::actionMarkInactive); sessionMenu.addSeparator(); sessionMenu.addAction("Set items color", this, &SessionsTableWidget::actionItemColor); sessionMenu.addAction("Set text color", this, &SessionsTableWidget::actionTextColor); sessionMenu.addAction("Reset color", this, &SessionsTableWidget::actionColorReset); sessionMenu.addSeparator(); sessionMenu.addAction( "Hide on client", this, &SessionsTableWidget::actionItemHide); /// MAIN MENU auto ctxMenu = QMenu(); ctxMenu.addAction("Console", this, &SessionsTableWidget::actionConsoleOpen); ctxMenu.addSeparator(); ctxMenu.addMenu(&agentMenu); auto browserMenu = QMenu("Browsers"); int browserCount = adaptixWidget->ScriptManager->AddMenuSession(&browserMenu, "SessionBrowser", agentIds); if (browserCount > 0) ctxMenu.addMenu(&browserMenu); auto accessMenu = QMenu("Access"); int accessCount = adaptixWidget->ScriptManager->AddMenuSession(&accessMenu, "SessionAccess", agentIds); if (accessCount > 0) ctxMenu.addMenu(&accessMenu); adaptixWidget->ScriptManager->AddMenuSession(&ctxMenu, "SessionMain", agentIds); ctxMenu.addSeparator(); ctxMenu.addMenu(&sessionMenu); ctxMenu.addAction("Set tag", this, &SessionsTableWidget::actionItemTag); ctxMenu.addAction("Show all items", this, &SessionsTableWidget::actionItemsShowAll); ctxMenu.exec(tableWidget->horizontalHeader()->viewport()->mapToGlobal(pos)); } void SessionsTableWidget::actionConsoleOpen() const { 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::actionExecuteCommand() { QStringList 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); } } if(listId.empty()) return; bool ok = false; QString cmd = QInputDialog::getText(this,"Execute Command", "Command", QLineEdit::Normal, "", &ok); if (!ok) return; for(auto id : listId) { adaptixWidget->AgentsMap[id]->Console->SetInput(cmd); adaptixWidget->AgentsMap[id]->Console->processInput(); } } void SessionsTableWidget::actionTasksBrowserOpen() const { QString agentId = tableWidget->item( tableWidget->currentRow(), ColumnAgentID )->text(); adaptixWidget->TasksTab->SetAgentFilter(agentId); adaptixWidget->SetTasksUI(); } void SessionsTableWidget::actionMarkActive() const { QStringList 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); } } if(listId.empty()) return; QString message = QString(); bool ok = false; bool result = HttpReqAgentSetMark(listId, "", *(adaptixWidget->GetProfile()), &message, &ok); if( !result ) { MessageError("Response timeout"); return; } } void SessionsTableWidget::actionMarkInactive() const { QStringList 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); } } if(listId.empty()) return; QString message = QString(); bool ok = false; bool result = HttpReqAgentSetMark(listId, "Inactive", *(adaptixWidget->GetProfile()), &message, &ok); if( !result ) { MessageError("Response timeout"); return; } } void SessionsTableWidget::actionItemColor() const { QStringList 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); } } 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("Response timeout"); return; } } } void SessionsTableWidget::actionTextColor() const { QStringList 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); } } 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("Response timeout"); return; } } } void SessionsTableWidget::actionColorReset() const { QStringList 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); } } if(listId.empty()) return; QString message = QString(); bool ok = false; bool result = HttpReqAgentSetColor(listId, "", "", true, *(adaptixWidget->GetProfile()), &message, &ok); if( !result ) { MessageError("Response timeout"); return; } } void SessionsTableWidget::actionConsoleDelete() { QMessageBox::StandardButton reply = QMessageBox::question(this, "Clear Confirmation", "Are you sure you want to delete all agent console data and history from server (tasks will not be deleted from TaskManager)?\n\n" "If you want to temporarily hide the contents of the agent console, do so through the agent console menu.", QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (reply != QMessageBox::Yes) return; QStringList 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); } } if(listId.empty()) return; for (auto id : listId) adaptixWidget->AgentsMap[id]->Console->Clear(); QString message = QString(); bool ok = false; bool result = HttpReqConsoleRemove(listId, *(adaptixWidget->GetProfile()), &message, &ok); if( !result ) { MessageError("Response timeout"); 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; 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("Response timeout"); return; } } void SessionsTableWidget::actionItemTag() const { QStringList 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); } } 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("Response timeout"); return; } } } void SessionsTableWidget::actionItemHide() const { for( int rowIndex = 0 ; rowIndex < tableWidget->rowCount() ; rowIndex++ ) { if ( tableWidget->item(rowIndex, 0)->isSelected() ) { auto agentId = tableWidget->item( rowIndex, ColumnAgentID )->text(); if (adaptixWidget->AgentsMap.contains(agentId)) adaptixWidget->AgentsMap[agentId]->show = false; } } this->SetData(); } void SessionsTableWidget::actionItemsShowAll() const { bool refact = false; for (auto agent : adaptixWidget->AgentsMap) { if (agent->show == false) { agent->show = true; refact = true; } } if (refact) this->SetData(); }