Rabbit Remote Control 0.1.0-de
Loading...
Searching...
No Matches
OperateTelnet.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QAbstractSocket>
5#include <QRegularExpression>
6
7#include "OperateTelnet.h"
8#include "DlgSettingsTelnet.h"
9#include "Plugin.h"
10
11static Q_LOGGING_CATEGORY(log, "Plugin.Telnet")
12
14 : COperateTerminal(parent)
15 , m_Telnet(QTelnet::TCP)
16 , m_bLogin(false)
17{
18 qDebug(log) << Q_FUNC_INFO;
19 auto &net = m_Parameters.m_Net;
20 net.SetPort(23);
21 QList<CParameterUser::TYPE> lstType;
22 lstType << CParameterUser::TYPE::UserPassword;
23 net.m_User.SetType(lstType);
24 SetParameter(&m_Parameters);
25}
26
27COperateTelnet::~COperateTelnet()
28{
29 qDebug(log) << Q_FUNC_INFO;
30}
31
32COperateTelnet::SecurityLevel COperateTelnet::GetSecurityLevel()
33{
34 return COperateTelnet::SecurityLevel::Risky;
35}
36
37QDialog *COperateTelnet::OnOpenDialogSettings(QWidget *parent)
38{
39 return new CDlgSettingsTelnet(&m_Parameters, parent);
40}
41
43{
44 return nullptr;
45}
46
47int COperateTelnet::Start()
48{
49 if(!m_pTerminal)
50 return -1;
51
52 slotUpdateParameter(this);
53
54 bool check = false;
55 check = connect(&m_Telnet, &QTelnet::stateChanged,
56 this, [=](QAbstractSocket::SocketState socketState){
57 if(socketState == QAbstractSocket::ConnectedState) {
58 emit sigRunning();
59 } else if(socketState == QAbstractSocket::UnconnectedState) {
60 emit sigStop();
61 }
62 });
63 Q_ASSERT(check);
64 check = connect(&m_Telnet, &QTelnet::error,
65 this, [=](QAbstractSocket::SocketError err){
66 QString szErr = tr("Telnet error:\n%1.").arg(m_Telnet.errorString());
67 emit sigError(err, szErr);
68 emit sigStop();
69 });
70 Q_ASSERT(check);
71 check = connect(&m_Telnet, SIGNAL(newData(const char*, int)),
72 this, SLOT(slotNewData(const char*, int)));
73 Q_ASSERT(check);
74 check = connect(m_pTerminal, &QTermWidget::sendData,
75 this, [&](const char* buf, int len){
76 QByteArray data(buf, len);
77 //qDebug(log) << "Send data:" << data << data.toHex(':');
78 m_Telnet.sendData(data);
79 if(GetStats())
80 GetStats()->AddSends(len);
81 });
82 Q_ASSERT(check);
83 check = connect(&m_Telnet, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
84 this, SLOT(slotStateChanged(QAbstractSocket::SocketState)));
85 Q_ASSERT(check);
86
87 auto &net = m_Parameters.m_Net;
88 m_Telnet.setCustomCR();
89 m_Telnet.connectToHost(net.GetHost(), net.GetPort());
90
91 m_pTerminal->startTerminalTeletype();
92
93 emit sigRunning();
94 return 0;
95}
96
97int COperateTelnet::Stop()
98{
99 if(m_pTerminal)
100 m_pTerminal->close();
101
102 m_Telnet.disconnectFromHost();
103 emit sigFinished();
104 return 0;
105}
106
107void COperateTelnet::slotStateChanged(QAbstractSocket::SocketState state)
108{
109 switch( state )
110 {
111 case QAbstractSocket::UnconnectedState:
112 qDebug(log) << tr("Unconnected");
113 break;
114 case QAbstractSocket::HostLookupState:
115 qDebug(log) << tr("Resolve DNS %1").arg(m_Telnet.peerName());
116 break;
117 case QAbstractSocket::ConnectingState:
118 qDebug(log) << tr("Connecting a %1").arg(m_Telnet.peerInfo());
119 break;
120 case QAbstractSocket::ConnectedState:
121 qDebug(log) << tr("Connected a %1").arg(m_Telnet.peerInfo());
122 break;
123 case QAbstractSocket::BoundState:
124 qDebug(log) << tr("Bound");
125 break;
126 case QAbstractSocket::ListeningState:
127 qDebug(log) << tr("Listening");
128 break;
129 case QAbstractSocket::ClosingState:
130 qDebug(log) << tr("Close");
131 break;
132 }
133}
134
135const QString COperateTelnet::Id()
136{
137 QString szId = COperate::Id();
138 if(GetParameter()) {
139 if(GetParameter()->GetName().isEmpty()) {
140 auto &net = m_Parameters.m_Net;
141 if(!net.GetHost().isEmpty())
142 szId += "_" + net.GetHost()
143 + "_" + QString::number(net.GetPort());
144 } else
145 szId += "_" + GetParameter()->GetName();
146 }
147 static QRegularExpression exp("[-@:/#%!^&* \\.]");
148 szId = szId.replace(exp, "_");
149 return szId;
150}
151
152const QString COperateTelnet::Name()
153{
154 QString szName = m_Parameters.GetName();
155 if(szName.isEmpty()) {
156 auto &net = m_Parameters.m_Net;
157 if(!net.GetHost().isEmpty()) {
158 if(m_Parameters.GetGlobalParameters()
159 && m_Parameters.GetGlobalParameters()->GetShowProtocolPrefix()
160 && !Protocol().isEmpty())
161 szName = Protocol() + ":";
162 szName += net.GetHost()
163 + ":" + QString::number(net.GetPort());
164 }
165 }
166 if(szName.isEmpty())
167 szName = COperateTerminal::Name();
168 return szName;
169}
170
172{
173 QString szDescription;
174 if(!Name().isEmpty())
175 szDescription = tr("Name: ") + Name() + "\n";
176
177 if(!GetTypeName().isEmpty())
178 szDescription += tr("Type: ") + GetTypeName() + "\n";
179
180 if(!Protocol().isEmpty()) {
181 szDescription += tr("Protocol: ") + Protocol();
182#ifdef DEBUG
183 if(!GetPlugin()->DisplayName().isEmpty())
184 szDescription += " - " + GetPlugin()->DisplayName();
185#endif
186 szDescription += "\n";
187 }
188
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";
193
194 if(GetSecurityLevel() != SecurityLevel::No)
195 szDescription += tr("Security level: ") + GetSecurityLevelString() + "\n";
196
197 if(!GetPlugin()->Description().isEmpty())
198 szDescription += tr("Description: ") + GetPlugin()->Description();
199
200 return szDescription;
201}
202
203void COperateTelnet::slotNewData(const char *buf, int len)
204{
205 //QByteArray data(buf, len);
206 //qDebug(log) << "Receive data:" << data << data.toHex(':');
207 WriteTerminal(buf, len);
208
209 if(GetStats())
210 GetStats()->AddReceives(len);
211
212 if(!m_bLogin) {
213 QRegularExpression reLogin(m_Parameters.GetLogin(), QRegularExpression::CaseInsensitiveOption);
214 QRegularExpressionMatch match = reLogin.match(QByteArray(buf, len));
215 bool bLogin = match.hasMatch();
216 if(bLogin) {
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);
221 }
222 qDebug(log) << "User:" << user;
223 }
224 QRegularExpression rePassword(m_Parameters.GetPassword(), QRegularExpression::CaseInsensitiveOption);
225 match = rePassword.match(QByteArray(buf, len));
226 bool bPassword = match.hasMatch();
227 if(bPassword) {
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);
232 m_bLogin = true;
233 }
234 qDebug(log) << "Password:" << password;
235
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);
240 }
241 }
242 }
243 }
244}
245
Backend interface.
Definition Backend.h:42
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.
Definition Operate.cpp:71
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
Definition Operate.cpp:259
virtual const QString Id()
Identity.
Definition Operate.cpp:33
virtual const QString GetTypeName() const
Get type name.
Definition Operate.cpp:76
CParameterUser m_User
[Instance user]
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin.
QString GetPassword() const
Password Regular Expression.
QString GetLogin() const
Login Regular Expression.
Plugin interface.
Definition Plugin.h:15
virtual const QString DisplayName() const
The plugin display name.
Definition Plugin.cpp:73
virtual const QString Description() const =0
Plugin description.