Admin Pwd reset logic

This commit is contained in:
kradchen
2023-09-13 14:27:37 +08:00
parent 88e193ae84
commit 941b2824ea
5 changed files with 114 additions and 10 deletions

View File

@@ -2,11 +2,20 @@
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QLabel>
#include <QtCore/QCryptographicHash>
#include <qrandom.h>
#include <QDebug>
#include <QTime>
#include "models/User.h"
#include "db/SQLHelper.h"
AdminSPwdDialog::AdminSPwdDialog(QWidget *parent, Qt::WindowFlags f)
: GUIFormBaseDialog(parent, f)
, mLeSpCode(new ULineEdit(this))
{
this->setMinimumHeight(300);
this->setMinimumHeight(380);
this->setMinimumWidth(200);
mFormWidget->setObjectName("Adminform");
auto layout = new QVBoxLayout(mFormWidget);
@@ -15,12 +24,93 @@ AdminSPwdDialog::AdminSPwdDialog(QWidget *parent, Qt::WindowFlags f)
lblMsg->setObjectName("Notice");
lblMsg->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
lblMsg->setWordWrap(true);
lblMsg->setText(tr("Please give this code to producer for getting the SP Code to reset admininistrator's password to\"123456\"!"));
lblMsg->setText(tr("Please give this code to producer for getting the SP Code to reset admininistrator's password!"));
layout->addWidget(lblMsg, Qt::AlignHCenter);
QLabel* lblSCode = new QLabel(mFormWidget);
lblSCode->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
layout->addWidget(lblSCode, Qt::AlignHCenter);
lblSCode->setObjectName("resetCode");
lblSCode->setText("U S C T");
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
generateCode();
lblSCode->setText(mCode);
lblSCode->setAlignment(Qt::AlignCenter);
}
mLeSpCode->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
mLeSpCode->setPlaceholderText(tr("Input the SP Code here"));
layout->addWidget(mLeSpCode, Qt::AlignHCenter);
generateSPCode();
}
QString AdminSPwdDialog::getNewPwd()
{
return mNewPwd;
}
void AdminSPwdDialog::generateCode()
{
mCode.clear();
for (size_t i = 0; i < 4; i++)
{
int num = qrand()%3;
if(num == 0){
mCode+=QString::number(qrand()%10);
mCode+=" ";
}
if(num == 1){
int temp = 'A';
mCode +=static_cast<QChar>(temp+qrand()%26);
mCode +=" ";
}
if(num == 2){
int temp = 'a';
mCode +=static_cast<QChar>(temp+qrand()%26);
mCode +=" ";
}
}
}
void AdminSPwdDialog::generatePwd()
{
mNewPwd.clear();
for (size_t i = 0; i < 8; i++)
{
int num = qrand()%3;
if(num == 0){
mNewPwd+=QString::number(qrand()%10);
}
if(num == 1){
int temp = 'A';
mNewPwd +=static_cast<QChar>(temp+qrand()%26);
}
if(num == 2){
int temp = 'a';
mNewPwd +=static_cast<QChar>(temp+qrand()%26);
}
}
}
void AdminSPwdDialog::generateSPCode()
{
QByteArray byteWd = mCode.replace(" ","").append("USCT").toLatin1();
QByteArray bytePwdMd5 = QCryptographicHash::hash(byteWd, QCryptographicHash::Sha256);
mSpCode = bytePwdMd5.toHex();
qDebug()<<mSpCode;
mSpCode = QCryptographicHash::hash(mSpCode.left(8).toLatin1(), QCryptographicHash::Md5).toHex();
}
bool AdminSPwdDialog::updateReferenceData()
{
QByteArray byteSP = mLeSpCode->text().left(8).toLatin1();
QByteArray byteSPMd5 = QCryptographicHash::hash(byteSP, QCryptographicHash::Md5);
QString SPMD5 = byteSPMd5.toHex();
bool flag = SPMD5 == mSpCode;
if (!flag) return false;
generatePwd();
QString CryptPwd = User::getEncryptedPassword(mNewPwd);
bool execSqlFlag = SQLHelper::exec(QString("update Account set Password='%1' where UserCode='usct'").arg(CryptPwd));
return execSqlFlag;
}

View File

@@ -1,16 +1,27 @@
#ifndef CF2CD71D_5155_4FC5_B382_331CBD884F97
#define CF2CD71D_5155_4FC5_B382_331CBD884F97
#include "GUIFormBaseDialog.h"
#include "components/ULineEdit.h"
#include <QString>
class AdminSPwdDialog :public GUIFormBaseDialog{
Q_OBJECT
public:
explicit AdminSPwdDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~AdminSPwdDialog() override = default;
QString getNewPwd();
protected:
bool updateReferenceData() override{return true;}
void generateCode();
void generateSPCode();
void generatePwd();
bool updateReferenceData() override;
private:
QString Crypt();
QString mCode;
QString mSpCode;
QString mNewPwd;
ULineEdit* mLeSpCode;
};
#endif /* CF2CD71D_5155_4FC5_B382_331CBD884F97 */

View File

@@ -119,14 +119,14 @@ void DialogManager::requestScreenSaverStop(bool aIsStopLocker)
mScreenSaverWindow->stop(aIsStopLocker);
}
int DialogManager::requestResetAdminPwd()
DialogResult DialogManager::requestResetAdminPwd()
{
AdminSPwdDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return ret;
return DialogResult(ret, dialog.getNewPwd());
}
int DialogManager::requestAddAccount(QSqlTableModel* model) {

View File

@@ -48,7 +48,7 @@ public:
void requestLogin(QWidget* aParent);
void requestScreenSaverPlay();
void requestScreenSaverStop(bool aIsStopLocker = false);
int requestResetAdminPwd();
DialogResult requestResetAdminPwd();
int requestAddAccount(QSqlTableModel* model);
int requestEditSelfAccount();
int requestEditAdminAccount(const QMap<QString, QVariant>& values);

View File

@@ -66,7 +66,10 @@ void LoginDialog::initializeLayout()
mHideClickCount++;
if (mHideClickCount == 5){
mHideClickCount = 0;
DialogManager::Default()->requestResetAdminPwd();
DialogResult result = DialogManager::Default()->requestResetAdminPwd();
if (result.ResultCode != QDialog::Accepted) return;
DialogManager::Default()->requestAlertMessage(QString(tr("New password:%1")).arg(result.ResultData.toString()),
DialogButtonMode::OkOnly,tr("Reset success"));
}
});
mVMainLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding));