Fix errors with login without pubkey

This commit is contained in:
Dario 2020-06-20 11:26:04 +02:00
parent 3188b03868
commit a0f88c548b
5 changed files with 65 additions and 57 deletions

View File

@ -95,11 +95,17 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::
langCatalog = mSession->getLanguageCatalog();
}
auto userState = mSession->loadUser(email, password);
auto user = mSession->getNewUser();
if(!user->getModel()->getPublicKey()) {
mSession->generateKeys(true, true);
} else {
printf("pubkey exist: %d\n",user->getModel()->getPublicKey());
}
getErrors(mSession);
auto uri_start = request.serverParams().getServerName();
auto lastExternReferer = mSession->getLastReferer();
printf("user state: %d\n", userState);
switch(userState) {
case USER_EMPTY:
case USER_PASSWORD_INCORRECT:
@ -111,9 +117,6 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::
case USER_KEYS_DONT_MATCH:
addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Error in saved data, the server admin will look at it.")));
break;
case USER_NO_KEYS:
mSession->generateKeys(true, true);
// no break, correct, if user has no keys, he will be redirect also to dashboard after login
case USER_NO_PRIVATE_KEY:
case USER_COMPLETE:
case USER_EMAIL_NOT_ACTIVATED:
@ -128,6 +131,7 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::
refererString.find("login") == std::string::npos &&
refererString.find("logout") == std::string::npos &&
refererString.find("user_delete") == std::string::npos ) {
printf("redirect to: %s\n", refererString.data());
response.redirect(refererString);
} else {
response.redirect(ServerConfig::g_php_serverPath + "/");
@ -216,20 +220,20 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::
responseStream << " <div class=\"row\">\n";
responseStream << " <div class=\"col-12 logo-section\">\n";
responseStream << " <a href=\"";
#line 146 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 150 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "\" class=\"logo\">\n";
responseStream << "\t\t\t<picture>\n";
responseStream << "\t\t\t\t<source srcset=\"";
#line 148 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.webp\" type=\"image/webp\">\n";
responseStream << "\t\t\t\t<source srcset=\"";
#line 149 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 153 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" type=\"image/png\"> \n";
responseStream << "\t\t\t\t<img src=\"";
#line 150 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 154 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" alt=\"logo\" />\n";
responseStream << "\t\t\t</picture>\n";
@ -241,14 +245,14 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::
responseStream << " <div class=\"grid\">\n";
responseStream << "\t\t\t<div class=\"center-ul-container\">\n";
responseStream << "\t\t\t\t";
#line 159 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 163 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( getErrorsHtml() );
responseStream << "\t \n";
responseStream << "\t\t\t</div>\n";
responseStream << " <div class=\"grid-body\">\n";
responseStream << " \n";
responseStream << "\t\t\t <!--<input type=\"hidden\" name=\"lang\" value=\"";
#line 163 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 167 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( LanguageManager::keyForLanguage(lang) );
responseStream << "\">-->\n";
responseStream << "\t\t\t ";
@ -288,46 +292,46 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::
// end include flags.cpsp
responseStream << "\n";
responseStream << "\t\t\t <form action=\"";
#line 165 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/\" method=\"POST\">\n";
responseStream << " <div class=\"row display-block\">\n";
responseStream << " <div class=\"col-lg-7 col-md-8 col-sm-9 col-12 mx-auto form-wrapper\">\n";
responseStream << " <div class=\"form-group input-rounded\">\n";
responseStream << " <input type=\"text\" class=\"form-control\" name=\"login-email\" placeholder=\"";
#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 173 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("E-Mail") );
responseStream << "\" value=\"";
#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 173 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( presetEmail );
responseStream << "\"/>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"form-group input-rounded\">\n";
responseStream << " <input type=\"password\" class=\"form-control\" name=\"login-password\" placeholder=\"";
#line 172 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 176 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("Password") );
responseStream << "\" />\n";
responseStream << " </div>\n";
responseStream << " <button type=\"submit\" name=\"submit\" class=\"btn btn-primary btn-block\">";
#line 174 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 178 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext(" Login ") );
responseStream << "</button>\n";
responseStream << " <div class=\"signup-link\">\n";
responseStream << " <p>";
#line 176 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 180 "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 << "</p>\n";
responseStream << " <a href=\"https://gradido.com\">";
#line 177 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 181 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("Create New Account") );
responseStream << "</a>\n";
responseStream << " </div>\n";
responseStream << "\t\t\t\t\t<div class=\"reset-pwd-link\">\n";
responseStream << "\t\t\t\t\t\t<a href=\"";
#line 180 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 184 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/resetPassword\">";
#line 180 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
#line 184 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp"
responseStream << ( langCatalog->gettext("Passwort vergessen") );
responseStream << "</a>\n";
responseStream << "\t\t\t\t\t</div>\n";

View File

@ -143,23 +143,30 @@ namespace controller {
if (authenticated_encryption->getKeyHashed() == model->getPasswordHashed()) {
MemoryBin* clear_private_key = nullptr;
if (!model->hasPrivateKeyEncrypted()) return 1;
auto priv_key_encrypted = model->getPrivateKeyEncrypted();
auto priv_key_bin = MemoryManager::getInstance()->getFreeMemory(priv_key_encrypted.size());
memcpy(*priv_key_bin, priv_key_encrypted.data(), priv_key_encrypted.size());
if (AuthenticatedEncryption::AUTH_DECRYPT_OK == authenticated_encryption->decrypt(priv_key_bin, &clear_private_key)) {
auto gradido_key_pair = new KeyPairEd25519(clear_private_key);
if (*gradido_key_pair != model->getPublicKey()) {
delete authenticated_encryption;
delete gradido_key_pair;
return -1;
}
if (mGradidoKeyPair) delete mGradidoKeyPair;
mGradidoKeyPair = gradido_key_pair;
if (mPassword) delete mPassword;
mPassword = authenticated_encryption;
if (mPassword) delete mPassword;
mPassword = authenticated_encryption;
if (!model->hasPrivateKeyEncrypted()) {
return 1;
}
else {
auto priv_key_encrypted = model->getPrivateKeyEncrypted();
auto priv_key_bin = MemoryManager::getInstance()->getFreeMemory(priv_key_encrypted.size());
memcpy(*priv_key_bin, priv_key_encrypted.data(), priv_key_encrypted.size());
if (AuthenticatedEncryption::AUTH_DECRYPT_OK == authenticated_encryption->decrypt(priv_key_bin, &clear_private_key)) {
auto gradido_key_pair = new KeyPairEd25519(clear_private_key);
if (*gradido_key_pair != model->getPublicKey()) {
delete mPassword;
mPassword = nullptr;
delete gradido_key_pair;
return -1;
}
if (mGradidoKeyPair) delete mGradidoKeyPair;
mGradidoKeyPair = gradido_key_pair;
return 1;
}
}
}
delete authenticated_encryption;

View File

@ -1112,17 +1112,20 @@ bool Session::generateKeys(bool savePrivkey, bool savePassphrase)
// keys
auto gradido_key_pair = KeyPairEd25519::create(passphrase);
auto set_key_result = mNewUser->setGradidoKeyPair(gradido_key_pair);
size_t result_save_key = 0;
if (1 == set_key_result && savePrivkey) {
// save public key and private key in db
user_model->updatePubkeyAndPrivkey();
result_save_key = user_model->updatePubkeyAndPrivkey();
}
else {
// save public key in db
user_model->updatePublickey();
result_save_key = user_model->updatePublickey();
}
if (user_model->errorCount()) {
if (!result_save_key) {
user_model->addError(new Error(function_name, "Error saving new generated pubkey"));
user_model->addError(new ParamError(function_name, "e-mail: ", user_model->getEmail()));
user_model->sendErrorsAsEmail();
addError(new Error(gettext("Benutzer"), gettext("Fehler beim speichern der Keys, der Admin bekommt eine E-Mail. ")));
addError(new Error(gettext("Benutzer"), gettext("Fehler beim Speichern der Keys, der Admin bekommt eine E-Mail. Evt. nochmal versuchen oder abwarten!")));
return false;
}
return true;

View File

@ -142,32 +142,27 @@ namespace model {
size_t User::updatePrivkey()
{
lock();
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
if (mPrivateKey.isNull()) {
unlock();
return 0;
}
auto result = updateIntoDB("privkey", mPrivateKey.value());
unlock();
return result;
}
size_t User::updatePublickey()
{
lock();
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
if (mPublicKey.isNull()) {
unlock();
return 0;
}
auto result = updateIntoDB("pubkey", mPublicKey.value());
unlock();
return result;
}
size_t User::updatePrivkeyAndPasswordHash()
{
lock();
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
if (mPrivateKey.isNull() || !mPasswordHashed || !mID) {
unlock();
return 0;
}
auto cm = ConnectionManager::getInstance();
@ -184,10 +179,8 @@ namespace model {
return update.execute();
}
catch (Poco::Exception& ex) {
lock("User::updatePrivkeyAndPasswordHash");
addError(new ParamError(getTableName(), "mysql error by insert", ex.displayText().data()));
addError(new ParamError(getTableName(), "data set: ", toString().data()));
unlock();
}
//printf("data valid: %s\n", toString().data());
return 0;
@ -195,9 +188,8 @@ namespace model {
size_t User::updatePubkeyAndPrivkey()
{
lock();
if (mPrivateKey.isNull() || !mPublicKey || !mID) {
unlock();
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
if (mPrivateKey.isNull() || mPublicKey.isNull() || !mID) {
return 0;
}
auto cm = ConnectionManager::getInstance();
@ -214,10 +206,8 @@ namespace model {
return update.execute();
}
catch (Poco::Exception& ex) {
lock("User::updatePrivkeyAndPasswordHash");
addError(new ParamError(getTableName(), "mysql error by insert", ex.displayText().data()));
addError(new ParamError(getTableName(), "data set: ", toString().data()));
unlock();
}
//printf("data valid: %s\n", toString().data());
return 0;

View File

@ -74,11 +74,17 @@
langCatalog = mSession->getLanguageCatalog();
}
auto userState = mSession->loadUser(email, password);
auto user = mSession->getNewUser();
if(!user->getModel()->getPublicKey()) {
mSession->generateKeys(true, true);
} else {
printf("pubkey exist: %d\n",user->getModel()->getPublicKey());
}
getErrors(mSession);
auto uri_start = request.serverParams().getServerName();
auto lastExternReferer = mSession->getLastReferer();
printf("user state: %d\n", userState);
switch(userState) {
case USER_EMPTY:
case USER_PASSWORD_INCORRECT:
@ -90,9 +96,6 @@
case USER_KEYS_DONT_MATCH:
addError(new Error(langCatalog->gettext("User"), langCatalog->gettext("Error in saved data, the server admin will look at it.")));
break;
case USER_NO_KEYS:
mSession->generateKeys(true, true);
// no break, correct, if user has no keys, he will be redirect also to dashboard after login
case USER_NO_PRIVATE_KEY:
case USER_COMPLETE:
case USER_EMAIL_NOT_ACTIVATED:
@ -107,6 +110,7 @@
refererString.find("login") == std::string::npos &&
refererString.find("logout") == std::string::npos &&
refererString.find("user_delete") == std::string::npos ) {
printf("redirect to: %s\n", refererString.data());
response.redirect(refererString);
} else {
response.redirect(ServerConfig::g_php_serverPath + "/");