From 9b21695387b684fcb48024fe7917090e6f21009c Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 15 Jul 2021 11:53:12 +0200 Subject: [PATCH] make destructor from all model::table protected to prevent misuse because of reference counting --- login_server/src/cpp/controller/EmailVerificationCode.cpp | 7 +++++-- login_server/src/cpp/controller/User.cpp | 2 +- login_server/src/cpp/model/table/AppAccessToken.h | 4 +++- login_server/src/cpp/model/table/ElopageBuy.h | 5 +++-- login_server/src/cpp/model/table/EmailOptIn.h | 4 +++- login_server/src/cpp/model/table/Group.h | 5 +++-- login_server/src/cpp/model/table/ModelBase.h | 7 ++++++- login_server/src/cpp/model/table/PendingTask.h | 3 ++- login_server/src/cpp/model/table/User.h | 3 ++- login_server/src/cpp/model/table/UserBackup.h | 4 ++-- login_server/src/cpp/model/table/UserRole.h | 5 +++-- 11 files changed, 33 insertions(+), 16 deletions(-) diff --git a/login_server/src/cpp/controller/EmailVerificationCode.cpp b/login_server/src/cpp/controller/EmailVerificationCode.cpp index 16fcefbb8..afbc0eb42 100644 --- a/login_server/src/cpp/controller/EmailVerificationCode.cpp +++ b/login_server/src/cpp/controller/EmailVerificationCode.cpp @@ -70,10 +70,13 @@ namespace controller { Poco::AutoPtr EmailVerificationCode::loadOrCreate(int user_id, model::table::EmailOptInType type) { - model::table::EmailOptIn db; + auto db = new model::table::EmailOptIn(); std::vector fields = { "user_id", "email_opt_in_type_id" }; std::vector field_values = { user_id, (int)type }; - auto results = db.loadFromDB(fields, field_values); + auto results = db->loadFromDB(fields, field_values); + db->release(); + db = nullptr; + if (results.size() > 0) { return Poco::AutoPtr(new EmailVerificationCode(new model::table::EmailOptIn(results[0]))); } diff --git a/login_server/src/cpp/controller/User.cpp b/login_server/src/cpp/controller/User.cpp index 955b780d0..576b2b8c8 100644 --- a/login_server/src/cpp/controller/User.cpp +++ b/login_server/src/cpp/controller/User.cpp @@ -136,7 +136,7 @@ namespace controller { { auto db = new model::table::User(); if (0 == db->loadFromDB("id", user_id)) { - delete db; + db->release(); return nullptr; } auto user = new User(db); diff --git a/login_server/src/cpp/model/table/AppAccessToken.h b/login_server/src/cpp/model/table/AppAccessToken.h index 821cb6e3c..bbee0568d 100644 --- a/login_server/src/cpp/model/table/AppAccessToken.h +++ b/login_server/src/cpp/model/table/AppAccessToken.h @@ -16,7 +16,7 @@ namespace model { AppAccessToken(int user_id, const Poco::UInt64& code); AppAccessToken(const AppAccessCodeTuple& tuple); AppAccessToken(); - ~AppAccessToken(); + // generic db operations const char* getTableName() const { return "app_access_tokens"; } @@ -32,6 +32,8 @@ namespace model { size_t update(); protected: + ~AppAccessToken(); + Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); Poco::Data::Statement _insertIntoDB(Poco::Data::Session session); diff --git a/login_server/src/cpp/model/table/ElopageBuy.h b/login_server/src/cpp/model/table/ElopageBuy.h index e2b88fb1b..dec4727a3 100644 --- a/login_server/src/cpp/model/table/ElopageBuy.h +++ b/login_server/src/cpp/model/table/ElopageBuy.h @@ -31,14 +31,15 @@ namespace model { { public: ElopageBuy(const Poco::Net::NameValueCollection& elopage_webhook_requestData); - ~ElopageBuy(); - + // generic db operations const char* getTableName() const { return "elopage_buys"; } std::string toString(); protected: + ~ElopageBuy(); + Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _insertIntoDB(Poco::Data::Session session); diff --git a/login_server/src/cpp/model/table/EmailOptIn.h b/login_server/src/cpp/model/table/EmailOptIn.h index c7a21d84c..9e0fc335a 100644 --- a/login_server/src/cpp/model/table/EmailOptIn.h +++ b/login_server/src/cpp/model/table/EmailOptIn.h @@ -26,7 +26,7 @@ namespace model { EmailOptIn(const Poco::UInt64& code, EmailOptInType type); EmailOptIn(const EmailOptInTuple& tuple); EmailOptIn(); - ~EmailOptIn(); + // generic db operations const char* getTableName() const { return "email_opt_in"; } @@ -46,6 +46,8 @@ namespace model { static const char* typeToString(EmailOptInType type); static EmailOptInType stringToType(const std::string& typeString); protected: + ~EmailOptIn(); + 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); diff --git a/login_server/src/cpp/model/table/Group.h b/login_server/src/cpp/model/table/Group.h index 8e0c56e40..e998cfb7c 100644 --- a/login_server/src/cpp/model/table/Group.h +++ b/login_server/src/cpp/model/table/Group.h @@ -15,8 +15,7 @@ namespace model { Group(); Group(const std::string& alias, const std::string& name, const std::string& url, const std::string& host, const std::string& home, const std::string& description); Group(GroupTuple userTuple); - ~Group(); - + // generic db operations const char* getTableName() const { return "groups"; } std::string toString(); @@ -35,6 +34,8 @@ namespace model { inline void setHome(const std::string& home) { UNIQUE_LOCK; mHome = home; } protected: + ~Group(); + Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadAllFromDB(Poco::Data::Session session); Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName); diff --git a/login_server/src/cpp/model/table/ModelBase.h b/login_server/src/cpp/model/table/ModelBase.h index c769dcfd9..95856087f 100644 --- a/login_server/src/cpp/model/table/ModelBase.h +++ b/login_server/src/cpp/model/table/ModelBase.h @@ -32,7 +32,7 @@ namespace model { public: ModelBase(int id) :mID(id), mReferenceCount(1) {} ModelBase() : mID(0), mReferenceCount(1) {} - virtual ~ModelBase(); + virtual const char* getTableName() const = 0; //! called from within of some catch to give more information for debugging, don't lock mutex! @@ -90,6 +90,8 @@ namespace model { void duplicate(); void release(); protected: + virtual ~ModelBase(); + virtual Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session) = 0; virtual Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName) = 0; virtual Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::vector& fieldNames, MysqlConditionType conditionType = MYSQL_CONDITION_AND); @@ -105,6 +107,9 @@ namespace model { mutable std::shared_mutex mSharedMutex; + private: + + }; template diff --git a/login_server/src/cpp/model/table/PendingTask.h b/login_server/src/cpp/model/table/PendingTask.h index ea6aad92b..3e7a0e8d5 100644 --- a/login_server/src/cpp/model/table/PendingTask.h +++ b/login_server/src/cpp/model/table/PendingTask.h @@ -28,7 +28,6 @@ namespace model { PendingTask(int userId, std::string serializedProtoRequest, TaskType type); PendingTask(const PendingTaskTuple& tuple); - ~PendingTask(); // generic db operations const char* getTableName() const { return "pending_tasks"; } @@ -65,6 +64,8 @@ namespace model { static const char* typeToString(TaskType type); protected: + ~PendingTask(); + Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadAllFromDB(Poco::Data::Session session); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); diff --git a/login_server/src/cpp/model/table/User.h b/login_server/src/cpp/model/table/User.h index dd51d7498..96d85565d 100644 --- a/login_server/src/cpp/model/table/User.h +++ b/login_server/src/cpp/model/table/User.h @@ -38,7 +38,7 @@ namespace model { 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"; } @@ -97,6 +97,7 @@ namespace model { Poco::JSON::Object getJson(); protected: + ~User(); Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); diff --git a/login_server/src/cpp/model/table/UserBackup.h b/login_server/src/cpp/model/table/UserBackup.h index c5084b0f7..a2f407fbd 100644 --- a/login_server/src/cpp/model/table/UserBackup.h +++ b/login_server/src/cpp/model/table/UserBackup.h @@ -15,8 +15,7 @@ namespace model { UserBackup(int user_id, const std::string& passphrase, ServerConfig::Mnemonic_Types type); UserBackup(const UserBackupsTuple& tuple); UserBackup(); - ~UserBackup(); - + // generic db operations const char* getTableName() const { return "user_backups"; } std::string toString(); @@ -29,6 +28,7 @@ namespace model { protected: + ~UserBackup(); //! \brief call from constructor if mMnemonicType -1 //! diff --git a/login_server/src/cpp/model/table/UserRole.h b/login_server/src/cpp/model/table/UserRole.h index 7683bff94..1369dbe86 100644 --- a/login_server/src/cpp/model/table/UserRole.h +++ b/login_server/src/cpp/model/table/UserRole.h @@ -23,7 +23,6 @@ namespace model { UserRole(int user_id, RoleType type); UserRole(const UserRolesTuple& tuple); UserRole(); - ~UserRole(); // generic db operations const char* getTableName() const { return "user_roles"; } @@ -35,7 +34,9 @@ namespace model { inline void setUserId(int user_Id) { mUserId = user_Id; } static const char* typeToString(RoleType type); - protected: + protected: + ~UserRole(); + 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);