diff --git a/docu/login_server.api.md b/docu/login_server.api.md index 6ec1b36fe..b466be7fc 100644 --- a/docu/login_server.api.md +++ b/docu/login_server.api.md @@ -38,9 +38,12 @@ with: ```json { "email": "max.musterman@gmail.de", + "username": "Maxilein", "password": "123abcDE&" } ``` +`username` or `email` must be present! +If booth present, `email` will be used. ### Response In case of success returns: diff --git a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp index 0d151b1c3..59e33e5d0 100644 --- a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp +++ b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp @@ -21,6 +21,7 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) // incoming std::string email; + std::string username; std::string password; // if is json object @@ -32,8 +33,17 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) /// not available for the given type. /// Throws InvalidAccessException if Var is empty. try { - paramJsonObject->get("email").convert(email); + //paramJsonObject->get("email").convert(email); paramJsonObject->get("password").convert(password); + auto email_obj = paramJsonObject->get("email"); + auto username_obj = paramJsonObject->get("username"); + + if (!email_obj.isEmpty()) { + email_obj.convert(email); + } + if (!username_obj.isEmpty()) { + username_obj.convert(username); + } } catch (Poco::Exception& ex) { return stateError("json exception", ex.displayText()); @@ -43,13 +53,24 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) return stateError("parameter format unknown"); } - - if (!email.size() || !sm->isValid(email, VALIDATE_EMAIL)) { - return stateError("invalid or empty email"); + if (!email.size() && !username.size()) { + return stateError("no email or username given"); } + auto user = controller::User::create(); - if (1 != user->load(email)) { - return stateError("user with email not found", email); + if (email.size()) { + if (!sm->isValid(email, VALIDATE_EMAIL)) { + return stateError("invalid email"); + } + if (1 != user->load(email)) { + return stateError("user with email not found", email); + } + } + else if (username.size() > 0) { + if (1 != user->load(username)) { + return stateError("user with username not found", username); + } + email = user->getModel()->getEmail(); } NotificationList pwd_errors; diff --git a/login_server/src/cpp/controller/User.cpp b/login_server/src/cpp/controller/User.cpp index 271d0feae..cd71da96b 100644 --- a/login_server/src/cpp/controller/User.cpp +++ b/login_server/src/cpp/controller/User.cpp @@ -122,6 +122,14 @@ namespace controller { Poco::Data::BLOB email_hash(*emailHash, crypto_generichash_BYTES); return getModel()->loadFromDB("email_hash", email_hash); } + size_t User::load(const std::string& emailOrUsername) + { + auto model = getModel(); + if (1 == model->loadFromDB("email", emailOrUsername)) { + return 1; + } + return model->loadFromDB("username", emailOrUsername); + } Poco::AutoPtr User::sload(int user_id) { auto db = new model::table::User(); diff --git a/login_server/src/cpp/controller/User.h b/login_server/src/cpp/controller/User.h index 6063f87be..ecbac086f 100644 --- a/login_server/src/cpp/controller/User.h +++ b/login_server/src/cpp/controller/User.h @@ -70,7 +70,7 @@ namespace controller { //! \return 0 matching entry found int tryLoadPassphraseUserBackup(KeyPairEd25519** createdKeyPair = nullptr); - inline size_t load(const std::string& email) { return getModel()->loadFromDB("email", email); } + size_t load(const std::string& emailOrUsername); //! \brief try to load user from db via user_id //! \return count of found rows, should be 1 or 0 inline size_t load(int user_id) { return getModel()->loadFromDB("id", user_id); }