about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/xmpp/message.c90
1 files changed, 50 insertions, 40 deletions
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index 67a1103d..26c266cd 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -369,34 +369,28 @@ static int
 _conference_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata)
 {
     xmpp_stanza_t *xns_conference = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CONFERENCE);
-    char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
-    char *room = NULL;
-    char *invitor = NULL;
-    char *reason = NULL;
-    char *password = NULL;
 
+    char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     if (!from) {
         log_warning("Message received with no from attribute, ignoring");
         return 1;
     }
 
-    // XEP-0249
-    room = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_JID);
-    if (!room) {
-        return 1;
-    }
-
     Jid *jidp = jid_create(from);
     if (!jidp) {
         return 1;
     }
-    invitor = jidp->barejid;
 
-    reason = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_REASON);
-    password = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_PASSWORD);
+    // XEP-0249
+    char *room = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_JID);
+    if (!room) {
+        return 1;
+    }
 
-    sv_ev_room_invite(INVITE_DIRECT, invitor, room, reason, password);
+    char *reason = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_REASON);
+    char *password = xmpp_stanza_get_attribute(xns_conference, STANZA_ATTR_PASSWORD);
 
+    sv_ev_room_invite(INVITE_DIRECT, jidp->barejid, room, reason, password);
     jid_destroy(jidp);
 
     return 1;
@@ -415,14 +409,18 @@ _captcha_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void *
 
     // XEP-0158
     xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BODY);
-    if (body) {
-        char *message = xmpp_stanza_get_text(body);
-        if (message) {
-            sv_ev_room_broadcast(from, message);
-            xmpp_free(ctx, message);
-        }
+    if (!body) {
+        return 1;
+    }
+
+    char *message = xmpp_stanza_get_text(body);
+    if (!message) {
+        return 1;
     }
 
+    sv_ev_room_broadcast(from, message);
+    xmpp_free(ctx, message);
+
     return 1;
 }
 
@@ -448,14 +446,20 @@ _groupchat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void
     // handle room broadcasts
     if (!jid->resourcepart) {
         xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BODY);
-        if (body) {
-            message = xmpp_stanza_get_text(body);
-            if (message) {
-                sv_ev_room_broadcast(room_jid, message);
-                xmpp_free(ctx, message);
-            }
+        if (!body) {
+            jid_destroy(jid);
+            return 1;
         }
 
+        message = xmpp_stanza_get_text(body);
+        if (!message) {
+            jid_destroy(jid);
+            return 1;
+        }
+
+        sv_ev_room_broadcast(room_jid, message);
+        xmpp_free(ctx, message);
+
         jid_destroy(jid);
         return 1;
     }
@@ -473,24 +477,30 @@ _groupchat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void
         return 1;
     }
 
-    // determine if the notifications happened whilst offline
-    GTimeVal tv_stamp;
-    gboolean delayed = stanza_get_delay(stanza, &tv_stamp);
     xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BODY);
 
     // check for and deal with message
-    if (body) {
-        message = xmpp_stanza_get_text(body);
-        if (message) {
-            if (delayed) {
-                sv_ev_room_history(jid->barejid, jid->resourcepart, tv_stamp, message);
-            } else {
-                sv_ev_room_message(jid->barejid, jid->resourcepart, message);
-            }
-            xmpp_free(ctx, message);
-        }
+    if (!body) {
+        jid_destroy(jid);
+        return 1;
+    }
+
+    message = xmpp_stanza_get_text(body);
+    if (!message) {
+        jid_destroy(jid);
+        return 1;
+    }
+
+    // determine if the notifications happened whilst offline
+    GTimeVal tv_stamp;
+    gboolean delayed = stanza_get_delay(stanza, &tv_stamp);
+    if (delayed) {
+        sv_ev_room_history(jid->barejid, jid->resourcepart, tv_stamp, message);
+    } else {
+        sv_ev_room_message(jid->barejid, jid->resourcepart, message);
     }
 
+    xmpp_free(ctx, message);
     jid_destroy(jid);
 
     return 1;