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 } |
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 |