From 13dce473ebada6ebe66aa7c8e7d29b30ceaaa9fe Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 10 Jan 2020 02:04:06 +0300 Subject: [PATCH] Safer saving of invite link info. GitOrigin-RevId: 40c122f1dceb2bbc5f2bd9e6204393ce5c694340 --- td/telegram/ContactsManager.cpp | 41 ++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 4b6d4a8cd..c846d450f 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -5796,8 +5796,7 @@ void ContactsManager::export_channel_invite_link(ChannelId channel_id, Promise &&promise) const { - auto it = invite_link_infos_.find(invite_link); - if (it != invite_link_infos_.end()) { + if (invite_link_infos_.count(invite_link) > 0) { return promise.set_value(Unit()); } @@ -10023,11 +10022,6 @@ void ContactsManager::on_update_channel_full_slow_mode_next_send_date(ChannelFul void ContactsManager::on_get_dialog_invite_link_info(const string &invite_link, tl_object_ptr &&chat_invite_ptr) { - auto &invite_link_info = invite_link_infos_[invite_link]; - if (invite_link_info == nullptr) { - invite_link_info = make_unique(); - } - CHECK(chat_invite_ptr != nullptr); switch (chat_invite_ptr->get_id()) { case telegram_api::chatInviteAlready::ID: { @@ -10045,7 +10039,10 @@ void ContactsManager::on_get_dialog_invite_link_info(const string &invite_link, on_get_chat(std::move(chat_invite_already->chat_), "chatInviteAlready"); CHECK(chat_id == ChatId() || channel_id == ChannelId()); - CHECK(invite_link_info != nullptr); + auto &invite_link_info = invite_link_infos_[invite_link]; + if (invite_link_info == nullptr) { + invite_link_info = make_unique(); + } invite_link_info->chat_id = chat_id; invite_link_info->channel_id = channel_id; @@ -10059,22 +10056,28 @@ void ContactsManager::on_get_dialog_invite_link_info(const string &invite_link, } case telegram_api::chatInvite::ID: { auto chat_invite = move_tl_object_as(chat_invite_ptr); - CHECK(invite_link_info != nullptr); + vector participant_user_ids; + for (auto &user : chat_invite->participants_) { + auto user_id = get_user_id(user); + if (!user_id.is_valid()) { + LOG(ERROR) << "Receive invalid " << user_id; + continue; + } + + on_get_user(std::move(user), "chatInvite"); + participant_user_ids.push_back(user_id); + } + + auto &invite_link_info = invite_link_infos_[invite_link]; + if (invite_link_info == nullptr) { + invite_link_info = make_unique(); + } invite_link_info->chat_id = ChatId(); invite_link_info->channel_id = ChannelId(); invite_link_info->title = chat_invite->title_; invite_link_info->photo = get_photo(td_->file_manager_.get(), std::move(chat_invite->photo_), DialogId()); invite_link_info->participant_count = chat_invite->participants_count_; - invite_link_info->participant_user_ids.clear(); - for (auto &user : chat_invite->participants_) { - auto user_id = get_user_id(user); - if (!user_id.is_valid()) { - LOG(ERROR) << "Receive invalid " << user_id; - } else { - on_get_user(std::move(user), "chatInvite"); - } - invite_link_info->participant_user_ids.push_back(user_id); - } + invite_link_info->participant_user_ids = std::move(participant_user_ids); invite_link_info->is_chat = (chat_invite->flags_ & CHAT_INVITE_FLAG_IS_CHANNEL) == 0; invite_link_info->is_channel = (chat_invite->flags_ & CHAT_INVITE_FLAG_IS_CHANNEL) != 0;