Merged PR 1169: Authentication Management Refactoring - 1929
User Story #1951 User Story #1952 **Changes** - Added DataStoreLockGuard for scoped locking/unlocking. - Applied lock guard in AuthenticationManagementService (login, password change). - Switched User serialization from CSV to SerializedUser struct. - Removed old CSV-based serialize, deserialize, and getHeaders. - Updated DataStore::getUsers to refresh cache and attach notifications. - Enhanced DataStore::saveUsers to persist users and notifications. - Marked modified records in changePassword and saved changes. - Included DataStoreLockGuard.h in project files. - Improved error handling for invalid user IDs and missing users. Related work items: #1929, #1951, #1952
This commit is contained in:
+16
-4
@@ -10,6 +10,8 @@ Date:19-May-2026
|
|||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include "AuthenticationManagementService.h"
|
#include "AuthenticationManagementService.h"
|
||||||
#include "User.h"
|
#include "User.h"
|
||||||
|
#include "Utility.h"
|
||||||
|
#include "DataStoreLockGuard.h"
|
||||||
|
|
||||||
User* AuthenticationManagementService::m_authenticatedUser = nullptr;
|
User* AuthenticationManagementService::m_authenticatedUser = nullptr;
|
||||||
|
|
||||||
@@ -24,11 +26,12 @@ Return type: bool - true if login successful, false otherwise
|
|||||||
*/
|
*/
|
||||||
bool AuthenticationManagementService::login(const std::string& username, const std::string& password)
|
bool AuthenticationManagementService::login(const std::string& username, const std::string& password)
|
||||||
{
|
{
|
||||||
util::Map<std::string, User*> users = m_dataStore.getUsers();
|
DataStoreLockGuard lock(m_dataStore);
|
||||||
int usersMapSize = users.getSize();
|
auto& trackedUserMap = m_dataStore.getUsers();
|
||||||
for (int index = 0; index < usersMapSize; index++)
|
int trackedUserMapSize = trackedUserMap.getSize();
|
||||||
|
for (int index = 0; index < trackedUserMapSize; index++)
|
||||||
{
|
{
|
||||||
User* user = users.getValueAt(index);
|
User* user = trackedUserMap.getValueAt(index).data;
|
||||||
if (username == user->getUserName())
|
if (username == user->getUserName())
|
||||||
{
|
{
|
||||||
if (password == user->getPassword())
|
if (password == user->getPassword())
|
||||||
@@ -74,9 +77,18 @@ Return type: void
|
|||||||
*/
|
*/
|
||||||
void AuthenticationManagementService::changePassword(const std::string& newPassword)
|
void AuthenticationManagementService::changePassword(const std::string& newPassword)
|
||||||
{
|
{
|
||||||
|
DataStoreLockGuard lock(m_dataStore);
|
||||||
|
auto& trackedUsersMap = m_dataStore.getUsers();
|
||||||
if (m_authenticatedUser == nullptr)
|
if (m_authenticatedUser == nullptr)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("There is no user currently logged in!");
|
throw std::runtime_error("There is no user currently logged in!");
|
||||||
}
|
}
|
||||||
|
int index = trackedUsersMap.find(m_authenticatedUser->getId());
|
||||||
|
if (index == -1)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("User does not exist!\n");
|
||||||
|
}
|
||||||
m_authenticatedUser->setPassword(newPassword);
|
m_authenticatedUser->setPassword(newPassword);
|
||||||
|
trackedUsersMap.getValueAt(index).state = RecordState::MODIFIED;
|
||||||
|
m_dataStore.saveUsers();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user