comparison mcabber/mcabber/xmpp.c @ 2151:8819bab88053

Improve Message Carbons support * Do not process Carbons with empty body * Add a few checks * Use the regular message handling functions, so that logging and hooks work as expected
author Mikael Berthe <mikael@lilotux.net>
date Sat, 04 Oct 2014 18:31:41 +0200
parents e702073612de
children 2ce6dd6861ea
comparison
equal deleted inserted replaced
2150:392cf37d5966 2151:8819bab88053
1080 update_roster = TRUE; 1080 update_roster = TRUE;
1081 #endif 1081 #endif
1082 } 1082 }
1083 1083
1084 static void gotmessage(LmMessageSubType type, const char *from, 1084 static void gotmessage(LmMessageSubType type, const char *from,
1085 const char *body, const char *enc, const char *subject, 1085 const char *body, const char *enc,
1086 time_t timestamp, LmMessageNode *node_signed) 1086 const char *subject, time_t timestamp,
1087 LmMessageNode *node_signed, gboolean carbon)
1087 { 1088 {
1088 char *bjid; 1089 char *bjid;
1089 const char *rname; 1090 const char *rname;
1090 char *decrypted_pgp = NULL; 1091 char *decrypted_pgp = NULL;
1091 char *decrypted_otr = NULL; 1092 char *decrypted_otr = NULL;
1183 fullbody = g_strdup_printf("[%s]\n%s", subject, body); 1184 fullbody = g_strdup_printf("[%s]\n%s", subject, body);
1184 else 1185 else
1185 fullbody = g_strdup_printf("[%s]\n", subject); 1186 fullbody = g_strdup_printf("[%s]\n", subject);
1186 body = fullbody; 1187 body = fullbody;
1187 } 1188 }
1189 // XXX/TODO: pass the carbon status (Mikael)
1188 hk_message_in(bjid, rname, timestamp, body, type, encrypted); 1190 hk_message_in(bjid, rname, timestamp, body, type, encrypted);
1189 g_free(fullbody); 1191 g_free(fullbody);
1190 } 1192 }
1191 1193
1192 gotmessage_return: 1194 gotmessage_return:
1208 const char *body = NULL; 1210 const char *body = NULL;
1209 const char *enc = NULL; 1211 const char *enc = NULL;
1210 const char *subject = NULL; 1212 const char *subject = NULL;
1211 time_t timestamp = 0L; 1213 time_t timestamp = 0L;
1212 LmMessageSubType mstype; 1214 LmMessageSubType mstype;
1215 gboolean skip_process = FALSE;
1216 LmMessageNode *ns_signed = NULL;
1213 1217
1214 mstype = lm_message_get_sub_type(m); 1218 mstype = lm_message_get_sub_type(m);
1215 1219
1216 body = lm_message_node_get_child_value(m->node, "body"); 1220 body = lm_message_node_get_child_value(m->node, "body");
1217 1221
1276 handle_state_events(from, m->node); 1280 handle_state_events(from, m->node);
1277 } 1281 }
1278 1282
1279 // Check for carbons! 1283 // Check for carbons!
1280 x = lm_message_node_find_xmlns(m->node, NS_CARBONS_2); 1284 x = lm_message_node_find_xmlns(m->node, NS_CARBONS_2);
1281 char carbons = 0; 1285 gboolean carbons = FALSE;
1282 if (x) { 1286 if (x) {
1283 carbons = 1; 1287 carbons = TRUE;
1284 // Parse a message that is send to one of our other resources 1288 // Parse a message that is send to one of our other resources
1285 if (!g_strcmp0(x->name, "received")) { 1289 if (!g_strcmp0(x->name, "received")) {
1286 // Go 1 level deeper to the forwarded message 1290 // Go 1 level deeper to the forwarded message
1287 x = lm_message_node_find_xmlns(x, "urn:xmpp:forward:0"); 1291 x = lm_message_node_find_xmlns(x, "urn:xmpp:forward:0");
1288 x = lm_message_node_get_child(x, "message"); 1292 x = lm_message_node_get_child(x, "message");
1289 1293
1290 from = lm_message_node_get_attribute(x, "from"); 1294 from = lm_message_node_get_attribute(x, "from");
1295 if (!from) {
1296 scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy!");
1297 goto handle_messages_return;
1298 }
1291 g_free(bjid); 1299 g_free(bjid);
1292 bjid = g_strdup(from); 1300 bjid = g_strdup(from);
1293 res = strchr(bjid, JID_RESOURCE_SEPARATOR); 1301 res = strchr(bjid, JID_RESOURCE_SEPARATOR);
1294 if (res) *res++ = 0; 1302 if (res) *res++ = 0;
1295 scr_WriteIncomingMessage(bjid, body, timestamp, HBB_PREFIX_IN, 0); 1303
1296 1304 if (body && *body && !subject && !enc)
1297 scr_LogPrint(LPRINT_DEBUG, "carbon from:%s", 1305 ns_signed = lm_message_node_find_xmlns(x, NS_SIGNED);
1298 lm_message_node_get_attribute(x, "from")); 1306 else
1307 skip_process = TRUE;
1308
1309 // We (probably) cannot handle encrypted forwarded messages
1310 if (lm_message_node_find_xmlns(x, NS_ENCRYPTED))
1311 skip_process = TRUE;
1312
1313 // Try to handle forwarded chat state messages
1314 if (!skip_process)
1315 handle_state_events(from, x);
1316
1317 scr_LogPrint(LPRINT_DEBUG, "Received incoming carbon from <%s>", from);
1299 1318
1300 } else if (!g_strcmp0(x->name, "sent")) { 1319 } else if (!g_strcmp0(x->name, "sent")) {
1301 x = lm_message_node_find_xmlns(x, "urn:xmpp:forward:0"); 1320 x = lm_message_node_find_xmlns(x, "urn:xmpp:forward:0");
1302 x = lm_message_node_get_child(x, "message"); 1321 x = lm_message_node_get_child(x, "message");
1303 1322
1304 const char *to= lm_message_node_get_attribute(x, "to"); 1323 const char *to= lm_message_node_get_attribute(x, "to");
1324 if (!to) {
1325 scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy!");
1326 goto handle_messages_return;
1327 }
1305 g_free(bjid); 1328 g_free(bjid);
1306 bjid = g_strdup(to); 1329 bjid = jidtodisp(to);
1307 res = strchr(bjid, JID_RESOURCE_SEPARATOR); 1330
1308 if (res) *res++ = 0; 1331 if (body && *body)
1309 1332 hk_message_out(bjid, NULL, timestamp, body, 0, NULL);
1310 scr_write_outgoing_message(bjid, body, 0, NULL); 1333
1311 } 1334 scr_LogPrint(LPRINT_DEBUG, "Received outgoing carbon for <%s>", to);
1312 } 1335 goto handle_messages_return;
1313 1336 }
1314 1337 } else { // Not a Carbon
1315 if (from && (body || subject) && !carbons) 1338 ns_signed = lm_message_node_find_xmlns(m->node, NS_SIGNED);
1339 }
1340
1341 // Do not process the message if some fields are missing
1342 if (!from || (!body && !subject))
1343 skip_process = TRUE;
1344
1345 if (!skip_process) {
1316 gotmessage(mstype, from, body, enc, subject, timestamp, 1346 gotmessage(mstype, from, body, enc, subject, timestamp,
1317 lm_message_node_find_xmlns(m->node, NS_SIGNED)); 1347 ns_signed, carbons);
1348 }
1349
1350 // We're done if it was a Carbon forwarded message
1351 if (carbons)
1352 goto handle_messages_return;
1318 1353
1319 // Report received message if message delivery receipt was requested 1354 // Report received message if message delivery receipt was requested
1320 if (lm_message_node_get_child(m->node, "request") && 1355 if (lm_message_node_get_child(m->node, "request") &&
1321 (roster_getsubscription(bjid) & sub_from)) { 1356 (roster_getsubscription(bjid) & sub_from)) {
1322 const gchar *mid; 1357 const gchar *mid;
1373 got_invite(from, jid, reason, password, FALSE); 1408 got_invite(from, jid, reason, password, FALSE);
1374 } 1409 }
1375 } 1410 }
1376 } 1411 }
1377 1412
1413 handle_messages_return:
1378 g_free(bjid); 1414 g_free(bjid);
1379 return LM_HANDLER_RESULT_REMOVE_MESSAGE; 1415 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1380 } 1416 }
1381 1417
1382 static LmHandlerResult cb_caps(LmMessageHandler *h, LmConnection *c, 1418 static LmHandlerResult cb_caps(LmMessageHandler *h, LmConnection *c,