diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index c42d20a69..44c6bd1b5 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -3925,6 +3925,9 @@ resendRecoveryEmailAddressCode = PasswordState; //@description Requests to send a password recovery code to an email address that was previously set up requestPasswordRecovery = EmailAddressAuthenticationCodeInfo; +//@description Checks whether a password recovery code sent to an email address is valid @recovery_code Recovery code to check +checkPasswordRecoveryCode recovery_code:string = Ok; + //@description Recovers the password using a recovery code sent to an email address that was previously set up //@recovery_code Recovery code to check @new_password New password of the user; may be empty to remove the password @new_hint New password hint; may be empty recoverPassword recovery_code:string new_password:string new_hint:string = PasswordState; diff --git a/td/telegram/PasswordManager.cpp b/td/telegram/PasswordManager.cpp index bfbd0a185..7d51dfcb8 100644 --- a/td/telegram/PasswordManager.cpp +++ b/td/telegram/PasswordManager.cpp @@ -478,6 +478,21 @@ void PasswordManager::request_password_recovery( })); } +void PasswordManager::check_password_recovery_code(string code, Promise promise) { + // is called only after authorization + send_with_promise(G()->net_query_creator().create(telegram_api::auth_checkRecoveryPassword(code)), + PromiseCreator::lambda([promise = std::move(promise)](Result r_query) mutable { + auto r_result = fetch_result(std::move(r_query)); + if (r_result.is_error()) { + return promise.set_error(r_result.move_as_error()); + } + if (!r_result.ok()) { + return promise.set_error(Status::Error(400, "Invalid recovery code")); + } + return promise.set_value(Unit()); + })); +} + void PasswordManager::recover_password(string code, string new_password, string new_hint, Promise promise) { // is called only after authorization if (new_password.empty()) { diff --git a/td/telegram/PasswordManager.h b/td/telegram/PasswordManager.h index af42c8026..1cbd47a67 100644 --- a/td/telegram/PasswordManager.h +++ b/td/telegram/PasswordManager.h @@ -80,6 +80,7 @@ class PasswordManager : public NetQueryCallback { void check_email_address_verification_code(string code, Promise promise); void request_password_recovery(Promise> promise); + void check_password_recovery_code(string code, Promise promise); void recover_password(string code, string new_password, string new_hint, Promise promise); void get_secure_secret(string password, Promise promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index e00563673..4fb0ab20b 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -4930,6 +4930,14 @@ void Td::on_request(uint64 id, td_api::requestPasswordRecovery &request) { send_closure(password_manager_, &PasswordManager::request_password_recovery, std::move(promise)); } +void Td::on_request(uint64 id, td_api::checkPasswordRecoveryCode &request) { + CHECK_IS_USER(); + CLEAN_INPUT_STRING(request.recovery_code_); + CREATE_OK_REQUEST_PROMISE(); + send_closure(password_manager_, &PasswordManager::check_password_recovery_code, std::move(request.recovery_code_), + std::move(promise)); +} + void Td::on_request(uint64 id, td_api::recoverPassword &request) { CHECK_IS_USER(); CLEAN_INPUT_STRING(request.recovery_code_); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 2664ecae3..c08245573 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -436,6 +436,8 @@ class Td final : public NetQueryCallback { void on_request(uint64 id, td_api::requestPasswordRecovery &request); + void on_request(uint64 id, td_api::checkPasswordRecoveryCode &request); + void on_request(uint64 id, td_api::recoverPassword &request); void on_request(uint64 id, td_api::getTemporaryPasswordState &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 36683aa7b..b26090c32 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -1655,14 +1655,14 @@ class CliClient final : public Actor { } else if (op == "rapr") { send_request(td_api::make_object()); } else if (op == "caprc") { - string code = args; - send_request(td_api::make_object(code)); + string recovery_code = args; + send_request(td_api::make_object(recovery_code)); } else if (op == "rap") { - string code; + string recovery_code; string new_password; string new_hint; - get_args(args, code, new_password, new_hint); - send_request(td_api::make_object(code, new_password, new_hint)); + get_args(args, recovery_code, new_password, new_hint); + send_request(td_api::make_object(recovery_code, new_password, new_hint)); } else if (op == "lo" || op == "LogOut" || op == "logout") { send_request(td_api::make_object()); } else if (op == "destroy") { @@ -1783,12 +1783,15 @@ class CliClient final : public Actor { send_request(td_api::make_object()); } else if (op == "rpr" || op == "RequestPasswordRecovery") { send_request(td_api::make_object()); + } else if (op == "cprc") { + string recovery_code = args; + send_request(td_api::make_object(recovery_code)); } else if (op == "rp" || op == "RecoverPassword") { - string code; + string recovery_code; string new_password; string new_hint; - get_args(args, code, new_password, new_hint); - send_request(td_api::make_object(code, new_password, new_hint)); + get_args(args, recovery_code, new_password, new_hint); + send_request(td_api::make_object(recovery_code, new_password, new_hint)); } else if (op == "gtp" || op == "GetTemporaryPassword") { send_request(td_api::make_object()); } else if (op == "ctp" || op == "CreateTemporaryPassword") {