Check validness of peer_user_id in secret chats.

GitOrigin-RevId: 299ad87085b8c7b1a1f0de15012e54dfdb2c4d6c
This commit is contained in:
levlam 2019-12-16 01:58:57 +03:00
parent 7620e43376
commit 2c47242374
2 changed files with 28 additions and 15 deletions

View File

@ -2748,7 +2748,7 @@ bool need_skip_bot_commands(const ContactsManager *contacts_manager, DialogId di
return !contacts_manager->is_user_bot(dialog_id.get_user_id());
case DialogType::SecretChat: {
auto user_id = contacts_manager->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
return !contacts_manager->is_user_bot(user_id);
return !user_id.is_valid() || !contacts_manager->is_user_bot(user_id);
}
case DialogType::Chat:
case DialogType::Channel:

View File

@ -6748,7 +6748,7 @@ bool MessagesManager::update_dialog_silent_send_message(Dialog *d, bool silent_s
}
void MessagesManager::repair_dialog_action_bar(DialogId dialog_id) {
if (G()->close_flag()) {
if (G()->close_flag() || !dialog_id.is_valid()) {
return;
}
@ -6875,6 +6875,9 @@ void MessagesManager::change_dialog_report_spam_state_on_server(DialogId dialog_
return td_->create_handler<ReportEncryptedSpamQuery>(std::move(promise))->send(dialog_id);
} else {
auto user_id = td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
if (!user_id.is_valid()) {
return promise.set_error(Status::Error(400, "Peer user not found"));
}
return td_->create_handler<UpdatePeerSettingsQuery>(std::move(promise))->send(DialogId(user_id), false);
}
case DialogType::None:
@ -14886,11 +14889,14 @@ void MessagesManager::open_dialog(Dialog *d) {
get_channel_difference(dialog_id, d->pts, true, "open_dialog");
repair_dialog_action_bar(dialog_id);
break;
case DialogType::SecretChat:
case DialogType::SecretChat: {
// to repair dialog action bar
td_->contacts_manager_->reload_user_full(
td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id()));
auto user_id = td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
if (user_id.is_valid()) {
td_->contacts_manager_->reload_user_full(user_id);
}
break;
}
case DialogType::None:
default:
UNREACHABLE();
@ -20800,11 +20806,13 @@ Result<MessageId> MessagesManager::add_local_message(
if (dialog_type == DialogType::User && DialogId(sender_user_id) != dialog_id) {
return Status::Error(400, "Wrong sender user");
}
if (dialog_type == DialogType::SecretChat &&
sender_user_id != td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id())) {
if (dialog_type == DialogType::SecretChat) {
auto peer_user_id = td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
if (!peer_user_id.is_valid() || sender_user_id != peer_user_id) {
return Status::Error(400, "Wrong sender user");
}
}
}
MessageId message_id = get_next_local_message_id(d);
@ -24664,9 +24672,9 @@ DialogParticipant MessagesManager::get_dialog_participant(DialogId dialog_id, Us
auto peer_user_id = td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
if (user_id == td_->contacts_manager_->get_my_id()) {
promise.set_value(Unit());
return {user_id, peer_user_id, 0, DialogParticipantStatus::Member()};
return {user_id, peer_user_id.is_valid() ? peer_user_id : user_id, 0, DialogParticipantStatus::Member()};
}
if (user_id == peer_user_id) {
if (peer_user_id.is_valid() && user_id == peer_user_id) {
promise.set_value(Unit());
return {peer_user_id, user_id, 0, DialogParticipantStatus::Member()};
}
@ -24687,7 +24695,7 @@ std::pair<int32, vector<DialogParticipant>> MessagesManager::search_private_chat
vector<UserId> user_ids;
switch (filter) {
case DialogParticipantsFilter::Contacts:
if (td_->contacts_manager_->is_user_contact(peer_user_id)) {
if (peer_user_id.is_valid() && td_->contacts_manager_->is_user_contact(peer_user_id)) {
user_ids.push_back(peer_user_id);
}
break;
@ -24695,7 +24703,9 @@ std::pair<int32, vector<DialogParticipant>> MessagesManager::search_private_chat
break;
case DialogParticipantsFilter::Members:
user_ids.push_back(my_user_id);
if (peer_user_id.is_valid()) {
user_ids.push_back(peer_user_id);
}
break;
case DialogParticipantsFilter::Restricted:
break;
@ -24705,7 +24715,7 @@ std::pair<int32, vector<DialogParticipant>> MessagesManager::search_private_chat
if (td_->auth_manager_->is_bot()) {
user_ids.push_back(my_user_id);
}
if (td_->contacts_manager_->is_user_bot(peer_user_id)) {
if (peer_user_id.is_valid() && td_->contacts_manager_->is_user_bot(peer_user_id)) {
user_ids.push_back(peer_user_id);
}
break;
@ -24715,7 +24725,8 @@ std::pair<int32, vector<DialogParticipant>> MessagesManager::search_private_chat
auto result = td_->contacts_manager_->search_among_users(user_ids, query, limit);
return {result.first, transform(result.second, [&](UserId user_id) {
return DialogParticipant(user_id, user_id == my_user_id ? peer_user_id : my_user_id, 0,
return DialogParticipant(user_id,
user_id == my_user_id && peer_user_id.is_valid() ? peer_user_id : my_user_id, 0,
DialogParticipantStatus::Member());
})};
}
@ -27281,7 +27292,9 @@ void MessagesManager::fix_new_dialog(Dialog *d, unique_ptr<Message> &&last_datab
// asynchronously get action bar from the server
if (dialog_type == DialogType::SecretChat) {
auto user_id = td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
if (user_id.is_valid()) {
force_create_dialog(DialogId(user_id), "add chat with user to load/store action_bar");
}
} else {
repair_dialog_action_bar(dialog_id);
}