mcabber/mcabber/xmpp.c
changeset 2346 7921c8d671c8
parent 2345 462f4359391c
child 2347 db8de1b464d3
equal deleted inserted replaced
2345:462f4359391c 2346:7921c8d671c8
   260   // Is it a vCard request to a regular user?
   260   // Is it a vCard request to a regular user?
   261   // (vCard requests are sent to bare JIDs, except in MUC rooms...)
   261   // (vCard requests are sent to bare JIDs, except in MUC rooms...)
   262   vcard2user = (reqtype == iqreq_vcard &&
   262   vcard2user = (reqtype == iqreq_vcard &&
   263                 !roster_find(fjid, jidsearch, ROSTER_TYPE_ROOM));
   263                 !roster_find(fjid, jidsearch, ROSTER_TYPE_ROOM));
   264 
   264 
   265   if (strchr(fjid, JID_RESOURCE_SEPARATOR) || vcard2user) {
   265   if (g_utf8_strchr(fjid, -1, JID_RESOURCE_SEPARATOR) || vcard2user) {
   266     // This is a full JID or a vCard request to a contact
   266     // This is a full JID or a vCard request to a contact
   267     xmpp_iq_request(fjid, xmlns);
   267     xmpp_iq_request(fjid, xmlns);
   268     scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
   268     scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
   269     return;
   269     return;
   270   }
   270   }
   313   int otr_msg = 0;
   313   int otr_msg = 0;
   314   char *otr_msg_string = NULL;
   314   char *otr_msg_string = NULL;
   315 #endif
   315 #endif
   316   char *barejid;
   316   char *barejid;
   317 #if defined HAVE_GPGME || defined XEP0085
   317 #if defined HAVE_GPGME || defined XEP0085
   318   char *rname;
   318   const char *rname;
   319   GSList *sl_buddy;
   319   GSList *sl_buddy;
   320 #endif
   320 #endif
   321 #ifdef XEP0085
   321 #ifdef XEP0085
   322   LmMessageNode *event;
   322   LmMessageNode *event;
   323   struct xep0085 *xep85 = NULL;
   323   struct xep0085 *xep85 = NULL;
   342       subtype = LM_MESSAGE_SUB_TYPE_CHAT;
   342       subtype = LM_MESSAGE_SUB_TYPE_CHAT;
   343   }
   343   }
   344 
   344 
   345   barejid = jidtodisp(fjid);
   345   barejid = jidtodisp(fjid);
   346 #if defined HAVE_GPGME || defined HAVE_LIBOTR || defined XEP0085
   346 #if defined HAVE_GPGME || defined HAVE_LIBOTR || defined XEP0085
   347   rname = strchr(fjid, JID_RESOURCE_SEPARATOR);
   347   rname = jid_get_resource_name(fjid);
   348   sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
   348   sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
   349 
       
   350   // If we can get a resource name, we use it.  Else we use NULL,
       
   351   // which hopefully will give us the most likely resource.
       
   352   if (rname)
       
   353     rname++;
       
   354 
   349 
   355 #ifdef HAVE_LIBOTR
   350 #ifdef HAVE_LIBOTR
   356   if (otr_enabled() && !otrinject) {
   351   if (otr_enabled() && !otrinject) {
   357     if (type == ROSTER_TYPE_USER) {
   352     if (type == ROSTER_TYPE_USER) {
   358       otr_msg_string = otr_send(text, barejid, &otr_msg);
   353       otr_msg_string = otr_send(text, barejid, &otr_msg);
   582 
   577 
   583 //  chatstates_reset_probed(fulljid)
   578 //  chatstates_reset_probed(fulljid)
   584 // If the XEP has been probed for this contact, set it back to unknown so
   579 // If the XEP has been probed for this contact, set it back to unknown so
   585 // that we probe it again.  The parameter must be a full jid (w/ resource).
   580 // that we probe it again.  The parameter must be a full jid (w/ resource).
   586 #if defined XEP0085
   581 #if defined XEP0085
   587 static void chatstates_reset_probed(const char *fulljid)
   582 static void chatstates_reset_probed(const char *bare_jid,
   588 {
   583                                     const char *resource_name)
   589   char *rname, *barejid;
   584 {
   590   GSList *sl_buddy;
   585   GSList *sl_buddy;
   591   struct xep0085 *xep85;
   586   struct xep0085 *xep85;
   592 
   587 
   593   rname = strchr(fulljid, JID_RESOURCE_SEPARATOR);
   588   sl_buddy = roster_find(bare_jid, jidsearch, ROSTER_TYPE_USER);
   594   if (!rname++)
   589 
   595     return;
   590   // only reset if we found the buddy and it has a resource
   596 
   591   if (!sl_buddy || !resource_name)
   597   barejid = jidtodisp(fulljid);
   592     return;
   598   sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
   593 
   599   g_free(barejid);
   594   xep85 = buddy_resource_xep85(sl_buddy->data, resource_name);
   600 
       
   601   if (!sl_buddy)
       
   602     return;
       
   603 
       
   604   xep85 = buddy_resource_xep85(sl_buddy->data, rname);
       
   605 
   595 
   606   if (xep85 && xep85->support == CHATSTATES_SUPPORT_PROBED)
   596   if (xep85 && xep85->support == CHATSTATES_SUPPORT_PROBED)
   607     xep85->support = CHATSTATES_SUPPORT_UNKNOWN;
   597     xep85->support = CHATSTATES_SUPPORT_UNKNOWN;
   608 }
   598 }
   609 #endif
   599 #endif
   814   if (success) {
   804   if (success) {
   815     const char *password, *resource;
   805     const char *password, *resource;
   816     char *username;
   806     char *username;
   817     username   = jid_get_username(settings_opt_get("jid"));
   807     username   = jid_get_username(settings_opt_get("jid"));
   818     password   = settings_opt_get("password");
   808     password   = settings_opt_get("password");
   819     resource   = strchr(lm_connection_get_jid(connection),
   809     resource   = jid_get_resource_name(lm_connection_get_jid(connection));
   820                         JID_RESOURCE_SEPARATOR);
       
   821     if (resource)
       
   822       resource++;
       
   823 
   810 
   824     if (!lm_connection_authenticate(lconnection, username, password, resource,
   811     if (!lm_connection_authenticate(lconnection, username, password, resource,
   825                                     connection_auth_cb, NULL, FALSE, &error)) {
   812                                     connection_auth_cb, NULL, FALSE, &error)) {
   826       scr_LogPrint(LPRINT_LOGNORM, "Failed to authenticate: %s",
   813       scr_LogPrint(LPRINT_LOGNORM, "Failed to authenticate: %s",
   827                    error->message);
   814                    error->message);
   939   char *decrypted_pgp = NULL;
   926   char *decrypted_pgp = NULL;
   940   char *decrypted_otr = NULL;
   927   char *decrypted_otr = NULL;
   941   int otr_msg = 0, free_msg = 0;
   928   int otr_msg = 0, free_msg = 0;
   942 
   929 
   943   bjid = jidtodisp(from);
   930   bjid = jidtodisp(from);
   944 
   931   rname = jid_get_resource_name(from);
   945   rname = strchr(from, JID_RESOURCE_SEPARATOR);
       
   946   if (rname) rname++;
       
   947 
   932 
   948 #ifdef HAVE_GPGME
   933 #ifdef HAVE_GPGME
   949   if (gpg_enabled()) {
   934   if (gpg_enabled()) {
   950     if (enc) {
   935     if (enc) {
   951       decrypted_pgp = gpg_decrypt(enc);
   936       decrypted_pgp = gpg_decrypt(enc);
  1081 static LmHandlerResult handle_messages(LmMessageHandler *handler,
  1066 static LmHandlerResult handle_messages(LmMessageHandler *handler,
  1082                                        LmConnection *connection,
  1067                                        LmConnection *connection,
  1083                                        LmMessage *m, gpointer user_data)
  1068                                        LmMessage *m, gpointer user_data)
  1084 {
  1069 {
  1085   const char *from = lm_message_get_from(m);
  1070   const char *from = lm_message_get_from(m);
  1086   char *bjid, *res;
  1071   char *bjid;
       
  1072   const char *res;
  1087   LmMessageNode *x;
  1073   LmMessageNode *x;
  1088   const char *body = NULL;
  1074   const char *body = NULL;
  1089   const char *enc = NULL;
  1075   const char *enc = NULL;
  1090   const char *subject = NULL;
  1076   const char *subject = NULL;
  1091   time_t timestamp = 0L;
  1077   time_t timestamp = 0L;
  1095   if (!from) {
  1081   if (!from) {
  1096     scr_LogPrint(LPRINT_DEBUG, "handle_messages: message with missing from attribute");
  1082     scr_LogPrint(LPRINT_DEBUG, "handle_messages: message with missing from attribute");
  1097     return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
  1083     return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
  1098   }
  1084   }
  1099   // Get the bare-JID/room (bjid) and the resource/nickname (res)
  1085   // Get the bare-JID/room (bjid) and the resource/nickname (res)
  1100   bjid = g_strdup(from);
  1086   bjid = jidtodisp(from);
  1101   res = strchr(bjid, JID_RESOURCE_SEPARATOR);
  1087   res = jid_get_resource_name(from);
  1102   if (res) *res++ = 0;
       
  1103 
  1088 
  1104   mstype = lm_message_get_sub_type(m);
  1089   mstype = lm_message_get_sub_type(m);
  1105   // Timestamp?
  1090   // Timestamp?
  1106   timestamp = lm_message_node_get_timestamp(m->node);
  1091   timestamp = lm_message_node_get_timestamp(m->node);
  1107 
  1092 
  1109     x = lm_message_node_get_child(m->node, "error");
  1094     x = lm_message_node_get_child(m->node, "error");
  1110     display_server_error(x, from);
  1095     display_server_error(x, from);
  1111 #ifdef XEP0085
  1096 #ifdef XEP0085
  1112     // If the XEP85/22 support is probed, set it back to unknown so that
  1097     // If the XEP85/22 support is probed, set it back to unknown so that
  1113     // we probe it again.
  1098     // we probe it again.
  1114     chatstates_reset_probed(from);
  1099     chatstates_reset_probed(bjid, res);
  1115 #endif
  1100 #endif
  1116   } else {
  1101   } else {
  1117     handle_state_events(bjid, res, m->node);
  1102     handle_state_events(bjid, res, m->node);
  1118   }
  1103   }
  1119 
  1104 
  1156       if (!from) {
  1141       if (!from) {
  1157         scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy!");
  1142         scr_LogPrint(LPRINT_LOGNORM, "Malformed carbon copy!");
  1158         goto handle_messages_return;
  1143         goto handle_messages_return;
  1159       }
  1144       }
  1160       g_free(bjid);
  1145       g_free(bjid);
  1161       bjid = g_strdup(from);
  1146       bjid = jidtodisp(from);
  1162       res = strchr(bjid, JID_RESOURCE_SEPARATOR);
  1147       res = jid_get_resource_name(from);
  1163       if (res) *res++ = 0;
       
  1164 
  1148 
  1165       // Try to handle forwarded chat state messages
  1149       // Try to handle forwarded chat state messages
  1166       handle_state_events(from, res, x);
  1150       handle_state_events(from, res, x);
  1167 
  1151 
  1168       scr_LogPrint(LPRINT_DEBUG, "Received incoming carbon from <%s>", from);
  1152       scr_LogPrint(LPRINT_DEBUG, "Received incoming carbon from <%s>", from);
  1414       return LM_HANDLER_RESULT_REMOVE_MESSAGE;
  1398       return LM_HANDLER_RESULT_REMOVE_MESSAGE;
  1415     }
  1399     }
  1416     return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
  1400     return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
  1417   }
  1401   }
  1418 
  1402 
  1419   rname = strchr(from, JID_RESOURCE_SEPARATOR);
  1403   rname = jid_get_resource_name(from);
  1420   if (rname) rname++;
       
  1421 
  1404 
  1422   if (settings_opt_get_int("ignore_self_presence")) {
  1405   if (settings_opt_get_int("ignore_self_presence")) {
  1423     const char *self_fjid = lm_connection_get_jid(connection);
  1406     const char *self_fjid = lm_connection_get_jid(connection);
  1424     if (self_fjid && !strcasecmp(self_fjid, from)) {
  1407     if (self_fjid && !strcasecmp(self_fjid, from)) {
  1425       return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Ignoring self presence
  1408       return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Ignoring self presence