comparison mcabber/mcabber/xmpp_iq.c @ 2210:ea90906cb691

Add a few more checks
author Mikael Berthe <mikael@lilotux.net>
date Fri, 23 Oct 2015 20:47:26 +0200
parents ec0a361f3ff1
children f5402d705f67
comparison
equal deleted inserted replaced
2209:412322678d59 2210:ea90906cb691
101 { 101 {
102 LmMessage *r; 102 LmMessage *r;
103 LmMessageNode *err; 103 LmMessageNode *err;
104 int i; 104 int i;
105 105
106 if (G_UNLIKELY(!m)) return NULL;
107
106 for (i = 0; xmpp_errors[i].code; ++i) 108 for (i = 0; xmpp_errors[i].code; ++i)
107 if (xmpp_errors[i].code == error) 109 if (xmpp_errors[i].code == error)
108 break; 110 break;
109 g_return_val_if_fail(xmpp_errors[i].code > 0, NULL); 111 g_return_val_if_fail(xmpp_errors[i].code > 0, NULL);
110 112
122 124
123 void send_iq_error(LmConnection *c, LmMessage *m, guint error) 125 void send_iq_error(LmConnection *c, LmMessage *m, guint error)
124 { 126 {
125 LmMessage *r; 127 LmMessage *r;
126 r = lm_message_new_iq_error(m, error); 128 r = lm_message_new_iq_error(m, error);
127 lm_connection_send(c, r, NULL); 129 if (r) {
128 lm_message_unref(r); 130 lm_connection_send(c, r, NULL);
131 lm_message_unref(r);
132 }
129 } 133 }
130 134
131 static void lm_message_node_add_dataform_result(LmMessageNode *node, 135 static void lm_message_node_add_dataform_result(LmMessageNode *node,
132 const char *message) 136 const char *message)
133 { 137 {
335 char *sessionid; 339 char *sessionid;
336 LmMessage *iq; 340 LmMessage *iq;
337 LmMessageNode *command, *x; 341 LmMessageNode *command, *x;
338 342
339 x = lm_message_node_get_child(m->node, "command"); 343 x = lm_message_node_get_child(m->node, "command");
344 if (!x)
345 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
346
340 action = lm_message_node_get_attribute(x, "action"); 347 action = lm_message_node_get_attribute(x, "action");
341 node = lm_message_node_get_attribute(x, "node"); 348 node = lm_message_node_get_attribute(x, "node");
342 sessionid = (char*)lm_message_node_get_attribute(x, "sessionid"); 349 sessionid = (char*)lm_message_node_get_attribute(x, "sessionid");
343 350
344 iq = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); 351 iq = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT);
434 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; 441 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
435 442
436 requester_jid = lm_message_get_from(m); 443 requester_jid = lm_message_get_from(m);
437 444
438 cmd = lm_message_node_get_child(m->node, "command"); 445 cmd = lm_message_node_get_child(m->node, "command");
446 if (!cmd) {
447 //send_iq_error(c, m, XMPP_ERROR_BAD_REQUEST);
448 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
449 }
439 if (jid_equal(lm_connection_get_jid(c), requester_jid)) { 450 if (jid_equal(lm_connection_get_jid(c), requester_jid)) {
440 const char *action, *node; 451 const char *action, *node;
441 action = lm_message_node_get_attribute(cmd, "action"); 452 action = lm_message_node_get_attribute(cmd, "action");
442 node = lm_message_node_get_attribute(cmd, "node"); 453 node = lm_message_node_get_attribute(cmd, "node");
443 // action can be NULL, in which case it seems to take the default, 454 // action can be NULL, in which case it seems to take the default,
452 // and do not authorize it 463 // and do not authorize it
453 } else { 464 } else {
454 LmMessage *r; 465 LmMessage *r;
455 LmMessageNode *err; 466 LmMessageNode *err;
456 r = lm_message_new_iq_error(m, XMPP_ERROR_BAD_REQUEST); 467 r = lm_message_new_iq_error(m, XMPP_ERROR_BAD_REQUEST);
457 err = lm_message_node_get_child(r->node, "error"); 468 if (r) {
458 lm_message_node_set_attribute 469 err = lm_message_node_get_child(r->node, "error");
459 (lm_message_node_add_child(err, "malformed-action", NULL), 470 lm_message_node_set_attribute
460 "xmlns", NS_COMMANDS); 471 (lm_message_node_add_child(err, "malformed-action", NULL),
461 lm_connection_send(c, r, NULL); 472 "xmlns", NS_COMMANDS);
462 lm_message_unref(r); 473 lm_connection_send(c, r, NULL);
474 lm_message_unref(r);
475 }
463 } 476 }
464 } else { 477 } else {
465 send_iq_error(c, m, XMPP_ERROR_FORBIDDEN); 478 send_iq_error(c, m, XMPP_ERROR_FORBIDDEN);
466 } 479 }
467 return LM_HANDLER_RESULT_REMOVE_MESSAGE; 480 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
471 LmHandlerResult handle_iq_disco_items(LmMessageHandler *h, 484 LmHandlerResult handle_iq_disco_items(LmMessageHandler *h,
472 LmConnection *c, 485 LmConnection *c,
473 LmMessage *m, gpointer ud) 486 LmMessage *m, gpointer ud)
474 { 487 {
475 LmMessageNode *query; 488 LmMessageNode *query;
476 const char *node; 489 const char *node = NULL;
477 query = lm_message_node_get_child(m->node, "query"); 490 query = lm_message_node_get_child(m->node, "query");
478 node = lm_message_node_get_attribute(query, "node"); 491 if (query)
492 node = lm_message_node_get_attribute(query, "node");
479 if (node) { 493 if (node) {
480 if (!strcmp(node, NS_COMMANDS)) { 494 if (!strcmp(node, NS_COMMANDS)) {
481 return handle_iq_commands_list(NULL, c, m, ud); 495 return handle_iq_commands_list(NULL, c, m, ud);
482 } else { 496 } else {
483 send_iq_error(c, m, XMPP_ERROR_NOT_IMPLEMENTED); 497 send_iq_error(c, m, XMPP_ERROR_NOT_IMPLEMENTED);