From d43fd3beb3b33bc10598e50ca7ffa55f6fc06117 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 27 Oct 2023 03:37:26 +0300 Subject: [PATCH] Disallow MessageInputReplyTo copying. --- td/telegram/AttachMenuManager.cpp | 8 +++--- td/telegram/AttachMenuManager.h | 2 +- td/telegram/MessageInputReplyTo.cpp | 23 ++------------- td/telegram/MessageInputReplyTo.h | 5 ++++ td/telegram/MessagesManager.cpp | 43 +++++++++++++++-------------- td/telegram/MessagesManager.h | 4 +-- 6 files changed, 36 insertions(+), 49 deletions(-) diff --git a/td/telegram/AttachMenuManager.cpp b/td/telegram/AttachMenuManager.cpp index f09b9a780..bca3de452 100644 --- a/td/telegram/AttachMenuManager.cpp +++ b/td/telegram/AttachMenuManager.cpp @@ -198,7 +198,7 @@ class RequestWebViewQuery final : public Td::ResultHandler { auto ptr = result_ptr.move_as_ok(); td_->attach_menu_manager_->open_web_view(ptr->query_id_, dialog_id_, bot_user_id_, top_thread_message_id_, - input_reply_to_, as_dialog_id_); + std::move(input_reply_to_), as_dialog_id_); promise_.set_value(td_api::make_object(ptr->query_id_, ptr->url_)); } @@ -217,7 +217,7 @@ class ProlongWebViewQuery final : public Td::ResultHandler { public: void send(DialogId dialog_id, UserId bot_user_id, int64 query_id, MessageId top_thread_message_id, - MessageInputReplyTo input_reply_to, bool silent, DialogId as_dialog_id) { + const MessageInputReplyTo &input_reply_to, bool silent, DialogId as_dialog_id) { dialog_id_ = dialog_id; auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); @@ -876,11 +876,11 @@ void AttachMenuManager::request_web_view(DialogId dialog_id, UserId bot_user_id, td_->create_handler(std::move(promise)) ->send(dialog_id, bot_user_id, std::move(input_user), std::move(url), std::move(theme), std::move(platform), - top_thread_message_id, input_reply_to, silent, as_dialog_id); + top_thread_message_id, std::move(input_reply_to), silent, as_dialog_id); } void AttachMenuManager::open_web_view(int64 query_id, DialogId dialog_id, UserId bot_user_id, - MessageId top_thread_message_id, MessageInputReplyTo input_reply_to, + MessageId top_thread_message_id, MessageInputReplyTo &&input_reply_to, DialogId as_dialog_id) { if (query_id == 0) { LOG(ERROR) << "Receive Web App query identifier == 0"; diff --git a/td/telegram/AttachMenuManager.h b/td/telegram/AttachMenuManager.h index ca386696f..0adf24033 100644 --- a/td/telegram/AttachMenuManager.h +++ b/td/telegram/AttachMenuManager.h @@ -48,7 +48,7 @@ class AttachMenuManager final : public Actor { Promise> &&promise); void open_web_view(int64 query_id, DialogId dialog_id, UserId bot_user_id, MessageId top_thread_message_id, - MessageInputReplyTo input_reply_to, DialogId as_dialog_id); + MessageInputReplyTo &&input_reply_to, DialogId as_dialog_id); void close_web_view(int64 query_id, Promise &&promise); diff --git a/td/telegram/MessageInputReplyTo.cpp b/td/telegram/MessageInputReplyTo.cpp index a5ccba60b..cb4a4c19b 100644 --- a/td/telegram/MessageInputReplyTo.cpp +++ b/td/telegram/MessageInputReplyTo.cpp @@ -16,27 +16,8 @@ #include "td/utils/logging.h" namespace td { -/* -MessageInputReplyTo::MessageInputReplyTo(const td_api::object_ptr &reply_to_ptr) { - if (reply_to_ptr == nullptr) { - return; - } - switch (reply_to_ptr->get_id()) { - case td_api::inputMessageReplyToMessage::ID: { - auto reply_to = static_cast(reply_to_ptr.get()); - message_id_ = MessageId(reply_to->message_id_); - break; - } - case td_api::inputMessageReplyToStory::ID: { - auto reply_to = static_cast(reply_to_ptr.get()); - story_full_id_ = {DialogId(reply_to->story_sender_chat_id_), StoryId(reply_to->story_id_)}; - break; - } - default: - UNREACHABLE(); - } -} -*/ + +MessageInputReplyTo::~MessageInputReplyTo() = default; MessageInputReplyTo::MessageInputReplyTo(Td *td, telegram_api::object_ptr &&input_reply_to) { diff --git a/td/telegram/MessageInputReplyTo.h b/td/telegram/MessageInputReplyTo.h index e9d5d00bd..3879fb7f8 100644 --- a/td/telegram/MessageInputReplyTo.h +++ b/td/telegram/MessageInputReplyTo.h @@ -33,6 +33,11 @@ class MessageInputReplyTo { public: MessageInputReplyTo() = default; + MessageInputReplyTo(const MessageInputReplyTo &) = delete; + MessageInputReplyTo &operator=(const MessageInputReplyTo &) = delete; + MessageInputReplyTo(MessageInputReplyTo &&) = default; + MessageInputReplyTo &operator=(MessageInputReplyTo &&) = default; + ~MessageInputReplyTo(); explicit MessageInputReplyTo(MessageId message_id) : message_id_(message_id) { } diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index d35e483f0..b337f561e 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -24259,7 +24259,7 @@ int64 MessagesManager::generate_new_random_id(const Dialog *d) { } unique_ptr MessagesManager::create_message_to_send( - Dialog *d, MessageId top_thread_message_id, MessageInputReplyTo input_reply_to, const MessageSendOptions &options, + Dialog *d, MessageId top_thread_message_id, MessageInputReplyTo &&input_reply_to, const MessageSendOptions &options, unique_ptr &&content, bool invert_media, bool suppress_reply_info, unique_ptr forward_info, bool is_copy, DialogId send_as_dialog_id) const { CHECK(d != nullptr); @@ -24401,14 +24401,14 @@ unique_ptr MessagesManager::create_message_to_send( } MessagesManager::Message *MessagesManager::get_message_to_send( - Dialog *d, MessageId top_thread_message_id, MessageInputReplyTo input_reply_to, const MessageSendOptions &options, + Dialog *d, MessageId top_thread_message_id, MessageInputReplyTo &&input_reply_to, const MessageSendOptions &options, unique_ptr &&content, bool invert_media, bool *need_update_dialog_pos, bool suppress_reply_info, unique_ptr forward_info, bool is_copy, DialogId send_as_dialog_id) { d->was_opened = true; auto message = - create_message_to_send(d, top_thread_message_id, input_reply_to, options, std::move(content), invert_media, - suppress_reply_info, std::move(forward_info), is_copy, send_as_dialog_id); + create_message_to_send(d, top_thread_message_id, std::move(input_reply_to), options, std::move(content), + invert_media, suppress_reply_info, std::move(forward_info), is_copy, send_as_dialog_id); MessageId message_id = options.schedule_date != 0 ? get_next_yet_unsent_scheduled_message_id(d, options.schedule_date) : get_next_yet_unsent_message_id(d); @@ -24927,8 +24927,8 @@ Result> MessagesManager::send_message( unique_ptr message; Message *m; if (message_send_options.only_preview) { - message = create_message_to_send(d, top_thread_message_id, input_reply_to, message_send_options, std::move(content), - message_content.invert_media, false, nullptr, + message = create_message_to_send(d, top_thread_message_id, std::move(input_reply_to), message_send_options, + std::move(content), message_content.invert_media, false, nullptr, message_content.via_bot_user_id.is_valid(), DialogId()); MessageId new_message_id = message_send_options.schedule_date != 0 ? get_next_yet_unsent_scheduled_message_id(d, message_send_options.schedule_date) @@ -24936,8 +24936,8 @@ Result> MessagesManager::send_message( message->message_id = new_message_id; m = message.get(); } else { - m = get_message_to_send(d, top_thread_message_id, input_reply_to, message_send_options, std::move(content), - message_content.invert_media, &need_update_dialog_pos, false, nullptr, + m = get_message_to_send(d, top_thread_message_id, std::move(input_reply_to), message_send_options, + std::move(content), message_content.invert_media, &need_update_dialog_pos, false, nullptr, message_content.via_bot_user_id.is_valid()); } m->reply_markup = std::move(message_reply_markup); @@ -25204,7 +25204,7 @@ Result> MessagesManager::send_message_group unique_ptr message; Message *m; if (message_send_options.only_preview) { - message = create_message_to_send(d, top_thread_message_id, input_reply_to, message_send_options, + message = create_message_to_send(d, top_thread_message_id, std::move(input_reply_to), message_send_options, std::move(message_content.content), message_content.invert_media, i != 0, nullptr, false, DialogId()); MessageId new_message_id = message_send_options.schedule_date != 0 @@ -25213,7 +25213,7 @@ Result> MessagesManager::send_message_group message->message_id = new_message_id; m = message.get(); } else { - m = get_message_to_send(d, top_thread_message_id, input_reply_to, message_send_options, + m = get_message_to_send(d, top_thread_message_id, std::move(input_reply_to), message_send_options, dup_message_content(td_, dialog_id, message_content.content.get(), MessageContentDupType::Send, MessageCopyOptions()), message_content.invert_media, &need_update_dialog_pos, i != 0); @@ -26098,7 +26098,7 @@ Result> MessagesManager::send_inline_query_r Message *m; if (message_send_options.only_preview) { message = - create_message_to_send(d, top_thread_message_id, input_reply_to, message_send_options, + create_message_to_send(d, top_thread_message_id, std::move(input_reply_to), message_send_options, std::move(message_content), content->invert_media, false, nullptr, true, DialogId()); MessageId new_message_id = message_send_options.schedule_date != 0 ? get_next_yet_unsent_scheduled_message_id(d, message_send_options.schedule_date) @@ -26106,8 +26106,9 @@ Result> MessagesManager::send_inline_query_r message->message_id = new_message_id; m = message.get(); } else { - m = get_message_to_send(d, top_thread_message_id, input_reply_to, message_send_options, std::move(message_content), - content->invert_media, &need_update_dialog_pos, false, nullptr, true); + m = get_message_to_send(d, top_thread_message_id, std::move(input_reply_to), message_send_options, + std::move(message_content), content->invert_media, &need_update_dialog_pos, false, nullptr, + true); } m->hide_via_bot = hide_via_bot; @@ -28002,7 +28003,7 @@ Result MessagesManager::get_forwarded_messag if (is_local_copy) { auto original_reply_to_message_id = forwarded_message->replied_message_info.get_same_chat_reply_to_message_id(); copied_messages.push_back( - {std::move(content), input_reply_to, forwarded_message->message_id, original_reply_to_message_id, + {std::move(content), std::move(input_reply_to), forwarded_message->message_id, original_reply_to_message_id, std::move(reply_markup), forwarded_message->media_album_id, get_message_disable_web_page_preview(forwarded_message), forwarded_message->invert_media, i}); } else { @@ -28148,7 +28149,7 @@ Result> MessagesManager::forward_messages( forwarded_message_id_to_new_message_id.emplace(copied_message.original_message_id, MessageId()); } for (auto &copied_message : copied_messages) { - auto input_reply_to = copied_message.input_reply_to; + auto input_reply_to = std::move(copied_message.input_reply_to); if (!input_reply_to.is_valid() && copied_message.original_reply_to_message_id.is_valid() && is_secret) { auto it = forwarded_message_id_to_new_message_id.find(copied_message.original_reply_to_message_id); if (it != forwarded_message_id_to_new_message_id.end()) { @@ -28159,9 +28160,9 @@ Result> MessagesManager::forward_messages( unique_ptr message; Message *m; if (message_send_options.only_preview) { - message = create_message_to_send(to_dialog, top_thread_message_id, input_reply_to, message_send_options, - std::move(copied_message.content), copied_message.invert_media, false, nullptr, - is_copy, DialogId()); + message = create_message_to_send(to_dialog, top_thread_message_id, std::move(input_reply_to), + message_send_options, std::move(copied_message.content), + copied_message.invert_media, false, nullptr, is_copy, DialogId()); MessageId new_message_id = message_send_options.schedule_date != 0 ? get_next_yet_unsent_scheduled_message_id(to_dialog, message_send_options.schedule_date) @@ -28175,7 +28176,7 @@ Result> MessagesManager::forward_messages( extract_authentication_codes(from_dialog_id, forwarded_message, authentication_codes); } - m = get_message_to_send(to_dialog, top_thread_message_id, input_reply_to, message_send_options, + m = get_message_to_send(to_dialog, top_thread_message_id, std::move(input_reply_to), message_send_options, std::move(copied_message.content), copied_message.invert_media, &need_update_dialog_pos, false, nullptr, is_copy); } @@ -28300,7 +28301,7 @@ Result> MessagesManager::resend_messages(DialogId dialog_id, v message->update_stickersets_order, message->noforwards, false, get_message_schedule_date(message.get()), message->sending_id); Message *m = - get_message_to_send(d, message->top_thread_message_id, *get_message_input_reply_to(message.get()), options, + get_message_to_send(d, message->top_thread_message_id, std::move(message->input_reply_to), options, std::move(new_contents[i]), message->invert_media, &need_update_dialog_pos, false, nullptr, message->is_copy, need_another_sender ? DialogId() : get_message_sender(message.get())); m->reply_markup = std::move(message->reply_markup); @@ -30834,7 +30835,7 @@ MessageFullId MessagesManager::on_send_message_success(int64 random_id, MessageI } const auto *input_reply_to = get_message_input_reply_to(sent_message.get()); - if (input_reply_to->is_valid() && + if (input_reply_to != nullptr && input_reply_to->is_valid() && input_reply_to->get_reply_message_full_id(dialog_id).get_message_id().is_yet_unsent()) { set_message_reply(d, sent_message.get(), MessageId(), false); } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 44460da3c..13d45bc2c 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1798,12 +1798,12 @@ class MessagesManager final : public Actor { int64 generate_new_random_id(const Dialog *d); unique_ptr create_message_to_send(Dialog *d, MessageId top_thread_message_id, - MessageInputReplyTo input_reply_to, const MessageSendOptions &options, + MessageInputReplyTo &&input_reply_to, const MessageSendOptions &options, unique_ptr &&content, bool invert_media, bool suppress_reply_info, unique_ptr forward_info, bool is_copy, DialogId send_as_dialog_id) const; - Message *get_message_to_send(Dialog *d, MessageId top_thread_message_id, MessageInputReplyTo input_reply_to, + Message *get_message_to_send(Dialog *d, MessageId top_thread_message_id, MessageInputReplyTo &&input_reply_to, const MessageSendOptions &options, unique_ptr &&content, bool invert_media, bool *need_update_dialog_pos, bool suppress_reply_info = false, unique_ptr forward_info = nullptr, bool is_copy = false,