玉兔远程控制 0.1.0-bate4
载入中...
搜索中...
未找到
ParameterOperate.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QCryptographicHash>
5#include <QInputDialog>
6
7#include "RabbitCommonEncrypt.h"
8#include "RabbitCommonTools.h"
9#include "DlgInputPassword.h"
10#include "ParameterOperate.h"
11
12static Q_LOGGING_CATEGORY(log, "Parameter.Operate")
13
14CParameterOperate::CParameterOperate(QObject *parent, const QString &szPrefix)
15 : CParameter(parent, szPrefix)
16 , m_Parent(nullptr)
17 , m_pParameterPlugin(nullptr)
18{
19 bool check = false;
20 check = connect(this, SIGNAL(sigSetGlobalParameters()),
21 this, SLOT(slotSetGlobalParameters()));
22 Q_ASSERT(check);
23 CParameterOperate* p = qobject_cast<CParameterOperate*>(parent);
24 if(p) {
25 m_Parent = p;
26 check = connect(m_Parent, SIGNAL(sigSetGlobalParameters()),
27 this, SIGNAL(sigSetGlobalParameters()));
28 Q_ASSERT(check);
29 }
30}
31
37
38int CParameterOperate::SetGlobalParameters(CParameterPlugin *p)
39{
40 if(m_pParameterPlugin == p) return 0;
43 return 0;
44}
45
50
51QByteArray CParameterOperate::PasswordSum(const std::string &password,
52 const std::string &key)
53{
54 std::string pw = "RabbitRemoteControl";
55 QCryptographicHash sum(QCryptographicHash::Md5);
56
57#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0)
58 if(!password.empty())
59 sum.addData(password.c_str(), password.length());
60 sum.addData(pw.c_str(), pw.length());
61 if(!key.empty())
62 sum.addData(key.c_str(), key.length());
63#else
64 if(!password.empty())
65 sum.addData(QByteArrayView(password.c_str(), password.length()));
66 sum.addData(QByteArrayView(pw.c_str(), pw.length()));
67 if(!key.empty())
68 sum.addData(QByteArrayView(key.c_str(), key.length()));
69#endif
70 return sum.result();
71}
72
73/*
74 * \brief Restore password
75 * \details
76 * if the encryption key is incorrect, Password is set to empty.
77 * it proceeds to the normal password entry.
78 * flow chart: \image html docs/Image/RestorePassword.svg
79 * \see https://github.com/KangLin/RabbitRemoteControl/issues/79
80 */
81int CParameterOperate::LoadPassword(const QString &szTitle,
82 const QString &szKey,
83 QString &password,
84 QSettings &set)
85{
86 QByteArray sum = set.value(szKey + "_sum").toByteArray();
87 QByteArray pwByte = set.value(szKey).toByteArray();
88 if(pwByte.isEmpty())
89 return 0;
90 RabbitCommon::CEncrypt e;
91
92 std::string key;
94 key = GetGlobalParameters()->GetEncryptKey().toStdString();
95 if(!key.empty())
96 e.SetPassword(key.c_str());
97
98 if(!e.Dencode(pwByte, password)
99 && PasswordSum(password.toStdString(), key) == sum)
100 return 0;
101
102 qDebug(log) << "Password don't dencode or sum is error";
103 if(key.empty()) {
104 switch (GetGlobalParameters()->GetPromptType()) {
105 case CParameterPlugin::PromptType::First:
106 {
107 int nCount = GetGlobalParameters()->GetPromptCount();
108 if(nCount >= 1)
109 return -1;
110 GetGlobalParameters()->SetPromptCount(nCount + 1);
111 break;
112 }
113 case CParameterPlugin::PromptType::No:
114 default:
115 return -1;
116 }
117
118 CDlgInputPassword d(GetGlobalParameters()->GetViewPassowrd(), false);
119 if(QDialog::Accepted != d.exec())
120 return -1;
121
122 key = d.GetPassword().toStdString();
123 if(key.empty()) return -1;
124
125 GetGlobalParameters()->SetEncryptKey(key.c_str());
126 return LoadPassword(szTitle, szKey, password, set);
127 }
128 return -1;
129}
130
131int CParameterOperate::SavePassword(const QString &szKey,
132 const QString &password,
133 QSettings &set, bool bSave)
134{
135 if(!bSave)
136 {
137 set.remove(szKey);
138 set.remove(szKey + "_sum");
139 return 0;
140 }
141
142 QByteArray encryptPassword;
143 RabbitCommon::CEncrypt e;
144 std::string key = GetGlobalParameters()->GetEncryptKey().toStdString();
145 if(key.empty())
146 {
147 switch (GetGlobalParameters()->GetPromptType()) {
148 case CParameterPlugin::PromptType::First:
149 {
150 int nCount = GetGlobalParameters()->GetPromptCount();
151 if(nCount >= 1)
152 break;
153 GetGlobalParameters()->SetPromptCount(nCount + 1);
154 QString szKey;
155 CDlgInputPassword dlg(GetGlobalParameters()->GetViewPassowrd(), true);
156 if(QDialog::Accepted != dlg.exec())
157 break;
158 szKey = dlg.GetPassword();
159 GetGlobalParameters()->SetEncryptKey(szKey);
160 key = szKey.toStdString();
161 break;
162 }
163 case CParameterPlugin::PromptType::No:
164 break;
165 }
166 }
167 if(!key.empty())
168 e.SetPassword(key.c_str());
169 if(password.isEmpty())
170 return 0;
171 e.Encode(password, encryptPassword);
172 set.setValue(szKey, encryptPassword);
173 set.setValue(szKey + "_sum", PasswordSum(password.toStdString(), key));
174 return 0;
175}
176
177const QString CParameterOperate::GetName() const
178{
179 return m_szName;
180}
181
182void CParameterOperate::SetName(const QString& szName)
183{
184 if(m_szName == szName)
185 return;
186 m_szName = szName;
187 SetModified(true);
188 emit sigNameChanged(m_szName);
189}
190
191int CParameterOperate::OnLoad(QSettings &set)
192{
193 SetName(set.value("Name", GetName()).toString());
194 return 0;
195}
196
197int CParameterOperate::OnSave(QSettings &set)
198{
199 set.setValue("Name", GetName());
200 return 0;
201}
操作参数接口。仅在插件内有效。
void sigSetGlobalParameters()
仅由此类使用
virtual void slotSetGlobalParameters()
设置 CParameterPlugin 后调用,用于初始化与 CParameterPlugin 有关的操作。
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin
CParameterPlugin * m_pParameterPlugin
插件的全局参数。
参数接口
Definition Parameter.h:209
int SetModified(bool bModified=true)
在设置参数时,如果有修改,则调用。