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