aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2022-11-18 23:32:08 +0100
committerdec05eba <dec05eba@protonmail.com>2022-11-18 23:32:12 +0100
commitde45f6d8d7d777244006a7998ec971157e51296e (patch)
tree93ab54b196bda4af7d7fe16d74fb25f08c37a931 /src/QuickMedia.cpp
parentc56cb5d25388d938fce485ff02b067a2fd70e096 (diff)
Readd meme gpg encryption in matrix, this time asynchronous decryption
of only visible items
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp73
1 files changed, 56 insertions, 17 deletions
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<MatrixChatBodyItemData*>(related_body_item->extra.get());
+ if(other_item_data->decrypt_state != MatrixChatBodyItemData::DecryptState::DECRYPTED)
+ body_item->embedded_item->extra = std::make_shared<MatrixChatBodyItemData>(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<Message*>(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<MatrixChatBodyItemData>(matrix, std::move(text));
+ body_item->set_description("🔒 Decrypting message...");
+ } else {
+ body_item->set_description(std::move(text));
+ }
+ }
+
static std::shared_ptr<BodyItem> 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>();
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<MatrixChatBodyItemData*>(related_body_item->extra.get());
+ if(other_item_data->decrypt_state != MatrixChatBodyItemData::DecryptState::DECRYPTED)
+ body_item->extra = std::make_shared<MatrixChatBodyItemData>(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<MatrixChatBodyItemData*>(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());