玉兔远程控制 0.1.0-bate3
载入中...
搜索中...
未找到
ParameterUser.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#if HAVE_QTKEYCHAIN
4 #include "keychain.h"
5#endif
6
7#include "ParameterUser.h"
8#include "ParameterNet.h"
9#include "RabbitCommonTools.h"
10#include <QLoggingCategory>
11
12static Q_LOGGING_CATEGORY(log, "Client.Parameter.User")
13
14CParameterUser::CParameterUser(CParameterOperate *parent, const QString &szPrefix)
15 : CParameterOperate(parent, szPrefix)
16 , m_Type(QList<TYPE>() << TYPE::UserPassword)
17 , m_UsedType(TYPE::UserPassword)
18 , m_bSavePassword(false)
19 , m_bUseSystemFile(true)
20 , m_bSavePassphrase(false)
21{
22 m_TypeName = {{TYPE::None, tr("None")},
23 {TYPE::OnlyPassword, tr("Password")},
24 {TYPE::UserPassword, tr("Username and password")},
25 {TYPE::PublicKey, tr("Public key")},
26 {TYPE::OnlyPasswordX509None, tr("Password with X509 none")},
27 {TYPE::OnlyPasswordX509, tr("Password with X509")},
28 {TYPE::UserPasswordX509None, tr("Username and password with X509 none")},
29 {TYPE::UserPasswordX509, tr("Username and password with X509")}
30 };
31}
32
33int CParameterUser::OnLoad(QSettings &set)
34{
35 set.beginGroup("User");
36 SetUser(set.value("Name", GetUser()).toString());
37
38 set.beginGroup("Authentication");
39 QStringList type;
40 foreach(auto t, GetType()) {
41 type.push_back(QString::number((int)t));
42 }
43 QStringList vType;
44 vType = set.value("Type", type).toStringList();
45 QList<TYPE> lstType;
46 foreach(auto s, vType)
47 {
48 lstType.push_back((TYPE)s.toInt());
49 }
50 SetType(lstType);
51 SetUsedType((TYPE)set.value("Type/Used", (int)GetUsedType()).toInt());
52
53 SetSavePassword(set.value("SavePassword", GetSavePassword()).toBool());
54 if(GetSavePassword())
55 {
56#if HAVE_QTKEYCHAIN
57 auto para = GetGlobalParameters();
58 if(para && para->GetUseSystemCredential()) {
59 QString key("Password");
60 auto net = qobject_cast<CParameterNet*>(parent());
61 if(net) {
62 key = GetUser() + "@" + net->GetHost() + ":" + QString::number(net->GetPort()) + "/" + key;
63 }
64 auto pReadJob = new QKeychain::ReadPasswordJob("io.github.KangLin/RabbitRemoteControl");
65 connect(pReadJob, &QKeychain::ReadPasswordJob::finished, this, &CParameterUser::slotLoadPassword);
66 pReadJob->setKey(key);
67 pReadJob->start();
68 } else
69#endif
70 {
71 QString szPassword;
72 if(!LoadPassword(tr("Password"), "Password", szPassword, set))
73 SetPassword(szPassword);
74 }
75 }
76
77 set.beginGroup("PublicKey");
78 set.beginGroup("File");
79 SetUseSystemFile(set.value("UseSystemFile", GetUseSystemFile()).toBool());
80 SetPublicKeyFile(set.value("PublicKey",
81 GetPublicKeyFile()).toString());
82 SetPrivateKeyFile(set.value("PrivateKey",
83 GetPrivateKeyFile()).toString());
84 SetSavePassphrase(set.value("SavePassphrase", GetSavePassphrase()).toBool());
85 if(GetSavePassphrase()) {
86#if HAVE_QTKEYCHAIN
87 auto para = GetGlobalParameters();
88 if(para && para->GetUseSystemCredential()) {
89 QString key("Passphrase");
90 auto net = qobject_cast<CParameterNet*>(parent());
91 if(net) {
92 key = GetUser() + "@" + net->GetHost() + ":" + QString::number(net->GetPort()) + "/" + key;
93 }
94 auto pReadJob = new QKeychain::ReadPasswordJob("io.github.KangLin/RabbitRemoteControl");
95 connect(pReadJob, &QKeychain::ReadPasswordJob::finished, this, &CParameterUser::slotLoadPassPhrase);
96 pReadJob->setKey(key);
97 pReadJob->start();
98 } else
99#endif
100 {
101 QString szPassword;
102 if(!LoadPassword(tr("Passphrase"), "Passphrase", szPassword, set))
103 SetPassphrase(szPassword);
104 }
105 }
106
107 SetCAFile(set.value("CA", GetCAFile()).toString());
108 SetCRLFile(set.value("CRL", GetCRLFile()).toString());
109
110 set.endGroup();
111
112 set.endGroup();
113 set.endGroup();
114 set.endGroup();
115 return 0;
116}
117
118int CParameterUser::OnSave(QSettings &set)
119{
120 set.beginGroup("User");
121 set.setValue("Name", GetUser());
122
123 set.beginGroup("Authentication");
124 QStringList type;
125 foreach(auto t, GetType()) {
126 type.push_back(QString::number((int)t));
127 }
128 set.setValue("Type", type);
129 set.setValue("Type/Used", (int)GetUsedType());
130
131 set.setValue("SavePassword", GetSavePassword());
132 if(GetSavePassword() && !GetPassword().isEmpty()) {
133#if HAVE_QTKEYCHAIN
134 auto para = GetGlobalParameters();
135 if(para && para->GetUseSystemCredential()) {
136 QString key("Password");
137 auto net = qobject_cast<CParameterNet*>(parent());
138 if(net) {
139 key = GetUser() + "@" + net->GetHost() + ":" + QString::number(net->GetPort()) + "/" + key;
140 }
141 auto pWriteJob = new QKeychain::WritePasswordJob("io.github.KangLin/RabbitRemoteControl");
142 connect(pWriteJob, &QKeychain::WritePasswordJob::finished, [this, pWriteJob, key]() {
143 if (pWriteJob->error()) {
144 qCritical(log) << "Fail: write key" << key << ";" << pWriteJob->errorString();
145 return;
146 }
147 qDebug(log) << "Write key" << key << "succeeded.";
148 });
149 pWriteJob->setKey(key);
150 pWriteJob->setTextData(GetPassword());
151 pWriteJob->start();
152 } else
153#endif
154 {
155 SavePassword("Password", GetPassword(), set, GetSavePassword());
156 }
157 }
158
159 set.beginGroup("PublicKey");
160 set.beginGroup("File");
161 set.setValue("UseSystemFile", GetUseSystemFile());
162 set.setValue("PublicKey", GetPublicKeyFile());
163 set.setValue("PrivateKey", GetPrivateKeyFile());
164 set.setValue("SavePassphrase", GetSavePassphrase());
165 if(GetSavePassphrase() && !GetPassphrase().isEmpty()) {
166#if HAVE_QTKEYCHAIN
167 auto para = GetGlobalParameters();
168 if(para && para->GetUseSystemCredential()) {
169 QString key("Passphrase");
170 auto net = qobject_cast<CParameterNet*>(parent());
171 if(net) {
172 key = GetUser() + "@" + net->GetHost() + ":" + QString::number(net->GetPort()) + "/" + key;
173 }
174 auto pWriteJob = new QKeychain::WritePasswordJob("io.github.KangLin/RabbitRemoteControl");
175 connect(pWriteJob, &QKeychain::WritePasswordJob::finished, [this, pWriteJob, key]() {
176 if (pWriteJob->error()) {
177 qCritical(log) << "Fail: write pass phrase key" << key << ";" << pWriteJob->errorString();
178 return;
179 }
180 qDebug(log) << "Writepass phrase key" << key << "succeeded.";
181 });
182 pWriteJob->setKey(key);
183 pWriteJob->setTextData(GetPassphrase());
184 pWriteJob->start();
185 } else
186#endif
187 {
188 SavePassword("Passphrase", GetPassphrase(), set, GetSavePassphrase());
189 }
190 }
191
192 set.setValue("CA", GetCAFile());
193 set.setValue("CRL", GetCRLFile());
194
195 set.endGroup();
196
197 set.endGroup();
198 set.endGroup();
199 set.endGroup();
200 return 0;
201}
202
203QList<CParameterUser::TYPE> CParameterUser::GetType() const
204{
205 return m_Type;
206}
207
208int CParameterUser::SetType(QList<TYPE> type)
209{
210 if(m_Type == type)
211 return 0;
212 m_Type = type;
213 SetModified(true);
214 return 0;
215}
216
217CParameterUser::TYPE CParameterUser::GetUsedType() const
218{
219 return m_UsedType;
220}
221
222int CParameterUser::SetUsedType(TYPE type)
223{
224 if(m_UsedType == type)
225 return 0;
226 m_UsedType = type;
227 SetModified(true);
228 return 0;
229}
230
231const QString CParameterUser::GetUser() const
232{
233 return m_szUser;
234}
235
236void CParameterUser::SetUser(const QString &szUser)
237{
238 if (m_szUser == szUser)
239 return;
240 m_szUser = szUser;
241 SetModified(true);
242}
243
244const QString CParameterUser::GetPassword() const
245{
246 return m_szPassword;
247}
248
249void CParameterUser::SetPassword(const QString &szPassword)
250{
251 if(m_szPassword == szPassword)
252 return;
253 m_szPassword = szPassword;
254 SetModified(true);
255}
256
257const bool CParameterUser::GetSavePassword() const
258{
259 return m_bSavePassword;
260}
261
263{
264 if (m_bSavePassword == save)
265 return;
266 m_bSavePassword = save;
267 SetModified(true);
268}
269
272{
273 if(!GetGlobalParameters()) {
274 QString szErr = "The CParameterClient is null";
275 qCritical(log) << szErr;
276 Q_ASSERT_X(false, "CParameterUser", szErr.toStdString().c_str());
277 return;
278 }
279
281 {
282 if(GetGlobalParameters()->GetEnableSystemUserToUser())
283 SetUser(RabbitCommon::CTools::GetCurrentUser());
284 SetSavePassword(GetGlobalParameters()->GetSavePassword());
285 SetSavePassphrase(GetGlobalParameters()->GetSavePassword());
286 }
287
288 return;
289}
291
294{
295 return m_bUseSystemFile;
296}
297
298int CParameterUser::SetUseSystemFile(bool use)
299{
300 if(m_bUseSystemFile == use)
301 return 0;
302 m_bUseSystemFile = use;
303 SetModified(true);
304 return 0;
305}
306
307QString CParameterUser::GetPassphrase() const
308{
309 return m_szPassphrase;
310}
311
312int CParameterUser::SetPassphrase(const QString passphrase)
313{
314 if(m_szPassphrase == passphrase)
315 return 0;
316 m_szPassphrase = passphrase;
317 SetModified(true);
318 return 0;
319}
320
321bool CParameterUser::GetSavePassphrase() const
322{
323 return m_bSavePassphrase;
324}
325
326int CParameterUser::SetSavePassphrase(bool bSave)
327{
328 if(m_bSavePassphrase == bSave)
329 return 0;
330 m_bSavePassphrase = bSave;
331 SetModified(true);
332 return 0;
333}
334
335QString CParameterUser::GetPublicKeyFile() const
336{
337 return m_szPublicKeyFile;
338}
339
340int CParameterUser::SetPublicKeyFile(const QString szFile)
341{
342 if(m_szPublicKeyFile == szFile)
343 return 0;
344 m_szPublicKeyFile = szFile;
345 SetModified(true);
346 return 0;
347}
348
349QString CParameterUser::GetPrivateKeyFile() const
350{
351 return m_szPrivateKeyFile;
352}
353
354int CParameterUser::SetPrivateKeyFile(const QString szFile)
355{
356 if(m_szPrivateKeyFile == szFile)
357 return 0;
358 m_szPrivateKeyFile = szFile;
359 SetModified(true);
360 return 0;
361}
362
363QString CParameterUser::GetCAFile() const
364{
365 return m_szCAFile;
366}
367
368int CParameterUser::SetCAFile(const QString &ca)
369{
370 if(m_szCAFile == ca)
371 return 0;
372 m_szCAFile = ca;
373 SetModified(true);
374 return 0;
375}
376
377QString CParameterUser::GetCRLFile() const
378{
379 return m_szCRLFile;
380}
381
382int CParameterUser::SetCRLFile(const QString &crl)
383{
384 if(m_szCRLFile == crl)
385 return 0;
386 m_szCRLFile = crl;
387 SetModified(true);
388 return 0;
389}
390
391QString CParameterUser::ConvertTypeToName(TYPE t)
392{
393 return m_TypeName[t];
394}
395
396int CParameterUser::SetTypeName(TYPE t, const QString& szName)
397{
398 m_TypeName[t] = szName;
399 return 0;
400}
401
402void CParameterUser::slotLoadPassword()
403{
404#if HAVE_QTKEYCHAIN
405 qDebug(log) << Q_FUNC_INFO;
406 QKeychain::ReadPasswordJob* pReadJob = qobject_cast<QKeychain::ReadPasswordJob*>(sender());
407 if(!pReadJob) return;
408 QString key = pReadJob->key();
409 if (pReadJob->error()) {
410 qCritical(log) << "Fail: read key" << key << ";" << pReadJob->errorString();
411 return;
412 }
413 qDebug(log) << "Read key" << key << "succeeded.";
414 SetPassword(pReadJob->textData());
415#endif
416}
417
418void CParameterUser::slotLoadPassPhrase()
419{
420#if HAVE_QTKEYCHAIN
421 qDebug(log) << Q_FUNC_INFO;
422 QKeychain::ReadPasswordJob* pReadJob = qobject_cast<QKeychain::ReadPasswordJob*>(sender());
423 if(!pReadJob) return;
424 QString key = pReadJob->key();
425 if (pReadJob->error()) {
426 qCritical(log) << "Fail: read pass phrase key" << key << ";" << pReadJob->errorString();
427 return;
428 }
429 qDebug(log) << "Read pass phrase key" << key << "succeeded.";
430 SetPassphrase(pReadJob->textData());
431#endif
432}
操作参数接口。仅在插件内有效。
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin
用户名与验证方式。此类仅在插件内有效。它的界面是 CParameterUserUI
virtual void slotSetGlobalParameters() override
Initialize this parameter based on the global parameter
void SetSavePassword(bool save)
Set save password
bool GetUseSystemFile() const
[Initialize parameter after set CParameterPlugin]
int SetModified(bool bModified=true)
在设置参数时,如果有修改,则调用。