Mercurial > ~mikael > mcabber > hg
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); |