diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-06-23 22:03:49 +0200 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-06-23 22:03:49 +0200 |
| commit | 0915fc1494df1cd15fc9c09bbf622f137406c84c (patch) | |
| tree | ef81d75f0e62143b1d072f6fd911eed9c5d2230f /src/user.cpp | |
| parent | c9fcceb74d861525b2defec8219374edb9c1455a (diff) | |
add User(login) constructor, fetch db data inside
Diffstat (limited to 'src/user.cpp')
| -rw-r--r-- | src/user.cpp | 95 |
1 files changed, 78 insertions, 17 deletions
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<int>()) + 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); } |
