mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-04-27 07:48:01 -07:00
Simpler forgot password functionality (#2393)
* Simpler forgot password functionality (Server/Client)
This commit is contained in:
parent
b64eab204c
commit
0cfa6863d5
36 changed files with 1190 additions and 173 deletions
|
|
@ -176,9 +176,9 @@ bool Servatrice_DatabaseInterface::registerUser(const QString &userName, const Q
|
|||
token = active ? QString() : PasswordHasher::generateActivationToken();
|
||||
|
||||
QSqlQuery *query = prepareQuery("insert into {prefix}_users "
|
||||
"(name, realname, gender, password_sha512, email, country, registrationDate, active, token) "
|
||||
"values "
|
||||
"(:userName, :realName, :gender, :password_sha512, :email, :country, UTC_TIMESTAMP(), :active, :token)");
|
||||
"(name, realname, gender, password_sha512, email, country, registrationDate, active, token, admin, avatar_bmp, clientid, privlevel, privlevelStartDate, privlevelEndDate) "
|
||||
"values "
|
||||
"(:userName, :realName, :gender, :password_sha512, :email, :country, UTC_TIMESTAMP(), :active, :token, 0, '', '', 'NONE', UTC_TIMESTAMP(), UTC_TIMESTAMP())");
|
||||
query->bindValue(":userName", userName);
|
||||
query->bindValue(":realName", realName);
|
||||
query->bindValue(":gender", getGenderChar(gender));
|
||||
|
|
@ -831,41 +831,43 @@ void Servatrice_DatabaseInterface::logMessage(const int senderId, const QString
|
|||
execSqlQuery(query);
|
||||
}
|
||||
|
||||
bool Servatrice_DatabaseInterface::changeUserPassword(const QString &user, const QString &oldPassword, const QString &newPassword)
|
||||
bool Servatrice_DatabaseInterface::changeUserPassword(const QString &user, const QString &oldPassword, const QString &newPassword, const bool &force = false)
|
||||
{
|
||||
if(server->getAuthenticationMethod() != Servatrice::AuthenticationSql)
|
||||
return true;
|
||||
return false;
|
||||
|
||||
if (!checkSql())
|
||||
return true;
|
||||
return false;
|
||||
|
||||
QString error;
|
||||
if (!usernameIsValid(user, error))
|
||||
return true;
|
||||
return false;
|
||||
|
||||
QSqlQuery *passwordQuery = prepareQuery("select password_sha512 from {prefix}_users where name = :name");
|
||||
passwordQuery->bindValue(":name", user);
|
||||
if (!execSqlQuery(passwordQuery)) {
|
||||
qDebug("Change password denied: SQL error");
|
||||
return true;
|
||||
|
||||
if (!force) {
|
||||
if (!execSqlQuery(passwordQuery)) {
|
||||
qDebug("Change password denied: SQL error");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!passwordQuery->next())
|
||||
return false;
|
||||
|
||||
const QString correctPassword = passwordQuery->value(0).toString();
|
||||
if (correctPassword != PasswordHasher::computeHash(oldPassword, correctPassword.left(16)))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!passwordQuery->next())
|
||||
return true;
|
||||
|
||||
const QString correctPassword = passwordQuery->value(0).toString();
|
||||
if (correctPassword != PasswordHasher::computeHash(oldPassword, correctPassword.left(16)))
|
||||
return true;
|
||||
|
||||
QString passwordSha512 = PasswordHasher::computeHash(newPassword, PasswordHasher::generateRandomSalt());
|
||||
|
||||
passwordQuery = prepareQuery("update {prefix}_users set password_sha512=:password where name = :name");
|
||||
passwordQuery->bindValue(":password", passwordSha512);
|
||||
passwordQuery->bindValue(":name", user);
|
||||
if (!execSqlQuery(passwordQuery)) {
|
||||
qDebug("Change password denied: SQL error");
|
||||
if (execSqlQuery(passwordQuery))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1128,3 +1130,91 @@ int Servatrice_DatabaseInterface::checkNumberOfUserAccounts(const QString &email
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool Servatrice_DatabaseInterface::addForgotPassword(const QString &user)
|
||||
{
|
||||
if (!checkSql())
|
||||
return false;
|
||||
|
||||
if (!updateUserToken(PasswordHasher::generateActivationToken(), user))
|
||||
return false;
|
||||
|
||||
QSqlQuery *query = prepareQuery("insert into {prefix}_forgot_password (name,requestDate) values (:username,NOW())");
|
||||
query->bindValue(":username", user);
|
||||
if (execSqlQuery(query))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Servatrice_DatabaseInterface::removeForgotPassword(const QString &user)
|
||||
{
|
||||
if (!checkSql())
|
||||
return false;
|
||||
|
||||
QSqlQuery *query = prepareQuery("delete from {prefix}_forgot_password where name = :username");
|
||||
query->bindValue(":username", user);
|
||||
if (execSqlQuery(query))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Servatrice_DatabaseInterface::doesForgotPasswordExist(const QString &user)
|
||||
{
|
||||
if (!checkSql())
|
||||
return false;
|
||||
|
||||
QSqlQuery *query = prepareQuery("select count(name) from {prefix}_forgot_password where name = :user_name AND requestDate > (now() - interval :minutes minute)");
|
||||
query->bindValue(":user_name", user);
|
||||
query->bindValue(":minutes", QString::number(server->getForgotPasswordTokenLife()));
|
||||
|
||||
if (!execSqlQuery(query))
|
||||
return false;
|
||||
|
||||
if (query->next())
|
||||
if (query->value("count(name)").toInt() > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Servatrice_DatabaseInterface::updateUserToken(const QString & token, const QString &user)
|
||||
{
|
||||
if (!checkSql())
|
||||
return false;
|
||||
|
||||
if (token.isEmpty() || user.isEmpty())
|
||||
return false;
|
||||
|
||||
QSqlQuery *query = prepareQuery("update {prefix}_users set token = :token where name = :user_name");
|
||||
query->bindValue(":user_name", user);
|
||||
query->bindValue(":token", token);
|
||||
|
||||
if (execSqlQuery(query))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Servatrice_DatabaseInterface::validateTableColumnStringData(const QString &table, const QString &column, const QString &_user, const QString &_datatocheck)
|
||||
{
|
||||
if (!checkSql())
|
||||
return false;
|
||||
|
||||
if (table.isEmpty() || column.isEmpty() ||_user.isEmpty() || _datatocheck.isEmpty())
|
||||
return false;
|
||||
|
||||
QString formatedQuery = QString("select %1 from %2 where name = :user_name").arg(column).arg(table);
|
||||
QSqlQuery *query = prepareQuery(formatedQuery);
|
||||
query->bindValue(":user_name", _user);
|
||||
|
||||
if (!execSqlQuery(query))
|
||||
return false;
|
||||
|
||||
if (query->next())
|
||||
if (query->value(column).toString() == _datatocheck)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue