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());
int LoadPassword(const QString &szTitle, const QString &szKey, QString &password, QSettings &set)
Restore password
CParameterPlugin * GetPluginParameters()
Get CParameterPlugin
用户名与验证方式。此类仅在插件内有效。它的界面是 CParameterUserUI
virtual void slotSetPluginParameters() 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)
在设置参数时,如果有修改,则调用。