mirror of
https://github.com/Adaptix-Framework/AdaptixC2
synced 2026-06-08 10:20:39 +00:00
109 lines
3.5 KiB
C++
109 lines
3.5 KiB
C++
#include <Konsole/konsole.h>
|
|
#include <Workers/TerminalWorker.h>
|
|
#include <UI/Widgets/TerminalContainerWidget.h>
|
|
#include <QMetaObject>
|
|
|
|
TerminalWorker::TerminalWorker(TerminalTab* terminalTab, const QString &token, const QUrl& wsUrl, const QString& terminalData, QObject* parent) : QObject(parent)
|
|
{
|
|
this->terminalTab = terminalTab;
|
|
this->token = token;
|
|
this->wsUrl = wsUrl;
|
|
this->terminalData = terminalData;
|
|
}
|
|
|
|
TerminalWorker::~TerminalWorker() = default;
|
|
|
|
void TerminalWorker::start()
|
|
{
|
|
if (stopped)
|
|
return;
|
|
|
|
this->websocket = new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this);
|
|
|
|
auto sslConfig = websocket->sslConfiguration();
|
|
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
|
|
sslConfig.setProtocol( QSsl::TlsV1_2OrLater );
|
|
websocket->setSslConfiguration(sslConfig);
|
|
websocket->ignoreSslErrors();
|
|
|
|
connect(websocket, &QWebSocket::connected, this, &TerminalWorker::onWsConnected, Qt::DirectConnection);
|
|
connect(websocket, &QWebSocket::binaryMessageReceived, this, &TerminalWorker::onWsBinaryMessageReceived, Qt::DirectConnection);
|
|
|
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
|
|
connect(websocket, &QWebSocket::errorOccurred, this, &TerminalWorker::onWsError, Qt::DirectConnection);
|
|
#else
|
|
connect(websocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), this, &TerminalWorker::onWsError, Qt::DirectConnection);
|
|
#endif
|
|
|
|
QNetworkRequest request(wsUrl);
|
|
request.setRawHeader("Authorization", QString("Bearer " + token).toUtf8());
|
|
request.setRawHeader("Channel-Type", QString("terminal").toUtf8());
|
|
request.setRawHeader("Channel-Data", QString(this->terminalData).toUtf8());
|
|
|
|
websocket->open(request);
|
|
}
|
|
|
|
void TerminalWorker::stop()
|
|
{
|
|
if (stopped.exchange(true))
|
|
return;
|
|
|
|
if (websocket) {
|
|
if (websocket->state() != QAbstractSocket::UnconnectedState) {
|
|
connect(websocket, &QWebSocket::disconnected, this, [this]() {
|
|
websocket->deleteLater();
|
|
Q_EMIT finished();
|
|
this->deleteLater();
|
|
});
|
|
|
|
websocket->close();
|
|
return;
|
|
} else {
|
|
websocket->deleteLater();
|
|
}
|
|
}
|
|
|
|
Q_EMIT finished();
|
|
this->deleteLater();
|
|
}
|
|
|
|
void TerminalWorker::onWsConnected() {}
|
|
|
|
void TerminalWorker::onWsBinaryMessageReceived(const QByteArray& msg) {
|
|
if (stopped) return;
|
|
|
|
if (!started) {
|
|
started = true;
|
|
|
|
Q_EMIT connectedToTerminal();
|
|
|
|
QTermWidget* konsole = terminalTab ? terminalTab->Konsole() : nullptr;
|
|
|
|
if (konsole) {
|
|
connect(konsole, &QTermWidget::sendData, this,
|
|
[this](const char *data, int size) {
|
|
if (stopped)
|
|
return;
|
|
|
|
const QByteArray payload(data, size);
|
|
QMetaObject::invokeMethod(this, [this, payload]() {
|
|
if (stopped)
|
|
return;
|
|
if (websocket && websocket->state() == QAbstractSocket::ConnectedState) {
|
|
websocket->sendBinaryMessage(payload);
|
|
}
|
|
}, Qt::QueuedConnection);
|
|
},
|
|
Qt::DirectConnection);
|
|
}
|
|
}
|
|
|
|
if (!msg.isEmpty())
|
|
Q_EMIT binaryMessageToTerminal(msg);
|
|
}
|
|
|
|
void TerminalWorker::onWsError(QAbstractSocket::SocketError error)
|
|
{
|
|
Q_EMIT errorStop();
|
|
}
|