#ifndef GRADIDO_LOGIN_SERVER_MODEL_TABLE_USER_INCLUDE #define GRADIDO_LOGIN_SERVER_MODEL_TABLE_USER_INCLUDE #include "ModelBase.h" #include "../../SingletonManager/MemoryManager.h" #include "Poco/Tuple.h" #include "Poco/DateTime.h" //#include "Poco/Nullable.h" //#include "Poco/Data/LOB.h" #include "UserRole.h" namespace model { namespace table { enum UserFields { USER_FIELDS_ID, USER_FIELD_EMAIL, USER_FIELDS_FIRST_NAME, USER_FIELDS_LAST_NAME, USER_FIELDS_PASSWORD, USER_FIELDS_PUBLIC_KEY, USER_FIELDS_PRIVATE_KEY, USER_FIELDS_CREATED, USER_FIELDS_EMAIL_CHECKED, USER_FIELDS_LANGUAGE }; typedef Poco::Tuple, Poco::DateTime, int, int, int, int> UserTuple; class User : public ModelBase { public: User(); User(UserTuple tuple); User(const std::string& email, const std::string& first_name, const std::string& last_name, int group_id, Poco::UInt64 passwordHashed = 0, std::string languageKey = "de"); ~User(); // generic db operations const char* getTableName() const { return "users"; } std::string toString(); std::string toHTMLString(); // specific db operation size_t updatePrivkey(); size_t updatePublickey(); size_t updatePrivkeyAndPasswordHash(); size_t updatePubkeyAndPrivkey(); //! \brief update first_name, last_name, disabled and language size_t updateFieldsFromCommunityServer(); // default getter unlocked inline const std::string getEmail() const { SHARED_LOCK; return mEmail; } inline const std::string getFirstName() const { SHARED_LOCK; return mFirstName; } inline const std::string getLastName() const { SHARED_LOCK; return mLastName; } inline const std::string getUsername() const { SHARED_LOCK; return mUsername; } inline std::string getNameWithEmailHtml() const { SHARED_LOCK; return mFirstName + " " + mLastName + " <" + mEmail + ">"; } inline const Poco::UInt64 getPasswordHashed() const { SHARED_LOCK; return mPasswordHashed; } inline int getGroupId() const { SHARED_LOCK; return mGroupId; } inline int getPublisherId() const { SHARED_LOCK; return mPublisherId; } inline RoleType getRole() const { SHARED_LOCK; if (mRole.isNull()) return ROLE_NONE; return static_cast(mRole.value()); } inline const unsigned char* getPublicKey() const { SHARED_LOCK; if (mPublicKey.isNull()) return nullptr; return mPublicKey.value().content().data(); } MemoryBin* getPublicKeyCopy() const; inline size_t getPublicKeySize() const { SHARED_LOCK; if (mPublicKey.isNull()) return 0; return mPublicKey.value().content().size(); } std::string getPublicKeyHex() const; std::string getPrivateKeyEncryptedHex() const; inline bool hasPrivateKeyEncrypted() const { SHARED_LOCK; return !mPrivateKey.isNull(); } inline bool hasPublicKey() const { SHARED_LOCK; return !mPublicKey.isNull(); } inline bool hasEmailHash() const { SHARED_LOCK; return !mEmailHash.isNull(); } inline const std::vector& getPrivateKeyEncrypted() const { SHARED_LOCK; return mPrivateKey.value().content(); } inline bool isEmailChecked() const { SHARED_LOCK; return mEmailChecked; } inline const std::string getLanguageKey() const { SHARED_LOCK; return mLanguageKey; } inline bool isDisabled() const { SHARED_LOCK; return mDisabled; } // default setter unlocked void setEmail(const std::string& email); inline void setFirstName(const std::string& first_name) { UNIQUE_LOCK; mFirstName = first_name; } inline void setLastName(const std::string& last_name) { UNIQUE_LOCK; mLastName = last_name; } inline void setUsername(const std::string& username) { UNIQUE_LOCK; mUsername = username; } inline void setPasswordHashed(const Poco::UInt64& passwordHashed) { UNIQUE_LOCK; mPasswordHashed = passwordHashed; } void setPublicKey(const unsigned char* publicKey); //! \brief set encrypted private key //! \param privateKey copy data, didn't move memory bin void setPrivateKey(const MemoryBin* privateKey); inline void setEmailChecked(bool emailChecked) { UNIQUE_LOCK; mEmailChecked = emailChecked; } inline void setLanguageKey(const std::string& languageKey) { UNIQUE_LOCK; mLanguageKey = languageKey; } inline void setDisabled(bool disabled) { UNIQUE_LOCK; mDisabled = disabled; } inline void setGroupId(int groupId) { UNIQUE_LOCK; mGroupId = groupId; } inline void setPublisherId(int publisherId) { UNIQUE_LOCK; mPublisherId = publisherId; } Poco::JSON::Object getJson(); protected: Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::vector fieldNames, MysqlConditionType conditionType = MYSQL_CONDITION_AND); // insert only with email, first_name, last_name, password if exist and language Poco::Data::Statement _insertIntoDB(Poco::Data::Session session); std::string mEmail; std::string mFirstName; std::string mLastName; std::string mUsername; Poco::UInt64 mPasswordHashed; Poco::Nullable mPublicKey; Poco::Nullable mPrivateKey; Poco::Nullable mEmailHash; // sodium generic hash (currently blake2b) // created: Mysql DateTime Poco::DateTime mCreated; bool mEmailChecked; std::string mLanguageKey; //! if account should delete but cannot because public keys for transaction needed, until gradido node is running //! if set to true, prevent login bool mDisabled; int mGroupId; int mPublisherId; // from neighbor tables Poco::Nullable mRole; }; } } #endif //GRADIDO_LOGIN_SERVER_MODEL_TABLE_USER_INCLUDE