about summary refs log tree commit diff stats
path: root/src/xmpp/message.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xmpp/message.c')
-rw-r--r--src/xmpp/message.c56
1 files changed, 32 insertions, 24 deletions
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index 73ae8549..59970012 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -200,7 +200,8 @@ message_init(void)
 {
     ProfMessage *message = malloc(sizeof(ProfMessage));
 
-    message->jid = NULL;
+    message->from_jid = NULL;
+    message->to_jid = NULL;
     message->id = NULL;
     message->originid = NULL;
     message->replace_id = NULL;
@@ -219,8 +220,12 @@ void
 message_free(ProfMessage *message)
 {
     xmpp_ctx_t *ctx = connection_get_ctx();
-    if (message->jid) {
-        jid_destroy(message->jid);
+    if (message->from_jid) {
+        jid_destroy(message->from_jid);
+    }
+
+    if (message->to_jid) {
+        jid_destroy(message->to_jid);
     }
 
     if (message->id) {
@@ -801,51 +806,51 @@ _handle_groupchat(xmpp_stanza_t *const stanza)
     }
 
     const char *room_jid = xmpp_stanza_get_from(stanza);
-    Jid *jid = jid_create(room_jid);
+    Jid *from_jid = jid_create(room_jid);
 
     // handle room subject
     xmpp_stanza_t *subject = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_SUBJECT);
     if (subject) {
         char *subject_text;
         subject_text = xmpp_stanza_get_text(subject);
-        sv_ev_room_subject(jid->barejid, jid->resourcepart, subject_text);
+        sv_ev_room_subject(from_jid->barejid, from_jid->resourcepart, subject_text);
         xmpp_free(ctx, subject_text);
 
-        jid_destroy(jid);
+        jid_destroy(from_jid);
         return;
     }
 
     // handle room broadcasts
-    if (!jid->resourcepart) {
+    if (!from_jid->resourcepart) {
         char *broadcast;
         broadcast = xmpp_message_get_body(stanza);
         if (!broadcast) {
-            jid_destroy(jid);
+            jid_destroy(from_jid);
             return;
         }
 
         sv_ev_room_broadcast(room_jid, broadcast);
         xmpp_free(ctx, broadcast);
 
-        jid_destroy(jid);
+        jid_destroy(from_jid);
         return;
     }
 
-    if (!jid_is_valid_room_form(jid)) {
-        log_error("Invalid room JID: %s", jid->str);
-        jid_destroy(jid);
+    if (!jid_is_valid_room_form(from_jid)) {
+        log_error("Invalid room JID: %s", from_jid->str);
+        jid_destroy(from_jid);
         return;
     }
 
     // room not active in profanity
-    if (!muc_active(jid->barejid)) {
-        log_error("Message received for inactive chat room: %s", jid->str);
-        jid_destroy(jid);
+    if (!muc_active(from_jid->barejid)) {
+        log_error("Message received for inactive chat room: %s", from_jid->str);
+        jid_destroy(from_jid);
         return;
     }
 
     ProfMessage *message = message_init();
-    message->jid = jid;
+    message->from_jid = from_jid;
     message->type = PROF_MSG_TYPE_MUC;
 
     if (id) {
@@ -875,17 +880,17 @@ _handle_groupchat(xmpp_stanza_t *const stanza)
 #endif
 
     if (!message->plain && !message->body) {
-        log_error("Message received without body for room: %s", jid->str);
+        log_error("Message received without body for room: %s", from_jid->str);
         goto out;
     } else if (!message->plain) {
         message->plain = strdup(message->body);
     }
 
     // determine if the notifications happened whilst offline (MUC history)
-    message->timestamp = stanza_get_delay_from(stanza, jid->barejid);
+    message->timestamp = stanza_get_delay_from(stanza, from_jid->barejid);
     if (message->timestamp == NULL) {
         // checking the domainpart is a workaround for some prosody versions (gh#1190)
-        message->timestamp = stanza_get_delay_from(stanza, jid->domainpart);
+        message->timestamp = stanza_get_delay_from(stanza, from_jid->domainpart);
     }
 
     bool is_muc_history = FALSE;
@@ -996,7 +1001,7 @@ _handle_muc_private_message(xmpp_stanza_t *const stanza)
     message->type = PROF_MSG_TYPE_MUCPM;
 
     const gchar *from = xmpp_stanza_get_from(stanza);
-    message->jid = jid_create(from);
+    message->from_jid = jid_create(from);
 
     // message stanza id
     const char *id = xmpp_stanza_get_id(stanza);
@@ -1016,7 +1021,7 @@ _handle_muc_private_message(xmpp_stanza_t *const stanza)
     message->body = xmpp_message_get_body(stanza);
 
     if (!message->plain && !message->body) {
-        log_error("Message received without body from: %s", message->jid->str);
+        log_error("Message received without body from: %s", message->from_jid->str);
         goto out;
     } else if (!message->plain) {
         message->plain = strdup(message->body);
@@ -1133,17 +1138,18 @@ _handle_carbons(xmpp_stanza_t *const stanza)
         message->encrypted = xmpp_stanza_get_text(x);
     }
 
+    //TODO: now that profmessage has from_jid AND to_jid we should save both. and maybe also add is_carbon so we can decide later on.
     if (message->plain || message->encrypted || message->body) {
         // if we are the recipient, treat as standard incoming message
         if (g_strcmp0(my_jid->barejid, jid_to->barejid) == 0) {
             jid_destroy(jid_to);
-            message->jid = jid_from;
+            message->from_jid = jid_from;
             sv_ev_incoming_carbon(message);
 
         // else treat as a sent message
         } else {
             jid_destroy(jid_from);
-            message->jid = jid_to;
+            message->from_jid = jid_to;
             sv_ev_outgoing_carbon(message);
         }
     }
@@ -1200,7 +1206,9 @@ _handle_chat(xmpp_stanza_t *const stanza)
 
     // standard chat message, use jid without resource
     ProfMessage *message = message_init();
-    message->jid = jid;
+    // TODO: safe to_jid too. also need to have the same check like in carbons. in case this is MAM.
+    // or have a is_mam and handle later. 
+    message->from_jid = jid;
     message->type = PROF_MSG_TYPE_CHAT;
 
     // message stanza id