Support standalone SetPassword suggested action.

This commit is contained in:
levlam 2023-01-17 13:22:21 +03:00
parent 91ab399946
commit 2d7608459e
6 changed files with 28 additions and 11 deletions

View File

@ -4816,7 +4816,8 @@ suggestedActionViewChecksHint = SuggestedAction;
//@description Suggests the user to convert specified supergroup to a broadcast group @supergroup_id Supergroup identifier //@description Suggests the user to convert specified supergroup to a broadcast group @supergroup_id Supergroup identifier
suggestedActionConvertToBroadcastGroup supergroup_id:int53 = SuggestedAction; suggestedActionConvertToBroadcastGroup supergroup_id:int53 = SuggestedAction;
//@description Suggests the user to set a 2-step verification password to be able to log in again @authorization_delay The number of days to pass between consecutive authorizations if the user declines to set password //@description Suggests the user to set a 2-step verification password to be able to log in again
//@authorization_delay The number of days to pass between consecutive authorizations if the user declines to set password; if 0, then the user is advised to set the password for security reasons
suggestedActionSetPassword authorization_delay:int32 = SuggestedAction; suggestedActionSetPassword authorization_delay:int32 = SuggestedAction;

View File

@ -1463,8 +1463,6 @@ void ConfigManager::process_app_config(tl_object_ptr<telegram_api::JSONValue> &c
CHECK(config != nullptr); CHECK(config != nullptr);
LOG(INFO) << "Receive app config " << to_string(config); LOG(INFO) << "Receive app config " << to_string(config);
const bool archive_and_mute = G()->get_option_boolean("archive_and_mute_new_chats_from_unknown_users");
string autologin_token; string autologin_token;
vector<string> autologin_domains; vector<string> autologin_domains;
vector<string> url_auth_domains; vector<string> url_auth_domains;
@ -1664,6 +1662,8 @@ void ConfigManager::process_app_config(tl_object_ptr<telegram_api::JSONValue> &c
if (key == "pending_suggestions") { if (key == "pending_suggestions") {
if (value->get_id() == telegram_api::jsonArray::ID) { if (value->get_id() == telegram_api::jsonArray::ID) {
auto actions = std::move(static_cast<telegram_api::jsonArray *>(value)->value_); auto actions = std::move(static_cast<telegram_api::jsonArray *>(value)->value_);
const bool archive_and_mute = G()->get_option_boolean("archive_and_mute_new_chats_from_unknown_users");
auto otherwise_relogin_days = G()->get_option_integer("otherwise_relogin_days");
for (auto &action : actions) { for (auto &action : actions) {
auto action_str = get_json_value_string(std::move(action), key); auto action_str = get_json_value_string(std::move(action), key);
SuggestedAction suggested_action(action_str); SuggestedAction suggested_action(action_str);
@ -1671,6 +1671,9 @@ void ConfigManager::process_app_config(tl_object_ptr<telegram_api::JSONValue> &c
if (archive_and_mute && if (archive_and_mute &&
suggested_action == SuggestedAction{SuggestedAction::Type::EnableArchiveAndMuteNewChats}) { suggested_action == SuggestedAction{SuggestedAction::Type::EnableArchiveAndMuteNewChats}) {
LOG(INFO) << "Skip EnableArchiveAndMuteNewChats suggested action"; LOG(INFO) << "Skip EnableArchiveAndMuteNewChats suggested action";
} else if (otherwise_relogin_days > 0 &&
suggested_action == SuggestedAction{SuggestedAction::Type::SetPassword}) {
LOG(INFO) << "Skip SetPassword suggested action";
} else { } else {
suggested_actions.push_back(suggested_action); suggested_actions.push_back(suggested_action);
} }
@ -2025,7 +2028,7 @@ void ConfigManager::process_app_config(tl_object_ptr<telegram_api::JSONValue> &c
void ConfigManager::get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const { void ConfigManager::get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const {
if (!suggested_actions_.empty()) { if (!suggested_actions_.empty()) {
updates.push_back(get_update_suggested_actions_object(suggested_actions_, {})); updates.push_back(get_update_suggested_actions_object(suggested_actions_, {}, "get_current_state"));
} }
} }

View File

@ -303,7 +303,7 @@ td_api::object_ptr<td_api::Update> OptionManager::get_internal_option_update(Sli
auto days = narrow_cast<int32>(get_option_integer(name)); auto days = narrow_cast<int32>(get_option_integer(name));
if (days > 0) { if (days > 0) {
vector<SuggestedAction> added_actions{SuggestedAction{SuggestedAction::Type::SetPassword, DialogId(), days}}; vector<SuggestedAction> added_actions{SuggestedAction{SuggestedAction::Type::SetPassword, DialogId(), days}};
return get_update_suggested_actions_object(added_actions, {}); return get_update_suggested_actions_object(added_actions, {}, "get_internal_option_update");
} }
} }
return nullptr; return nullptr;

View File

@ -821,6 +821,7 @@ void PasswordManager::do_get_state(Promise<PasswordState> promise) {
dismiss_suggested_action(SuggestedAction{SuggestedAction::Type::SetPassword, DialogId(), days}, dismiss_suggested_action(SuggestedAction{SuggestedAction::Type::SetPassword, DialogId(), days},
Promise<Unit>()); Promise<Unit>());
} }
dismiss_suggested_action(SuggestedAction{SuggestedAction::Type::SetPassword}, Promise<Unit>());
} else { } else {
state.has_password = false; state.has_password = false;
send_closure(actor_id, &PasswordManager::drop_cached_secret); send_closure(actor_id, &PasswordManager::drop_cached_secret);

View File

@ -35,6 +35,8 @@ SuggestedAction::SuggestedAction(Slice action_str) {
init(Type::CheckPhoneNumber); init(Type::CheckPhoneNumber);
} else if (action_str == Slice("NEWCOMER_TICKS")) { } else if (action_str == Slice("NEWCOMER_TICKS")) {
init(Type::ViewChecksHint); init(Type::ViewChecksHint);
} else if (action_str == Slice("SETUP_PASSWORD")) {
init(Type::SetPassword);
} }
} }
@ -95,6 +97,8 @@ string SuggestedAction::get_suggested_action_str() const {
return "NEWCOMER_TICKS"; return "NEWCOMER_TICKS";
case Type::ConvertToGigagroup: case Type::ConvertToGigagroup:
return "CONVERT_GIGAGROUP"; return "CONVERT_GIGAGROUP";
case Type::SetPassword:
return "SETUP_PASSWORD";
default: default:
return string(); return string();
} }
@ -123,7 +127,8 @@ td_api::object_ptr<td_api::SuggestedAction> SuggestedAction::get_suggested_actio
} }
td_api::object_ptr<td_api::updateSuggestedActions> get_update_suggested_actions_object( td_api::object_ptr<td_api::updateSuggestedActions> get_update_suggested_actions_object(
const vector<SuggestedAction> &added_actions, const vector<SuggestedAction> &removed_actions) { const vector<SuggestedAction> &added_actions, const vector<SuggestedAction> &removed_actions, const char *source) {
LOG(INFO) << "Get updateSuggestedActions from " << source;
auto get_object = [](const SuggestedAction &action) { auto get_object = [](const SuggestedAction &action) {
return action.get_suggested_action_object(); return action.get_suggested_action_object();
}; };
@ -154,12 +159,14 @@ void update_suggested_actions(vector<SuggestedAction> &suggested_actions,
} }
CHECK(!added_actions.empty() || !removed_actions.empty()); CHECK(!added_actions.empty() || !removed_actions.empty());
suggested_actions = std::move(new_suggested_actions); suggested_actions = std::move(new_suggested_actions);
send_closure(G()->td(), &Td::send_update, get_update_suggested_actions_object(added_actions, removed_actions)); send_closure(G()->td(), &Td::send_update,
get_update_suggested_actions_object(added_actions, removed_actions, "update_suggested_actions"));
} }
void remove_suggested_action(vector<SuggestedAction> &suggested_actions, SuggestedAction suggested_action) { void remove_suggested_action(vector<SuggestedAction> &suggested_actions, SuggestedAction suggested_action) {
if (td::remove(suggested_actions, suggested_action)) { if (td::remove(suggested_actions, suggested_action)) {
send_closure(G()->td(), &Td::send_update, get_update_suggested_actions_object({}, {suggested_action})); send_closure(G()->td(), &Td::send_update,
get_update_suggested_actions_object({}, {suggested_action}, "remove_suggested_action"));
} }
} }
@ -177,13 +184,18 @@ void dismiss_suggested_action(SuggestedAction action, Promise<Unit> &&promise) {
return send_closure_later(G()->contacts_manager(), &ContactsManager::dismiss_dialog_suggested_action, return send_closure_later(G()->contacts_manager(), &ContactsManager::dismiss_dialog_suggested_action,
std::move(action), std::move(promise)); std::move(action), std::move(promise));
case SuggestedAction::Type::SetPassword: { case SuggestedAction::Type::SetPassword: {
if (action.otherwise_relogin_days_ <= 0) { if (action.otherwise_relogin_days_ < 0) {
return promise.set_error(Status::Error(400, "Invalid authorization_delay specified")); return promise.set_error(Status::Error(400, "Invalid authorization_delay specified"));
} }
if (action.otherwise_relogin_days_ == 0) {
return send_closure_later(G()->config_manager(), &ConfigManager::dismiss_suggested_action, std::move(action),
std::move(promise));
}
auto days = narrow_cast<int32>(G()->get_option_integer("otherwise_relogin_days")); auto days = narrow_cast<int32>(G()->get_option_integer("otherwise_relogin_days"));
if (days == action.otherwise_relogin_days_) { if (days == action.otherwise_relogin_days_) {
vector<SuggestedAction> removed_actions{SuggestedAction{SuggestedAction::Type::SetPassword, DialogId(), days}}; vector<SuggestedAction> removed_actions{SuggestedAction{SuggestedAction::Type::SetPassword, DialogId(), days}};
send_closure(G()->td(), &Td::send_update, get_update_suggested_actions_object({}, removed_actions)); send_closure(G()->td(), &Td::send_update,
get_update_suggested_actions_object({}, removed_actions, "dismiss_suggested_action"));
G()->set_option_empty("otherwise_relogin_days"); G()->set_option_empty("otherwise_relogin_days");
} }
return promise.set_value(Unit()); return promise.set_value(Unit());

View File

@ -67,7 +67,7 @@ inline bool operator<(const SuggestedAction &lhs, const SuggestedAction &rhs) {
} }
td_api::object_ptr<td_api::updateSuggestedActions> get_update_suggested_actions_object( td_api::object_ptr<td_api::updateSuggestedActions> get_update_suggested_actions_object(
const vector<SuggestedAction> &added_actions, const vector<SuggestedAction> &removed_actions); const vector<SuggestedAction> &added_actions, const vector<SuggestedAction> &removed_actions, const char *source);
void update_suggested_actions(vector<SuggestedAction> &suggested_actions, void update_suggested_actions(vector<SuggestedAction> &suggested_actions,
vector<SuggestedAction> &&new_suggested_actions); vector<SuggestedAction> &&new_suggested_actions);