mcabber/src/xmpp.c
changeset 1646 472cd6ac20fa
parent 1644 73fc85ea0b4b
child 1647 cfa1fff86f78
equal deleted inserted replaced
1645:d3cd4db23f55 1646:472cd6ac20fa
  1156   LmMessageNode *x;
  1156   LmMessageNode *x;
  1157   const char *body = NULL;
  1157   const char *body = NULL;
  1158   const char *enc = NULL;
  1158   const char *enc = NULL;
  1159   const char *subject = NULL;
  1159   const char *subject = NULL;
  1160   time_t timestamp = 0L;
  1160   time_t timestamp = 0L;
       
  1161   LmMessageSubType mstype;
       
  1162 
       
  1163   mstype = lm_message_get_sub_type(m);
  1161 
  1164 
  1162   body = lm_message_node_get_child_value(m->node, "body");
  1165   body = lm_message_node_get_child_value(m->node, "body");
  1163 
  1166 
  1164   x = lm_message_node_find_xmlns(m->node, NS_ENCRYPTED);
  1167   x = lm_message_node_find_xmlns(m->node, NS_ENCRYPTED);
  1165   if (x && (p = lm_message_node_get_value(x)) != NULL)
  1168   if (x && (p = lm_message_node_get_value(x)) != NULL)
  1166     enc = p;
  1169     enc = p;
  1167 
  1170 
  1168   p = lm_message_node_get_child_value(m->node, "subject");
  1171   p = lm_message_node_get_child_value(m->node, "subject");
  1169   if (p != NULL) {
  1172   if (p != NULL) {
  1170     if (lm_message_get_sub_type(m) != LM_MESSAGE_SUB_TYPE_GROUPCHAT) {
  1173     if (mstype != LM_MESSAGE_SUB_TYPE_GROUPCHAT) {
  1171       // Chat message
  1174       // Chat message
  1172       subject = p;
  1175       subject = p;
  1173     } else {                                      // Room topic
  1176     } else {                                      // Room topic
  1174       GSList *roombuddy;
  1177       GSList *roombuddy;
  1175       gchar *mbuf;
  1178       gchar *mbuf;
  1202   }
  1205   }
  1203 
  1206 
  1204   // Timestamp?
  1207   // Timestamp?
  1205   timestamp = lm_message_node_get_timestamp(m->node);
  1208   timestamp = lm_message_node_get_timestamp(m->node);
  1206 
  1209 
  1207   if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
  1210   if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
  1208     x = lm_message_node_get_child(m->node, "error");
  1211     x = lm_message_node_get_child(m->node, "error");
  1209     display_server_error(x);
  1212     display_server_error(x);
  1210 #if defined JEP0022 || defined JEP0085
  1213 #if defined JEP0022 || defined JEP0085
  1211     // If the JEP85/22 support is probed, set it back to unknown so that
  1214     // If the JEP85/22 support is probed, set it back to unknown so that
  1212     // we probe it again.
  1215     // we probe it again.
  1214 #endif
  1217 #endif
  1215   } else {
  1218   } else {
  1216     handle_state_events(from, m->node);
  1219     handle_state_events(from, m->node);
  1217   }
  1220   }
  1218   if (from && (body || subject))
  1221   if (from && (body || subject))
  1219     gotmessage(lm_message_get_sub_type(m), from, body, enc, subject, timestamp,
  1222     gotmessage(mstype, from, body, enc, subject, timestamp,
  1220                lm_message_node_find_xmlns(m->node, NS_SIGNED));
  1223                lm_message_node_find_xmlns(m->node, NS_SIGNED));
  1221   //report received message if message receipt was requested
  1224   //report received message if message receipt was requested
  1222   if (lm_message_node_get_child(m->node, "request")) {
  1225   if (lm_message_node_get_child(m->node, "request")) {
  1223     LmMessage *rcvd = lm_message_new(from, LM_MESSAGE_TYPE_MESSAGE);
  1226     LmMessage *rcvd = lm_message_new(from, LM_MESSAGE_TYPE_MESSAGE);
  1224     lm_message_node_set_attribute(rcvd->node, "id", lm_message_get_id(m));
  1227     lm_message_node_set_attribute(rcvd->node, "id", lm_message_get_id(m));
  1241 
  1244 
  1242 static LmHandlerResult cb_caps(LmMessageHandler *h, LmConnection *c,
  1245 static LmHandlerResult cb_caps(LmMessageHandler *h, LmConnection *c,
  1243                                LmMessage *m, gpointer user_data)
  1246                                LmMessage *m, gpointer user_data)
  1244 {
  1247 {
  1245   char *ver = user_data;
  1248   char *ver = user_data;
       
  1249   LmMessageSubType mstype = lm_message_get_sub_type(m);
  1246 
  1250 
  1247   caps_add(ver);
  1251   caps_add(ver);
  1248   if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
  1252   if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
  1249     display_server_error(lm_message_node_get_child(m->node, "error"));
  1253     display_server_error(lm_message_node_get_child(m->node, "error"));
  1250   } else if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_RESULT) {
  1254   } else if (mstype == LM_MESSAGE_SUB_TYPE_RESULT) {
  1251     LmMessageNode *info;
  1255     LmMessageNode *info;
  1252     LmMessageNode *query = lm_message_node_get_child(m->node, "query");
  1256     LmMessageNode *query = lm_message_node_get_child(m->node, "query");
  1253 
  1257 
  1254     info = lm_message_node_get_child(query, "identity");
  1258     info = lm_message_node_get_child(query, "identity");
  1255     if (info)
  1259     if (info)
  1275   const char *from, *rname, *p=NULL, *ustmsg=NULL;
  1279   const char *from, *rname, *p=NULL, *ustmsg=NULL;
  1276   enum imstatus ust;
  1280   enum imstatus ust;
  1277   char bpprio;
  1281   char bpprio;
  1278   time_t timestamp = 0L;
  1282   time_t timestamp = 0L;
  1279   LmMessageNode *muc_packet, *caps;
  1283   LmMessageNode *muc_packet, *caps;
       
  1284   LmMessageSubType mstype;
  1280 
  1285 
  1281   // Check for MUC presence packet
  1286   // Check for MUC presence packet
  1282   muc_packet = lm_message_node_find_xmlns
  1287   muc_packet = lm_message_node_find_xmlns
  1283           (m->node, "http://jabber.org/protocol/muc#user");
  1288           (m->node, "http://jabber.org/protocol/muc#user");
  1284 
  1289 
  1293       return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Ignoring self presence
  1298       return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Ignoring self presence
  1294     }
  1299     }
  1295   }
  1300   }
  1296 
  1301 
  1297   r = jidtodisp(from);
  1302   r = jidtodisp(from);
  1298 
  1303   mstype = lm_message_get_sub_type(m);
  1299   if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
  1304 
       
  1305   if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
  1300     LmMessageNode *x;
  1306     LmMessageNode *x;
  1301     scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", r);
  1307     scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", r);
  1302     x = lm_message_node_find_child(m->node, "error");
  1308     x = lm_message_node_find_child(m->node, "error");
  1303     display_server_error(x);
  1309     display_server_error(x);
  1304     // Let's check it isn't a nickname conflict.
  1310     // Let's check it isn't a nickname conflict.
  1329     else if (!strcmp(p, "dnd"))  ust = dontdisturb;
  1335     else if (!strcmp(p, "dnd"))  ust = dontdisturb;
  1330     else if (!strcmp(p, "xa"))   ust = notavail;
  1336     else if (!strcmp(p, "xa"))   ust = notavail;
  1331     else if (!strcmp(p, "chat")) ust = freeforchat;
  1337     else if (!strcmp(p, "chat")) ust = freeforchat;
  1332   }
  1338   }
  1333 
  1339 
  1334   if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_UNAVAILABLE)
  1340   if (mstype == LM_MESSAGE_SUB_TYPE_UNAVAILABLE)
  1335     ust = offline;
  1341     ust = offline;
  1336 
  1342 
  1337   ustmsg = lm_message_node_get_child_value(m->node, "status");
  1343   ustmsg = lm_message_node_get_child_value(m->node, "status");
  1338 
  1344 
  1339   // Timestamp?
  1345   // Timestamp?
  1403 {
  1409 {
  1404   int i;
  1410   int i;
  1405   guint dbgflg;
  1411   guint dbgflg;
  1406   const char *xmlns = NULL;
  1412   const char *xmlns = NULL;
  1407   LmMessageNode *x;
  1413   LmMessageNode *x;
       
  1414   LmMessageSubType mstype = lm_message_get_sub_type(m);
  1408 
  1415 
  1409   for (x = m->node->children; x; x=x->next) {
  1416   for (x = m->node->children; x; x=x->next) {
  1410     xmlns = lm_message_node_get_attribute(x, "xmlns");
  1417     xmlns = lm_message_node_get_attribute(x, "xmlns");
  1411     if (xmlns)
  1418     if (xmlns)
  1412       for (i=0; iq_handlers[i].xmlns; ++i)
  1419       for (i=0; iq_handlers[i].xmlns; ++i)
  1413         if (!strcmp(iq_handlers[i].xmlns, xmlns))
  1420         if (!strcmp(iq_handlers[i].xmlns, xmlns))
  1414           return iq_handlers[i].handler(NULL, connection, m, user_data);
  1421           return iq_handlers[i].handler(NULL, connection, m, user_data);
  1415     xmlns = NULL;
  1422     xmlns = NULL;
  1416   }
  1423   }
  1417 
  1424 
  1418   if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
  1425   if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) {
  1419     display_server_error(lm_message_node_get_child(m->node, "error"));
  1426     display_server_error(lm_message_node_get_child(m->node, "error"));
  1420     return LM_HANDLER_RESULT_REMOVE_MESSAGE;
  1427     return LM_HANDLER_RESULT_REMOVE_MESSAGE;
  1421   }
  1428   }
  1422 
  1429 
  1423   if ((lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_SET) ||
  1430   if ((mstype == LM_MESSAGE_SUB_TYPE_SET) ||
  1424       (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_GET))
  1431       (mstype == LM_MESSAGE_SUB_TYPE_GET))
  1425     send_iq_error(connection, m, XMPP_ERROR_NOT_IMPLEMENTED);
  1432     send_iq_error(connection, m, XMPP_ERROR_NOT_IMPLEMENTED);
  1426 
  1433 
  1427   if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_RESULT)
  1434   if (mstype == LM_MESSAGE_SUB_TYPE_RESULT)
  1428     dbgflg = LPRINT_DEBUG;
  1435     dbgflg = LPRINT_DEBUG;
  1429   else
  1436   else
  1430     dbgflg = LPRINT_NORMAL|LPRINT_DEBUG;
  1437     dbgflg = LPRINT_NORMAL|LPRINT_DEBUG;
  1431 
  1438 
  1432   scr_LogPrint(dbgflg, "Unhandled IQ: %s", lm_message_node_to_string(m->node));
  1439   scr_LogPrint(dbgflg, "Unhandled IQ: %s", lm_message_node_to_string(m->node));
  1439 {
  1446 {
  1440   char *r;
  1447   char *r;
  1441   char *buf;
  1448   char *buf;
  1442   int newbuddy;
  1449   int newbuddy;
  1443   const char *from = lm_message_get_from(m);
  1450   const char *from = lm_message_get_from(m);
       
  1451   LmMessageSubType mstype;
  1444 
  1452 
  1445   r = jidtodisp(from);
  1453   r = jidtodisp(from);
  1446 
  1454 
  1447   newbuddy = !roster_find(r, jidsearch, 0);
  1455   newbuddy = !roster_find(r, jidsearch, 0);
  1448 
  1456   mstype = lm_message_get_sub_type(m);
  1449   if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) {
  1457 
       
  1458   if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) {
  1450     /* The sender wishes to subscribe to our presence */
  1459     /* The sender wishes to subscribe to our presence */
  1451     const char *msg;
  1460     const char *msg;
  1452     int isagent;
  1461     int isagent;
  1453     eviqs *evn;
  1462     eviqs *evn;
  1454 
  1463 
  1481       buf = g_strdup_printf("Unable to create a new event!");
  1490       buf = g_strdup_printf("Unable to create a new event!");
  1482     }
  1491     }
  1483     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
  1492     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
  1484     scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
  1493     scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
  1485     g_free(buf);
  1494     g_free(buf);
  1486   } else if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE) {
  1495   } else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE) {
  1487     /* The sender is unsubscribing from our presence */
  1496     /* The sender is unsubscribing from our presence */
  1488     xmpp_send_s10n(from, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED);
  1497     xmpp_send_s10n(from, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED);
  1489     buf = g_strdup_printf("<%s> is unsubscribing from your "
  1498     buf = g_strdup_printf("<%s> is unsubscribing from your "
  1490                           "presence updates", from);
  1499                           "presence updates", from);
  1491     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
  1500     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
  1492     scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
  1501     scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
  1493     g_free(buf);
  1502     g_free(buf);
  1494   } else if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_SUBSCRIBED) {
  1503   } else if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBED) {
  1495     /* The sender has allowed us to receive their presence */
  1504     /* The sender has allowed us to receive their presence */
  1496     buf = g_strdup_printf("<%s> has allowed you to receive their "
  1505     buf = g_strdup_printf("<%s> has allowed you to receive their "
  1497                           "presence updates", from);
  1506                           "presence updates", from);
  1498     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
  1507     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
  1499     scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
  1508     scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
  1500     g_free(buf);
  1509     g_free(buf);
  1501   } else if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED) {
  1510   } else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED) {
  1502     /* The subscription request has been denied or a previously-granted
  1511     /* The subscription request has been denied or a previously-granted
  1503        subscription has been cancelled */
  1512        subscription has been cancelled */
  1504     roster_unsubscribed(from);
  1513     roster_unsubscribed(from);
  1505     update_roster = TRUE;
  1514     update_roster = TRUE;
  1506     buf = g_strdup_printf("<%s> has cancelled your subscription to "
  1515     buf = g_strdup_printf("<%s> has cancelled your subscription to "