#pragma once #include // TODO: tests // - empty fields // - too long fields (use arrays instead of QByteArray?) // - try to break salt/hash fields // TODO: make all public fields private class User { public: /*! * \brief User - create user with given `login` and `password`. `salt` and * `passwordHash` will be generated and stored instead of real `password`. * Will *not* be committed to db automatically. Should be used to create a * new user * \code * User user{"admin", "123"}; * auto id = user.createInDb(); * if (id == rsshit::db::IdNotFound) // error * ... * \param login - max len is 32 * \param password - max len is 32 */ explicit User(const QString &login, const QString &password); /*! * \brief User - create user with given `login` and try to fetch data from db * automatically. Should be used for existing users * \code * User user{"admin"}; * if (user.getDbId() == rsshit::db::IdNotFound) // user not found * ... * if (!user.verifyPassword("123)) // wrong password * ... */ explicit User(const QString &login); public: /*! * \brief getDbId - check if user with corresponding `link` exists in db * and return db id if any (fills `id` var as well) * \return id on success, 0 otherwise */ int getDbId(); /*! * \brief fetchFromDb - fetch db user record with corresponding `login` * \return existing `id` on success, 0 otherwise */ int fetchFromDb(); /*! * \brief existsInDb - helper function, checks if `this` has valid `id`, or * db record with corresponding `login` exists (calls `getDbId` under the hood) * \return true if exists, false otherwise */ bool existsInDb(); /*! * \brief createInDb - create user in db, fill `id` * \return new user id on success, 0 otherwise */ int createInDb(); /*! * \brief getOrInsertDbId - get existing user id or try to create a new * user and get its id * \return existing or new user id on success, 0 otherwise */ int getOrInsertDbId(); bool verifyPassword(const QString &password); private: int m_id{0}; QString m_login; QByteArray m_salt; QByteArray m_passwordHash; private: QByteArray hashPassword(const QString &password); };