3#include <QLoggingCategory>
4#include <QAbstractSocket>
5#include <QRegularExpression>
7#include "OperateTelnet.h"
8#include "DlgSettingsTelnet.h"
11static Q_LOGGING_CATEGORY(log,
"Plugin.Telnet")
18 qDebug(log) << Q_FUNC_INFO;
19 auto &net = m_Parameters.m_Net;
21 QList<CParameterUser::TYPE> lstType;
22 lstType << CParameterUser::TYPE::UserPassword;
23 net.m_User.SetType(lstType);
24 SetParameter(&m_Parameters);
27COperateTelnet::~COperateTelnet()
29 qDebug(log) << Q_FUNC_INFO;
32COperateTelnet::SecurityLevel COperateTelnet::GetSecurityLevel()
34 return COperateTelnet::SecurityLevel::Risky;
47int COperateTelnet::Start()
52 slotUpdateParameter(
this);
55 check = connect(&m_Telnet, &QTelnet::stateChanged,
56 this, [=](QAbstractSocket::SocketState socketState){
57 if(socketState == QAbstractSocket::ConnectedState) {
59 }
else if(socketState == QAbstractSocket::UnconnectedState) {
64 check = connect(&m_Telnet, &QTelnet::error,
65 this, [=](QAbstractSocket::SocketError err){
66 QString szErr = tr(
"Telnet error:\n%1.").arg(m_Telnet.errorString());
71 check = connect(&m_Telnet, SIGNAL(newData(
const char*,
int)),
72 this, SLOT(slotNewData(
const char*,
int)));
74 check = connect(m_pTerminal, &QTermWidget::sendData,
75 this, [&](
const char* buf,
int len){
76 QByteArray data(buf, len);
78 m_Telnet.sendData(data);
80 GetStats()->AddSends(len);
83 check = connect(&m_Telnet, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
84 this, SLOT(slotStateChanged(QAbstractSocket::SocketState)));
87 auto &net = m_Parameters.m_Net;
88 m_Telnet.setCustomCR();
89 m_Telnet.connectToHost(net.GetHost(), net.GetPort());
91 m_pTerminal->startTerminalTeletype();
97int COperateTelnet::Stop()
100 m_pTerminal->close();
102 m_Telnet.disconnectFromHost();
107void COperateTelnet::slotStateChanged(QAbstractSocket::SocketState state)
111 case QAbstractSocket::UnconnectedState:
112 qDebug(log) << tr(
"Unconnected");
114 case QAbstractSocket::HostLookupState:
115 qDebug(log) << tr(
"Resolve DNS %1").arg(m_Telnet.peerName());
117 case QAbstractSocket::ConnectingState:
118 qDebug(log) << tr(
"Connecting a %1").arg(m_Telnet.peerInfo());
120 case QAbstractSocket::ConnectedState:
121 qDebug(log) << tr(
"Connected a %1").arg(m_Telnet.peerInfo());
123 case QAbstractSocket::BoundState:
124 qDebug(log) << tr(
"Bound");
126 case QAbstractSocket::ListeningState:
127 qDebug(log) << tr(
"Listening");
129 case QAbstractSocket::ClosingState:
130 qDebug(log) << tr(
"Close");
140 auto &net = m_Parameters.m_Net;
141 if(!net.GetHost().isEmpty())
142 szId +=
"_" + net.GetHost()
143 +
"_" + QString::number(net.GetPort());
147 static QRegularExpression exp(
"[-@:/#%!^&* \\.]");
148 szId = szId.replace(exp,
"_");
154 QString szName = m_Parameters.GetName();
155 if(szName.isEmpty()) {
156 auto &net = m_Parameters.m_Net;
157 if(!net.GetHost().isEmpty()) {
162 szName += net.GetHost()
163 +
":" + QString::number(net.GetPort());
173 QString szDescription;
174 if(!
Name().isEmpty())
175 szDescription = tr(
"Name: ") +
Name() +
"\n";
178 szDescription += tr(
"Type: ") +
GetTypeName() +
"\n";
181 szDescription += tr(
"Protocol: ") +
Protocol();
183 if(!
GetPlugin()->DisplayName().isEmpty())
186 szDescription +=
"\n";
189 auto &net = m_Parameters.m_Net;
190 if(!net.GetHost().isEmpty())
191 szDescription += tr(
"Server address: ") + net.GetHost()
192 +
":" + QString::number(net.GetPort()) +
"\n";
194 if(GetSecurityLevel() != SecurityLevel::No)
195 szDescription += tr(
"Security level: ") + GetSecurityLevelString() +
"\n";
200 return szDescription;
203void COperateTelnet::slotNewData(
const char *buf,
int len)
207 WriteTerminal(buf, len);
210 GetStats()->AddReceives(len);
213 QRegularExpression reLogin(m_Parameters.
GetLogin(), QRegularExpression::CaseInsensitiveOption);
214 QRegularExpressionMatch match = reLogin.match(QByteArray(buf, len));
215 bool bLogin = match.hasMatch();
217 QString user = m_Parameters.m_Net.
m_User.GetUser();
218 if(!user.isEmpty()) {
219 m_Telnet.sendData(user.toStdString().c_str(), user.length());
220 m_Telnet.sendData(
"\n", 1);
222 qDebug(log) <<
"User:" << user;
224 QRegularExpression rePassword(m_Parameters.
GetPassword(), QRegularExpression::CaseInsensitiveOption);
225 match = rePassword.match(QByteArray(buf, len));
226 bool bPassword = match.hasMatch();
228 QString password = m_Parameters.m_Net.
m_User.GetPassword();
229 if(!password.isEmpty()) {
230 m_Telnet.sendData(password.toStdString().c_str(), password.length());
231 m_Telnet.sendData(
"\n", 1);
234 qDebug(log) <<
"Password:" << password;
236 if(!m_Parameters.GetCommands().isEmpty()) {
237 foreach (
auto c, m_Parameters.GetCommands()) {
238 m_Telnet.sendData(c.toStdString().c_str(), c.length());
239 m_Telnet.sendData(
"\n", 1);
virtual const QString Description() override
Description.
virtual const QString Name() override
Name.
virtual CBackend * InstanceBackend() override
New CBackend.
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
Open settgins dialog.
virtual const QString Id() override
Identity.
Terminal operate interface.
virtual CParameterTerminalBase * GetParameter()
Get parameters.
virtual const QString Name() override
Name.
void sigFinished()
Successful disconnection signal.
void sigRunning()
Start success signal.
void sigError(const int nError, const QString &szError)
Triggered when an error is generated.
void sigStop()
Notify the user to stop.
virtual const QString Protocol() const
Protocol.
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
virtual const QString Id()
Identity.
virtual const QString GetTypeName() const
Get type name.
CParameterUser m_User
[Instance user]
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin.
QString GetPassword() const
Password Regular Expression.
QString GetLogin() const
Login Regular Expression.
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Description() const =0
Plugin description.