summaryrefslogtreecommitdiff
path: root/src/user.cpp
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-06-23 22:03:49 +0200
committerNikita Kostovsky <nikita@kostovsky.me>2025-06-23 22:03:49 +0200
commit0915fc1494df1cd15fc9c09bbf622f137406c84c (patch)
treeef81d75f0e62143b1d072f6fd911eed9c5d2230f /src/user.cpp
parentc9fcceb74d861525b2defec8219374edb9c1455a (diff)
add User(login) constructor, fetch db data inside
Diffstat (limited to 'src/user.cpp')
-rw-r--r--src/user.cpp95
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);
}