diff --git a/src/cpp/HTTPInterface/CheckEmailPage.cpp b/src/cpp/HTTPInterface/CheckEmailPage.cpp index 557e737bd..29b426732 100644 --- a/src/cpp/HTTPInterface/CheckEmailPage.cpp +++ b/src/cpp/HTTPInterface/CheckEmailPage.cpp @@ -14,6 +14,7 @@ enum PageState { MAIL_NOT_SEND, ASK_VERIFICATION_CODE, + EMAIL_ACTIVATED, KONTO_ALREADY_EXIST }; #line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp" @@ -35,7 +36,7 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: if (_compressResponse) response.set("Content-Encoding", "gzip"); Poco::Net::HTMLForm form(request, request.stream()); -#line 18 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" +#line 19 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" const char* pageName = "Email Verification"; auto lm = LanguageManager::getInstance(); @@ -44,36 +45,45 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: auto langCatalog = lm->getFreeCatalog(lang); unsigned long long verificationCode = 0; - if(!form.empty()) { - auto langBtn = form.get("lang-btn", ""); - auto verficationCodeStr = form.get("email-verification-code", "0"); - try { - verificationCode = stoull(verficationCodeStr); - } catch(...) { - verificationCode = 0; - } - auto updatedLang = LANG_NULL; - if(langBtn != "") { - lang = chooseLanguage(request, langBtn); - langCatalog = lm->getFreeCatalog(lang); - } - } - - // remove old cookies if exist - auto sm = SessionManager::getInstance(); - sm->deleteLoginCookies(request, response, mSession); PageState state = ASK_VERIFICATION_CODE; - if(mSession) { - getErrors(mSession); - if(mSession->getSessionState() < SESSION_STATE_EMAIL_VERIFICATION_SEND) { - //state = MAIL_NOT_SEND; + + if(mSession && model::table::EMAIL_OPT_IN_REGISTER_DIRECT == mSession->getEmailVerificationType()) + { + state = EMAIL_ACTIVATED; + } + else + { + + if(!form.empty()) { + auto langBtn = form.get("lang-btn", ""); + auto verficationCodeStr = form.get("email-verification-code", "0"); + try { + verificationCode = stoull(verficationCodeStr); + } catch(...) { + verificationCode = 0; + } + auto updatedLang = LANG_NULL; + if(langBtn != "") { + lang = chooseLanguage(request, langBtn); + langCatalog = lm->getFreeCatalog(lang); + } + } + + // remove old cookies if exist + auto sm = SessionManager::getInstance(); + sm->deleteLoginCookies(request, response, mSession); + + if(mSession) { + getErrors(mSession); + if(mSession->getSessionState() < SESSION_STATE_EMAIL_VERIFICATION_SEND) { + //state = MAIL_NOT_SEND; + } + } + auto hasErrors = errorCount() > 0; + if(!verificationCode) { + verificationCode = getLastGetAsU64(request.getURI()); } } - auto hasErrors = errorCount() > 0; - if(!verificationCode) { - verificationCode = getLastGetAsU64(request.getURI()); - } - #line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp" bool withMaterialIcons = false; @@ -130,20 +140,20 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "
\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << " \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"; @@ -155,25 +165,25 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "
\n"; responseStream << "
\n"; responseStream << " "; -#line 73 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" +#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << " \n"; @@ -182,69 +192,89 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "
\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << "
\n"; + responseStream << "\t\t\t\t"; +#line 105 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" + if(EMAIL_ACTIVATED == state) { responseStream << "\n"; + responseStream << "\t\t\t\t\t

"; +#line 106 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" + responseStream << ( langCatalog->gettext("Deine E-Mail wurde erfolgreich bestätigt. Du kannst nun Gradidos versenden.") ); + responseStream << "

\n"; + responseStream << "\t\t\t\t\t
"; +#line 107 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" + responseStream << ( langCatalog->gettext("Zur Startseite") ); + responseStream << "\n"; + responseStream << "\t\t\t\t"; +#line 108 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" + } else { responseStream << "\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << " gettext("Email Verification Code")); responseStream << "\" "; -#line 98 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" +#line 112 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" if(verificationCode) { responseStream << "value=\""; -#line 98 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" +#line 112 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" responseStream << ( verificationCode ); responseStream << "\" "; -#line 98 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" +#line 112 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" } responseStream << ">\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << "
\n"; responseStream << " \n"; responseStream << " \n"; responseStream << "

\n"; responseStream << "\t\t\t\t"; -#line 108 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" +#line 122 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" responseStream << ( langCatalog->gettext("Funktioniert dein E-Mail Verification Code nicht?")); responseStream << "
\n"; responseStream << "\t\t\t\t"; -#line 109 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" +#line 123 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" responseStream << ( langCatalog->gettext("Schicke uns eine E-Mail und wir kümmern uns darum: ")); responseStream << "
\n"; responseStream << " "; -#line 110 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" +#line 124 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" responseStream << ( langCatalog->gettext("E-Mail an Support schicken")); responseStream << "\n"; responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t "; +#line 126 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp" + } responseStream << "\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << "
\n"; diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp index 9a5eb43c3..b447fd8a6 100644 --- a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp @@ -367,8 +367,13 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::handleCheckEmail(Sessi if (0 == retUpdateEmailVerification) { //printf("[PageRequestHandlerFactory::handleCheckEmail] timeUsed: %s\n", timeUsed.string().data()); + SessionHTTPRequestHandler* pageRequestHandler = nullptr; + if (model::table::EMAIL_OPT_IN_REGISTER_DIRECT == session->getEmailVerificationType()) { + pageRequestHandler = new CheckEmailPage(session); + } else { + pageRequestHandler = new PassphrasePage(session); + } - auto pageRequestHandler = new PassphrasePage(session); pageRequestHandler->setProfiler(timeUsed); return pageRequestHandler; diff --git a/src/cpp/model/Session.cpp b/src/cpp/model/Session.cpp index f6f448584..2c020b840 100644 --- a/src/cpp/model/Session.cpp +++ b/src/cpp/model/Session.cpp @@ -422,62 +422,66 @@ bool Session::ifUserExist(const std::string& email) int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) { const static char* funcName = "Session::updateEmailVerification"; - lock(funcName); + + Poco::ScopedLock _lock(mWorkMutex); Profiler usedTime; auto em = ErrorManager::getInstance(); if (mEmailVerificationCodeObject.isNull()) { em->addError(new Error(funcName, "email verification object is zero")); em->sendErrorsAsEmail(); - unlock(); + return -2; } - auto emailVerificationCodeModel = mEmailVerificationCodeObject->getModel(); - if(emailVerificationCodeModel->getCode() == emailVerificationCode) { + auto email_verification_code_model = mEmailVerificationCodeObject->getModel(); + if(email_verification_code_model->getCode() == emailVerificationCode) { if (mSessionUser && mSessionUser->getDBId() == 0) { //addError(new Error("E-Mail Verification", "Benutzer wurde nicht richtig gespeichert, bitte wende dich an den Server-Admin")); em->addError(new Error(funcName, "user exist with 0 as id")); em->sendErrorsAsEmail(); - unlock(); + //return false; return -2; } // load correct user from db - if (mNewUser.isNull() || mNewUser->getModel()->getID() != emailVerificationCodeModel->getUserId()) { + if (mNewUser.isNull() || mNewUser->getModel()->getID() != email_verification_code_model->getUserId()) { mNewUser = controller::User::create(); - if (1 != mNewUser->load(emailVerificationCodeModel->getUserId())) { - em->addError(new ParamError(funcName, "user load didn't return 1 with user_id ", emailVerificationCodeModel->getUserId())); + if (1 != mNewUser->load(email_verification_code_model->getUserId())) { + em->addError(new ParamError(funcName, "user load didn't return 1 with user_id ", email_verification_code_model->getUserId())); em->sendErrorsAsEmail(); - unlock(); + return -2; } } - auto userModel = mNewUser->getModel(); - bool firstEmailActivation = false; - if (emailVerificationCodeModel->getType() == model::table::EMAIL_OPT_IN_REGISTER || emailVerificationCodeModel->getType() == model::table::EMAIL_OPT_IN_EMPTY) { - firstEmailActivation = true; + auto user_model = mNewUser->getModel(); + bool first_email_activation = false; + auto verification_type = email_verification_code_model->getType(); + if (model::table::EMAIL_OPT_IN_REGISTER == verification_type || + model::table::EMAIL_OPT_IN_EMPTY == verification_type || + model::table::EMAIL_OPT_IN_REGISTER_DIRECT == verification_type) { + first_email_activation = true; } - if (firstEmailActivation && userModel->isEmailChecked()) { + if (first_email_activation && user_model->isEmailChecked()) { mSessionUser = new User(mNewUser); addError(new Error(gettext("E-Mail Verification"), gettext("Du hast dein Konto bereits aktiviert!")), false); - unlock(); + return 1; } - if (firstEmailActivation) { - userModel->setEmailChecked(true); - userModel->updateIntoDB("email_checked", 1); - if (userModel->errorCount() > 0) { - userModel->sendErrorsAsEmail(); + if (first_email_activation) { + user_model->setEmailChecked(true); + user_model->updateIntoDB("email_checked", 1); + if (user_model->errorCount() > 0) { + user_model->sendErrorsAsEmail(); } - unlock(); + updateState(SESSION_STATE_EMAIL_VERIFICATION_CODE_CHECKED); return 0; } - if (emailVerificationCodeModel->getType() == model::table::EMAIL_OPT_IN_RESET_PASSWORD) { - unlock(); + if (email_verification_code_model->getType() == model::table::EMAIL_OPT_IN_RESET_PASSWORD) { + if (mEmailVerificationCodeObject->deleteFromDB()) { mEmailVerificationCodeObject.assign(nullptr); } @@ -493,7 +497,7 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) em->addError(new Error(funcName, "invalid code path")); em->sendErrorsAsEmail(); - unlock(); + return -2; /*if (updated_rows == 1) { @@ -522,11 +526,11 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) else { addError(new Error(gettext("E-Mail Verification"), gettext("Falscher Code für aktiven Login"))); //printf("[%s] time: %s\n", funcName, usedTime.string().data()); - unlock(); + return -1; } //printf("[%s] time: %s\n", funcName, usedTime.string().data()); - unlock(); + return 0; } diff --git a/src/cpp/model/Session.h b/src/cpp/model/Session.h index 6aec94671..6cf1a0cb7 100644 --- a/src/cpp/model/Session.h +++ b/src/cpp/model/Session.h @@ -142,6 +142,10 @@ public: inline SessionStates getSessionState() { SessionStates s; lock("Session::getSessionState"); s = mState; unlock(); return s; } inline Poco::UInt64 getEmailVerificationCode() { if (mEmailVerificationCodeObject.isNull()) return 0; return mEmailVerificationCodeObject->getModel()->getCode(); } + inline model::table::EmailOptInType getEmailVerificationType() { + if (mEmailVerificationCodeObject.isNull()) return model::table::EMAIL_OPT_IN_EMPTY; + return mEmailVerificationCodeObject->getModel()->getType(); + } inline bool isActive() { bool bret = false; lock("Session::isActive"); bret = mActive; unlock(); return bret; } inline void setActive(bool active) { lock("Sessions::setActive"); mActive = active; unlock(); } diff --git a/src/cpsp/checkEmail.cpsp b/src/cpsp/checkEmail.cpsp index bdbb7c872..19383676c 100644 --- a/src/cpsp/checkEmail.cpsp +++ b/src/cpsp/checkEmail.cpsp @@ -12,6 +12,7 @@ enum PageState { MAIL_NOT_SEND, ASK_VERIFICATION_CODE, + EMAIL_ACTIVATED, KONTO_ALREADY_EXIST }; %> @@ -23,36 +24,45 @@ enum PageState auto langCatalog = lm->getFreeCatalog(lang); unsigned long long verificationCode = 0; - if(!form.empty()) { - auto langBtn = form.get("lang-btn", ""); - auto verficationCodeStr = form.get("email-verification-code", "0"); - try { - verificationCode = stoull(verficationCodeStr); - } catch(...) { - verificationCode = 0; - } - auto updatedLang = LANG_NULL; - if(langBtn != "") { - lang = chooseLanguage(request, langBtn); - langCatalog = lm->getFreeCatalog(lang); - } - } - - // remove old cookies if exist - auto sm = SessionManager::getInstance(); - sm->deleteLoginCookies(request, response, mSession); PageState state = ASK_VERIFICATION_CODE; - if(mSession) { - getErrors(mSession); - if(mSession->getSessionState() < SESSION_STATE_EMAIL_VERIFICATION_SEND) { - //state = MAIL_NOT_SEND; + + if(mSession && model::table::EMAIL_OPT_IN_REGISTER_DIRECT == mSession->getEmailVerificationType()) + { + state = EMAIL_ACTIVATED; + } + else + { + + if(!form.empty()) { + auto langBtn = form.get("lang-btn", ""); + auto verficationCodeStr = form.get("email-verification-code", "0"); + try { + verificationCode = stoull(verficationCodeStr); + } catch(...) { + verificationCode = 0; + } + auto updatedLang = LANG_NULL; + if(langBtn != "") { + lang = chooseLanguage(request, langBtn); + langCatalog = lm->getFreeCatalog(lang); + } + } + + // remove old cookies if exist + auto sm = SessionManager::getInstance(); + sm->deleteLoginCookies(request, response, mSession); + + if(mSession) { + getErrors(mSession); + if(mSession->getSessionState() < SESSION_STATE_EMAIL_VERIFICATION_SEND) { + //state = MAIL_NOT_SEND; + } + } + auto hasErrors = errorCount() > 0; + if(!verificationCode) { + verificationCode = getLastGetAsU64(request.getURI()); } } - auto hasErrors = errorCount() > 0; - if(!verificationCode) { - verificationCode = getLastGetAsU64(request.getURI()); - } - %><%@ include file="header.cpsp" %>
@@ -92,6 +102,10 @@ enum PageState
+ <% if(EMAIL_ACTIVATED == state) { %> +

<%= langCatalog->gettext("Deine E-Mail wurde erfolgreich bestätigt. Du kannst nun Gradidos versenden.") %>

+ <%= langCatalog->gettext("Zur Startseite") %> + <% } else { %>
@@ -109,6 +123,7 @@ enum PageState <%= langCatalog->gettext("Schicke uns eine E-Mail und wir kümmern uns darum: ")%>
<%= langCatalog->gettext("E-Mail an Support schicken")%>

+ <% } %>