diff --git a/src/cpp/HTTPInterface/LoginPage.cpp b/src/cpp/HTTPInterface/LoginPage.cpp index e0c722413..4e42aaf5c 100644 --- a/src/cpp/HTTPInterface/LoginPage.cpp +++ b/src/cpp/HTTPInterface/LoginPage.cpp @@ -52,6 +52,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: } if(!form.empty()) { + bool langUpdatedByBtn = false; auto langBtn = form.get("lang", ""); if(langBtn != "") { @@ -77,6 +78,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: if(email != "" && password != "") { //auto session = sm->getSession(request); + //if(!mSession) mSession = sm->findByEmail(email); if(!mSession) { mSession = sm->getNewSession(); mSession->setLanguageCatalog(langCatalog); @@ -98,7 +100,9 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: auto user = mSession->getNewUser(); if(userState >= USER_LOADED_FROM_DB && !user->getModel()->getPublicKey()) { - mSession->generateKeys(true, true); + if(mSession->generateKeys(true, true)) { + userState = USER_COMPLETE; + } } else { //printf("pubkey exist: %p\n",user->getModel()->getPublicKey()); } @@ -129,6 +133,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: refererString = referer->second; } if(lastExternReferer != "") { + //printf("redirect to: %s\n", lastExternReferer.data()); response.redirect(lastExternReferer); } else if(refererString != "" && refererString.find("login") == std::string::npos && @@ -139,6 +144,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: printf("request uri: %s, redirect to: %s\n", uri.data(), refererString.data()); response.redirect(refererString); } else { + //printf("redirect to: %s\n", ServerConfig::g_php_serverPath.data()); response.redirect(ServerConfig::g_php_serverPath + "/"); } return; @@ -149,6 +155,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: } } else { + // on enter login page with empty form //auto session = sm->getSession(request); // remove old cookies and session if exist @@ -225,20 +232,20 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: responseStream << "
\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << "\t\t\t\n"; responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t\t \n"; responseStream << "\t\t\t\t\"logo\"\n"; responseStream << "\t\t\t\n"; @@ -250,14 +257,14 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: responseStream << "
\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t\t"; -#line 168 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 175 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\t \n"; responseStream << "\t\t\t
\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << "\t\t\t \n"; responseStream << "\t\t\t "; @@ -297,51 +304,51 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: // end include flags.cpsp responseStream << "\n"; responseStream << "\t\t\t
\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << " gettext("E-Mail") ); responseStream << "\" value=\""; -#line 178 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 185 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" responseStream << ( presetEmail ); responseStream << "\"/>\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << " gettext("Password") ); responseStream << "\" />\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << "
\n"; responseStream << "\t\t\t\t\t\n"; diff --git a/src/cpp/HTTPInterface/ResetPassword.cpp b/src/cpp/HTTPInterface/ResetPassword.cpp index 78d10c055..1138e8412 100644 --- a/src/cpp/HTTPInterface/ResetPassword.cpp +++ b/src/cpp/HTTPInterface/ResetPassword.cpp @@ -87,11 +87,11 @@ void ResetPassword::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N } else { - if(user_exist && !user->tryLoadPassphraseUserBackup()) { + if(user_exist && (!user->tryLoadPassphraseUserBackup() || !user->hasPublicKey())) { sendUserEmail = true; } } - + printf("userExist: %d, sendUserEmail: %d\n", user_exist, sendUserEmail); if(!errorCount()) { // send reset password email @@ -99,6 +99,7 @@ void ResetPassword::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N if(user_exist) { result = session->sendResetPasswordEmail(user, sendUserEmail); } + printf("result: %d\n", result); if(2 == result) { state = PAGE_EMAIL_ALREADY_SEND; } else if(sendUserEmail) { @@ -227,34 +228,34 @@ void ResetPassword::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N responseStream << "\n"; responseStream << "\n"; responseStream << " "; -#line 124 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 125 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" if(state == PAGE_EMAIL_ASK) { responseStream << "\n"; responseStream << "\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
\n"; responseStream << "\t\t\n"; responseStream << "\t"; -#line 134 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 135 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" } else if(state == PAGE_ASK) { responseStream << "\n"; responseStream << "\t\t"; // begin include flags.cpsp @@ -293,35 +294,35 @@ void ResetPassword::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N // end include flags.cpsp responseStream << "\n"; responseStream << "\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\t \n"; responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\t
\n"; responseStream << "\t\t\t\t\t \n"; @@ -329,7 +330,7 @@ void ResetPassword::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N responseStream << "\t\t\t\t\t
\n"; responseStream << "\t\t\t\t\t \n"; @@ -337,45 +338,45 @@ void ResetPassword::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t \n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\n"; responseStream << "\t "; -#line 159 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 160 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" } else if(state == PAGE_WAIT_EMAIL) { responseStream << "\n"; responseStream << "\t\t\t"; -#line 160 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 161 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" responseStream << ( langCatalog->gettext("Dir wird eine E-Mail zugeschickt um dein Passwort zurückzusetzen.") ); responseStream << "\n"; responseStream << "\t "; -#line 161 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" } else if(state == PAGE_WAIT_ADMIN) { responseStream << "\n"; responseStream << "\t\t\t"; -#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 163 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" responseStream << ( langCatalog->gettext("Der Admin hat eine E-Mail bekommen und wird sich bei dir melden.") ); responseStream << "\n"; responseStream << "\t "; -#line 163 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 164 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" } else if(state == PAGE_EMAIL_ALREADY_SEND) { responseStream << "\n"; responseStream << "\t\t\t

"; -#line 164 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 165 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" responseStream << ( langCatalog->gettext("Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-Verzeichnis nach. ") ); responseStream << "

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

"; -#line 165 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 166 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" responseStream << ( langCatalog->gettext("Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten gewartet?") ); responseStream << "

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

"; -#line 166 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 167 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" responseStream << ( langCatalog->gettext("E-Mail an Support schicken")); responseStream << "

\n"; responseStream << "\t "; -#line 167 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" +#line 168 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" } responseStream << "\n"; responseStream << "
\n"; responseStream << "
\n"; diff --git a/src/cpp/SingletonManager/EmailManager.cpp b/src/cpp/SingletonManager/EmailManager.cpp index 2c83bebd9..ee62135e0 100644 --- a/src/cpp/SingletonManager/EmailManager.cpp +++ b/src/cpp/SingletonManager/EmailManager.cpp @@ -111,9 +111,11 @@ int EmailManager::ThreadFunction() if (email->draft(&mailMessage, catalogs[lang_code])) { mailClientSession.sendMessage(mailMessage); - // add for debugginh - auto user_model = email->getUser()->getModel(); - printf("send email to %s\n", user_model->getEmail().data()); + // add for debugging + if (email->getUser()) { + auto user_model = email->getUser()->getModel(); + printf("send email to %s\n", user_model->getEmail().data()); + } } else { // error drafting email, shouldn't happend diff --git a/src/cpp/SingletonManager/SessionManager.cpp b/src/cpp/SingletonManager/SessionManager.cpp index eb471c212..3b197613c 100644 --- a/src/cpp/SingletonManager/SessionManager.cpp +++ b/src/cpp/SingletonManager/SessionManager.cpp @@ -381,6 +381,53 @@ Session* SessionManager::findByUserId(int userId) return nullptr; } +std::vector SessionManager::findAllByUserId(int userId) +{ + assert(userId > 0); + std::vector result; + try { + Poco::Mutex::ScopedLock _lock(mWorkingMutex, 500); + } + catch (Poco::TimeoutException &ex) { + printf("[SessionManager::findAllByUserId] exception timout mutex: %s\n", ex.displayText().data()); + return result; + } + //mWorkingMutex.lock(); + for (auto it = mRequestSessionMap.begin(); it != mRequestSessionMap.end(); it++) { + auto user = it->second->getNewUser(); + if (userId == user->getModel()->getID()) { + //return it->second; + result.push_back(it->second); + } + } + //mWorkingMutex.unlock(); + + return result; +} + +Session* SessionManager::findByEmail(const std::string& email) +{ + assert(email.size() > 0); + + try { + Poco::Mutex::ScopedLock _lock(mWorkingMutex, 500); + } + catch (Poco::TimeoutException &ex) { + printf("[SessionManager::findByEmail] exception timout mutex: %s\n", ex.displayText().data()); + return nullptr; + } + //mWorkingMutex.lock(); + for (auto it = mRequestSessionMap.begin(); it != mRequestSessionMap.end(); it++) { + auto user = it->second->getNewUser(); + if (email == user->getModel()->getEmail()) { + return it->second; + } + } + //mWorkingMutex.unlock(); + + return nullptr; +} + void SessionManager::checkTimeoutSession() { diff --git a/src/cpp/SingletonManager/SessionManager.h b/src/cpp/SingletonManager/SessionManager.h index c50309da0..208de09be 100644 --- a/src/cpp/SingletonManager/SessionManager.h +++ b/src/cpp/SingletonManager/SessionManager.h @@ -57,7 +57,9 @@ public: Session* getSession(int handle); Session* getSession(const Poco::Net::HTTPServerRequest& request); Session* findByEmailVerificationCode(const Poco::UInt64& emailVerificationCode); + Session* findByEmail(const std::string& email); Session* findByUserId(int userId); + std::vector findAllByUserId(int userId); bool init(); void deinitalize(); @@ -89,6 +91,7 @@ protected: Poco::RegularExpression* mValidations[VALIDATE_MAX]; }; + class CheckSessionTimeouted : public UniLib::controller::CPUTask { public: diff --git a/src/cpp/controller/User.cpp b/src/cpp/controller/User.cpp index da5291052..9a8538ee5 100644 --- a/src/cpp/controller/User.cpp +++ b/src/cpp/controller/User.cpp @@ -368,6 +368,7 @@ namespace controller { if (scheduledResendTask == 3) continue; auto age = now - created; + //printf("age: %d\n", age.days()); // older than 7 days, schedule at once if (age.days() > 7 && !(scheduledResendTask & 1)) { UniLib::controller::TaskPtr verificationResendTask(new VerificationEmailResendTask(user_id)); diff --git a/src/cpp/model/Session.cpp b/src/cpp/model/Session.cpp index 42924319a..403c2ae19 100644 --- a/src/cpp/model/Session.cpp +++ b/src/cpp/model/Session.cpp @@ -471,6 +471,8 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) if (user_model->errorCount() > 0) { user_model->sendErrorsAsEmail(); } + + // no find all active sessions updateState(SESSION_STATE_EMAIL_VERIFICATION_CODE_CHECKED); return 0; diff --git a/src/cpp/model/table/ModelBase.h b/src/cpp/model/table/ModelBase.h index 0de56cee5..d055a0d07 100644 --- a/src/cpp/model/table/ModelBase.h +++ b/src/cpp/model/table/ModelBase.h @@ -195,10 +195,12 @@ namespace model { } catch (Poco::Exception& ex) { lock(); - addError(new ParamError(getTableName(), "mysql error by selecting", ex.displayText())); + addError(new ParamError(getTableName(), "mysql error by selecting, maybe more than one result?", ex.displayText())); + int count = 0; for (auto it = fieldNames.begin(); it != fieldNames.end(); it++) { addError(new ParamError(getTableName(), "field name for select: ", *it)); } + //addError(new ParamError(getTableName(), "field name for select: ", fieldName.data())); unlock(); } diff --git a/src/cpp/model/table/User.h b/src/cpp/model/table/User.h index 4cd24b72d..9fc48051c 100644 --- a/src/cpp/model/table/User.h +++ b/src/cpp/model/table/User.h @@ -75,7 +75,7 @@ namespace model { inline void setEmailChecked(bool emailChecked) { mEmailChecked = emailChecked; } inline void setLanguageKey(const std::string& languageKey) { mLanguageKey = languageKey; } - Poco::JSON::Object getJson(); + Poco::JSON::Object getJson(); protected: diff --git a/src/cpsp/login.cpsp b/src/cpsp/login.cpsp index 828bfd755..a63792968 100644 --- a/src/cpsp/login.cpsp +++ b/src/cpsp/login.cpsp @@ -31,6 +31,7 @@ } if(!form.empty()) { + bool langUpdatedByBtn = false; auto langBtn = form.get("lang", ""); if(langBtn != "") { @@ -56,6 +57,7 @@ if(email != "" && password != "") { //auto session = sm->getSession(request); + //if(!mSession) mSession = sm->findByEmail(email); if(!mSession) { mSession = sm->getNewSession(); mSession->setLanguageCatalog(langCatalog); @@ -77,7 +79,9 @@ auto user = mSession->getNewUser(); if(userState >= USER_LOADED_FROM_DB && !user->getModel()->getPublicKey()) { - mSession->generateKeys(true, true); + if(mSession->generateKeys(true, true)) { + userState = USER_COMPLETE; + } } else { //printf("pubkey exist: %p\n",user->getModel()->getPublicKey()); } @@ -108,6 +112,7 @@ refererString = referer->second; } if(lastExternReferer != "") { + //printf("redirect to: %s\n", lastExternReferer.data()); response.redirect(lastExternReferer); } else if(refererString != "" && refererString.find("login") == std::string::npos && @@ -118,6 +123,7 @@ printf("request uri: %s, redirect to: %s\n", uri.data(), refererString.data()); response.redirect(refererString); } else { + //printf("redirect to: %s\n", ServerConfig::g_php_serverPath.data()); response.redirect(ServerConfig::g_php_serverPath + "/"); } return; @@ -128,6 +134,7 @@ } } else { + // on enter login page with empty form //auto session = sm->getSession(request); // remove old cookies and session if exist diff --git a/src/cpsp/resetPassword.cpsp b/src/cpsp/resetPassword.cpsp index bdb48c251..1b423ce3c 100644 --- a/src/cpsp/resetPassword.cpsp +++ b/src/cpsp/resetPassword.cpsp @@ -70,7 +70,7 @@ enum PageState { } else { - if(user_exist && !user->tryLoadPassphraseUserBackup()) { + if(user_exist && (!user->tryLoadPassphraseUserBackup() || !user->hasPublicKey())) { sendUserEmail = true; } } @@ -82,6 +82,7 @@ enum PageState { if(user_exist) { result = session->sendResetPasswordEmail(user, sendUserEmail); } + if(2 == result) { state = PAGE_EMAIL_ALREADY_SEND; } else if(sendUserEmail) {