diff --git a/src/event/server_events.c b/src/event/server_events.c index 7c65a89f..97dabb5f 100644 --- a/src/event/server_events.c +++ b/src/event/server_events.c @@ -420,26 +420,35 @@ sv_ev_delayed_private_message(ProfMessage *message) } void -sv_ev_outgoing_carbon(char *barejid, char *message, char *pgp_message, gboolean omemo) +sv_ev_outgoing_carbon(ProfMessage *message) { - ProfChatWin *chatwin = wins_get_chat(barejid); + ProfChatWin *chatwin = wins_get_chat(message->jid->barejid); if (!chatwin) { - chatwin = chatwin_new(barejid); + chatwin = chatwin_new(message->jid->barejid); } chat_state_active(chatwin->state); #ifdef HAVE_LIBGPGME #ifndef HAVE_OMEMO - if (pgp_message) { - char *decrypted = p_gpg_decrypt(pgp_message); - if (decrypted) { - chatwin_outgoing_carbon(chatwin, decrypted, PROF_MSG_ENC_PGP); + if (message->encrypted) { + message->plain = p_gpg_decrypt(message->encrypted); + if (message->plain) { + message->enc = PROF_MSG_ENC_PGP; + chatwin_outgoing_carbon(chatwin, message); } else { - chatwin_outgoing_carbon(chatwin, message, PROF_MSG_ENC_PLAIN); + if (!message->body) { + log_error("Couldn't decrypt GPG message and body was empty"); + return; + } + message->enc = PROF_MSG_ENC_PLAIN; + message->plain = strdup(message->body); + chatwin_outgoing_carbon(chatwin, message); } } else { - chatwin_outgoing_carbon(chatwin, message, PROF_MSG_ENC_PLAIN); + message->enc = PROF_MSG_ENC_PLAIN; + message->plain = strdup(message->body); + chatwin_outgoing_carbon(chatwin, message); } return; #endif @@ -447,10 +456,12 @@ sv_ev_outgoing_carbon(char *barejid, char *message, char *pgp_message, gboolean #ifndef HAVE_LIBGPGME #ifdef HAVE_OMEMO - if (omemo) { - chatwin_outgoing_carbon(chatwin, message, PROF_MSG_ENC_OMEMO); + if (message->enc == PROF_MSG_ENC_OMEMO) { + chatwin_outgoing_carbon(chatwin, message); } else { - chatwin_outgoing_carbon(chatwin, message, PROF_MSG_ENC_PLAIN); + message->enc = PROF_MSG_ENC_PLAIN; + message->plain = strdup(message->body); + chatwin_outgoing_carbon(chatwin, message); } return; #endif @@ -458,17 +469,26 @@ sv_ev_outgoing_carbon(char *barejid, char *message, char *pgp_message, gboolean #ifdef HAVE_LIBGPGME #ifdef HAVE_OMEMO - if (omemo) { - chatwin_outgoing_carbon(chatwin, message, PROF_MSG_ENC_OMEMO); - } else if (pgp_message) { - char *decrypted = p_gpg_decrypt(pgp_message); - if (decrypted) { - chatwin_outgoing_carbon(chatwin, decrypted, PROF_MSG_ENC_PGP); + if (message->enc == PROF_MSG_ENC_OMEMO) { + chatwin_outgoing_carbon(chatwin, message); + } else if (message->encrypted) { + message->plain = p_gpg_decrypt(message->encrypted); + if (message->plain) { + message->enc = PROF_MSG_ENC_PGP; + chatwin_outgoing_carbon(chatwin, message); } else { - chatwin_outgoing_carbon(chatwin, message, PROF_MSG_ENC_PLAIN); + if (!message->body) { + log_error("Couldn't decrypt GPG message and body was empty"); + return; + } + message->enc = PROF_MSG_ENC_PLAIN; + message->plain = strdup(message->body); + chatwin_outgoing_carbon(chatwin, message); } } else { - chatwin_outgoing_carbon(chatwin, message, PROF_MSG_ENC_PLAIN); + message->enc = PROF_MSG_ENC_PLAIN; + message->plain = strdup(message->body); + chatwin_outgoing_carbon(chatwin, message); } return; #endif @@ -476,7 +496,11 @@ sv_ev_outgoing_carbon(char *barejid, char *message, char *pgp_message, gboolean #ifndef HAVE_LIBGPGME #ifndef HAVE_OMEMO - chatwin_outgoing_carbon(chatwin, message, PROF_MSG_ENC_PLAIN); + if (message->body) { + message->enc = PROF_MSG_ENC_PLAIN; + message->plain = strdup(message->body); + chatwin_outgoing_carbon(chatwin, message); + } #endif #endif } @@ -494,7 +518,12 @@ _sv_ev_incoming_pgp(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message p_gpg_free_decrypted(message->plain); message->plain = NULL; } else { + if (!message->body) { + log_error("Couldn't decrypt GPG message and body was empty"); + return; + } message->enc = PROF_MSG_ENC_PLAIN; + message->plain = strdup(message->body); chatwin_incoming_msg(chatwin, message, new_win); chat_log_msg_in(message); chatwin->pgp_recv = FALSE; @@ -539,10 +568,13 @@ _sv_ev_incoming_omemo(ProfChatWin *chatwin, gboolean new_win, ProfMessage *messa static void _sv_ev_incoming_plain(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message) { - message->plain = strdup(message->body); - chatwin_incoming_msg(chatwin, message, new_win); - chat_log_msg_in(message); - chatwin->pgp_recv = FALSE; + if (message->body) { + message->enc = PROF_MSG_ENC_PLAIN; + message->plain = strdup(message->body); + chatwin_incoming_msg(chatwin, message, new_win); + chat_log_msg_in(message); + chatwin->pgp_recv = FALSE; + } } void diff --git a/src/ui/chatwin.c b/src/ui/chatwin.c index 5a32b5ae..006b5ca6 100644 --- a/src/ui/chatwin.c +++ b/src/ui/chatwin.c @@ -329,20 +329,20 @@ chatwin_outgoing_msg(ProfChatWin *chatwin, const char *const message, char *id, } void -chatwin_outgoing_carbon(ProfChatWin *chatwin, const char *const message, prof_enc_t enc_mode) +chatwin_outgoing_carbon(ProfChatWin *chatwin, ProfMessage *message) { assert(chatwin != NULL); char enc_char = '-'; - if (enc_mode == PROF_MSG_ENC_PGP) { + if (message->enc == PROF_MSG_ENC_PGP) { enc_char = prefs_get_pgp_char(); - } else if (enc_mode == PROF_MSG_ENC_OMEMO) { + } else if (message->enc == PROF_MSG_ENC_OMEMO) { enc_char = prefs_get_omemo_char(); } ProfWin *window = (ProfWin*)chatwin; - win_print_outgoing(window, enc_char, "%s", message); + win_print_outgoing(window, enc_char, "%s", message->plain); int num = wins_get_num(window); status_bar_active(num, WIN_CHAT, chatwin->barejid); } diff --git a/src/ui/ui.h b/src/ui/ui.h index 7c5bed89..f6872938 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -125,7 +125,7 @@ void chatwin_receipt_received(ProfChatWin *chatwin, const char *const id); void chatwin_recipient_gone(ProfChatWin *chatwin); void chatwin_outgoing_msg(ProfChatWin *chatwin, const char *const message, char *id, prof_enc_t enc_mode, gboolean request_receipt); -void chatwin_outgoing_carbon(ProfChatWin *chatwin, const char *const message, prof_enc_t enc_mode); +void chatwin_outgoing_carbon(ProfChatWin *chatwin, ProfMessage *message); void chatwin_contact_online(ProfChatWin *chatwin, Resource *resource, GDateTime *last_activity); void chatwin_contact_offline(ProfChatWin *chatwin, char *resource, char *status); char* chatwin_get_string(ProfChatWin *chatwin); diff --git a/tests/unittests/ui/stub_ui.c b/tests/unittests/ui/stub_ui.c index a33904e0..df225ec2 100644 --- a/tests/unittests/ui/stub_ui.c +++ b/tests/unittests/ui/stub_ui.c @@ -162,7 +162,7 @@ void chatwin_recipient_gone(ProfChatWin *chatwin) {} void chatwin_outgoing_msg(ProfChatWin *chatwin, const char * const message, char *id, prof_enc_t enc_mode, gboolean request_receipt) {} -void chatwin_outgoing_carbon(ProfChatWin *chatwin, const char * const message, prof_enc_t enc_mode) {} +void chatwin_outgoing_carbon(ProfChatWin *chatwin, ProfMessage *message) {} void privwin_outgoing_msg(ProfPrivateWin *privwin, const char * const message) {} void privwin_occupant_offline(ProfPrivateWin *privwin) {}