From cbad2469db8060ca6379425eeb7e95eb01272ff8 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 2 Aug 2021 22:06:33 +0300 Subject: [PATCH] Moved MTP cloud password from ApiWrap to Api::CloudPassword. --- Telegram/CMakeLists.txt | 2 + Telegram/SourceFiles/api/api_bot.cpp | 5 +- .../SourceFiles/api/api_cloud_password.cpp | 86 +++++++++++++++++++ Telegram/SourceFiles/api/api_cloud_password.h | 42 +++++++++ Telegram/SourceFiles/apiwrap.cpp | 70 ++------------- Telegram/SourceFiles/apiwrap.h | 17 +--- Telegram/SourceFiles/boxes/passcode_box.cpp | 5 +- .../boxes/peers/edit_participant_box.cpp | 5 +- .../payments/payments_checkout_process.cpp | 13 +-- .../SourceFiles/settings/settings_main.cpp | 5 +- .../settings/settings_privacy_security.cpp | 39 +++++---- 11 files changed, 178 insertions(+), 111 deletions(-) create mode 100644 Telegram/SourceFiles/api/api_cloud_password.cpp create mode 100644 Telegram/SourceFiles/api/api_cloud_password.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index fd80c5555..473121dd5 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -99,6 +99,8 @@ PRIVATE api/api_chat_filters.h api/api_chat_invite.cpp api/api_chat_invite.h + api/api_cloud_password.cpp + api/api_cloud_password.h api/api_common.h api/api_editing.cpp api/api_editing.h diff --git a/Telegram/SourceFiles/api/api_bot.cpp b/Telegram/SourceFiles/api/api_bot.cpp index 7d424e6b1..b1eb5c94e 100644 --- a/Telegram/SourceFiles/api/api_bot.cpp +++ b/Telegram/SourceFiles/api/api_bot.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_bot.h" #include "apiwrap.h" +#include "api/api_cloud_password.h" #include "core/core_cloud_password.h" #include "api/api_send_progress.h" #include "boxes/confirm_box.h" @@ -168,7 +169,7 @@ void SendBotCallbackDataWithPassword( if (!button || button->requestId) { return; } - api->reloadPasswordState(); + api->cloudPassword().reload(); SendBotCallbackData(item, row, column, MTP_inputCheckPasswordEmpty(), [=](const MTP::Error &error) { auto box = PrePasswordErrorBox( error, @@ -181,7 +182,7 @@ void SendBotCallbackDataWithPassword( } else { auto lifetime = std::make_shared(); button->requestId = -1; - api->passwordState( + api->cloudPassword().state( ) | rpl::take( 1 ) | rpl::start_with_next([=](const Core::CloudPasswordState &state) mutable { diff --git a/Telegram/SourceFiles/api/api_cloud_password.cpp b/Telegram/SourceFiles/api/api_cloud_password.cpp new file mode 100644 index 000000000..a8a14fd1d --- /dev/null +++ b/Telegram/SourceFiles/api/api_cloud_password.cpp @@ -0,0 +1,86 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "api/api_cloud_password.h" + +#include "base/openssl_help.h" +#include "core/core_cloud_password.h" +#include "apiwrap.h" + +namespace Api { + +// #TODO Add ability to set recovery email separately. + +CloudPassword::CloudPassword(not_null api) +: _api(&api->instance()) { +} + +void CloudPassword::reload() { + if (_requestId) { + return; + } + _requestId = _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + _requestId = 0; + result.match([&](const MTPDaccount_password &data) { + openssl::AddRandomSeed(bytes::make_span(data.vsecure_random().v)); + if (_state) { + *_state = Core::ParseCloudPasswordState(data); + } else { + _state = std::make_unique( + Core::ParseCloudPasswordState(data)); + } + _stateChanges.fire_copy(*_state); + }); + }).fail([=](const MTP::Error &error) { + _requestId = 0; + }).send(); +} + +void CloudPassword::applyPendingReset( + const MTPaccount_ResetPasswordResult &data) { + if (!_state) { + reload(); + return; + } + data.match([&](const MTPDaccount_resetPasswordOk &data) { + reload(); + }, [&](const MTPDaccount_resetPasswordRequestedWait &data) { + const auto until = data.vuntil_date().v; + if (_state->pendingResetDate != until) { + _state->pendingResetDate = until; + _stateChanges.fire_copy(*_state); + } + }, [&](const MTPDaccount_resetPasswordFailedWait &data) { + }); +} + +void CloudPassword::clearUnconfirmedPassword() { + _requestId = _api.request(MTPaccount_CancelPasswordEmail( + )).done([=](const MTPBool &result) { + _requestId = 0; + reload(); + }).fail([=](const MTP::Error &error) { + _requestId = 0; + reload(); + }).send(); +} + +rpl::producer CloudPassword::state() const { + return _state + ? _stateChanges.events_starting_with_copy(*_state) + : (_stateChanges.events() | rpl::type_erased()); +} + +auto CloudPassword::stateCurrent() const +-> std::optional { + return _state + ? base::make_optional(*_state) + : std::nullopt; +} + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_cloud_password.h b/Telegram/SourceFiles/api/api_cloud_password.h new file mode 100644 index 000000000..2fdd7394c --- /dev/null +++ b/Telegram/SourceFiles/api/api_cloud_password.h @@ -0,0 +1,42 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "mtproto/sender.h" + +namespace Core { +struct CloudPasswordState; +} // namespace Core + +class ApiWrap; + +namespace Main { +class Session; +} // namespace Main + +namespace Api { + +class CloudPassword final { +public: + explicit CloudPassword(not_null api); + + void reload(); + void applyPendingReset(const MTPaccount_ResetPasswordResult &data); + void clearUnconfirmedPassword(); + rpl::producer state() const; + std::optional stateCurrent() const; + +private: + MTP::Sender _api; + mtpRequestId _requestId = 0; + std::unique_ptr _state; + rpl::event_stream _stateChanges; + +}; + +} // namespace Api diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index f0ab9be41..1cda6e6d8 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_authorizations.h" #include "api/api_attached_stickers.h" #include "api/api_blocked_peers.h" +#include "api/api_cloud_password.h" #include "api/api_hash.h" #include "api/api_invite_links.h" #include "api/api_media.h" @@ -44,7 +45,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "dialogs/dialogs_key.h" #include "core/core_cloud_password.h" #include "core/application.h" -#include "base/openssl_help.h" #include "base/unixtime.h" #include "base/qt_adapters.h" #include "base/call_delayed.h" @@ -135,6 +135,7 @@ ApiWrap::ApiWrap(not_null session) , _authorizations(std::make_unique(this)) , _attachedStickers(std::make_unique(this)) , _blockedPeers(std::make_unique(this)) +, _cloudPassword(std::make_unique(this)) , _selfDestruct(std::make_unique(this)) , _sensitiveContent(std::make_unique(this)) , _globalPrivacy(std::make_unique(this)) @@ -4586,69 +4587,6 @@ void ApiWrap::clearPeerPhoto(not_null photo) { } } -void ApiWrap::reloadPasswordState() { - if (_passwordRequestId) { - return; - } - _passwordRequestId = request(MTPaccount_GetPassword( - )).done([=](const MTPaccount_Password &result) { - _passwordRequestId = 0; - result.match([&](const MTPDaccount_password &data) { - openssl::AddRandomSeed(bytes::make_span(data.vsecure_random().v)); - if (_passwordState) { - *_passwordState = Core::ParseCloudPasswordState(data); - } else { - _passwordState = std::make_unique( - Core::ParseCloudPasswordState(data)); - } - _passwordStateChanges.fire_copy(*_passwordState); - }); - }).fail([=](const MTP::Error &error) { - _passwordRequestId = 0; - }).send(); -} - -void ApiWrap::applyPendingReset(const MTPaccount_ResetPasswordResult &data) { - if (!_passwordState) { - reloadPasswordState(); - return; - } - data.match([&](const MTPDaccount_resetPasswordOk &data) { - reloadPasswordState(); - }, [&](const MTPDaccount_resetPasswordRequestedWait &data) { - const auto until = data.vuntil_date().v; - if (_passwordState->pendingResetDate != until) { - _passwordState->pendingResetDate = until; - _passwordStateChanges.fire_copy(*_passwordState); - } - }, [&](const MTPDaccount_resetPasswordFailedWait &data) { - }); -} - -void ApiWrap::clearUnconfirmedPassword() { - _passwordRequestId = request(MTPaccount_CancelPasswordEmail( - )).done([=](const MTPBool &result) { - _passwordRequestId = 0; - reloadPasswordState(); - }).fail([=](const MTP::Error &error) { - _passwordRequestId = 0; - reloadPasswordState(); - }).send(); -} - -rpl::producer ApiWrap::passwordState() const { - return _passwordState - ? _passwordStateChanges.events_starting_with_copy(*_passwordState) - : (_passwordStateChanges.events() | rpl::type_erased()); -} - -auto ApiWrap::passwordStateCurrent() const --> std::optional { - return _passwordState - ? base::make_optional(*_passwordState) - : std::nullopt; -} - void ApiWrap::reloadContactSignupSilent() { if (_contactSignupSilentRequestId) { return; @@ -4734,6 +4672,10 @@ Api::BlockedPeers &ApiWrap::blockedPeers() { return *_blockedPeers; } +Api::CloudPassword &ApiWrap::cloudPassword() { + return *_cloudPassword; +} + Api::SelfDestruct &ApiWrap::selfDestruct() { return *_selfDestruct; } diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index af8828713..42f751ed4 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -45,10 +45,6 @@ namespace Dialogs { class Key; } // namespace Dialogs -namespace Core { -struct CloudPasswordState; -} // namespace Core - namespace Ui { struct PreparedList; } // namespace Ui @@ -59,6 +55,7 @@ class Updates; class Authorizations; class AttachedStickers; class BlockedPeers; +class CloudPassword; class SelfDestruct; class SensitiveContent; class GlobalPrivacy; @@ -386,12 +383,6 @@ public: void uploadPeerPhoto(not_null peer, QImage &&image); void clearPeerPhoto(not_null photo); - void reloadPasswordState(); - void applyPendingReset(const MTPaccount_ResetPasswordResult &data); - void clearUnconfirmedPassword(); - rpl::producer passwordState() const; - std::optional passwordStateCurrent() const; - void reloadContactSignupSilent(); rpl::producer contactSignupSilent() const; std::optional contactSignupSilentCurrent() const; @@ -402,6 +393,7 @@ public: [[nodiscard]] Api::Authorizations &authorizations(); [[nodiscard]] Api::AttachedStickers &attachedStickers(); [[nodiscard]] Api::BlockedPeers &blockedPeers(); + [[nodiscard]] Api::CloudPassword &cloudPassword(); [[nodiscard]] Api::SelfDestruct &selfDestruct(); [[nodiscard]] Api::SensitiveContent &sensitiveContent(); [[nodiscard]] Api::GlobalPrivacy &globalPrivacy(); @@ -707,10 +699,6 @@ private: base::flat_map> _peerPhotoUploads; - mtpRequestId _passwordRequestId = 0; - std::unique_ptr _passwordState; - rpl::event_stream _passwordStateChanges; - mtpRequestId _saveBioRequestId = 0; FnMut _saveBioDone; QString _saveBioText; @@ -718,6 +706,7 @@ private: const std::unique_ptr _authorizations; const std::unique_ptr _attachedStickers; const std::unique_ptr _blockedPeers; + const std::unique_ptr _cloudPassword; const std::unique_ptr _selfDestruct; const std::unique_ptr _sensitiveContent; const std::unique_ptr _globalPrivacy; diff --git a/Telegram/SourceFiles/boxes/passcode_box.cpp b/Telegram/SourceFiles/boxes/passcode_box.cpp index f3cb007b3..0dcbd9f99 100644 --- a/Telegram/SourceFiles/boxes/passcode_box.cpp +++ b/Telegram/SourceFiles/boxes/passcode_box.cpp @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/unixtime.h" #include "mainwindow.h" #include "apiwrap.h" +#include "api/api_cloud_password.h" #include "main/main_session.h" #include "main/main_domain.h" #include "core/application.h" @@ -43,7 +44,7 @@ enum class PasswordErrorType { void SetCloudPassword( not_null box, not_null session) { - session->api().passwordState( + session->api().cloudPassword().state( ) | rpl::start_with_next([=] { using namespace Settings; const auto weak = Ui::MakeWeak(box); @@ -103,7 +104,7 @@ void StartPendingReset( const auto weak = Ui::MakeWeak(context.get()); session->api().request(MTPaccount_ResetPassword( )).done([=](const MTPaccount_ResetPasswordResult &result) { - session->api().applyPendingReset(result); + session->api().cloudPassword().applyPendingReset(result); result.match([&](const MTPDaccount_resetPasswordOk &data) { }, [&](const MTPDaccount_resetPasswordRequestedWait &data) { }, [&](const MTPDaccount_resetPasswordFailedWait &data) { diff --git a/Telegram/SourceFiles/boxes/peers/edit_participant_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participant_box.cpp index daae81777..bf0d5d827 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participant_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participant_box.cpp @@ -36,6 +36,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/unixtime.h" #include "base/qt_adapters.h" #include "apiwrap.h" +#include "api/api_cloud_password.h" #include "main/main_session.h" #include "styles/style_layers.h" #include "styles/style_boxes.h" @@ -444,7 +445,7 @@ void EditAdminBox::transferOwnership() { ? peer()->asChannel()->inputChannel : MTP_inputChannelEmpty(); const auto api = &peer()->session().api(); - api->reloadPasswordState(); + api->cloudPassword().reload(); _checkTransferRequestId = api->request(MTPchannels_EditCreator( channel, MTP_inputUserEmpty(), @@ -495,7 +496,7 @@ void EditAdminBox::transferOwnershipChecked() { } void EditAdminBox::requestTransferPassword(not_null channel) { - peer()->session().api().passwordState( + peer()->session().api().cloudPassword().state( ) | rpl::take( 1 ) | rpl::start_with_next([=](const Core::CloudPasswordState &state) { diff --git a/Telegram/SourceFiles/payments/payments_checkout_process.cpp b/Telegram/SourceFiles/payments/payments_checkout_process.cpp index 058a411cb..2e8dbc239 100644 --- a/Telegram/SourceFiles/payments/payments_checkout_process.cpp +++ b/Telegram/SourceFiles/payments/payments_checkout_process.cpp @@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/core_cloud_password.h" // Core::CloudPasswordState #include "lang/lang_keys.h" #include "apiwrap.h" +#include "api/api_cloud_password.h" #include #include @@ -161,7 +162,7 @@ CheckoutProcess::CheckoutProcess( _panel->toggleProgress(true); if (mode == Mode::Payment) { - _session->api().passwordState( + _session->api().cloudPassword().state( ) | rpl::start_with_next([=](const Core::CloudPasswordState &state) { _form->setHasPassword(!!state.request); }, _lifetime); @@ -192,7 +193,7 @@ void CheckoutProcess::handleFormUpdate(const FormUpdate &update) { showForm(); } if (_form->paymentMethod().savedCredentials) { - _session->api().reloadPasswordState(); + _session->api().cloudPassword().reload(); } }, [&](const ThumbnailUpdated &data) { _panel->updateFormThumbnail(data.thumbnail); @@ -585,7 +586,7 @@ void CheckoutProcess::editPaymentMethod() { } void CheckoutProcess::requestSetPassword() { - _session->api().reloadPasswordState(); + _session->api().cloudPassword().reload(); _panel->askSetPassword(); } @@ -622,12 +623,12 @@ void CheckoutProcess::panelSetPassword() { box->newPasswordSet() | rpl::to_empty, box->passwordReloadNeeded() ) | rpl::start_with_next([=] { - _session->api().reloadPasswordState(); + _session->api().cloudPassword().reload(); }, box->lifetime()); box->clearUnconfirmedPassword( ) | rpl::start_with_next([=] { - _session->api().clearUnconfirmedPassword(); + _session->api().cloudPassword().clearUnconfirmedPassword(); }, box->lifetime()); _panel->showBox(std::move(owned)); @@ -645,7 +646,7 @@ void CheckoutProcess::getPasswordState( if (_gettingPasswordState) { return; } - _session->api().passwordState( + _session->api().cloudPassword().state( ) | rpl::start_with_next([=](const Core::CloudPasswordState &state) { _gettingPasswordState.destroy(); callback(state); diff --git a/Telegram/SourceFiles/settings/settings_main.cpp b/Telegram/SourceFiles/settings/settings_main.cpp index 191e6c200..a40cb6f21 100644 --- a/Telegram/SourceFiles/settings/settings_main.cpp +++ b/Telegram/SourceFiles/settings/settings_main.cpp @@ -31,8 +31,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_account.h" #include "main/main_app_config.h" #include "apiwrap.h" -#include "api/api_sensitive_content.h" +#include "api/api_cloud_password.h" #include "api/api_global_privacy.h" +#include "api/api_sensitive_content.h" #include "window/window_controller.h" #include "window/window_session_controller.h" #include "core/click_handler_types.h" @@ -378,7 +379,7 @@ void Main::setupContent(not_null controller) { Ui::ResizeFitChild(this, content); // If we load this in advance it won't jump when we open its' section. - controller->session().api().reloadPasswordState(); + controller->session().api().cloudPassword().reload(); controller->session().api().reloadContactSignupSilent(); controller->session().api().sensitiveContent().reload(); controller->session().api().globalPrivacy().reload(); diff --git a/Telegram/SourceFiles/settings/settings_privacy_security.cpp b/Telegram/SourceFiles/settings/settings_privacy_security.cpp index 7c13bf458..5dbe34c9f 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_security.cpp +++ b/Telegram/SourceFiles/settings/settings_privacy_security.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_authorizations.h" #include "api/api_blocked_peers.h" +#include "api/api_cloud_password.h" #include "api/api_self_destruct.h" #include "api/api_sensitive_content.h" #include "api/api_global_privacy.h" @@ -332,13 +333,13 @@ void SetupCloudPassword( const auto session = &controller->session(); auto has = rpl::single( false - ) | rpl::then(controller->session().api().passwordState( + ) | rpl::then(controller->session().api().cloudPassword().state( ) | rpl::map([](const State &state) { return state.request || state.unknownAlgorithm || !state.unconfirmedPattern.isEmpty(); })) | rpl::distinct_until_changed(); - auto pattern = session->api().passwordState( + auto pattern = session->api().cloudPassword().state( ) | rpl::map([](const State &state) { return state.unconfirmedPattern; }); @@ -361,7 +362,7 @@ void SetupCloudPassword( ) | rpl::then(rpl::duplicate( unconfirmed )); - auto resetAt = session->api().passwordState( + auto resetAt = session->api().cloudPassword().state( ) | rpl::map([](const State &state) { return state.pendingResetDate; }); @@ -427,7 +428,7 @@ void SetupCloudPassword( unconfirmed )))->setDuration(0); confirm->entity()->addClickHandler([=] { - const auto state = session->api().passwordStateCurrent(); + const auto state = session->api().cloudPassword().stateCurrent(); if (!state) { return; } @@ -438,13 +439,13 @@ void SetupCloudPassword( std::move( validation.reloadRequests ) | rpl::start_with_next([=] { - session->api().reloadPasswordState(); + session->api().cloudPassword().reload(); }, validation.box->lifetime()); std::move( validation.cancelRequests ) | rpl::start_with_next([=] { - session->api().clearUnconfirmedPassword(); + session->api().cloudPassword().clearUnconfirmedPassword(); }, validation.box->lifetime()); controller->show(std::move(validation.box)); @@ -551,7 +552,7 @@ void SetupCloudPassword( const auto sent = std::make_shared(0); reset->entity()->addClickHandler([=] { const auto api = &session->api(); - const auto state = api->passwordStateCurrent(); + const auto state = api->cloudPassword().stateCurrent(); const auto date = state ? state->pendingResetDate : TimeId(0); if (!date || *sent) { return; @@ -559,7 +560,7 @@ void SetupCloudPassword( *sent = api->request(MTPaccount_ResetPassword( )).done([=](const MTPaccount_ResetPasswordResult &result) { *sent = 0; - api->applyPendingReset(result); + api->cloudPassword().applyPendingReset(result); }).fail([=](const MTP::Error &error) { *sent = 0; }).send(); @@ -569,7 +570,7 @@ void SetupCloudPassword( *sent = api->request(MTPaccount_DeclinePasswordReset( )).done([=] { *sent = 0; - api->reloadPasswordState(); + api->cloudPassword().reload(); }).fail([=](const MTP::Error &error) { *sent = 0; }).send(); @@ -597,7 +598,7 @@ void SetupCloudPassword( const auto reloadOnActivation = [=](Qt::ApplicationState state) { if (label->toggled() && state == Qt::ApplicationActive) { - controller->session().api().reloadPasswordState(); + controller->session().api().cloudPassword().reload(); } }; QObject::connect( @@ -606,7 +607,7 @@ void SetupCloudPassword( label, reloadOnActivation); - session->api().reloadPasswordState(); + session->api().cloudPassword().reload(); AddSkip(container); AddDivider(container); @@ -810,7 +811,7 @@ int ExceptionUsersCount(const std::vector> &exceptions) { } bool CheckEditCloudPassword(not_null<::Main::Session*> session) { - const auto current = session->api().passwordStateCurrent(); + const auto current = session->api().cloudPassword().stateCurrent(); Assert(current.has_value()); if (!current->unknownAlgorithm @@ -822,7 +823,7 @@ bool CheckEditCloudPassword(not_null<::Main::Session*> session) { } object_ptr EditCloudPasswordBox(not_null session) { - const auto current = session->api().passwordStateCurrent(); + const auto current = session->api().cloudPassword().stateCurrent(); Assert(current.has_value()); auto result = Box( @@ -834,12 +835,12 @@ object_ptr EditCloudPasswordBox(not_null session box->newPasswordSet() | rpl::to_empty, box->passwordReloadNeeded() ) | rpl::start_with_next([=] { - session->api().reloadPasswordState(); + session->api().cloudPassword().reload(); }, box->lifetime()); box->clearUnconfirmedPassword( ) | rpl::start_with_next([=] { - session->api().clearUnconfirmedPassword(); + session->api().cloudPassword().clearUnconfirmedPassword(); }, box->lifetime()); return result; @@ -847,11 +848,11 @@ object_ptr EditCloudPasswordBox(not_null session void RemoveCloudPassword(not_null controller) { const auto session = &controller->session(); - const auto current = session->api().passwordStateCurrent(); + const auto current = session->api().cloudPassword().stateCurrent(); Assert(current.has_value()); if (!current->request) { - session->api().clearUnconfirmedPassword(); + session->api().cloudPassword().clearUnconfirmedPassword(); return; } auto fields = PasscodeBox::CloudFields::From(*current); @@ -862,12 +863,12 @@ void RemoveCloudPassword(not_null controller) { box->newPasswordSet() | rpl::to_empty, box->passwordReloadNeeded() ) | rpl::start_with_next([=] { - session->api().reloadPasswordState(); + session->api().cloudPassword().reload(); }, box->lifetime()); box->clearUnconfirmedPassword( ) | rpl::start_with_next([=] { - session->api().clearUnconfirmedPassword(); + session->api().cloudPassword().clearUnconfirmedPassword(); }, box->lifetime()); controller->show(std::move(box));