diff --git a/src/cpp/HTTPInterface/ElopageWebhook.cpp b/src/cpp/HTTPInterface/ElopageWebhook.cpp index 8584bc4d5..1c6f15c9b 100644 --- a/src/cpp/HTTPInterface/ElopageWebhook.cpp +++ b/src/cpp/HTTPInterface/ElopageWebhook.cpp @@ -250,11 +250,20 @@ int HandleElopageRequestTask::run() * */ + static const int valid_product_ids[] = { 36001, 43741, 43870, 43944, 43960, 49106 }; + bool valid_product_id = false; + for (int i = 0; i < sizeof(valid_product_ids) / sizeof(int); i++) { + if (valid_product_ids[i] == product_id) { + valid_product_id = true; + break; + } + } // only for product 36001 and 43741 create user accounts and send emails - if (product_id == 36001 || product_id == 43741 || product_id == 43870 || product_id == 43944 || product_id == 43960 || product_id == 49106) { + if (valid_product_id) { mEmail = mRequestData.get("payer[email]", ""); mFirstName = mRequestData.get("payer[first_name]", ""); mLastName = mRequestData.get("payer[last_name]", ""); + auto newUser = controller::User::create(mEmail, mFirstName, mLastName); /* printf("LastName: %s\n", mLastName.data()); for (int i = 0; i < mLastName.size(); i++) { @@ -284,8 +293,8 @@ int HandleElopageRequestTask::run() // prepare email in advance // create connection to email server - UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler)); - prepareEmail->scheduleTask(prepareEmail); + // UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler)); +// prepareEmail->scheduleTask(prepareEmail); // write user entry into db writeUserIntoDB(); @@ -338,7 +347,7 @@ int HandleElopageRequestTask::run() if (noEMail != 1) { // send email to user - auto message = new Poco::Net::MailMessage; + /*auto message = new Poco::Net::MailMessage; message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, mEmail)); message->setSubject("Gradido: E-Mail Verification"); @@ -354,10 +363,12 @@ int HandleElopageRequestTask::run() ss << "Dario, Gradido Server Admin" << std::endl; message->addContent(new Poco::Net::StringPartSource(ss.str())); - - UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1)); - sendEmail->setParentTaskPtrInArray(prepareEmail, 0); - sendEmail->setParentTaskPtrInArray(saveEmailVerificationCode, 1); + */ + //UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1)); + //Email(AutoPtr emailVerification, AutoPtr user, EmailType type); + UniLib::controller::TaskPtr sendEmail(new SendEmailTask(new model::Email(emailVerification, newUser, model::EMAIL_USER_VERIFICATION_CODE), ServerConfig::g_CPUScheduler, 1)); + //sendEmail->setParentTaskPtrInArray(prepareEmail, 0); + sendEmail->setParentTaskPtrInArray(saveEmailVerificationCode, 0); sendEmail->scheduleTask(sendEmail); } } diff --git a/src/cpp/SingletonManager/EmailManager.cpp b/src/cpp/SingletonManager/EmailManager.cpp index 723aed337..800750456 100644 --- a/src/cpp/SingletonManager/EmailManager.cpp +++ b/src/cpp/SingletonManager/EmailManager.cpp @@ -4,8 +4,14 @@ #include "../Crypto/Obfus_array.h" #include "../Crypto/DRRandom.h" +#include "../SingletonManager/LanguageManager.h" + +#include "Poco/Net/SecureSMTPClientSession.h" +#include "Poco/Net/SSLException.h" + + EmailManager::EmailManager() - : mInitalized(false), mDisableEmail(false) + : Thread("emails", false), mInitalized(false), mDisableEmail(false) { @@ -38,6 +44,7 @@ bool EmailManager::init(const Poco::Util::LayeredConfiguration& cfg) printf("email account not set in config: %s\n", ex.displayText().data()); return false; } + Thread::init("emails"); mInitalized = true; DISASM_FALSERET; @@ -57,5 +64,71 @@ void EmailManager::exit() int EmailManager::ThreadFunction() { + // prepare connection to email server + if (ServerConfig::g_disableEmail) return 0; + + if (mPendingEmails.empty()) return 0; + + auto lm = LanguageManager::getInstance(); + + Poco::Net::SecureSMTPClientSession mailClientSession(mEmailAccount.url, mEmailAccount.port); + mailClientSession.login(); + try { + mailClientSession.startTLS(ServerConfig::g_SSL_CLient_Context); + mailClientSession.login(Poco::Net::SMTPClientSession::AUTH_LOGIN, mEmailAccount.username, mEmailAccount.password); + } + catch (Poco::Net::SSLException& ex) { + printf("[PrepareEmailTask] ssl certificate error: %s\nPlease make sure you have cacert.pem (CA/root certificates) next to binary from https://curl.haxx.se/docs/caextract.html\n", ex.displayText().data()); + return -1; + } + + model::Email* email = nullptr; + Poco::AutoPtr catalogs[2]; + + // if email list empty, wait 500ms x time before exit thread and closing connection + int timeoutWaits = 20; + + while (mPendingEmails.pop(email) || timeoutWaits > 0) { + if (email) { + Poco::Net::MailMessage mailMessage; + mailMessage.setSender(mEmailAccount.sender); + Languages lang_code = ServerConfig::g_default_locale; + if (email->getUser()) { + Poco::AutoPtr userModel = email->getUser()->getModel(); + + if (!userModel.isNull()) { + userModel->lock("EmailManager::ThreadFunction"); + lang_code = LanguageManager::languageFromString(userModel->getLanguageKey()); + userModel->unlock(); + if (lang_code > LANG_COUNT) lang_code = ServerConfig::g_default_locale; + } + } + if (catalogs[lang_code].isNull()) { + catalogs[lang_code] = lm->getFreeCatalog(lang_code); + } + if (email->draft(&mailMessage, catalogs[lang_code])) { + + mailClientSession.sendMessage(mailMessage); + } + else { + // error drafting email, shouldn't happend + printf("[EmailManager::ThreadFunction] Error drafting email\n"); + } + delete email; + email = nullptr; + } + if (mPendingEmails.empty()) { + Poco::Thread::sleep(500); + timeoutWaits--; + } + } + + + + + + + mailClientSession.close(); + return 0; } \ No newline at end of file diff --git a/src/cpp/SingletonManager/EmailManager.h b/src/cpp/SingletonManager/EmailManager.h index 568fa4427..c4bbd73f9 100644 --- a/src/cpp/SingletonManager/EmailManager.h +++ b/src/cpp/SingletonManager/EmailManager.h @@ -29,7 +29,7 @@ public: inline const std::string& getAdminReceiver() { return mEmailAccount.admin_receiver; } - inline void addEmail(model::Email* email) { mPendingEmails.push(email); } + inline void addEmail(model::Email* email) { mPendingEmails.push(email); condSignal();} protected: EmailManager(); diff --git a/src/cpp/SingletonManager/ErrorManager.cpp b/src/cpp/SingletonManager/ErrorManager.cpp index a6a6ba10d..e47eb5e77 100644 --- a/src/cpp/SingletonManager/ErrorManager.cpp +++ b/src/cpp/SingletonManager/ErrorManager.cpp @@ -6,6 +6,10 @@ #include "../lib/ErrorList.h" +#include "../model/Email.h" + +#include "EmailManager.h" + ErrorManager* ErrorManager::getInstance() { @@ -71,11 +75,11 @@ int ErrorManager::getErrors(ErrorList* send) void ErrorManager::sendErrorsAsEmail() { - auto message = new Poco::Net::MailMessage(); + /*auto message = new Poco::Net::MailMessage(); message->setSender("gradido_loginServer@gradido.net"); message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***")); message->setSubject("Error from Gradido Login Server"); - + */ std::string content; mWorkingMutex.lock(); for (auto it1 = mErrorsMap.begin(); it1 != mErrorsMap.end(); it1++) { @@ -95,8 +99,12 @@ void ErrorManager::sendErrorsAsEmail() mErrorsMap.clear(); mWorkingMutex.unlock(); - message->addContent(new Poco::Net::StringPartSource(content)); - UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler)); - sendErrorMessageTask->scheduleTask(sendErrorMessageTask); + + auto email = new model::Email(content, model::EMAIL_ERROR); + EmailManager::getInstance()->addEmail(email); + + //message->addContent(new Poco::Net::StringPartSource(content)); + //UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler)); + //sendErrorMessageTask->scheduleTask(sendErrorMessageTask); } \ No newline at end of file diff --git a/src/cpp/controller/EmailVerificationCode.cpp b/src/cpp/controller/EmailVerificationCode.cpp index 6b98418f6..7e8ac57cd 100644 --- a/src/cpp/controller/EmailVerificationCode.cpp +++ b/src/cpp/controller/EmailVerificationCode.cpp @@ -35,6 +35,14 @@ namespace controller { return Poco::AutoPtr(result); } + Poco::AutoPtr EmailVerificationCode::create() + { + auto code = createEmailVerificationCode(); + auto db = new model::table::EmailOptIn(code); + auto result = new EmailVerificationCode(db); + return Poco::AutoPtr(result); + } + Poco::UInt64 EmailVerificationCode::createEmailVerificationCode() { Poco::UInt64 resultCode; diff --git a/src/cpp/controller/EmailVerificationCode.h b/src/cpp/controller/EmailVerificationCode.h index caca9186c..20703dfc8 100644 --- a/src/cpp/controller/EmailVerificationCode.h +++ b/src/cpp/controller/EmailVerificationCode.h @@ -13,6 +13,7 @@ namespace controller { ~EmailVerificationCode(); static Poco::AutoPtr create(int user_id); + static Poco::AutoPtr create(); inline Poco::AutoPtr getModel() { return _getModel(); } std::string getLink(); diff --git a/src/cpp/controller/TableControllerBase.h b/src/cpp/controller/TableControllerBase.h index e680e1dad..825ca3dc9 100644 --- a/src/cpp/controller/TableControllerBase.h +++ b/src/cpp/controller/TableControllerBase.h @@ -19,8 +19,8 @@ namespace controller { void release(); protected: - template - Poco::AutoPtr _getModel(); + template Poco::AutoPtr _getModel(); + template const T* _getModel() const; // for poco auto ptr int mReferenceCount; @@ -34,12 +34,26 @@ namespace controller { template Poco::AutoPtr TableControllerBase::_getModel() { // TODO: Maybe update name for error search - lock("TableControllerBase::getModel"); + lock("TableControllerBase::_getModel"); T* result = static_cast(mDBModel.get()); unlock(); return Poco::AutoPtr(result, true); } + template + const T* TableControllerBase::_getModel() const { + //lock("TableControllerBase::_getModel const"); + if (mDBModel.isNull()) { + //unlock(); + return nullptr; + } + + const T* result = static_cast(mDBModel.get()); + //unlock(); + return result; + } + + } #endif //GRADIDO_LOGIN_SERVER_MODEL_TABLE_CONTROLLER_BASE_INCLUDE \ No newline at end of file diff --git a/src/cpp/controller/User.h b/src/cpp/controller/User.h index 7bfd3bf0e..d42757599 100644 --- a/src/cpp/controller/User.h +++ b/src/cpp/controller/User.h @@ -20,6 +20,7 @@ namespace controller { int load(const unsigned char* pubkey_array); inline Poco::AutoPtr getModel() { return _getModel(); } + inline const model::table::User* getModel() const { return _getModel(); } protected: User(model::table::User* dbModel); diff --git a/src/cpp/lib/ErrorList.cpp b/src/cpp/lib/ErrorList.cpp index 2fce47e80..aa1fb3519 100644 --- a/src/cpp/lib/ErrorList.cpp +++ b/src/cpp/lib/ErrorList.cpp @@ -2,7 +2,10 @@ #include "../ServerConfig.h" -#include "Poco/Net/MailMessage.h" +//#include "Poco/Net/MailMessage.h" +#include "Poco/Net/MediaType.h" + +#include "../SingletonManager/EmailManager.h" SendErrorMessage::~SendErrorMessage() { @@ -125,11 +128,12 @@ std::string ErrorList::getErrorsHtml() void ErrorList::sendErrorsAsEmail(std::string rawHtml/* = ""*/) { - auto message = new Poco::Net::MailMessage(); + auto em = EmailManager::getInstance(); + /*auto message = new Poco::Net::MailMessage(); message->setSender("gradido_loginServer@gradido.net"); message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***")); message->setSubject("Error from Gradido Login Server"); - + */ std::string content; while (mErrorStack.size() > 0) { auto error = mErrorStack.top(); @@ -137,12 +141,18 @@ void ErrorList::sendErrorsAsEmail(std::string rawHtml/* = ""*/) content += error->getString(); delete error; } + auto email = new model::Email(content, model::EMAIL_ERROR); - message->addContent(new Poco::Net::StringPartSource(content)); + //message->addContent(new Poco::Net::StringPartSource(content)); if (rawHtml != "") { - message->addContent(new Poco::Net::StringPartSource(rawHtml)); + Poco::Net::MediaType mt("text", "html"); + mt.setParameter("charset", "utf-8"); + + email->addContent(new Poco::Net::StringPartSource(rawHtml, mt.toString())); } - UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler)); - sendErrorMessageTask->scheduleTask(sendErrorMessageTask); + em->addEmail(email); + + //UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler)); + //sendErrorMessageTask->scheduleTask(sendErrorMessageTask); } \ No newline at end of file diff --git a/src/cpp/model/Email.cpp b/src/cpp/model/Email.cpp index e99d5b82b..4779cac1d 100644 --- a/src/cpp/model/Email.cpp +++ b/src/cpp/model/Email.cpp @@ -1,6 +1,8 @@ #include "Email.h" #include "../SingletonManager/EmailManager.h" +#include "Poco/Net/MediaType.h" + namespace model { const static char EmailText_emailVerification[] = {u8"\ @@ -46,6 +48,14 @@ Gradido Login Server\ { } + Email::~Email() + { + while (mAdditionalStringPartSrcs.size() > 0) { + delete mAdditionalStringPartSrcs.front(); + mAdditionalStringPartSrcs.pop(); + } + } + bool Email::draft(Net::MailMessage* mailMessage, LanguageCatalog* langCatalog) { @@ -58,18 +68,21 @@ Gradido Login Server\ static const char* functionName = "Email::draft"; std::string content; + Poco::Net::MediaType mt("text", "plain"); + mt.setParameter("charset", "utf-8"); + switch (mType) { case EMAIL_DEFAULT: mailMessage->addRecipient(adminRecipient); mailMessage->setSubject(langCatalog->gettext_str("Default Email Subject")); - mailMessage->addContent(new Poco::Net::StringPartSource(langCatalog->gettext_str("Empty Email Content"))); - return true; + mailMessage->addContent(new Poco::Net::StringPartSource(langCatalog->gettext_str("Empty Email Content"), mt.toString())); + break; case EMAIL_ERROR: mailMessage->addRecipient(adminRecipient); mailMessage->setSubject(langCatalog->gettext_str("Error from Gradido Login Server")); - mailMessage->addContent(new Poco::Net::StringPartSource(mErrorHtml)); - return true; + mailMessage->addContent(new Poco::Net::StringPartSource(mErrorHtml, mt.toString())); + break; case EMAIL_USER_VERIFICATION_CODE: if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") { @@ -89,9 +102,9 @@ Gradido Login Server\ userTableModel->getFirstName(), userTableModel->getLastName(), mEmailVerificationCode->getLink() - )) + ), mt.toString()) ); - return true; + break; case EMAIL_USER_RESET_PASSWORD: if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") { addError(new Error(functionName, "no receiver email set for user reset password email")); @@ -110,9 +123,9 @@ Gradido Login Server\ userTableModel->getFirstName(), userTableModel->getLastName(), mEmailVerificationCode->getLink() - )) + ), mt.toString()) ); - return true; + break; case EMAIL_ADMIN_RESET_PASSWORD_REQUEST_WITHOUT_MEMORIZED_PASSPHRASE: if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") { addError(new Error(functionName, "no user email set for admin reset password email")); @@ -125,13 +138,18 @@ Gradido Login Server\ new Poco::Net::StringPartSource(replaceEmail( EmailText_adminEmailResetPassword, userTableModel->getEmail() - )) + ), mt.toString()) ); - return true; + break; default: return false; } - return false; + while (mAdditionalStringPartSrcs.size() > 0) { + mailMessage->addContent(mAdditionalStringPartSrcs.front()); + mAdditionalStringPartSrcs.pop(); + } + + return true; } std::string Email::replaceUserNamesAndLink(const char* src, const std::string& first_name, const std::string& last_name, const std::string& link) @@ -142,7 +160,7 @@ Gradido Login Server\ int findPos = result.find("[first_name]", findCursor); if (findPos != result.npos) { - findCursor = findPos + 13; + findCursor = findPos + first_name.size(); result.replace(findPos, 12, first_name); } else { @@ -151,7 +169,7 @@ Gradido Login Server\ findPos = result.find("[last_name]", findCursor); if (findPos != result.npos) { - findCursor = findPos + 12; + findCursor = findPos + last_name.size(); result.replace(findPos, 11, last_name); } else { @@ -160,7 +178,7 @@ Gradido Login Server\ findPos = result.find("[link]", findCursor); if (findPos != result.npos) { - findCursor = findPos + 7; + findCursor = findPos + link.size(); result.replace(findPos, 6, link); } else { diff --git a/src/cpp/model/Email.h b/src/cpp/model/Email.h index 0c03bc513..e3be467ac 100644 --- a/src/cpp/model/Email.h +++ b/src/cpp/model/Email.h @@ -37,10 +37,13 @@ namespace model { Email(AutoPtr emailVerification, AutoPtr user, EmailType type); //! \param errors copy errors into own memory Email(const std::string& errorHtml, EmailType type); + ~Email(); inline EmailType getType() { return mType; } + inline controller::User* getUser() { if (!mUser.isNull()) return mUser.get(); return nullptr; } bool draft(Net::MailMessage* mailMessage, LanguageCatalog* langCatalog); + inline void addContent(Poco::Net::StringPartSource* str_content) { mAdditionalStringPartSrcs.push(str_content); } protected: std::string replaceUserNamesAndLink(const char* src, const std::string& first_name, const std::string& last_name, const std::string& link); @@ -50,6 +53,8 @@ namespace model { AutoPtr mUser; std::string mErrorHtml; EmailType mType; + + std::queue mAdditionalStringPartSrcs; }; } diff --git a/src/cpp/model/Session.cpp b/src/cpp/model/Session.cpp index 2073a3119..a7e18700b 100644 --- a/src/cpp/model/Session.cpp +++ b/src/cpp/model/Session.cpp @@ -16,6 +16,8 @@ #include "../lib/JsonRequest.h" +#include "../controller/User.h" + #include "sodium.h" @@ -169,6 +171,7 @@ bool Session::createUser(const std::string& first_name, const std::string& last_ }*/ // check if user with that email already exist + auto dbConnection = ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); Poco::Data::Statement select(dbConnection); select << "SELECT email from users where email = ?;", useRef(email); @@ -183,11 +186,12 @@ bool Session::createUser(const std::string& first_name, const std::string& last_ } mSessionUser = new User(email.data(), first_name.data(), last_name.data()); + mNewUser = controller::User::create(email, first_name, last_name); updateTimeout(); // Prepare E-Mail - UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler)); - prepareEmail->scheduleTask(prepareEmail); + //UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler)); + //prepareEmail->scheduleTask(prepareEmail); // create user crypto key UniLib::controller::TaskPtr cryptoKeyTask(new UserCreateCryptoKey(mSessionUser, password, ServerConfig::g_CryptoCPUScheduler)); @@ -201,6 +205,8 @@ bool Session::createUser(const std::string& first_name, const std::string& last_ writeUserIntoDB->scheduleTask(writeUserIntoDB); createEmailVerificationCode(); + auto emailVerificationCodeObject = controller::EmailVerificationCode::create(); + emailVerificationCodeObject->getModel()->setCode(mEmailVerificationCode); UniLib::controller::TaskPtr writeEmailVerification(new WriteEmailVerification(mSessionUser, mEmailVerificationCode, ServerConfig::g_CPUScheduler, 1)); writeEmailVerification->setParentTaskPtrInArray(writeUserIntoDB, 0); @@ -216,7 +222,7 @@ bool Session::createUser(const std::string& first_name, const std::string& last_ */ // depends on writeUser because need user_id, write email verification into db - auto message = new Poco::Net::MailMessage; + /*auto message = new Poco::Net::MailMessage; Poco::Net::MediaType mt("text", "plain"); mt.setParameter("charset", "utf-8"); message->setContentType(mt); @@ -235,14 +241,15 @@ bool Session::createUser(const std::string& first_name, const std::string& last_ message->addContent(new Poco::Net::StringPartSource(ss.str())); - - UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1)); - sendEmail->setParentTaskPtrInArray(prepareEmail, 0); - sendEmail->setParentTaskPtrInArray(writeEmailVerification, 1); + */ + //UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1)); + //Email(AutoPtr emailVerification, AutoPtr user, EmailType type); + UniLib::controller::TaskPtr sendEmail(new SendEmailTask(new model::Email(emailVerificationCodeObject, mNewUser, model::EMAIL_USER_VERIFICATION_CODE), ServerConfig::g_CPUScheduler, 1)); + //sendEmail->setParentTaskPtrInArray(prepareEmail, 0); + sendEmail->setParentTaskPtrInArray(writeEmailVerification, 0); sendEmail->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_EMAIL_VERIFICATION_SEND, this)); sendEmail->scheduleTask(sendEmail); - // write user into db // generate and write email verification into db // send email diff --git a/src/cpp/model/table/EmailOptIn.cpp b/src/cpp/model/table/EmailOptIn.cpp index 359515ca4..66fbc3ab3 100644 --- a/src/cpp/model/table/EmailOptIn.cpp +++ b/src/cpp/model/table/EmailOptIn.cpp @@ -12,6 +12,12 @@ namespace model { } + EmailOptIn::EmailOptIn(const Poco::UInt64& code) + : mUserId(0), mEmailVerificationCode(code) + { + + } + EmailOptIn::EmailOptIn() : mUserId(0), mEmailVerificationCode(0) { diff --git a/src/cpp/model/table/EmailOptIn.h b/src/cpp/model/table/EmailOptIn.h index ba2a6bcd1..73bce2028 100644 --- a/src/cpp/model/table/EmailOptIn.h +++ b/src/cpp/model/table/EmailOptIn.h @@ -12,6 +12,7 @@ namespace model { { public: EmailOptIn(const Poco::UInt64& code, int user_id); + EmailOptIn(const Poco::UInt64& code); EmailOptIn(); ~EmailOptIn(); diff --git a/src/cpp/tasks/SendEmailTask.cpp b/src/cpp/tasks/SendEmailTask.cpp index 5e1270442..e3a5e0069 100644 --- a/src/cpp/tasks/SendEmailTask.cpp +++ b/src/cpp/tasks/SendEmailTask.cpp @@ -2,21 +2,33 @@ #include "PrepareEmailTask.h" #include "../lib/Profiler.h" #include "../SingletonManager/ErrorManager.h" +#include "../SingletonManager/EmailManager.h" #include "../ServerConfig.h" #include "Poco/Net/MediaType.h" SendEmailTask::SendEmailTask(Poco::Net::MailMessage* mailMessage, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount/* = 0*/) - : UniLib::controller::CPUTask(cpuScheduler, additionalTaskDependenceCount+1), mMailMessage(mailMessage) + : UniLib::controller::CPUTask(cpuScheduler, additionalTaskDependenceCount+1), mMailMessage(mailMessage), mEmail(nullptr) { } +SendEmailTask::SendEmailTask(model::Email*email, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount/* = 0*/) + : UniLib::controller::CPUTask(cpuScheduler, additionalTaskDependenceCount), mMailMessage(nullptr), mEmail(email) +{ + +} + SendEmailTask::~SendEmailTask() { if (mMailMessage) { delete mMailMessage; mMailMessage = nullptr; } + if (mEmail) { + delete mEmail; + mEmail = nullptr; + } + } int SendEmailTask::run() @@ -27,17 +39,25 @@ int SendEmailTask::run() auto er = ErrorManager::getInstance(); auto parent = getParent(0); - if (strcmp(parent->getResourceType(), "PrepareEmailTask") != 0) { - er->addError(new Error("SendEmailTask", "first parent isn't PrepareEmailTask")); - er->sendErrorsAsEmail(); - return -1; + if (mMailMessage) { + + if (strcmp(parent->getResourceType(), "PrepareEmailTask") != 0) { + er->addError(new Error("SendEmailTask", "first parent isn't PrepareEmailTask")); + er->sendErrorsAsEmail(); + return -1; + } + PrepareEmailTask* prepare = (PrepareEmailTask*)&(*parent); + mMailMessage->setSender(ServerConfig::g_EmailAccount.sender); + + if (prepare->send(mMailMessage)) { + er->sendErrorsAsEmail(); + return -1; + } } - PrepareEmailTask* prepare = (PrepareEmailTask*)&(*parent); - mMailMessage->setSender(ServerConfig::g_EmailAccount.sender); - - if (prepare->send(mMailMessage)) { - er->sendErrorsAsEmail(); - return -1; + else if (mEmail) { + auto em = EmailManager::getInstance(); + em->addEmail(mEmail); + mEmail = nullptr; } //printf("[SendEmailTask] time: %s\n", timeUsed.string().data()); return 0; diff --git a/src/cpp/tasks/SendEmailTask.h b/src/cpp/tasks/SendEmailTask.h index d13f9868e..70a075614 100644 --- a/src/cpp/tasks/SendEmailTask.h +++ b/src/cpp/tasks/SendEmailTask.h @@ -4,6 +4,8 @@ #include "CPUTask.h" #include "Poco/Net/MailMessage.h" +#include "../model/Email.h" + /* * @author: Dario Rekowski * @@ -17,6 +19,7 @@ class SendEmailTask : public UniLib::controller::CPUTask public: SendEmailTask(Poco::Net::MailMessage* mailMessage, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount = 0); + SendEmailTask(model::Email* email, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount = 0); virtual ~SendEmailTask(); virtual int run(); @@ -26,7 +29,7 @@ protected: private: Poco::Net::MailMessage* mMailMessage; - + model::Email* mEmail; }; diff --git a/src/cpp/tasks/SigningTransaction.cpp b/src/cpp/tasks/SigningTransaction.cpp index 79534389a..84be7b5cd 100644 --- a/src/cpp/tasks/SigningTransaction.cpp +++ b/src/cpp/tasks/SigningTransaction.cpp @@ -165,6 +165,8 @@ int SigningTransaction::run() { return -9; } + //sendErrorsAsEmail("HalloRote Test "); + Poco::JSON::Object object = *parsedJson.extract(); auto state = object.get("state"); std::string stateString = state.convert(); diff --git a/src/cpp/tasks/Thread.cpp b/src/cpp/tasks/Thread.cpp index 36dc5b1ed..0c095aeb9 100644 --- a/src/cpp/tasks/Thread.cpp +++ b/src/cpp/tasks/Thread.cpp @@ -67,7 +67,10 @@ namespace UniLib { //int status = SDL_CondWait(t->condition, t->mutex); try { condition.wait(mutex); - if (exitCalled) return; + if (exitCalled) { + threadUnlock(); + return; + } int ret = ThreadFunction(); threadUnlock(); if (ret)