7#include "ParameterUser.h" 
    8#include "ParameterNet.h" 
    9#include "RabbitCommonTools.h" 
   10#include <QLoggingCategory> 
   12static Q_LOGGING_CATEGORY(log, 
"Client.Parameter.User")
 
   13static QString ServiceName()
 
   16    return "io.github.KangLin/RabbitRemoteControl";
 
   21    , m_Type(QList<TYPE>() << TYPE::UserPassword)
 
   22    , m_UsedType(TYPE::UserPassword)
 
   23    , m_bSavePassword(false)
 
   24    , m_bUseSystemFile(true)
 
   25    , m_bSavePassphrase(false)
 
   27    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")}
 
   38int CParameterUser::OnLoad(QSettings &set)
 
   40    set.beginGroup(
"User");
 
   41    SetUser(set.value(
"Name", GetUser()).toString());
 
   43    set.beginGroup(
"Authentication");
 
   45    foreach(
auto t, GetType()) {
 
   46        type.push_back(QString::number((
int)t));
 
   49    vType = set.value(
"Type", type).toStringList();
 
   51    foreach(
auto s, vType)
 
   53        lstType.push_back((
TYPE)s.toInt());
 
   56    SetUsedType((
TYPE)set.value(
"Type/Used", (
int)GetUsedType()).toInt());
 
   63        if(para && para->GetUseSystemCredential()) {
 
   64            QString key(
"Password");
 
   65            auto net = qobject_cast<CParameterNet*>(parent());
 
   67                key = ServiceName() + 
"/" + GetUser() + 
"@" + net->GetHost() + 
":" + QString::number(net->GetPort()) + 
"/" + key;
 
   69            auto pReadJob = 
new QKeychain::ReadPasswordJob(ServiceName());
 
   70            connect(pReadJob, &QKeychain::ReadPasswordJob::finished, 
this, &CParameterUser::slotLoadPassword);
 
   71            pReadJob->setKey(key);
 
   77            if(!LoadPassword(tr(
"Password"), 
"Password", szPassword, set))
 
   78                SetPassword(szPassword);
 
   82    set.beginGroup(
"PublicKey");
 
   83    set.beginGroup(
"File");
 
   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()) {
 
   93        if(para && para->GetUseSystemCredential()) {
 
   94            QString key(
"Passphrase");
 
   95            auto net = qobject_cast<CParameterNet*>(parent());
 
   97                key = ServiceName() + 
"/" + GetUser() + 
"@" + net->GetHost() + 
":" + QString::number(net->GetPort()) + 
"/" + key;
 
   99            auto pReadJob = 
new QKeychain::ReadPasswordJob(
"io.github.KangLin/RabbitRemoteControl");
 
  100            connect(pReadJob, &QKeychain::ReadPasswordJob::finished, 
this, &CParameterUser::slotLoadPassPhrase);
 
  101            pReadJob->setKey(key);
 
  107            if(!LoadPassword(tr(
"Passphrase"), 
"Passphrase", szPassword, set))
 
  108                SetPassphrase(szPassword);
 
  112    SetCAFile(set.value(
"CA", GetCAFile()).toString());
 
  113    SetCRLFile(set.value(
"CRL", GetCRLFile()).toString());
 
  123int CParameterUser::OnSave(QSettings &set)
 
  125    set.beginGroup(
"User");
 
  126    set.setValue(
"Name", GetUser());
 
  128    set.beginGroup(
"Authentication");
 
  130    foreach(
auto t, GetType()) {
 
  131        type.push_back(QString::number((
int)t));
 
  133    set.setValue(
"Type", type);
 
  134    set.setValue(
"Type/Used", (
int)GetUsedType());
 
  136    set.setValue(
"SavePassword", GetSavePassword());
 
  137    if(GetSavePassword() && !GetPassword().isEmpty()) {
 
  140        if(para && para->GetUseSystemCredential()) {
 
  141            QString key(
"Password");
 
  142            auto net = qobject_cast<CParameterNet*>(parent());
 
  144                key = ServiceName() + 
"/" + GetUser() + 
"@" + net->GetHost() + 
":" + QString::number(net->GetPort()) + 
"/" + key;
 
  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();
 
  152                qDebug(log) << 
"Write key" << key << 
"succeeded.";
 
  154            pWriteJob->setKey(key);
 
  155            pWriteJob->setTextData(GetPassword());
 
  160            SavePassword(
"Password", GetPassword(), set, GetSavePassword());
 
  164    set.beginGroup(
"PublicKey");
 
  165    set.beginGroup(
"File");
 
  167    set.setValue(
"PublicKey", GetPublicKeyFile());
 
  168    set.setValue(
"PrivateKey", GetPrivateKeyFile());
 
  169    set.setValue(
"SavePassphrase", GetSavePassphrase());
 
  170    if(GetSavePassphrase() && !GetPassphrase().isEmpty()) {
 
  173        if(para && para->GetUseSystemCredential()) {
 
  174            QString key(
"Passphrase");
 
  175            auto net = qobject_cast<CParameterNet*>(parent());
 
  177                key = ServiceName() + 
"/" + GetUser() + 
"@" + net->GetHost() + 
":" + QString::number(net->GetPort()) + 
"/" + key;
 
  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();
 
  185                qDebug(log) << 
"Writepass phrase  key" << key << 
"succeeded.";
 
  187            pWriteJob->setKey(key);
 
  188            pWriteJob->setTextData(GetPassphrase());
 
  193            SavePassword(
"Passphrase", GetPassphrase(), set, GetSavePassphrase());
 
  197    set.setValue(
"CA", GetCAFile());
 
  198    set.setValue(
"CRL", GetCRLFile());
 
  208QList<CParameterUser::TYPE> CParameterUser::GetType()
 const 
  213int CParameterUser::SetType(QList<TYPE> type)
 
  227int CParameterUser::SetUsedType(TYPE type)
 
  229    if(m_UsedType == type)
 
  236const QString CParameterUser::GetUser()
 const 
  241void CParameterUser::SetUser(
const QString &szUser)
 
  243    if (m_szUser == szUser)
 
  249const QString CParameterUser::GetPassword()
 const 
  254void CParameterUser::SetPassword(
const QString &szPassword)
 
  256    if(m_szPassword == szPassword)
 
  258    m_szPassword = szPassword;
 
  262const bool CParameterUser::GetSavePassword()
 const 
  264    return m_bSavePassword;
 
  269    if (m_bSavePassword == save)
 
  271    m_bSavePassword = save;
 
 
  279        QString szErr = 
"The CParameterClient is null";
 
  280        qCritical(log) << szErr;
 
  281        Q_ASSERT_X(
false, 
"CParameterUser", szErr.toStdString().c_str());
 
  288            SetUser(RabbitCommon::CTools::GetCurrentUser());
 
 
  300    return m_bUseSystemFile;
 
 
  303int CParameterUser::SetUseSystemFile(
bool use)
 
  305    if(m_bUseSystemFile == use)
 
  307    m_bUseSystemFile = use;
 
  312QString CParameterUser::GetPassphrase()
 const 
  314    return m_szPassphrase;
 
  317int CParameterUser::SetPassphrase(
const QString passphrase)
 
  319    if(m_szPassphrase == passphrase)
 
  321    m_szPassphrase = passphrase;
 
  326bool CParameterUser::GetSavePassphrase()
 const 
  328    return m_bSavePassphrase;
 
  331int CParameterUser::SetSavePassphrase(
bool bSave)
 
  333    if(m_bSavePassphrase == bSave)
 
  335    m_bSavePassphrase = bSave;
 
  340QString CParameterUser::GetPublicKeyFile()
 const 
  342    return m_szPublicKeyFile;
 
  345int CParameterUser::SetPublicKeyFile(
const QString szFile)
 
  347    if(m_szPublicKeyFile == szFile)
 
  349    m_szPublicKeyFile = szFile;
 
  354QString CParameterUser::GetPrivateKeyFile()
 const 
  356    return m_szPrivateKeyFile;
 
  359int CParameterUser::SetPrivateKeyFile(
const QString szFile)
 
  361    if(m_szPrivateKeyFile == szFile)
 
  363    m_szPrivateKeyFile = szFile;
 
  368QString CParameterUser::GetCAFile()
 const 
  373int CParameterUser::SetCAFile(
const QString &ca)
 
  382QString CParameterUser::GetCRLFile()
 const 
  387int CParameterUser::SetCRLFile(
const QString &crl)
 
  389    if(m_szCRLFile == crl)
 
  396QString CParameterUser::ConvertTypeToName(TYPE t)
 
  398    return m_TypeName[t];
 
  401int CParameterUser::SetTypeName(TYPE t, 
const QString& szName)
 
  403    m_TypeName[t] = szName;
 
  407void CParameterUser::slotLoadPassword()
 
  410    qDebug(log) << Q_FUNC_INFO;
 
  411    QKeychain::ReadPasswordJob* pReadJob = qobject_cast<QKeychain::ReadPasswordJob*>(sender());
 
  412    if(!pReadJob) 
return;
 
  413    QString key = pReadJob->key();
 
  414    if (pReadJob->error()) {
 
  415        qCritical(log) << 
"Fail: read key" << key << 
";" << pReadJob->errorString();
 
  418    qDebug(log) << 
"Read key" << key << 
"succeeded.";
 
  419    SetPassword(pReadJob->textData());
 
  423void CParameterUser::slotLoadPassPhrase()
 
  426    qDebug(log) << Q_FUNC_INFO;
 
  427    QKeychain::ReadPasswordJob* pReadJob = qobject_cast<QKeychain::ReadPasswordJob*>(sender());
 
  428    if(!pReadJob) 
return;
 
  429    QString key = pReadJob->key();   
 
  430    if (pReadJob->error()) {
 
  431        qCritical(log) << 
"Fail: read pass phrase key" << key << 
";" << pReadJob->errorString();
 
  434    qDebug(log) << 
"Read pass phrase key" << key << 
"succeeded.";
 
  435    SetPassphrase(pReadJob->textData());
 
Operational parameter interface.
 
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin.
 
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.