equal
deleted
inserted
replaced
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); |