Added ability to validate expired cloud password in management section.

This commit is contained in:
23rd 2022-05-10 02:47:16 +03:00
parent f3efa85206
commit e364b80d0a
7 changed files with 69 additions and 12 deletions

View file

@ -730,6 +730,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_cloud_password_reset_cancel_title" = "Cancel reset";
"lng_cloud_password_reset_cancel_sure" = "Cancel the password reset process? If you request a new reset later, it will take another 7 days.";
"lng_cloud_password_reset_later" = "You recently requested a password reset that was cancelled. Please wait {duration} before making a new request.";
"lng_cloud_password_expired" = "Please re-enter your password.";
"lng_connection_auto_connecting" = "Default (connecting...)";
"lng_connection_auto" = "Default ({transport} used)";

View file

@ -11,7 +11,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lang/lang_keys.h"
#include "lottie/lottie_icon.h"
#include "main/main_session.h"
#include "settings/cloud_password/settings_cloud_password_common.h"
#include "settings/cloud_password/settings_cloud_password_email.h"
#include "settings/cloud_password/settings_cloud_password_email_confirm.h"
#include "settings/cloud_password/settings_cloud_password_hint.h"
#include "settings/cloud_password/settings_cloud_password_input.h"
#include "settings/cloud_password/settings_cloud_password_manage.h"
#include "settings/cloud_password/settings_cloud_password_start.h"
#include "settings/settings_common.h"
#include "ui/boxes/confirm_box.h"
#include "ui/widgets/buttons.h"
#include "ui/widgets/input_fields.h"
#include "ui/widgets/labels.h"
@ -250,6 +258,10 @@ Api::CloudPassword &AbstractStep::cloudPassword() {
return _controller->session().api().cloudPassword();
}
rpl::producer<AbstractStep::Types> AbstractStep::removeTypes() {
return rpl::never<Types>();
}
void AbstractStep::showBack() {
_showBack.fire({});
}
@ -276,6 +288,30 @@ void AbstractStep::setInnerFocus() {
}
}
bool AbstractStep::isPasswordInvalidError(const QString &type) {
if (type == u"PASSWORD_HASH_INVALID"_q
|| type == u"SRP_PASSWORD_CHANGED"_q) {
// Most likely the cloud password has been changed on another device.
// Quit.
_quits.fire(AbstractStep::Types{
CloudPasswordStartId(),
CloudPasswordInputId(),
CloudPasswordHintId(),
CloudPasswordEmailId(),
CloudPasswordEmailConfirmId(),
CloudPasswordManageId(),
});
controller()->show(
Ui::MakeInformBox(tr::lng_cloud_password_expired()),
Ui::LayerOption::CloseOther);
setStepData(StepData());
showBack();
return true;
}
return false;
}
rpl::producer<Type> AbstractStep::sectionShowOther() {
return _showOther.events();
}
@ -284,6 +320,10 @@ rpl::producer<> AbstractStep::sectionShowBack() {
return _showBack.events();
}
rpl::producer<std::vector<Type>> AbstractStep::removeFromStack() {
return rpl::merge(removeTypes(), _quits.events());
}
void AbstractStep::setStepDataReference(std::any &data) {
_stepData = &data;
}

View file

@ -43,6 +43,8 @@ struct StepData {
ProcessRecover processRecover;
};
void SetupAutoCloseTimer(rpl::lifetime &lifetime, Fn<void()> callback);
void SetupHeader(
not_null<Ui::VerticalLayout*> content,
const QString &lottie,
@ -102,15 +104,18 @@ private:
class AbstractStep : public AbstractSection {
public:
using Types = std::vector<Type>;
AbstractStep(
QWidget *parent,
not_null<Window::SessionController*> controller);
~AbstractStep();
void showFinished() override;
void setInnerFocus() override;
[[nodiscard]] rpl::producer<Type> sectionShowOther() override;
[[nodiscard]] rpl::producer<> sectionShowBack() override;
void showFinished() override final;
void setInnerFocus() override final;
[[nodiscard]] rpl::producer<Type> sectionShowOther() override final;
[[nodiscard]] rpl::producer<> sectionShowBack() override final;
[[nodiscard]] rpl::producer<Types> removeFromStack() override final;
void setStepDataReference(std::any &data) override;
@ -118,6 +123,10 @@ protected:
[[nodiscard]] not_null<Window::SessionController*> controller() const;
[[nodiscard]] Api::CloudPassword &cloudPassword();
[[nodiscard]] virtual rpl::producer<Types> removeTypes();
bool isPasswordInvalidError(const QString &type);
void showBack();
void showOther(Type type);
@ -136,6 +145,7 @@ private:
rpl::event_stream<> _showFinished;
rpl::event_stream<Type> _showOther;
rpl::event_stream<> _showBack;
rpl::event_stream<Types> _quits;
std::any *_stepData;

View file

@ -121,6 +121,7 @@ void Email::setupContent() {
if (MTP::IsFloodError(type)) {
error->show();
error->setText(tr::lng_flood_error(tr::now));
} else if (AbstractStep::isPasswordInvalidError(type)) {
} else if (type == u"EMAIL_INVALID"_q) {
error->show();
error->setText(tr::lng_cloud_password_bad_email(tr::now));

View file

@ -56,7 +56,8 @@ public:
[[nodiscard]] rpl::producer<QString> title() override;
void setupContent();
[[nodiscard]] rpl::producer<std::vector<Type>> removeFromStack() override;
protected:
[[nodiscard]] rpl::producer<std::vector<Type>> removeTypes() override;
private:
rpl::lifetime _requestLifetime;
@ -67,7 +68,7 @@ rpl::producer<QString> EmailConfirm::title() {
return tr::lng_settings_cloud_password_email_title();
}
rpl::producer<std::vector<Type>> EmailConfirm::removeFromStack() {
rpl::producer<std::vector<Type>> EmailConfirm::removeTypes() {
return rpl::single(std::vector<Type>{
CloudPasswordStartId(),
CloudPasswordInputId(),

View file

@ -118,7 +118,8 @@ public:
[[nodiscard]] rpl::producer<QString> title() override;
void setupContent();
[[nodiscard]] rpl::producer<std::vector<Type>> removeFromStack() override;
protected:
[[nodiscard]] rpl::producer<std::vector<Type>> removeTypes() override;
private:
void setupRecoverButton(
@ -132,7 +133,7 @@ private:
};
rpl::producer<std::vector<Type>> Input::removeFromStack() {
rpl::producer<std::vector<Type>> Input::removeTypes() {
return _removesFromStack.value();
}

View file

@ -94,11 +94,12 @@ public:
[[nodiscard]] rpl::producer<QString> title() override;
void setupContent();
[[nodiscard]] rpl::producer<std::vector<Type>> removeFromStack() override;
[[nodiscard]] QPointer<Ui::RpWidget> createPinnedToBottom(
not_null<Ui::RpWidget*> parent) override;
protected:
[[nodiscard]] rpl::producer<std::vector<Type>> removeTypes() override;
private:
rpl::variable<bool> _isBottomFillerShown;
@ -112,7 +113,7 @@ rpl::producer<QString> Manage::title() {
return tr::lng_settings_cloud_password_start_title();
}
rpl::producer<std::vector<Type>> Manage::removeFromStack() {
rpl::producer<std::vector<Type>> Manage::removeTypes() {
return rpl::single(std::vector<Type>{
CloudPasswordStartId(),
CloudPasswordInputId(),
@ -221,7 +222,9 @@ QPointer<Ui::RpWidget> Manage::createPinnedToBottom(
QString(),
false,
QString()
) | rpl::start_with_done([=] {
) | rpl::start_with_error_done([=](const QString &type) {
AbstractStep::isPasswordInvalidError(type);
}, [=] {
setStepData(StepData());
close();
showBack();