Rabbit Remote Control 0.1.0-bate3
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")
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}
Operational parameter interface.
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.
bool GetUseSystemFile() const
[Initialize parameter after set CParameterPlugin]
int SetModified(bool bModified=true)
When setting parameters, if there is a modification, it is called.