Skip to content

Commit 89f23dd

Browse files
committed
Plugins::FreeRDP: add security level
1 parent 9cccaa5 commit 89f23dd

9 files changed

Lines changed: 109 additions & 66 deletions

File tree

App/Client/mainwindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1041,7 +1041,7 @@ int MainWindow::Start(COperate *pOperate, bool set, QString szFile)
10411041
});
10421042
Q_ASSERT(check);
10431043
check = connect(pOperate, &COperate::sigSecurityLevel,
1044-
this, [this, pOperate](CSecurityLevel::Level level) {
1044+
this, [this, pOperate](CSecurityLevel::Levels level) {
10451045
if(m_pView && pOperate) {
10461046
if(m_pView->GetCurrentView() == pOperate->GetViewer())
10471047
slotCurrentViewChanged(pOperate->GetViewer());

Plugins/FreeRDP/Client/BackendFreeRDP.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ CBackendFreeRDP::CBackendFreeRDP(COperateFreeRDP *pOperate)
7979
#ifdef HAVE_LIBSSH
8080
, m_pThreadSSH(nullptr)
8181
#endif
82+
, m_SecurityLevel(CSecurityLevel::Level::No)
8283
{
8384
qDebug(log) << Q_FUNC_INFO;
8485
m_pParameter = qobject_cast<CParameterFreeRDP*>(pOperate->GetParameter());
@@ -165,10 +166,12 @@ CBackendFreeRDP::OnInitReturnValue CBackendFreeRDP::OnInit()
165166
freerdp_settings_set_string(
166167
settings, FreeRDP_Username,
167168
user.GetUser().toStdString().c_str());
168-
if(!user.GetPassword().isEmpty())
169+
if(!user.GetPassword().isEmpty()) {
169170
freerdp_settings_set_string(
170171
settings, FreeRDP_Password,
171172
user.GetPassword().toStdString().c_str());
173+
m_SecurityLevel |= CSecurityLevel::Level::Authentication;
174+
}
172175

173176
freerdp_settings_set_bool(
174177
settings, FreeRDP_RedirectClipboard, m_pParameter->GetClipboard());
@@ -586,6 +589,7 @@ int CBackendFreeRDP::cbClientStart(rdpContext *context)
586589
QString szInfo = tr("Connected to ") + szServer;
587590
qInfo(log) << szInfo;
588591
emit pThis->sigInformation(szInfo);
592+
emit pThis->sigSecurityLevel(pThis->m_SecurityLevel);
589593
} else {
590594
//DWORD dwErrCode = freerdp_error_info(instance);
591595
UINT32 nRet = freerdp_get_last_error(context);
@@ -1544,8 +1548,10 @@ BOOL CBackendFreeRDP::cb_authenticate(freerdp* instance, char** username,
15441548
*domain = _strdup(szDomain.toStdString().c_str());
15451549
if(!szName.isEmpty() && username)
15461550
*username = _strdup(szName.toStdString().c_str());
1547-
if(password)
1551+
if(password) {
15481552
*password = _strdup(szPassword.toStdString().c_str());
1553+
pThis->m_SecurityLevel |= CSecurityLevel::Level::Authentication;
1554+
}
15491555
} else
15501556
return FALSE;
15511557

@@ -1575,8 +1581,11 @@ BOOL CBackendFreeRDP::cb_GatewayAuthenticate(freerdp *instance,
15751581
*domain = _strdup(szDomain.toStdString().c_str());
15761582
if(!szName.isEmpty() && username)
15771583
*username = _strdup(szName.toStdString().c_str());
1578-
if(password)
1584+
if(password) {
15791585
*password = _strdup(szPassword.toStdString().c_str());
1586+
pThis->m_SecurityLevel |= CSecurityLevel::Level::Authentication;
1587+
}
1588+
pThis->m_SecurityLevel |= CSecurityLevel::Level::Gateway;
15801589
} else
15811590
return FALSE;
15821591

@@ -1675,6 +1684,13 @@ DWORD CBackendFreeRDP::cb_verify_certificate_ex(freerdp *instance,
16751684
//pThis->m_pParameter->SetServerName(common_name);
16761685
emit pThis->sigServerName(common_name);
16771686
}
1687+
1688+
// Set security level
1689+
pThis->m_SecurityLevel |= CSecurityLevel::Level::SecureChannel;
1690+
if (flags & VERIFY_CERT_FLAG_GATEWAY)
1691+
pThis->m_SecurityLevel |= CSecurityLevel::Level::Gateway;
1692+
if (flags & VERIFY_CERT_FLAG_REDIRECT)
1693+
pThis->m_SecurityLevel |= CSecurityLevel::Level::Redirect;
16781694

16791695
if(!pThis->m_pParameter->GetShowVerifyDiaglog()) {
16801696
/* return 1 to accept and store a certificate, 2 to accept
@@ -1695,8 +1711,9 @@ DWORD CBackendFreeRDP::cb_verify_certificate_ex(freerdp *instance,
16951711
#endif
16961712

16971713
QString szType = tr("RDP-Server");
1698-
if (flags & VERIFY_CERT_FLAG_GATEWAY)
1714+
if (flags & VERIFY_CERT_FLAG_GATEWAY) {
16991715
szType = tr("RDP-Gateway");
1716+
}
17001717
if (flags & VERIFY_CERT_FLAG_REDIRECT)
17011718
szType = tr("RDP-Redirect");
17021719

@@ -1781,6 +1798,13 @@ DWORD CBackendFreeRDP::cb_verify_changed_certificate_ex(freerdp *instance,
17811798
if(common_name)
17821799
emit pThis->sigServerName(common_name);
17831800

1801+
// Set security level
1802+
pThis->m_SecurityLevel |= CSecurityLevel::Level::SecureChannel;
1803+
if (flags & VERIFY_CERT_FLAG_GATEWAY)
1804+
pThis->m_SecurityLevel |= CSecurityLevel::Level::Gateway;
1805+
if (flags & VERIFY_CERT_FLAG_REDIRECT)
1806+
pThis->m_SecurityLevel |= CSecurityLevel::Level::Redirect;
1807+
17841808
if(!pThis->m_pParameter->GetShowVerifyDiaglog()) {
17851809
/* return 1 to accept and store a certificate, 2 to accept
17861810
* a certificate only for this session, 0 otherwise */

Plugins/FreeRDP/Client/BackendFreeRDP.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,8 @@ public Q_SLOTS:
191191
int CleanSSHTunnelPipe();
192192
CSSHTunnelThread* m_pThreadSSH;
193193
#endif // HAVE_LIBSSH
194-
194+
195+
CSecurityLevel::Levels m_SecurityLevel;
195196
private Q_SLOTS:
196197
void slotConnectProxyServer(QString szHost, quint16 nPort);
197198
};

Src/Backend.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ int CBackend::SetConnect(COperate *pOperate)
7575
pOperate, SLOT(slotBlockShowWidget(const QString&, int&, void*)),
7676
Qt::BlockingQueuedConnection);
7777
Q_ASSERT(check);
78-
check = connect(this, SIGNAL(sigSecurityLevel(CSecurityLevel::Level)),
79-
pOperate, SLOT(slotSetSecurityLevel(CSecurityLevel::Level)));
78+
check = connect(this, SIGNAL(sigSecurityLevel(CSecurityLevel::Levels)),
79+
pOperate, SLOT(slotSetSecurityLevel(CSecurityLevel::Levels)));
8080
Q_ASSERT(check);
8181
return 0;
8282
}

Src/Backend.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ protected Q_SLOTS:
274274
* \~chinese 当安全级别改变时触发
275275
* \~english Triggered when the security level changes
276276
*/
277-
void sigSecurityLevel(CSecurityLevel::Level level);
277+
void sigSecurityLevel(CSecurityLevel::Levels level);
278278

279279
private:
280280
int SetConnect(COperate* pOperate);

Src/Operate.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,12 @@ CStats *COperate::GetStats()
126126
return nullptr;
127127
}
128128

129-
CSecurityLevel::Level COperate::GetSecurityLevel() const
129+
CSecurityLevel::Levels COperate::GetSecurityLevel() const
130130
{
131131
return m_SecurityLevel;
132132
}
133133

134-
void COperate::slotSetSecurityLevel(CSecurityLevel::Level level)
134+
void COperate::slotSetSecurityLevel(CSecurityLevel::Levels level)
135135
{
136136
if(m_SecurityLevel == level)
137137
return;

Src/Operate.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -395,19 +395,19 @@ class PLUGIN_EXPORT COperate : public QObject
395395
* \return
396396
* \see CSecurityLevel
397397
*/
398-
[[nodiscard]] virtual CSecurityLevel::Level GetSecurityLevel() const;
398+
[[nodiscard]] virtual CSecurityLevel::Levels GetSecurityLevel() const;
399399
Q_SIGNALS:
400400
/*!
401401
* \~chinese 当安全级别改变时触发。其派生类不要直接触发,需要使用 slotSetSecurityLevel 触发
402402
* \~english Triggered when the security level changes.
403403
* Its derived classes should not be triggered directly;
404404
* they need to be triggered using slotSetSecurityLevel.
405405
*/
406-
void sigSecurityLevel(CSecurityLevel::Level level);
406+
void sigSecurityLevel(CSecurityLevel::Levels level);
407407
protected Q_SLOTS:
408-
void slotSetSecurityLevel(CSecurityLevel::Level level);
408+
void slotSetSecurityLevel(CSecurityLevel::Levels level);
409409
private:
410-
CSecurityLevel::Level m_SecurityLevel;
410+
CSecurityLevel::Levels m_SecurityLevel;
411411
//!@}
412412

413413
protected Q_SLOTS:

Src/ParameterCompone/Stats.cpp

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Author: Kang Lin <kl222@126.com>
22
#include "Stats.h"
33

4+
Q_DECLARE_METATYPE(CSecurityLevel::Levels)
5+
46
CStats::CStats(CParameterOperate *parent, const QString &szPrefix)
57
: CParameterOperate{parent}
68
, m_tmInterval(1)
@@ -111,7 +113,7 @@ int CStats::OnSave(QSettings &set)
111113
return 0;
112114
}
113115

114-
CSecurityLevel::CSecurityLevel(CSecurityLevel::Level level, QObject* parent)
116+
CSecurityLevel::CSecurityLevel(Levels level, QObject* parent)
115117
: QObject(parent)
116118
, m_Level(level)
117119
{
@@ -120,7 +122,7 @@ CSecurityLevel::CSecurityLevel(CSecurityLevel::Level level, QObject* parent)
120122
CSecurityLevel::~CSecurityLevel()
121123
{}
122124

123-
CSecurityLevel::Level CSecurityLevel::GetLevel() const
125+
CSecurityLevel::Levels CSecurityLevel::GetLevel() const
124126
{
125127
return m_Level;
126128
}
@@ -145,26 +147,43 @@ QIcon CSecurityLevel::GetIcon() const
145147
return GetIcon(GetLevel());
146148
}
147149

148-
QString CSecurityLevel::GetString(Level level)
150+
QString CSecurityLevel::GetString(const Levels &level)
149151
{
152+
QString szLevel;
153+
if(Level::SecureChannel & level) {
154+
if(!szLevel.isEmpty())
155+
szLevel += " + ";
156+
szLevel += tr("Secure channel");
157+
}
158+
if(Level::Authentication & level) {
159+
if(!szLevel.isEmpty())
160+
szLevel += " + ";
161+
szLevel += tr("Authentication");
162+
}
163+
if(Level::Proxy & level) {
164+
if(!szLevel.isEmpty())
165+
szLevel += " + ";
166+
szLevel += tr("Proxy");
167+
}
168+
if(Level::Gateway & level) {
169+
if(!szLevel.isEmpty())
170+
szLevel += " + ";
171+
szLevel += tr("Gateway");
172+
}
173+
if(Level::Redirect & level) {
174+
if(!szLevel.isEmpty())
175+
szLevel += " + ";
176+
szLevel += tr("Redirect");
177+
}
178+
150179
if(Level::No == level)
151180
return QString();
152-
if(Level::Secure == level)
153-
return tr("Secure") + ": "
154-
+ tr("Secure channel") + " + " + tr("Authentication");
155-
if(Level::Risky == level)
156-
return tr("Risk");
157-
if(Level::Secure & level) {
158-
QString s = tr("Normal") + ": ";
159-
if(Level::SecureChannel & level)
160-
s += tr("Secure channel");
161-
else if(Level::Authentication & level)
162-
s+= tr("Authentication");
163-
return s;
164-
}
165-
if(Level::Normal & level)
166-
return tr("Normal");
167-
return QString();
181+
182+
if(Level::Secure == (level & ~Level::No))
183+
return tr("Secure") + ": " + szLevel;
184+
if(Level::Secure & level)
185+
return tr("Normal") + ": " + szLevel;
186+
return tr("Risk");
168187
}
169188

170189
/*!
@@ -184,51 +203,41 @@ QString CSecurityLevel::GetString(Level level)
184203
* | 🟡 | `U+1F7E1` | 黄圈 | 注意、谨慎 |
185204
* | 🟢 | `U+1F7E2` | 绿圈 | 安全 |
186205
*/
187-
QString CSecurityLevel::GetUnicodeIcon(Level level)
206+
QString CSecurityLevel::GetUnicodeIcon(const Levels &level)
188207
{
189208
if(Level::No == level)
190209
return QString();
191-
if(Level::Secure == level)
210+
if(Level::Secure == (level & ~Level::No))
192211
return "🟢🛡🔐";
193-
if(Level::Risky == level)
194-
return "🔴";
195-
if(Level::Secure & level || Level::Normal & level) {
212+
if(Level::Secure & level) {
196213
QString s = "🟡";
197214
if(Level::SecureChannel & level)
198215
s += "🛡";
199216
else if(Level::Authentication & level)
200217
s+= "🔐";
201218
return s;
202219
}
203-
return QString();
220+
return "🔴";
204221
}
205222

206-
QColor CSecurityLevel::GetColor(Level level)
223+
QColor CSecurityLevel::GetColor(const Levels &level)
207224
{
208225
if(Level::No == level)
209226
return QColor();
210-
if(Level::Secure == level)
227+
if(Level::Secure == (level & ~Level::No))
211228
return Qt::GlobalColor::green;
212-
if(Level::Risky == level)
213-
return Qt::GlobalColor::red;
214229
if(Level::Secure & level)
215230
return Qt::GlobalColor::yellow;
216-
if(Level::Normal & level)
217-
return Qt::GlobalColor::yellow;
218-
return QColor();
231+
return Qt::GlobalColor::red;
219232
}
220233

221-
QIcon CSecurityLevel::GetIcon(Level level)
234+
QIcon CSecurityLevel::GetIcon(const Levels &level)
222235
{
223236
if(Level::No == level)
224237
return QIcon();
225-
if(Level::Secure == level)
238+
if(Level::Secure == (level & ~Level::No))
226239
return QIcon::fromTheme("lock");
227-
if(Level::Risky == level)
228-
return QIcon::fromTheme("unlock");
229240
if(Level::Secure & level)
230241
return QIcon::fromTheme("dialog-warning");
231-
if(Level::Normal & level)
232-
return QIcon::fromTheme("dialog-warning");
233-
return QIcon();
242+
return QIcon::fromTheme("unlock");
234243
}

Src/ParameterCompone/Stats.h

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,39 +67,48 @@ public Q_SLOTS:
6767
*/
6868
class PLUGIN_EXPORT CSecurityLevel : QObject {
6969
Q_OBJECT
70+
7071
public:
7172
enum Level {
72-
No = -1, // No the function
73+
No = 0x8000, // No the function
7374

7475
Authentication = 0x01,
7576
SecureChannel = 0x02, // Channel is secure.
7677
Proxy = 0x04,
78+
Gateway = 0x08,
79+
Redirect = 0x010,
7780

78-
Secure = 0x03, // Green
79-
Normal = 0x04, // Yellow
80-
Risky = 0x00, // Red
81+
Secure = Authentication & SecureChannel, // Green
82+
Normal = Proxy & Gateway & Redirect, // Yellow
83+
Risky = 0x4000, // Red
8184
};
85+
Q_ENUM(Level)
86+
Q_DECLARE_FLAGS(Levels, Level)
87+
Q_FLAG(Levels)
8288

83-
CSecurityLevel(Level = Level::No, QObject* parent = nullptr);
89+
CSecurityLevel(Levels level = Level::No, QObject* parent = nullptr);
8490
~CSecurityLevel();
8591

86-
[[nodiscard]] virtual Level GetLevel() const;
92+
[[nodiscard]] virtual Levels GetLevel() const;
8793
[[nodiscard]] virtual QString GetString() const;
8894
[[nodiscard]] virtual QColor GetColor() const;
8995
[[nodiscard]] virtual QString GetUnicodeIcon() const;
9096
[[nodiscard]] virtual QIcon GetIcon() const;
91-
[[nodiscard]] static QString GetString(Level level);
92-
[[nodiscard]] static QString GetUnicodeIcon(Level level);
93-
[[nodiscard]] static QIcon GetIcon(Level level);
94-
[[nodiscard]] static QColor GetColor(Level level);
97+
[[nodiscard]] static QString GetString(const Levels &level);
98+
[[nodiscard]] static QString GetUnicodeIcon(const Levels &level);
99+
[[nodiscard]] static QIcon GetIcon(const Levels &level);
100+
[[nodiscard]] static QColor GetColor(const Levels &level);
95101

96102
Q_SIGNALS:
97103
/*!
98104
* \~chinese 当安全级别改变时触发
99105
* \~english Triggered when the security level changes
100106
*/
101-
void sigSecurityLevel(Level level);
107+
void sigSecurityLevel(Levels level);
102108

103109
private:
104-
Level m_Level;
110+
Levels m_Level;
105111
};
112+
113+
// 在类外部声明操作符(通常放在头文件末尾)
114+
Q_DECLARE_OPERATORS_FOR_FLAGS(CSecurityLevel::Levels)

0 commit comments

Comments
 (0)