Rabbit Remote Control 0.1.0-bate8
Loading...
Searching...
No Matches
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}
Operational parameter interface.
int LoadPassword(const QString &szTitle, const QString &szKey, QString &password, QSettings &set)
Restore password.
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin.
It contains user and password It only valid in plugin.
virtual void slotSetGlobalParameters() override
Initialize this parameter based on the global parameter.
void SetSavePassword(bool save)
Set save password.
TYPE
Used to control display interface elements.
bool GetUseSystemFile() const
[Initialize parameter after set CParameterPlugin]
int SetModified(bool bModified=true)
When setting parameters, if there is a modification, it is called.