Rabbit Remote Control 0.1.0-bate16
Loading...
Searching...
No Matches
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}
Operational parameter interface.
int LoadPassword(const QString &szTitle, const QString &szKey, QString &password, QSettings &set)
Restore password.
CParameterPlugin * GetPluginParameters()
Get CParameterPlugin.
It contains user and password It only valid in plugin.
virtual void slotSetPluginParameters() 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.