diff --git a/td/telegram/DialogFilter.cpp b/td/telegram/DialogFilter.cpp index 04d3cca7b..beec88501 100644 --- a/td/telegram/DialogFilter.cpp +++ b/td/telegram/DialogFilter.cpp @@ -16,6 +16,10 @@ namespace td { +int32 DialogFilter::get_max_filter_dialogs() { + return 100; // server side limit +} + unique_ptr DialogFilter::get_dialog_filter( telegram_api::object_ptr filter_ptr, bool with_id) { if (filter_ptr->get_id() != telegram_api::dialogFilter::ID) { @@ -92,16 +96,15 @@ Status DialogFilter::check_limits() const { auto included_secret_dialog_count = static_cast(included_dialog_ids.size()) - included_server_dialog_count; auto pinned_secret_dialog_count = static_cast(pinned_dialog_ids.size()) - pinned_server_dialog_count; - if (excluded_server_dialog_count > MAX_INCLUDED_FILTER_DIALOGS || - excluded_secret_dialog_count > MAX_INCLUDED_FILTER_DIALOGS) { + auto limit = get_max_filter_dialogs(); + if (excluded_server_dialog_count > limit || excluded_secret_dialog_count > limit) { return Status::Error(400, "The maximum number of excluded chats exceeded"); } - if (included_server_dialog_count > MAX_INCLUDED_FILTER_DIALOGS || - included_secret_dialog_count > MAX_INCLUDED_FILTER_DIALOGS) { + if (included_server_dialog_count > limit || included_secret_dialog_count > limit) { return Status::Error(400, "The maximum number of included chats exceeded"); } - if (included_server_dialog_count + pinned_server_dialog_count > MAX_INCLUDED_FILTER_DIALOGS || - included_secret_dialog_count + pinned_secret_dialog_count > MAX_INCLUDED_FILTER_DIALOGS) { + if (included_server_dialog_count + pinned_server_dialog_count > limit || + included_secret_dialog_count + pinned_secret_dialog_count > limit) { return Status::Error(400, "The maximum number of pinned chats exceeded"); } diff --git a/td/telegram/DialogFilter.h b/td/telegram/DialogFilter.h index 91a718b53..f42759ca0 100644 --- a/td/telegram/DialogFilter.h +++ b/td/telegram/DialogFilter.h @@ -20,8 +20,6 @@ namespace td { class DialogFilter { public: - static constexpr int32 MAX_INCLUDED_FILTER_DIALOGS = 100; // server side limit - DialogFilterId dialog_filter_id; string title; string emoji; @@ -43,6 +41,8 @@ class DialogFilter { template void parse(ParserT &parser); + static int32 get_max_filter_dialogs(); + static unique_ptr get_dialog_filter(telegram_api::object_ptr filter_ptr, bool with_id); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 59df3a2ae..0780327a7 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -19069,8 +19069,9 @@ Result> MessagesManager::create_dialog_filter(DialogFil void MessagesManager::create_dialog_filter(td_api::object_ptr filter, Promise> &&promise) { CHECK(!td_->auth_manager_->is_bot()); - auto max_dialog_filters = G()->shared_config().get_option_integer("chat_filter_count_max"); - if (dialog_filters_.size() >= max_dialog_filters) { + auto max_dialog_filters = clamp(G()->shared_config().get_option_integer("chat_filter_count_max"), + static_cast(0), static_cast(100)); + if (dialog_filters_.size() >= narrow_cast(max_dialog_filters)) { return promise.set_error(Status::Error(400, "The maximum number of chat folders exceeded")); } if (!is_update_chat_filters_sent_) { @@ -19813,7 +19814,7 @@ void MessagesManager::clear_all_draft_messages(bool exclude_secret_chats, Promis int32 MessagesManager::get_pinned_dialogs_limit(DialogListId dialog_list_id) { if (dialog_list_id.is_filter()) { - return DialogFilter::MAX_INCLUDED_FILTER_DIALOGS; + return DialogFilter::get_max_filter_dialogs(); } Slice key{"pinned_chat_count_max"}; @@ -33111,7 +33112,7 @@ vector MessagesManager::get_dialog_lists_to_add_dialog(DialogId di // the dialog isn't added yet to the dialog list // check that it can be actually added if (dialog_filter->included_dialog_ids.size() + dialog_filter->pinned_dialog_ids.size() < - DialogFilter::MAX_INCLUDED_FILTER_DIALOGS) { + narrow_cast(DialogFilter::get_max_filter_dialogs())) { // fast path result.push_back(DialogListId(dialog_filter_id)); continue;