From de45f6d8d7d777244006a7998ec971157e51296e Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 18 Nov 2022 23:32:08 +0100 Subject: Readd meme gpg encryption in matrix, this time asynchronous decryption of only visible items --- src/QuickMedia.cpp | 73 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 17 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 7e37214..074f3e9 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -5311,6 +5311,11 @@ namespace QuickMedia { body_item->embedded_item = BodyItem::create(""); *body_item->embedded_item = *related_body_item; + if(related_body_item->extra) { + MatrixChatBodyItemData *other_item_data = static_cast(related_body_item->extra.get()); + if(other_item_data->decrypt_state != MatrixChatBodyItemData::DecryptState::DECRYPTED) + body_item->embedded_item->extra = std::make_shared(other_item_data->matrix, other_item_data->text_to_decrypt); + } body_item->embedded_item->embedded_item = nullptr; body_item->embedded_item->reactions.clear(); if(message->user->user_id != my_user_id && ((related_body_item->userdata && static_cast(related_body_item->userdata)->user.get() == me) || message_contains_user_mention(body_item, my_display_name, my_user_id))) @@ -5325,11 +5330,23 @@ 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 void matrix_body_set_text_decrypt_if_needed(Matrix *matrix, BodyItem *body_item, std::string text) { + // TODO: Check if gpg is installed + if(!get_config().matrix.gpg_user_id.empty() && text.find("-----BEGIN PGP MESSAGE-----") != std::string::npos && text.find("-----END PGP MESSAGE-----") != std::string::npos) { + body_item->extra = std::make_shared(matrix, std::move(text)); + body_item->set_description("🔒 Decrypting message..."); + } else { + body_item->set_description(std::move(text)); + } + } + static std::shared_ptr message_to_body_item(Matrix *matrix, RoomData *room, Message *message, const std::string &my_display_name, const std::string &my_user_id) { Message *latest_message = get_latest_message_in_edit_chain(message); + 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(message_to_qm_text(matrix, latest_message))); + //body_item->set_description(matrix_decrypt_gpg_message_if_needed(strip(message_to_qm_text(matrix, latest_message)))); + matrix_body_set_text_decrypt_if_needed(matrix, body_item.get(), strip(message_to_qm_text(matrix, latest_message))); body_item->set_timestamp(message->timestamp); if(!message->thumbnail_url.empty()) { body_item->thumbnail_url = message->thumbnail_url; @@ -5631,7 +5648,8 @@ namespace QuickMedia { if(message->timestamp > edited_message_ref->timestamp) { std::string qm_formatted_text = message_to_qm_text(matrix, message.get()); - body_item->set_description(std::move(qm_formatted_text)); + //body_item->set_description(matrix_decrypt_gpg_message_if_needed(std::move(qm_formatted_text))); + matrix_body_set_text_decrypt_if_needed(matrix, body_item.get(), std::move(qm_formatted_text)); if(message->user != me && message_contains_user_mention(matrix, message.get(), my_display_name, me->user_id)) body_item->set_description_color(get_theme().attention_alert_text_color, true); else @@ -5674,7 +5692,8 @@ namespace QuickMedia { if(message->timestamp > edited_message_ref->timestamp) { std::string qm_formatted_text = formatted_text_to_qm_text(matrix, message->body.c_str(), message->body.size(), true); - body_item->set_description(std::move(qm_formatted_text)); + //body_item->set_description(matrix_decrypt_gpg_message_if_needed(std::move(qm_formatted_text))); + matrix_body_set_text_decrypt_if_needed(matrix, body_item.get(), std::move(qm_formatted_text)); if(message->user != me && message_contains_user_mention(matrix, message.get(), my_display_name, me->user_id)) body_item->set_description_color(get_theme().attention_alert_text_color, true); else @@ -6028,7 +6047,8 @@ namespace QuickMedia { "/leave: Leave the current room.\n" "/me [text]: Send a message of type \"m.emote\".\n" "/react [text]: React to the selected message (also works if you are replying to a message).\n" - "/id: Show the room id."; + "/id: Show the room id.\n" + "/encrypt [text]: Send a message encrypted with gpg. gpg needs to be installed to do this. Uses the gpg key specified by the user id in your config variable \"matrix.gpg_user_id\"."; message->timestamp = time(nullptr) * 1000; // TODO: What if the user has broken local time? matrix->append_system_message(current_room, std::move(message)); @@ -6052,7 +6072,7 @@ namespace QuickMedia { } else if(strncmp(text.c_str(), "/react ", 7) == 0) { msgtype = "m.reaction"; text.erase(text.begin(), text.begin() + 7); - } else { + } else if(strncmp(text.c_str(), "/encrypt ", 9) != 0) { show_notification("QuickMedia", "Error: invalid command: " + text + ", type /help to see a list of valid commands.", Urgency::NORMAL); return false; } @@ -6061,7 +6081,27 @@ namespace QuickMedia { msgtype = "m.reaction"; text.erase(text.begin(), text.begin() + 7); } - } + } + + if((chat_state == ChatState::TYPING_MESSAGE || chat_state == ChatState::EDITING || chat_state == ChatState::REPLYING) && msgtype.empty() && text[0] == '/' && strncmp(text.c_str(), "/encrypt ", 9) == 0) { + text.erase(text.begin(), text.begin() + 9); + if(!is_program_executable_by_name("gpg")) { + show_notification("QuickMedia", "GPG needs to be installed to use the /encrypt command", Urgency::CRITICAL); + return false; + } + + if(get_config().matrix.gpg_user_id.empty()) { + show_notification("QuickMedia", "The config variable matrix.gpg_user_id needs to be set to use the /encrypt command", Urgency::CRITICAL); + return false; + } + + std::string encrypted_string; + if(!matrix_gpg_encrypt_for_each_user_in_room(matrix, current_room, get_config().matrix.gpg_user_id, text, encrypted_string)) { + show_notification("QuickMedia", "Failed to encrypt message with gpg. Make sure you used the correct gpg user id in the config variable matrix.gpg_user_id", Urgency::CRITICAL); + return false; + } + text = std::move(encrypted_string); + } auto message = std::make_shared(); message->body_is_formatted = true; @@ -6178,7 +6218,8 @@ namespace QuickMedia { std::string qm_formatted_text = formatted_text_to_qm_text(matrix, formatted_text.c_str(), formatted_text.size(), true); auto body_item_shared_ptr = tabs[MESSAGES_TAB_INDEX].body->get_item_by_index(body_item_index); - body_item_shared_ptr->set_description(std::move(qm_formatted_text)); + //body_item_shared_ptr->set_description(matrix_decrypt_gpg_message_if_needed(std::move(qm_formatted_text))); + matrix_body_set_text_decrypt_if_needed(matrix, body_item_shared_ptr.get(), std::move(qm_formatted_text)); body_item_shared_ptr->set_description_color(get_theme().provisional_message_color); //auto edit_body_item = message_to_body_item(matrix, current_room, message.get(), current_room->get_user_avatar_url(me), me->user_id); @@ -6272,6 +6313,11 @@ namespace QuickMedia { auto related_body_item = find_body_item_by_event_id(tabs[MESSAGES_TAB_INDEX].body->get_items().data(), tabs[MESSAGES_TAB_INDEX].body->get_items().size(), event_data->event_id); if(related_body_item) { *body_item = *related_body_item; + if(related_body_item->extra) { + MatrixChatBodyItemData *other_item_data = static_cast(related_body_item->extra.get()); + if(other_item_data->decrypt_state != MatrixChatBodyItemData::DecryptState::DECRYPTED) + body_item->extra = std::make_shared(other_item_data->matrix, other_item_data->text_to_decrypt); + } body_item->reactions.clear(); if(message_contains_user_mention(related_body_item.get(), current_room->get_user_display_name(me), me->user_id)) body_item->set_description_color(get_theme().attention_alert_text_color, true); @@ -7616,8 +7662,9 @@ namespace QuickMedia { break; } - if(last_timeline_message != -1) { - current_room->body_item->set_description(current_room->latest_message); + if(last_timeline_message != -1 && (!current_room->body_item->extra || static_cast(current_room->body_item->extra.get())->decrypt_state == MatrixChatBodyItemData::DecryptState::DECRYPTED)) { + if(current_room->offset_to_latest_message_text < (int)current_room->body_item->get_description().size()) + current_room->body_item->set_description(current_room->body_item->get_description().substr(current_room->offset_to_latest_message_text)); current_room->body_item->set_description_color(get_theme().faded_text_color); // TODO: Show a line like nheko instead for unread messages, or something else current_room->body_item->set_title_color(get_theme().text_color); @@ -7876,14 +7923,6 @@ namespace QuickMedia { } } - static int accumulate_string(char *data, int size, void *userdata) { - std::string *str = (std::string*)userdata; - if(str->size() + size > 1024 * 1024 * 100) // 100mb sane limit, TODO: make configurable - return 1; - str->append(data, size); - return 0; - } - void Program::download_page(std::string url, std::string download_filename, bool no_dialog) { window.set_title(("QuickMedia - Select where you want to save " + std::string(url)).c_str()); -- cgit v1.2.3