From 0915fc1494df1cd15fc9c09bbf622f137406c84c Mon Sep 17 00:00:00 2001 From: Nikita Kostovsky Date: Mon, 23 Jun 2025 22:03:49 +0200 Subject: add User(login) constructor, fetch db data inside --- src/user.cpp | 95 +++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 17 deletions(-) (limited to 'src/user.cpp') diff --git a/src/user.cpp b/src/user.cpp index 4667ebf..1c83921 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -25,19 +25,26 @@ QByteArray generateSalt() // FIXME: use better password hashing algo User::User(const QString &login, const QString &password) - : login{login} - , salt{rsshit::generateSalt()} - , passwordHash{hashPassword(password)} + : m_login{login} + , m_salt{rsshit::generateSalt()} + , m_passwordHash{hashPassword(password)} { qDebug() << __func__ << "login:" << login; - qDebug() << __func__ << "salt size:" << salt.size(); - qDebug() << __func__ << "passwordHash size:" << passwordHash.size(); + qDebug() << __func__ << "salt size:" << m_salt.size(); + qDebug() << __func__ << "passwordHash size:" << m_passwordHash.size(); } +User::User(const QString &login) + : m_login{login} +{ + fetchFromDb(); +} + +// TODO: rename to `fetchFromDb` and fill all data? int User::getDbId() { - if (id != rsshit::db::IdNotFound) - return id; + if (m_id != rsshit::db::IdNotFound) + return m_id; const auto db = rsshit::db::open(); @@ -45,7 +52,7 @@ int User::getDbId() return rsshit::db::IdNotFound; QSqlQuery selectQ{"select id from users where login=?"}; - selectQ.addBindValue(login); + selectQ.addBindValue(m_login); if (!selectQ.exec()) { qWarning() << "cannot exec query" << selectQ.lastQuery() << ":" @@ -71,26 +78,78 @@ int User::getDbId() return rsshit::db::IdNotFound; } + if (m_id != result) + m_id = result; + return result; } +int User::fetchFromDb() +{ + const auto db = rsshit::db::open(); + + if (!db) + return rsshit::db::IdNotFound; + + // ignore local `id` if exists, fetch all fields + QSqlQuery selectQ{"select id, login, salt, password_hash from users where login=?"}; + selectQ.addBindValue(m_login); + + if (!selectQ.exec()) { + qWarning() << "cannot exec query" << selectQ.lastQuery() << ":" + << selectQ.lastError().text(); + + return rsshit::db::IdNotFound; + } + + if (!selectQ.next()) + return rsshit::db::IdNotFound; + + const auto idVariant = selectQ.value(rsshit::db::idTag); + + if (!idVariant.isValid() || !idVariant.canConvert()) + return rsshit::db::IdNotFound; + + bool ok{false}; + m_id = idVariant.toInt(&ok); + + if (!ok) { + qWarning() << "got invalid id from db:" << idVariant; + + return rsshit::db::IdNotFound; + } + + if (m_id == rsshit::db::IdNotFound) + return m_id; + + m_salt = selectQ.value(rsshit::db::saltTag).toByteArray(); + m_passwordHash = selectQ.value(rsshit::db::passwordHashTag).toByteArray(); + + return m_id; +} + +bool User::existsInDb() +{ + return getDbId() != rsshit::db::IdNotFound; +} + int User::createInDb() { - if (id != rsshit::db::IdNotFound) - return id; + if (m_id != rsshit::db::IdNotFound) + return m_id; const auto db = rsshit::db::open(); if (!db) return rsshit::db::IdNotFound; - if (login.isEmpty() || salt.isEmpty() || passwordHash.isEmpty()) + if (m_login.isEmpty() || m_salt.isEmpty() || m_passwordHash.isEmpty()) return rsshit::db::IdNotFound; QSqlQuery insertQ{"insert into users(login, salt, password_hash) values(?, ?, ?)"}; - insertQ.addBindValue(login); - insertQ.addBindValue(salt); - insertQ.addBindValue(passwordHash); + insertQ.addBindValue(m_login); + insertQ.addBindValue(m_salt); + insertQ.addBindValue(m_passwordHash); if (!insertQ.exec()) { qWarning() << "cannot exec query" << insertQ.lastQuery() << ":" @@ -99,7 +158,9 @@ int User::createInDb() return rsshit::db::IdNotFound; } - return insertQ.lastInsertId().toInt(); + m_id = insertQ.lastInsertId().toInt(); + + return m_id; } int User::getOrInsertDbId() @@ -114,10 +175,10 @@ int User::getOrInsertDbId() bool User::verifyPassword(const QString &password) { - return hashPassword(password) == passwordHash; + return (!m_passwordHash.isEmpty()) && (hashPassword(password) == m_passwordHash); } QByteArray User::hashPassword(const QString &password) { - return QCryptographicHash::hash(salt + password.toUtf8(), QCryptographicHash::Sha256); + return QCryptographicHash::hash(m_salt + password.toUtf8(), QCryptographicHash::Sha256); } -- cgit v1.2.3-70-g09d2