3#include <QCoreApplication>
4#include <QLoggingCategory>
5#include <QElapsedTimer>
10#include "ParameterUser.h"
11#include "ParameterNet.h"
12#include "RabbitCommonTools.h"
14static Q_LOGGING_CATEGORY(log,
"Client.Parameter.User")
15static QString ServiceName()
18 return "io.github.KangLin/RabbitRemoteControl";
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")}
41int CParameterUser::OnLoad(QSettings &set)
43 set.beginGroup(
"User");
44 SetUser(set.value(
"Name", GetUser()).toString());
46 set.beginGroup(
"Authentication");
48 foreach(
auto t, GetType()) {
49 type.push_back(QString::number((
int)t));
52 vType = set.value(
"Type", type).toStringList();
54 foreach(
auto s, vType)
56 lstType.push_back((
TYPE)s.toInt());
59 SetUsedType((
TYPE)set.value(
"Type/Used", (
int)GetUsedType()).toInt());
66 if(para && para->GetUseSystemCredential()) {
67 QString key(
"Password");
68 auto net = qobject_cast<CParameterNet*>(parent());
70 key = ServiceName() +
"/" + GetUser() +
"@" + net->GetHost() +
":" + QString::number(net->GetPort()) +
"/" + key;
72 auto pReadJob =
new QKeychain::ReadPasswordJob(ServiceName());
73 connect(pReadJob, &QKeychain::ReadPasswordJob::finished,
this, &CParameterUser::slotLoadPassword);
74 pReadJob->setKey(key);
79 while(!m_bFinished && timer.elapsed() < 3000) {
80 QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
86 if(!
LoadPassword(tr(
"Password"),
"Password", szPassword, set))
87 SetPassword(szPassword);
91 set.beginGroup(
"PublicKey");
92 set.beginGroup(
"File");
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()) {
102 if(para && para->GetUseSystemCredential()) {
103 QString key(
"Passphrase");
104 auto net = qobject_cast<CParameterNet*>(parent());
106 key = ServiceName() +
"/" + GetUser() +
"@" + net->GetHost() +
":" + QString::number(net->GetPort()) +
"/" + key;
108 auto pReadJob =
new QKeychain::ReadPasswordJob(
"io.github.KangLin/RabbitRemoteControl");
109 connect(pReadJob, &QKeychain::ReadPasswordJob::finished,
this, &CParameterUser::slotLoadPassPhrase);
110 pReadJob->setKey(key);
115 while(!m_bFinished && timer.elapsed() < 3000)
116 QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
121 if(!
LoadPassword(tr(
"Passphrase"),
"Passphrase", szPassword, set))
122 SetPassphrase(szPassword);
126 SetCAFile(set.value(
"CA", GetCAFile()).toString());
127 SetCRLFile(set.value(
"CRL", GetCRLFile()).toString());
137int CParameterUser::OnSave(QSettings &set)
139 set.beginGroup(
"User");
140 set.setValue(
"Name", GetUser());
142 set.beginGroup(
"Authentication");
144 foreach(
auto t, GetType()) {
145 type.push_back(QString::number((
int)t));
147 set.setValue(
"Type", type);
148 set.setValue(
"Type/Used", (
int)GetUsedType());
150 set.setValue(
"SavePassword", GetSavePassword());
151 if(GetSavePassword() && !GetPassword().isEmpty()) {
154 if(para && para->GetUseSystemCredential()) {
155 QString key(
"Password");
156 auto net = qobject_cast<CParameterNet*>(parent());
158 key = ServiceName() +
"/" + GetUser() +
"@" + net->GetHost() +
":" + QString::number(net->GetPort()) +
"/" + key;
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();
166 qDebug(log) <<
"Write key" << key <<
"succeeded.";
168 pWriteJob->setKey(key);
169 pWriteJob->setTextData(GetPassword());
174 SavePassword(
"Password", GetPassword(), set, GetSavePassword());
178 set.beginGroup(
"PublicKey");
179 set.beginGroup(
"File");
181 set.setValue(
"PublicKey", GetPublicKeyFile());
182 set.setValue(
"PrivateKey", GetPrivateKeyFile());
183 set.setValue(
"SavePassphrase", GetSavePassphrase());
184 if(GetSavePassphrase() && !GetPassphrase().isEmpty()) {
187 if(para && para->GetUseSystemCredential()) {
188 QString key(
"Passphrase");
189 auto net = qobject_cast<CParameterNet*>(parent());
191 key = ServiceName() +
"/" + GetUser() +
"@" + net->GetHost() +
":" + QString::number(net->GetPort()) +
"/" + key;
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();
199 qDebug(log) <<
"Writepass phrase key" << key <<
"succeeded.";
201 pWriteJob->setKey(key);
202 pWriteJob->setTextData(GetPassphrase());
207 SavePassword(
"Passphrase", GetPassphrase(), set, GetSavePassphrase());
211 set.setValue(
"CA", GetCAFile());
212 set.setValue(
"CRL", GetCRLFile());
228QList<CParameterUser::TYPE> CParameterUser::GetType()
const
230 return m_Data.m_Type;
233int CParameterUser::SetType(QList<TYPE> type)
235 if(m_Data.m_Type == type)
237 m_Data.m_Type = type;
244 return m_Data.m_UsedType;
247int CParameterUser::SetUsedType(TYPE type)
249 if(m_Data.m_UsedType == type)
251 m_Data.m_UsedType = type;
256const QString CParameterUser::GetUser()
const
258 return m_Data.m_szUser;
261void CParameterUser::SetUser(
const QString &szUser)
263 if (m_Data.m_szUser == szUser)
265 m_Data.m_szUser = szUser;
269const QString CParameterUser::GetPassword()
const
271 return m_Data.m_szPassword;
274void CParameterUser::SetPassword(
const QString &szPassword)
276 if(m_Data.m_szPassword == szPassword)
278 m_Data.m_szPassword = szPassword;
282const bool CParameterUser::GetSavePassword()
const
284 return m_Data.m_bSavePassword;
289 if (m_Data.m_bSavePassword == save)
291 m_Data.m_bSavePassword = save;
299 QString szErr =
"The CParameterClient is null";
300 qCritical(log) << szErr;
301 Q_ASSERT_X(
false,
"CParameterUser", szErr.toStdString().c_str());
308 SetUser(RabbitCommon::CTools::GetCurrentUser());
320 return m_Data.m_bUseSystemFile;
323int CParameterUser::SetUseSystemFile(
bool use)
325 if(m_Data.m_bUseSystemFile == use)
327 m_Data.m_bUseSystemFile = use;
332QString CParameterUser::GetPassphrase()
const
334 return m_Data.m_szPassphrase;
337int CParameterUser::SetPassphrase(
const QString passphrase)
339 if(m_Data.m_szPassphrase == passphrase)
341 m_Data.m_szPassphrase = passphrase;
346bool CParameterUser::GetSavePassphrase()
const
348 return m_Data.m_bSavePassphrase;
351int CParameterUser::SetSavePassphrase(
bool bSave)
353 if(m_Data.m_bSavePassphrase == bSave)
355 m_Data.m_bSavePassphrase = bSave;
360QString CParameterUser::GetPublicKeyFile()
const
362 return m_Data.m_szPublicKeyFile;
365int CParameterUser::SetPublicKeyFile(
const QString szFile)
367 if(m_Data.m_szPublicKeyFile == szFile)
369 m_Data.m_szPublicKeyFile = szFile;
374QString CParameterUser::GetPrivateKeyFile()
const
376 return m_Data.m_szPrivateKeyFile;
379int CParameterUser::SetPrivateKeyFile(
const QString szFile)
381 if(m_Data.m_szPrivateKeyFile == szFile)
383 m_Data.m_szPrivateKeyFile = szFile;
388QString CParameterUser::GetCAFile()
const
390 return m_Data.m_szCAFile;
393int CParameterUser::SetCAFile(
const QString &ca)
395 if(m_Data.m_szCAFile == ca)
397 m_Data.m_szCAFile = ca;
402QString CParameterUser::GetCRLFile()
const
404 return m_Data.m_szCRLFile;
407int CParameterUser::SetCRLFile(
const QString &crl)
409 if(m_Data.m_szCRLFile == crl)
411 m_Data.m_szCRLFile = crl;
416QString CParameterUser::ConvertTypeToName(TYPE t)
418 return m_Data.m_TypeName[t];
421int CParameterUser::SetTypeName(TYPE t,
const QString& szName)
423 m_Data.m_TypeName[t] = szName;
427void CParameterUser::slotLoadPassword()
430 qDebug(log) << Q_FUNC_INFO;
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();
439 qDebug(log) <<
"Read key" << key <<
"succeeded.";
440 SetPassword(pReadJob->textData());
444void CParameterUser::slotLoadPassPhrase()
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();
456 qDebug(log) <<
"Read pass phrase key" << key <<
"succeeded.";
457 SetPassphrase(pReadJob->textData());
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.