mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
update email content type, using new email system for register and errors
This commit is contained in:
parent
feb3067f3a
commit
27bf842e6c
@ -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
|
// 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]", "");
|
mEmail = mRequestData.get("payer[email]", "");
|
||||||
mFirstName = mRequestData.get("payer[first_name]", "");
|
mFirstName = mRequestData.get("payer[first_name]", "");
|
||||||
mLastName = mRequestData.get("payer[last_name]", "");
|
mLastName = mRequestData.get("payer[last_name]", "");
|
||||||
|
auto newUser = controller::User::create(mEmail, mFirstName, mLastName);
|
||||||
|
|
||||||
/* printf("LastName: %s\n", mLastName.data());
|
/* printf("LastName: %s\n", mLastName.data());
|
||||||
for (int i = 0; i < mLastName.size(); i++) {
|
for (int i = 0; i < mLastName.size(); i++) {
|
||||||
@ -284,8 +293,8 @@ int HandleElopageRequestTask::run()
|
|||||||
|
|
||||||
// prepare email in advance
|
// prepare email in advance
|
||||||
// create connection to email server
|
// create connection to email server
|
||||||
UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler));
|
// UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler));
|
||||||
prepareEmail->scheduleTask(prepareEmail);
|
// prepareEmail->scheduleTask(prepareEmail);
|
||||||
|
|
||||||
// write user entry into db
|
// write user entry into db
|
||||||
writeUserIntoDB();
|
writeUserIntoDB();
|
||||||
@ -338,7 +347,7 @@ int HandleElopageRequestTask::run()
|
|||||||
if (noEMail != 1) {
|
if (noEMail != 1) {
|
||||||
|
|
||||||
// send email to user
|
// 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->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, mEmail));
|
||||||
message->setSubject("Gradido: E-Mail Verification");
|
message->setSubject("Gradido: E-Mail Verification");
|
||||||
@ -354,10 +363,12 @@ int HandleElopageRequestTask::run()
|
|||||||
ss << "Dario, Gradido Server Admin" << std::endl;
|
ss << "Dario, Gradido Server Admin" << std::endl;
|
||||||
|
|
||||||
message->addContent(new Poco::Net::StringPartSource(ss.str()));
|
message->addContent(new Poco::Net::StringPartSource(ss.str()));
|
||||||
|
*/
|
||||||
UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1));
|
//UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1));
|
||||||
sendEmail->setParentTaskPtrInArray(prepareEmail, 0);
|
//Email(AutoPtr<controller::EmailVerificationCode> emailVerification, AutoPtr<controller::User> user, EmailType type);
|
||||||
sendEmail->setParentTaskPtrInArray(saveEmailVerificationCode, 1);
|
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);
|
sendEmail->scheduleTask(sendEmail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,8 +4,14 @@
|
|||||||
#include "../Crypto/Obfus_array.h"
|
#include "../Crypto/Obfus_array.h"
|
||||||
#include "../Crypto/DRRandom.h"
|
#include "../Crypto/DRRandom.h"
|
||||||
|
|
||||||
|
#include "../SingletonManager/LanguageManager.h"
|
||||||
|
|
||||||
|
#include "Poco/Net/SecureSMTPClientSession.h"
|
||||||
|
#include "Poco/Net/SSLException.h"
|
||||||
|
|
||||||
|
|
||||||
EmailManager::EmailManager()
|
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());
|
printf("email account not set in config: %s\n", ex.displayText().data());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Thread::init("emails");
|
||||||
mInitalized = true;
|
mInitalized = true;
|
||||||
|
|
||||||
DISASM_FALSERET;
|
DISASM_FALSERET;
|
||||||
@ -57,5 +64,71 @@ void EmailManager::exit()
|
|||||||
|
|
||||||
int EmailManager::ThreadFunction()
|
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<LanguageCatalog> 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<model::table::User> 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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -29,7 +29,7 @@ public:
|
|||||||
|
|
||||||
inline const std::string& getAdminReceiver() { return mEmailAccount.admin_receiver; }
|
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:
|
protected:
|
||||||
EmailManager();
|
EmailManager();
|
||||||
|
|||||||
@ -6,6 +6,10 @@
|
|||||||
|
|
||||||
#include "../lib/ErrorList.h"
|
#include "../lib/ErrorList.h"
|
||||||
|
|
||||||
|
#include "../model/Email.h"
|
||||||
|
|
||||||
|
#include "EmailManager.h"
|
||||||
|
|
||||||
|
|
||||||
ErrorManager* ErrorManager::getInstance()
|
ErrorManager* ErrorManager::getInstance()
|
||||||
{
|
{
|
||||||
@ -71,11 +75,11 @@ int ErrorManager::getErrors(ErrorList* send)
|
|||||||
|
|
||||||
void ErrorManager::sendErrorsAsEmail()
|
void ErrorManager::sendErrorsAsEmail()
|
||||||
{
|
{
|
||||||
auto message = new Poco::Net::MailMessage();
|
/*auto message = new Poco::Net::MailMessage();
|
||||||
message->setSender("gradido_loginServer@gradido.net");
|
message->setSender("gradido_loginServer@gradido.net");
|
||||||
message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***"));
|
message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***"));
|
||||||
message->setSubject("Error from Gradido Login Server");
|
message->setSubject("Error from Gradido Login Server");
|
||||||
|
*/
|
||||||
std::string content;
|
std::string content;
|
||||||
mWorkingMutex.lock();
|
mWorkingMutex.lock();
|
||||||
for (auto it1 = mErrorsMap.begin(); it1 != mErrorsMap.end(); it1++) {
|
for (auto it1 = mErrorsMap.begin(); it1 != mErrorsMap.end(); it1++) {
|
||||||
@ -95,8 +99,12 @@ void ErrorManager::sendErrorsAsEmail()
|
|||||||
mErrorsMap.clear();
|
mErrorsMap.clear();
|
||||||
|
|
||||||
mWorkingMutex.unlock();
|
mWorkingMutex.unlock();
|
||||||
message->addContent(new Poco::Net::StringPartSource(content));
|
|
||||||
UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler));
|
auto email = new model::Email(content, model::EMAIL_ERROR);
|
||||||
sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
|
EmailManager::getInstance()->addEmail(email);
|
||||||
|
|
||||||
|
//message->addContent(new Poco::Net::StringPartSource(content));
|
||||||
|
//UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler));
|
||||||
|
//sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -35,6 +35,14 @@ namespace controller {
|
|||||||
return Poco::AutoPtr<EmailVerificationCode>(result);
|
return Poco::AutoPtr<EmailVerificationCode>(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Poco::AutoPtr<EmailVerificationCode> EmailVerificationCode::create()
|
||||||
|
{
|
||||||
|
auto code = createEmailVerificationCode();
|
||||||
|
auto db = new model::table::EmailOptIn(code);
|
||||||
|
auto result = new EmailVerificationCode(db);
|
||||||
|
return Poco::AutoPtr<EmailVerificationCode>(result);
|
||||||
|
}
|
||||||
|
|
||||||
Poco::UInt64 EmailVerificationCode::createEmailVerificationCode()
|
Poco::UInt64 EmailVerificationCode::createEmailVerificationCode()
|
||||||
{
|
{
|
||||||
Poco::UInt64 resultCode;
|
Poco::UInt64 resultCode;
|
||||||
|
|||||||
@ -13,6 +13,7 @@ namespace controller {
|
|||||||
~EmailVerificationCode();
|
~EmailVerificationCode();
|
||||||
|
|
||||||
static Poco::AutoPtr<EmailVerificationCode> create(int user_id);
|
static Poco::AutoPtr<EmailVerificationCode> create(int user_id);
|
||||||
|
static Poco::AutoPtr<EmailVerificationCode> create();
|
||||||
inline Poco::AutoPtr<model::table::EmailOptIn> getModel() { return _getModel<model::table::EmailOptIn>(); }
|
inline Poco::AutoPtr<model::table::EmailOptIn> getModel() { return _getModel<model::table::EmailOptIn>(); }
|
||||||
|
|
||||||
std::string getLink();
|
std::string getLink();
|
||||||
|
|||||||
@ -19,8 +19,8 @@ namespace controller {
|
|||||||
void release();
|
void release();
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
template<class T>
|
template<class T> Poco::AutoPtr<T> _getModel();
|
||||||
Poco::AutoPtr<T> _getModel();
|
template<class T> const T* _getModel() const;
|
||||||
|
|
||||||
// for poco auto ptr
|
// for poco auto ptr
|
||||||
int mReferenceCount;
|
int mReferenceCount;
|
||||||
@ -34,12 +34,26 @@ namespace controller {
|
|||||||
template<class T>
|
template<class T>
|
||||||
Poco::AutoPtr<T> TableControllerBase::_getModel() {
|
Poco::AutoPtr<T> TableControllerBase::_getModel() {
|
||||||
// TODO: Maybe update name for error search
|
// TODO: Maybe update name for error search
|
||||||
lock("TableControllerBase::getModel");
|
lock("TableControllerBase::_getModel");
|
||||||
T* result = static_cast<T*>(mDBModel.get());
|
T* result = static_cast<T*>(mDBModel.get());
|
||||||
unlock();
|
unlock();
|
||||||
return Poco::AutoPtr<T>(result, true);
|
return Poco::AutoPtr<T>(result, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
const T* TableControllerBase::_getModel() const {
|
||||||
|
//lock("TableControllerBase::_getModel const");
|
||||||
|
if (mDBModel.isNull()) {
|
||||||
|
//unlock();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const T* result = static_cast<const T*>(mDBModel.get());
|
||||||
|
//unlock();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //GRADIDO_LOGIN_SERVER_MODEL_TABLE_CONTROLLER_BASE_INCLUDE
|
#endif //GRADIDO_LOGIN_SERVER_MODEL_TABLE_CONTROLLER_BASE_INCLUDE
|
||||||
@ -20,6 +20,7 @@ namespace controller {
|
|||||||
int load(const unsigned char* pubkey_array);
|
int load(const unsigned char* pubkey_array);
|
||||||
|
|
||||||
inline Poco::AutoPtr<model::table::User> getModel() { return _getModel<model::table::User>(); }
|
inline Poco::AutoPtr<model::table::User> getModel() { return _getModel<model::table::User>(); }
|
||||||
|
inline const model::table::User* getModel() const { return _getModel<model::table::User>(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
User(model::table::User* dbModel);
|
User(model::table::User* dbModel);
|
||||||
|
|||||||
@ -2,7 +2,10 @@
|
|||||||
|
|
||||||
#include "../ServerConfig.h"
|
#include "../ServerConfig.h"
|
||||||
|
|
||||||
#include "Poco/Net/MailMessage.h"
|
//#include "Poco/Net/MailMessage.h"
|
||||||
|
#include "Poco/Net/MediaType.h"
|
||||||
|
|
||||||
|
#include "../SingletonManager/EmailManager.h"
|
||||||
|
|
||||||
SendErrorMessage::~SendErrorMessage()
|
SendErrorMessage::~SendErrorMessage()
|
||||||
{
|
{
|
||||||
@ -125,11 +128,12 @@ std::string ErrorList::getErrorsHtml()
|
|||||||
|
|
||||||
void ErrorList::sendErrorsAsEmail(std::string rawHtml/* = ""*/)
|
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->setSender("gradido_loginServer@gradido.net");
|
||||||
message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***"));
|
message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***"));
|
||||||
message->setSubject("Error from Gradido Login Server");
|
message->setSubject("Error from Gradido Login Server");
|
||||||
|
*/
|
||||||
std::string content;
|
std::string content;
|
||||||
while (mErrorStack.size() > 0) {
|
while (mErrorStack.size() > 0) {
|
||||||
auto error = mErrorStack.top();
|
auto error = mErrorStack.top();
|
||||||
@ -137,12 +141,18 @@ void ErrorList::sendErrorsAsEmail(std::string rawHtml/* = ""*/)
|
|||||||
content += error->getString();
|
content += error->getString();
|
||||||
delete error;
|
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 != "") {
|
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));
|
em->addEmail(email);
|
||||||
sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
|
|
||||||
|
//UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler));
|
||||||
|
//sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,6 +1,8 @@
|
|||||||
#include "Email.h"
|
#include "Email.h"
|
||||||
#include "../SingletonManager/EmailManager.h"
|
#include "../SingletonManager/EmailManager.h"
|
||||||
|
|
||||||
|
#include "Poco/Net/MediaType.h"
|
||||||
|
|
||||||
namespace model {
|
namespace model {
|
||||||
|
|
||||||
const static char EmailText_emailVerification[] = {u8"\
|
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)
|
bool Email::draft(Net::MailMessage* mailMessage, LanguageCatalog* langCatalog)
|
||||||
{
|
{
|
||||||
@ -58,18 +68,21 @@ Gradido Login Server\
|
|||||||
static const char* functionName = "Email::draft";
|
static const char* functionName = "Email::draft";
|
||||||
std::string content;
|
std::string content;
|
||||||
|
|
||||||
|
Poco::Net::MediaType mt("text", "plain");
|
||||||
|
mt.setParameter("charset", "utf-8");
|
||||||
|
|
||||||
switch (mType) {
|
switch (mType) {
|
||||||
case EMAIL_DEFAULT:
|
case EMAIL_DEFAULT:
|
||||||
mailMessage->addRecipient(adminRecipient);
|
mailMessage->addRecipient(adminRecipient);
|
||||||
mailMessage->setSubject(langCatalog->gettext_str("Default Email Subject"));
|
mailMessage->setSubject(langCatalog->gettext_str("Default Email Subject"));
|
||||||
mailMessage->addContent(new Poco::Net::StringPartSource(langCatalog->gettext_str("Empty Email Content")));
|
mailMessage->addContent(new Poco::Net::StringPartSource(langCatalog->gettext_str("Empty Email Content"), mt.toString()));
|
||||||
return true;
|
break;
|
||||||
|
|
||||||
case EMAIL_ERROR:
|
case EMAIL_ERROR:
|
||||||
mailMessage->addRecipient(adminRecipient);
|
mailMessage->addRecipient(adminRecipient);
|
||||||
mailMessage->setSubject(langCatalog->gettext_str("Error from Gradido Login Server"));
|
mailMessage->setSubject(langCatalog->gettext_str("Error from Gradido Login Server"));
|
||||||
mailMessage->addContent(new Poco::Net::StringPartSource(mErrorHtml));
|
mailMessage->addContent(new Poco::Net::StringPartSource(mErrorHtml, mt.toString()));
|
||||||
return true;
|
break;
|
||||||
|
|
||||||
case EMAIL_USER_VERIFICATION_CODE:
|
case EMAIL_USER_VERIFICATION_CODE:
|
||||||
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
|
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
|
||||||
@ -89,9 +102,9 @@ Gradido Login Server\
|
|||||||
userTableModel->getFirstName(),
|
userTableModel->getFirstName(),
|
||||||
userTableModel->getLastName(),
|
userTableModel->getLastName(),
|
||||||
mEmailVerificationCode->getLink()
|
mEmailVerificationCode->getLink()
|
||||||
))
|
), mt.toString())
|
||||||
);
|
);
|
||||||
return true;
|
break;
|
||||||
case EMAIL_USER_RESET_PASSWORD:
|
case EMAIL_USER_RESET_PASSWORD:
|
||||||
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
|
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
|
||||||
addError(new Error(functionName, "no receiver email set for user reset password email"));
|
addError(new Error(functionName, "no receiver email set for user reset password email"));
|
||||||
@ -110,9 +123,9 @@ Gradido Login Server\
|
|||||||
userTableModel->getFirstName(),
|
userTableModel->getFirstName(),
|
||||||
userTableModel->getLastName(),
|
userTableModel->getLastName(),
|
||||||
mEmailVerificationCode->getLink()
|
mEmailVerificationCode->getLink()
|
||||||
))
|
), mt.toString())
|
||||||
);
|
);
|
||||||
return true;
|
break;
|
||||||
case EMAIL_ADMIN_RESET_PASSWORD_REQUEST_WITHOUT_MEMORIZED_PASSPHRASE:
|
case EMAIL_ADMIN_RESET_PASSWORD_REQUEST_WITHOUT_MEMORIZED_PASSPHRASE:
|
||||||
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
|
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
|
||||||
addError(new Error(functionName, "no user email set for admin reset password email"));
|
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(
|
new Poco::Net::StringPartSource(replaceEmail(
|
||||||
EmailText_adminEmailResetPassword,
|
EmailText_adminEmailResetPassword,
|
||||||
userTableModel->getEmail()
|
userTableModel->getEmail()
|
||||||
))
|
), mt.toString())
|
||||||
);
|
);
|
||||||
return true;
|
break;
|
||||||
default: return false;
|
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)
|
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);
|
int findPos = result.find("[first_name]", findCursor);
|
||||||
if (findPos != result.npos) {
|
if (findPos != result.npos) {
|
||||||
findCursor = findPos + 13;
|
findCursor = findPos + first_name.size();
|
||||||
result.replace(findPos, 12, first_name);
|
result.replace(findPos, 12, first_name);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -151,7 +169,7 @@ Gradido Login Server\
|
|||||||
|
|
||||||
findPos = result.find("[last_name]", findCursor);
|
findPos = result.find("[last_name]", findCursor);
|
||||||
if (findPos != result.npos) {
|
if (findPos != result.npos) {
|
||||||
findCursor = findPos + 12;
|
findCursor = findPos + last_name.size();
|
||||||
result.replace(findPos, 11, last_name);
|
result.replace(findPos, 11, last_name);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -160,7 +178,7 @@ Gradido Login Server\
|
|||||||
|
|
||||||
findPos = result.find("[link]", findCursor);
|
findPos = result.find("[link]", findCursor);
|
||||||
if (findPos != result.npos) {
|
if (findPos != result.npos) {
|
||||||
findCursor = findPos + 7;
|
findCursor = findPos + link.size();
|
||||||
result.replace(findPos, 6, link);
|
result.replace(findPos, 6, link);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@ -37,10 +37,13 @@ namespace model {
|
|||||||
Email(AutoPtr<controller::EmailVerificationCode> emailVerification, AutoPtr<controller::User> user, EmailType type);
|
Email(AutoPtr<controller::EmailVerificationCode> emailVerification, AutoPtr<controller::User> user, EmailType type);
|
||||||
//! \param errors copy errors into own memory
|
//! \param errors copy errors into own memory
|
||||||
Email(const std::string& errorHtml, EmailType type);
|
Email(const std::string& errorHtml, EmailType type);
|
||||||
|
~Email();
|
||||||
|
|
||||||
inline EmailType getType() { return mType; }
|
inline EmailType getType() { return mType; }
|
||||||
|
inline controller::User* getUser() { if (!mUser.isNull()) return mUser.get(); return nullptr; }
|
||||||
|
|
||||||
bool draft(Net::MailMessage* mailMessage, LanguageCatalog* langCatalog);
|
bool draft(Net::MailMessage* mailMessage, LanguageCatalog* langCatalog);
|
||||||
|
inline void addContent(Poco::Net::StringPartSource* str_content) { mAdditionalStringPartSrcs.push(str_content); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::string replaceUserNamesAndLink(const char* src, const std::string& first_name, const std::string& last_name, const std::string& link);
|
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<controller::User> mUser;
|
AutoPtr<controller::User> mUser;
|
||||||
std::string mErrorHtml;
|
std::string mErrorHtml;
|
||||||
EmailType mType;
|
EmailType mType;
|
||||||
|
|
||||||
|
std::queue<Poco::Net::StringPartSource*> mAdditionalStringPartSrcs;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
#include "../lib/JsonRequest.h"
|
#include "../lib/JsonRequest.h"
|
||||||
|
|
||||||
|
#include "../controller/User.h"
|
||||||
|
|
||||||
|
|
||||||
#include "sodium.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
|
// check if user with that email already exist
|
||||||
|
|
||||||
auto dbConnection = ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
|
auto dbConnection = ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
|
||||||
Poco::Data::Statement select(dbConnection);
|
Poco::Data::Statement select(dbConnection);
|
||||||
select << "SELECT email from users where email = ?;", useRef(email);
|
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());
|
mSessionUser = new User(email.data(), first_name.data(), last_name.data());
|
||||||
|
mNewUser = controller::User::create(email, first_name, last_name);
|
||||||
updateTimeout();
|
updateTimeout();
|
||||||
|
|
||||||
// Prepare E-Mail
|
// Prepare E-Mail
|
||||||
UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler));
|
//UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler));
|
||||||
prepareEmail->scheduleTask(prepareEmail);
|
//prepareEmail->scheduleTask(prepareEmail);
|
||||||
|
|
||||||
// create user crypto key
|
// create user crypto key
|
||||||
UniLib::controller::TaskPtr cryptoKeyTask(new UserCreateCryptoKey(mSessionUser, password, ServerConfig::g_CryptoCPUScheduler));
|
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);
|
writeUserIntoDB->scheduleTask(writeUserIntoDB);
|
||||||
|
|
||||||
createEmailVerificationCode();
|
createEmailVerificationCode();
|
||||||
|
auto emailVerificationCodeObject = controller::EmailVerificationCode::create();
|
||||||
|
emailVerificationCodeObject->getModel()->setCode(mEmailVerificationCode);
|
||||||
|
|
||||||
UniLib::controller::TaskPtr writeEmailVerification(new WriteEmailVerification(mSessionUser, mEmailVerificationCode, ServerConfig::g_CPUScheduler, 1));
|
UniLib::controller::TaskPtr writeEmailVerification(new WriteEmailVerification(mSessionUser, mEmailVerificationCode, ServerConfig::g_CPUScheduler, 1));
|
||||||
writeEmailVerification->setParentTaskPtrInArray(writeUserIntoDB, 0);
|
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
|
// 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");
|
Poco::Net::MediaType mt("text", "plain");
|
||||||
mt.setParameter("charset", "utf-8");
|
mt.setParameter("charset", "utf-8");
|
||||||
message->setContentType(mt);
|
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()));
|
message->addContent(new Poco::Net::StringPartSource(ss.str()));
|
||||||
|
*/
|
||||||
UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1));
|
//UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1));
|
||||||
sendEmail->setParentTaskPtrInArray(prepareEmail, 0);
|
//Email(AutoPtr<controller::EmailVerificationCode> emailVerification, AutoPtr<controller::User> user, EmailType type);
|
||||||
sendEmail->setParentTaskPtrInArray(writeEmailVerification, 1);
|
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->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_EMAIL_VERIFICATION_SEND, this));
|
||||||
sendEmail->scheduleTask(sendEmail);
|
sendEmail->scheduleTask(sendEmail);
|
||||||
|
|
||||||
|
|
||||||
// write user into db
|
// write user into db
|
||||||
// generate and write email verification into db
|
// generate and write email verification into db
|
||||||
// send email
|
// send email
|
||||||
|
|||||||
@ -12,6 +12,12 @@ namespace model {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EmailOptIn::EmailOptIn(const Poco::UInt64& code)
|
||||||
|
: mUserId(0), mEmailVerificationCode(code)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
EmailOptIn::EmailOptIn()
|
EmailOptIn::EmailOptIn()
|
||||||
: mUserId(0), mEmailVerificationCode(0)
|
: mUserId(0), mEmailVerificationCode(0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -12,6 +12,7 @@ namespace model {
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EmailOptIn(const Poco::UInt64& code, int user_id);
|
EmailOptIn(const Poco::UInt64& code, int user_id);
|
||||||
|
EmailOptIn(const Poco::UInt64& code);
|
||||||
EmailOptIn();
|
EmailOptIn();
|
||||||
~EmailOptIn();
|
~EmailOptIn();
|
||||||
|
|
||||||
|
|||||||
@ -2,21 +2,33 @@
|
|||||||
#include "PrepareEmailTask.h"
|
#include "PrepareEmailTask.h"
|
||||||
#include "../lib/Profiler.h"
|
#include "../lib/Profiler.h"
|
||||||
#include "../SingletonManager/ErrorManager.h"
|
#include "../SingletonManager/ErrorManager.h"
|
||||||
|
#include "../SingletonManager/EmailManager.h"
|
||||||
#include "../ServerConfig.h"
|
#include "../ServerConfig.h"
|
||||||
|
|
||||||
#include "Poco/Net/MediaType.h"
|
#include "Poco/Net/MediaType.h"
|
||||||
|
|
||||||
SendEmailTask::SendEmailTask(Poco::Net::MailMessage* mailMessage, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount/* = 0*/)
|
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()
|
SendEmailTask::~SendEmailTask()
|
||||||
{
|
{
|
||||||
if (mMailMessage) {
|
if (mMailMessage) {
|
||||||
delete mMailMessage;
|
delete mMailMessage;
|
||||||
mMailMessage = nullptr;
|
mMailMessage = nullptr;
|
||||||
}
|
}
|
||||||
|
if (mEmail) {
|
||||||
|
delete mEmail;
|
||||||
|
mEmail = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int SendEmailTask::run()
|
int SendEmailTask::run()
|
||||||
@ -27,17 +39,25 @@ int SendEmailTask::run()
|
|||||||
auto er = ErrorManager::getInstance();
|
auto er = ErrorManager::getInstance();
|
||||||
auto parent = getParent(0);
|
auto parent = getParent(0);
|
||||||
|
|
||||||
if (strcmp(parent->getResourceType(), "PrepareEmailTask") != 0) {
|
if (mMailMessage) {
|
||||||
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)) {
|
if (strcmp(parent->getResourceType(), "PrepareEmailTask") != 0) {
|
||||||
er->sendErrorsAsEmail();
|
er->addError(new Error("SendEmailTask", "first parent isn't PrepareEmailTask"));
|
||||||
return -1;
|
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());
|
//printf("[SendEmailTask] time: %s\n", timeUsed.string().data());
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -4,6 +4,8 @@
|
|||||||
#include "CPUTask.h"
|
#include "CPUTask.h"
|
||||||
#include "Poco/Net/MailMessage.h"
|
#include "Poco/Net/MailMessage.h"
|
||||||
|
|
||||||
|
#include "../model/Email.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @author: Dario Rekowski
|
* @author: Dario Rekowski
|
||||||
*
|
*
|
||||||
@ -17,6 +19,7 @@ class SendEmailTask : public UniLib::controller::CPUTask
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
SendEmailTask(Poco::Net::MailMessage* mailMessage, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount = 0);
|
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 ~SendEmailTask();
|
||||||
|
|
||||||
virtual int run();
|
virtual int run();
|
||||||
@ -26,7 +29,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Poco::Net::MailMessage* mMailMessage;
|
Poco::Net::MailMessage* mMailMessage;
|
||||||
|
model::Email* mEmail;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -165,6 +165,8 @@ int SigningTransaction::run() {
|
|||||||
return -9;
|
return -9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//sendErrorsAsEmail("<html><head><title>Hallo</title></head><body><font color='red'>Rote Test </font></body>");
|
||||||
|
|
||||||
Poco::JSON::Object object = *parsedJson.extract<Poco::JSON::Object::Ptr>();
|
Poco::JSON::Object object = *parsedJson.extract<Poco::JSON::Object::Ptr>();
|
||||||
auto state = object.get("state");
|
auto state = object.get("state");
|
||||||
std::string stateString = state.convert<std::string>();
|
std::string stateString = state.convert<std::string>();
|
||||||
|
|||||||
@ -67,7 +67,10 @@ namespace UniLib {
|
|||||||
//int status = SDL_CondWait(t->condition, t->mutex);
|
//int status = SDL_CondWait(t->condition, t->mutex);
|
||||||
try {
|
try {
|
||||||
condition.wait(mutex);
|
condition.wait(mutex);
|
||||||
if (exitCalled) return;
|
if (exitCalled) {
|
||||||
|
threadUnlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
int ret = ThreadFunction();
|
int ret = ThreadFunction();
|
||||||
threadUnlock();
|
threadUnlock();
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user