Issue 3015 - store timestamp when password is reset (#3863)
* Added few unsigned to ints in order to get rid of warnings. Added column to users table, for when password is changed(issue#3015). Moved password length check to separate method, to make it cleaner. * Added migration file and changed schema version to 27 due to servatrice.sql schema modification. * Make password length configurable.
This commit is contained in:
parent
e4c98e2ab8
commit
cd431594e2
10 changed files with 30 additions and 8 deletions
|
@ -62,7 +62,7 @@ double Expression::eval(const peg::Ast &ast)
|
||||||
return value;
|
return value;
|
||||||
} else if (ast.name[0] == 'P') {
|
} else if (ast.name[0] == 'P') {
|
||||||
double result = eval(*nodes[0]);
|
double result = eval(*nodes[0]);
|
||||||
for (int i = 1; i < nodes.size(); i += 2) {
|
for (unsigned int i = 1; i < nodes.size(); i += 2) {
|
||||||
double arg = eval(*nodes[i + 1]);
|
double arg = eval(*nodes[i + 1]);
|
||||||
char operation = nodes[i]->token[0];
|
char operation = nodes[i]->token[0];
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
|
|
5
servatrice/migrations/servatrice_0026_to_0027.sql
Normal file
5
servatrice/migrations/servatrice_0026_to_0027.sql
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
-- Servatrice db migration from version 26 to version 27
|
||||||
|
|
||||||
|
ALTER TABLE cockatrice_users ADD COLUMN passwordLastChangedDate datetime NOT NULL DEFAULT '0000-00-00 00:00:00';
|
||||||
|
|
||||||
|
UPDATE cockatrice_schema_version SET version=27 WHERE version=26;
|
|
@ -135,6 +135,10 @@ disallowedwords="admin"
|
||||||
; http://www.regular-expressions.info/catastrophic.html
|
; http://www.regular-expressions.info/catastrophic.html
|
||||||
disallowedregexp=""
|
disallowedregexp=""
|
||||||
|
|
||||||
|
; Define minimum password length
|
||||||
|
; Default 6.
|
||||||
|
minpasswordlength = 6
|
||||||
|
|
||||||
[registration]
|
[registration]
|
||||||
|
|
||||||
; Servatrice can process registration requests to add new users on the fly.
|
; Servatrice can process registration requests to add new users on the fly.
|
||||||
|
|
|
@ -20,7 +20,7 @@ CREATE TABLE IF NOT EXISTS `cockatrice_schema_version` (
|
||||||
PRIMARY KEY (`version`)
|
PRIMARY KEY (`version`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
INSERT INTO cockatrice_schema_version VALUES(26);
|
INSERT INTO cockatrice_schema_version VALUES(27);
|
||||||
|
|
||||||
-- users and user data tables
|
-- users and user data tables
|
||||||
CREATE TABLE IF NOT EXISTS `cockatrice_users` (
|
CREATE TABLE IF NOT EXISTS `cockatrice_users` (
|
||||||
|
@ -40,6 +40,7 @@ CREATE TABLE IF NOT EXISTS `cockatrice_users` (
|
||||||
`privlevel` enum("NONE","VIP","DONATOR") NOT NULL,
|
`privlevel` enum("NONE","VIP","DONATOR") NOT NULL,
|
||||||
`privlevelStartDate` datetime NOT NULL,
|
`privlevelStartDate` datetime NOT NULL,
|
||||||
`privlevelEndDate` datetime NOT NULL,
|
`privlevelEndDate` datetime NOT NULL,
|
||||||
|
`passwordLastChangedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `name` (`name`),
|
UNIQUE KEY `name` (`name`),
|
||||||
KEY `token` (`token`),
|
KEY `token` (`token`),
|
||||||
|
|
|
@ -1065,3 +1065,8 @@ bool Servatrice::getEnableForgotPasswordAudit() const
|
||||||
{
|
{
|
||||||
return settingsCache->value("audit/enable_forgotpassword_audit", true).toBool();
|
return settingsCache->value("audit/enable_forgotpassword_audit", true).toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Servatrice::getMinPasswordLength() const
|
||||||
|
{
|
||||||
|
return settingsCache->value("users/minpasswordlength", 6).toInt();
|
||||||
|
}
|
||||||
|
|
|
@ -255,6 +255,7 @@ public:
|
||||||
bool getEnableAudit() const;
|
bool getEnableAudit() const;
|
||||||
bool getEnableRegistrationAudit() const;
|
bool getEnableRegistrationAudit() const;
|
||||||
bool getEnableForgotPasswordAudit() const;
|
bool getEnableForgotPasswordAudit() const;
|
||||||
|
int getMinPasswordLength() const;
|
||||||
int getIdleClientTimeout() const override;
|
int getIdleClientTimeout() const override;
|
||||||
int getServerID() const override;
|
int getServerID() const override;
|
||||||
int getMaxGameInactivityTime() const override;
|
int getMaxGameInactivityTime() const override;
|
||||||
|
|
|
@ -953,7 +953,8 @@ bool Servatrice_DatabaseInterface::changeUserPassword(const QString &user,
|
||||||
|
|
||||||
QString passwordSha512 = PasswordHasher::computeHash(newPassword, PasswordHasher::generateRandomSalt());
|
QString passwordSha512 = PasswordHasher::computeHash(newPassword, PasswordHasher::generateRandomSalt());
|
||||||
|
|
||||||
passwordQuery = prepareQuery("update {prefix}_users set password_sha512=:password where name = :name");
|
passwordQuery = prepareQuery("update {prefix}_users set password_sha512=:password, "
|
||||||
|
"passwordLastChangedDate = NOW() where name = :name");
|
||||||
passwordQuery->bindValue(":password", passwordSha512);
|
passwordQuery->bindValue(":password", passwordSha512);
|
||||||
passwordQuery->bindValue(":name", user);
|
passwordQuery->bindValue(":name", user);
|
||||||
if (execSqlQuery(passwordQuery))
|
if (execSqlQuery(passwordQuery))
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "server_database_interface.h"
|
#include "server_database_interface.h"
|
||||||
|
|
||||||
#define DATABASE_SCHEMA_VERSION 26
|
#define DATABASE_SCHEMA_VERSION 27
|
||||||
|
|
||||||
class Servatrice;
|
class Servatrice;
|
||||||
|
|
||||||
|
|
|
@ -1077,8 +1077,7 @@ Response::ResponseCode AbstractServerSocketInterface::cmdRegisterAccount(const C
|
||||||
QString country = QString::fromStdString(cmd.country());
|
QString country = QString::fromStdString(cmd.country());
|
||||||
QString password = QString::fromStdString(cmd.password());
|
QString password = QString::fromStdString(cmd.password());
|
||||||
|
|
||||||
// TODO make this configurable?
|
if (!isPasswordLongEnough(password.length())) {
|
||||||
if (password.length() < 6) {
|
|
||||||
if (servatrice->getEnableRegistrationAudit())
|
if (servatrice->getEnableRegistrationAudit())
|
||||||
sqlInterface->addAuditRecord(QString::fromStdString(cmd.user_name()).simplified(), this->getAddress(),
|
sqlInterface->addAuditRecord(QString::fromStdString(cmd.user_name()).simplified(), this->getAddress(),
|
||||||
QString::fromStdString(cmd.clientid()).simplified(), "REGISTER_ACCOUNT",
|
QString::fromStdString(cmd.clientid()).simplified(), "REGISTER_ACCOUNT",
|
||||||
|
@ -1223,8 +1222,7 @@ Response::ResponseCode AbstractServerSocketInterface::cmdAccountPassword(const C
|
||||||
QString oldPassword = QString::fromStdString(cmd.old_password());
|
QString oldPassword = QString::fromStdString(cmd.old_password());
|
||||||
QString newPassword = QString::fromStdString(cmd.new_password());
|
QString newPassword = QString::fromStdString(cmd.new_password());
|
||||||
|
|
||||||
// TODO make this configurable?
|
if (!isPasswordLongEnough(newPassword.length()))
|
||||||
if (newPassword.length() < 6)
|
|
||||||
return Response::RespPasswordTooShort;
|
return Response::RespPasswordTooShort;
|
||||||
|
|
||||||
QString userName = QString::fromStdString(userInfo->name());
|
QString userName = QString::fromStdString(userInfo->name());
|
||||||
|
@ -1794,3 +1792,8 @@ void WebsocketServerSocketInterface::binaryMessageReceived(const QByteArray &mes
|
||||||
|
|
||||||
processCommandContainer(newCommandContainer);
|
processCommandContainer(newCommandContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AbstractServerSocketInterface::isPasswordLongEnough(const int passwordLength)
|
||||||
|
{
|
||||||
|
return passwordLength < servatrice->getMinPasswordLength();
|
||||||
|
}
|
||||||
|
|
|
@ -122,6 +122,8 @@ private:
|
||||||
bool addAdminFlagToUser(const QString &user, int flag);
|
bool addAdminFlagToUser(const QString &user, int flag);
|
||||||
bool removeAdminFlagFromUser(const QString &user, int flag);
|
bool removeAdminFlagFromUser(const QString &user, int flag);
|
||||||
|
|
||||||
|
bool isPasswordLongEnough(const int passwordLength);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AbstractServerSocketInterface(Servatrice *_server,
|
AbstractServerSocketInterface(Servatrice *_server,
|
||||||
Servatrice_DatabaseInterface *_databaseInterface,
|
Servatrice_DatabaseInterface *_databaseInterface,
|
||||||
|
|
Loading…
Reference in a new issue