玉兔远程控制 0.1.0-bate8
载入中...
搜索中...
未找到
ParameterOperate.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QCryptographicHash>
5#include <QInputDialog>
6
7#include "RabbitCommonDir.h"
8#include "RabbitCommonEncrypt.h"
9#include "RabbitCommonTools.h"
10#include "DlgInputPassword.h"
11#include "ParameterOperate.h"
12
13static Q_LOGGING_CATEGORY(log, "Parameter.Operate")
14
15CParameterOperate::CParameterOperate(QObject *parent, const QString &szPrefix)
16 : CParameter(parent, szPrefix)
17 , m_Parent(nullptr)
18 , m_pParameterPlugin(nullptr)
19{
20 bool check = false;
21 check = connect(this, SIGNAL(sigSetGlobalParameters()),
22 this, SLOT(slotSetGlobalParameters()));
23 Q_ASSERT(check);
24 CParameterOperate* p = qobject_cast<CParameterOperate*>(parent);
25 if(p) {
26 m_Parent = p;
27 check = connect(m_Parent, SIGNAL(sigSetGlobalParameters()),
28 this, SIGNAL(sigSetGlobalParameters()));
29 Q_ASSERT(check);
30 }
31}
32
38
39int CParameterOperate::SetGlobalParameters(CParameterPlugin *p)
40{
41 if(m_pParameterPlugin == p) return 0;
44 return 0;
45}
46
51
52QByteArray CParameterOperate::PasswordSum(const std::string &password,
53 const std::string &key)
54{
55 std::string pw = "RabbitRemoteControl";
56 QCryptographicHash sum(QCryptographicHash::Md5);
57
58#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0)
59 if(!password.empty())
60 sum.addData(password.c_str(), password.length());
61 sum.addData(pw.c_str(), pw.length());
62 if(!key.empty())
63 sum.addData(key.c_str(), key.length());
64#else
65 if(!password.empty())
66 sum.addData(QByteArrayView(password.c_str(), password.length()));
67 sum.addData(QByteArrayView(pw.c_str(), pw.length()));
68 if(!key.empty())
69 sum.addData(QByteArrayView(key.c_str(), key.length()));
70#endif
71 return sum.result();
72}
73
82int CParameterOperate::LoadPassword(const QString &szTitle,
83 const QString &szKey,
84 QString &password,
85 QSettings &set)
86{
87 QByteArray sum = set.value(szKey + "_sum").toByteArray();
88 QByteArray pwByte = set.value(szKey).toByteArray();
89 if(pwByte.isEmpty())
90 return 0;
91 RabbitCommon::CEncrypt e;
92
93 std::string key;
95 key = GetGlobalParameters()->GetEncryptKey().toStdString();
96 if(key.empty()) {
97 // Load readom password from config file
98 QSettings s(RabbitCommon::CDir::Instance()->GetFileUserConfigure(), QSettings::IniFormat);
99 QByteArray baRandom = s.value("Plugin/Password/Random").toByteArray();
100 QString szRandom;
101 if(!baRandom.isEmpty()) {
102 RabbitCommon::CEncrypt eRandom;
103 eRandom.Dencode(baRandom, szRandom);
104 }
105 if(!szRandom.isEmpty())
106 e.SetPassword(szRandom.toStdString().c_str());
107 } else {
108 e.SetPassword(key.c_str());
109 }
110
111 if(!e.Dencode(pwByte, password)
112 && PasswordSum(password.toStdString(), key) == sum)
113 return 0;
114
115 qDebug(log) << "Password don't dencode or sum is error";
116 if(key.empty() && GetGlobalParameters()) {
117 switch (GetGlobalParameters()->GetPromptType()) {
118 case CParameterPlugin::PromptType::First:
119 {
120 int nCount = GetGlobalParameters()->GetPromptCount();
121 if(nCount >= 1)
122 return -1;
123 GetGlobalParameters()->SetPromptCount(nCount + 1);
124 break;
125 }
126 case CParameterPlugin::PromptType::No:
127 default:
128 return -1;
129 }
130
131 CDlgInputPassword d(GetGlobalParameters()->GetViewPassowrd(), false);
132 if(QDialog::Accepted != d.exec())
133 return -1;
134
135 key = d.GetPassword().toStdString();
136 if(key.empty()) return -1;
137
138 GetGlobalParameters()->SetEncryptKey(key.c_str());
139 return LoadPassword(szTitle, szKey, password, set);
140 }
141 return -1;
142}
143
144int CParameterOperate::SavePassword(const QString &szKey,
145 const QString &password,
146 QSettings &set, bool bSave)
147{
148 if(!bSave)
149 {
150 // Not save. then delete field from configure
151 set.remove(szKey);
152 set.remove(szKey + "_sum");
153 return 0;
154 }
155
156 QByteArray encryptPassword;
157 RabbitCommon::CEncrypt e;
158 std::string key;
159 if(GetGlobalParameters()) {
160 key = GetGlobalParameters()->GetEncryptKey().toStdString();
161 if(key.empty())
162 {
163 switch (GetGlobalParameters()->GetPromptType()) {
164 case CParameterPlugin::PromptType::First:
165 {
166 int nCount = GetGlobalParameters()->GetPromptCount();
167 if(nCount >= 1)
168 break;
169 GetGlobalParameters()->SetPromptCount(nCount + 1);
170 QString szKey;
171 CDlgInputPassword dlg(GetGlobalParameters()->GetViewPassowrd(), true);
172 if(QDialog::Accepted != dlg.exec())
173 break;
174 szKey = dlg.GetPassword();
175 GetGlobalParameters()->SetEncryptKey(szKey);
176 key = szKey.toStdString();
177 break;
178 }
179 case CParameterPlugin::PromptType::No:
180 break;
181 }
182 }
183 }
184 if(key.empty()) {
185 // Use random password
186 QSettings s(RabbitCommon::CDir::Instance()->GetFileUserConfigure(), QSettings::IniFormat);
187 QByteArray baRandom = s.value("Plugin/Password/Random").toByteArray();
188 QString szRandom;
189 if(baRandom.isEmpty()) {
190 // Generate a random password of a specified length
191 szRandom = RabbitCommon::CPasswordGenerator::GeneratePassword().c_str();
192 RabbitCommon::CEncrypt eRandom;
193 QByteArray baRandom;
194 eRandom.Encode(szRandom, baRandom);
195 s.setValue("Plugin/Password/Random", baRandom);
196 } else {
197 RabbitCommon::CEncrypt eRandom;
198 eRandom.Dencode(baRandom, szRandom);
199 }
200 e.SetPassword(szRandom.toStdString().c_str());
201 } else {
202 e.SetPassword(key.c_str());
203 }
204 if(password.isEmpty())
205 return 0;
206 e.Encode(password, encryptPassword);
207 set.setValue(szKey, encryptPassword);
208 set.setValue(szKey + "_sum", PasswordSum(password.toStdString(), key));
209 return 0;
210}
211
212const QString CParameterOperate::GetName() const
213{
214 return m_szName;
215}
216
217void CParameterOperate::SetName(const QString& szName)
218{
219 if(m_szName == szName)
220 return;
221 m_szName = szName;
222 SetModified(true);
223 emit sigNameChanged(m_szName);
224}
225
226int CParameterOperate::OnLoad(QSettings &set)
227{
228 SetName(set.value("Name", GetName()).toString());
229 return 0;
230}
231
232int CParameterOperate::OnSave(QSettings &set)
233{
234 set.setValue("Name", GetName());
235 return 0;
236}
操作参数接口。仅在插件内有效。
int LoadPassword(const QString &szTitle, const QString &szKey, QString &password, QSettings &set)
Restore password
void sigSetGlobalParameters()
仅由此类使用
virtual void slotSetGlobalParameters()
设置 CParameterPlugin 后调用,用于初始化与 CParameterPlugin 有关的操作。
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin
CParameterPlugin * m_pParameterPlugin
插件的全局参数。
参数接口
Definition Parameter.h:218
int SetModified(bool bModified=true)
在设置参数时,如果有修改,则调用。