From beb91e12963e5c6f467102009241de5ea11261e4 Mon Sep 17 00:00:00 2001 From: Dario Date: Fri, 10 Jan 2020 17:46:20 +0100 Subject: [PATCH] check password encryption in process in login --- src/cpp/HTTPInterface/LoginPage.cpp | 41 ++++++++++--------- .../SingletonTaskObserver.cpp | 2 + .../SingletonManager/SingletonTaskObserver.h | 4 +- src/cpp/model/Session.cpp | 21 ++++++++-- src/cpp/model/User.h | 1 + src/cpsp/login.cpsp | 3 ++ 6 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/cpp/HTTPInterface/LoginPage.cpp b/src/cpp/HTTPInterface/LoginPage.cpp index 9250e7477..845a1fc41 100644 --- a/src/cpp/HTTPInterface/LoginPage.cpp +++ b/src/cpp/HTTPInterface/LoginPage.cpp @@ -97,6 +97,9 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: case USER_PASSWORD_INCORRECT: addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("E-Mail or password isn't right, please try again!"))); break; + case USER_PASSWORD_ENCRYPTION_IN_PROCESS: + addError(new Error(langCatalog->gettext("Passwort"), langCatalog->gettext("Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut."))); + break; case USER_EMAIL_NOT_ACTIVATED: mSession->addError(new Error(langCatalog->gettext("Account"), langCatalog->gettext("E-Mail Address not checked, do you already get one?"))); response.redirect(ServerConfig::g_serverPath + "/checkEmail"); @@ -180,20 +183,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"; @@ -205,29 +208,29 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: responseStream << "
\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t\t"; -#line 134 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 137 "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 << "
\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << " \n"; @@ -236,12 +239,12 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: responseStream << "
\n"; responseStream << "
\n"; responseStream << " \n"; @@ -252,30 +255,30 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: responseStream << "
\n"; responseStream << "
\n"; responseStream << " gettext("E-Mail") ); responseStream << "\" value=\""; -#line 160 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 163 "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 << "

"; -#line 167 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 170 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" responseStream << ( langCatalog->gettext("You haven't any account yet? Please follow the link to create one.") ); responseStream << "

\n"; responseStream << " "; -#line 168 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 171 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" responseStream << ( langCatalog->gettext("Create New Account") ); responseStream << "\n"; responseStream << "
\n"; diff --git a/src/cpp/SingletonManager/SingletonTaskObserver.cpp b/src/cpp/SingletonManager/SingletonTaskObserver.cpp index e651464c2..c25569fd3 100644 --- a/src/cpp/SingletonManager/SingletonTaskObserver.cpp +++ b/src/cpp/SingletonManager/SingletonTaskObserver.cpp @@ -27,6 +27,7 @@ void SingletonTaskObserver::addTask(const std::string& email, TaskObserverType t UserObserverEntry* entry = static_cast(mObserverEntrys.findByHash(id)); if (!entry) { entry = new UserObserverEntry(email, id); + mObserverEntrys.addByHash(id, entry); } if (entry->mEmail != email) { em->addError(new ParamError(funcName, "hash collision with ", email.data())); @@ -46,6 +47,7 @@ void SingletonTaskObserver::addTask(DHASH id, TaskObserverType type) UserObserverEntry* entry = static_cast(mObserverEntrys.findByHash(id)); if (!entry) { entry = new UserObserverEntry("", id); + mObserverEntrys.addByHash(id, entry); } entry->mTasksCount[type]++; unlock(); diff --git a/src/cpp/SingletonManager/SingletonTaskObserver.h b/src/cpp/SingletonManager/SingletonTaskObserver.h index f01905343..97b7f3678 100644 --- a/src/cpp/SingletonManager/SingletonTaskObserver.h +++ b/src/cpp/SingletonManager/SingletonTaskObserver.h @@ -49,10 +49,12 @@ public: static const char* TaskObserverTypeToString(TaskObserverType type); static TaskObserverType StringToTaskObserverType(const std::string& typeString); + static inline DHASH makeHash(const std::string& email) { return DRMakeStringHash(email.data(), email.size()); } + protected: SingletonTaskObserver(); - inline DHASH makeHash(const std::string& email) { return DRMakeStringHash(email.data(), email.size()); } + struct UserObserverEntry diff --git a/src/cpp/model/Session.cpp b/src/cpp/model/Session.cpp index 8e76e710a..09bf4fd24 100644 --- a/src/cpp/model/Session.cpp +++ b/src/cpp/model/Session.cpp @@ -10,6 +10,7 @@ #include "../SingletonManager/ConnectionManager.h" #include "../SingletonManager/ErrorManager.h" #include "../SingletonManager/EmailManager.h" +#include "../SingletonManager/SingletonTaskObserver.h" #include "../tasks/PrepareEmailTask.h" #include "../tasks/SendEmailTask.h" @@ -452,7 +453,8 @@ int Session::comparePassphraseWithSavedKeys(const std::string& inputPassphrase, bool Session::startProcessingTransaction(const std::string& proto_message_base64) { - lock("Session::startProcessingTransaction"); + static const char* funcName = "Session::startProcessingTransaction"; + lock(funcName); HASH hs = ProcessingTransaction::calculateHash(proto_message_base64); // check if it is already running or waiting for (auto it = mProcessingTransactions.begin(); it != mProcessingTransactions.end(); it++) { @@ -460,13 +462,18 @@ bool Session::startProcessingTransaction(const std::string& proto_message_base64 it = mProcessingTransactions.erase(it); } if (hs == (*it)->getHash()) { - addError(new Error("Session::startProcessingTransaction", "transaction already in list")); + addError(new Error(funcName, "transaction already in list")); unlock(); return false; } } - - Poco::AutoPtr processorTask(new ProcessingTransaction(proto_message_base64)); + if (mSessionUser.isNull() || !mSessionUser->getEmail()) { + addError(new Error(funcName, "user is zero")); + unlock(); + return false; + } + + Poco::AutoPtr processorTask(new ProcessingTransaction(proto_message_base64, DRMakeStringHash(mSessionUser->getEmail()))); processorTask->scheduleTask(processorTask); mProcessingTransactions.push_back(processorTask); unlock(); @@ -559,6 +566,12 @@ bool Session::isPwdValid(const std::string& pwd) UserStates Session::loadUser(const std::string& email, const std::string& password) { + auto observer = SingletonTaskObserver::getInstance(); + if (email != "") { + if (observer->getTaskCount(email, TASK_OBSERVER_PASSWORD_CREATION) > 0) { + return USER_PASSWORD_ENCRYPTION_IN_PROCESS; + } + } //Profiler usedTime; lock("Session::loadUser"); if (mSessionUser && mSessionUser->getEmail() != email) { diff --git a/src/cpp/model/User.h b/src/cpp/model/User.h index 53fb369d6..ce2450756 100644 --- a/src/cpp/model/User.h +++ b/src/cpp/model/User.h @@ -30,6 +30,7 @@ enum UserStates USER_EMPTY, USER_LOADED_FROM_DB, USER_PASSWORD_INCORRECT, + USER_PASSWORD_ENCRYPTION_IN_PROCESS, USER_EMAIL_NOT_ACTIVATED, USER_NO_KEYS, USER_NO_PRIVATE_KEY, diff --git a/src/cpsp/login.cpsp b/src/cpsp/login.cpsp index 373f2fb47..cff2f4511 100644 --- a/src/cpsp/login.cpsp +++ b/src/cpsp/login.cpsp @@ -76,6 +76,9 @@ case USER_PASSWORD_INCORRECT: addError(new Error(langCatalog->gettext("Login"), langCatalog->gettext("E-Mail or password isn't right, please try again!"))); break; + case USER_PASSWORD_ENCRYPTION_IN_PROCESS: + addError(new Error(langCatalog->gettext("Passwort"), langCatalog->gettext("Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut."))); + break; case USER_EMAIL_NOT_ACTIVATED: mSession->addError(new Error(langCatalog->gettext("Account"), langCatalog->gettext("E-Mail Address not checked, do you already get one?"))); response.redirect(ServerConfig::g_serverPath + "/checkEmail");