From 76813db3ad431760097f23327015f26eba5c3b07 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 17 Aug 2021 13:52:21 +0300 Subject: [PATCH] Completed ability to recover cloud password with email. --- Telegram/SourceFiles/boxes/passcode_box.cpp | 46 +++++++++++++++---- Telegram/SourceFiles/boxes/passcode_box.h | 3 +- .../intro/intro_password_check.cpp | 6 ++- Telegram/SourceFiles/mainwidget.cpp | 2 +- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/boxes/passcode_box.cpp b/Telegram/SourceFiles/boxes/passcode_box.cpp index 6527f1a030..b322c69bcc 100644 --- a/Telegram/SourceFiles/boxes/passcode_box.cpp +++ b/Telegram/SourceFiles/boxes/passcode_box.cpp @@ -877,8 +877,12 @@ void PasscodeBox::setNewCloudPassword(const QString &newPassword) { MTP_string(_cloudFields.fromRecoveryCode), settings )).done([=](const MTPauth_Authorization &result) { - + recoverPasswordDone(newPasswordBytes, result); }).fail([=](const MTP::Error &error) { + if (MTP::IsFloodError(error)) { + _newError = tr::lng_flood_error(tr::now); + update(); + } setPasswordFail(newPasswordBytes, email, error); }).handleFloodErrors().send(); } @@ -1239,13 +1243,27 @@ void RecoverBox::submit() { } const auto send = crl::guard(this, [=] { - _submitRequest = _api.request(MTPauth_CheckRecoveryPassword( - MTP_string(code) - )).done([=](const MTPBool &result) { - checkSubmitDone(code, result); - }).fail([=](const MTP::Error &error) { - checkSubmitFail(error); - }).handleFloodErrors().send(); + if (_cloudFields.turningOff) { + // From "Disable cloud password". + _submitRequest = _api.request(MTPauth_RecoverPassword( + MTP_flags(0), + MTP_string(code), + MTPaccount_PasswordInputSettings() + )).done([=](const MTPauth_Authorization &result) { + proceedToClear(); + }).fail([=](const MTP::Error &error) { + checkSubmitFail(error); + }).handleFloodErrors().send(); + } else { + // From "Change cloud password". + _submitRequest = _api.request(MTPauth_CheckRecoveryPassword( + MTP_string(code) + )).done([=](const MTPBool &result) { + proceedToChange(code); + }).fail([=](const MTP::Error &error) { + checkSubmitFail(error); + }).handleFloodErrors().send(); + } }); if (_cloudFields.notEmptyPassport) { const auto confirmed = [=](Fn &&close) { @@ -1273,7 +1291,16 @@ void RecoverBox::codeChanged() { setError(QString()); } -void RecoverBox::checkSubmitDone(const QString &code, const MTPBool &result) { +void RecoverBox::proceedToClear() { + _submitRequest = 0; + _newPasswordSet.fire({}); + getDelegate()->show( + Box(tr::lng_cloud_password_removed(tr::now)), + Ui::LayerOption::CloseOther); +} + +void RecoverBox::proceedToChange(const QString &code) { + Expects(!_cloudFields.turningOff); _submitRequest = 0; auto fields = _cloudFields; @@ -1281,7 +1308,6 @@ void RecoverBox::checkSubmitDone(const QString &code, const MTPBool &result) { fields.hasRecovery = false; // we could've been turning off, no need to force new password then // like if (_cloudFields.turningOff) { just RecoverPassword else Check } - fields.turningOff = ??? fields.curRequest = {}; auto box = Box(_session, fields); diff --git a/Telegram/SourceFiles/boxes/passcode_box.h b/Telegram/SourceFiles/boxes/passcode_box.h index 65c83bfa25..40683a17d5 100644 --- a/Telegram/SourceFiles/boxes/passcode_box.h +++ b/Telegram/SourceFiles/boxes/passcode_box.h @@ -210,7 +210,8 @@ protected: private: void submit(); void codeChanged(); - void checkSubmitDone(const QString &code, const MTPBool &result); + void proceedToClear(); + void proceedToChange(const QString &code); void checkSubmitFail(const MTP::Error &error); void setError(const QString &error); diff --git a/Telegram/SourceFiles/intro/intro_password_check.cpp b/Telegram/SourceFiles/intro/intro_password_check.cpp index 7614f347c9..6f20ca0989 100644 --- a/Telegram/SourceFiles/intro/intro_password_check.cpp +++ b/Telegram/SourceFiles/intro/intro_password_check.cpp @@ -228,13 +228,17 @@ void PasswordCheckWidget::codeSubmitDone( fields.hasRecovery = false; fields.curRequest = {}; auto box = Box(&api().instance(), nullptr, fields); + const auto boxShared = std::make_shared>(); box->newAuthorization( ) | rpl::start_with_next([=](const MTPauth_Authorization &result) { + if (boxShared) { + (*boxShared)->closeBox(); + } pwdSubmitDone(true, result); }, lifetime()); - Ui::show(std::move(box)); + *boxShared = Ui::show(std::move(box)); } void PasswordCheckWidget::codeSubmitFail(const MTP::Error &error) { diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 699544acde..942a30fcb9 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -2086,7 +2086,7 @@ void MainWidget::hideAll() { void MainWidget::showAll() { if (cPasswordRecovered()) { cSetPasswordRecovered(false); - Ui::show(Box(tr::lng_signin_password_removed(tr::now))); + Ui::show(Box(tr::lng_cloud_password_updated(tr::now))); } if (isOneColumn()) { _sideShadow->hide();