about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorPaul Fariello <paul@fariello.eu>2019-06-21 13:49:17 +0200
committerPaul Fariello <paul@fariello.eu>2019-06-21 15:52:24 +0200
commitdb8f32c049fd18a18c210ca35a20725214673b2d (patch)
tree572efe975f82b27c56ac71194a425c82a617c28d
parent3bba3d98129cd09657a2f0a58baf11b74b45fe65 (diff)
downloadprofani-tty-db8f32c049fd18a18c210ca35a20725214673b2d.tar.gz
Fix handling of encrypted carbons
-rw-r--r--src/event/server_events.c82
-rw-r--r--src/ui/chatwin.c8
-rw-r--r--src/ui/ui.h2
-rw-r--r--tests/unittests/ui/stub_ui.c2
4 files changed, 63 insertions, 31 deletions
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) {}