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