update checkEmail with new style, language and support e-mail link, adding language field to user

This commit is contained in:
Dario 2019-11-25 11:42:01 +01:00
parent f7f8d48c92
commit af2ae60f85
21 changed files with 337 additions and 158 deletions

View File

@ -8,6 +8,7 @@
#line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
#include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/LanguageManager.h"
enum PageState
{
@ -33,9 +34,29 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
if (_compressResponse) response.set("Content-Encoding", "gzip");
Poco::Net::HTMLForm form(request, request.stream());
#line 16 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
#line 17 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
const char* pageName = "Email Verification";
auto lm = LanguageManager::getInstance();
auto lang = chooseLanguage(request);
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();
@ -47,7 +68,10 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
//state = MAIL_NOT_SEND;
}
}
auto hasErrors = errorCount() > 0;
if(!verificationCode) {
verificationCode = getLastGetAsU64(request.getURI());
}
std::ostream& _responseStream = response.send();
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
@ -64,59 +88,21 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
#line 9 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( pageName );
responseStream << "</title>\n";
responseStream << "<!--<link rel=\"stylesheet\" type=\"text/css\" href=\"css/styles.min.css\">-->\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#line 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "/css/styles.css\">\n";
responseStream << "<style type=\"text/css\" >\n";
responseStream << ".grd_container\n";
responseStream << "{\n";
responseStream << " max-width:820px;\n";
responseStream << " margin-left:auto;\n";
responseStream << " margin-right:auto;\n";
responseStream << "}\n";
responseStream << "\n";
responseStream << "input:not([type='radio']) {\n";
responseStream << "\twidth:200px;\n";
responseStream << "}\n";
responseStream << "label:not(.grd_radio_label) {\n";
responseStream << "\twidth:80px;\n";
responseStream << "\tdisplay:inline-block;\n";
responseStream << "}\n";
responseStream << ".grd_container_small\n";
responseStream << "{\n";
responseStream << " max-width:500px;\n";
responseStream << "}\n";
responseStream << ".grd_text {\n";
responseStream << " max-width:550px;\n";
responseStream << " margin-bottom: 5px;\n";
responseStream << "}\n";
responseStream << ".dev-info {\n";
responseStream << "\tposition: fixed;\n";
responseStream << "\tcolor:grey;\n";
responseStream << "\tfont-size: smaller;\n";
responseStream << "\tleft:8px;\n";
responseStream << "}\n";
responseStream << ".grd-time-used { \n";
responseStream << " bottom:0;\n";
responseStream << "} \n";
responseStream << "\n";
responseStream << ".versionstring {\n";
responseStream << "\ttop:0;\n";
responseStream << "}\n";
responseStream << "</style>\n";
responseStream << "css/loginServer/style.css\">\n";
responseStream << "</head>\n";
responseStream << "<body>\n";
responseStream << "<div class=\"versionstring dev-info\">\n";
responseStream << "\t<p class=\"grd_small\">Login Server in Entwicklung</p>\n";
responseStream << "\t<p class=\"grd_small\">Alpha 0.6.0</p>\n";
responseStream << "\t<p class=\"grd_small\">Alpha 0.8.0</p>\n";
responseStream << "</div>\n";
responseStream << "<!--<nav class=\"grd-left-bar expanded\" data-topbar role=\"navigation\">\n";
responseStream << "\t<div class=\"grd-left-bar-section\">\n";
responseStream << "\t\t<ul class=\"grd-no-style\">\n";
responseStream << "\t\t <li><a href=\"";
#line 58 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#line 20 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "\" class=\"grd-nav-bn\">Startseite</a>\n";
responseStream << "\t\t <li><a href=\"./account/logout\" class=\"grd-nav-bn\">Logout</a></li>\n";
@ -125,50 +111,114 @@ void CheckEmailPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
responseStream << "</nav>-->";
// end include header.cpsp
responseStream << "\n";
responseStream << "<div class=\"grd_container\">\n";
responseStream << "\t\n";
responseStream << "\t<h1>Einen neuen Account anlegen</h1>\n";
responseStream << "\t";
#line 35 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << "<div class=\"authentication-theme auth-style_1\">\n";
responseStream << " <div class=\"row\">\n";
responseStream << " <div class=\"col-12 logo-section\">\n";
responseStream << " <a href=\"../../index.html\" class=\"logo\">\n";
responseStream << " <img src=\"";
#line 60 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.webp\" alt=\"logo\" />\n";
responseStream << " </a>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"row\">\n";
responseStream << " <div class=\"col-lg-5 col-md-7 col-sm-9 col-11 mx-auto\">\n";
responseStream << " <div class=\"grid\">\n";
responseStream << " <div class=\"center-ul-container\">\n";
responseStream << " ";
#line 68 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( getErrorsHtml() );
responseStream << "\n";
responseStream << "\t";
#line 36 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
if(state == MAIL_NOT_SEND) { responseStream << "\n";
responseStream << "\t\t<div class=\"grd_text\">\n";
responseStream << "\t\t\t<p>Die E-Mail wurde noch nicht verschickt, bitte habe noch etwas Geduld.</p>\n";
responseStream << "\t\t\t<p>Versuche es einfach in 1-2 Minuten erneut.</p>\n";
responseStream << "\t\t</div>\n";
responseStream << "\t";
#line 41 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
} else if(state == ASK_VERIFICATION_CODE) { responseStream << "\n";
responseStream << "\t<form method=\"GET\">\n";
responseStream << "\t\t<p>Bitte gebe deinen E-Mail Verification Code ein. </p>\n";
responseStream << "\t\t";
#line 44 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
if(mSession && !mSession->getUser().isNull()) { responseStream << "\n";
responseStream << "\t\t\t<p>Er wurde an deine E-Mail Adresse: ";
#line 45 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( mSession->getUser()->getEmail() );
responseStream << " gesendet.</p>\n";
responseStream << "\t\t";
#line 46 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
} responseStream << "\n";
responseStream << "\t\t<input type=\"number\" name=\"email-verification-code\">\n";
responseStream << "\t\t<input class=\"grd-form-bn grd-form-bn-succeed grd_clickable\" type=\"submit\" value=\"Überprüfe Code\">\n";
responseStream << "\t\t<p>Du hast bisher keinen Code erhalten? </p>\n";
responseStream << "\t\t<p>E-Mail erneut zuschicken (in Arbeit)</p>\n";
responseStream << "\t</form>\n";
responseStream << "\t";
#line 52 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
} else { responseStream << "\n";
responseStream << "\t<div class=\"grd_text\">\n";
responseStream << "\t\t\tUngültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende dich an den Server-Admin. \n";
responseStream << "\t\t</div>\n";
responseStream << "\t";
#line 56 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
} responseStream << "\n";
responseStream << "</div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"grid-body\">\n";
responseStream << " <form action=\"";
#line 71 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "account/checkEmail\" method=\"GET\">\n";
responseStream << " <div class=\"row pull-right-row\">\n";
responseStream << " <div class=\"equel-grid pull-right\">\n";
responseStream << " <div class=\"grid-body-small text-center\">\n";
responseStream << " <button id=\"flag-england\" name=\"lang-btn\" value=\"en\" title=\"English\" type=\"submit\" ";
#line 75 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
if(lang != LANG_EN) { responseStream << "class=\"btn btn-outline-secondary flag-btn\"";
#line 75 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
}
else { responseStream << "class=\"btn btn-secondary disabled flag-btn\" disabled";
#line 76 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
} responseStream << ">\n";
responseStream << " <span class=\"flag-england\"></span>\n";
responseStream << " </button>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"equel-grid pull-right\">\n";
responseStream << " <div class=\"grid-body-small text-center\">\n";
responseStream << " <button id=\"flag-germany\" name=\"lang-btn\" value=\"de\" title=\"Deutsch\" type=\"submit\" ";
#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
if(lang != LANG_DE) { responseStream << "class=\"btn btn-outline-secondary flag-btn\"";
#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
}
else { responseStream << "class=\"btn btn-secondary disabled flag-btn\" disabled";
#line 84 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
} responseStream << ">\n";
responseStream << " <span class=\"flag-germany\"></span>\n";
responseStream << " </button>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"item-wrapper\">\n";
responseStream << " <div class=\"form-group\">\n";
responseStream << " <label for=\"email-verification-code\">";
#line 92 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( langCatalog->gettext("Bitte gebe deinen E-Mail Verification Code ein:"));
responseStream << "</label>\n";
responseStream << " <input type=\"text\" class=\"form-control\" name=\"email-verification-code\" id=\"email-verification-code\" placeholder=\"";
#line 93 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( langCatalog->gettext("Email Verification Code"));
responseStream << "\" ";
#line 93 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
if(verificationCode) { responseStream << "value=\"";
#line 93 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( verificationCode );
responseStream << "\" ";
#line 93 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
} responseStream << ">\n";
responseStream << " </div>\n";
responseStream << " <button type=\"submit\" class=\"btn btn-sm btn-primary\">";
#line 95 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( langCatalog->gettext("&Uuml;berpr&uuml;fe Code"));
responseStream << "</button>\n";
responseStream << " </div>\n";
responseStream << " </form>\n";
responseStream << " <!--<p class=\"margin-top-10\">\n";
responseStream << "\t\t\t\t";
#line 99 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( langCatalog->gettext("Du hast bisher keinen Code erhalten?"));
responseStream << "<br> \n";
responseStream << "\t\t\t\t";
#line 100 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( langCatalog->gettext("E-Mail erneut zuschicken (in Arbeit)"));
responseStream << "\n";
responseStream << "\t\t\t </p>-->\n";
responseStream << " <p class=\"margin-top-10\">\n";
responseStream << "\t\t\t\t";
#line 103 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( langCatalog->gettext("Funktioniert dein E-Mail Verification Code nicht?"));
responseStream << "<br>\n";
responseStream << "\t\t\t\t";
#line 104 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp"
responseStream << ( langCatalog->gettext("Schicke mir eine E-Mail und ich kümmere mich darum: "));
responseStream << "<br>\n";
responseStream << " <a href=\"mailto:coin@gradido.net?subject=Invalid E-Mail Verification Code&amp;body=Hallo Dario,%0D%0A%0D%0Amein E-Mail Verification-Code: 121121354 funktioniert nicht,%0D%0Akannst du das prüfen?%0D%0A%0D%0AMit freundlichen Grüßen%0D%0A\">E-Mail</a>\n";
responseStream << "\t\t\t </p>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"auth_footer\">\n";
responseStream << " <p class=\"text-muted text-center\">© Gradido 2019</p>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
// begin include footer.cpsp
responseStream << "\t<div class=\"grd-time-used dev-info\">\n";
responseStream << "\t\t\t";

View File

@ -2,6 +2,7 @@
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/URI.h"
#include "Poco/Logger.h"
#include "Poco/Data/Binding.h"
using namespace Poco::Data::Keywords;
@ -102,7 +103,6 @@ void ElopageWebhook::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
return;
}
// write stream result also to file
static Poco::Mutex mutex;
@ -112,7 +112,9 @@ void ElopageWebhook::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
Poco::FileOutputStream file("elopage_webhook_requests.txt", std::ios::out | std::ios::app);
if (!file.good()) {
printf("[ElopageWebhook::handleRequest] error creating file with name: elopage_webhook_requests.txt\n");
Poco::Logger& logging(Poco::Logger::get("errorLog"));
logging.error("[ElopageWebhook::handleRequest] error creating file with name: elopage_webhook_requests.txt");
//printf("[ElopageWebhook::handleRequest] error creating file with name: elopage_webhook_requests.txt\n");
mutex.unlock();
return;
}
@ -172,6 +174,7 @@ void HandleElopageRequestTask::writeUserIntoDB()
use(mEmail), use(mFirstName), use(mLastName);
try {
insert.execute();
//printf("user written into db\n");
}
catch (Poco::Exception& ex) {
addError(new ParamError(__FUNCTION__, "mysql error", ex.displayText().data()));
@ -233,7 +236,7 @@ int HandleElopageRequestTask::run()
std::cerr << __FUNCTION__ << "Unknown error" << '\n';
}
std::string order_id = mRequestData.get("order_id", "");
addError(new ParamError("HandleElopageRequestTask", "order_id", order_id.data()));
auto param_error_order_id = new ParamError("HandleElopageRequestTask", "order_id", order_id.data());
// only for product 36001 and 43741 create user accounts and send emails
if (product_id == 36001 || product_id == 43741) {
@ -241,22 +244,25 @@ int HandleElopageRequestTask::run()
mFirstName = mRequestData.get("payer[first_name]", "");
mLastName = mRequestData.get("payer[last_name]", "");
printf("LastName: %s\n", mLastName.data());
/* printf("LastName: %s\n", mLastName.data());
for (int i = 0; i < mLastName.size(); i++) {
char c = mLastName.data()[i];
printf("%d ", c);
}
printf("\n\n");
*/
// validate input
if (!validateInput()) {
// if input is invalid we can stop now
addError(param_error_order_id);
sendErrorsAsEmail();
return -1;
}
// if user exist we can stop now
if (getUserIdFromDB()) {
addError(param_error_order_id);
sendErrorsAsEmail();
return -2;
}
@ -277,6 +283,7 @@ int HandleElopageRequestTask::run()
// we didn't get a user_id, something went wrong
if (!user_id) {
addError(new Error("User loadEntryDBId", "user_id is zero"));
addError(param_error_order_id);
sendErrorsAsEmail();
return -3;
}
@ -288,6 +295,7 @@ int HandleElopageRequestTask::run()
if (!emailVerification->getCode()) {
// exit if email verification code is empty
addError(new Error("Email verification", "code is empty, error in random?"));
addError(param_error_order_id);
sendErrorsAsEmail();
return -4;
}
@ -322,8 +330,10 @@ int HandleElopageRequestTask::run()
// if errors occured, send via email
if (errorCount() > 1) {
addError(param_error_order_id);
sendErrorsAsEmail();
}
delete param_error_order_id;
return 0;
}

View File

@ -9,6 +9,9 @@ class HandleFileRequest : public Poco::Net::HTTPRequestHandler
{
public:
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
protected:
};

View File

@ -136,7 +136,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::
responseStream << "<body>\n";
responseStream << "<div class=\"versionstring dev-info\">\n";
responseStream << "\t<p class=\"grd_small\">Login Server in Entwicklung</p>\n";
responseStream << "\t<p class=\"grd_small\">Alpha 0.7.0</p>\n";
responseStream << "\t<p class=\"grd_small\">Alpha 0.8.0</p>\n";
responseStream << "</div>\n";
responseStream << "<!--<nav class=\"grd-left-bar expanded\" data-topbar role=\"navigation\">\n";
responseStream << "\t<div class=\"grd-left-bar-section\">\n";
@ -256,10 +256,6 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::
responseStream << ( mTimeProfiler.string() );
responseStream << "\n";
responseStream << "\t</div>\n";
responseStream << "\t<script src=\"";
#line 4 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "js/core.js\"></script>\n";
responseStream << "</body>\n";
responseStream << "</html>";
// end include footer.cpsp

View File

@ -163,6 +163,7 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::handleCheckEmail(Sessi
{
Poco::Net::HTMLForm form(request);
unsigned long long verificationCode = 0;
Languages lang = LANG_DE;
// if verification code is valid, go to next page, passphrase
// login via verification code, if no session is active
@ -171,6 +172,7 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::handleCheckEmail(Sessi
try {
verificationCode = stoull(form.get("email-verification-code", "0"));
} catch (...) {}
lang = LanguageManager::languageFromString(form.get("lang-btn", "de"));
}
// try to get code from uri parameter
if (!verificationCode) {
@ -179,15 +181,15 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::handleCheckEmail(Sessi
auto str = uri.substr(pos + 1);
verificationCode = stoull(uri.substr(pos + 1));
} catch (const std::invalid_argument& ia) {
std::cerr << __FUNCTION__ << "Invalid argument: " << ia.what() << '\n';
std::cerr << __FUNCTION__ << " Invalid argument: " << ia.what() << ", str: " << uri.substr(pos + 1) << '\n';
} catch (const std::out_of_range& oor) {
std::cerr << __FUNCTION__ << "Out of Range error: " << oor.what() << '\n';
std::cerr << __FUNCTION__ << " Out of Range error: " << oor.what() << '\n';
}
catch (const std::logic_error & ler) {
std::cerr << __FUNCTION__ << "Logical error: " << ler.what() << '\n';
std::cerr << __FUNCTION__ << " Logical error: " << ler.what() << '\n';
}
catch (...) {
std::cerr << __FUNCTION__ << "Unknown error" << '\n';
std::cerr << __FUNCTION__ << " Unknown error" << '\n';
}
}
@ -211,6 +213,7 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::handleCheckEmail(Sessi
// no suitable session in memory, try to create one from db data
if (!session) {
session = sm->getNewSession();
session->setLanguage(lang);
if (session->loadFromEmailVerificationCode(verificationCode)) {
// login not possible in this function, forwarded to PassphrasePage
/*auto cookie_id = session->getHandle();

View File

@ -37,4 +37,31 @@ Languages PageRequestMessagedHandler::chooseLanguage(Poco::Net::HTTPServerReques
}
return lang;
}
unsigned long long PageRequestMessagedHandler::getLastGetAsU64(const std::string& uri)
{
unsigned long long result = 0;
size_t pos = uri.find_last_of("/");
try {
auto str = uri.substr(pos + 1);
result = stoull(uri.substr(pos + 1));
}
catch (const std::invalid_argument& ia) {
std::cerr << __FUNCTION__ << " Invalid argument: " << ia.what() << ", str: " << uri.substr(pos + 1) << '\n';
return 0;
}
catch (const std::out_of_range& oor) {
std::cerr << __FUNCTION__ << " Out of Range error: " << oor.what() << '\n';
return 0;
}
catch (const std::logic_error & ler) {
std::cerr << __FUNCTION__ << " Logical error: " << ler.what() << '\n';
return 0;
}
catch (...) {
std::cerr << __FUNCTION__ << " Unknown error" << '\n';
return 0;
}
return result;
}

View File

@ -25,7 +25,10 @@ protected:
inline const char* gettext(Session* session, const char* text) { if (!session || !session->getLanguageCatalog()) return text; return session->getLanguageCatalog()->gettext(text); }
Languages chooseLanguage(Poco::Net::HTTPServerRequest& request, std::string lang_btn = "");
unsigned long long getLastGetAsU64(const std::string& uri);
Profiler mTimeProfiler;
};

View File

@ -194,7 +194,7 @@ Poco::AutoPtr<LanguageCatalog> LanguageManager::getFreeCatalog(Languages lang)
if (lang >= LANG_COUNT) {
//printf("[LanguageManager::getFreeCatalog] invalid language: %d\n", lang);
mLogging.information("[LanguageManager::getFreeCatalog] invalid language: %d, set to default (%s)", (int)lang, filenameForLanguage(ServerConfig::g_default_locale));
//mLogging.information("[LanguageManager::getFreeCatalog] invalid language: %d, set to default (%s)", (int)lang, filenameForLanguage(ServerConfig::g_default_locale));
//return nullptr;
lang = ServerConfig::g_default_locale;
}

View File

@ -22,7 +22,7 @@ std::string Error::getString()
std::string Error::getHtmlString()
{
std::stringstream ss;
ss << mFunctionName << ": " << mMessage << std::endl;
ss << mFunctionName << ": " << mMessage;
return ss.str();
}

View File

@ -14,6 +14,8 @@ SendErrorMessage::~SendErrorMessage()
int SendErrorMessage::run()
{
//return 0;
auto mailClientSession = new Poco::Net::SecureSMTPClientSession(ServerConfig::g_EmailAccount.url, ServerConfig::g_EmailAccount.port);
mailClientSession->login();
mailClientSession->startTLS(ServerConfig::g_SSL_CLient_Context);

View File

@ -266,6 +266,7 @@ bool Session::updateEmailVerification(Poco::UInt64 emailVerificationCode)
}
if (mSessionUser) {
mSessionUser->setEmailChecked();
mSessionUser->setLanguage(getLanguage());
}
updateState(SESSION_STATE_EMAIL_VERIFICATION_CODE_CHECKED);
//printf("[%s] time: %s\n", funcName, usedTime.string().data());
@ -552,6 +553,7 @@ bool Session::loadFromEmailVerificationCode(Poco::UInt64 emailVerificationCode)
size_t rowCount = select.execute();
if (rowCount != 1) {
em->addError(new ParamError(funcName, "select user by email verification code work not like expected, selected row count", rowCount));
em->addError(new ParamError(funcName, "emailVerficiation Code: ", std::to_string(emailVerificationCode)));
em->sendErrorsAsEmail();
}
if (rowCount < 1) {
@ -560,6 +562,7 @@ bool Session::loadFromEmailVerificationCode(Poco::UInt64 emailVerificationCode)
}
mSessionUser = new User(user_id);
mSessionUser->setLanguage(getLanguage());
mEmailVerificationCode = emailVerificationCode;
updateState(SESSION_STATE_EMAIL_VERIFICATION_WRITTEN);
@ -567,7 +570,8 @@ bool Session::loadFromEmailVerificationCode(Poco::UInt64 emailVerificationCode)
return true;
}
catch (const Poco::Exception& ex) {
em->addError(new ParamError(funcName, "error selecting user from verification code", ex.displayText().data()));
em->addError(new ParamError(funcName, "exception selecting user from verification code", ex.displayText().data()));
em->addError(new ParamError(funcName, "emailVerficiation Code: ", std::to_string(emailVerificationCode)));
em->sendErrorsAsEmail();
}

View File

@ -174,14 +174,14 @@ int UserWriteCryptoKeyHashIntoDB::run()
// *******************************************************************************
// new user
User::User(const char* email, const char* first_name, const char* last_name)
: mState(USER_EMPTY), mDBId(0), mEmail(email), mFirstName(first_name), mLastName(last_name), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), mCryptoKey(nullptr),
: mState(USER_EMPTY), mDBId(0), mEmail(email), mFirstName(first_name), mLastName(last_name), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), mLanguage(LANG_DE), mCryptoKey(nullptr),
mReferenceCount(1)
{
memset(mPublicKey, 0, crypto_sign_PUBLICKEYBYTES);
}
// load from db
User::User(const char* email)
: mState(USER_EMPTY), mDBId(0), mEmail(email), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), mCryptoKey(nullptr), mReferenceCount(1)
: mState(USER_EMPTY), mDBId(0), mEmail(email), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), mLanguage(LANG_DE), mCryptoKey(nullptr), mReferenceCount(1)
{
//crypto_shorthash(mPasswordHashed, (const unsigned char*)password, strlen(password), *ServerConfig::g_ServerCryptoKey);
//memset(mPasswordHashed, 0, crypto_shorthash_BYTES);
@ -195,12 +195,15 @@ User::User(const char* email)
Poco::Data::Statement select(session);
int email_checked = 0;
select << "SELECT id, first_name, last_name, password, pubkey, privkey, email_checked from users where email = ?",
into(mDBId), into(mFirstName), into(mLastName), into(mPasswordHashed), into(pubkey), into(privkey), into(email_checked), use(mEmail);
std::string language_key;
select << "SELECT id, first_name, last_name, password, pubkey, privkey, email_checked, language from users where email = ?",
into(mDBId), into(mFirstName), into(mLastName), into(mPasswordHashed), into(pubkey), into(privkey), into(email_checked), into(language_key),
use(mEmail);
try {
auto result = select.execute();
if (result == 1) {
mState = USER_LOADED_FROM_DB;
mLanguage = LanguageManager::languageFromString(language_key);
if (email_checked == 0) { mState = USER_EMAIL_NOT_ACTIVATED;}
else if (pubkey.isNull()) { mState = USER_NO_KEYS;}
else if (privkey.isNull()) { mState = USER_NO_PRIVATE_KEY; }
@ -238,7 +241,7 @@ User::User(const char* email)
}
User::User(int user_id)
: mState(USER_EMPTY), mDBId(user_id), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), mCryptoKey(nullptr), mReferenceCount(1)
: mState(USER_EMPTY), mDBId(user_id), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), mLanguage(LANG_DE), mCryptoKey(nullptr), mReferenceCount(1)
{
auto cm = ConnectionManager::getInstance();
auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
@ -250,12 +253,15 @@ User::User(int user_id)
Poco::Data::Statement select(session);
int email_checked = 0;
select << "SELECT email, first_name, last_name, password, pubkey, privkey, email_checked from users where id = ?",
into(mEmail), into(mFirstName), into(mLastName), into(mPasswordHashed), into(pubkey), into(privkey), into(email_checked), use(user_id);
std::string language_key;
select << "SELECT email, first_name, last_name, password, pubkey, privkey, email_checked, language from users where id = ?",
into(mEmail), into(mFirstName), into(mLastName), into(mPasswordHashed), into(pubkey), into(privkey), into(email_checked), into(language_key),
use(user_id);
try {
auto result = select.execute();
if (result == 1) {
mState = USER_LOADED_FROM_DB;
mLanguage = LanguageManager::languageFromString(language_key);
if (email_checked == 0) { mState = USER_EMAIL_NOT_ACTIVATED; }
else if (pubkey.isNull()) { mState = USER_NO_KEYS; }
else if (privkey.isNull()) { mState = USER_NO_PRIVATE_KEY; }
@ -293,7 +299,7 @@ User::User(int user_id)
}
User::User(const unsigned char* pubkey_array)
: mState(USER_EMPTY), mDBId(0), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), mCryptoKey(nullptr), mReferenceCount(1)
: mState(USER_EMPTY), mDBId(0), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), mLanguage(LANG_DE), mCryptoKey(nullptr), mReferenceCount(1)
{
//crypto_shorthash(mPasswordHashed, (const unsigned char*)password, strlen(password), *ServerConfig::g_ServerCryptoKey);
//memset(mPasswordHashed, 0, crypto_shorthash_BYTES);
@ -306,13 +312,16 @@ User::User(const unsigned char* pubkey_array)
Poco::Nullable<Poco::Data::BLOB> privkey;
Poco::Data::Statement select(session);
int email_checked = 0;
select << "SELECT id, email, first_name, last_name, password, privkey, email_checked from users where pubkey = ?",
into(mDBId), into(mEmail), into(mFirstName), into(mLastName), into(mPasswordHashed), into(privkey), into(email_checked), use(pubkey);
int email_checked = 0;
std::string language_key;
select << "SELECT id, email, first_name, last_name, password, privkey, email_checked, language from users where pubkey = ?",
into(mDBId), into(mEmail), into(mFirstName), into(mLastName), into(mPasswordHashed), into(privkey), into(email_checked), into(language_key),
use(pubkey);
try {
auto result = select.execute();
if (result == 1) {
mState = USER_LOADED_FROM_DB;
mLanguage = LanguageManager::languageFromString(language_key);
if (email_checked == 0) { mState = USER_EMAIL_NOT_ACTIVATED; }
else if (privkey.isNull()) { mState = USER_NO_PRIVATE_KEY; }
else { mState = USER_COMPLETE; }
@ -831,13 +840,14 @@ Poco::Data::Statement User::insertIntoDB(Poco::Data::Session session)
//Poco::Data::BLOB pwd(&mPasswordHashed[0], crypto_shorthash_BYTES);
//printf("[User::insertIntoDB] password hashed: %llu\n", mPasswordHashed);
std::string languageKey = LanguageManager::keyForLanguage(mLanguage);
if (mPasswordHashed) {
insert << "INSERT INTO users (email, first_name, last_name, password) VALUES(?, ?, ?, ?);",
use(mEmail), use(mFirstName), use(mLastName), bind(mPasswordHashed);
insert << "INSERT INTO users (email, first_name, last_name, password, language) VALUES(?, ?, ?, ?, ?);",
use(mEmail), use(mFirstName), use(mLastName), bind(mPasswordHashed), bind(languageKey);
}
else {
insert << "INSERT INTO users (email, first_name, last_name) VALUES(?, ?, ?);",
use(mEmail), use(mFirstName), use(mLastName);
insert << "INSERT INTO users (email, first_name, last_name, language) VALUES(?, ?, ?, ?);",
use(mEmail), use(mFirstName), use(mLastName), bind(languageKey);
}
@ -862,6 +872,11 @@ bool User::updateIntoDB(UserFields fieldType)
update << "UPDATE users SET email_checked = ? where id = ?",
use(mEmailChecked), use(mDBId);
}
else if (USER_FIELDS_LANGUAGE == fieldType) {
std::string languageKey = LanguageManager::keyForLanguage(mLanguage);
update << "UPDATE users SET language = ? where id = ?",
bind(languageKey), use(mDBId);
}
try {
if (update.execute() == 1) return true;
addError(new ParamError("User::updateIntoDB", "update not affected 1 rows", fieldType));

View File

@ -13,12 +13,14 @@
#include "../SingletonManager/MemoryManager.h"
class UserCreateCryptoKey;
class UserWriteIntoDB;
class Session;
class UserWriteCryptoKeyHashIntoDB;
class SigningTransaction;
class UserGenerateKeys;
enum Languages;
enum UserStates
{
@ -37,7 +39,8 @@ enum UserFields
USER_FIELDS_FIRST_NAME,
USER_FIELDS_LAST_NAME,
USER_FIELDS_PASSWORD,
USER_FIELDS_EMAIL_CHECKED
USER_FIELDS_EMAIL_CHECKED,
USER_FIELDS_LANGUAGE
};
class User : public ErrorList
@ -81,11 +84,14 @@ public:
inline int getDBId() const { return mDBId; }
inline std::string getPublicKeyHex() { lock(); std::string pubkeyHex = mPublicHex; unlock(); return pubkeyHex; }
inline const unsigned char* getPublicKey() { return mPublicKey; }
inline Languages getLanguage() { lock(); Languages lang = mLanguage; unlock(); return lang; }
inline void setPublicKeyHex(const std::string& publicKeyHex) { lock(); mPublicHex = publicKeyHex; unlock(); }
inline void setPublicKey(const unsigned char* key) { lock(); memcpy(mPublicKey, key, crypto_sign_PUBLICKEYBYTES); unlock();}
UserStates getUserState();
void setLanguage(Languages lang) { lock(); mLanguage = lang; unlock(); }
void setEmailChecked();
bool isEmptyPassword();
bool setNewPassword(const std::string& newPassword);
@ -141,6 +147,7 @@ private:
// TODO: insert created if necessary
bool mEmailChecked;
Languages mLanguage;
// ************************ DB FIELDS END ******************************
// crypto key as obfus array

View File

@ -41,13 +41,14 @@ namespace UniLib {
std::string name = mWaitingTask->getName();
//l->addTaskLogEntry((HASH)mWaitingTask.getResourcePtrHolder(), mWaitingTask->getResourceType(), mName.data(), name);
#endif
if (!mWaitingTask->run()) {
int returnValue = mWaitingTask->run();
if (!returnValue) {
mWaitingTask->setTaskFinished();
}
#ifdef _UNI_LIB_DEBUG
//l->removeTaskLogEntry((HASH)mWaitingTask.getResourcePtrHolder());
mSpeedLog.information("%s used on thread: %s by Task: %s of: %s",
counter.string(), mName, std::string(mWaitingTask->getResourceType()), name);
mSpeedLog.information("%s used on thread: %s by Task: %s of: %s (returned: %d)",
counter.string(), mName, std::string(mWaitingTask->getResourceType()), name, returnValue);
#endif
mWaitingTask = mParent->getNextUndoneTask(this);
}

View File

@ -20,6 +20,7 @@ PrepareEmailTask::~PrepareEmailTask()
int PrepareEmailTask::run()
{
//return 0;
Profiler timeUsed;
mMailClientSession = new Poco::Net::SecureSMTPClientSession(ServerConfig::g_EmailAccount.url, ServerConfig::g_EmailAccount.port);
mMailClientSession->login();

View File

@ -21,6 +21,7 @@ SendEmailTask::~SendEmailTask()
int SendEmailTask::run()
{
//return 0;
Profiler timeUsed;
auto er = ErrorManager::getInstance();
auto parent = getParent(0);

View File

@ -6,6 +6,7 @@
<%@ page compressed="true" %>
<%!
#include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/LanguageManager.h"
enum PageState
{
@ -15,6 +16,26 @@ enum PageState
%>
<%%
const char* pageName = "Email Verification";
auto lm = LanguageManager::getInstance();
auto lang = chooseLanguage(request);
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();
@ -26,33 +47,69 @@ enum PageState
//state = MAIL_NOT_SEND;
}
}
auto hasErrors = errorCount() > 0;
if(!verificationCode) {
verificationCode = getLastGetAsU64(request.getURI());
}
%><%@ include file="header.cpsp" %>
<div class="grd_container">
<h1>Einen neuen Account anlegen</h1>
<%= getErrorsHtml() %>
<% if(state == MAIL_NOT_SEND) { %>
<div class="grd_text">
<p>Die E-Mail wurde noch nicht verschickt, bitte habe noch etwas Geduld.</p>
<p>Versuche es einfach in 1-2 Minuten erneut.</p>
</div>
<% } else if(state == ASK_VERIFICATION_CODE) { %>
<form method="GET">
<p>Bitte gebe deinen E-Mail Verification Code ein. </p>
<% if(mSession && !mSession->getUser().isNull()) {%>
<p>Er wurde an deine E-Mail Adresse: <%= mSession->getUser()->getEmail() %> gesendet.</p>
<% } %>
<input type="number" name="email-verification-code">
<input class="grd-form-bn grd-form-bn-succeed grd_clickable" type="submit" value="Überprüfe Code">
<p>Du hast bisher keinen Code erhalten? </p>
<p>E-Mail erneut zuschicken (in Arbeit)</p>
</form>
<% } else { %>
<div class="grd_text">
Ungültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende dich an den Server-Admin.
</div>
<% } %>
</div>
<div class="authentication-theme auth-style_1">
<div class="row">
<div class="col-12 logo-section">
<a href="../../index.html" class="logo">
<img src="<%= ServerConfig::g_php_serverPath %>img/logo_schrift.webp" alt="logo" />
</a>
</div>
</div>
<div class="row">
<div class="col-lg-5 col-md-7 col-sm-9 col-11 mx-auto">
<div class="grid">
<div class="center-ul-container">
<%= getErrorsHtml() %>
</div>
<div class="grid-body">
<form action="<%= ServerConfig::g_php_serverPath %>account/checkEmail" method="GET">
<div class="row pull-right-row">
<div class="equel-grid pull-right">
<div class="grid-body-small text-center">
<button id="flag-england" name="lang-btn" value="en" title="English" type="submit" <% if(lang != LANG_EN) { %>class="btn btn-outline-secondary flag-btn"<% }
else { %>class="btn btn-secondary disabled flag-btn" disabled<% } %>>
<span class="flag-england"></span>
</button>
</div>
</div>
<div class="equel-grid pull-right">
<div class="grid-body-small text-center">
<button id="flag-germany" name="lang-btn" value="de" title="Deutsch" type="submit" <% if(lang != LANG_DE) { %>class="btn btn-outline-secondary flag-btn"<% }
else { %>class="btn btn-secondary disabled flag-btn" disabled<% } %>>
<span class="flag-germany"></span>
</button>
</div>
</div>
</div>
<div class="item-wrapper">
<div class="form-group">
<label for="email-verification-code"><%= langCatalog->gettext("Bitte gebe deinen E-Mail Verification Code ein:")%></label>
<input type="text" class="form-control" name="email-verification-code" id="email-verification-code" placeholder="<%= langCatalog->gettext("Email Verification Code")%>" <% if(verificationCode) { %>value="<%= verificationCode %>" <% } %>>
</div>
<button type="submit" class="btn btn-sm btn-primary"><%= langCatalog->gettext("&Uuml;berpr&uuml;fe Code")%></button>
</div>
</form>
<!--<p class="margin-top-10">
<%= langCatalog->gettext("Du hast bisher keinen Code erhalten?")%><br>
<%= langCatalog->gettext("E-Mail erneut zuschicken (in Arbeit)")%>
</p>-->
<p class="margin-top-10">
<%= langCatalog->gettext("Funktioniert dein E-Mail Verification Code nicht?")%><br>
<%= langCatalog->gettext("Schicke mir eine E-Mail und ich kümmere mich darum: ")%><br>
<a href="mailto:coin@gradido.net?subject=Invalid E-Mail Verification Code&amp;body=Hallo Dario,%0D%0A%0D%0Amein E-Mail Verification-Code: 121121354 funktioniert nicht,%0D%0Akannst du das prüfen?%0D%0A%0D%0AMit freundlichen Grüßen%0D%0A">E-Mail</a>
</p>
</div>
</div>
</div>
</div>
<div class="auth_footer">
<p class="text-muted text-center">© Gradido 2019</p>
</div>
</div>
<%@ include file="footer.cpsp" %>

View File

@ -1,6 +1,5 @@
<div class="grd-time-used dev-info">
<%= mTimeProfiler.string() %>
</div>
<script src="<%= ServerConfig::g_php_serverPath %>js/core.js"></script>
</body>
</html>

View File

@ -12,7 +12,7 @@
<body>
<div class="versionstring dev-info">
<p class="grd_small">Login Server in Entwicklung</p>
<p class="grd_small">Alpha 0.7.0</p>
<p class="grd_small">Alpha 0.8.0</p>
</div>
<!--<nav class="grd-left-bar expanded" data-topbar role="navigation">
<div class="grd-left-bar-section">

View File

@ -14,7 +14,7 @@
bool userReturned = false;
if(!form.empty()) {
if(form.get("register-password2") != form.get("register-password")) {
if(form.get("register-password2", "") != form.get("register-password", "")) {
addError(new Error("Passwort", "Passw&ouml;rter sind nicht identisch."));
} else {
auto session = sm->getSession(request);
@ -26,10 +26,10 @@
}
userReturned = session->createUser(
form.get("register-first-name"),
form.get("register-last-name"),
form.get("register-email"),
form.get("register-password")
form.get("register-first-name", ""),
form.get("register-last-name", ""),
form.get("register-email", ""),
form.get("register-password", "")
);
getErrors(session);
}

View File

@ -23,12 +23,12 @@ enum PageState
PageState state = PAGE_ASK;
auto uri_start = ServerConfig::g_php_serverPath;//request.serverParams().getServerName();
// skip asking user if he like to save keys and passphrase on server
// skip asking user if he like to save keys and passphrase on server for now!
state = PAGE_SHOW_PUBKEY;
if(!mSession->generateKeys(true, true)) {
getErrors(mSession);
}
/*
if(!form.empty()) {
// privkey
auto savePrivkeyChoice = form.get("save-privkey");
@ -67,7 +67,7 @@ enum PageState
}
//printf("SaveKeysPage: hasErrors: %d, session state: %d, target state: %d\n",
//hasErrors, mSession->getSessionState(), SESSION_STATE_KEY_PAIR_GENERATED);
}
}*/
getErrors(mSession);
%><%@ include file="header.cpsp" %>
<div class="grd_container">