Mercurial > pidgin
comparison libpurple/protocols/jabber/jabber.c @ 27509:ebd9630ffc77
propagate from branch 'im.pidgin.pidgin' (head cec487e50b3df746ae8b23771513bf85734f618d)
to branch 'im.pidgin.cpw.darkrain42.obsolete' (head 1fc27ec0bc11e95aeff8c890ab68a5ddcb4bfb8d)
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sun, 12 Jul 2009 04:41:56 +0000 |
parents | 01927ce552bc 3bb1085235d0 |
children | 4cddfd2d06be 15cde23b43bc |
comparison
equal
deleted
inserted
replaced
27369:01927ce552bc | 27509:ebd9630ffc77 |
---|---|
100 if (type == JABBER_IQ_RESULT) { | 100 if (type == JABBER_IQ_RESULT) { |
101 jabber_disco_items_server(js); | 101 jabber_disco_items_server(js); |
102 if(js->unregistration) | 102 if(js->unregistration) |
103 jabber_unregister_account_cb(js); | 103 jabber_unregister_account_cb(js); |
104 } else { | 104 } else { |
105 purple_connection_error_reason (js->gc, | 105 purple_connection_error_reason(js->gc, |
106 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 106 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
107 ("Error initializing session")); | 107 ("Error initializing session")); |
108 } | 108 } |
109 } | 109 } |
110 | 110 |
133 char *full_jid; | 133 char *full_jid; |
134 if((jid = xmlnode_get_child(bind, "jid")) && (full_jid = xmlnode_get_data(jid))) { | 134 if((jid = xmlnode_get_child(bind, "jid")) && (full_jid = xmlnode_get_data(jid))) { |
135 JabberBuddy *my_jb = NULL; | 135 JabberBuddy *my_jb = NULL; |
136 jabber_id_free(js->user); | 136 jabber_id_free(js->user); |
137 if(!(js->user = jabber_id_new(full_jid))) { | 137 if(!(js->user = jabber_id_new(full_jid))) { |
138 purple_connection_error_reason (js->gc, | 138 purple_connection_error_reason(js->gc, |
139 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 139 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
140 _("Invalid response from server.")); | 140 _("Invalid response from server")); |
141 } | 141 } |
142 if((my_jb = jabber_buddy_find(js, full_jid, TRUE))) | 142 if((my_jb = jabber_buddy_find(js, full_jid, TRUE))) |
143 my_jb->subscription |= JABBER_SUB_BOTH; | 143 my_jb->subscription |= JABBER_SUB_BOTH; |
144 | 144 |
145 purple_connection_set_display_name(js->gc, full_jid); | 145 purple_connection_set_display_name(js->gc, full_jid); |
147 g_free(full_jid); | 147 g_free(full_jid); |
148 } | 148 } |
149 } else { | 149 } else { |
150 PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; | 150 PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; |
151 char *msg = jabber_parse_error(js, packet, &reason); | 151 char *msg = jabber_parse_error(js, packet, &reason); |
152 purple_connection_error_reason (js->gc, reason, msg); | 152 purple_connection_error_reason(js->gc, reason, msg); |
153 g_free(msg); | 153 g_free(msg); |
154 } | 154 } |
155 | 155 |
156 jabber_session_init(js); | 156 jabber_session_init(js); |
157 } | 157 } |
194 if(xmlnode_get_child(packet, "starttls")) { | 194 if(xmlnode_get_child(packet, "starttls")) { |
195 if(jabber_process_starttls(js, packet)) | 195 if(jabber_process_starttls(js, packet)) |
196 | 196 |
197 return; | 197 return; |
198 } else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !jabber_stream_is_ssl(js)) { | 198 } else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !jabber_stream_is_ssl(js)) { |
199 purple_connection_error_reason (js->gc, | 199 purple_connection_error_reason(js->gc, |
200 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, | 200 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, |
201 _("You require encryption, but it is not available on this server.")); | 201 _("You require encryption, but it is not available on this server.")); |
202 return; | 202 return; |
203 } | 203 } |
204 | 204 |
236 static void jabber_stream_handle_error(JabberStream *js, xmlnode *packet) | 236 static void jabber_stream_handle_error(JabberStream *js, xmlnode *packet) |
237 { | 237 { |
238 PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; | 238 PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; |
239 char *msg = jabber_parse_error(js, packet, &reason); | 239 char *msg = jabber_parse_error(js, packet, &reason); |
240 | 240 |
241 purple_connection_error_reason (js->gc, reason, msg); | 241 purple_connection_error_reason(js->gc, reason, msg); |
242 | 242 |
243 g_free(msg); | 243 g_free(msg); |
244 } | 244 } |
245 | 245 |
246 static void tls_init(JabberStream *js); | 246 static void tls_init(JabberStream *js); |
318 ret = jabber_do_send(js, js->write_buffer->outptr, writelen); | 318 ret = jabber_do_send(js, js->write_buffer->outptr, writelen); |
319 | 319 |
320 if (ret < 0 && errno == EAGAIN) | 320 if (ret < 0 && errno == EAGAIN) |
321 return; | 321 return; |
322 else if (ret <= 0) { | 322 else if (ret <= 0) { |
323 purple_connection_error_reason (js->gc, | 323 gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"), |
324 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 324 g_strerror(errno)); |
325 _("Write error")); | 325 purple_connection_error_reason(js->gc, |
326 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); | |
327 g_free(tmp); | |
326 return; | 328 return; |
327 } | 329 } |
328 | 330 |
329 purple_circ_buffer_mark_read(js->write_buffer, ret); | 331 purple_circ_buffer_mark_read(js->write_buffer, ret); |
330 } | 332 } |
343 ret = -1; | 345 ret = -1; |
344 errno = EAGAIN; | 346 errno = EAGAIN; |
345 } | 347 } |
346 | 348 |
347 if (ret < 0 && errno != EAGAIN) { | 349 if (ret < 0 && errno != EAGAIN) { |
348 purple_connection_error_reason (js->gc, | 350 gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"), |
349 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 351 g_strerror(errno)); |
350 _("Write error")); | 352 purple_connection_error_reason(js->gc, |
353 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); | |
354 g_free(tmp); | |
351 success = FALSE; | 355 success = FALSE; |
352 } else if (ret < len) { | 356 } else if (ret < len) { |
353 if (ret < 0) | 357 if (ret < 0) |
354 ret = 0; | 358 ret = 0; |
355 if (js->writeh == 0) | 359 if (js->writeh == 0) |
471 | 475 |
472 static gboolean jabber_keepalive_timeout(PurpleConnection *gc) | 476 static gboolean jabber_keepalive_timeout(PurpleConnection *gc) |
473 { | 477 { |
474 JabberStream *js = gc->proto_data; | 478 JabberStream *js = gc->proto_data; |
475 purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 479 purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
476 _("Ping timeout")); | 480 _("Ping timed out")); |
477 js->keepalive_timeout = 0; | 481 js->keepalive_timeout = 0; |
478 return FALSE; | 482 return FALSE; |
479 } | 483 } |
480 | 484 |
481 void jabber_keepalive(PurpleConnection *gc) | 485 void jabber_keepalive(PurpleConnection *gc) |
514 } | 518 } |
515 | 519 |
516 if(len < 0 && errno == EAGAIN) | 520 if(len < 0 && errno == EAGAIN) |
517 return; | 521 return; |
518 else { | 522 else { |
523 gchar *tmp; | |
519 if (len == 0) | 524 if (len == 0) |
520 purple_debug_info("jabber", "Server closed the connection.\n"); | 525 tmp = g_strdup_printf(_("Server closed the connection")); |
521 else | 526 else |
522 purple_debug_info("jabber", "Disconnected: %s\n", g_strerror(errno)); | 527 tmp = g_strdup_printf(_("Lost connection with server: %s"), |
523 purple_connection_error_reason (js->gc, | 528 g_strerror(errno)); |
524 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 529 purple_connection_error_reason(js->gc, |
525 _("Read Error")); | 530 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); |
531 g_free(tmp); | |
526 } | 532 } |
527 } | 533 } |
528 | 534 |
529 static void | 535 static void |
530 jabber_recv_cb(gpointer data, gint source, PurpleInputCondition condition) | 536 jabber_recv_cb(gpointer data, gint source, PurpleInputCondition condition) |
559 if(js->reinit) | 565 if(js->reinit) |
560 jabber_stream_init(js); | 566 jabber_stream_init(js); |
561 } else if(len < 0 && errno == EAGAIN) { | 567 } else if(len < 0 && errno == EAGAIN) { |
562 return; | 568 return; |
563 } else { | 569 } else { |
570 gchar *tmp; | |
564 if (len == 0) | 571 if (len == 0) |
565 purple_debug_info("jabber", "Server closed the connection.\n"); | 572 tmp = g_strdup_printf(_("Server closed the connection")); |
566 else | 573 else |
567 purple_debug_info("jabber", "Disconnected: %s\n", g_strerror(errno)); | 574 tmp = g_strdup_printf(_("Lost connection with server: %s"), |
568 purple_connection_error_reason (js->gc, | 575 g_strerror(errno)); |
569 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 576 purple_connection_error_reason(js->gc, |
570 _("Read Error")); | 577 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); |
578 g_free(tmp); | |
571 } | 579 } |
572 } | 580 } |
573 | 581 |
574 static void | 582 static void |
575 jabber_login_callback_ssl(gpointer data, PurpleSslConnection *gsc, | 583 jabber_login_callback_ssl(gpointer data, PurpleSslConnection *gsc, |
601 JabberStream *js = data; | 609 JabberStream *js = data; |
602 | 610 |
603 js->srv_query_data = NULL; | 611 js->srv_query_data = NULL; |
604 | 612 |
605 if (responses == NULL) { | 613 if (responses == NULL) { |
606 gchar *tmp; | 614 purple_connection_error_reason(js->gc, |
607 tmp = g_strdup_printf(_("Could not find alternative XMPP connection methods after failing to connect directly.\n")); | 615 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
608 purple_connection_error_reason (js->gc, | 616 _("Unable to find alternative XMPP connection " |
609 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); | 617 "methods after failing to connect directly.")); |
610 g_free(tmp); | |
611 return; | 618 return; |
612 } | 619 } |
613 | 620 |
614 while (responses) { | 621 while (responses) { |
615 PurpleTxtResponse *resp = responses->data; | 622 PurpleTxtResponse *resp = responses->data; |
707 js->serverFQDN = g_strdup(host); | 714 js->serverFQDN = g_strdup(host); |
708 | 715 |
709 if (purple_proxy_connect(js->gc, js->gc->account, host, | 716 if (purple_proxy_connect(js->gc, js->gc->account, host, |
710 port, jabber_login_callback, js->gc) == NULL) { | 717 port, jabber_login_callback, js->gc) == NULL) { |
711 if (fatal_failure) { | 718 if (fatal_failure) { |
712 purple_connection_error_reason (js->gc, | 719 purple_connection_error_reason(js->gc, |
713 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 720 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
714 _("Unable to create socket")); | 721 _("Unable to connect")); |
715 } | 722 } |
716 | 723 |
717 return FALSE; | 724 return FALSE; |
718 } | 725 } |
719 | 726 |
794 presence = purple_account_get_presence(account); | 801 presence = purple_account_get_presence(account); |
795 if (purple_presence_is_idle(presence)) | 802 if (purple_presence_is_idle(presence)) |
796 js->idle = purple_presence_get_idle_time(presence); | 803 js->idle = purple_presence_get_idle_time(presence); |
797 | 804 |
798 if(!js->user) { | 805 if(!js->user) { |
799 purple_connection_error_reason (gc, | 806 purple_connection_error_reason(gc, |
800 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, | 807 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, |
801 _("Invalid XMPP ID")); | 808 _("Invalid XMPP ID")); |
802 return; | 809 return; |
803 } | 810 } |
804 | 811 |
805 if (!js->user->domain || *(js->user->domain) == '\0') { | 812 if (!js->user->domain || *(js->user->domain) == '\0') { |
806 purple_connection_error_reason (gc, | 813 purple_connection_error_reason(gc, |
807 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, | 814 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, |
808 _("Invalid XMPP ID. Domain must be set.")); | 815 _("Invalid XMPP ID. Domain must be set.")); |
809 return; | 816 return; |
810 } | 817 } |
811 | 818 |
833 js->use_bosh = TRUE; | 840 js->use_bosh = TRUE; |
834 js->bosh = jabber_bosh_connection_init(js, bosh_url); | 841 js->bosh = jabber_bosh_connection_init(js, bosh_url); |
835 if (js->bosh) | 842 if (js->bosh) |
836 jabber_bosh_connection_connect(js->bosh); | 843 jabber_bosh_connection_connect(js->bosh); |
837 else { | 844 else { |
838 purple_connection_error_reason (js->gc, | 845 purple_connection_error_reason(js->gc, |
839 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, | 846 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, |
840 _("Malformed BOSH URL")); | 847 _("Malformed BOSH URL")); |
841 } | 848 } |
842 | 849 |
843 return; | 850 return; |
851 js->gsc = purple_ssl_connect(js->gc->account, | 858 js->gsc = purple_ssl_connect(js->gc->account, |
852 js->certificate_CN, | 859 js->certificate_CN, |
853 purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl, | 860 purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl, |
854 jabber_ssl_connect_failure, js->gc); | 861 jabber_ssl_connect_failure, js->gc); |
855 if (!js->gsc) { | 862 if (!js->gsc) { |
856 purple_connection_error_reason (js->gc, | 863 purple_connection_error_reason(js->gc, |
857 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, | 864 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, |
858 _("Unable to establish SSL connection")); | 865 _("Unable to establish SSL connection")); |
859 } | 866 } |
860 } else { | 867 } else { |
861 purple_connection_error_reason (js->gc, | 868 purple_connection_error_reason(js->gc, |
862 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, | 869 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, |
863 _("SSL support unavailable")); | 870 _("SSL support unavailable")); |
864 } | 871 } |
865 | 872 |
866 return; | 873 return; |
1302 js->next_id = g_random_int(); | 1309 js->next_id = g_random_int(); |
1303 js->old_length = 0; | 1310 js->old_length = 0; |
1304 js->keepalive_timeout = 0; | 1311 js->keepalive_timeout = 0; |
1305 | 1312 |
1306 if(!js->user) { | 1313 if(!js->user) { |
1307 purple_connection_error_reason (gc, | 1314 purple_connection_error_reason(gc, |
1308 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, | 1315 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, |
1309 _("Invalid XMPP ID")); | 1316 _("Invalid XMPP ID")); |
1310 return; | 1317 return; |
1311 } | 1318 } |
1312 | 1319 |
1327 /* TODO: Just use purple_url_parse? */ | 1334 /* TODO: Just use purple_url_parse? */ |
1328 if (!g_ascii_strncasecmp(connect_server, "http://", 7) || !g_ascii_strncasecmp(connect_server, "https://", 8)) { | 1335 if (!g_ascii_strncasecmp(connect_server, "http://", 7) || !g_ascii_strncasecmp(connect_server, "https://", 8)) { |
1329 js->use_bosh = TRUE; | 1336 js->use_bosh = TRUE; |
1330 js->bosh = jabber_bosh_connection_init(js, connect_server); | 1337 js->bosh = jabber_bosh_connection_init(js, connect_server); |
1331 if (!js->bosh) { | 1338 if (!js->bosh) { |
1332 purple_connection_error_reason (js->gc, | 1339 purple_connection_error_reason(js->gc, |
1333 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, | 1340 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, |
1334 _("Malformed BOSH Connect Server")); | 1341 _("Malformed BOSH Connect Server")); |
1335 return; | 1342 return; |
1336 } | 1343 } |
1337 jabber_bosh_connection_connect(js->bosh); | 1344 jabber_bosh_connection_connect(js->bosh); |
1344 if(purple_ssl_is_supported()) { | 1351 if(purple_ssl_is_supported()) { |
1345 js->gsc = purple_ssl_connect(account, server, | 1352 js->gsc = purple_ssl_connect(account, server, |
1346 purple_account_get_int(account, "port", 5222), | 1353 purple_account_get_int(account, "port", 5222), |
1347 jabber_login_callback_ssl, jabber_ssl_connect_failure, gc); | 1354 jabber_login_callback_ssl, jabber_ssl_connect_failure, gc); |
1348 if (!js->gsc) { | 1355 if (!js->gsc) { |
1349 purple_connection_error_reason (js->gc, | 1356 purple_connection_error_reason(js->gc, |
1350 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, | 1357 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, |
1351 _("Unable to establish SSL connection")); | 1358 _("Unable to establish SSL connection")); |
1352 } | 1359 } |
1353 } else { | 1360 } else { |
1354 purple_connection_error_reason (gc, | 1361 purple_connection_error_reason(gc, |
1355 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, | 1362 PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, |
1356 _("SSL support unavailable")); | 1363 _("SSL support unavailable")); |
1357 } | 1364 } |
1358 | 1365 |
1359 return; | 1366 return; |
1618 /* The stream will be reinitialized later, in jabber_recv_cb_ssl() */ | 1625 /* The stream will be reinitialized later, in jabber_recv_cb_ssl() */ |
1619 js->reinit = TRUE; | 1626 js->reinit = TRUE; |
1620 | 1627 |
1621 break; | 1628 break; |
1622 case JABBER_STREAM_CONNECTED: | 1629 case JABBER_STREAM_CONNECTED: |
1623 /* now we can alert the core that we're ready to send status */ | 1630 /* Send initial presence */ |
1631 jabber_presence_send(js, TRUE); | |
1624 purple_connection_set_state(js->gc, PURPLE_CONNECTED); | 1632 purple_connection_set_state(js->gc, PURPLE_CONNECTED); |
1625 break; | 1633 break; |
1626 } | 1634 } |
1627 } | 1635 } |
1628 | 1636 |
3362 id = purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, | 3370 id = purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, |
3363 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY | | 3371 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY | |
3364 PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, | 3372 PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, |
3365 "prpl-jabber", jabber_cmd_buzz, | 3373 "prpl-jabber", jabber_cmd_buzz, |
3366 _("buzz: Buzz a user to get their attention"), NULL); | 3374 _("buzz: Buzz a user to get their attention"), NULL); |
3375 jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); | |
3367 } | 3376 } |
3368 | 3377 |
3369 void jabber_unregister_commands(void) | 3378 void jabber_unregister_commands(void) |
3370 { | 3379 { |
3371 while (jabber_cmds != NULL) { | 3380 while (jabber_cmds != NULL) { |