mcabber/mcabber/xmpp_iq.c
changeset 2210 ea90906cb691
parent 2083 ec0a361f3ff1
child 2268 f5402d705f67
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);