diff --git a/src/cpp/Crypto/KeyPair.cpp b/src/cpp/Crypto/KeyPair.cpp index 17cdfc778..51599780f 100644 --- a/src/cpp/Crypto/KeyPair.cpp +++ b/src/cpp/Crypto/KeyPair.cpp @@ -23,11 +23,14 @@ KeyPair::KeyPair() KeyPair::~KeyPair() { + printf("[KeyPair::~KeyPair] privkey: %d, soduium privkey: %d \n", mPrivateKey, mSodiumSecret); if (mPrivateKey) { delete mPrivateKey; + mPrivateKey = nullptr; } if (mSodiumSecret) { delete mSodiumSecret; + mSodiumSecret = nullptr; } } diff --git a/src/cpp/Gradido_LoginServer.cpp b/src/cpp/Gradido_LoginServer.cpp index a51369d44..be4277880 100644 --- a/src/cpp/Gradido_LoginServer.cpp +++ b/src/cpp/Gradido_LoginServer.cpp @@ -89,7 +89,7 @@ int Gradido_LoginServer::main(const std::vector& args) ServerConfig::initEMailAccount(config()); // start cpu scheduler - unsigned int worker_count = Poco::Environment::processorCount() * 2; + uint8_t worker_count = Poco::Environment::processorCount() * 2; ServerConfig::g_CPUScheduler = new UniLib::controller::CPUSheduler(worker_count, "Default Worker"); ServerConfig::g_CryptoCPUScheduler = new UniLib::controller::CPUSheduler(2, "Crypto Worker"); diff --git a/src/cpp/HTTPInterface/DashboardPage.cpp b/src/cpp/HTTPInterface/DashboardPage.cpp index 03bf092a1..67d238148 100644 --- a/src/cpp/HTTPInterface/DashboardPage.cpp +++ b/src/cpp/HTTPInterface/DashboardPage.cpp @@ -49,7 +49,10 @@ void DashboardPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N responseStream << "
\n"; responseStream << "\t

Willkommen "; #line 28 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\dashboard.cpsp" - responseStream << ( mSession->getUser()->getName() ); + responseStream << ( mSession->getUser()->getFirstName() ); + responseStream << " "; +#line 28 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\dashboard.cpsp" + responseStream << ( mSession->getUser()->getLastName() ); responseStream << "

\n"; responseStream << "\t"; #line 29 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\dashboard.cpsp" @@ -70,6 +73,14 @@ void DashboardPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N responseStream << "\t\n"; responseStream << "\t"; #line 38 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\dashboard.cpsp" + } else if(mSession->getSessionState() == SESSION_STATE_EMAIL_VERIFICATION_WRITTEN) { responseStream << "\n"; + responseStream << "\t

Hast du schon eine E-Mail mit einem Verification Code erhalten? Wenn ja kannst du ihn hier hinein kopieren:

\n"; + responseStream << "\t
\n"; + responseStream << "\t\t\n"; + responseStream << "\t\t\n"; + responseStream << "\t
\n"; + responseStream << "\t"; +#line 44 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\dashboard.cpsp" } responseStream << "\n"; responseStream << "\tAbmelden\n"; responseStream << "\tAccount löschen\n"; diff --git a/src/cpp/HTTPInterface/EmailOptInPage.cpp b/src/cpp/HTTPInterface/EmailOptInPage.cpp deleted file mode 100644 index b554e9084..000000000 --- a/src/cpp/HTTPInterface/EmailOptInPage.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "EmailOptInPage.h" -#include "Poco/Net/HTTPServerRequest.h" -#include "Poco/Net/HTTPServerResponse.h" -#include "Poco/Net/HTMLForm.h" -#include "Poco/DeflatingStream.h" - - -#line 4 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" - -#include "../SingletonManager/SessionManager.h" -#include "Poco/Net/HTTPCookie.h" - - -void EmailOptInPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) -{ - response.setChunkedTransferEncoding(true); - response.setContentType("text/html"); - bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); - if (_compressResponse) response.set("Content-Encoding", "gzip"); - - Poco::Net::HTMLForm form(request, request.stream()); -#line 8 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" - - auto session = SessionManager::getInstance()->getNewSession(); - bool userReturned = false; - if(!form.empty()) { - userReturned = session->createUser( - form.get("register-name"), - form.get("register-email"), - form.get("register-password") - ); - if(userReturned) { - auto cookie_id = session->getHandle(); - auto user_host = request.clientAddress().toString(); - printf("cookie: %d, user_host: %s\n", cookie_id, user_host.data()); - response.addCookie(Poco::Net::HTTPCookie("user", std::to_string(cookie_id))); - } - } - std::ostream& _responseStream = response.send(); - Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); - std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "Gradido Login Server: Email OptIn\n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "
\n"; - responseStream << "\t

Einen neuen Account anlegen

\n"; - responseStream << "\t"; -#line 46 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" - if(!form.empty() && userReturned) { responseStream << "\n"; - responseStream << "\t\t
\n"; - responseStream << "\t\t\t
\n"; - responseStream << "\t\t\t\tSchreibe dir den Merkspruch auf und packe ihn gut weg. Du brauchst ihn um deine Adresse wiederherzustellen. Wenn du ihn verlierst, sind auch deine Gradidos verloren.\n"; - responseStream << "\t\t\t
\n"; - responseStream << "\t\t\t
\n"; - responseStream << "\t\t\t\t"; -#line 52 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" - responseStream << ( session->getPassphrase() ); - responseStream << "\n"; - responseStream << "\t\t\t
\n"; - responseStream << "\t\t
\n"; - responseStream << "\t"; -#line 55 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" - } else { responseStream << "\n"; - responseStream << "\t
\n"; - responseStream << "\t\n"; - responseStream << "\t\t"; -#line 58 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" - if(!form.empty() && !userReturned) { responseStream << "\n"; - responseStream << "\t\t\t"; -#line 59 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" - responseStream << ( session->getErrorsHtml() ); - responseStream << "\n"; - responseStream << "\t\t"; -#line 60 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" -} responseStream << "\n"; - responseStream << "\t\t
\n"; - responseStream << "\t\t\tAccount anlegen\n"; - responseStream << "\t\t\t

Bitte gebe deine Daten um einen Account anzulegen

\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t

Hast du schonmal ein Gradido Konto besessen?

\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t

\n"; - responseStream << "\t\t\t\n"; - responseStream << "\t\t
\n"; - responseStream << "\t\t\n"; - responseStream << "\t\t\n"; - responseStream << "\t
\n"; - responseStream << "\t"; -#line 90 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\emailOptIn.cpsp" - } responseStream << "\n"; - responseStream << "
\n"; - responseStream << "\n"; - responseStream << "\n"; - if (_compressResponse) _gzipStream.close(); -} diff --git a/src/cpp/HTTPInterface/EmailOptInPage.h b/src/cpp/HTTPInterface/EmailOptInPage.h deleted file mode 100644 index 81f2a8236..000000000 --- a/src/cpp/HTTPInterface/EmailOptInPage.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef EmailOptInPage_INCLUDED -#define EmailOptInPage_INCLUDED - - -#include "Poco/Net/HTTPRequestHandler.h" - - -class EmailOptInPage: public Poco::Net::HTTPRequestHandler -{ -public: - void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); -}; - - -#endif // EmailOptInPage_INCLUDED diff --git a/src/cpp/model/Session.cpp b/src/cpp/model/Session.cpp index 24622bf57..4969c260e 100644 --- a/src/cpp/model/Session.cpp +++ b/src/cpp/model/Session.cpp @@ -214,7 +214,7 @@ bool Session::createUser(const std::string& first_name, const std::string& last_ message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, email)); message->setSubject("Gradido: E-Mail Verification"); std::stringstream ss; - ss << "Hallo " << name << "," << std::endl << std::endl; + ss << "Hallo " << first_name << " " << last_name << "," << std::endl << std::endl; ss << "Du oder jemand anderes hat sich soeben mit dieser E-Mail Adresse bei Gradido registriert. " << std::endl; ss << "Wenn du es warst, klicke bitte auf den Link: https://gradido2.dario-rekowski.de/account/checkEmail/" << mEmailVerificationCode << std::endl; ss << "oder kopiere den Code: " << mEmailVerificationCode << " selbst dort hinein." << std::endl << std::endl; @@ -356,10 +356,25 @@ void Session::detectSessionState() return; } if (!mSessionUser->isEmailChecked()) { - if (mEmailVerificationCode == 0) - updateState(SESSION_STATE_USER_WRITTEN); - else - updateState(SESSION_STATE_EMAIL_VERIFICATION_WRITTEN); + + if (mEmailVerificationCode == 0) { + auto dbConnection = ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); + Poco::Data::Statement select(dbConnection); + auto user_id = mSessionUser->getDBId(); + select << "SELECT verification_code from email_opt_in where user_id = ?", + into(mEmailVerificationCode), use(user_id); + try { + if (select.execute() == 1) { + updateState(SESSION_STATE_EMAIL_VERIFICATION_WRITTEN); + return; + } + } + catch (Poco::Exception& ex) { + printf("[Session::detectSessionState] mysql exception: %s\n", ex.displayText().data()); + } + } + + updateState(SESSION_STATE_USER_WRITTEN); return; } @@ -378,7 +393,7 @@ void Session::detectSessionState() } } catch (Poco::Exception& exc) { - printf("mysql exception: %s\n", exc.displayText().data()); + printf("[Session::detectSessionState] 2 mysql exception: %s\n", exc.displayText().data()); } if (mPassphrase != "") { updateState(SESSION_STATE_PASSPHRASE_GENERATED); @@ -425,10 +440,10 @@ bool Session::loadFromEmailVerificationCode(Poco::UInt64 emailVerificationCode) return false; }*/ Poco::Data::Statement select(dbConnection); - std::string email, name; + std::string email, first_name, last_name; select.reset(dbConnection); - select << "SELECT email, name FROM users where id = (SELECT user_id FROM email_opt_in WHERE verification_code=?)", - into(email), into(name), use(emailVerificationCode); + select << "SELECT email, first_name, last_name FROM users where id = (SELECT user_id FROM email_opt_in WHERE verification_code=?)", + into(email), into(first_name), into(last_name), use(emailVerificationCode); try { size_t rowCount = select.execute(); if (rowCount != 1) { @@ -440,7 +455,7 @@ bool Session::loadFromEmailVerificationCode(Poco::UInt64 emailVerificationCode) return false; } - mSessionUser = new User(email.data(), name.data()); + mSessionUser = new User(email.data(), first_name.data(), last_name.data()); mSessionUser->loadEntryDBId(ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER)); mEmailVerificationCode = emailVerificationCode; updateState(SESSION_STATE_EMAIL_VERIFICATION_WRITTEN); diff --git a/src/cpp/model/Session.h b/src/cpp/model/Session.h index 9292a033d..c3b5f8316 100644 --- a/src/cpp/model/Session.h +++ b/src/cpp/model/Session.h @@ -64,7 +64,9 @@ public: Poco::Net::HTTPCookie getLoginCookie(); - inline Poco::AutoPtr getUser() { return mSessionUser; } + Poco::AutoPtr getUser() { + return mSessionUser; + } inline int getHandle() { return mHandleId; } diff --git a/src/cpp/model/User.cpp b/src/cpp/model/User.cpp index 84d2d0801..7a0c79fb1 100644 --- a/src/cpp/model/User.cpp +++ b/src/cpp/model/User.cpp @@ -32,6 +32,9 @@ int UserCreateCryptoKey::run() mUser->setPwdHashed(pwdHashed); printf("crypto key created\n"); + setTaskFinished(); + // must poke cpu scheduler manually because another task is waiting for this task, but in the other scheduler + ServerConfig::g_CPUScheduler->checkPendingTasks(); return 0; } @@ -145,13 +148,14 @@ int UserWriteKeysIntoDB::run() // ******************************************************************************* // new user User::User(const char* email, const char* first_name, const char* last_name) - : mDBId(0), mEmail(email), mFirstName(first_name), mLastName(last_name), mPasswordHashed(0), mEmailChecked(false), mCryptoKey(nullptr) + : mDBId(0), mEmail(email), mFirstName(first_name), mLastName(last_name), mPasswordHashed(0), mEmailChecked(false), mCryptoKey(nullptr), + mReferenceCount(1) { } // load from db User::User(const char* email) - : mDBId(0), mEmail(email), mPasswordHashed(0), mEmailChecked(false), mCryptoKey(nullptr) + : mDBId(0), mEmail(email), mPasswordHashed(0), mEmailChecked(false), mCryptoKey(nullptr), mReferenceCount(1) { //crypto_shorthash(mPasswordHashed, (const unsigned char*)password, strlen(password), *ServerConfig::g_ServerCryptoKey); //memset(mPasswordHashed, 0, crypto_shorthash_BYTES); @@ -188,7 +192,7 @@ User::User(const char* email) User::~User() { - printf("[User::~User]\n"); +// printf("[User::~User]\n"); if (mCryptoKey) { delete mCryptoKey; mCryptoKey = nullptr; @@ -292,8 +296,13 @@ bool User::deleteFromDB() use(mDBId), use(mDBId), use(mDBId); */ for (int i = 0; i < 3; i++) { - if (i > 0) deleteFromDB.reset(session); - deleteFromDB << "DELETE from " << tables[i] << " where id = ?", use(mDBId); + if (i > 0) { + deleteFromDB.reset(session); + deleteFromDB << "DELETE from " << tables[i] << " where user_id = ?", use(mDBId); + } + else { + deleteFromDB << "DELETE from " << tables[i] << " where id = ?", use(mDBId); + } try { auto result = deleteFromDB.execute(); @@ -312,15 +321,23 @@ bool User::deleteFromDB() void User::duplicate() { + mWorkingMutex.lock(); mReferenceCount++; + //printf("[User::duplicate] new value: %d\n", mReferenceCount); + mWorkingMutex.unlock(); } void User::release() { + mWorkingMutex.lock(); mReferenceCount--; + //printf("[User::release] new value: %d\n", mReferenceCount); if (0 == mReferenceCount) { + mWorkingMutex.unlock(); delete this; + return; } + mWorkingMutex.unlock(); } @@ -368,6 +385,7 @@ bool User::generateKeys(bool savePrivkey, const std::string& passphrase, Session { Profiler timeUsed; + duplicate(); UniLib::controller::TaskPtr generateKeysTask(new UserGenerateKeys(this, passphrase)); //generateKeysTask->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_KEY_PAIR_GENERATED, session)); //generateKeysTask->scheduleTask(generateKeysTask); @@ -386,6 +404,7 @@ bool User::generateKeys(bool savePrivkey, const std::string& passphrase, Session return false; } + duplicate(); UniLib::controller::TaskPtr saveKeysTask(new UserWriteKeysIntoDB(generateKeysTask, this, savePrivkey)); saveKeysTask->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_KEY_PAIR_WRITTEN, session)); saveKeysTask->scheduleTask(saveKeysTask); diff --git a/src/cpp/tasks/Task.cpp b/src/cpp/tasks/Task.cpp index ae5e74b76..7c95c220c 100644 --- a/src/cpp/tasks/Task.cpp +++ b/src/cpp/tasks/Task.cpp @@ -17,6 +17,8 @@ namespace UniLib { Task::~Task() { + mWorkingMutex.lock(); + //printf("[Task::~Task]\n"); if (mParentTaskPtrArraySize) { delete[] mParentTaskPtrArray; } @@ -24,9 +26,11 @@ namespace UniLib { delete mFinishCommand; } mParentTaskPtrArraySize = 0; - mWorkingMutex.lock(); + mDeleted = true; + //printf("[Task::~Task] finished\n"); mWorkingMutex.unlock(); + } bool Task::isAllParentsReady() @@ -55,15 +59,23 @@ namespace UniLib { void Task::duplicate() { + lock(); mReferenceCount++; + //printf("[Task::duplicate] new value: %d\n", mReferenceCount); + unlock(); } void Task::release() { + lock(); mReferenceCount--; + //printf("[Task::release] new value: %d\n", mReferenceCount); if (0 == mReferenceCount) { + unlock(); delete this; + return; } + unlock(); } diff --git a/src/cpsp/dashboard.cpsp b/src/cpsp/dashboard.cpsp index 87d3b0dcc..556be065b 100644 --- a/src/cpsp/dashboard.cpsp +++ b/src/cpsp/dashboard.cpsp @@ -25,7 +25,7 @@
-

Willkommen <%= mSession->getUser()->getName() %>

+

Willkommen <%= mSession->getUser()->getFirstName() %> <%= mSession->getUser()->getLastName() %>

<%= mSession->getErrorsHtml() %>

Status

<%= mSession->getSessionStateString() %>

@@ -35,6 +35,12 @@ + <% } else if(mSession->getSessionState() == SESSION_STATE_EMAIL_VERIFICATION_WRITTEN) { %> +

Hast du schon eine E-Mail mit einem Verification Code erhalten? Wenn ja kannst du ihn hier hinein kopieren:

+
+ + +
<% } %> Abmelden Account löschen