From deb32bded40c4c46ce57c729c303edcb1915458b Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 8 Nov 2022 22:05:03 +0100 Subject: html parser: fix possible endless loop. Fixes matrix chat where parsing non-html as html happened --- src/QuickMedia.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 72df6eb..c9c7603 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -5319,10 +5319,17 @@ namespace QuickMedia { return load_cached_related_embedded_item(body_item, message, me.get(), current_room->get_user_display_name(me), me->user_id, message_body_items); } + static std::string message_to_qm_text(Message *message) { + if(message->body_is_formatted) + return formatted_text_to_qm_text(message->body.c_str(), message->body.size(), true); + else + return message->body; + } + static std::shared_ptr message_to_body_item(RoomData *room, Message *message, const std::string &my_display_name, const std::string &my_user_id) { auto body_item = BodyItem::create(""); body_item->set_author(extract_first_line_remove_newline_elipses(room->get_user_display_name(message->user), AUTHOR_MAX_LENGTH)); - body_item->set_description(strip(formatted_text_to_qm_text(message->body.c_str(), message->body.size(), true))); + body_item->set_description(strip(message_to_qm_text(message))); body_item->set_timestamp(message->timestamp); if(!message->thumbnail_url.empty()) { body_item->thumbnail_url = message->thumbnail_url; @@ -5652,7 +5659,7 @@ namespace QuickMedia { // TODO: Properly check reply message objects for mention of user instead of message data, but only when synapse fixes that notifications // are not triggered by reply to a message with our display name/user id. Message *edited_message_ref = static_cast(body_item->userdata); - std::string qm_formatted_text = formatted_text_to_qm_text(message->body.c_str(), message->body.size(), true); + std::string qm_formatted_text = message_to_qm_text(message.get()); body_item->set_description(std::move(qm_formatted_text)); if(message->user != me && message_contains_user_mention(message.get(), my_display_name, me->user_id)) @@ -6116,6 +6123,7 @@ namespace QuickMedia { } auto message = std::make_shared(); + message->body_is_formatted = true; message->user = matrix->get_me(current_room); if(msgtype == "m.emote") message->body = "*" + current_room->get_user_display_name(me) + "* " + matrix->body_to_formatted_body(current_room, text); -- cgit v1.2.3