mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
Fix errors with login without pubkey
This commit is contained in:
parent
3188b03868
commit
a0f88c548b
@ -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";
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 + "/");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user