Mercurial > ~mikael > mcabber > hg
comparison mcabber/mcabber/xmpp.c @ 2346:7921c8d671c8
Implemented another helper function jid_get_resource_name
author | franky |
---|---|
date | Tue, 14 May 2019 22:19:33 +0200 |
parents | 462f4359391c |
children | db8de1b464d3 |
comparison
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 |