diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index fb76daafa..2f1ee9c21 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -48,7 +48,22 @@ export class UserResolver { user.hasElopage = result.data.hasElopage // read additional settings from settings table const userRepository = getCustomRepository(UserRepository) - const userEntity = await userRepository.findByPubkeyHex(user.pubkey) + let userEntity: void | DbUser + userEntity = await userRepository.findByPubkeyHex(user.pubkey).catch(() => { + userEntity = new DbUser() + userEntity.firstName = user.firstName + userEntity.lastName = user.lastName + userEntity.username = user.username + userEntity.email = user.email + userEntity.pubkey = Buffer.from(fromHex(user.pubkey)) + + userEntity.save().catch(() => { + throw new Error('error by save userEntity') + }) + }) + if (!userEntity) { + throw new Error('error with cannot happen') + } const userSettingRepository = getCustomRepository(UserSettingRepository) const coinanimation = await userSettingRepository diff --git a/login_server/src/cpp/Crypto/Passphrase.cpp b/login_server/src/cpp/Crypto/Passphrase.cpp index 6b3df0c5d..0b733777d 100644 --- a/login_server/src/cpp/Crypto/Passphrase.cpp +++ b/login_server/src/cpp/Crypto/Passphrase.cpp @@ -328,6 +328,7 @@ const Poco::UInt16* Passphrase::getWordIndices() const bool Passphrase::checkIfValid() { + if (!mWordSource) return false; std::istringstream iss(mPassphraseString); std::vector results(std::istream_iterator{iss}, std::istream_iterator()); diff --git a/login_server/src/cpp/JSONInterface/JsonRequestHandler.cpp b/login_server/src/cpp/JSONInterface/JsonRequestHandler.cpp index feab7043b..15846913b 100644 --- a/login_server/src/cpp/JSONInterface/JsonRequestHandler.cpp +++ b/login_server/src/cpp/JSONInterface/JsonRequestHandler.cpp @@ -81,22 +81,30 @@ void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Po } if (json_result) { + NotificationList errors; if (!json_result->isNull("session_id")) { int session_id = 0; try { json_result->get("session_id").convert(session_id); } catch (Poco::Exception& e) { - NotificationList erros; - erros.addError(new Error("json request", "invalid session_id")); - erros.sendErrorsAsEmail(); + errors.addError(new Error("json request", "invalid session_id")); } if (session_id) { auto session = SessionManager::getInstance()->getSession(session_id); response.addCookie(session->getLoginCookie()); } } - json_result->stringify(responseStream); + try { + json_result->stringify(responseStream); + } + catch (Poco::Exception& e) { + errors.addError(new ParamError("json request", "error on stringify from json result:", e.message())); + errors.addError(new ParamError("json request", "caller url", request.getURI())); + } + if (errors.errorCount()) { + errors.sendErrorsAsEmail(); + } delete json_result; } diff --git a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp index 5c06e27b8..991e412a0 100644 --- a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp +++ b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp @@ -114,6 +114,14 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) auto user_state = session->loadUser(email, password); auto user_model = session->getNewUser()->getModel(); Poco::JSON::Array infos; + + // AUTOMATIC ERROR CORRECTION + // if something went wrong by initial key generation for user, generate keys again + if (user_state >= USER_LOADED_FROM_DB && !user_model->getPublicKey()) { + if (session->generateKeys(true, true)) { + user_state = session->getNewUser()->getUserState(); + } + } switch (user_state) { case USER_EMPTY: diff --git a/login_server/src/cpp/model/Session.cpp b/login_server/src/cpp/model/Session.cpp index cf380929d..2fdd9ff2f 100644 --- a/login_server/src/cpp/model/Session.cpp +++ b/login_server/src/cpp/model/Session.cpp @@ -746,7 +746,7 @@ void Session::detectSessionState() bool cryptedPassphrase = userBackups.size() > 0; for (auto it = userBackups.begin(); it != userBackups.end(); it++) { auto passphrase = (*it)->getModel()->getPassphrase(); - Mnemonic* wordSource = nullptr; + const Mnemonic* wordSource = Passphrase::detectMnemonic(passphrase); auto passphrase_obj = Passphrase::create(passphrase, wordSource); if (!passphrase_obj.isNull() && passphrase_obj->checkIfValid()) { auto key_pair = KeyPairEd25519::create(passphrase_obj);