diff --git a/modules/users/managers/user_manager_db.cpp b/modules/users/managers/user_manager_db.cpp index 15fc946cf..b1da56caf 100644 --- a/modules/users/managers/user_manager_db.cpp +++ b/modules/users/managers/user_manager_db.cpp @@ -104,6 +104,7 @@ Ref UserManagerDB::_get_user(const int id) { Ref b = get_query_builder(); + // username_internal, email_internal doesn't need to be queried b->select("username, email, rank, pre_salt, post_salt, password_hash, banned, password_reset_token, locked"); b->from(_database_table_name); @@ -133,50 +134,18 @@ Ref UserManagerDB::_get_user(const int id) { return user; } -Ref UserManagerDB::_get_user_name(const String &user_name) { - if (user_name.empty()) { +Ref UserManagerDB::_get_user_name(const String &p_user_name) { + if (p_user_name.empty()) { return Ref(); } + String user_name = User::string_to_internal_format(p_user_name); + Ref b = get_query_builder(); - b->select("id, email, rank, pre_salt, post_salt, password_hash, banned, password_reset_token, locked"); + b->select("id, username, email, rank, pre_salt, post_salt, password_hash, banned, password_reset_token, locked"); b->from(_database_table_name); - b->where()->wps("username", user_name); - b->end_command(); - - Ref r = b->run(); - - if (!r->next_row()) { - return Ref(); - } - - Ref user; - user = create_user(); - - user->set_user_id(r->get_cell_int(0)); - user->set_user_name(user_name); - user->set_email(r->get_cell(1)); - user->set_rank(r->get_cell_int(2)); - user->set_pre_salt(r->get_cell(3)); - user->set_post_salt(r->get_cell(4)); - user->set_password_hash(r->get_cell(5)); - user->set_banned(r->get_cell_bool(6)); - user->set_password_reset_token(r->get_cell(7)); - user->set_locked(r->get_cell_bool(8)); - - return user; -} -Ref UserManagerDB::_get_user_email(const String &user_email) { - if (user_email.empty()) { - return Ref(); - } - - Ref b = get_query_builder(); - - b->select("id, username, rank, pre_salt, post_salt, password_hash, banned, password_reset_token, locked"); - b->from(_database_table_name); - b->where()->wps("email", user_email); + b->where()->wps("username_internal", user_name); b->end_command(); Ref r = b->run(); @@ -190,14 +159,50 @@ Ref UserManagerDB::_get_user_email(const String &user_email) { user->set_user_id(r->get_cell_int(0)); user->set_user_name(r->get_cell(1)); - user->set_email(user_email); - user->set_rank(r->get_cell_int(2)); - user->set_pre_salt(r->get_cell(3)); - user->set_post_salt(r->get_cell(4)); - user->set_password_hash(r->get_cell(5)); - user->set_banned(r->get_cell_bool(6)); - user->set_password_reset_token(r->get_cell(7)); - user->set_locked(r->get_cell_bool(8)); + user->set_email(r->get_cell(2)); + user->set_rank(r->get_cell_int(3)); + user->set_pre_salt(r->get_cell(4)); + user->set_post_salt(r->get_cell(5)); + user->set_password_hash(r->get_cell(6)); + user->set_banned(r->get_cell_bool(7)); + user->set_password_reset_token(r->get_cell(8)); + user->set_locked(r->get_cell_bool(9)); + + return user; +} +Ref UserManagerDB::_get_user_email(const String &p_user_email) { + if (p_user_email.empty()) { + return Ref(); + } + + String user_email = User::string_to_internal_format(p_user_email); + + Ref b = get_query_builder(); + + b->select("id, username, email, rank, pre_salt, post_salt, password_hash, banned, password_reset_token, locked"); + b->from(_database_table_name); + b->where()->wps("email_internal", user_email); + b->end_command(); + + Ref r = b->run(); + + if (!r->next_row()) { + return Ref(); + } + + Ref user; + user = create_user(); + + user->set_user_id(r->get_cell_int(0)); + user->set_user_name(r->get_cell(1)); + user->set_email(r->get_cell(2)); + user->set_rank(r->get_cell_int(3)); + user->set_pre_salt(r->get_cell(4)); + user->set_post_salt(r->get_cell(5)); + user->set_password_hash(r->get_cell(6)); + user->set_banned(r->get_cell_bool(7)); + user->set_password_reset_token(r->get_cell(8)); + user->set_locked(r->get_cell_bool(9)); return user; } @@ -206,11 +211,13 @@ void UserManagerDB::_save_user(Ref user) { Ref b = get_query_builder(); if (user->get_user_id() == -1) { - b->insert(_database_table_name, "username, email, rank, pre_salt, post_salt, password_hash, banned, password_reset_token, locked"); + b->insert(_database_table_name, "username, username_internal, email, email_internal, rank, pre_salt, post_salt, password_hash, banned, password_reset_token, locked"); b->values(); b->vals(user->get_user_name()); + b->vals(user->get_user_name_internal()); b->vals(user->get_email()); + b->vals(user->get_email_internal()); b->vali(user->get_rank()); b->vals(user->get_pre_salt()); b->vals(user->get_post_salt()); @@ -230,7 +237,9 @@ void UserManagerDB::_save_user(Ref user) { b->update(_database_table_name); b->sets(); b->setps("username", user->get_user_name()); + b->setps("username_internal", user->get_user_name_internal()); b->setps("email", user->get_email()); + b->setps("email_internal", user->get_email_internal()); b->setpi("rank", user->get_rank()); b->setps("pre_salt", user->get_pre_salt()); b->setps("post_salt", user->get_post_salt()); @@ -251,21 +260,25 @@ Ref UserManagerDB::_create_user(Ref p_user) { p_user.instance(); } - return p_user; + return UserManager::_create_user(p_user); } -bool UserManagerDB::_is_username_taken(const String &user_name) { +bool UserManagerDB::_is_username_taken(const String &p_user_name) { Ref b = get_query_builder(); - b->select("id")->from(_database_table_name)->where("username")->like(user_name)->end_command(); + String user_name = User::string_to_internal_format(p_user_name); + + b->select("id")->from(_database_table_name)->where("username_internal")->like(user_name)->end_command(); Ref r = b->run(); return r->next_row(); } -bool UserManagerDB::_is_email_taken(const String &email) { +bool UserManagerDB::_is_email_taken(const String &p_email) { Ref b = get_query_builder(); - b->select("id")->from(_database_table_name)->where("username")->like(email)->end_command(); + String email = User::string_to_internal_format(p_email); + + b->select("id")->from(_database_table_name)->where("email_internal")->like(email)->end_command(); Ref r = b->run(); @@ -323,7 +336,9 @@ void UserManagerDB::_create_table() { tb->create_table(_database_table_name); tb->integer("id")->auto_increment()->next_row(); tb->varchar("username", 60)->not_null()->next_row(); + tb->varchar("username_internal", 60)->not_null()->next_row(); tb->varchar("email", 100)->not_null()->next_row(); + tb->varchar("email_internal", 100)->not_null()->next_row(); tb->integer("rank")->not_null()->next_row(); tb->varchar("pre_salt", 100)->next_row(); tb->varchar("post_salt", 100)->next_row(); diff --git a/modules/users/managers/user_manager_db.h b/modules/users/managers/user_manager_db.h index 36e8afbfb..8d15dde1b 100644 --- a/modules/users/managers/user_manager_db.h +++ b/modules/users/managers/user_manager_db.h @@ -60,15 +60,15 @@ public: Ref get_query_builder(); Ref _get_user(const int id); - Ref _get_user_name(const String &user); - Ref _get_user_email(const String &user_email); + Ref _get_user_name(const String &p_user_name); + Ref _get_user_email(const String &p_user_email); void _save_user(Ref user); Ref _create_user(Ref p_user); - bool _is_username_taken(const String &user_name); - bool _is_email_taken(const String &email); + bool _is_username_taken(const String &p_user_name); + bool _is_email_taken(const String &p_email); Array _get_all_users(); diff --git a/modules/users/managers/user_manager_file.cpp b/modules/users/managers/user_manager_file.cpp index 6590857b4..960e60748 100644 --- a/modules/users/managers/user_manager_file.cpp +++ b/modules/users/managers/user_manager_file.cpp @@ -72,10 +72,10 @@ Ref UserManagerFile::_get_user(const int id) { return Ref(); } -Ref UserManagerFile::_get_user_name(const String &user_name) { - // TODO check only the lowercase version, also strip it, so User and UsEr counts as the same - // This should also be done with all backends - // Also a hashmap could be used +Ref UserManagerFile::_get_user_name(const String &p_user_name) { + // A hashmap could be used + + String user_name = User::string_to_internal_format(p_user_name); _rw_lock.read_lock(); @@ -83,7 +83,7 @@ Ref UserManagerFile::_get_user_name(const String &user_name) { Ref u = _users[i]; if (u.is_valid()) { - if (u->get_user_name() == user_name) { + if (u->get_user_name_internal() == user_name) { _rw_lock.read_unlock(); return u; @@ -95,10 +95,10 @@ Ref UserManagerFile::_get_user_name(const String &user_name) { return Ref(); } -Ref UserManagerFile::_get_user_email(const String &user_email) { - // TODO check only the lowercase version, also strip it, so User and UsEr counts as the same - // This should also be done with all backends - // Also a hashmap could be used +Ref UserManagerFile::_get_user_email(const String &p_user_email) { + // A hashmap could be used + + String user_email = User::string_to_internal_format(p_user_email); _rw_lock.read_lock(); @@ -106,7 +106,7 @@ Ref UserManagerFile::_get_user_email(const String &user_email) { Ref u = _users[i]; if (u.is_valid()) { - if (u->get_email() == user_email) { + if (u->get_email_internal() == user_email) { _rw_lock.read_unlock(); return u; @@ -119,8 +119,8 @@ Ref UserManagerFile::_get_user_email(const String &user_email) { return Ref(); } -void UserManagerFile::_save_user(Ref user) { - ERR_FAIL_COND(!user.is_valid()); +void UserManagerFile::_save_user(Ref p_user) { + ERR_FAIL_COND(!p_user.is_valid()); if (!DirAccess::exists(_save_folder_path)) { DirAccess *diru = DirAccess::create_for_path(_save_folder_path); @@ -131,24 +131,24 @@ void UserManagerFile::_save_user(Ref user) { memdelete(diru); } - if (user->get_user_id() == -1) { + if (p_user->get_user_id() == -1) { _rw_lock.write_lock(); - user->write_lock(); + p_user->write_lock(); // check again, because threading - if (user->get_user_id() == -1) { - user->set_user_id(_next_id++); - _users.push_back(user); + if (p_user->get_user_id() == -1) { + p_user->set_user_id(_next_id++); + _users.push_back(p_user); } - user->write_unlock(); + p_user->write_unlock(); _rw_lock.write_unlock(); } - user->read_lock(); - int id = user->get_user_id(); - String data = user->to_json(); - user->read_unlock(); + p_user->read_lock(); + int id = p_user->get_user_id(); + String data = p_user->to_json(); + p_user->read_unlock(); FileAccess *f = FileAccess::open(_save_folder_path.plus_file(itos(id) + ".json"), FileAccess::WRITE); @@ -165,12 +165,12 @@ Ref UserManagerFile::_create_user(Ref p_user) { p_user->set_user_id(-1); } - return p_user; + return UserManager::_create_user(p_user); } -bool UserManagerFile::_is_username_taken(const String &user_name) { - // TODO check only the lowercase version, also strip it, so User and UsEr counts as the same - // This should also be done with all backends - // Also a hashmap could be used +bool UserManagerFile::_is_username_taken(const String &p_user_name) { + // A hashmap could be used + + String user_name = User::string_to_internal_format(p_user_name); _rw_lock.read_lock(); @@ -178,7 +178,7 @@ bool UserManagerFile::_is_username_taken(const String &user_name) { Ref u = _users[i]; if (u.is_valid()) { - if (u->get_user_name() == user_name) { + if (u->get_user_name_internal() == user_name) { _rw_lock.read_unlock(); return true; } @@ -189,10 +189,10 @@ bool UserManagerFile::_is_username_taken(const String &user_name) { return false; } -bool UserManagerFile::_is_email_taken(const String &email) { - // TODO check only the lowercase version, also strip it, so User@a.com and UsEr@A.com counts as the same - // This should also be done with all backends - // Also a hashmap could be used +bool UserManagerFile::_is_email_taken(const String &p_email) { + // A hashmap could be used + + String email = User::string_to_internal_format(p_email); _rw_lock.read_lock(); @@ -200,7 +200,7 @@ bool UserManagerFile::_is_email_taken(const String &email) { Ref u = _users[i]; if (u.is_valid()) { - if (u->get_email() == email) { + if (u->get_email_internal() == email) { _rw_lock.read_unlock(); return true; } diff --git a/modules/users/managers/user_manager_file.h b/modules/users/managers/user_manager_file.h index 621939bda..4737a41c0 100644 --- a/modules/users/managers/user_manager_file.h +++ b/modules/users/managers/user_manager_file.h @@ -49,15 +49,15 @@ public: void set_save_folder_path(const String &val); virtual Ref _get_user(const int id); - virtual Ref _get_user_name(const String &user); - virtual Ref _get_user_email(const String &user_email); + virtual Ref _get_user_name(const String &p_user_name); + virtual Ref _get_user_email(const String &p_user_email); - virtual void _save_user(Ref user); + virtual void _save_user(Ref p_user); virtual Ref _create_user(Ref p_user); - virtual bool _is_username_taken(const String &user_name); - virtual bool _is_email_taken(const String &email); + virtual bool _is_username_taken(const String &p_user_name); + virtual bool _is_email_taken(const String &p_email); virtual Array _get_all_users(); diff --git a/modules/users/managers/user_manager_static.cpp b/modules/users/managers/user_manager_static.cpp index 8b3632ac5..751235f8a 100644 --- a/modules/users/managers/user_manager_static.cpp +++ b/modules/users/managers/user_manager_static.cpp @@ -38,12 +38,14 @@ Ref UserManagerStatic::_get_user(const int id) { return _users[id]; } -Ref UserManagerStatic::_get_user_name(const String &user_name) { +Ref UserManagerStatic::_get_user_name(const String &p_user_name) { + String user_name = User::string_to_internal_format(p_user_name); + for (int i = 0; i < _users.size(); ++i) { Ref u = _users[i]; if (u.is_valid()) { - if (u->get_user_name() == user_name) { + if (u->get_user_name_internal() == user_name) { return u; } } @@ -51,12 +53,14 @@ Ref UserManagerStatic::_get_user_name(const String &user_name) { return Ref(); } -Ref UserManagerStatic::_get_user_email(const String &user_email) { +Ref UserManagerStatic::_get_user_email(const String &p_user_email) { + String user_email = User::string_to_internal_format(p_user_email); + for (int i = 0; i < _users.size(); ++i) { Ref u = _users[i]; if (u.is_valid()) { - if (u->get_email() == user_email) { + if (u->get_email_internal() == user_email) { return u; } } @@ -76,14 +80,16 @@ Ref UserManagerStatic::_create_user(Ref p_user) { p_user->set_user_id(_users.size()); _users.push_back(p_user); - return p_user; + return UserManager::_create_user(p_user); } -bool UserManagerStatic::_is_username_taken(const String &user_name) { +bool UserManagerStatic::_is_username_taken(const String &p_user_name) { + String user_name = User::string_to_internal_format(p_user_name); + for (int i = 0; i < _users.size(); ++i) { Ref u = _users[i]; if (u.is_valid()) { - if (u->get_user_name() == user_name) { + if (u->get_user_name_internal() == user_name) { return true; } } @@ -91,12 +97,14 @@ bool UserManagerStatic::_is_username_taken(const String &user_name) { return false; } -bool UserManagerStatic::_is_email_taken(const String &email) { +bool UserManagerStatic::_is_email_taken(const String &p_email) { + String email = User::string_to_internal_format(p_email); + for (int i = 0; i < _users.size(); ++i) { Ref u = _users[i]; if (u.is_valid()) { - if (u->get_email() == email) { + if (u->get_email_internal() == email) { return true; } } diff --git a/modules/users/managers/user_manager_static.h b/modules/users/managers/user_manager_static.h index d09ebd513..185800903 100644 --- a/modules/users/managers/user_manager_static.h +++ b/modules/users/managers/user_manager_static.h @@ -46,7 +46,7 @@ class UserManagerStatic : public UserManager { public: Ref _get_user(const int id); - Ref _get_user_name(const String &user); + Ref _get_user_name(const String &p_user_name); Ref _get_user_email(const String &user_email); void _save_user(Ref user);