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