From 941b2824ea92a953555669663f82d3bb26e6649e Mon Sep 17 00:00:00 2001 From: kradchen Date: Wed, 13 Sep 2023 14:27:37 +0800 Subject: [PATCH] Admin Pwd reset logic --- src/dialogs/AdminSPwdDialog.cpp | 98 +++++++++++++++++++++++++++++++-- src/dialogs/AdminSPwdDialog.h | 15 ++++- src/dialogs/DialogManager.cpp | 4 +- src/dialogs/DialogManager.h | 2 +- src/windows/LoginDialog.cpp | 5 +- 5 files changed, 114 insertions(+), 10 deletions(-) diff --git a/src/dialogs/AdminSPwdDialog.cpp b/src/dialogs/AdminSPwdDialog.cpp index 10eed3d..fb93aae 100644 --- a/src/dialogs/AdminSPwdDialog.cpp +++ b/src/dialogs/AdminSPwdDialog.cpp @@ -2,11 +2,20 @@ #include #include +#include +#include +#include +#include + + +#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); -} \ No newline at end of file + 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(temp+qrand()%26); + mCode +=" "; + } + if(num == 2){ + int temp = 'a'; + mCode +=static_cast(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(temp+qrand()%26); + } + if(num == 2){ + int temp = 'a'; + mNewPwd +=static_cast(temp+qrand()%26); + } + } + +} + + +void AdminSPwdDialog::generateSPCode() +{ + QByteArray byteWd = mCode.replace(" ","").append("USCT").toLatin1(); + QByteArray bytePwdMd5 = QCryptographicHash::hash(byteWd, QCryptographicHash::Sha256); + mSpCode = bytePwdMd5.toHex(); + qDebug()<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; +} diff --git a/src/dialogs/AdminSPwdDialog.h b/src/dialogs/AdminSPwdDialog.h index cef9da3..db768ae 100644 --- a/src/dialogs/AdminSPwdDialog.h +++ b/src/dialogs/AdminSPwdDialog.h @@ -1,16 +1,27 @@ #ifndef CF2CD71D_5155_4FC5_B382_331CBD884F97 #define CF2CD71D_5155_4FC5_B382_331CBD884F97 #include "GUIFormBaseDialog.h" + +#include "components/ULineEdit.h" +#include 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 */ diff --git a/src/dialogs/DialogManager.cpp b/src/dialogs/DialogManager.cpp index 94a6a65..7d8c6a5 100644 --- a/src/dialogs/DialogManager.cpp +++ b/src/dialogs/DialogManager.cpp @@ -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) { diff --git a/src/dialogs/DialogManager.h b/src/dialogs/DialogManager.h index fc2a1df..7a2da63 100644 --- a/src/dialogs/DialogManager.h +++ b/src/dialogs/DialogManager.h @@ -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& values); diff --git a/src/windows/LoginDialog.cpp b/src/windows/LoginDialog.cpp index cda3a34..8cd24f1 100644 --- a/src/windows/LoginDialog.cpp +++ b/src/windows/LoginDialog.cpp @@ -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));